From 6a0610bdeebda03c6f4fac69ee70cef96deafdb6 Mon Sep 17 00:00:00 2001 From: Alexander Emelin Date: Sat, 1 Apr 2023 14:02:33 +0300 Subject: [PATCH] fix missing connInfo and chanInfo in presence (#221) --- .github/workflows/ci.yml | 2 +- src/centrifuge.test.ts | 41 ++++++++++++++++++++++++++++++++++++++ src/centrifuge.ts | 15 +++++++++++++- src/protobuf/index.test.ts | 39 ++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5d25fe4..4bed8ee5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - name: Install dependencies run: yarn install - name: Start Centrifugo - run: docker run -d -p 8000:8000 centrifugo/centrifugo:latest centrifugo --client_insecure --http_stream --sse + run: docker run -d -p 8000:8000 -e CENTRIFUGO_PRESENCE=true centrifugo/centrifugo:latest centrifugo --client_insecure --http_stream --sse - name: Lint run: yarn lint - name: Test diff --git a/src/centrifuge.test.ts b/src/centrifuge.test.ts index 223411cc..c172270e 100644 --- a/src/centrifuge.test.ts +++ b/src/centrifuge.test.ts @@ -248,3 +248,44 @@ test.each(transportCases.slice(0, 1))("%s: not connecting on online in disconnec networkEventTarget.dispatchEvent(onlineEvent); expect(c.state).toBe(Centrifuge.State.Disconnected); }); + +test.each(transportCases)("%s: subscribe and presence", async (transport, endpoint) => { + const c = new Centrifuge([{ + transport: transport as TransportName, + endpoint: endpoint, + }], { + websocket: WebSocket, + fetch: fetch, + eventsource: EventSource, + readableStream: ReadableStream, + emulationEndpoint: 'http://localhost:8000/emulation' + }); + + c.connect(); + await c.ready(5000); + const sub = c.newSubscription('test'); + + sub.subscribe() + await sub.ready(5000); + expect(sub.state).toBe(Centrifuge.SubscriptionState.Subscribed); + expect(c.state).toBe(Centrifuge.State.Connected); + + const presence = await sub.presence(); + expect(Object.keys(presence.clients).length).toBeGreaterThan(0); + + const presenceStats = await sub.presenceStats(); + expect(presenceStats.numClients).toBeGreaterThan(0) + expect(presenceStats.numUsers).toBeGreaterThan(0); + + let disconnectCalled: any; + const disconnectedPromise = new Promise((resolve, _) => { + disconnectCalled = resolve; + }) + c.on('disconnected', (ctx) => { + disconnectCalled(ctx); + }) + + c.disconnect(); + await disconnectedPromise; + expect(c.state).toBe(Centrifuge.State.Disconnected); +}); diff --git a/src/centrifuge.ts b/src/centrifuge.ts index 140a3238..dab98f50 100644 --- a/src/centrifuge.ts +++ b/src/centrifuge.ts @@ -325,8 +325,21 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter { + const c = new Centrifuge([{ + transport: transport as TransportName, + endpoint: endpoint, + }], { + protocol: 'protobuf', + websocket: WebSocket, + fetch: fetch, + readableStream: ReadableStream, + emulationEndpoint: 'http://localhost:8000/emulation' + }); + + c.connect(); + await c.ready(5000); + + const sub = c.newSubscription('test'); + sub.subscribe() + await sub.ready(5000); + + const presence = await sub.presence(); + expect(Object.keys(presence.clients).length).toBeGreaterThan(0); + + const presenceStats = await sub.presenceStats(); + expect(presenceStats.numClients).toBeGreaterThan(0) + expect(presenceStats.numUsers).toBeGreaterThan(0); + + let disconnectCalled: any; + const disconnectedPromise = new Promise((resolve, _) => { + disconnectCalled = resolve; + }) + c.on('disconnected', (ctx) => { + disconnectCalled(ctx); + }) + + c.disconnect(); + await disconnectedPromise; + expect(c.state).toBe(Centrifuge.State.Disconnected); +});