@jsenv/core 36.3.0 → 37.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/js/autoreload.js +6 -5
  2. package/dist/js/import_meta_hot.js +4 -4
  3. package/dist/js/server_events_client.js +422 -304
  4. package/dist/jsenv_core.js +3819 -3256
  5. package/package.json +18 -17
  6. package/src/build/build.js +342 -658
  7. package/src/build/build_urls_generator.js +8 -8
  8. package/src/build/build_versions_manager.js +495 -0
  9. package/src/build/version_mappings_injection.js +27 -16
  10. package/src/dev/file_service.js +80 -91
  11. package/src/dev/start_dev_server.js +5 -3
  12. package/src/kitchen/errors.js +16 -16
  13. package/src/kitchen/fetched_content_compliance.js +4 -8
  14. package/src/kitchen/kitchen.js +367 -939
  15. package/src/kitchen/prepend_content.js +13 -35
  16. package/src/kitchen/url_graph/references.js +713 -0
  17. package/src/kitchen/url_graph/sort_by_dependencies.js +2 -2
  18. package/src/kitchen/url_graph/url_content.js +96 -0
  19. package/src/kitchen/url_graph/url_graph.js +439 -0
  20. package/src/kitchen/url_graph/url_graph_report.js +6 -4
  21. package/src/kitchen/url_graph/url_graph_visitor.js +14 -12
  22. package/src/kitchen/url_graph/url_info_transformations.js +180 -184
  23. package/src/plugins/autoreload/client/autoreload.js +1 -0
  24. package/src/plugins/autoreload/client/reload.js +6 -6
  25. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +2 -2
  26. package/src/plugins/autoreload/jsenv_plugin_autoreload_client.js +2 -2
  27. package/src/plugins/autoreload/jsenv_plugin_autoreload_server.js +84 -78
  28. package/src/plugins/autoreload/jsenv_plugin_hot_search_param.js +52 -0
  29. package/src/plugins/cache_control/jsenv_plugin_cache_control.js +1 -1
  30. package/src/plugins/commonjs_globals/jsenv_plugin_commonjs_globals.js +2 -2
  31. package/src/plugins/global_scenarios/jsenv_plugin_global_scenarios.js +3 -3
  32. package/src/plugins/import_meta_hot/client/import_meta_hot.js +4 -4
  33. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +18 -20
  34. package/src/plugins/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +2 -2
  35. package/src/plugins/importmap/jsenv_plugin_importmap.js +35 -37
  36. package/src/plugins/inlining/jsenv_plugin_inlining.js +1 -17
  37. package/src/plugins/inlining/jsenv_plugin_inlining_as_data_url.js +70 -50
  38. package/src/plugins/inlining/jsenv_plugin_inlining_into_html.js +72 -54
  39. package/src/plugins/plugin_controller.js +92 -27
  40. package/src/plugins/protocol_file/jsenv_plugin_protocol_file.js +18 -20
  41. package/src/plugins/reference_analysis/css/jsenv_plugin_css_reference_analysis.js +4 -5
  42. package/src/plugins/reference_analysis/data_urls/jsenv_plugin_data_urls_analysis.js +18 -16
  43. package/src/plugins/reference_analysis/directory/jsenv_plugin_directory_reference_analysis.js +13 -20
  44. package/src/plugins/reference_analysis/html/jsenv_plugin_html_reference_analysis.js +55 -72
  45. package/src/plugins/reference_analysis/js/jsenv_plugin_js_reference_analysis.js +33 -42
  46. package/src/plugins/reference_analysis/jsenv_plugin_reference_analysis.js +16 -7
  47. package/src/plugins/reference_analysis/webmanifest/jsenv_plugin_webmanifest_reference_analysis.js +4 -3
  48. package/src/plugins/resolution_node_esm/jsenv_plugin_node_esm_resolution.js +16 -6
  49. package/src/plugins/resolution_node_esm/node_esm_resolver.js +30 -24
  50. package/src/plugins/resolution_web/jsenv_plugin_web_resolution.js +8 -5
  51. package/src/plugins/ribbon/jsenv_plugin_ribbon.js +3 -3
  52. package/src/plugins/server_events/client/server_events_client.js +460 -15
  53. package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +13 -29
  54. package/src/plugins/version_search_param/jsenv_plugin_version_search_param.js +1 -1
  55. package/src/build/version_generator.js +0 -19
  56. package/src/kitchen/url_graph/url_graph_loader.js +0 -77
  57. package/src/kitchen/url_graph.js +0 -322
  58. package/src/plugins/autoreload/jsenv_plugin_hmr.js +0 -42
  59. package/src/plugins/resolution_node_esm/url_type_from_reference.js +0 -13
  60. package/src/plugins/server_events/client/connection_manager.js +0 -170
  61. package/src/plugins/server_events/client/event_source_connection.js +0 -83
  62. package/src/plugins/server_events/client/events_manager.js +0 -75
  63. package/src/plugins/server_events/client/web_socket_connection.js +0 -81
  64. /package/src/kitchen/{url_specifier_encoding.js → url_graph/url_specifier_encoding.js} +0 -0
@@ -1,340 +1,458 @@
1
- const READY_STATES = {
2
- CONNECTING: "connecting",
3
- OPEN: "open",
4
- CLOSING: "closing",
5
- CLOSED: "closed",
6
- };
7
-
8
- const createConnectionManager = (
9
- attemptConnection,
10
- { retry, retryAfter, retryMaxAttempt, retryAllocatedMs },
11
- ) => {
12
- const readyState = {
13
- value: READY_STATES.CLOSED,
14
- goTo: (value) => {
15
- if (value === readyState.value) {
16
- return;
1
+ let createEventsManager;
2
+ {
3
+ createEventsManager = ({ effect = () => {} } = {}) => {
4
+ const callbacksMap = new Map();
5
+ let cleanup;
6
+ const addCallbacks = (namedCallbacks) => {
7
+ let callbacksMapSize = callbacksMap.size;
8
+ Object.keys(namedCallbacks).forEach((eventName) => {
9
+ const callback = namedCallbacks[eventName];
10
+ const existingCallbacks = callbacksMap.get(eventName);
11
+ let callbacks;
12
+ if (existingCallbacks) {
13
+ callbacks = existingCallbacks;
14
+ } else {
15
+ callbacks = [];
16
+ callbacksMap.set(eventName, callbacks);
17
+ }
18
+ callbacks.push(callback);
19
+ });
20
+ if (effect && callbacksMapSize === 0 && callbacksMapSize.size > 0) {
21
+ cleanup = effect();
17
22
  }
18
- readyState.value = value;
19
- readyState.onchange();
20
- },
21
- onchange: () => {},
22
- };
23
-
24
- let _disconnect = () => {};
25
- const connect = () => {
26
- if (
27
- readyState.value === READY_STATES.CONNECTING ||
28
- readyState.value === READY_STATES.OPEN
29
- ) {
30
- return;
31
- }
32
23
 
33
- let retryCount = 0;
34
- let msSpent = 0;
35
- const attempt = () => {
36
- readyState.goTo(READY_STATES.CONNECTING);
37
- let timeout;
38
- const cancelAttempt = attemptConnection({
39
- onClosed: () => {
40
- if (!retry) {
41
- readyState.goTo(READY_STATES.CLOSED);
42
- console.info(`[jsenv] failed to connect to server`);
43
- return;
44
- }
45
- if (retryCount > retryMaxAttempt) {
46
- readyState.goTo(READY_STATES.CLOSED);
47
- console.info(
48
- `[jsenv] could not connect to server after ${retryMaxAttempt} attempt`,
49
- );
50
- return;
51
- }
52
- if (retryAllocatedMs && msSpent > retryAllocatedMs) {
53
- readyState.goTo(READY_STATES.CLOSED);
54
- console.info(
55
- `[jsenv] could not connect to server in less than ${retryAllocatedMs}ms`,
56
- );
57
- return;
58
- }
59
- // if closed while open -> connection lost
60
- // otherwise it's the attempt to connect for the first time
61
- // or to reconnect
62
- if (readyState.value === READY_STATES.OPEN) {
63
- console.info(`[jsenv] server connection lost; retrying to connect`);
24
+ let removed = false;
25
+ return () => {
26
+ if (removed) return;
27
+ removed = true;
28
+ callbacksMapSize = callbacksMap.size;
29
+ Object.keys(namedCallbacks).forEach((eventName) => {
30
+ const callback = namedCallbacks[eventName];
31
+ const callbacks = callbacksMap.get(eventName);
32
+ if (callbacks) {
33
+ const index = callbacks.indexOf(callback);
34
+ if (index > -1) {
35
+ callbacks.splice(index, 1);
36
+ if (callbacks.length === 0) {
37
+ callbacksMap.delete(eventName);
38
+ }
39
+ }
64
40
  }
65
- retryCount++;
66
- timeout = setTimeout(() => {
67
- msSpent += retryAfter;
68
- attempt();
69
- }, retryAfter);
70
- },
71
- onOpen: () => {
72
- readyState.goTo(READY_STATES.OPEN);
73
- // console.info(`[jsenv] connected to server`)
74
- },
75
- });
76
- _disconnect = () => {
77
- cancelAttempt();
78
- clearTimeout(timeout);
79
- readyState.goTo(READY_STATES.CLOSED);
41
+ });
42
+ namedCallbacks = null; // allow garbage collect
43
+ if (
44
+ cleanup &&
45
+ typeof cleanup === "function" &&
46
+ callbacksMapSize > 0 &&
47
+ callbacksMapSize.size === 0
48
+ ) {
49
+ cleanup();
50
+ cleanup = null;
51
+ }
80
52
  };
81
53
  };
82
- attempt();
83
- };
84
54
 
85
- const disconnect = () => {
86
- if (
87
- readyState.value !== READY_STATES.CONNECTING &&
88
- readyState.value !== READY_STATES.OPEN
89
- ) {
90
- console.warn(
91
- `disconnect() ignored because connection is ${readyState.value}`,
92
- );
93
- return null;
94
- }
95
- return _disconnect();
96
- };
55
+ const triggerCallbacks = (event) => {
56
+ const callbacks = callbacksMap.get(event.type);
57
+ if (callbacks) {
58
+ callbacks.forEach((callback) => {
59
+ callback(event);
60
+ });
61
+ }
62
+ };
97
63
 
98
- const removePageUnloadListener = listenPageUnload(() => {
99
- if (
100
- readyState.value === READY_STATES.CONNECTING ||
101
- readyState.value === READY_STATES.OPEN
102
- ) {
103
- _disconnect();
104
- }
105
- });
64
+ const destroy = () => {
65
+ callbacksMap.clear();
66
+ if (cleanup) {
67
+ cleanup();
68
+ cleanup = null;
69
+ }
70
+ };
106
71
 
107
- return {
108
- readyState,
109
- connect,
110
- disconnect,
111
- destroy: () => {
112
- removePageUnloadListener();
113
- disconnect();
114
- },
72
+ return {
73
+ addCallbacks,
74
+ triggerCallbacks,
75
+ destroy,
76
+ };
115
77
  };
116
- };
78
+ }
117
79
 
118
- // const listenPageMightFreeze = (callback) => {
119
- // const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
120
- // if (pageHideEvent.persisted === true) {
121
- // callback(pageHideEvent)
122
- // }
123
- // })
124
- // return removePageHideListener
125
- // }
126
-
127
- // const listenPageFreeze = (callback) => {
128
- // const removeFreezeListener = listenEvent(document, "freeze", (freezeEvent) => {
129
- // callback(freezeEvent)
130
- // })
131
- // return removeFreezeListener
132
- // }
80
+ let createConnectionManager;
81
+ {
82
+ const READY_STATES = {
83
+ CONNECTING: "connecting",
84
+ OPEN: "open",
85
+ CLOSING: "closing",
86
+ CLOSED: "closed",
87
+ };
133
88
 
134
- // const listenPageIsRestored = (callback) => {
135
- // const removeResumeListener = listenEvent(document, "resume", (resumeEvent) => {
136
- // removePageshowListener()
137
- // callback(resumeEvent)
138
- // })
139
- // const removePageshowListener = listenEvent(window, "pageshow", (pageshowEvent) => {
140
- // if (pageshowEvent.persisted === true) {
141
- // removePageshowListener()
142
- // removeResumeListener()
143
- // callback(pageshowEvent)
144
- // }
145
- // })
146
- // return () => {
147
- // removeResumeListener()
148
- // removePageshowListener()
149
- // }
150
- // }
89
+ createConnectionManager = (
90
+ attemptConnection,
91
+ { logs, retry, retryAfter, retryMaxAttempt, retryAllocatedMs },
92
+ ) => {
93
+ const readyState = {
94
+ value: READY_STATES.CLOSED,
95
+ goTo: (value) => {
96
+ if (value === readyState.value) {
97
+ return;
98
+ }
99
+ readyState.value = value;
100
+ readyState.onchange();
101
+ },
102
+ onchange: () => {},
103
+ };
151
104
 
152
- const listenPageUnload = (callback) => {
153
- const removePageHideListener = listenEvent(
154
- window,
155
- "pagehide",
156
- (pageHideEvent) => {
157
- if (pageHideEvent.persisted !== true) {
158
- callback(pageHideEvent);
105
+ let _disconnect = () => {};
106
+ const connect = () => {
107
+ if (
108
+ readyState.value === READY_STATES.CONNECTING ||
109
+ readyState.value === READY_STATES.OPEN
110
+ ) {
111
+ return;
159
112
  }
160
- },
161
- );
162
- return removePageHideListener;
163
- };
164
113
 
165
- const listenEvent = (emitter, event, callback) => {
166
- emitter.addEventListener(event, callback);
167
- return () => {
168
- emitter.removeEventListener(event, callback);
169
- };
170
- };
114
+ let retryCount = 0;
115
+ let msSpent = 0;
116
+ const attempt = () => {
117
+ readyState.goTo(READY_STATES.CONNECTING);
118
+ let timeout;
119
+ const cancelAttempt = attemptConnection({
120
+ onClosed: () => {
121
+ if (!retry) {
122
+ readyState.goTo(READY_STATES.CLOSED);
123
+ if (logs) {
124
+ console.info(`[jsenv] failed to connect to server`);
125
+ }
126
+ return;
127
+ }
128
+ if (retryCount > retryMaxAttempt) {
129
+ readyState.goTo(READY_STATES.CLOSED);
130
+ if (logs) {
131
+ console.info(
132
+ `[jsenv] could not connect to server after ${retryMaxAttempt} attempt`,
133
+ );
134
+ }
135
+ return;
136
+ }
137
+ if (retryAllocatedMs && msSpent > retryAllocatedMs) {
138
+ readyState.goTo(READY_STATES.CLOSED);
139
+ if (logs) {
140
+ console.info(
141
+ `[jsenv] could not connect to server in less than ${retryAllocatedMs}ms`,
142
+ );
143
+ }
144
+ return;
145
+ }
146
+ // if closed while open -> connection lost
147
+ // otherwise it's the attempt to connect for the first time
148
+ // or to reconnect
149
+ if (readyState.value === READY_STATES.OPEN) {
150
+ if (logs) {
151
+ console.info(
152
+ `[jsenv] server connection lost; retrying to connect`,
153
+ );
154
+ }
155
+ }
156
+ retryCount++;
157
+ timeout = setTimeout(() => {
158
+ msSpent += retryAfter;
159
+ attempt();
160
+ }, retryAfter);
161
+ },
162
+ onOpen: () => {
163
+ readyState.goTo(READY_STATES.OPEN);
164
+ },
165
+ });
166
+ _disconnect = () => {
167
+ cancelAttempt();
168
+ clearTimeout(timeout);
169
+ readyState.goTo(READY_STATES.CLOSED);
170
+ };
171
+ };
172
+ attempt();
173
+ };
171
174
 
172
- const createEventsManager = ({ effect = () => {} } = {}) => {
173
- const callbacksMap = new Map();
174
- let cleanup;
175
- const addCallbacks = (namedCallbacks) => {
176
- let callbacksMapSize = callbacksMap.size;
177
- Object.keys(namedCallbacks).forEach((eventName) => {
178
- const callback = namedCallbacks[eventName];
179
- const existingCallbacks = callbacksMap.get(eventName);
180
- let callbacks;
181
- if (existingCallbacks) {
182
- callbacks = existingCallbacks;
183
- } else {
184
- callbacks = [];
185
- callbacksMap.set(eventName, callbacks);
175
+ const disconnect = () => {
176
+ if (
177
+ readyState.value !== READY_STATES.CONNECTING &&
178
+ readyState.value !== READY_STATES.OPEN
179
+ ) {
180
+ if (logs) {
181
+ console.warn(
182
+ `disconnect() ignored because connection is ${readyState.value}`,
183
+ );
184
+ }
185
+ return null;
186
186
  }
187
- callbacks.push(callback);
188
- });
189
- if (effect && callbacksMapSize === 0 && callbacksMapSize.size > 0) {
190
- cleanup = effect();
191
- }
187
+ return _disconnect();
188
+ };
192
189
 
193
- let removed = false;
194
- return () => {
195
- if (removed) return;
196
- removed = true;
197
- callbacksMapSize = callbacksMap.size;
198
- Object.keys(namedCallbacks).forEach((eventName) => {
199
- const callback = namedCallbacks[eventName];
200
- const callbacks = callbacksMap.get(eventName);
201
- if (callbacks) {
202
- const index = callbacks.indexOf(callback);
203
- if (index > -1) {
204
- callbacks.splice(index, 1);
205
- if (callbacks.length === 0) {
206
- callbacksMap.delete(eventName);
207
- }
208
- }
209
- }
210
- });
211
- namedCallbacks = null; // allow garbage collect
190
+ const removePageUnloadListener = listenPageUnload(() => {
212
191
  if (
213
- cleanup &&
214
- typeof cleanup === "function" &&
215
- callbacksMapSize > 0 &&
216
- callbacksMapSize.size === 0
192
+ readyState.value === READY_STATES.CONNECTING ||
193
+ readyState.value === READY_STATES.OPEN
217
194
  ) {
218
- cleanup();
219
- cleanup = null;
195
+ _disconnect();
220
196
  }
197
+ });
198
+
199
+ return {
200
+ readyState,
201
+ connect,
202
+ disconnect,
203
+ destroy: () => {
204
+ removePageUnloadListener();
205
+ disconnect();
206
+ },
221
207
  };
222
208
  };
223
209
 
224
- const triggerCallbacks = (event) => {
225
- const callbacks = callbacksMap.get(event.type);
226
- if (callbacks) {
227
- callbacks.forEach((callback) => {
228
- callback(event);
229
- });
230
- }
231
- };
210
+ // const listenPageMightFreeze = (callback) => {
211
+ // const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
212
+ // if (pageHideEvent.persisted === true) {
213
+ // callback(pageHideEvent)
214
+ // }
215
+ // })
216
+ // return removePageHideListener
217
+ // }
218
+
219
+ // const listenPageFreeze = (callback) => {
220
+ // const removeFreezeListener = listenEvent(document, "freeze", (freezeEvent) => {
221
+ // callback(freezeEvent)
222
+ // })
223
+ // return removeFreezeListener
224
+ // }
232
225
 
233
- const destroy = () => {
234
- callbacksMap.clear();
235
- if (cleanup) {
236
- cleanup();
237
- cleanup = null;
238
- }
226
+ // const listenPageIsRestored = (callback) => {
227
+ // const removeResumeListener = listenEvent(document, "resume", (resumeEvent) => {
228
+ // removePageshowListener()
229
+ // callback(resumeEvent)
230
+ // })
231
+ // const removePageshowListener = listenEvent(window, "pageshow", (pageshowEvent) => {
232
+ // if (pageshowEvent.persisted === true) {
233
+ // removePageshowListener()
234
+ // removeResumeListener()
235
+ // callback(pageshowEvent)
236
+ // }
237
+ // })
238
+ // return () => {
239
+ // removeResumeListener()
240
+ // removePageshowListener()
241
+ // }
242
+ // }
243
+
244
+ const listenPageUnload = (callback) => {
245
+ const removePageHideListener = listenEvent(
246
+ window,
247
+ "pagehide",
248
+ (pageHideEvent) => {
249
+ if (pageHideEvent.persisted !== true) {
250
+ callback(pageHideEvent);
251
+ }
252
+ },
253
+ );
254
+ return removePageHideListener;
239
255
  };
240
256
 
241
- return {
242
- addCallbacks,
243
- triggerCallbacks,
244
- destroy,
257
+ const listenEvent = (emitter, event, callback) => {
258
+ emitter.addEventListener(event, callback);
259
+ return () => {
260
+ emitter.removeEventListener(event, callback);
261
+ };
245
262
  };
246
- };
263
+ }
247
264
 
248
- const createWebSocketConnection = (
249
- websocketUrl,
250
- {
251
- protocols = ["jsenv"],
252
- useEventsToManageConnection = true,
253
- retry = false,
254
- retryAfter = 1000,
255
- retryMaxAttempt = Infinity,
256
- retryAllocatedMs = Infinity,
257
- } = {},
258
- ) => {
259
- const connectionManager = createConnectionManager(
260
- ({ onClosed, onOpen }) => {
261
- let socket = new WebSocket(websocketUrl, protocols);
262
- let interval;
263
- const cleanup = () => {
264
- if (socket) {
265
- socket.onerror = null;
265
+ let createWebSocketConnection;
266
+ {
267
+ createWebSocketConnection = (
268
+ websocketUrl,
269
+ {
270
+ logs,
271
+ protocols = ["jsenv"],
272
+ useEventsToManageConnection = true,
273
+ retry = false,
274
+ retryAfter = 1000,
275
+ retryMaxAttempt = Infinity,
276
+ retryAllocatedMs = Infinity,
277
+ } = {},
278
+ ) => {
279
+ const connectionManager = createConnectionManager(
280
+ ({ onClosed, onOpen }) => {
281
+ let socket = new WebSocket(websocketUrl, protocols);
282
+ let interval;
283
+ const cleanup = () => {
284
+ if (socket) {
285
+ socket.onerror = null;
286
+ socket.onopen = null;
287
+ socket.onclose = null;
288
+ socket.onmessage = null;
289
+ socket = null;
290
+ clearInterval(interval);
291
+ }
292
+ };
293
+ socket.onerror = () => {
294
+ cleanup();
295
+ onClosed();
296
+ };
297
+ socket.onopen = () => {
266
298
  socket.onopen = null;
267
- socket.onclose = null;
268
- socket.onmessage = null;
269
- socket = null;
270
- clearInterval(interval);
271
- }
272
- };
273
- socket.onerror = () => {
274
- cleanup();
275
- onClosed();
276
- };
277
- socket.onopen = () => {
278
- socket.onopen = null;
279
- onOpen();
280
- interval = setInterval(() => {
281
- socket.send('{"type":"ping"}');
282
- }, 30_000);
283
- };
284
- socket.onclose = () => {
285
- cleanup();
286
- onClosed();
287
- };
288
- socket.onmessage = (messageEvent) => {
289
- const event = JSON.parse(messageEvent.data);
290
- eventsManager.triggerCallbacks(event);
291
- };
292
- return () => {
293
- if (socket) {
294
- socket.close();
299
+ onOpen();
300
+ interval = setInterval(() => {
301
+ socket.send('{"type":"ping"}');
302
+ }, 30_000);
303
+ };
304
+ socket.onclose = () => {
295
305
  cleanup();
296
- }
297
- };
298
- },
299
- { retry, retryAfter, retryMaxAttempt, retryAllocatedMs },
300
- );
301
- const eventsManager = createEventsManager({
302
- effect: () => {
303
- if (useEventsToManageConnection) {
304
- connectionManager.connect();
306
+ onClosed();
307
+ };
308
+ socket.onmessage = (messageEvent) => {
309
+ const event = JSON.parse(messageEvent.data);
310
+ eventsManager.triggerCallbacks(event);
311
+ };
305
312
  return () => {
306
- connectionManager.disconnect();
313
+ if (socket) {
314
+ socket.close();
315
+ cleanup();
316
+ }
307
317
  };
308
- }
309
- return null;
310
- },
311
- });
318
+ },
319
+ { logs, retry, retryAfter, retryMaxAttempt, retryAllocatedMs },
320
+ );
321
+ const eventsManager = createEventsManager({
322
+ effect: () => {
323
+ if (useEventsToManageConnection) {
324
+ connectionManager.connect();
325
+ return () => {
326
+ connectionManager.disconnect();
327
+ };
328
+ }
329
+ return null;
330
+ },
331
+ });
312
332
 
313
- return {
314
- readyState: connectionManager.readyState,
315
- connect: connectionManager.connect,
316
- disconnect: connectionManager.disconnect,
317
- listenEvents: (namedCallbacks) => {
318
- return eventsManager.addCallbacks(namedCallbacks);
319
- },
320
- destroy: () => {
321
- connectionManager.destroy();
322
- eventsManager.destroy();
323
- },
333
+ return {
334
+ readyState: connectionManager.readyState,
335
+ connect: connectionManager.connect,
336
+ disconnect: connectionManager.disconnect,
337
+ listenEvents: (namedCallbacks) => {
338
+ return eventsManager.addCallbacks(namedCallbacks);
339
+ },
340
+ destroy: () => {
341
+ connectionManager.destroy();
342
+ eventsManager.destroy();
343
+ },
344
+ };
324
345
  };
325
- };
346
+ }
347
+
348
+ // let createEventSourceConnection;
349
+ // connection_using_event_source: {
350
+ // createEventSourceConnection = (
351
+ // eventSourceUrl,
352
+ // {
353
+ // withCredentials = true,
354
+ // lastEventId,
355
+ // useEventsToManageConnection = true,
356
+ // retry = false,
357
+ // retryMaxAttempt = Infinity,
358
+ // retryAllocatedMs = Infinity,
359
+ // } = {},
360
+ // ) => {
361
+ // const eventSourceOrigin = new URL(eventSourceUrl).origin;
362
+ // const attemptConnection = ({ onOpen, onClosed }) => {
363
+ // const url = lastEventId
364
+ // ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)
365
+ // : eventSourceUrl;
366
+ // let eventSource = new EventSource(url, { withCredentials });
367
+ // eventSource.onerror = () => {
368
+ // eventSource.onerror = null;
369
+ // eventSource.onopen = null;
370
+ // eventSource.onmessage = null;
371
+ // eventSource = null;
372
+ // onClosed();
373
+ // };
374
+ // eventSource.onopen = () => {
375
+ // eventSource.onopen = null;
376
+ // onOpen();
377
+ // };
378
+ // eventSource.onmessage = (messageEvent) => {
379
+ // if (messageEvent.origin === eventSourceOrigin) {
380
+ // if (messageEvent.lastEventId) {
381
+ // lastEventId = messageEvent.lastEventId;
382
+ // }
383
+ // const event = JSON.parse(messageEvent.data);
384
+ // eventsManager.triggerCallbacks(event);
385
+ // }
386
+ // };
387
+ // return () => {
388
+ // if (eventSource) {
389
+ // eventSource.close();
390
+ // }
391
+ // };
392
+ // };
393
+ // const connectionManager = createConnectionManager(attemptConnection, {
394
+ // retry,
395
+ // retryMaxAttempt,
396
+ // retryAllocatedMs,
397
+ // });
398
+ // const eventsManager = createEventsManager({
399
+ // effect: () => {
400
+ // if (useEventsToManageConnection) {
401
+ // connectionManager.connect();
402
+ // return () => {
403
+ // connectionManager.disconnect();
404
+ // };
405
+ // }
406
+ // return null;
407
+ // },
408
+ // });
326
409
 
327
- const websocketScheme = self.location.protocol === "https:" ? "wss" : "ws";
328
- const websocketUrl = `${websocketScheme}://${self.location.host}${self.location.pathname}${self.location.search}`;
329
- const websocketConnection = createWebSocketConnection(websocketUrl, {
330
- retry: true,
331
- retryAllocatedMs: 10_000,
332
- });
333
- const { readyState, connect, disconnect, listenEvents } = websocketConnection;
334
- window.__server_events__ = {
335
- readyState,
336
- connect,
337
- disconnect,
338
- listenEvents,
410
+ // return {
411
+ // readyState: connectionManager.readyState,
412
+ // listenEvents: (namedCallbacks) => {
413
+ // return eventsManager.addCallbacks(namedCallbacks);
414
+ // },
415
+ // destroy: () => {
416
+ // connectionManager.destroy();
417
+ // eventsManager.destroy();
418
+ // },
419
+ // };
420
+ // };
421
+
422
+ // const addLastEventIdIntoUrlSearchParams = (url, lastEventId) => {
423
+ // if (url.indexOf("?") === -1) {
424
+ // url += "?";
425
+ // } else {
426
+ // url += "&";
427
+ // }
428
+ // return `${url}last-event-id=${encodeURIComponent(lastEventId)}`;
429
+ // };
430
+ // }
431
+
432
+ const serverEventsInterface = {
433
+ readyState: {},
434
+ connect: () => {},
435
+ disconnect: () => {},
436
+ listenEvents: () => {},
437
+ setup: ({ logs }) => {
438
+ const websocketScheme = self.location.protocol === "https:" ? "wss" : "ws";
439
+ const websocketUrl = `${websocketScheme}://${self.location.host}${self.location.pathname}${self.location.search}`;
440
+ const websocketConnection = createWebSocketConnection(websocketUrl, {
441
+ logs,
442
+ retry: true,
443
+ retryAllocatedMs: 10_000,
444
+ });
445
+
446
+ const { readyState, connect, disconnect, listenEvents } =
447
+ websocketConnection;
448
+
449
+ serverEventsInterface.readyState = readyState;
450
+ serverEventsInterface.connect = connect;
451
+ serverEventsInterface.disconnect = disconnect;
452
+ serverEventsInterface.listenEvents = listenEvents;
453
+
454
+ connect();
455
+ },
339
456
  };
340
- connect();
457
+
458
+ window.__server_events__ = serverEventsInterface;