@jsenv/core 36.3.1 → 37.0.1
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.
- package/dist/js/autoreload.js +6 -5
- package/dist/js/import_meta_hot.js +4 -4
- package/dist/js/server_events_client.js +422 -304
- package/dist/jsenv_core.js +3819 -3256
- package/package.json +17 -17
- package/src/build/build.js +342 -658
- package/src/build/build_urls_generator.js +8 -8
- package/src/build/build_versions_manager.js +495 -0
- package/src/build/version_mappings_injection.js +27 -16
- package/src/dev/file_service.js +80 -91
- package/src/dev/start_dev_server.js +5 -3
- package/src/kitchen/errors.js +16 -16
- package/src/kitchen/fetched_content_compliance.js +4 -8
- package/src/kitchen/kitchen.js +367 -939
- package/src/kitchen/prepend_content.js +13 -35
- package/src/kitchen/url_graph/references.js +713 -0
- package/src/kitchen/url_graph/sort_by_dependencies.js +2 -2
- package/src/kitchen/url_graph/url_content.js +96 -0
- package/src/kitchen/url_graph/url_graph.js +439 -0
- package/src/kitchen/url_graph/url_graph_report.js +6 -4
- package/src/kitchen/url_graph/url_graph_visitor.js +14 -12
- package/src/kitchen/url_graph/url_info_transformations.js +180 -184
- package/src/plugins/autoreload/client/autoreload.js +1 -0
- package/src/plugins/autoreload/client/reload.js +6 -6
- package/src/plugins/autoreload/jsenv_plugin_autoreload.js +2 -2
- package/src/plugins/autoreload/jsenv_plugin_autoreload_client.js +2 -2
- package/src/plugins/autoreload/jsenv_plugin_autoreload_server.js +84 -78
- package/src/plugins/autoreload/jsenv_plugin_hot_search_param.js +52 -0
- package/src/plugins/cache_control/jsenv_plugin_cache_control.js +1 -1
- package/src/plugins/commonjs_globals/jsenv_plugin_commonjs_globals.js +2 -2
- package/src/plugins/global_scenarios/jsenv_plugin_global_scenarios.js +3 -3
- package/src/plugins/import_meta_hot/client/import_meta_hot.js +4 -4
- package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +18 -20
- package/src/plugins/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +2 -2
- package/src/plugins/importmap/jsenv_plugin_importmap.js +35 -37
- package/src/plugins/inlining/jsenv_plugin_inlining.js +1 -17
- package/src/plugins/inlining/jsenv_plugin_inlining_as_data_url.js +70 -50
- package/src/plugins/inlining/jsenv_plugin_inlining_into_html.js +72 -54
- package/src/plugins/plugin_controller.js +92 -27
- package/src/plugins/protocol_file/jsenv_plugin_protocol_file.js +18 -20
- package/src/plugins/reference_analysis/css/jsenv_plugin_css_reference_analysis.js +4 -5
- package/src/plugins/reference_analysis/data_urls/jsenv_plugin_data_urls_analysis.js +18 -16
- package/src/plugins/reference_analysis/directory/jsenv_plugin_directory_reference_analysis.js +13 -20
- package/src/plugins/reference_analysis/html/jsenv_plugin_html_reference_analysis.js +55 -72
- package/src/plugins/reference_analysis/js/jsenv_plugin_js_reference_analysis.js +33 -42
- package/src/plugins/reference_analysis/jsenv_plugin_reference_analysis.js +16 -7
- package/src/plugins/reference_analysis/webmanifest/jsenv_plugin_webmanifest_reference_analysis.js +4 -3
- package/src/plugins/resolution_node_esm/jsenv_plugin_node_esm_resolution.js +16 -6
- package/src/plugins/resolution_node_esm/node_esm_resolver.js +30 -24
- package/src/plugins/resolution_web/jsenv_plugin_web_resolution.js +8 -5
- package/src/plugins/ribbon/jsenv_plugin_ribbon.js +3 -3
- package/src/plugins/server_events/client/server_events_client.js +460 -15
- package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +13 -29
- package/src/plugins/version_search_param/jsenv_plugin_version_search_param.js +1 -1
- package/src/build/version_generator.js +0 -19
- package/src/kitchen/url_graph/url_graph_loader.js +0 -77
- package/src/kitchen/url_graph.js +0 -322
- package/src/plugins/autoreload/jsenv_plugin_hmr.js +0 -42
- package/src/plugins/resolution_node_esm/url_type_from_reference.js +0 -13
- package/src/plugins/server_events/client/connection_manager.js +0 -170
- package/src/plugins/server_events/client/event_source_connection.js +0 -83
- package/src/plugins/server_events/client/events_manager.js +0 -75
- package/src/plugins/server_events/client/web_socket_connection.js +0 -81
- /package/src/kitchen/{url_specifier_encoding.js → url_graph/url_specifier_encoding.js} +0 -0
|
@@ -1,340 +1,458 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
});
|
|
64
|
+
const destroy = () => {
|
|
65
|
+
callbacksMap.clear();
|
|
66
|
+
if (cleanup) {
|
|
67
|
+
cleanup();
|
|
68
|
+
cleanup = null;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
106
71
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
removePageUnloadListener();
|
|
113
|
-
disconnect();
|
|
114
|
-
},
|
|
72
|
+
return {
|
|
73
|
+
addCallbacks,
|
|
74
|
+
triggerCallbacks,
|
|
75
|
+
destroy,
|
|
76
|
+
};
|
|
115
77
|
};
|
|
116
|
-
}
|
|
78
|
+
}
|
|
117
79
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
-
|
|
188
|
-
}
|
|
189
|
-
if (effect && callbacksMapSize === 0 && callbacksMapSize.size > 0) {
|
|
190
|
-
cleanup = effect();
|
|
191
|
-
}
|
|
187
|
+
return _disconnect();
|
|
188
|
+
};
|
|
192
189
|
|
|
193
|
-
|
|
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
|
-
|
|
214
|
-
|
|
215
|
-
callbacksMapSize > 0 &&
|
|
216
|
-
callbacksMapSize.size === 0
|
|
192
|
+
readyState.value === READY_STATES.CONNECTING ||
|
|
193
|
+
readyState.value === READY_STATES.OPEN
|
|
217
194
|
) {
|
|
218
|
-
|
|
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
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
313
|
+
if (socket) {
|
|
314
|
+
socket.close();
|
|
315
|
+
cleanup();
|
|
316
|
+
}
|
|
307
317
|
};
|
|
308
|
-
}
|
|
309
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
|
|
457
|
+
|
|
458
|
+
window.__server_events__ = serverEventsInterface;
|