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); +});