@jsenv/core 27.0.0-alpha.4 → 27.0.0-alpha.40

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 (141) hide show
  1. package/dist/event_source_client.js +549 -0
  2. package/dist/event_source_client.js.map +188 -0
  3. package/dist/html_supervisor_installer.js +1145 -0
  4. package/dist/html_supervisor_installer.js.map +322 -0
  5. package/dist/html_supervisor_setup.js +92 -0
  6. package/dist/html_supervisor_setup.js.map +57 -0
  7. package/main.js +8 -1
  8. package/package.json +22 -21
  9. package/readme.md +4 -12
  10. package/src/build/build.js +731 -433
  11. package/src/build/build_urls_generator.js +55 -21
  12. package/src/build/graph_utils.js +31 -0
  13. package/src/build/{inject_version_mappings.js → inject_global_version_mappings.js} +33 -15
  14. package/src/build/inject_service_worker_urls.js +79 -0
  15. package/src/build/resync_ressource_hints.js +68 -0
  16. package/src/build/start_build_server.js +205 -0
  17. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +2 -2
  18. package/src/dev/plugins/toolbar/jsenv_plugin_toolbar.js +3 -1
  19. package/src/dev/start_dev_server.js +58 -26
  20. package/src/execute/execute.js +30 -4
  21. package/src/execute/run.js +19 -56
  22. package/src/execute/runtimes/browsers/from_playwright.js +201 -147
  23. package/src/execute/runtimes/node/controllable_file.mjs +26 -10
  24. package/src/execute/runtimes/node/node_execution_performance.js +67 -0
  25. package/src/execute/runtimes/node/node_process.js +280 -39
  26. package/src/jsenv_root_directory_url.js +1 -0
  27. package/src/omega/{runtime_support/default_runtime_support.js → compat/default_runtime_compat.js} +3 -5
  28. package/src/omega/{runtime_support/features_compatibility.js → compat/features_compats.js} +66 -4
  29. package/src/omega/compat/runtime_compat.js +50 -0
  30. package/src/omega/errors.js +51 -58
  31. package/src/omega/fetched_content_compliance.js +24 -0
  32. package/src/omega/file_url_converter.js +8 -50
  33. package/src/omega/kitchen.js +414 -285
  34. package/src/omega/server/file_service.js +21 -22
  35. package/src/omega/url_graph/url_graph_load.js +14 -7
  36. package/src/omega/url_graph/url_graph_report.js +17 -15
  37. package/src/omega/url_graph/url_info_transformations.js +17 -5
  38. package/src/omega/url_graph.js +33 -10
  39. package/src/omega/web_workers.js +42 -0
  40. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/autoreload_preference.js +0 -0
  41. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/event_source_client.js +2 -2
  42. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/reload.js +0 -0
  43. package/src/{dev/plugins/autoreload → plugins/autoreload/dev_sse}/client/url_helpers.js +0 -0
  44. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +46 -0
  45. package/src/{dev/plugins/autoreload/jsenv_plugin_autoreload.js → plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_server.js} +31 -172
  46. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +27 -0
  47. package/src/plugins/autoreload/jsenv_plugin_hmr.js +35 -0
  48. package/src/plugins/bundling/css/bundle_css.js +21 -0
  49. package/src/plugins/bundling/js_classic_workers/bundle_js_classic_workers.js +13 -0
  50. package/src/{build/plugins/bundle_js_module/jsenv_plugin_bundle_js_module.js → plugins/bundling/js_module/bundle_js_module.js} +120 -79
  51. package/src/plugins/bundling/jsenv_plugin_bundling.js +51 -0
  52. package/src/{omega/core_plugins → plugins}/commonjs_globals/jsenv_plugin_commonjs_globals.js +54 -41
  53. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +66 -0
  54. package/src/{omega/core_plugins → plugins}/filesystem_magic/jsenv_plugin_filesystem_magic.js +8 -5
  55. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_document.js +0 -0
  56. package/src/{omega/core_plugins → plugins}/html_supervisor/client/error_in_notification.js +0 -0
  57. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_installer.js +3 -2
  58. package/src/{omega/core_plugins → plugins}/html_supervisor/client/html_supervisor_setup.js +0 -0
  59. package/src/{omega/core_plugins → plugins}/html_supervisor/client/perf_browser.js +0 -0
  60. package/src/{omega/core_plugins → plugins}/html_supervisor/client/uneval_exception.js +0 -0
  61. package/src/{omega/core_plugins → plugins}/html_supervisor/jsenv_plugin_html_supervisor.js +52 -55
  62. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +12 -0
  63. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/babel_plugin_metadata_import_meta_hot.js +4 -5
  64. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/client/import_meta_hot.js +3 -1
  65. package/src/{dev/plugins/autoreload → plugins/import_meta_hot}/html_hot_dependencies.js +2 -2
  66. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +101 -0
  67. package/src/{omega/core_plugins → plugins}/import_meta_scenarios/jsenv_plugin_import_meta_scenarios.js +33 -8
  68. package/src/plugins/import_meta_url/client/import_meta_url_browser.js +52 -0
  69. package/src/plugins/import_meta_url/client/import_meta_url_commonjs.mjs +9 -0
  70. package/src/{omega/core_plugins → plugins}/importmap/jsenv_plugin_importmap.js +37 -31
  71. package/src/plugins/inject_globals/jsenv_plugin_inject_globals.js +67 -0
  72. package/src/{omega/core_plugins → plugins}/inline/client/inline_content.js +0 -0
  73. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_data_urls.js +18 -14
  74. package/src/{omega/core_plugins/inline/jsenv_plugin_js_and_css_inside_html.js → plugins/inline/jsenv_plugin_html_inline_content.js} +61 -40
  75. package/src/plugins/inline/jsenv_plugin_inline.js +36 -0
  76. package/src/{omega/core_plugins → plugins}/inline/jsenv_plugin_inline_query_param.js +6 -6
  77. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +296 -0
  78. package/src/plugins/leading_slash/jsenv_plugin_leading_slash.js +13 -0
  79. package/src/plugins/minification/css/minify_css.js +9 -0
  80. package/src/plugins/minification/html/minify_html.js +15 -0
  81. package/src/{build/plugins/minify_js/jsenv_plugin_minify_js.js → plugins/minification/js/minify_js.js} +6 -22
  82. package/src/plugins/minification/jsenv_plugin_minification.js +78 -0
  83. package/src/plugins/minification/json/minify_json.js +8 -0
  84. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +146 -0
  85. package/src/{omega → plugins}/plugin_controller.js +39 -11
  86. package/src/plugins/plugins.js +89 -0
  87. package/src/plugins/transpilation/as_js_classic/client/s.js +808 -0
  88. package/src/plugins/transpilation/as_js_classic/client/s.js.md +1 -0
  89. package/src/plugins/transpilation/as_js_classic/helpers/babel_plugin_transform_import_meta_url.js +47 -0
  90. package/src/plugins/transpilation/as_js_classic/helpers/systemjs_old.js +43 -0
  91. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +183 -0
  92. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_script_type_module_as_classic.js +256 -0
  93. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_workers_type_module_as_classic.js +93 -0
  94. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/babel_plugin_global_this_as_jsenv_import.js +0 -0
  95. package/src/{omega/core_plugins → plugins/transpilation}/babel/global_this/client/global_this.js +0 -0
  96. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_babel_helpers_as_jsenv_imports.js +0 -0
  97. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugin_structure.js +4 -22
  98. package/src/{omega/core_plugins → plugins/transpilation}/babel/helpers/babel_plugins_compatibility.js +0 -0
  99. package/src/{omega/core_plugins → plugins/transpilation}/babel/jsenv_plugin_babel.js +37 -21
  100. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/babel_plugin_new_stylesheet_as_jsenv_import.js +30 -6
  101. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/.eslintrc.cjs +0 -0
  102. package/src/{omega/core_plugins → plugins/transpilation}/babel/new_stylesheet/client/new_stylesheet.js +0 -0
  103. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/babel_plugin_regenerator_runtime_as_jsenv_import.js +0 -0
  104. package/src/{omega/core_plugins → plugins/transpilation}/babel/regenerator_runtime/client/regenerator_runtime.js +0 -0
  105. package/src/plugins/transpilation/css_parcel/jsenv_plugin_css_parcel.js +18 -0
  106. package/src/plugins/transpilation/fetch_original_url_info.js +30 -0
  107. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +200 -0
  108. package/src/plugins/transpilation/jsenv_plugin_top_level_await.js +70 -0
  109. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +44 -0
  110. package/src/plugins/url_references/css/css_urls.js +49 -0
  111. package/src/plugins/url_references/html/html_urls.js +273 -0
  112. package/src/plugins/url_references/js/js_urls.js +43 -0
  113. package/src/plugins/url_references/jsenv_plugin_imports_analysis.js +46 -0
  114. package/src/plugins/url_references/jsenv_plugin_url_analysis.js +18 -0
  115. package/src/plugins/url_references/jsenv_plugin_url_references.js +6 -0
  116. package/src/plugins/url_references/webmanifest/webmanifest_urls.js +17 -0
  117. package/src/{omega/core_plugins → plugins}/url_resolution/jsenv_plugin_url_resolution.js +12 -5
  118. package/src/{omega/core_plugins → plugins}/url_version/jsenv_plugin_url_version.js +12 -15
  119. package/src/test/execute_plan.js +28 -11
  120. package/src/test/execute_test_plan.js +23 -8
  121. package/src/test/logs_file_execution.js +8 -7
  122. package/src/build/plugins/minify_html/jsenv_plugin_minify_html.js +0 -30
  123. package/src/dev/plugins/autoreload/client/event_source_connection.js +0 -195
  124. package/src/dev/plugins/autoreload/sse_service.js +0 -149
  125. package/src/execute/runtimes/node/controlled_process.js +0 -316
  126. package/src/omega/core_plugins/file_urls/jsenv_plugin_file_urls.js +0 -67
  127. package/src/omega/core_plugins/import_assertions/helpers/babel_plugin_metadata_import_assertions.js +0 -98
  128. package/src/omega/core_plugins/import_assertions/helpers/json_module.js +0 -12
  129. package/src/omega/core_plugins/import_assertions/helpers/text_module.js +0 -6
  130. package/src/omega/core_plugins/import_assertions/jsenv_plugin_import_assertions.js +0 -211
  131. package/src/omega/core_plugins/inline/jsenv_plugin_inline.js +0 -13
  132. package/src/omega/core_plugins/inline/jsenv_plugin_new_inline_content.js +0 -210
  133. package/src/omega/core_plugins/leading_slash/jsenv_plugin_leading_slash.js +0 -12
  134. package/src/omega/core_plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +0 -77
  135. package/src/omega/core_plugins.js +0 -39
  136. package/src/omega/runtime_support/runtime_support.js +0 -20
  137. package/src/omega/url_mentions/css_url_mentions.js +0 -63
  138. package/src/omega/url_mentions/html_url_mentions.js +0 -185
  139. package/src/omega/url_mentions/js_module_url_mentions.js +0 -91
  140. package/src/omega/url_mentions/parse_url_mentions.js +0 -37
  141. package/src/omega/url_mentions/worker_classic_url_mentions.js +0 -37
@@ -38,7 +38,8 @@ export const formatExecutionResult = (
38
38
  { completedExecutionLogAbbreviation, counters, memoryHeap },
39
39
  ) => {
40
40
  const { status } = executionResult
41
- const description = descriptionFormatters[status]({
41
+ const descriptionFormatter = descriptionFormatters[status]
42
+ const description = descriptionFormatter({
42
43
  index: executionIndex,
43
44
  total: counters.total,
44
45
  executionParams,
@@ -52,7 +53,7 @@ export const formatExecutionResult = (
52
53
  return `${description} ${summary}`
53
54
  }
54
55
  const { consoleCalls = [], error, duration } = executionResult
55
- const console = formatConsoleCalls(consoleCalls)
56
+ const consoleOutput = formatConsoleCalls(consoleCalls)
56
57
  return formatExecution({
57
58
  label: `${description} ${summary}`,
58
59
  details: {
@@ -61,7 +62,7 @@ export const formatExecutionResult = (
61
62
  duration: msAsDuration(duration),
62
63
  ...(error ? { error: error.stack } : {}),
63
64
  },
64
- console,
65
+ consoleOutput,
65
66
  })
66
67
  }
67
68
 
@@ -203,21 +204,21 @@ const formatConsoleCalls = (consoleCalls) => {
203
204
  if (consoleOutputTrimmed === "") {
204
205
  return ""
205
206
  }
206
- return `${ANSI.color(`-------- console --------`, ANSI.GREY)}
207
+ return `${ANSI.color(`-------- console output --------`, ANSI.GREY)}
207
208
  ${consoleOutputTrimmed}
208
209
  ${ANSI.color(`-------------------------`, ANSI.GREY)}`
209
210
  }
210
211
 
211
- const formatExecution = ({ label, details = {}, console }) => {
212
+ const formatExecution = ({ label, details = {}, consoleOutput }) => {
212
213
  let message = ``
213
214
  message += label
214
215
  Object.keys(details).forEach((key) => {
215
216
  message += `
216
217
  ${key}: ${details[key]}`
217
218
  })
218
- if (console) {
219
+ if (consoleOutput) {
219
220
  message += `
220
- ${console}`
221
+ ${consoleOutput}`
221
222
  }
222
223
  return message
223
224
  }
@@ -1,30 +0,0 @@
1
- import { createRequire } from "node:module"
2
-
3
- const require = createRequire(import.meta.url)
4
-
5
- // https://github.com/kangax/html-minifier#options-quick-reference
6
- export const jsenvPluginMinifyHtml = ({
7
- collapseWhitespace = true,
8
- removeComments = true,
9
- } = {}) => {
10
- return {
11
- name: "jsenv:minify_html",
12
- appliesDuring: {
13
- build: true,
14
- },
15
- optimize: {
16
- html: async (htmlUrlInfo) => {
17
- return minifyHtml(htmlUrlInfo.content, {
18
- collapseWhitespace,
19
- removeComments,
20
- })
21
- },
22
- },
23
- }
24
- }
25
-
26
- const minifyHtml = (htmlString, options) => {
27
- const { minify } = require("html-minifier")
28
- const htmlMinified = minify(htmlString, options)
29
- return htmlMinified
30
- }
@@ -1,195 +0,0 @@
1
- export const createEventSourceConnection = (
2
- eventSourceUrl,
3
- events = {},
4
- { retryMaxAttempt = Infinity, retryAllocatedMs = Infinity, lastEventId } = {},
5
- ) => {
6
- const { EventSource } = window
7
- if (typeof EventSource !== "function") {
8
- return () => {}
9
- }
10
-
11
- const eventSourceOrigin = new URL(eventSourceUrl).origin
12
- Object.keys(events).forEach((eventName) => {
13
- const eventCallback = events[eventName]
14
- events[eventName] = (e) => {
15
- if (e.origin === eventSourceOrigin) {
16
- if (e.lastEventId) {
17
- lastEventId = e.lastEventId
18
- }
19
- eventCallback(e)
20
- }
21
- }
22
- })
23
-
24
- const status = {
25
- value: "default",
26
- goTo: (value) => {
27
- if (value === status.value) {
28
- return
29
- }
30
- status.value = value
31
- status.onchange()
32
- },
33
- onchange: () => {},
34
- }
35
- let _disconnect = () => {}
36
-
37
- const attemptConnection = (url) => {
38
- const eventSource = new EventSource(url, {
39
- withCredentials: true,
40
- })
41
- _disconnect = () => {
42
- if (status.value !== "connecting" && status.value !== "connected") {
43
- console.warn(
44
- `disconnect() ignored because connection is ${status.value}`,
45
- )
46
- return
47
- }
48
- eventSource.onerror = undefined
49
- eventSource.close()
50
- Object.keys(events).forEach((eventName) => {
51
- eventSource.removeEventListener(eventName, events[eventName])
52
- })
53
- status.goTo("disconnected")
54
- }
55
- let retryCount = 0
56
- let firstRetryMs = Date.now()
57
- eventSource.onerror = (errorEvent) => {
58
- if (errorEvent.target.readyState === EventSource.CONNECTING) {
59
- if (retryCount > retryMaxAttempt) {
60
- console.info(`could not connect after ${retryMaxAttempt} attempt`)
61
- _disconnect()
62
- return
63
- }
64
-
65
- if (retryCount === 0) {
66
- firstRetryMs = Date.now()
67
- } else {
68
- const allRetryDuration = Date.now() - firstRetryMs
69
- if (retryAllocatedMs && allRetryDuration > retryAllocatedMs) {
70
- console.info(
71
- `could not connect in less than ${retryAllocatedMs} ms`,
72
- )
73
- _disconnect()
74
- return
75
- }
76
- }
77
-
78
- retryCount++
79
- status.goTo("connecting")
80
- return
81
- }
82
-
83
- if (errorEvent.target.readyState === EventSource.CLOSED) {
84
- _disconnect()
85
- return
86
- }
87
- }
88
- eventSource.onopen = () => {
89
- status.goTo("connected")
90
- }
91
- Object.keys(events).forEach((eventName) => {
92
- eventSource.addEventListener(eventName, events[eventName])
93
- })
94
- if (!events.hasOwnProperty("welcome")) {
95
- eventSource.addEventListener("welcome", (e) => {
96
- if (e.origin === eventSourceOrigin && e.lastEventId) {
97
- lastEventId = e.lastEventId
98
- }
99
- })
100
- }
101
- status.goTo("connecting")
102
- }
103
-
104
- let connect = () => {
105
- attemptConnection(eventSourceUrl)
106
- connect = () => {
107
- attemptConnection(
108
- lastEventId
109
- ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)
110
- : eventSourceUrl,
111
- )
112
- }
113
- }
114
-
115
- const removePageUnloadListener = listenPageUnload(() => {
116
- if (status.value === "connecting" || status.value === "connected") {
117
- _disconnect()
118
- }
119
- })
120
-
121
- const destroy = () => {
122
- removePageUnloadListener()
123
- _disconnect()
124
- }
125
-
126
- return {
127
- status,
128
- connect,
129
- disconnect: () => _disconnect(),
130
- destroy,
131
- }
132
- }
133
-
134
- const addLastEventIdIntoUrlSearchParams = (url, lastEventId) => {
135
- if (url.indexOf("?") === -1) {
136
- url += "?"
137
- } else {
138
- url += "&"
139
- }
140
- return `${url}last-event-id=${encodeURIComponent(lastEventId)}`
141
- }
142
-
143
- // const listenPageMightFreeze = (callback) => {
144
- // const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
145
- // if (pageHideEvent.persisted === true) {
146
- // callback(pageHideEvent)
147
- // }
148
- // })
149
- // return removePageHideListener
150
- // }
151
-
152
- // const listenPageFreeze = (callback) => {
153
- // const removeFreezeListener = listenEvent(document, "freeze", (freezeEvent) => {
154
- // callback(freezeEvent)
155
- // })
156
- // return removeFreezeListener
157
- // }
158
-
159
- // const listenPageIsRestored = (callback) => {
160
- // const removeResumeListener = listenEvent(document, "resume", (resumeEvent) => {
161
- // removePageshowListener()
162
- // callback(resumeEvent)
163
- // })
164
- // const removePageshowListener = listenEvent(window, "pageshow", (pageshowEvent) => {
165
- // if (pageshowEvent.persisted === true) {
166
- // removePageshowListener()
167
- // removeResumeListener()
168
- // callback(pageshowEvent)
169
- // }
170
- // })
171
- // return () => {
172
- // removeResumeListener()
173
- // removePageshowListener()
174
- // }
175
- // }
176
-
177
- const listenPageUnload = (callback) => {
178
- const removePageHideListener = listenEvent(
179
- window,
180
- "pagehide",
181
- (pageHideEvent) => {
182
- if (pageHideEvent.persisted !== true) {
183
- callback(pageHideEvent)
184
- }
185
- },
186
- )
187
- return removePageHideListener
188
- }
189
-
190
- const listenEvent = (emitter, event, callback) => {
191
- emitter.addEventListener(event, callback)
192
- return () => {
193
- emitter.removeEventListener(event, callback)
194
- }
195
- }
@@ -1,149 +0,0 @@
1
- import { createSSERoom } from "@jsenv/server"
2
- import { registerDirectoryLifecycle } from "@jsenv/filesystem"
3
- import {
4
- createCallbackList,
5
- createCallbackListNotifiedOnce,
6
- } from "@jsenv/abort"
7
-
8
- export const createSSEService = ({
9
- rootDirectoryUrl,
10
- autoreloadPatterns,
11
- onFileChange,
12
- hotUpdateCallbackList,
13
- }) => {
14
- const destroyCallbackList = createCallbackListNotifiedOnce()
15
- const projectFileModified = createCallbackList()
16
- const projectFileRemoved = createCallbackList()
17
- const projectFileAdded = createCallbackList()
18
- const watchProjectFiles = (callback) => {
19
- const removeModifiedCallback = projectFileModified.add((relativeUrl) => {
20
- callback({
21
- event: "modified",
22
- relativeUrl,
23
- })
24
- })
25
- const removeRemovedCallback = projectFileRemoved.add((relativeUrl) => {
26
- callback({
27
- event: "removed",
28
- relativeUrl,
29
- })
30
- })
31
- const removeAddedCallback = projectFileRemoved.add((relativeUrl) => {
32
- callback({
33
- event: "added",
34
- relativeUrl,
35
- })
36
- })
37
- return () => {
38
- removeModifiedCallback()
39
- removeRemovedCallback()
40
- removeAddedCallback()
41
- }
42
- }
43
- // wait 100ms to actually start watching
44
- // otherwise server starting is delayed by the filesystem scan done in
45
- // registerDirectoryLifecycle
46
- const timeout = setTimeout(() => {
47
- const unregisterDirectoryLifecyle = registerDirectoryLifecycle(
48
- rootDirectoryUrl,
49
- {
50
- watchDescription: {
51
- ...autoreloadPatterns,
52
- ".jsenv/": false,
53
- },
54
- updated: ({ relativeUrl }) => {
55
- projectFileModified.notify(relativeUrl)
56
- },
57
- removed: ({ relativeUrl }) => {
58
- projectFileRemoved.notify(relativeUrl)
59
- },
60
- added: ({ relativeUrl }) => {
61
- projectFileAdded.notify(relativeUrl)
62
- },
63
- keepProcessAlive: false,
64
- recursive: true,
65
- },
66
- )
67
- destroyCallbackList.add(unregisterDirectoryLifecyle)
68
- }, 100)
69
- destroyCallbackList.add(() => {
70
- clearTimeout(timeout)
71
- })
72
-
73
- const cache = []
74
- const sseRoomLimit = 100
75
- const getOrCreateSSERoom = (request) => {
76
- const htmlFileRelativeUrl = request.ressource.slice(1)
77
- const cacheEntry = cache.find(
78
- (cacheEntryCandidate) =>
79
- cacheEntryCandidate.htmlFileRelativeUrl === htmlFileRelativeUrl,
80
- )
81
- if (cacheEntry) {
82
- return cacheEntry.sseRoom
83
- }
84
- const sseRoom = createSSERoom({
85
- retryDuration: 2000,
86
- historyLength: 100,
87
- welcomeEventEnabled: true,
88
- effect: () => {
89
- const removeHotUpdateCallback = hotUpdateCallbackList.add(
90
- (hotUpdate) => {
91
- if (hotUpdate.declined) {
92
- sseRoom.sendEvent({
93
- type: "reload",
94
- data: JSON.stringify({
95
- cause: hotUpdate.cause,
96
- type: "full",
97
- typeReason: hotUpdate.reason,
98
- declinedBy: hotUpdate.declinedBy,
99
- }),
100
- })
101
- } else {
102
- sseRoom.sendEvent({
103
- type: "reload",
104
- data: JSON.stringify({
105
- cause: hotUpdate.cause,
106
- type: "hot",
107
- typeReason: hotUpdate.reason,
108
- hotInstructions: hotUpdate.instructions,
109
- }),
110
- })
111
- }
112
- },
113
- )
114
- const stopWatching = watchProjectFiles(({ relativeUrl, event }) => {
115
- onFileChange({ relativeUrl, event })
116
- })
117
- return () => {
118
- removeHotUpdateCallback()
119
- stopWatching()
120
- }
121
- },
122
- })
123
-
124
- const removeSSECleanupCallback = destroyCallbackList.add(() => {
125
- removeSSECleanupCallback()
126
- sseRoom.close()
127
- })
128
- cache.push({
129
- htmlFileRelativeUrl,
130
- sseRoom,
131
- cleanup: () => {
132
- removeSSECleanupCallback()
133
- sseRoom.close()
134
- },
135
- })
136
- if (cache.length >= sseRoomLimit) {
137
- const firstCacheEntry = cache.shift()
138
- firstCacheEntry.cleanup()
139
- }
140
- return sseRoom
141
- }
142
-
143
- return {
144
- getOrCreateSSERoom,
145
- destroy: () => {
146
- destroyCallbackList.notify()
147
- },
148
- }
149
- }