Skip to content

Commit

Permalink
fix(client): Distinguish client connection closes
Browse files Browse the repository at this point in the history
  • Loading branch information
enisdenjo committed Oct 20, 2021
1 parent 3bc099e commit ed4d9db
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 10 deletions.
18 changes: 10 additions & 8 deletions src/__tests__/client.ts
Expand Up @@ -228,7 +228,7 @@ it('should close with error message during connecting issues', async () => {

await sub.waitForError((err) => {
const event = err as CloseEvent;
expect(event.code).toBe(CloseCode.BadRequest);
expect(event.code).toBe(CloseCode.BadResponse);
expect(event.reason).toBe('Welcome');
expect(event.wasClean).toBeTruthy();
});
Expand Down Expand Up @@ -288,7 +288,7 @@ it('should close the socket if the `connectionParams` rejects or throws', async
let sub = tsubscribe(client, { query: '{ getValue }' });
await sub.waitForError((err) => {
const event = err as CloseEvent;
expect(event.code).toBe(CloseCode.BadRequest);
expect(event.code).toBe(CloseCode.InternalClientError);
expect(event.reason).toBe('No auth?');
expect(event.wasClean).toBeTruthy();
});
Expand All @@ -303,7 +303,7 @@ it('should close the socket if the `connectionParams` rejects or throws', async
sub = tsubscribe(client, { query: '{ getValue }' });
await sub.waitForError((err) => {
const event = err as CloseEvent;
expect(event.code).toBe(CloseCode.BadRequest);
expect(event.code).toBe(CloseCode.InternalClientError);
expect(event.reason).toBe('No auth?');
expect(event.wasClean).toBeTruthy();
});
Expand Down Expand Up @@ -543,7 +543,7 @@ it('should report close error even if complete message followed', async (done) =
onNonLazyError: noop,
on: {
closed: (err) => {
expect((err as CloseEvent).code).toBe(CloseCode.BadRequest);
expect((err as CloseEvent).code).toBe(CloseCode.BadResponse);
expect((err as CloseEvent).reason).toBe('Invalid message');
},
},
Expand All @@ -556,7 +556,7 @@ it('should report close error even if complete message followed', async (done) =
{
next: noop,
error: (err) => {
expect((err as CloseEvent).code).toBe(CloseCode.BadRequest);
expect((err as CloseEvent).code).toBe(CloseCode.BadResponse);
expect((err as CloseEvent).reason).toBe('Invalid message');
client.dispose();
done();
Expand Down Expand Up @@ -602,7 +602,7 @@ it('should report close error even if complete message followed', async (done) =
onNonLazyError: noop,
on: {
closed: (err) => {
expect((err as CloseEvent).code).toBe(CloseCode.BadRequest);
expect((err as CloseEvent).code).toBe(CloseCode.BadResponse);
expect((err as CloseEvent).reason).toBe('Invalid message');
},
},
Expand All @@ -615,7 +615,7 @@ it('should report close error even if complete message followed', async (done) =
{
next: noop,
error: (err) => {
expect((err as CloseEvent).code).toBe(CloseCode.BadRequest);
expect((err as CloseEvent).code).toBe(CloseCode.BadResponse);
expect((err as CloseEvent).reason).toBe('Invalid message');
client.dispose();
done();
Expand Down Expand Up @@ -1429,15 +1429,17 @@ describe('reconnecting', () => {
}, 20);
}

expect.assertions(6);
expect.assertions(8);
const warn = console.warn;
console.warn = () => {
/* hide warnings for test */
};
await testCloseCode(CloseCode.SubprotocolNotAcceptable);
console.warn = warn;
await testCloseCode(CloseCode.InternalServerError);
await testCloseCode(CloseCode.InternalClientError);
await testCloseCode(CloseCode.BadRequest);
await testCloseCode(CloseCode.BadResponse);
await testCloseCode(CloseCode.Unauthorized);
await testCloseCode(CloseCode.SubscriberAlreadyExists);
await testCloseCode(CloseCode.TooManyInitialisationRequests);
Expand Down
6 changes: 4 additions & 2 deletions src/client.ts
Expand Up @@ -641,7 +641,7 @@ export function createClient(options: ClientOptions): Client {
enqueuePing(); // enqueue ping (noop if disabled)
} catch (err) {
socket.close(
CloseCode.BadRequest,
CloseCode.InternalClientError,
err instanceof Error ? err.message : new Error(err).message,
);
}
Expand Down Expand Up @@ -695,7 +695,7 @@ export function createClient(options: ClientOptions): Client {
} catch (err) {
socket.onmessage = null; // stop reading messages as soon as reading breaks once
socket.close(
CloseCode.BadRequest,
CloseCode.BadResponse,
err instanceof Error ? err.message : new Error(err).message,
);
}
Expand Down Expand Up @@ -750,7 +750,9 @@ export function createClient(options: ClientOptions): Client {
(isFatalInternalCloseCode(errOrCloseEvent.code) ||
[
CloseCode.InternalServerError,
CloseCode.InternalClientError,
CloseCode.BadRequest,
CloseCode.BadResponse,
CloseCode.Unauthorized,
// CloseCode.Forbidden, might grant access out after retry
CloseCode.SubprotocolNotAcceptable,
Expand Down
2 changes: 2 additions & 0 deletions src/common.ts
Expand Up @@ -27,7 +27,9 @@ export const GRAPHQL_TRANSPORT_WS_PROTOCOL = 'graphql-transport-ws';
*/
export enum CloseCode {
InternalServerError = 4500,
InternalClientError = 4005,
BadRequest = 4400,
BadResponse = 4004,
/** Tried subscribing before connect ack */
Unauthorized = 4401,
Forbidden = 4403,
Expand Down

0 comments on commit ed4d9db

Please sign in to comment.