소스 검색

fix: don't reconnect when socket closes cleanly

Fela Maslen 4 년 전
부모
커밋
f9abafe281
2개의 변경된 파일16개의 추가작업 그리고 6개의 파일을 삭제
  1. 6 5
      gmus-web/src/hooks/socket.spec.tsx
  2. 10 1
      gmus-web/src/hooks/socket.ts

+ 6 - 5
gmus-web/src/hooks/socket.spec.tsx

@@ -398,7 +398,11 @@ describe(useSocket.name, () => {
       await server.connected;
 
       act(() => {
-        server.error();
+        server.close({
+          code: 1001,
+          reason: 'Server went away',
+          wasClean: false,
+        });
       });
 
       server = new WS('ws://my-api.url:1234/pubsub');
@@ -429,14 +433,13 @@ describe(useSocket.name, () => {
       expect(res.url).toBe('ws://my-api.url:1234/pubsub?client-name=my-client-name-a1234');
     });
 
-    it('should set error to true but keep the identified state', async () => {
+    it('should keep the identified state', async () => {
       expect.hasAssertions();
       const { getByTestId, unmount } = await setupError();
 
       expect(JSON.parse(getByTestId('hook-result').innerHTML)).toStrictEqual(
         expect.objectContaining({
           ready: false,
-          error: true,
           connecting: false,
           identified: true,
         }),
@@ -446,7 +449,6 @@ describe(useSocket.name, () => {
         expect(JSON.parse(getByTestId('hook-result').innerHTML)).toStrictEqual(
           expect.objectContaining({
             ready: false,
-            error: true,
             connecting: true,
             identified: true,
           }),
@@ -459,7 +461,6 @@ describe(useSocket.name, () => {
         expect(JSON.parse(getByTestId('hook-result').innerHTML)).toStrictEqual(
           expect.objectContaining({
             ready: true,
-            error: false,
             connecting: false,
             identified: true,
           }),

+ 10 - 1
gmus-web/src/hooks/socket.ts

@@ -133,12 +133,21 @@ export function useSocket(onMessage: OnMessage, onLogin: (name: string) => void)
 
       ws.onmessage = onMessage;
 
-      ws.onclose = (): void => {
+      ws.onclose = (event): void => {
         if (cancelled) {
           return;
         }
         setState((last) => {
           clearTimeout(connectAttemptTimer.current);
+          if (event.wasClean) {
+            return {
+              ...last,
+              socket: null,
+              connecting: false,
+              tempName: '',
+            };
+          }
+
           connectAttemptTimer.current = setTimeout(
             connectIfPossible,
             getConnectAttemptDelayMs(last.connectAttemptNumber),