Skip to content

Instantly share code, notes, and snippets.

@FZambia
Last active June 5, 2019 08:48
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FZambia/2f1a38ae2dcb21e2c5937328253c29bf to your computer and use it in GitHub Desktop.
Save FZambia/2f1a38ae2dcb21e2c5937328253c29bf to your computer and use it in GitHub Desktop.
Centrifuge library Habr example
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- Обратите внимание, что клиент тут импортируется из ветки c2 репозитория centrifuge-js -->
<script type="text/javascript" src="https://rawgit.com/centrifugal/centrifuge-js/c2/dist/centrifuge.min.js"></script>
</head>
<body>
<input type="text" id="input" />
<script type="text/javascript">
// Создаем объект Centrifuge с адресом вебсокет-endpoint'а
var centrifuge = new Centrifuge('ws://localhost:8000/connection/websocket');
function drawText(text) {
var div = document.createElement('div');
div.innerHTML = text;
document.body.appendChild(div);
}
centrifuge.on('connect', function(ctx){
drawText('Connected over ' + ctx.transport + '<br>');
});
centrifuge.on('disconnect', function(ctx){
drawText('Disconnected: ' + ctx.reason + '<br>');
});
var sub = centrifuge.subscribe("chat", function(message) {
drawText(JSON.stringify(message) + '<br>');
})
var input = document.getElementById("input");
input.addEventListener('keyup', function(e) {
if (e.keyCode == 13) {
sub.publish(this.value);
input.value = '';
}
});
// Повесив все обработчики инициируем непосредственное соединение с сервером.
centrifuge.connect();
</script>
</body>
</html>
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
// Импортируем библиотеку.
"github.com/centrifugal/centrifuge"
)
func handleLog(e centrifuge.LogEntry) {
log.Printf("%s: %v", e.Message, e.Fields)
}
func waitExitSignal(n *centrifuge.Node) {
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-sigs
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
n.Shutdown(ctx)
done <- true
}()
<-done
}
func main() {
// Конфиг centrifuge имеет достаточно много опций, поэтому есть смысл
// использовать конфиг по умолчанию.
cfg := centrifuge.DefaultConfig
// Данная опция позволяет нам не думать об аутентификации пользователя -
// мы будем работать в "небезопасном режиме", что на практике позволительно
// только для примера.
cfg.ClientInsecure = true
// По умолчанию клиент не может публиковать данные в канал, включая эту опцию
// мы даем ему такую возможность.
cfg.Publish = true
node, _ := centrifuge.New(cfg)
// Вешаем обработчик на новое подключение от пользователя.
node.On().Connect(func(ctx context.Context, client *centrifuge.Client, e centrifuge.ConnectEvent) centrifuge.ConnectReply {
// Вешаем обработчик на подписку пользователя на канал. В этом месте
// мы можем запретить подписку, вернув ошибку или даже отключив пользователя.
client.On().Subscribe(func(e centrifuge.SubscribeEvent) centrifuge.SubscribeReply {
log.Printf("client subscribes on channel %s", e.Channel)
return centrifuge.SubscribeReply{}
})
// Вешаем обработчик на публикацию пользователем в канал. В этом месте
// мы можем запретить публикацию, вернув ошибку или даже отключив пользователя.
client.On().Publish(func(e centrifuge.PublishEvent) centrifuge.PublishReply {
log.Printf("client publishes into channel %s: %s", e.Channel, string(e.Data))
return centrifuge.PublishReply{}
})
// Обработчик отключения пользователя.
client.On().Disconnect(func(e centrifuge.DisconnectEvent) centrifuge.DisconnectReply {
log.Printf("client disconnected")
return centrifuge.DisconnectReply{}
})
log.Printf("client connected via %s", client.Transport().Name())
return centrifuge.ConnectReply{}
})
// Можно подписаться на логи, генерируемые библиотекой.
node.SetLogHandler(centrifuge.LogLevelDebug, handleLog)
// Запускаем ноду.
if err := node.Run(); err != nil {
panic(err)
}
// Прописываем роутинг.
http.Handle("/connection/websocket", centrifuge.NewWebsocketHandler(node, centrifuge.WebsocketConfig{}))
http.Handle("/", http.FileServer(http.Dir("./")))
go func() {
if err := http.ListenAndServe(":8000", nil); err != nil {
panic(err)
}
}()
// Работаем до тех пор пока не отловим сигнал от ОС.
waitExitSignal(node)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment