@jsenv/core 35.0.3 → 35.0.5
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/html/explorer.html +107 -107
- package/dist/js/new_stylesheet.js +3 -0
- package/dist/js/s.js.map +3 -3
- package/package.json +2 -2
- package/src/build/build.js +589 -587
- package/src/build/build_urls_generator.js +44 -44
- package/src/build/graph_utils.js +14 -14
- package/src/build/jsenv_plugin_line_break_normalization.js +6 -6
- package/src/build/line_break_unix.js +11 -11
- package/src/build/start_build_server.js +37 -37
- package/src/build/version_generator.js +7 -7
- package/src/build/version_mappings_injection.js +23 -23
- package/src/dev/file_service.js +132 -132
- package/src/dev/start_dev_server.js +56 -56
- package/src/dev/user_agent.js +8 -8
- package/src/helpers/basic_fetch.js +24 -24
- package/src/helpers/command/command.js +28 -28
- package/src/helpers/lookup_package_directory.js +19 -16
- package/src/helpers/ping_server.js +17 -17
- package/src/helpers/require_from_jsenv.js +2 -2
- package/src/helpers/watch_source_files.js +9 -9
- package/src/helpers/web_url_converter.js +10 -10
- package/src/helpers/worker_reload.js +27 -27
- package/src/kitchen/compat/features_compatibility.js +1 -1
- package/src/kitchen/compat/runtime_compat.js +26 -24
- package/src/kitchen/errors.js +75 -75
- package/src/kitchen/fetched_content_compliance.js +8 -8
- package/src/kitchen/kitchen.js +251 -250
- package/src/kitchen/url_graph/sort_by_dependencies.js +17 -17
- package/src/kitchen/url_graph/url_graph_loader.js +30 -30
- package/src/kitchen/url_graph/url_graph_report.js +57 -57
- package/src/kitchen/url_graph/url_info_transformations.js +77 -77
- package/src/kitchen/url_graph.js +121 -121
- package/src/kitchen/url_specifier_encoding.js +21 -21
- package/src/kitchen/web_workers.js +5 -5
- package/src/main.js +3 -3
- package/src/plugins/autoreload/client/autoreload.js +96 -96
- package/src/plugins/autoreload/client/reload.js +56 -56
- package/src/plugins/autoreload/client/url_helpers.js +13 -13
- package/src/plugins/autoreload/jsenv_plugin_autoreload.js +5 -5
- package/src/plugins/autoreload/jsenv_plugin_autoreload_client.js +9 -9
- package/src/plugins/autoreload/jsenv_plugin_autoreload_server.js +61 -60
- package/src/plugins/autoreload/jsenv_plugin_hmr.js +15 -15
- package/src/plugins/cache_control/jsenv_plugin_cache_control.js +5 -5
- package/src/plugins/commonjs_globals/jsenv_plugin_commonjs_globals.js +57 -57
- package/src/plugins/explorer/client/explorer.html +107 -107
- package/src/plugins/explorer/jsenv_plugin_explorer.js +20 -20
- package/src/plugins/file_urls/jsenv_plugin_file_urls.js +60 -60
- package/src/plugins/global_scenarios/jsenv_plugin_global_scenarios.js +5 -5
- package/src/plugins/http_urls/jsenv_plugin_http_urls.js +3 -3
- package/src/plugins/import_meta_hot/babel_plugin_metadata_import_meta_hot.js +35 -35
- package/src/plugins/import_meta_hot/client/import_meta_hot.js +26 -26
- package/src/plugins/import_meta_hot/html_hot_dependencies.js +43 -43
- package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +44 -40
- package/src/plugins/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +35 -35
- package/src/plugins/import_meta_url/client/import_meta_url_browser.js +21 -21
- package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +3 -3
- package/src/plugins/importmap/jsenv_plugin_importmap.js +54 -54
- package/src/plugins/inline_content_analysis/client/inline_content.js +3 -3
- package/src/plugins/inline_content_analysis/jsenv_plugin_data_urls.js +26 -26
- package/src/plugins/inline_content_analysis/jsenv_plugin_html_inline_content_analysis.js +47 -47
- package/src/plugins/inline_content_analysis/jsenv_plugin_inline_content_analysis.js +9 -9
- package/src/plugins/inline_content_analysis/jsenv_plugin_js_inline_content_analysis.js +101 -101
- package/src/plugins/inlining/jsenv_plugin_inlining.js +9 -9
- package/src/plugins/inlining/jsenv_plugin_inlining_as_data_url.js +11 -11
- package/src/plugins/inlining/jsenv_plugin_inlining_into_html.js +48 -46
- package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +4 -4
- package/src/plugins/plugin_controller.js +124 -124
- package/src/plugins/plugins.js +27 -27
- package/src/plugins/ribbon/client/ribbon.js +6 -6
- package/src/plugins/ribbon/jsenv_plugin_ribbon.js +15 -15
- package/src/plugins/server_events/client/connection_manager.js +52 -52
- package/src/plugins/server_events/client/event_source_connection.js +36 -36
- package/src/plugins/server_events/client/events_manager.js +37 -37
- package/src/plugins/server_events/client/server_events_client.js +7 -7
- package/src/plugins/server_events/client/web_socket_connection.js +39 -39
- package/src/plugins/server_events/jsenv_plugin_server_events_client_injection.js +9 -9
- package/src/plugins/server_events/server_events_dispatcher.js +43 -43
- package/src/plugins/supervisor/client/supervisor.js +455 -450
- package/src/plugins/supervisor/html_supervisor_injection.js +64 -62
- package/src/plugins/supervisor/js_supervisor_injection.js +67 -67
- package/src/plugins/supervisor/jsenv_plugin_supervisor.js +54 -51
- package/src/plugins/transpilation/as_js_module/convert_js_classic_to_js_module.js +13 -13
- package/src/plugins/transpilation/as_js_module/jsenv_plugin_as_js_module.js +19 -19
- package/src/plugins/transpilation/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +10 -10
- package/src/plugins/transpilation/babel/global_this/client/global_this.js +8 -8
- package/src/plugins/transpilation/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +16 -16
- package/src/plugins/transpilation/babel/helpers/babel_plugin_structure.js +36 -36
- package/src/plugins/transpilation/babel/helpers/babel_plugins_compatibility.js +3 -3
- package/src/plugins/transpilation/babel/jsenv_plugin_babel.js +24 -24
- package/src/plugins/transpilation/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +44 -44
- package/src/plugins/transpilation/babel/new_stylesheet/client/new_stylesheet.js +166 -166
- package/src/plugins/transpilation/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +10 -10
- package/src/plugins/transpilation/babel/require_babel_plugin.js +6 -6
- package/src/plugins/transpilation/css/jsenv_plugin_css_transpilation.js +20 -20
- package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +62 -62
- package/src/plugins/transpilation/js_module_fallback/client/s.js +214 -209
- package/src/plugins/transpilation/js_module_fallback/convert_js_module_to_js_classic.js +45 -45
- package/src/plugins/transpilation/js_module_fallback/helpers/babel_plugin_transform_import_meta_resolve.js +6 -6
- package/src/plugins/transpilation/js_module_fallback/helpers/babel_plugin_transform_import_meta_url.js +17 -17
- package/src/plugins/transpilation/js_module_fallback/helpers-string.js +1 -1
- package/src/plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_conversion.js +32 -32
- package/src/plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_fallback.js +17 -17
- package/src/plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_fallback_inside_html.js +63 -63
- package/src/plugins/transpilation/js_module_fallback/jsenv_plugin_js_module_fallback_on_workers.js +15 -15
- package/src/plugins/transpilation/jsenv_plugin_import_meta_resolve.js +20 -20
- package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +23 -23
- package/src/plugins/transpilation/jsenv_plugin_transpilation.js +11 -11
- package/src/plugins/url_analysis/css/css_urls.js +12 -12
- package/src/plugins/url_analysis/html/html_urls.js +85 -85
- package/src/plugins/url_analysis/js/js_urls.js +16 -16
- package/src/plugins/url_analysis/jsenv_plugin_reference_expected_types.js +16 -16
- package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +40 -40
- package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +12 -12
- package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +35 -35
- package/src/plugins/url_resolution/node_esm_resolver.js +26 -26
- package/src/plugins/url_version/jsenv_plugin_url_version.js +11 -11
|
@@ -3,7 +3,7 @@ const READY_STATES = {
|
|
|
3
3
|
OPEN: "open",
|
|
4
4
|
CLOSING: "closing",
|
|
5
5
|
CLOSED: "closed",
|
|
6
|
-
}
|
|
6
|
+
};
|
|
7
7
|
|
|
8
8
|
export const createConnectionManager = (
|
|
9
9
|
attemptConnection,
|
|
@@ -13,74 +13,74 @@ export const createConnectionManager = (
|
|
|
13
13
|
value: READY_STATES.CLOSED,
|
|
14
14
|
goTo: (value) => {
|
|
15
15
|
if (value === readyState.value) {
|
|
16
|
-
return
|
|
16
|
+
return;
|
|
17
17
|
}
|
|
18
|
-
readyState.value = value
|
|
19
|
-
readyState.onchange()
|
|
18
|
+
readyState.value = value;
|
|
19
|
+
readyState.onchange();
|
|
20
20
|
},
|
|
21
21
|
onchange: () => {},
|
|
22
|
-
}
|
|
22
|
+
};
|
|
23
23
|
|
|
24
|
-
let _disconnect = () => {}
|
|
24
|
+
let _disconnect = () => {};
|
|
25
25
|
const connect = () => {
|
|
26
26
|
if (
|
|
27
27
|
readyState.value === READY_STATES.CONNECTING ||
|
|
28
28
|
readyState.value === READY_STATES.OPEN
|
|
29
29
|
) {
|
|
30
|
-
return
|
|
30
|
+
return;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
let retryCount = 0
|
|
34
|
-
let msSpent = 0
|
|
33
|
+
let retryCount = 0;
|
|
34
|
+
let msSpent = 0;
|
|
35
35
|
const attempt = () => {
|
|
36
|
-
readyState.goTo(READY_STATES.CONNECTING)
|
|
37
|
-
let timeout
|
|
36
|
+
readyState.goTo(READY_STATES.CONNECTING);
|
|
37
|
+
let timeout;
|
|
38
38
|
const cancelAttempt = attemptConnection({
|
|
39
39
|
onClosed: () => {
|
|
40
40
|
if (!retry) {
|
|
41
|
-
readyState.goTo(READY_STATES.CLOSED)
|
|
42
|
-
console.info(`[jsenv] failed to connect to server`)
|
|
43
|
-
return
|
|
41
|
+
readyState.goTo(READY_STATES.CLOSED);
|
|
42
|
+
console.info(`[jsenv] failed to connect to server`);
|
|
43
|
+
return;
|
|
44
44
|
}
|
|
45
45
|
if (retryCount > retryMaxAttempt) {
|
|
46
|
-
readyState.goTo(READY_STATES.CLOSED)
|
|
46
|
+
readyState.goTo(READY_STATES.CLOSED);
|
|
47
47
|
console.info(
|
|
48
48
|
`[jsenv] could not connect to server after ${retryMaxAttempt} attempt`,
|
|
49
|
-
)
|
|
50
|
-
return
|
|
49
|
+
);
|
|
50
|
+
return;
|
|
51
51
|
}
|
|
52
52
|
if (retryAllocatedMs && msSpent > retryAllocatedMs) {
|
|
53
|
-
readyState.goTo(READY_STATES.CLOSED)
|
|
53
|
+
readyState.goTo(READY_STATES.CLOSED);
|
|
54
54
|
console.info(
|
|
55
55
|
`[jsenv] could not connect to server in less than ${retryAllocatedMs}ms`,
|
|
56
|
-
)
|
|
57
|
-
return
|
|
56
|
+
);
|
|
57
|
+
return;
|
|
58
58
|
}
|
|
59
59
|
// if closed while open -> connection lost
|
|
60
60
|
// otherwise it's the attempt to connect for the first time
|
|
61
61
|
// or to reconnect
|
|
62
62
|
if (readyState.value === READY_STATES.OPEN) {
|
|
63
|
-
console.info(`[jsenv] server connection lost; retrying to connect`)
|
|
63
|
+
console.info(`[jsenv] server connection lost; retrying to connect`);
|
|
64
64
|
}
|
|
65
|
-
retryCount
|
|
65
|
+
retryCount++;
|
|
66
66
|
timeout = setTimeout(() => {
|
|
67
|
-
msSpent += retryAfter
|
|
68
|
-
attempt()
|
|
69
|
-
}, retryAfter)
|
|
67
|
+
msSpent += retryAfter;
|
|
68
|
+
attempt();
|
|
69
|
+
}, retryAfter);
|
|
70
70
|
},
|
|
71
71
|
onOpen: () => {
|
|
72
|
-
readyState.goTo(READY_STATES.OPEN)
|
|
72
|
+
readyState.goTo(READY_STATES.OPEN);
|
|
73
73
|
// console.info(`[jsenv] connected to server`)
|
|
74
74
|
},
|
|
75
|
-
})
|
|
75
|
+
});
|
|
76
76
|
_disconnect = () => {
|
|
77
|
-
cancelAttempt()
|
|
78
|
-
clearTimeout(timeout)
|
|
79
|
-
readyState.goTo(READY_STATES.CLOSED)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
attempt()
|
|
83
|
-
}
|
|
77
|
+
cancelAttempt();
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
readyState.goTo(READY_STATES.CLOSED);
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
attempt();
|
|
83
|
+
};
|
|
84
84
|
|
|
85
85
|
const disconnect = () => {
|
|
86
86
|
if (
|
|
@@ -89,31 +89,31 @@ export const createConnectionManager = (
|
|
|
89
89
|
) {
|
|
90
90
|
console.warn(
|
|
91
91
|
`disconnect() ignored because connection is ${readyState.value}`,
|
|
92
|
-
)
|
|
93
|
-
return null
|
|
92
|
+
);
|
|
93
|
+
return null;
|
|
94
94
|
}
|
|
95
|
-
return _disconnect()
|
|
96
|
-
}
|
|
95
|
+
return _disconnect();
|
|
96
|
+
};
|
|
97
97
|
|
|
98
98
|
const removePageUnloadListener = listenPageUnload(() => {
|
|
99
99
|
if (
|
|
100
100
|
readyState.value === READY_STATES.CONNECTING ||
|
|
101
101
|
readyState.value === READY_STATES.OPEN
|
|
102
102
|
) {
|
|
103
|
-
_disconnect()
|
|
103
|
+
_disconnect();
|
|
104
104
|
}
|
|
105
|
-
})
|
|
105
|
+
});
|
|
106
106
|
|
|
107
107
|
return {
|
|
108
108
|
readyState,
|
|
109
109
|
connect,
|
|
110
110
|
disconnect,
|
|
111
111
|
destroy: () => {
|
|
112
|
-
removePageUnloadListener()
|
|
113
|
-
disconnect()
|
|
112
|
+
removePageUnloadListener();
|
|
113
|
+
disconnect();
|
|
114
114
|
},
|
|
115
|
-
}
|
|
116
|
-
}
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
117
|
|
|
118
118
|
// const listenPageMightFreeze = (callback) => {
|
|
119
119
|
// const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
|
|
@@ -155,16 +155,16 @@ const listenPageUnload = (callback) => {
|
|
|
155
155
|
"pagehide",
|
|
156
156
|
(pageHideEvent) => {
|
|
157
157
|
if (pageHideEvent.persisted !== true) {
|
|
158
|
-
callback(pageHideEvent)
|
|
158
|
+
callback(pageHideEvent);
|
|
159
159
|
}
|
|
160
160
|
},
|
|
161
|
-
)
|
|
162
|
-
return removePageHideListener
|
|
163
|
-
}
|
|
161
|
+
);
|
|
162
|
+
return removePageHideListener;
|
|
163
|
+
};
|
|
164
164
|
|
|
165
165
|
const listenEvent = (emitter, event, callback) => {
|
|
166
|
-
emitter.addEventListener(event, callback)
|
|
166
|
+
emitter.addEventListener(event, callback);
|
|
167
167
|
return () => {
|
|
168
|
-
emitter.removeEventListener(event, callback)
|
|
169
|
-
}
|
|
170
|
-
}
|
|
168
|
+
emitter.removeEventListener(event, callback);
|
|
169
|
+
};
|
|
170
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createConnectionManager } from "./connection_manager.js"
|
|
2
|
-
import { createEventsManager } from "./events_manager.js"
|
|
1
|
+
import { createConnectionManager } from "./connection_manager.js";
|
|
2
|
+
import { createEventsManager } from "./events_manager.js";
|
|
3
3
|
|
|
4
4
|
export const createEventSourceConnection = (
|
|
5
5
|
eventSourceUrl,
|
|
@@ -12,72 +12,72 @@ export const createEventSourceConnection = (
|
|
|
12
12
|
retryAllocatedMs = Infinity,
|
|
13
13
|
} = {},
|
|
14
14
|
) => {
|
|
15
|
-
const eventSourceOrigin = new URL(eventSourceUrl).origin
|
|
15
|
+
const eventSourceOrigin = new URL(eventSourceUrl).origin;
|
|
16
16
|
const attemptConnection = ({ onOpen, onClosed }) => {
|
|
17
17
|
const url = lastEventId
|
|
18
18
|
? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)
|
|
19
|
-
: eventSourceUrl
|
|
20
|
-
let eventSource = new EventSource(url, { withCredentials })
|
|
19
|
+
: eventSourceUrl;
|
|
20
|
+
let eventSource = new EventSource(url, { withCredentials });
|
|
21
21
|
eventSource.onerror = () => {
|
|
22
|
-
eventSource.onerror = null
|
|
23
|
-
eventSource.onopen = null
|
|
24
|
-
eventSource.onmessage = null
|
|
25
|
-
eventSource = null
|
|
26
|
-
onClosed()
|
|
27
|
-
}
|
|
22
|
+
eventSource.onerror = null;
|
|
23
|
+
eventSource.onopen = null;
|
|
24
|
+
eventSource.onmessage = null;
|
|
25
|
+
eventSource = null;
|
|
26
|
+
onClosed();
|
|
27
|
+
};
|
|
28
28
|
eventSource.onopen = () => {
|
|
29
|
-
eventSource.onopen = null
|
|
30
|
-
onOpen()
|
|
31
|
-
}
|
|
29
|
+
eventSource.onopen = null;
|
|
30
|
+
onOpen();
|
|
31
|
+
};
|
|
32
32
|
eventSource.onmessage = (messageEvent) => {
|
|
33
33
|
if (messageEvent.origin === eventSourceOrigin) {
|
|
34
34
|
if (messageEvent.lastEventId) {
|
|
35
|
-
lastEventId = messageEvent.lastEventId
|
|
35
|
+
lastEventId = messageEvent.lastEventId;
|
|
36
36
|
}
|
|
37
|
-
const event = JSON.parse(messageEvent.data)
|
|
38
|
-
eventsManager.triggerCallbacks(event)
|
|
37
|
+
const event = JSON.parse(messageEvent.data);
|
|
38
|
+
eventsManager.triggerCallbacks(event);
|
|
39
39
|
}
|
|
40
|
-
}
|
|
40
|
+
};
|
|
41
41
|
return () => {
|
|
42
42
|
if (eventSource) {
|
|
43
|
-
eventSource.close()
|
|
43
|
+
eventSource.close();
|
|
44
44
|
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
47
|
const connectionManager = createConnectionManager(attemptConnection, {
|
|
48
48
|
retry,
|
|
49
49
|
retryMaxAttempt,
|
|
50
50
|
retryAllocatedMs,
|
|
51
|
-
})
|
|
51
|
+
});
|
|
52
52
|
const eventsManager = createEventsManager({
|
|
53
53
|
effect: () => {
|
|
54
54
|
if (useEventsToManageConnection) {
|
|
55
|
-
connectionManager.connect()
|
|
55
|
+
connectionManager.connect();
|
|
56
56
|
return () => {
|
|
57
|
-
connectionManager.disconnect()
|
|
58
|
-
}
|
|
57
|
+
connectionManager.disconnect();
|
|
58
|
+
};
|
|
59
59
|
}
|
|
60
|
-
return null
|
|
60
|
+
return null;
|
|
61
61
|
},
|
|
62
|
-
})
|
|
62
|
+
});
|
|
63
63
|
|
|
64
64
|
return {
|
|
65
65
|
readyState: connectionManager.readyState,
|
|
66
66
|
listenEvents: (namedCallbacks) => {
|
|
67
|
-
return eventsManager.addCallbacks(namedCallbacks)
|
|
67
|
+
return eventsManager.addCallbacks(namedCallbacks);
|
|
68
68
|
},
|
|
69
69
|
destroy: () => {
|
|
70
|
-
connectionManager.destroy()
|
|
71
|
-
eventsManager.destroy()
|
|
70
|
+
connectionManager.destroy();
|
|
71
|
+
eventsManager.destroy();
|
|
72
72
|
},
|
|
73
|
-
}
|
|
74
|
-
}
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
75
|
|
|
76
76
|
const addLastEventIdIntoUrlSearchParams = (url, lastEventId) => {
|
|
77
77
|
if (url.indexOf("?") === -1) {
|
|
78
|
-
url += "?"
|
|
78
|
+
url += "?";
|
|
79
79
|
} else {
|
|
80
|
-
url += "&"
|
|
80
|
+
url += "&";
|
|
81
81
|
}
|
|
82
|
-
return `${url}last-event-id=${encodeURIComponent(lastEventId)}
|
|
83
|
-
}
|
|
82
|
+
return `${url}last-event-id=${encodeURIComponent(lastEventId)}`;
|
|
83
|
+
};
|
|
@@ -1,75 +1,75 @@
|
|
|
1
1
|
export const createEventsManager = ({ effect = () => {} } = {}) => {
|
|
2
|
-
const callbacksMap = new Map()
|
|
3
|
-
let cleanup
|
|
2
|
+
const callbacksMap = new Map();
|
|
3
|
+
let cleanup;
|
|
4
4
|
const addCallbacks = (namedCallbacks) => {
|
|
5
|
-
let callbacksMapSize = callbacksMap.size
|
|
5
|
+
let callbacksMapSize = callbacksMap.size;
|
|
6
6
|
Object.keys(namedCallbacks).forEach((eventName) => {
|
|
7
|
-
const callback = namedCallbacks[eventName]
|
|
8
|
-
const existingCallbacks = callbacksMap.get(eventName)
|
|
9
|
-
let callbacks
|
|
7
|
+
const callback = namedCallbacks[eventName];
|
|
8
|
+
const existingCallbacks = callbacksMap.get(eventName);
|
|
9
|
+
let callbacks;
|
|
10
10
|
if (existingCallbacks) {
|
|
11
|
-
callbacks = existingCallbacks
|
|
11
|
+
callbacks = existingCallbacks;
|
|
12
12
|
} else {
|
|
13
|
-
callbacks = []
|
|
14
|
-
callbacksMap.set(eventName, callbacks)
|
|
13
|
+
callbacks = [];
|
|
14
|
+
callbacksMap.set(eventName, callbacks);
|
|
15
15
|
}
|
|
16
|
-
callbacks.push(callback)
|
|
17
|
-
})
|
|
16
|
+
callbacks.push(callback);
|
|
17
|
+
});
|
|
18
18
|
if (effect && callbacksMapSize === 0 && callbacksMapSize.size > 0) {
|
|
19
|
-
cleanup = effect()
|
|
19
|
+
cleanup = effect();
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
let removed = false
|
|
22
|
+
let removed = false;
|
|
23
23
|
return () => {
|
|
24
|
-
if (removed) return
|
|
25
|
-
removed = true
|
|
26
|
-
callbacksMapSize = callbacksMap.size
|
|
24
|
+
if (removed) return;
|
|
25
|
+
removed = true;
|
|
26
|
+
callbacksMapSize = callbacksMap.size;
|
|
27
27
|
Object.keys(namedCallbacks).forEach((eventName) => {
|
|
28
|
-
const callback = namedCallbacks[eventName]
|
|
29
|
-
const callbacks = callbacksMap.get(eventName)
|
|
28
|
+
const callback = namedCallbacks[eventName];
|
|
29
|
+
const callbacks = callbacksMap.get(eventName);
|
|
30
30
|
if (callbacks) {
|
|
31
|
-
const index = callbacks.indexOf(callback)
|
|
31
|
+
const index = callbacks.indexOf(callback);
|
|
32
32
|
if (index > -1) {
|
|
33
|
-
callbacks.splice(index, 1)
|
|
33
|
+
callbacks.splice(index, 1);
|
|
34
34
|
if (callbacks.length === 0) {
|
|
35
|
-
callbacksMap.delete(eventName)
|
|
35
|
+
callbacksMap.delete(eventName);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
})
|
|
40
|
-
namedCallbacks = null // allow garbage collect
|
|
39
|
+
});
|
|
40
|
+
namedCallbacks = null; // allow garbage collect
|
|
41
41
|
if (
|
|
42
42
|
cleanup &&
|
|
43
43
|
typeof cleanup === "function" &&
|
|
44
44
|
callbacksMapSize > 0 &&
|
|
45
45
|
callbacksMapSize.size === 0
|
|
46
46
|
) {
|
|
47
|
-
cleanup()
|
|
48
|
-
cleanup = null
|
|
47
|
+
cleanup();
|
|
48
|
+
cleanup = null;
|
|
49
49
|
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
52
|
|
|
53
53
|
const triggerCallbacks = (event) => {
|
|
54
|
-
const callbacks = callbacksMap.get(event.type)
|
|
54
|
+
const callbacks = callbacksMap.get(event.type);
|
|
55
55
|
if (callbacks) {
|
|
56
56
|
callbacks.forEach((callback) => {
|
|
57
|
-
callback(event)
|
|
58
|
-
})
|
|
57
|
+
callback(event);
|
|
58
|
+
});
|
|
59
59
|
}
|
|
60
|
-
}
|
|
60
|
+
};
|
|
61
61
|
|
|
62
62
|
const destroy = () => {
|
|
63
|
-
callbacksMap.clear()
|
|
63
|
+
callbacksMap.clear();
|
|
64
64
|
if (cleanup) {
|
|
65
|
-
cleanup()
|
|
66
|
-
cleanup = null
|
|
65
|
+
cleanup();
|
|
66
|
+
cleanup = null;
|
|
67
67
|
}
|
|
68
|
-
}
|
|
68
|
+
};
|
|
69
69
|
|
|
70
70
|
return {
|
|
71
71
|
addCallbacks,
|
|
72
72
|
triggerCallbacks,
|
|
73
73
|
destroy,
|
|
74
|
-
}
|
|
75
|
-
}
|
|
74
|
+
};
|
|
75
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { createWebSocketConnection } from "./web_socket_connection.js"
|
|
1
|
+
import { createWebSocketConnection } from "./web_socket_connection.js";
|
|
2
2
|
|
|
3
|
-
const websocketScheme = self.location.protocol === "https:" ? "wss" : "ws"
|
|
4
|
-
const websocketUrl = `${websocketScheme}://${self.location.host}${self.location.pathname}${self.location.search}
|
|
3
|
+
const websocketScheme = self.location.protocol === "https:" ? "wss" : "ws";
|
|
4
|
+
const websocketUrl = `${websocketScheme}://${self.location.host}${self.location.pathname}${self.location.search}`;
|
|
5
5
|
const websocketConnection = createWebSocketConnection(websocketUrl, {
|
|
6
6
|
retry: true,
|
|
7
7
|
retryAllocatedMs: 10_000,
|
|
8
|
-
})
|
|
9
|
-
const { readyState, connect, disconnect, listenEvents } = websocketConnection
|
|
8
|
+
});
|
|
9
|
+
const { readyState, connect, disconnect, listenEvents } = websocketConnection;
|
|
10
10
|
window.__server_events__ = {
|
|
11
11
|
readyState,
|
|
12
12
|
connect,
|
|
13
13
|
disconnect,
|
|
14
14
|
listenEvents,
|
|
15
|
-
}
|
|
16
|
-
connect()
|
|
15
|
+
};
|
|
16
|
+
connect();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createConnectionManager } from "./connection_manager.js"
|
|
2
|
-
import { createEventsManager } from "./events_manager.js"
|
|
1
|
+
import { createConnectionManager } from "./connection_manager.js";
|
|
2
|
+
import { createEventsManager } from "./events_manager.js";
|
|
3
3
|
|
|
4
4
|
export const createWebSocketConnection = (
|
|
5
5
|
websocketUrl,
|
|
@@ -14,68 +14,68 @@ export const createWebSocketConnection = (
|
|
|
14
14
|
) => {
|
|
15
15
|
const connectionManager = createConnectionManager(
|
|
16
16
|
({ onClosed, onOpen }) => {
|
|
17
|
-
let socket = new WebSocket(websocketUrl, protocols)
|
|
18
|
-
let interval
|
|
17
|
+
let socket = new WebSocket(websocketUrl, protocols);
|
|
18
|
+
let interval;
|
|
19
19
|
const cleanup = () => {
|
|
20
20
|
if (socket) {
|
|
21
|
-
socket.onerror = null
|
|
22
|
-
socket.onopen = null
|
|
23
|
-
socket.onclose = null
|
|
24
|
-
socket.onmessage = null
|
|
25
|
-
socket = null
|
|
26
|
-
clearInterval(interval)
|
|
21
|
+
socket.onerror = null;
|
|
22
|
+
socket.onopen = null;
|
|
23
|
+
socket.onclose = null;
|
|
24
|
+
socket.onmessage = null;
|
|
25
|
+
socket = null;
|
|
26
|
+
clearInterval(interval);
|
|
27
27
|
}
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
socket.onerror = () => {
|
|
30
|
-
cleanup()
|
|
31
|
-
onClosed()
|
|
32
|
-
}
|
|
30
|
+
cleanup();
|
|
31
|
+
onClosed();
|
|
32
|
+
};
|
|
33
33
|
socket.onopen = () => {
|
|
34
|
-
socket.onopen = null
|
|
35
|
-
onOpen()
|
|
34
|
+
socket.onopen = null;
|
|
35
|
+
onOpen();
|
|
36
36
|
interval = setInterval(() => {
|
|
37
|
-
socket.send('{"type":"ping"}')
|
|
38
|
-
}, 30_000)
|
|
39
|
-
}
|
|
37
|
+
socket.send('{"type":"ping"}');
|
|
38
|
+
}, 30_000);
|
|
39
|
+
};
|
|
40
40
|
socket.onclose = () => {
|
|
41
|
-
cleanup()
|
|
42
|
-
onClosed()
|
|
43
|
-
}
|
|
41
|
+
cleanup();
|
|
42
|
+
onClosed();
|
|
43
|
+
};
|
|
44
44
|
socket.onmessage = (messageEvent) => {
|
|
45
|
-
const event = JSON.parse(messageEvent.data)
|
|
46
|
-
eventsManager.triggerCallbacks(event)
|
|
47
|
-
}
|
|
45
|
+
const event = JSON.parse(messageEvent.data);
|
|
46
|
+
eventsManager.triggerCallbacks(event);
|
|
47
|
+
};
|
|
48
48
|
return () => {
|
|
49
49
|
if (socket) {
|
|
50
|
-
socket.close()
|
|
51
|
-
cleanup()
|
|
50
|
+
socket.close();
|
|
51
|
+
cleanup();
|
|
52
52
|
}
|
|
53
|
-
}
|
|
53
|
+
};
|
|
54
54
|
},
|
|
55
55
|
{ retry, retryAfter, retryMaxAttempt, retryAllocatedMs },
|
|
56
|
-
)
|
|
56
|
+
);
|
|
57
57
|
const eventsManager = createEventsManager({
|
|
58
58
|
effect: () => {
|
|
59
59
|
if (useEventsToManageConnection) {
|
|
60
|
-
connectionManager.connect()
|
|
60
|
+
connectionManager.connect();
|
|
61
61
|
return () => {
|
|
62
|
-
connectionManager.disconnect()
|
|
63
|
-
}
|
|
62
|
+
connectionManager.disconnect();
|
|
63
|
+
};
|
|
64
64
|
}
|
|
65
|
-
return null
|
|
65
|
+
return null;
|
|
66
66
|
},
|
|
67
|
-
})
|
|
67
|
+
});
|
|
68
68
|
|
|
69
69
|
return {
|
|
70
70
|
readyState: connectionManager.readyState,
|
|
71
71
|
connect: connectionManager.connect,
|
|
72
72
|
disconnect: connectionManager.disconnect,
|
|
73
73
|
listenEvents: (namedCallbacks) => {
|
|
74
|
-
return eventsManager.addCallbacks(namedCallbacks)
|
|
74
|
+
return eventsManager.addCallbacks(namedCallbacks);
|
|
75
75
|
},
|
|
76
76
|
destroy: () => {
|
|
77
|
-
connectionManager.destroy()
|
|
78
|
-
eventsManager.destroy()
|
|
77
|
+
connectionManager.destroy();
|
|
78
|
+
eventsManager.destroy();
|
|
79
79
|
},
|
|
80
|
-
}
|
|
81
|
-
}
|
|
80
|
+
};
|
|
81
|
+
};
|
|
@@ -8,12 +8,12 @@ import {
|
|
|
8
8
|
stringifyHtmlAst,
|
|
9
9
|
injectHtmlNodeAsEarlyAsPossible,
|
|
10
10
|
createHtmlNode,
|
|
11
|
-
} from "@jsenv/ast"
|
|
11
|
+
} from "@jsenv/ast";
|
|
12
12
|
|
|
13
13
|
const serverEventsClientFileUrl = new URL(
|
|
14
14
|
"./client/server_events_client.js",
|
|
15
15
|
import.meta.url,
|
|
16
|
-
).href
|
|
16
|
+
).href;
|
|
17
17
|
|
|
18
18
|
export const jsenvPluginServerEventsClientInjection = () => {
|
|
19
19
|
return {
|
|
@@ -21,7 +21,7 @@ export const jsenvPluginServerEventsClientInjection = () => {
|
|
|
21
21
|
appliesDuring: "*",
|
|
22
22
|
transformUrlContent: {
|
|
23
23
|
html: (htmlUrlInfo, context) => {
|
|
24
|
-
const htmlAst = parseHtmlString(htmlUrlInfo.content)
|
|
24
|
+
const htmlAst = parseHtmlString(htmlUrlInfo.content);
|
|
25
25
|
const [serverEventsClientFileReference] = context.referenceUtils.inject(
|
|
26
26
|
{
|
|
27
27
|
type: "script",
|
|
@@ -29,7 +29,7 @@ export const jsenvPluginServerEventsClientInjection = () => {
|
|
|
29
29
|
expectedType: "js_module",
|
|
30
30
|
specifier: serverEventsClientFileUrl,
|
|
31
31
|
},
|
|
32
|
-
)
|
|
32
|
+
);
|
|
33
33
|
injectHtmlNodeAsEarlyAsPossible(
|
|
34
34
|
htmlAst,
|
|
35
35
|
createHtmlNode({
|
|
@@ -38,12 +38,12 @@ export const jsenvPluginServerEventsClientInjection = () => {
|
|
|
38
38
|
src: serverEventsClientFileReference.generatedSpecifier,
|
|
39
39
|
}),
|
|
40
40
|
"jsenv:server_events",
|
|
41
|
-
)
|
|
42
|
-
const htmlModified = stringifyHtmlAst(htmlAst)
|
|
41
|
+
);
|
|
42
|
+
const htmlModified = stringifyHtmlAst(htmlAst);
|
|
43
43
|
return {
|
|
44
44
|
content: htmlModified,
|
|
45
|
-
}
|
|
45
|
+
};
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
|
-
}
|
|
49
|
-
}
|
|
48
|
+
};
|
|
49
|
+
};
|