websocket.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.addMessageListener = addMessageListener;
  6. exports.sendMessage = sendMessage;
  7. exports.connectHMR = connectHMR;
  8. let source;
  9. const eventCallbacks = [];
  10. let lastActivity = Date.now();
  11. function getSocketProtocol(assetPrefix) {
  12. let protocol = location.protocol;
  13. try {
  14. // assetPrefix is a url
  15. protocol = new URL(assetPrefix).protocol;
  16. } catch (_) {}
  17. return protocol === 'http:' ? 'ws' : 'wss';
  18. }
  19. function addMessageListener(cb) {
  20. eventCallbacks.push(cb);
  21. }
  22. function sendMessage(data) {
  23. if (!source || source.readyState !== source.OPEN) return;
  24. return source.send(data);
  25. }
  26. function connectHMR(options) {
  27. if (!options.timeout) {
  28. options.timeout = 5 * 1000;
  29. }
  30. function init() {
  31. if (source) source.close();
  32. function handleOnline() {
  33. if (options.log) console.log('[HMR] connected');
  34. lastActivity = Date.now();
  35. }
  36. function handleMessage(event) {
  37. lastActivity = Date.now();
  38. eventCallbacks.forEach((cb)=>{
  39. cb(event);
  40. });
  41. }
  42. let timer;
  43. function handleDisconnect() {
  44. clearInterval(timer);
  45. source.close();
  46. setTimeout(init, options.timeout);
  47. }
  48. timer = setInterval(function() {
  49. if (Date.now() - lastActivity > options.timeout) {
  50. handleDisconnect();
  51. }
  52. }, options.timeout / 2);
  53. const { hostname , port } = location;
  54. const protocol = getSocketProtocol(options.assetPrefix || '');
  55. const assetPrefix = options.assetPrefix.replace(/^\/+/, '');
  56. let url = `${protocol}://${hostname}:${port}${assetPrefix ? `/${assetPrefix}` : ''}`;
  57. if (assetPrefix.startsWith('http')) {
  58. url = `${protocol}://${assetPrefix.split('://')[1]}`;
  59. }
  60. source = new window.WebSocket(`${url}${options.path}`);
  61. source.onopen = handleOnline;
  62. source.onerror = handleDisconnect;
  63. source.onmessage = handleMessage;
  64. }
  65. init();
  66. }
  67. if ((typeof exports.default === 'function' || (typeof exports.default === 'object' && exports.default !== null)) && typeof exports.default.__esModule === 'undefined') {
  68. Object.defineProperty(exports.default, '__esModule', { value: true });
  69. Object.assign(exports.default, exports);
  70. module.exports = exports.default;
  71. }
  72. //# sourceMappingURL=websocket.js.map