Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 83 additions & 1 deletion src/centrifuge.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Centrifuge } from './centrifuge'
import { Centrifuge, UnauthorizedError } from './centrifuge'
import {
DisconnectedContext,
Error as CentrifugeError,
Expand Down Expand Up @@ -859,3 +859,85 @@ test.each(transportCases)("%s: retries subscription getData error", async (trans
expect(numGetDataCalls).toBe(2); // Ensure getToken was retried.
await disconnectClient(c);
});

test.each(transportCases)("%s: disconnected with unauthorized", async (transport, endpoint) => {
const c = new Centrifuge([{
transport: transport as TransportName,
endpoint: endpoint,
}], {
getToken: async function (): Promise<string> {
throw new UnauthorizedError('');
},
websocket: WebSocket,
fetch: fetch,
eventsource: EventSource,
readableStream: ReadableStream,
emulationEndpoint: 'http://localhost:8000/emulation',
});

let disconnectCalled: any;
const p = new Promise<DisconnectedContext>((resolve, _) => {
disconnectCalled = resolve;
})

c.on('disconnected', (ctx) => {
disconnectCalled(ctx);
})

c.connect();

const ctx = await p;
expect(c.state).toBe(State.Disconnected);
expect(ctx.code).toBe(disconnectedCodes.unauthorized);
});

test.each(transportCases)("%s: unsubscribed with unauthorized", 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',
});

let unsubscribeCalled: any;
const up = new Promise<UnsubscribedContext>((resolve, _) => {
unsubscribeCalled = resolve;
})

let disconnectCalled: any;
const dp = new Promise<DisconnectedContext>((resolve, _) => {
disconnectCalled = resolve;
})

c.on('disconnected', (ctx) => {
disconnectCalled(ctx);
})

const sub = c.newSubscription('test', {
getToken: async function (): Promise<string> {
throw new UnauthorizedError('');
},
});
sub.on('unsubscribed', (ctx: UnsubscribedContext) => {
unsubscribeCalled(ctx);
});

c.connect();
sub.subscribe()
await c.ready(5000);
expect(c.state).toBe(State.Connected);

const unsubCtx = await up;

expect(sub.state).toBe(SubscriptionState.Unsubscribed);
expect(unsubCtx.code).toBe(unsubscribedCodes.unauthorized)

c.disconnect();
const ctx = await dp;
expect(c.state).toBe(State.Disconnected);
expect(ctx.code).toBe(disconnectedCodes.disconnectCalled);
});
2 changes: 1 addition & 1 deletion src/centrifuge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1308,7 +1308,7 @@ export class Centrifuge extends (EventEmitter as new () => TypedEventEmitter<Cli
message: 'token expired but no getToken function set in the configuration'
}
});
throw new UnauthorizedError('');
return Promise.reject(new UnauthorizedError(''));
}
return this._config.getToken({});
}
Expand Down
2 changes: 1 addition & 1 deletion src/subscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ export class Subscription extends (EventEmitter as new () => TypedEventEmitter<S
message: 'provide a function to get channel subscription token'
}
});
throw new UnauthorizedError('');
return Promise.reject(new UnauthorizedError(''));
}
return getToken(ctx);
}
Expand Down