Centrifuge使用

Centrifugo實時通訊,基于go語言編寫,提供了websocket 以及sockjs 的兼容處理
安裝

npm install centrifuge
import Centrifuge, { Subscription } from 'centrifuge';

/** 創(chuàng)建連接 */
public async connect(url: string, token: string): Promise<CentrifugeGo> {
        this.clear();
        this.enable = true;
        this.url = url;
        this.token = token;
        this.conn = new Centrifuge(this.url);
        this.conn.setToken(this.token);
        this.conn.on('disconnect', _ctx => {
            console.log('centrifuge disconnect: ', _ctx, this.enable);
            if (this.enable) {
                this.retryConnect();
            }
        });
        return await this.retryConnect();
}
/** 重連 */
public retryConnect(): Promise<CentrifugeGo> {
        return new Promise((resolve, _reject) => {
            this.conn.on('connect', (_ctx: CentrifugGoCtxI) => {
                this.ctx = _ctx;
                this.emit('connect');
                this.conn.removeAllListeners('connect');
                resolve(this);
            });
            this.conn.connect();
        });
}
/** 斷開連接 */
public disconnect() {
        this.enable = false;
        console.log('centrifuge disconnect()  enable:', this.enable);
        this.clear();
        this.conn?.disconnect();
}
/** 清除訂閱 */
private clear() {
        this.conn?.removeAllListeners();
        while (this.subscriptionList.length) {
            this.subscriptionList
                .pop()
                ?.removeAllListeners()
                ?.unsubscribe();
        }
}
/** 訂閱 */
// 訂閱通道:在需要的地方主動訂閱
public subscribe(channel: string) {
        this.subscriptionList = [];
        const sub = this.conn
            // eslint-disable-next-line @typescript-eslint/no-explicit-any
            .subscribe(channel, (msg: { event: string; data: any }) => {
                // console.log(`subscribe: ${element}:::`, msg.data);
                this.emit(msg.data.event, msg.data.data);
            })
            .on('error', errContext => {
                console.log('channel-error: ', errContext);
            })
            .on('subscribe', context => {
                console.log('channel-subscribe: ', context);
            })
            .on('unsubscribe', context => {
                console.log('channel-unsubscribe: ', context);
            });
        this.subscriptionList.push(sub);
}
// 取消訂閱
public unsubscribe(channel: string) {
        this.subscriptionList.map((item, index) => {
            if (item.channel === channel) {
                console.log(item);
                item.removeAllListeners();
                item.unsubscribe();
                this.subscriptionList.splice(index, 1);
            }
        });
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容