initReloadServer.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import type { WebSocket } from 'ws';
  2. import { WebSocketServer } from 'ws';
  3. import { BUILD_COMPLETE, DO_UPDATE, DONE_UPDATE, LOCAL_RELOAD_SOCKET_PORT, LOCAL_RELOAD_SOCKET_URL } from '../constant';
  4. import MessageInterpreter from '../interpreter';
  5. const clientsThatNeedToUpdate: Set<WebSocket> = new Set();
  6. function initReloadServer() {
  7. const wss = new WebSocketServer({ port: LOCAL_RELOAD_SOCKET_PORT });
  8. wss.on('listening', () => {
  9. console.log(`[HMR] Server listening at ${LOCAL_RELOAD_SOCKET_URL}`);
  10. });
  11. wss.on('connection', ws => {
  12. clientsThatNeedToUpdate.add(ws);
  13. ws.addEventListener('close', () => {
  14. clientsThatNeedToUpdate.delete(ws);
  15. });
  16. ws.addEventListener('message', event => {
  17. if (typeof event.data !== 'string') return;
  18. const message = MessageInterpreter.receive(event.data);
  19. if (message.type === DONE_UPDATE) {
  20. ws.close();
  21. }
  22. if (message.type === BUILD_COMPLETE) {
  23. clientsThatNeedToUpdate.forEach((ws: WebSocket) =>
  24. ws.send(MessageInterpreter.send({ type: DO_UPDATE, id: message.id })),
  25. );
  26. }
  27. });
  28. });
  29. wss.on('error', error => {
  30. console.error(`[HMR] Failed to start server at ${LOCAL_RELOAD_SOCKET_URL}`);
  31. throw error;
  32. });
  33. }
  34. initReloadServer();