@hydranium/core 1.0.0-next.33 → 1.0.0-next.330

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 (769) hide show
  1. package/README.md +78 -82
  2. package/lib/browser/host-heads-in-worker.d.ts +77 -0
  3. package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
  4. package/lib/browser/host-heads-in-worker.js +169 -0
  5. package/lib/browser/host-heads-in-worker.js.map +1 -0
  6. package/lib/browser/index.d.ts +12 -0
  7. package/lib/browser/index.d.ts.map +1 -0
  8. package/lib/browser/index.js +17 -0
  9. package/lib/browser/index.js.map +1 -0
  10. package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
  11. package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
  12. package/lib/browser/indexeddb-file-system-store.js +181 -0
  13. package/lib/browser/indexeddb-file-system-store.js.map +1 -0
  14. package/lib/browser/start-language-server-in-worker.d.ts +32 -0
  15. package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
  16. package/lib/browser/start-language-server-in-worker.js +40 -0
  17. package/lib/browser/start-language-server-in-worker.js.map +1 -0
  18. package/lib/documents/ast-document-manager.d.ts +256 -124
  19. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  20. package/lib/documents/ast-document-manager.js +293 -132
  21. package/lib/documents/ast-document-manager.js.map +1 -1
  22. package/lib/documents/client-ids.d.ts +5 -19
  23. package/lib/documents/client-ids.d.ts.map +1 -1
  24. package/lib/documents/client-ids.js +5 -19
  25. package/lib/documents/client-ids.js.map +1 -1
  26. package/lib/documents/client-session-errors.d.ts +15 -0
  27. package/lib/documents/client-session-errors.d.ts.map +1 -0
  28. package/lib/documents/client-session-errors.js +15 -0
  29. package/lib/documents/client-session-errors.js.map +1 -0
  30. package/lib/documents/client-session-registry.d.ts +146 -0
  31. package/lib/documents/client-session-registry.d.ts.map +1 -0
  32. package/lib/documents/client-session-registry.js +207 -0
  33. package/lib/documents/client-session-registry.js.map +1 -0
  34. package/lib/documents/dirty-state-tracker.d.ts +101 -0
  35. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  36. package/lib/documents/dirty-state-tracker.js +85 -0
  37. package/lib/documents/dirty-state-tracker.js.map +1 -0
  38. package/lib/documents/document-release-handler.d.ts +204 -0
  39. package/lib/documents/document-release-handler.d.ts.map +1 -0
  40. package/lib/documents/document-release-handler.js +317 -0
  41. package/lib/documents/document-release-handler.js.map +1 -0
  42. package/lib/documents/document-release-scheduler.d.ts +67 -0
  43. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  44. package/lib/documents/document-release-scheduler.js +80 -0
  45. package/lib/documents/document-release-scheduler.js.map +1 -0
  46. package/lib/documents/file-system-task-queue.d.ts +52 -0
  47. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  48. package/lib/documents/file-system-task-queue.js +37 -0
  49. package/lib/documents/file-system-task-queue.js.map +1 -0
  50. package/lib/documents/hydranium-text-documents.d.ts +436 -282
  51. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  52. package/lib/documents/hydranium-text-documents.js +886 -483
  53. package/lib/documents/hydranium-text-documents.js.map +1 -1
  54. package/lib/documents/index.d.ts +10 -2
  55. package/lib/documents/index.d.ts.map +1 -1
  56. package/lib/documents/index.js +10 -2
  57. package/lib/documents/index.js.map +1 -1
  58. package/lib/documents/language-client-shadow.d.ts +234 -0
  59. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  60. package/lib/documents/language-client-shadow.js +306 -0
  61. package/lib/documents/language-client-shadow.js.map +1 -0
  62. package/lib/documents/model-ledger.d.ts +47 -0
  63. package/lib/documents/model-ledger.d.ts.map +1 -0
  64. package/lib/documents/model-ledger.js +30 -0
  65. package/lib/documents/model-ledger.js.map +1 -0
  66. package/lib/documents/text-ledger.d.ts +64 -0
  67. package/lib/documents/text-ledger.d.ts.map +1 -0
  68. package/lib/documents/text-ledger.js +63 -0
  69. package/lib/documents/text-ledger.js.map +1 -0
  70. package/lib/documents/version-sync-service.d.ts +138 -0
  71. package/lib/documents/version-sync-service.d.ts.map +1 -0
  72. package/lib/documents/version-sync-service.js +173 -0
  73. package/lib/documents/version-sync-service.js.map +1 -0
  74. package/lib/index.d.ts +4 -0
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/index.js +7 -0
  77. package/lib/index.js.map +1 -1
  78. package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
  79. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  80. package/lib/langium/ast-extension/ast-extension-service.js +45 -19
  81. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  82. package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
  83. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  84. package/lib/langium/ast-extension/ast-node-builder.js +25 -9
  85. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  86. package/lib/langium/bootstrap.d.ts +49 -36
  87. package/lib/langium/bootstrap.d.ts.map +1 -1
  88. package/lib/langium/bootstrap.js +83 -44
  89. package/lib/langium/bootstrap.js.map +1 -1
  90. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
  91. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  92. package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
  93. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  94. package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
  95. package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
  96. package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
  97. package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
  98. package/lib/langium/composite-ast-reflection.d.ts +46 -0
  99. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  100. package/lib/langium/composite-ast-reflection.js +97 -0
  101. package/lib/langium/composite-ast-reflection.js.map +1 -0
  102. package/lib/langium/config/configuration-provider.d.ts +81 -0
  103. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  104. package/lib/langium/config/configuration-provider.js +112 -0
  105. package/lib/langium/config/configuration-provider.js.map +1 -0
  106. package/lib/langium/config/index.d.ts +1 -0
  107. package/lib/langium/config/index.d.ts.map +1 -1
  108. package/lib/langium/config/index.js +1 -0
  109. package/lib/langium/config/index.js.map +1 -1
  110. package/lib/langium/config/settings.js.map +1 -1
  111. package/lib/langium/diagnostics/console-tee.d.ts +27 -0
  112. package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
  113. package/lib/langium/diagnostics/console-tee.js +142 -0
  114. package/lib/langium/diagnostics/console-tee.js.map +1 -0
  115. package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
  116. package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
  117. package/lib/langium/diagnostics/format-log-arg.js +36 -0
  118. package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
  119. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
  120. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  121. package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
  122. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  123. package/lib/langium/diagnostics/log-preamble.js +1 -1
  124. package/lib/langium/diagnostics/log-preamble.js.map +1 -1
  125. package/lib/langium/diagnostics/logger.d.ts +25 -6
  126. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  127. package/lib/langium/diagnostics/logger.js +49 -17
  128. package/lib/langium/diagnostics/logger.js.map +1 -1
  129. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  130. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  131. package/lib/langium/diagnostics/lsp-logger.js +68 -45
  132. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  133. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  134. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  135. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  136. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  137. package/lib/langium/document-builder/build-pipeline-integration.js +28 -30
  138. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  139. package/lib/langium/document-builder/build-session.d.ts +6 -5
  140. package/lib/langium/document-builder/build-session.d.ts.map +1 -1
  141. package/lib/langium/document-builder/build-session.js +5 -5
  142. package/lib/langium/document-builder/build-session.js.map +1 -1
  143. package/lib/langium/document-builder/document-builder.d.ts +283 -41
  144. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  145. package/lib/langium/document-builder/document-builder.js +448 -78
  146. package/lib/langium/document-builder/document-builder.js.map +1 -1
  147. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  148. package/lib/langium/documentation/comment-provider.js.map +1 -1
  149. package/lib/langium/integration-services.d.ts +40 -24
  150. package/lib/langium/integration-services.d.ts.map +1 -1
  151. package/lib/langium/integration-services.js +7 -4
  152. package/lib/langium/integration-services.js.map +1 -1
  153. package/lib/langium/integrity/integrity-rule.d.ts +17 -8
  154. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  155. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  156. package/lib/langium/integrity/integrity-service.d.ts +95 -27
  157. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  158. package/lib/langium/integrity/integrity-service.js +303 -63
  159. package/lib/langium/integrity/integrity-service.js.map +1 -1
  160. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  161. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  162. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  163. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  164. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  165. package/lib/langium/labeling/label-provider.js.map +1 -1
  166. package/lib/langium/language-module.d.ts +30 -5
  167. package/lib/langium/language-module.d.ts.map +1 -1
  168. package/lib/langium/language-module.js +18 -4
  169. package/lib/langium/language-module.js.map +1 -1
  170. package/lib/langium/model-service/client-session.d.ts +383 -0
  171. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  172. package/lib/langium/model-service/client-session.js +455 -0
  173. package/lib/langium/model-service/client-session.js.map +1 -0
  174. package/lib/langium/model-service/index.d.ts +2 -0
  175. package/lib/langium/model-service/index.d.ts.map +1 -1
  176. package/lib/langium/model-service/index.js +2 -0
  177. package/lib/langium/model-service/index.js.map +1 -1
  178. package/lib/langium/model-service/model-events.d.ts +66 -0
  179. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  180. package/lib/langium/model-service/model-events.js +10 -0
  181. package/lib/langium/model-service/model-events.js.map +1 -0
  182. package/lib/langium/model-service/model-service.d.ts +456 -300
  183. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  184. package/lib/langium/model-service/model-service.js +571 -466
  185. package/lib/langium/model-service/model-service.js.map +1 -1
  186. package/lib/langium/module.d.ts +141 -40
  187. package/lib/langium/module.d.ts.map +1 -1
  188. package/lib/langium/module.js +52 -40
  189. package/lib/langium/module.js.map +1 -1
  190. package/lib/langium/naming/name-provider.d.ts +32 -7
  191. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  192. package/lib/langium/naming/name-provider.js +10 -4
  193. package/lib/langium/naming/name-provider.js.map +1 -1
  194. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  195. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  196. package/lib/langium/project/abstract-project-manager.js +13 -6
  197. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  198. package/lib/langium/project/project-change-event.d.ts +2 -2
  199. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  200. package/lib/langium/project/single-project-manager.js.map +1 -1
  201. package/lib/langium/residency/cst-residency-service.d.ts +38 -14
  202. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  203. package/lib/langium/residency/cst-residency-service.js +24 -58
  204. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  205. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  206. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  207. package/lib/langium/scope/fallback-scope.d.ts +27 -0
  208. package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
  209. package/lib/langium/scope/fallback-scope.js +35 -0
  210. package/lib/langium/scope/fallback-scope.js.map +1 -0
  211. package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
  212. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  213. package/lib/langium/scope/hydranium-scope-computation.js +38 -39
  214. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  215. package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
  216. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  217. package/lib/langium/scope/hydranium-scope-provider.js +37 -15
  218. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  219. package/lib/langium/scope/index.d.ts +1 -0
  220. package/lib/langium/scope/index.d.ts.map +1 -1
  221. package/lib/langium/scope/index.js +1 -0
  222. package/lib/langium/scope/index.js.map +1 -1
  223. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  224. package/lib/langium/scope/reference-builder.js.map +1 -1
  225. package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
  226. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  227. package/lib/langium/scope/reference-candidate-provider.js +3 -2
  228. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  229. package/lib/langium/scope/scope-extension-service.d.ts +41 -37
  230. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  231. package/lib/langium/scope/scope-extension-service.js +57 -29
  232. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  233. package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
  234. package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
  235. package/lib/langium/scope/scoped-ast-node-description.js +1 -3
  236. package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
  237. package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
  238. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  239. package/lib/langium/serialization/abstract-serializer.js +54 -30
  240. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  241. package/lib/langium/serialization/json-serializer.d.ts +8 -1
  242. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  243. package/lib/langium/serialization/json-serializer.js +13 -3
  244. package/lib/langium/serialization/json-serializer.js.map +1 -1
  245. package/lib/langium/serialization/serializer.d.ts +1 -1
  246. package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
  247. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  248. package/lib/langium/serialization/yaml-serializer.js +4 -0
  249. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  250. package/lib/langium/service-registry.d.ts +29 -1
  251. package/lib/langium/service-registry.d.ts.map +1 -1
  252. package/lib/langium/service-registry.js +37 -0
  253. package/lib/langium/service-registry.js.map +1 -1
  254. package/lib/langium/shared-services.d.ts +13 -7
  255. package/lib/langium/shared-services.d.ts.map +1 -1
  256. package/lib/langium/shared-services.js.map +1 -1
  257. package/lib/langium/single-langium-copy.d.ts +22 -0
  258. package/lib/langium/single-langium-copy.d.ts.map +1 -0
  259. package/lib/langium/single-langium-copy.js +36 -0
  260. package/lib/langium/single-langium-copy.js.map +1 -0
  261. package/lib/langium/transfer/transfer-encoder.d.ts +86 -37
  262. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  263. package/lib/langium/transfer/transfer-encoder.js +36 -25
  264. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  265. package/lib/langium/trivia/comment-preserver.d.ts +471 -0
  266. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  267. package/lib/langium/trivia/comment-preserver.js +1026 -0
  268. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  269. package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
  270. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  271. package/lib/langium/trivia/document-ending-preserver.js +62 -0
  272. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  273. package/lib/langium/trivia/index.d.ts +14 -0
  274. package/lib/langium/trivia/index.d.ts.map +1 -0
  275. package/lib/langium/trivia/index.js +14 -0
  276. package/lib/langium/trivia/index.js.map +1 -0
  277. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  278. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  279. package/lib/langium/trivia/trivia-contribution.js +10 -0
  280. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  281. package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
  282. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  283. package/lib/langium/trivia/trivia-preserver.js +10 -0
  284. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  285. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  286. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  287. package/lib/langium/trivia/trivia-service.js +56 -0
  288. package/lib/langium/trivia/trivia-service.js.map +1 -0
  289. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  290. package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
  291. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  292. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  293. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  294. package/lib/langium/validation/document-validator.d.ts +168 -23
  295. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  296. package/lib/langium/validation/document-validator.js +263 -25
  297. package/lib/langium/validation/document-validator.js.map +1 -1
  298. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  299. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  300. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  301. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  302. package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
  303. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  304. package/lib/langium/workspace/document-uri-policy.js +22 -13
  305. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  306. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  307. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  308. package/lib/langium/workspace/file-not-found.js +31 -0
  309. package/lib/langium/workspace/file-not-found.js.map +1 -0
  310. package/lib/langium/workspace/file-system-provider.d.ts +167 -8
  311. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  312. package/lib/langium/workspace/file-system-provider.js +115 -13
  313. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  314. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
  315. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  316. package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
  317. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  318. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  319. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  320. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  321. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  322. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
  323. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  324. package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
  325. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  326. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
  327. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  328. package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
  329. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  330. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  331. package/lib/langium/workspace/index-manager.js.map +1 -1
  332. package/lib/langium/workspace/index.d.ts +1 -0
  333. package/lib/langium/workspace/index.d.ts.map +1 -1
  334. package/lib/langium/workspace/index.js +1 -0
  335. package/lib/langium/workspace/index.js.map +1 -1
  336. package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
  337. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  338. package/lib/langium/workspace/initialize-workspace.js +68 -3
  339. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  340. package/lib/langium/workspace/langium-documents.d.ts +7 -0
  341. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  342. package/lib/langium/workspace/langium-documents.js +18 -1
  343. package/lib/langium/workspace/langium-documents.js.map +1 -1
  344. package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
  345. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  346. package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
  347. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  348. package/lib/langium/workspace/self-save-registry.d.ts +84 -0
  349. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  350. package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
  351. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  352. package/lib/langium/workspace/virtual-document.d.ts +55 -21
  353. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  354. package/lib/langium/workspace/virtual-document.js +87 -24
  355. package/lib/langium/workspace/virtual-document.js.map +1 -1
  356. package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
  357. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  358. package/lib/langium/workspace/write-lock-scope.js +15 -5
  359. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  360. package/lib/launcher/integrated-server.d.ts +3 -1
  361. package/lib/launcher/integrated-server.d.ts.map +1 -1
  362. package/lib/locale/server-locale.d.ts +19 -5
  363. package/lib/locale/server-locale.d.ts.map +1 -1
  364. package/lib/locale/server-locale.js +1 -1
  365. package/lib/locale/server-locale.js.map +1 -1
  366. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  367. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  368. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  369. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  370. package/lib/lsp/connection-features.d.ts +23 -0
  371. package/lib/lsp/connection-features.d.ts.map +1 -0
  372. package/lib/lsp/connection-features.js +60 -0
  373. package/lib/lsp/connection-features.js.map +1 -0
  374. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  375. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  376. package/lib/lsp/diagnostics-connection.js +53 -0
  377. package/lib/lsp/diagnostics-connection.js.map +1 -0
  378. package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
  379. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  380. package/lib/lsp/hydranium-document-update-handler.js +235 -102
  381. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  382. package/lib/lsp/index.d.ts +4 -1
  383. package/lib/lsp/index.d.ts.map +1 -1
  384. package/lib/lsp/index.js +4 -1
  385. package/lib/lsp/index.js.map +1 -1
  386. package/lib/lsp/lsp-latency.d.ts +39 -0
  387. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  388. package/lib/lsp/lsp-latency.js +58 -0
  389. package/lib/lsp/lsp-latency.js.map +1 -0
  390. package/lib/lsp/save-text-document.d.ts +31 -0
  391. package/lib/lsp/save-text-document.d.ts.map +1 -0
  392. package/lib/lsp/save-text-document.js +52 -0
  393. package/lib/lsp/save-text-document.js.map +1 -0
  394. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  395. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  396. package/lib/lsp/semantic-token-provider.js +55 -8
  397. package/lib/lsp/semantic-token-provider.js.map +1 -1
  398. package/lib/lsp/shared-module.d.ts +4 -8
  399. package/lib/lsp/shared-module.d.ts.map +1 -1
  400. package/lib/lsp/shared-module.js.map +1 -1
  401. package/lib/lsp/start-language-server.d.ts +11 -7
  402. package/lib/lsp/start-language-server.d.ts.map +1 -1
  403. package/lib/lsp/start-language-server.js +18 -7
  404. package/lib/lsp/start-language-server.js.map +1 -1
  405. package/lib/messages/carriers.d.ts +3 -5
  406. package/lib/messages/carriers.d.ts.map +1 -1
  407. package/lib/messages/carriers.js +3 -5
  408. package/lib/messages/carriers.js.map +1 -1
  409. package/lib/messages/index.d.ts +2 -2
  410. package/lib/messages/index.d.ts.map +1 -1
  411. package/lib/messages/index.js +2 -2
  412. package/lib/messages/index.js.map +1 -1
  413. package/lib/messages/renderer.d.ts +32 -7
  414. package/lib/messages/renderer.d.ts.map +1 -1
  415. package/lib/messages/renderer.js +7 -1
  416. package/lib/messages/renderer.js.map +1 -1
  417. package/lib/node/event-loop-monitor.d.ts.map +1 -1
  418. package/lib/node/event-loop-monitor.js +2 -1
  419. package/lib/node/event-loop-monitor.js.map +1 -1
  420. package/lib/node/heap-ceiling.d.ts +61 -0
  421. package/lib/node/heap-ceiling.d.ts.map +1 -0
  422. package/lib/node/heap-ceiling.js +72 -0
  423. package/lib/node/heap-ceiling.js.map +1 -0
  424. package/lib/node/index.d.ts +1 -1
  425. package/lib/node/index.d.ts.map +1 -1
  426. package/lib/node/index.js +5 -1
  427. package/lib/node/index.js.map +1 -1
  428. package/lib/node/latency-from-env.d.ts +1 -1
  429. package/lib/node/latency-from-env.js +1 -1
  430. package/lib/node/lint-grammar.js.map +1 -1
  431. package/lib/node/log-file-sink.d.ts +3 -2
  432. package/lib/node/log-file-sink.d.ts.map +1 -1
  433. package/lib/node/log-file-sink.js +6 -2
  434. package/lib/node/log-file-sink.js.map +1 -1
  435. package/lib/node/log-preamble-node.d.ts +5 -3
  436. package/lib/node/log-preamble-node.d.ts.map +1 -1
  437. package/lib/node/log-preamble-node.js +13 -10
  438. package/lib/node/log-preamble-node.js.map +1 -1
  439. package/lib/node/measure-memory.d.ts.map +1 -1
  440. package/lib/node/measure-memory.js +5 -4
  441. package/lib/node/measure-memory.js.map +1 -1
  442. package/lib/node/memory-monitor.d.ts +2 -2
  443. package/lib/node/memory-monitor.d.ts.map +1 -1
  444. package/lib/node/memory-monitor.js +9 -10
  445. package/lib/node/memory-monitor.js.map +1 -1
  446. package/lib/node/node-file-system-provider.d.ts +67 -9
  447. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  448. package/lib/node/node-file-system-provider.js +198 -53
  449. package/lib/node/node-file-system-provider.js.map +1 -1
  450. package/lib/node/profile-capture.d.ts +12 -4
  451. package/lib/node/profile-capture.d.ts.map +1 -1
  452. package/lib/node/profile-capture.js +8 -6
  453. package/lib/node/profile-capture.js.map +1 -1
  454. package/lib/node/profile-digest.js.map +1 -1
  455. package/lib/node/profiling-run.d.ts +13 -3
  456. package/lib/node/profiling-run.d.ts.map +1 -1
  457. package/lib/node/profiling-run.js +17 -8
  458. package/lib/node/profiling-run.js.map +1 -1
  459. package/lib/node/rename-over-open-readers.d.ts +61 -0
  460. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  461. package/lib/node/rename-over-open-readers.js +80 -0
  462. package/lib/node/rename-over-open-readers.js.map +1 -0
  463. package/lib/node/server-diagnostics.js +1 -1
  464. package/lib/node/server-diagnostics.js.map +1 -1
  465. package/lib/node/server-state-snapshot.js +4 -4
  466. package/lib/node/server-state-snapshot.js.map +1 -1
  467. package/lib/node/socket-launcher.d.ts +43 -7
  468. package/lib/node/socket-launcher.d.ts.map +1 -1
  469. package/lib/node/socket-launcher.js +42 -7
  470. package/lib/node/socket-launcher.js.map +1 -1
  471. package/lib/node/startup-cpu-profile.d.ts +29 -0
  472. package/lib/node/startup-cpu-profile.d.ts.map +1 -0
  473. package/lib/node/startup-cpu-profile.js +91 -0
  474. package/lib/node/startup-cpu-profile.js.map +1 -0
  475. package/lib/node/stdio-launcher.d.ts +13 -13
  476. package/lib/node/stdio-launcher.d.ts.map +1 -1
  477. package/lib/node/stdio-launcher.js +21 -11
  478. package/lib/node/stdio-launcher.js.map +1 -1
  479. package/lib/testing/document-uri-policy-conformance.js +1 -1
  480. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  481. package/lib/testing/fake-description.js.map +1 -1
  482. package/lib/testing/fake-document.d.ts +2 -1
  483. package/lib/testing/fake-document.d.ts.map +1 -1
  484. package/lib/testing/fake-document.js.map +1 -1
  485. package/lib/testing/index.d.ts +1 -1
  486. package/lib/testing/index.d.ts.map +1 -1
  487. package/lib/testing/index.js +2 -1
  488. package/lib/testing/index.js.map +1 -1
  489. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  490. package/lib/testing/langium-test-helpers.js +1 -0
  491. package/lib/testing/langium-test-helpers.js.map +1 -1
  492. package/lib/testing/make-noop-language-services.js.map +1 -1
  493. package/lib/testing/make-noop-shared-services.d.ts +4 -4
  494. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  495. package/lib/testing/make-noop-shared-services.js +4 -4
  496. package/lib/testing/make-noop-shared-services.js.map +1 -1
  497. package/lib/testing/make-test-services.d.ts +51 -20
  498. package/lib/testing/make-test-services.d.ts.map +1 -1
  499. package/lib/testing/make-test-services.js +29 -13
  500. package/lib/testing/make-test-services.js.map +1 -1
  501. package/lib/testing/make-test-tracer.d.ts +12 -0
  502. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  503. package/lib/testing/make-test-tracer.js +13 -0
  504. package/lib/testing/make-test-tracer.js.map +1 -1
  505. package/lib/testing/node/applied-edit-capture.d.ts +29 -0
  506. package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
  507. package/lib/testing/node/applied-edit-capture.js +117 -0
  508. package/lib/testing/node/applied-edit-capture.js.map +1 -0
  509. package/lib/testing/node/golden-corpus.js.map +1 -1
  510. package/lib/testing/node/index.d.ts +1 -0
  511. package/lib/testing/node/index.d.ts.map +1 -1
  512. package/lib/testing/node/index.js +1 -0
  513. package/lib/testing/node/index.js.map +1 -1
  514. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  515. package/lib/testing/node/lsp-harness.js +2 -0
  516. package/lib/testing/node/lsp-harness.js.map +1 -1
  517. package/lib/testing/node/lsp-server-connection.d.ts +21 -6
  518. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  519. package/lib/testing/node/lsp-server-connection.js +49 -106
  520. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  521. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  522. package/lib/testing/node/scratch-workspace.js +10 -5
  523. package/lib/testing/node/scratch-workspace.js.map +1 -1
  524. package/lib/testing/node/spawned-server.d.ts +30 -1
  525. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  526. package/lib/testing/node/spawned-server.js +39 -2
  527. package/lib/testing/node/spawned-server.js.map +1 -1
  528. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  529. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  530. package/lib/testing/node/unhandled-rejections.js +32 -0
  531. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  532. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  533. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  534. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  535. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  536. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  537. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  538. package/lib/testing/playwright/index.d.ts +1 -0
  539. package/lib/testing/playwright/index.d.ts.map +1 -1
  540. package/lib/testing/playwright/index.js +1 -0
  541. package/lib/testing/playwright/index.js.map +1 -1
  542. package/lib/testing/playwright/server-log-capture.d.ts +46 -16
  543. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  544. package/lib/testing/playwright/server-log-capture.js +111 -40
  545. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  546. package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
  547. package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
  548. package/lib/testing/playwright/server-log-fixture.js +25 -6
  549. package/lib/testing/playwright/server-log-fixture.js.map +1 -1
  550. package/lib/testing/playwright/server-log-region.d.ts +15 -0
  551. package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
  552. package/lib/testing/playwright/server-log-region.js +30 -0
  553. package/lib/testing/playwright/server-log-region.js.map +1 -0
  554. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  555. package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
  556. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  557. package/lib/testing/run-update-pipeline.d.ts +8 -5
  558. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  559. package/lib/testing/run-update-pipeline.js.map +1 -1
  560. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  561. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  562. package/lib/testing/stub-ast-document-manager.js +31 -62
  563. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  564. package/lib/testing/stub-document-builder.d.ts +33 -11
  565. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  566. package/lib/testing/stub-document-builder.js +103 -5
  567. package/lib/testing/stub-document-builder.js.map +1 -1
  568. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  569. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  570. package/lib/testing/stub-hydranium-text-documents.js +132 -16
  571. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  572. package/lib/testing/stub-index-manager.js.map +1 -1
  573. package/lib/testing/stub-langium-documents.d.ts +3 -2
  574. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  575. package/lib/testing/stub-langium-documents.js.map +1 -1
  576. package/lib/testing/stub-model-service.d.ts +9 -8
  577. package/lib/testing/stub-model-service.d.ts.map +1 -1
  578. package/lib/testing/stub-model-service.js +6 -6
  579. package/lib/testing/stub-model-service.js.map +1 -1
  580. package/lib/testing/stub-project-manager.js.map +1 -1
  581. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  582. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  583. package/lib/testing/stub-service-registry.d.ts +1 -1
  584. package/lib/testing/stub-service-registry.js.map +1 -1
  585. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  586. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  587. package/lib/testing/stub-writable-file-system.js +2 -1
  588. package/lib/testing/stub-writable-file-system.js.map +1 -1
  589. package/lib/util/connection-liveness.d.ts +22 -6
  590. package/lib/util/connection-liveness.d.ts.map +1 -1
  591. package/lib/util/connection-liveness.js +74 -15
  592. package/lib/util/connection-liveness.js.map +1 -1
  593. package/lib/util/environment.d.ts +7 -0
  594. package/lib/util/environment.d.ts.map +1 -1
  595. package/lib/util/environment.js +15 -1
  596. package/lib/util/environment.js.map +1 -1
  597. package/lib/util/registry.d.ts.map +1 -1
  598. package/package.json +39 -58
  599. package/src/browser/host-heads-in-worker.ts +218 -0
  600. package/src/browser/index.ts +17 -0
  601. package/src/browser/indexeddb-file-system-store.ts +192 -0
  602. package/src/browser/start-language-server-in-worker.ts +56 -0
  603. package/src/documents/ast-document-manager.ts +467 -233
  604. package/src/documents/client-ids.ts +5 -22
  605. package/src/documents/client-session-errors.ts +24 -0
  606. package/src/documents/client-session-registry.ts +262 -0
  607. package/src/documents/dirty-state-tracker.ts +167 -0
  608. package/src/documents/document-release-handler.ts +404 -0
  609. package/src/documents/document-release-scheduler.ts +121 -0
  610. package/src/documents/file-system-task-queue.ts +74 -0
  611. package/src/documents/hydranium-text-documents.ts +1011 -595
  612. package/src/documents/index.ts +10 -2
  613. package/src/documents/language-client-shadow.ts +501 -0
  614. package/src/documents/model-ledger.ts +66 -0
  615. package/src/documents/text-ledger.ts +112 -0
  616. package/src/documents/version-sync-service.ts +275 -0
  617. package/src/index.ts +7 -0
  618. package/src/langium/ast-extension/ast-extension-service.ts +77 -41
  619. package/src/langium/ast-extension/ast-node-builder.ts +35 -13
  620. package/src/langium/bootstrap.ts +87 -51
  621. package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
  622. package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
  623. package/src/langium/composite-ast-reflection.ts +112 -0
  624. package/src/langium/config/configuration-provider.ts +119 -0
  625. package/src/langium/config/index.ts +1 -0
  626. package/src/langium/diagnostics/console-tee.ts +151 -0
  627. package/src/langium/diagnostics/format-log-arg.ts +36 -0
  628. package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
  629. package/src/langium/diagnostics/log-preamble.ts +1 -1
  630. package/src/langium/diagnostics/logger.ts +51 -17
  631. package/src/langium/diagnostics/lsp-logger.ts +70 -44
  632. package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
  633. package/src/langium/document-builder/build-session.ts +4 -3
  634. package/src/langium/document-builder/document-builder.ts +553 -78
  635. package/src/langium/integration-services.ts +59 -28
  636. package/src/langium/integrity/integrity-rule.ts +17 -8
  637. package/src/langium/integrity/integrity-service.ts +332 -69
  638. package/src/langium/language-module.ts +49 -8
  639. package/src/langium/model-service/client-session.ts +718 -0
  640. package/src/langium/model-service/index.ts +2 -0
  641. package/src/langium/model-service/model-events.ts +80 -0
  642. package/src/langium/model-service/model-service.ts +878 -494
  643. package/src/langium/module.ts +195 -72
  644. package/src/langium/naming/name-provider.ts +34 -8
  645. package/src/langium/project/abstract-project-manager.ts +13 -5
  646. package/src/langium/project/project-change-event.ts +2 -2
  647. package/src/langium/residency/cst-residency-service.ts +54 -19
  648. package/src/langium/scope/fallback-scope.ts +38 -0
  649. package/src/langium/scope/hydranium-scope-computation.ts +45 -44
  650. package/src/langium/scope/hydranium-scope-provider.ts +49 -16
  651. package/src/langium/scope/index.ts +1 -0
  652. package/src/langium/scope/reference-candidate-provider.ts +6 -5
  653. package/src/langium/scope/scope-extension-service.ts +74 -59
  654. package/src/langium/scope/scoped-ast-node-description.ts +1 -3
  655. package/src/langium/serialization/abstract-serializer.ts +57 -41
  656. package/src/langium/serialization/json-serializer.ts +14 -3
  657. package/src/langium/serialization/serializer.ts +1 -1
  658. package/src/langium/serialization/yaml-serializer.ts +4 -0
  659. package/src/langium/service-registry.ts +41 -2
  660. package/src/langium/shared-services.ts +16 -7
  661. package/src/langium/single-langium-copy.ts +42 -0
  662. package/src/langium/transfer/transfer-encoder.ts +104 -47
  663. package/src/langium/trivia/comment-preserver.ts +1241 -0
  664. package/src/langium/trivia/document-ending-preserver.ts +71 -0
  665. package/src/langium/trivia/index.ts +14 -0
  666. package/src/langium/trivia/trivia-contribution.ts +39 -0
  667. package/src/langium/trivia/trivia-preserver.ts +56 -0
  668. package/src/langium/trivia/trivia-service.ts +99 -0
  669. package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
  670. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  671. package/src/langium/validation/document-validator.ts +311 -30
  672. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  673. package/src/langium/workspace/document-uri-policy.ts +32 -18
  674. package/src/langium/workspace/file-not-found.ts +35 -0
  675. package/src/langium/workspace/file-system-provider.ts +258 -16
  676. package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
  677. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  678. package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
  679. package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
  680. package/src/langium/workspace/index.ts +1 -0
  681. package/src/langium/workspace/initialize-workspace.ts +96 -4
  682. package/src/langium/workspace/langium-documents.ts +19 -1
  683. package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
  684. package/src/langium/workspace/self-save-registry.ts +118 -0
  685. package/src/langium/workspace/virtual-document.ts +106 -25
  686. package/src/langium/workspace/write-lock-scope.ts +27 -12
  687. package/src/launcher/integrated-server.ts +3 -1
  688. package/src/locale/server-locale.ts +20 -5
  689. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  690. package/src/lsp/connection-features.ts +67 -0
  691. package/src/lsp/diagnostics-connection.ts +56 -0
  692. package/src/lsp/hydranium-document-update-handler.ts +285 -111
  693. package/src/lsp/index.ts +4 -1
  694. package/src/lsp/lsp-latency.ts +62 -0
  695. package/src/lsp/save-text-document.ts +63 -0
  696. package/src/lsp/semantic-token-provider.ts +74 -7
  697. package/src/lsp/shared-module.ts +4 -8
  698. package/src/lsp/start-language-server.ts +18 -7
  699. package/src/messages/carriers.ts +3 -5
  700. package/src/messages/index.ts +11 -2
  701. package/src/messages/renderer.ts +34 -6
  702. package/src/node/event-loop-monitor.ts +2 -1
  703. package/src/node/heap-ceiling.ts +108 -0
  704. package/src/node/index.ts +5 -1
  705. package/src/node/latency-from-env.ts +1 -1
  706. package/src/node/log-file-sink.ts +6 -2
  707. package/src/node/log-preamble-node.ts +20 -10
  708. package/src/node/measure-memory.ts +5 -4
  709. package/src/node/memory-monitor.ts +10 -10
  710. package/src/node/node-file-system-provider.ts +214 -57
  711. package/src/node/profile-capture.ts +16 -15
  712. package/src/node/profiling-run.ts +30 -8
  713. package/src/node/rename-over-open-readers.ts +94 -0
  714. package/src/node/server-diagnostics.ts +1 -1
  715. package/src/node/server-state-snapshot.ts +5 -5
  716. package/src/node/socket-launcher.ts +78 -14
  717. package/src/node/startup-cpu-profile.ts +94 -0
  718. package/src/node/stdio-launcher.ts +29 -19
  719. package/src/testing/document-uri-policy-conformance.ts +1 -1
  720. package/src/testing/fake-document.ts +2 -1
  721. package/src/testing/index.ts +2 -1
  722. package/src/testing/langium-test-helpers.ts +1 -0
  723. package/src/testing/make-noop-shared-services.ts +6 -6
  724. package/src/testing/make-test-services.ts +93 -41
  725. package/src/testing/make-test-tracer.ts +26 -0
  726. package/src/testing/node/applied-edit-capture.ts +141 -0
  727. package/src/testing/node/index.ts +1 -0
  728. package/src/testing/node/lsp-harness.ts +2 -0
  729. package/src/testing/node/lsp-server-connection.ts +83 -119
  730. package/src/testing/node/scratch-workspace.ts +10 -5
  731. package/src/testing/node/spawned-server.ts +57 -3
  732. package/src/testing/node/unhandled-rejections.ts +31 -0
  733. package/src/testing/parse-semantic-root.ts +1 -1
  734. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  735. package/src/testing/playwright/index.ts +1 -0
  736. package/src/testing/playwright/server-log-capture.ts +137 -47
  737. package/src/testing/playwright/server-log-fixture.ts +46 -6
  738. package/src/testing/playwright/server-log-region.ts +32 -0
  739. package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
  740. package/src/testing/run-update-pipeline.ts +8 -5
  741. package/src/testing/stub-ast-document-manager.ts +47 -128
  742. package/src/testing/stub-document-builder.ts +133 -18
  743. package/src/testing/stub-hydranium-text-documents.ts +184 -27
  744. package/src/testing/stub-langium-documents.ts +3 -2
  745. package/src/testing/stub-model-service.ts +11 -10
  746. package/src/testing/stub-self-save-registry.ts +1 -1
  747. package/src/testing/stub-service-registry.ts +1 -1
  748. package/src/testing/stub-writable-file-system.ts +3 -2
  749. package/src/util/connection-liveness.ts +80 -15
  750. package/src/util/environment.ts +24 -2
  751. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  752. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  753. package/lib/documents/language-client-text-shadow.js +0 -156
  754. package/lib/documents/language-client-text-shadow.js.map +0 -1
  755. package/lib/documents/self-save-registry.d.ts +0 -55
  756. package/lib/documents/self-save-registry.d.ts.map +0 -1
  757. package/lib/documents/self-save-registry.js.map +0 -1
  758. package/lib/lsp/instrument-connection.d.ts +0 -36
  759. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  760. package/lib/lsp/instrument-connection.js +0 -62
  761. package/lib/lsp/instrument-connection.js.map +0 -1
  762. package/lib/node/process-memory.d.ts +0 -66
  763. package/lib/node/process-memory.d.ts.map +0 -1
  764. package/lib/node/process-memory.js +0 -252
  765. package/lib/node/process-memory.js.map +0 -1
  766. package/src/documents/language-client-text-shadow.ts +0 -175
  767. package/src/documents/self-save-registry.ts +0 -81
  768. package/src/lsp/instrument-connection.ts +0 -66
  769. package/src/node/process-memory.ts +0 -299
@@ -6,41 +6,100 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
+ import { describeError } from '@hydranium/protocol';
9
10
  /**
10
- * Phrases `vscode-jsonrpc` uses when a call loses its connection. Matched on the
11
- * message because the condition surfaces in two different shapes:
11
+ * Phrases that mean a call lost its connection. Matched on the message because
12
+ * the condition surfaces in shapes that share no discriminator:
12
13
  *
13
14
  * - a **throw** from `throwIfClosedOrDisposed` (`Connection is disposed.` /
14
15
  * `Connection is closed.`), a `ConnectionError` raised synchronously by
15
16
  * `sendRequest` / `sendNotification` and by `RemoteConsole.send`;
16
17
  * - a **rejection** of an already-issued request (`Pending response rejected
17
18
  * since connection got disposed`), a `ResponseError` produced when the
18
- * pending-response map is drained on teardown.
19
+ * pending-response map is drained on teardown;
20
+ * - a **write into a destroyed transport** (`Cannot call write after a stream
21
+ * was destroyed`), Node's own error for a message the writer queued before
22
+ * the connection was disposed and flushed after its stream was destroyed.
23
+ * A notification rejects with Node's error itself, which
24
+ * {@link isDestroyedStreamError} catches by its code; a request rejects with
25
+ * a `ResponseError` that copies only the message, so the phrase is needed
26
+ * too.
19
27
  *
20
- * Both are typed, but they are different error classes carrying codes from
21
- * different enums, so no single code check covers both. Kept
22
- * lowercase-normalised and anchored on `connection` so an unrelated "disposed"
23
- * message cannot match.
28
+ * The typed errors come from different classes carrying codes from different
29
+ * enums, so no single code check covers them. Kept lowercase-normalised and
30
+ * anchored on `connection` or `stream` so an unrelated "disposed" message
31
+ * cannot match.
24
32
  */
25
- const CONNECTION_GONE_PATTERNS = [/connection is disposed/, /connection is closed/, /connection got disposed/, /connection got closed/];
33
+ const CONNECTION_GONE_PATTERNS = [
34
+ /connection is disposed/,
35
+ /connection is closed/,
36
+ /connection got disposed/,
37
+ /connection got closed/,
38
+ /after a stream was destroyed/
39
+ ];
40
+ const DESTROYED_STREAM_CODE = 'ERR_STREAM_DESTROYED';
41
+ function isDestroyedStreamError(err) {
42
+ return errorCode(err) === DESTROYED_STREAM_CODE;
43
+ }
44
+ /** `err.code` where `err` is an `Error`, or `undefined` where reading it throws, as a getter or a revoked proxy can. */
45
+ function errorCode(err) {
46
+ try {
47
+ return err instanceof Error && 'code' in err ? err.code : undefined;
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
26
53
  /**
27
54
  * Whether `err` means "the peer is gone", as opposed to a genuine failure of
28
55
  * the operation.
29
56
  *
30
- * The distinction is a **log-severity** one, and it matters because the two are
31
- * indistinguishable at the call site otherwise. Pushing an edit to a language
32
- * client that has already disconnected is a no-op, not a fault — it happens on
33
- * every ordinary shutdown, and reporting it at `error` turns routine teardown
34
- * into something that looks like it needs investigation. A real `applyEdit`
35
- * failure (the client refused, the request malformed) still deserves `error`.
57
+ * The two are indistinguishable at the call site otherwise, and callers act on
58
+ * the answer: a gone peer is logged at `debug` or dropped, a genuine failure is
59
+ * logged at `error` or re-raised as an unhandled rejection. Pushing an edit to
60
+ * a language client that has already disconnected is a no-op, not a fault — it
61
+ * happens on every ordinary shutdown — so a `false` here turns routine teardown
62
+ * into errors that look like they need investigation. A `true` for a real
63
+ * `applyEdit` failure (the client refused, the request malformed) hides it.
64
+ *
65
+ * Never throws, nor does {@link isClientGoneError}: a caller classifying a
66
+ * failure would otherwise lose it to a getter or proxy trap of the error.
36
67
  *
37
68
  * Callers that only need to *survive* a dead connection rather than classify it
38
69
  * should just catch — see `LspLogger.emit`, whose fallback path does exactly
39
70
  * that, since a logger has nowhere to report a logging failure anyway.
40
71
  */
41
72
  export function isConnectionGoneError(err) {
42
- const message = err instanceof Error ? err.message : String(err);
73
+ if (isDestroyedStreamError(err)) {
74
+ return true;
75
+ }
76
+ const message = describeError(err);
43
77
  const normalized = message.toLowerCase();
44
78
  return CONNECTION_GONE_PATTERNS.some(pattern => pattern.test(normalized));
45
79
  }
80
+ const SOCKET_GONE_CODES = new Set(['EPIPE', 'ECONNRESET']);
81
+ /** `write EPIPE` / `read ECONNRESET`, as a request's `ResponseError` copies the message. */
82
+ const SOCKET_GONE_PATTERN = /\b(epipe|econnreset)\b/;
83
+ /**
84
+ * Whether `err` means the client a connection serves has gone: what
85
+ * {@link isConnectionGoneError} recognises, or a write to a socket the client
86
+ * closed (`EPIPE`, `ECONNRESET`), matched by code or, for a request, by the
87
+ * code's name in the message.
88
+ *
89
+ * Only for a call whose errors can come from that connection alone. A socket
90
+ * error names no peer, so where a file system or another socket can fail the
91
+ * same call, it is a genuine failure and {@link isConnectionGoneError} is the
92
+ * one to ask.
93
+ */
94
+ export function isClientGoneError(err) {
95
+ if (isConnectionGoneError(err)) {
96
+ return true;
97
+ }
98
+ const code = errorCode(err);
99
+ if (typeof code === 'string' && SOCKET_GONE_CODES.has(code)) {
100
+ return true;
101
+ }
102
+ const message = describeError(err);
103
+ return SOCKET_GONE_PATTERN.test(message.toLowerCase());
104
+ }
46
105
  //# sourceMappingURL=connection-liveness.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-liveness.js","sourceRoot":"","sources":["../../src/util/connection-liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,wBAAwB,GAAG,CAAC,wBAAwB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,uBAAuB,CAAC,CAAC;AAExI;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAC/C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"connection-liveness.js","sourceRoot":"","sources":["../../src/util/connection-liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,wBAAwB,GAAG;IAC9B,wBAAwB;IACxB,sBAAsB;IACtB,yBAAyB;IACzB,uBAAuB;IACvB,8BAA8B;CAChC,CAAC;AAEF,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAErD,SAAS,sBAAsB,CAAC,GAAY;IACzC,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,qBAAqB,CAAC;AACnD,CAAC;AAED,wHAAwH;AACxH,SAAS,SAAS,CAAC,GAAY;IAC5B,IAAI,CAAC;QACF,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACN,OAAO,SAAS,CAAC;IACpB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAC/C,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACzC,OAAO,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAE3D,4FAA4F;AAC5F,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC3C,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1D,CAAC"}
@@ -29,6 +29,13 @@ export type ProcessEvent = 'exit' | 'beforeExit' | 'uncaughtException' | 'unhand
29
29
  * `process`, no such events).
30
30
  */
31
31
  export declare function onProcessEvent(event: ProcessEvent, handler: (...args: unknown[]) => void): void;
32
+ /**
33
+ * Whether a Node-like `process` exposes a writable standard error. A stricter
34
+ * test for Node than {@link processEnv}, since a bundler can shim
35
+ * `process.env` into a browser build without a writable stderr. `false`
36
+ * where reading the stderr throws, as a shim's getter can.
37
+ */
38
+ export declare function hasProcessStderr(): boolean;
32
39
  /**
33
40
  * Write already-formatted text to the process's standard error, when a
34
41
  * Node-like `process` exposes one. Returns `true` when the text was written and
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/util/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAYlF,wEAAwE;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAAC,UAAU,GAAG,SAAS,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAGrD;AAED,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GACrB,MAAM,GAAG,YAAY,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzI;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAI/F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAKrG"}
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/util/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAYlF,wEAAwE;AACxE,wBAAgB,UAAU,IAAI,MAAM,CAAC,UAAU,GAAG,SAAS,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAGrD;AAED,2FAA2F;AAC3F,MAAM,MAAM,YAAY,GACnB,MAAM,GACN,YAAY,GACZ,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,SAAS,GACT,QAAQ,GACR,SAAS,GACT,QAAQ,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAI/F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAM1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAKrG"}
@@ -47,6 +47,20 @@ export function onProcessEvent(event, handler) {
47
47
  process.on(event, handler);
48
48
  }
49
49
  }
50
+ /**
51
+ * Whether a Node-like `process` exposes a writable standard error. A stricter
52
+ * test for Node than {@link processEnv}, since a bundler can shim
53
+ * `process.env` into a browser build without a writable stderr. `false`
54
+ * where reading the stderr throws, as a shim's getter can.
55
+ */
56
+ export function hasProcessStderr() {
57
+ try {
58
+ return typeof process !== 'undefined' && !!process.stderr && typeof process.stderr.write === 'function';
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
50
64
  /**
51
65
  * Write already-formatted text to the process's standard error, when a
52
66
  * Node-like `process` exposes one. Returns `true` when the text was written and
@@ -59,7 +73,7 @@ export function onProcessEvent(event, handler) {
59
73
  * process inherits when it spawns a head as a child.
60
74
  */
61
75
  export function writeStderr(text) {
62
- if (typeof process === 'undefined' || !process.stderr || typeof process.stderr.write !== 'function') {
76
+ if (!hasProcessStderr()) {
63
77
  return false;
64
78
  }
65
79
  process.stderr.write(text);
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/util/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,8EAA8E;AAC9E,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAE7E,wEAAwE;AACxE,MAAM,UAAU,UAAU;IACvB,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACvB,OAAO,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B;IACxC,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC;AACxD,CAAC;AAMD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAmB,EAAE,OAAqC;IACtF,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QACtE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACnG,OAAO,KAAK,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC/B,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,SAAS,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/util/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,8EAA8E;AAC9E,2EAA2E;AAC3E,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAE7E,wEAAwE;AACxE,MAAM,UAAU,UAAU;IACvB,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,UAAU;IACvB,OAAO,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B;IACxC,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,CAAC;AACxD,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAmB,EAAE,OAAqC;IACtF,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QACtE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACF,OAAO,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC;IAC3G,CAAC;IAAC,MAAM,CAAC;QACN,OAAO,KAAK,CAAC;IAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC/B,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC/E,OAAO,SAAS,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,YAAY;IACzC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IACnC,wEAAwE;IACxE,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;IAEjD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU;IAgB7B,sFAAsF;IACtF,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAU/B,uDAAuD;IACvD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI9B,kCAAkC;IAClC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,GAAG,IAAI,SAAS,CAAC,EAAE;CAMrB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,YAAY;IACzC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IACnC,wEAAwE;IACxE,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;IAEjD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,CAc5B;IAED,sFAAsF;IACtF,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAQ9B;IAED,uDAAuD;IACvD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvB;IAED,2DAA2D;IAC3D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAE7B;IAED,kCAAkC;IAClC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,GAAG,IAAI,SAAS,CAAC,EAAE,CAKlB;CACH"}
package/package.json CHANGED
@@ -1,33 +1,40 @@
1
1
  {
2
2
  "name": "@hydranium/core",
3
- "version": "1.0.0-next.33",
3
+ "version": "1.0.0-next.330",
4
4
  "description": "Foundational runtime of the hydranium framework: AST coordination layer (services, integrity, AST extension, serialization, multi-client documents) plus the LSP textual head at the /lsp subpath. Consumed by protocol-head packages (@hydranium/data-server, @hydranium/glsp-server).",
5
5
  "keywords": [
6
+ "ast",
6
7
  "hydranium",
7
8
  "langium",
8
9
  "language-server",
9
10
  "lsp",
10
- "ast",
11
11
  "serialization"
12
12
  ],
13
13
  "homepage": "https://github.com/eclipse-emfcloud/hydranium/tree/main/packages/core",
14
14
  "bugs": {
15
15
  "url": "https://github.com/eclipse-emfcloud/hydranium/issues"
16
16
  },
17
+ "license": "MIT",
18
+ "author": {
19
+ "name": "Hydranium Team"
20
+ },
17
21
  "repository": {
18
22
  "type": "git",
19
23
  "url": "https://github.com/eclipse-emfcloud/hydranium.git",
20
24
  "directory": "packages/core"
21
25
  },
22
- "license": "MIT",
23
- "author": {
24
- "name": "Hydranium Team"
25
- },
26
+ "files": [
27
+ "lib",
28
+ "src",
29
+ "!lib/**/*.tsbuildinfo"
30
+ ],
31
+ "type": "module",
26
32
  "sideEffects": [
27
33
  "./lib/node/index.js",
28
34
  "./lib/util/index.js"
29
35
  ],
30
- "type": "module",
36
+ "main": "lib/index.js",
37
+ "types": "lib/index.d.ts",
31
38
  "exports": {
32
39
  ".": {
33
40
  "types": "./lib/index.d.ts",
@@ -37,18 +44,14 @@
37
44
  "types": "./lib/lsp/index.d.ts",
38
45
  "default": "./lib/lsp/index.js"
39
46
  },
40
- "./lib/lsp": {
41
- "types": "./lib/lsp/index.d.ts",
42
- "default": "./lib/lsp/index.js"
47
+ "./browser": {
48
+ "types": "./lib/browser/index.d.ts",
49
+ "default": "./lib/browser/index.js"
43
50
  },
44
51
  "./node": {
45
52
  "types": "./lib/node/index.d.ts",
46
53
  "default": "./lib/node/index.js"
47
54
  },
48
- "./lib/node": {
49
- "types": "./lib/node/index.d.ts",
50
- "default": "./lib/node/index.js"
51
- },
52
55
  "./testing": {
53
56
  "types": "./lib/testing/index.d.ts",
54
57
  "default": "./lib/testing/index.js"
@@ -57,70 +60,51 @@
57
60
  "types": "./lib/testing/node/index.d.ts",
58
61
  "default": "./lib/testing/node/index.js"
59
62
  },
60
- "./lib/testing/node": {
61
- "types": "./lib/testing/node/index.d.ts",
62
- "default": "./lib/testing/node/index.js"
63
- },
64
- "./lib/testing": {
65
- "types": "./lib/testing/index.d.ts",
66
- "default": "./lib/testing/index.js"
67
- },
68
63
  "./testing/playwright": {
69
64
  "types": "./lib/testing/playwright/index.d.ts",
70
65
  "default": "./lib/testing/playwright/index.js"
71
66
  },
72
- "./lib/testing/playwright": {
73
- "types": "./lib/testing/playwright/index.d.ts",
74
- "default": "./lib/testing/playwright/index.js"
75
- },
76
67
  "./messages": {
77
68
  "types": "./lib/messages/index.d.ts",
78
69
  "default": "./lib/messages/index.js"
79
- },
80
- "./lib/messages": {
81
- "types": "./lib/messages/index.d.ts",
82
- "default": "./lib/messages/index.js"
83
70
  }
84
71
  },
85
- "main": "lib/index.js",
86
- "types": "lib/index.d.ts",
87
- "files": [
88
- "lib",
89
- "src",
90
- "!lib/**/*.tsbuildinfo"
91
- ],
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
92
75
  "scripts": {
93
76
  "audit:mutation": "stryker run",
94
77
  "audit:mutation:quick": "stryker run --mutate src/langium/model-service/model-service.ts",
95
- "build": "tsc -b",
96
- "clean": "rimraf lib tsconfig.tsbuildinfo",
97
- "lint": "eslint src test --max-warnings 0",
78
+ "build": "tsc -b tsconfig.browser.json",
79
+ "clean": "rimraf lib tsconfig.tsbuildinfo tsconfig.browser.tsbuildinfo",
80
+ "lint": "oxlint --format stylish --config ../../oxlint.config.cjs src test --max-warnings 0",
98
81
  "prepack": "node -e \"const m=require('./package.json'),fs=require('node:fs');const missing=[m.main,...Object.values(m.bin||{})].filter(entry=>entry&&!fs.existsSync(entry));if(missing.length){console.error('prepack '+m.name+': not built ('+missing.join(', ')+' missing). Run the build before packing: a files entry that matches nothing is skipped silently, so the tarball would ship src only.');process.exit(1);}\"",
99
82
  "test": "npm run typecheck:test && vitest run",
100
- "typecheck:test": "tsc --noEmit -p tsconfig.test.json",
101
- "watch": "tsc -b -w --preserveWatchOutput"
83
+ "typecheck:test": "tsc --noEmit -p tsconfig.test.json && tsc --noEmit -p tsconfig.browser.test.json",
84
+ "watch": "tsc -b tsconfig.browser.json -w --preserveWatchOutput"
102
85
  },
103
86
  "dependencies": {
104
87
  "diff": "^5.2.0"
105
88
  },
106
89
  "devDependencies": {
107
- "@hydranium/langium": "1.0.0-next.33",
108
- "@hydranium/protocol": "1.0.0-next.33",
109
- "@playwright/test": "^1.40.0",
90
+ "@hydranium/langium": "1.0.0-next.330",
91
+ "@hydranium/protocol": "1.0.0-next.330",
92
+ "@playwright/test": "^1.55.0",
110
93
  "@types/diff": "^5.2.0",
94
+ "fake-indexeddb": "^6.2.5",
111
95
  "rimraf": "^5.0.0",
112
- "typescript": "^5.8.0",
113
- "vscode-jsonrpc": "9.0.1",
114
- "vscode-languageserver": "~10.0.1",
115
- "vscode-languageserver-protocol": "~3.18.2",
96
+ "typescript": "^7.0.2",
97
+ "vscode-jsonrpc": "9.0.0",
98
+ "vscode-languageserver": "10.0.1",
99
+ "vscode-languageserver-protocol": "3.18.1",
116
100
  "vscode-languageserver-textdocument": "^1.0.12",
117
101
  "vscode-languageserver-types": "^3.17.5"
118
102
  },
119
103
  "peerDependencies": {
120
- "@hydranium/langium": "1.0.0-next.33",
121
- "@hydranium/protocol": "1.0.0-next.33",
104
+ "@hydranium/langium": "1.0.0-next.330",
105
+ "@hydranium/protocol": "1.0.0-next.330",
122
106
  "@playwright/test": "^1.40.0",
123
- "vscode-jsonrpc": "9.0.1",
107
+ "vscode-jsonrpc": "^9.0.0",
124
108
  "vscode-languageserver": "~10.0.1",
125
109
  "vscode-languageserver-protocol": "~3.18.1",
126
110
  "vscode-languageserver-textdocument": "^1.0.12",
@@ -134,10 +118,7 @@
134
118
  "engines": {
135
119
  "node": ">=22.13"
136
120
  },
137
- "publishConfig": {
138
- "access": "public"
139
- },
140
- "//peerDependencies": "`vscode-jsonrpc` is EXACT rather than a range, because it is one link of an atomic chain with no independently movable link: `vscode-languageserver-protocol` depends on it at exactly 9.0.1, so any other value an adopter supplies is a SECOND physical copy rather than an upgrade. This wire stack breaks on copy identity rather than on structure — `ParameterStructures.auto` is a singleton compared by `===` in connection.js, so a request type built by one copy and sent over a connection owned by the other throws `Unknown parameter structure auto`. A caret or union range was rejected because npm then resolves a `vscode-jsonrpc@8.2.0` tree SILENTLY, with no diagnostic at all, and the failure surfaces only later at server init. Exact does not fail the install either — npm downgrades an unsatisfiable peer to a warning — but it is a NAMED ERESOLVE warning printing the required version beside the found one, and a hard error for anyone installing with `--strict-peer-deps`. It does NOT prevent a NESTED copy — `@eclipse-glsp/*` carries its own exact `vscode-jsonrpc@8.2.0` dependency and root `overrides` do not ship — so a consumer of the GLSP head must pin the chain in its own manifest, and docs/adopting/requirements.md carries the block to paste. This manifest declares the two links ABOVE the transport as well, and they carry `~` for the same reason: each admits exactly what `langium@4.3.1` itself admits, and a wider range reaches a `vscode-languageserver@9` / `vscode-languageserver-protocol@3.17.x` that depends on the 8.x transport, which is the same split one level up. `vscode-languageserver-types` and `vscode-languageserver-textdocument` are deliberately NOT narrowed: both declare zero dependencies and expose structural APIs, so a duplicate of either drags no transport in and no identity check reads it.",
141
- "//prepack": "The publish guard, and it deliberately is NOT a `prepare`: npm runs a workspace `prepare` BEFORE the root `postinstall` that applies patches/vscode-jsonrpc+9.0.1.patch, so building there fails on a cold clone and npm rolls the entire install back. `prepack` runs only when a tarball is made (`npm pack`, `npm publish`) and never on install, so it cannot break the install it has no business touching. It FAILS rather than rebuilds, because the rebuild is exactly the part that ordering defeats. What it defends against: `files` lists `lib`, `lib` is gitignored, and a `files` entry matching nothing is skipped SILENTLY — so `npm publish` from an unbuilt tree emits a tarball of `src` and nothing else, with no error.",
142
- "//sideEffects": "NOT `false`: two barrels do work at module load that their re-exports do not account for, and a bundler skips an unflagged re-export barrel outright. `node/index.js` calls `installNodeLogFileSink()` and `installNodeWriteLockScope()`, which is how a Node host gets the log file-tee and write-lock reentrancy detection merely by importing `@hydranium/core/node`. `util/index.js` carries a bare `import '@hydranium/langium'` so the `UriUtils` namespace augmentation stays loaded for anything importing from here. Both failures are runtime-only and silent — a missing log file, a `UriUtils.toUri` that is `undefined`."
121
+ "//peerDependencies": "`vscode-jsonrpc` takes a caret, so the framework shares the transport the LSP connection resolves, which an `init` scaffold pins: each `vscode-languageserver-protocol` release pins its transport exactly, so an exact peer would name a copy a fresh install rarely holds. The caret excludes 8.x, so a tree whose top holds GLSP's copy fails the peer with a named ERESOLVE warning, an error under `--strict-peer-deps`, rather than resolving silently. No peer reaches a NESTED copy, such as GLSP's or one the LSP packages nest. The wire compares message types and `ResponseError`s by copy identity, so the framework sends typed messages by method name and recognises errors with `isResponseError` rather than `instanceof`. This manifest declares the two links ABOVE the transport as well, with `~`: each admits exactly what the pinned `langium` itself admits, and a range reaching back past the 3.18 stack admits a release on the 8.x transport. `vscode-languageserver-types` and `vscode-languageserver-textdocument` are deliberately NOT narrowed: both declare zero dependencies and expose structural APIs, so a duplicate of either drags no transport in and no identity check reads it.",
122
+ "//prepack": "The publish guard, a `prepack` rather than a `prepare`: `prepack` runs only when a tarball is made (`npm pack`, `npm publish`) and never on install, so it cannot break the install it has no business touching. What it defends against: `files` lists `lib`, `lib` is gitignored, and a `files` entry matching nothing is skipped SILENTLY — so `npm publish` from an unbuilt tree emits a tarball of `src` and nothing else, with no error.",
123
+ "//sideEffects": "NOT `false`: two barrels do work at module load that their re-exports do not account for, and a bundler skips an unflagged re-export barrel outright. `node/index.js` calls `installNodeLogFileSink()`, `installNodeWriteLockScope()` and `startCpuProfileFromEnv()`, which is how a Node host gets the log file-tee, write-lock reentrancy detection and the `HYDRANIUM_CPU_PROFILE_FILE` profile merely by importing `@hydranium/core/node`. `util/index.js` carries a bare `import '@hydranium/langium'` so the `UriUtils` namespace augmentation stays loaded for anything importing from here. All three failures are runtime-only and silent — a missing log file, a missing profile, a `UriUtils.toUri` that is `undefined`."
143
124
  }
@@ -0,0 +1,218 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ import {
11
+ describeErrorWithStack,
12
+ isWorkerBootstrapMessage,
13
+ WORKER_BOOTSTRAP_PHASE,
14
+ WORKER_ERROR_MESSAGE_TYPE,
15
+ WORKER_READY_MESSAGE_TYPE,
16
+ type HeadPorts,
17
+ type WorkerErrorMessage,
18
+ type WorkerReadyMessage,
19
+ type WorkerWorkspace
20
+ } from '@hydranium/protocol';
21
+ import { isOperationCancelled, URI } from '@hydranium/langium';
22
+ import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
23
+ import { isFileSystemProviderRegistry } from '../langium/workspace/file-system-provider.js';
24
+ import { hasLspConnection, initializeWorkspaceWithoutLsp } from '../langium/workspace/initialize-workspace.js';
25
+ import { PersistentFileSystemProvider } from '../langium/workspace/persistent-file-system-provider.js';
26
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
27
+
28
+ /**
29
+ * Report a failure to the page on the worker global, the channel no head is
30
+ * allowed to bind, which is what keeps it free for this. A report under
31
+ * {@link WORKER_BOOTSTRAP_PHASE} ends the page's heads; any other phase is
32
+ * shown there and the heads stay. The stack goes with it: a worker has no log
33
+ * anyone reads, so the page is the one place the stack can be seen.
34
+ */
35
+ export function reportWorkerError(phase: string, error: unknown): void {
36
+ const report: WorkerErrorMessage = { type: WORKER_ERROR_MESSAGE_TYPE, phase, message: describeErrorWithStack(error) };
37
+ postMessage(report);
38
+ }
39
+
40
+ /** What the host's `start` hands back: the shared tier, and the readiness of any head that reports it later. */
41
+ export interface StartedHeads {
42
+ readonly shared: ServerSharedServicesMinimal;
43
+ /**
44
+ * The `started` promise of every head that reports a failed start through
45
+ * one rather than by throwing, such as the GLSP head's. The ready message
46
+ * waits for them, and a rejection is a failed bootstrap.
47
+ */
48
+ readonly started?: ReadonlyArray<Promise<unknown>>;
49
+ }
50
+
51
+ /** What {@link hostHeadsInWorker} does beyond starting the heads. */
52
+ export interface HostHeadsInWorkerOptions {
53
+ /**
54
+ * The workspace root, as the page names it in `initialize`. Given one, the
55
+ * ready message carries every file under it with its content, and the paths
56
+ * restored from a {@link PersistentFileSystemProvider}'s store under it.
57
+ * Left out, the ready message carries no files and nothing is read. Every
58
+ * file's content goes in one message, so a workspace too large for that
59
+ * wants a per-document read instead.
60
+ *
61
+ * Required when `start` composes no LSP head: the workspace is then brought
62
+ * up from it before the ready message, which nothing else would do.
63
+ */
64
+ readonly rootUri?: string;
65
+ }
66
+
67
+ /**
68
+ * Answer the page's bootstrap by starting the heads on its ports, once per
69
+ * worker, and tell the page when they are up and when something fails.
70
+ *
71
+ * `start` is synchronous by type, and that is the ordering contract: every
72
+ * head's transport starts its port as it is built but drops what arrives
73
+ * before the head listens, so an `await` between building a head and
74
+ * listening loses the page's first request with no error. Everything
75
+ * asynchronous, the filesystem's restore above all, is `prepared`, which is
76
+ * awaited before `start` is called. It may be a plain value where nothing has
77
+ * to be awaited.
78
+ *
79
+ * Once `start` has returned, every `started` it handed back has resolved and,
80
+ * without an LSP head, the workspace has been brought up from
81
+ * {@link HostHeadsInWorkerOptions.rootUri}, the ready message goes out, so a
82
+ * page never hears of heads that failed to come up, and an uncaught error from
83
+ * then on is a report rather than the end
84
+ * of the heads. It carries the workspace's files when
85
+ * {@link HostHeadsInWorkerOptions.rootUri} is given. Then every document is
86
+ * built with validation once the workspace has initialised: Langium's initial
87
+ * build validates nothing, so a page that only opens its ports would see a
88
+ * server that indexed the workspace and says nothing. An initial build that
89
+ * a write during startup cancelled is built the same, since every document
90
+ * exists by then.
91
+ *
92
+ * Call it once: a second call answers the same bootstrap with a second set of
93
+ * heads on the same ports and reports every rejection twice. The worker's
94
+ * `unhandledrejection` listener is this function's; it drops Langium's
95
+ * `OperationCancelled` marker, which a build preempted by a write rejects
96
+ * with, as the Node host does. An uncaught throw needs no listener, since it
97
+ * reaches the page as the `Worker`'s own `error` event.
98
+ */
99
+ export function hostHeadsInWorker<TPrepared>(
100
+ prepared: TPrepared | PromiseLike<TPrepared>,
101
+ start: (ports: HeadPorts, prepared: TPrepared) => ServerSharedServicesMinimal | StartedHeads,
102
+ options: HostHeadsInWorkerOptions = {}
103
+ ): void {
104
+ const preparation = Promise.resolve(prepared);
105
+ // Handled here, so a restore that fails before the bootstrap arrives reaches
106
+ // the page once, under the bootstrap phase, and not first as an unhandled
107
+ // rejection.
108
+ preparation.catch(() => undefined);
109
+
110
+ // Rejections only, and not the ones the framework's own handlers already
111
+ // settle: a rejected LSP handler is caught by the connection, and a failed
112
+ // workspace walk rejects `workspaceInitialized`, which is reported below.
113
+ addEventListener('unhandledrejection', event => {
114
+ if (isOperationCancelled(event.reason)) {
115
+ // Dropped from the console too, as a Node listener's presence drops
116
+ // it there; a reported rejection keeps its console entry, the one
117
+ // place its stack stays navigable.
118
+ event.preventDefault();
119
+ } else {
120
+ reportWorkerError('unhandled rejection', event.reason);
121
+ }
122
+ });
123
+
124
+ // One bootstrap per worker: the heads are composed against a single shared
125
+ // Langium tree, so a second would build a second tree over the same seed and
126
+ // hand out sessions that silently disagree about the workspace.
127
+ let bootstrapped = false;
128
+ // The bare global rather than `self.addEventListener`: only the former is
129
+ // typed against the dedicated worker's event map, where `message` carries a
130
+ // `MessageEvent`.
131
+ addEventListener('message', event => {
132
+ if (bootstrapped || !isWorkerBootstrapMessage(event.data)) {
133
+ return;
134
+ }
135
+ bootstrapped = true;
136
+ // `.catch` rather than try/catch: a rejected restore, a `start` that
137
+ // throws and a head whose `started` rejects arrive by the same route, and
138
+ // all have to reach the page.
139
+ onBootstrap(event.data.ports).catch((error: unknown) => reportWorkerError(WORKER_BOOTSTRAP_PHASE, error));
140
+ });
141
+
142
+ async function onBootstrap(ports: HeadPorts): Promise<void> {
143
+ const value = await preparation;
144
+ const result = start(ports, value);
145
+ const { shared, started } = 'shared' in result ? result : { shared: result, started: undefined };
146
+ // Without an LSP head the workspace is brought up here, queued in the step
147
+ // `start` returns in: a page message is handled in a later task, so no
148
+ // request settles against a workspace not yet brought up. Its throw is a
149
+ // rejection, so the awaiting below still handles every head's `started`.
150
+ const bringUp = hasLspConnection(shared)
151
+ ? undefined
152
+ : new Promise<void>(resolve =>
153
+ resolve(initializeWorkspaceWithoutLsp(shared, options.rootUri === undefined ? undefined : URI.parse(options.rootUri)))
154
+ );
155
+ // Safe to await now: every head listens already, so nothing is lost.
156
+ await Promise.all([...(started ?? []), bringUp]);
157
+ const ready: WorkerReadyMessage = {
158
+ type: WORKER_READY_MESSAGE_TYPE,
159
+ workspace: options.rootUri === undefined ? undefined : readWorkspace(shared, options.rootUri)
160
+ };
161
+ postMessage(ready);
162
+ validateWorkspace(shared).catch((error: unknown) => reportWorkerError('workspace validation', error));
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Every file under `rootUri`, walked through the bound provider, so a file
168
+ * that exists only in the store is included, which the seed's keys would miss.
169
+ */
170
+ function readWorkspace(shared: ServerSharedServicesMinimal, rootUri: string): WorkerWorkspace {
171
+ const provider = shared.workspace.FileSystemProvider;
172
+ const root = URI.parse(rootUri);
173
+ // Keys past the root, a trailing slash on it or not.
174
+ const prefix = `${root.toString().replace(/\/$/, '')}/`;
175
+ // No prototype, so a file named `__proto__` is a key like any other.
176
+ const files: Record<string, string> = Object.create(null);
177
+ const visit = (uri: URI): void => {
178
+ for (const node of provider.readDirectorySync(uri)) {
179
+ if (node.isFile) {
180
+ files[node.uri.toString().slice(prefix.length)] = provider.readFileSync(node.uri);
181
+ } else {
182
+ visit(node.uri);
183
+ }
184
+ }
185
+ };
186
+ visit(root);
187
+ // The bound slot is the scheme registry, so the provider that holds the
188
+ // root is the one its scheme selects. Its store may key under another
189
+ // root, absolutely or unencoded, so a restored path is resolved as the
190
+ // provider resolves it, and one outside this root names no file here.
191
+ const holder = isFileSystemProviderRegistry(provider) ? provider.providerFor(root) : provider;
192
+ // A set, since a store may hold one file under two spellings.
193
+ const restored = new Set<string>();
194
+ if (holder instanceof PersistentFileSystemProvider) {
195
+ for (const path of holder.restoredPaths) {
196
+ const uri = holder.storeUri(path).toString();
197
+ if (uri.startsWith(prefix) && Object.hasOwn(files, uri.slice(prefix.length))) {
198
+ restored.add(uri.slice(prefix.length));
199
+ }
200
+ }
201
+ }
202
+ return { rootUri, files, restored: [...restored] };
203
+ }
204
+
205
+ /**
206
+ * The trailing validating build, after `workspaceInitialized`: building before
207
+ * it would validate a partial document set. A cancelled or connection-gone
208
+ * initial build is routine, so it is built through; any other failure is the
209
+ * caller's to report.
210
+ */
211
+ async function validateWorkspace(shared: ServerSharedServicesMinimal): Promise<void> {
212
+ await shared.workspace.WorkspaceManager.workspaceInitialized.catch((error: unknown) => {
213
+ if (!isOperationCancelled(error) && !isConnectionGoneError(error)) {
214
+ throw error;
215
+ }
216
+ });
217
+ await shared.workspace.DocumentBuilder.build(shared.workspace.LangiumDocuments.all.toArray(), { validation: true });
218
+ }
@@ -0,0 +1,17 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+
10
+ // Worker-only entry (`@hydranium/core/browser`). Compiled as its own project
11
+ // against `lib.webworker`, so a worker global such as `indexedDB` or
12
+ // `postMessage` resolves here and nowhere else in the package: the portable
13
+ // `.` barrel must stay free of DOM and worker globals, since it also loads in a
14
+ // plain Node consumer.
15
+ export * from './host-heads-in-worker.js';
16
+ export * from './indexeddb-file-system-store.js';
17
+ export * from './start-language-server-in-worker.js';