Last active
June 5, 2019 08:48
-
-
Save FZambia/2f1a38ae2dcb21e2c5937328253c29bf to your computer and use it in GitHub Desktop.
Centrifuge library Habr example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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