socket-io.ts 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import type { Socket } from 'socket.io-client';
  2. import io from 'socket.io-client';
  3. import type { SWRResponse } from 'swr';
  4. import useSWRImmutable from 'swr/immutable';
  5. import loggerFactory from '~/utils/logger';
  6. const logger = loggerFactory('growi:cli:stores:socket-io');
  7. const socketFactory = (namespace: string): Socket => {
  8. const socket = io(namespace, {
  9. transports: ['websocket'],
  10. });
  11. socket.on('connect_error', (error) => {
  12. logger.error(namespace, error);
  13. });
  14. socket.on('error', (error) => {
  15. logger.error(namespace, error);
  16. });
  17. return socket;
  18. };
  19. const useSocket = (namespace: string): SWRResponse<Socket, Error> => {
  20. const swrResponse = useSWRImmutable(namespace, null);
  21. if (swrResponse.data === undefined) {
  22. swrResponse.mutate(socketFactory(namespace));
  23. }
  24. return swrResponse;
  25. };
  26. export const useDefaultSocket = (): SWRResponse<Socket, Error> => {
  27. return useSocket('/');
  28. };
  29. export const useAdminSocket = (): SWRResponse<Socket, Error> => {
  30. return useSocket('/admin');
  31. };