@hydranium/core 1.0.0-next.22 → 1.0.0-next.220

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 (652) hide show
  1. package/README.md +14 -8
  2. package/lib/documents/ast-document-manager.d.ts +219 -122
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +241 -130
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-ids.d.ts +5 -19
  7. package/lib/documents/client-ids.d.ts.map +1 -1
  8. package/lib/documents/client-ids.js +5 -19
  9. package/lib/documents/client-ids.js.map +1 -1
  10. package/lib/documents/client-session-errors.d.ts +15 -0
  11. package/lib/documents/client-session-errors.d.ts.map +1 -0
  12. package/lib/documents/client-session-errors.js +15 -0
  13. package/lib/documents/client-session-errors.js.map +1 -0
  14. package/lib/documents/client-session-registry.d.ts +146 -0
  15. package/lib/documents/client-session-registry.d.ts.map +1 -0
  16. package/lib/documents/client-session-registry.js +207 -0
  17. package/lib/documents/client-session-registry.js.map +1 -0
  18. package/lib/documents/dirty-state-tracker.d.ts +79 -0
  19. package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
  20. package/lib/documents/dirty-state-tracker.js +69 -0
  21. package/lib/documents/dirty-state-tracker.js.map +1 -0
  22. package/lib/documents/document-release-handler.d.ts +179 -0
  23. package/lib/documents/document-release-handler.d.ts.map +1 -0
  24. package/lib/documents/document-release-handler.js +283 -0
  25. package/lib/documents/document-release-handler.js.map +1 -0
  26. package/lib/documents/document-release-scheduler.d.ts +67 -0
  27. package/lib/documents/document-release-scheduler.d.ts.map +1 -0
  28. package/lib/documents/document-release-scheduler.js +80 -0
  29. package/lib/documents/document-release-scheduler.js.map +1 -0
  30. package/lib/documents/file-system-task-queue.d.ts +49 -0
  31. package/lib/documents/file-system-task-queue.d.ts.map +1 -0
  32. package/lib/documents/file-system-task-queue.js +34 -0
  33. package/lib/documents/file-system-task-queue.js.map +1 -0
  34. package/lib/documents/hydranium-text-documents.d.ts +399 -282
  35. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  36. package/lib/documents/hydranium-text-documents.js +816 -483
  37. package/lib/documents/hydranium-text-documents.js.map +1 -1
  38. package/lib/documents/index.d.ts +10 -2
  39. package/lib/documents/index.d.ts.map +1 -1
  40. package/lib/documents/index.js +10 -2
  41. package/lib/documents/index.js.map +1 -1
  42. package/lib/documents/language-client-shadow.d.ts +218 -0
  43. package/lib/documents/language-client-shadow.d.ts.map +1 -0
  44. package/lib/documents/language-client-shadow.js +283 -0
  45. package/lib/documents/language-client-shadow.js.map +1 -0
  46. package/lib/documents/model-ledger.d.ts +47 -0
  47. package/lib/documents/model-ledger.d.ts.map +1 -0
  48. package/lib/documents/model-ledger.js +30 -0
  49. package/lib/documents/model-ledger.js.map +1 -0
  50. package/lib/documents/text-ledger.d.ts +64 -0
  51. package/lib/documents/text-ledger.d.ts.map +1 -0
  52. package/lib/documents/text-ledger.js +63 -0
  53. package/lib/documents/text-ledger.js.map +1 -0
  54. package/lib/documents/version-sync-service.d.ts +134 -0
  55. package/lib/documents/version-sync-service.d.ts.map +1 -0
  56. package/lib/documents/version-sync-service.js +171 -0
  57. package/lib/documents/version-sync-service.js.map +1 -0
  58. package/lib/index.d.ts +4 -0
  59. package/lib/index.d.ts.map +1 -1
  60. package/lib/index.js +7 -0
  61. package/lib/index.js.map +1 -1
  62. package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
  63. package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
  64. package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
  65. package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
  66. package/lib/langium/ast-extension/ast-node-builder.js +60 -22
  67. package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
  68. package/lib/langium/bootstrap.d.ts +5 -5
  69. package/lib/langium/bootstrap.d.ts.map +1 -1
  70. package/lib/langium/bootstrap.js +42 -17
  71. package/lib/langium/bootstrap.js.map +1 -1
  72. package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
  73. package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
  74. package/lib/langium/composite-ast-reflection.d.ts +43 -0
  75. package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
  76. package/lib/langium/composite-ast-reflection.js +92 -0
  77. package/lib/langium/composite-ast-reflection.js.map +1 -0
  78. package/lib/langium/config/configuration-provider.d.ts +81 -0
  79. package/lib/langium/config/configuration-provider.d.ts.map +1 -0
  80. package/lib/langium/config/configuration-provider.js +112 -0
  81. package/lib/langium/config/configuration-provider.js.map +1 -0
  82. package/lib/langium/config/index.d.ts +1 -0
  83. package/lib/langium/config/index.d.ts.map +1 -1
  84. package/lib/langium/config/index.js +1 -0
  85. package/lib/langium/config/index.js.map +1 -1
  86. package/lib/langium/config/settings.js.map +1 -1
  87. package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
  88. package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
  89. package/lib/langium/diagnostics/logger.d.ts +10 -3
  90. package/lib/langium/diagnostics/logger.d.ts.map +1 -1
  91. package/lib/langium/diagnostics/logger.js +12 -5
  92. package/lib/langium/diagnostics/logger.js.map +1 -1
  93. package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
  94. package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
  95. package/lib/langium/diagnostics/lsp-logger.js +57 -16
  96. package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
  97. package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
  98. package/lib/langium/diagnostics/server-tracer.js.map +1 -1
  99. package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
  100. package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
  101. package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
  102. package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
  103. package/lib/langium/document-builder/build-session.d.ts +93 -0
  104. package/lib/langium/document-builder/build-session.d.ts.map +1 -0
  105. package/lib/langium/document-builder/build-session.js +72 -0
  106. package/lib/langium/document-builder/build-session.js.map +1 -0
  107. package/lib/langium/document-builder/document-builder.d.ts +401 -29
  108. package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
  109. package/lib/langium/document-builder/document-builder.js +698 -61
  110. package/lib/langium/document-builder/document-builder.js.map +1 -1
  111. package/lib/langium/document-builder/index.d.ts +1 -0
  112. package/lib/langium/document-builder/index.d.ts.map +1 -1
  113. package/lib/langium/document-builder/index.js +1 -0
  114. package/lib/langium/document-builder/index.js.map +1 -1
  115. package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
  116. package/lib/langium/documentation/comment-provider.js.map +1 -1
  117. package/lib/langium/integration-services.d.ts +61 -19
  118. package/lib/langium/integration-services.d.ts.map +1 -1
  119. package/lib/langium/integration-services.js +10 -5
  120. package/lib/langium/integration-services.js.map +1 -1
  121. package/lib/langium/integrity/integrity-rule.d.ts +16 -8
  122. package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
  123. package/lib/langium/integrity/integrity-rule.js.map +1 -1
  124. package/lib/langium/integrity/integrity-service.d.ts +81 -24
  125. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  126. package/lib/langium/integrity/integrity-service.js +264 -57
  127. package/lib/langium/integrity/integrity-service.js.map +1 -1
  128. package/lib/langium/keys/containment.d.ts +64 -0
  129. package/lib/langium/keys/containment.d.ts.map +1 -0
  130. package/lib/langium/keys/containment.js +53 -0
  131. package/lib/langium/keys/containment.js.map +1 -0
  132. package/lib/langium/keys/index.d.ts +1 -0
  133. package/lib/langium/keys/index.d.ts.map +1 -1
  134. package/lib/langium/keys/index.js +1 -0
  135. package/lib/langium/keys/index.js.map +1 -1
  136. package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
  137. package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
  138. package/lib/langium/keys/name-based-key-provider.js +4 -0
  139. package/lib/langium/keys/name-based-key-provider.js.map +1 -1
  140. package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
  141. package/lib/langium/keys/positional-key-provider.js.map +1 -1
  142. package/lib/langium/labeling/label-provider.d.ts.map +1 -1
  143. package/lib/langium/labeling/label-provider.js.map +1 -1
  144. package/lib/langium/language-module.d.ts +29 -4
  145. package/lib/langium/language-module.d.ts.map +1 -1
  146. package/lib/langium/language-module.js +18 -4
  147. package/lib/langium/language-module.js.map +1 -1
  148. package/lib/langium/model-service/client-session.d.ts +343 -0
  149. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  150. package/lib/langium/model-service/client-session.js +411 -0
  151. package/lib/langium/model-service/client-session.js.map +1 -0
  152. package/lib/langium/model-service/index.d.ts +2 -0
  153. package/lib/langium/model-service/index.d.ts.map +1 -1
  154. package/lib/langium/model-service/index.js +2 -0
  155. package/lib/langium/model-service/index.js.map +1 -1
  156. package/lib/langium/model-service/model-events.d.ts +61 -0
  157. package/lib/langium/model-service/model-events.d.ts.map +1 -0
  158. package/lib/langium/model-service/model-events.js +10 -0
  159. package/lib/langium/model-service/model-events.js.map +1 -0
  160. package/lib/langium/model-service/model-service.d.ts +432 -282
  161. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  162. package/lib/langium/model-service/model-service.js +504 -438
  163. package/lib/langium/model-service/model-service.js.map +1 -1
  164. package/lib/langium/module.d.ts +157 -35
  165. package/lib/langium/module.d.ts.map +1 -1
  166. package/lib/langium/module.js +52 -35
  167. package/lib/langium/module.js.map +1 -1
  168. package/lib/langium/naming/name-provider.d.ts +25 -4
  169. package/lib/langium/naming/name-provider.d.ts.map +1 -1
  170. package/lib/langium/naming/name-provider.js +2 -1
  171. package/lib/langium/naming/name-provider.js.map +1 -1
  172. package/lib/langium/naming/name-separator-validation.d.ts +23 -0
  173. package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
  174. package/lib/langium/naming/name-separator-validation.js +30 -1
  175. package/lib/langium/naming/name-separator-validation.js.map +1 -1
  176. package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
  177. package/lib/langium/project/abstract-project-manager.js +9 -2
  178. package/lib/langium/project/abstract-project-manager.js.map +1 -1
  179. package/lib/langium/project/project-change-event.d.ts +2 -2
  180. package/lib/langium/project/single-project-manager.d.ts.map +1 -1
  181. package/lib/langium/project/single-project-manager.js.map +1 -1
  182. package/lib/langium/residency/cst-residency-service.d.ts +31 -11
  183. package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
  184. package/lib/langium/residency/cst-residency-service.js +23 -57
  185. package/lib/langium/residency/cst-residency-service.js.map +1 -1
  186. package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
  187. package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
  188. package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
  189. package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
  190. package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
  191. package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
  192. package/lib/langium/scope/hydranium-scope-provider.js +56 -20
  193. package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
  194. package/lib/langium/scope/reference-builder.d.ts.map +1 -1
  195. package/lib/langium/scope/reference-builder.js.map +1 -1
  196. package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
  197. package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
  198. package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
  199. package/lib/langium/scope/scope-extension-service.js.map +1 -1
  200. package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
  201. package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
  202. package/lib/langium/serialization/abstract-serializer.js +12 -21
  203. package/lib/langium/serialization/abstract-serializer.js.map +1 -1
  204. package/lib/langium/serialization/json-serializer.d.ts +1 -1
  205. package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
  206. package/lib/langium/serialization/json-serializer.js.map +1 -1
  207. package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
  208. package/lib/langium/serialization/yaml-serializer.js.map +1 -1
  209. package/lib/langium/service-registry.d.ts +29 -1
  210. package/lib/langium/service-registry.d.ts.map +1 -1
  211. package/lib/langium/service-registry.js +37 -0
  212. package/lib/langium/service-registry.js.map +1 -1
  213. package/lib/langium/shared-services.d.ts +23 -6
  214. package/lib/langium/shared-services.d.ts.map +1 -1
  215. package/lib/langium/shared-services.js.map +1 -1
  216. package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
  217. package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
  218. package/lib/langium/transfer/transfer-encoder.js +46 -24
  219. package/lib/langium/transfer/transfer-encoder.js.map +1 -1
  220. package/lib/langium/trivia/comment-preserver.d.ts +423 -0
  221. package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
  222. package/lib/langium/trivia/comment-preserver.js +906 -0
  223. package/lib/langium/trivia/comment-preserver.js.map +1 -0
  224. package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
  225. package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
  226. package/lib/langium/trivia/document-ending-preserver.js +48 -0
  227. package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
  228. package/lib/langium/trivia/index.d.ts +14 -0
  229. package/lib/langium/trivia/index.d.ts.map +1 -0
  230. package/lib/langium/trivia/index.js +14 -0
  231. package/lib/langium/trivia/index.js.map +1 -0
  232. package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
  233. package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
  234. package/lib/langium/trivia/trivia-contribution.js +10 -0
  235. package/lib/langium/trivia/trivia-contribution.js.map +1 -0
  236. package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
  237. package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
  238. package/lib/langium/trivia/trivia-preserver.js +10 -0
  239. package/lib/langium/trivia/trivia-preserver.js.map +1 -0
  240. package/lib/langium/trivia/trivia-service.d.ts +70 -0
  241. package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
  242. package/lib/langium/trivia/trivia-service.js +56 -0
  243. package/lib/langium/trivia/trivia-service.js.map +1 -0
  244. package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
  245. package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
  246. package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
  247. package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
  248. package/lib/langium/validation/document-validator.d.ts +294 -10
  249. package/lib/langium/validation/document-validator.d.ts.map +1 -1
  250. package/lib/langium/validation/document-validator.js +448 -5
  251. package/lib/langium/validation/document-validator.js.map +1 -1
  252. package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
  253. package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
  254. package/lib/langium/validation/validation-contribution-collector.js +1 -1
  255. package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
  256. package/lib/langium/workspace/document-uri-policy.d.ts +18 -14
  257. package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
  258. package/lib/langium/workspace/document-uri-policy.js +10 -9
  259. package/lib/langium/workspace/document-uri-policy.js.map +1 -1
  260. package/lib/langium/workspace/file-not-found.d.ts +23 -0
  261. package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
  262. package/lib/langium/workspace/file-not-found.js +31 -0
  263. package/lib/langium/workspace/file-not-found.js.map +1 -0
  264. package/lib/langium/workspace/file-system-provider.d.ts +135 -9
  265. package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
  266. package/lib/langium/workspace/file-system-provider.js +93 -14
  267. package/lib/langium/workspace/file-system-provider.js.map +1 -1
  268. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
  269. package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
  270. package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
  271. package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
  272. package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
  273. package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
  274. package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
  275. package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
  276. package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
  277. package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
  278. package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
  279. package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
  280. package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
  281. package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
  282. package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
  283. package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
  284. package/lib/langium/workspace/index-manager.d.ts.map +1 -1
  285. package/lib/langium/workspace/index-manager.js.map +1 -1
  286. package/lib/langium/workspace/index.d.ts +1 -0
  287. package/lib/langium/workspace/index.d.ts.map +1 -1
  288. package/lib/langium/workspace/index.js +1 -0
  289. package/lib/langium/workspace/index.js.map +1 -1
  290. package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
  291. package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
  292. package/lib/langium/workspace/initialize-workspace.js +13 -5
  293. package/lib/langium/workspace/initialize-workspace.js.map +1 -1
  294. package/lib/langium/workspace/langium-documents.d.ts +86 -17
  295. package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
  296. package/lib/langium/workspace/langium-documents.js +101 -29
  297. package/lib/langium/workspace/langium-documents.js.map +1 -1
  298. package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
  299. package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
  300. package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
  301. package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
  302. package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
  303. package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
  304. package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
  305. package/lib/langium/workspace/self-save-registry.js.map +1 -0
  306. package/lib/langium/workspace/virtual-document.d.ts +48 -15
  307. package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
  308. package/lib/langium/workspace/virtual-document.js +78 -18
  309. package/lib/langium/workspace/virtual-document.js.map +1 -1
  310. package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
  311. package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
  312. package/lib/langium/workspace/write-lock-scope.js +12 -4
  313. package/lib/langium/workspace/write-lock-scope.js.map +1 -1
  314. package/lib/locale/index.d.ts +10 -0
  315. package/lib/locale/index.d.ts.map +1 -0
  316. package/lib/locale/index.js +10 -0
  317. package/lib/locale/index.js.map +1 -0
  318. package/lib/locale/server-locale.d.ts +73 -0
  319. package/lib/locale/server-locale.d.ts.map +1 -0
  320. package/lib/locale/server-locale.js +61 -0
  321. package/lib/locale/server-locale.js.map +1 -0
  322. package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
  323. package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
  324. package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
  325. package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
  326. package/lib/lsp/connection-features.d.ts +23 -0
  327. package/lib/lsp/connection-features.d.ts.map +1 -0
  328. package/lib/lsp/connection-features.js +60 -0
  329. package/lib/lsp/connection-features.js.map +1 -0
  330. package/lib/lsp/diagnostics-connection.d.ts +27 -0
  331. package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
  332. package/lib/lsp/diagnostics-connection.js +53 -0
  333. package/lib/lsp/diagnostics-connection.js.map +1 -0
  334. package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
  335. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  336. package/lib/lsp/hydranium-document-update-handler.js +153 -99
  337. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  338. package/lib/lsp/index.d.ts +3 -1
  339. package/lib/lsp/index.d.ts.map +1 -1
  340. package/lib/lsp/index.js +3 -1
  341. package/lib/lsp/index.js.map +1 -1
  342. package/lib/lsp/lsp-latency.d.ts +39 -0
  343. package/lib/lsp/lsp-latency.d.ts.map +1 -0
  344. package/lib/lsp/lsp-latency.js +58 -0
  345. package/lib/lsp/lsp-latency.js.map +1 -0
  346. package/lib/lsp/semantic-token-provider.d.ts +34 -1
  347. package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
  348. package/lib/lsp/semantic-token-provider.js +55 -8
  349. package/lib/lsp/semantic-token-provider.js.map +1 -1
  350. package/lib/lsp/shared-module.d.ts +4 -8
  351. package/lib/lsp/shared-module.d.ts.map +1 -1
  352. package/lib/lsp/shared-module.js.map +1 -1
  353. package/lib/lsp/start-language-server.d.ts +8 -7
  354. package/lib/lsp/start-language-server.d.ts.map +1 -1
  355. package/lib/lsp/start-language-server.js +13 -7
  356. package/lib/lsp/start-language-server.js.map +1 -1
  357. package/lib/messages/carriers.d.ts +54 -0
  358. package/lib/messages/carriers.d.ts.map +1 -0
  359. package/lib/messages/carriers.js +62 -0
  360. package/lib/messages/carriers.js.map +1 -0
  361. package/lib/messages/index.d.ts +25 -0
  362. package/lib/messages/index.d.ts.map +1 -0
  363. package/lib/messages/index.js +25 -0
  364. package/lib/messages/index.js.map +1 -0
  365. package/lib/messages/renderer.d.ts +142 -0
  366. package/lib/messages/renderer.d.ts.map +1 -0
  367. package/lib/messages/renderer.js +165 -0
  368. package/lib/messages/renderer.js.map +1 -0
  369. package/lib/node/event-loop-monitor.js.map +1 -1
  370. package/lib/node/heap-ceiling.d.ts +61 -0
  371. package/lib/node/heap-ceiling.d.ts.map +1 -0
  372. package/lib/node/heap-ceiling.js +72 -0
  373. package/lib/node/heap-ceiling.js.map +1 -0
  374. package/lib/node/index.d.ts +1 -1
  375. package/lib/node/index.d.ts.map +1 -1
  376. package/lib/node/index.js +1 -1
  377. package/lib/node/index.js.map +1 -1
  378. package/lib/node/latency-from-env.d.ts +1 -1
  379. package/lib/node/latency-from-env.js +1 -1
  380. package/lib/node/lint-grammar.js.map +1 -1
  381. package/lib/node/measure-memory.d.ts.map +1 -1
  382. package/lib/node/measure-memory.js +1 -0
  383. package/lib/node/measure-memory.js.map +1 -1
  384. package/lib/node/memory-monitor.js.map +1 -1
  385. package/lib/node/node-file-system-provider.d.ts +41 -6
  386. package/lib/node/node-file-system-provider.d.ts.map +1 -1
  387. package/lib/node/node-file-system-provider.js +109 -49
  388. package/lib/node/node-file-system-provider.js.map +1 -1
  389. package/lib/node/profile-capture.d.ts +8 -2
  390. package/lib/node/profile-capture.d.ts.map +1 -1
  391. package/lib/node/profile-capture.js +1 -1
  392. package/lib/node/profile-capture.js.map +1 -1
  393. package/lib/node/profile-digest.js.map +1 -1
  394. package/lib/node/profiling-run.d.ts +13 -3
  395. package/lib/node/profiling-run.d.ts.map +1 -1
  396. package/lib/node/profiling-run.js +17 -8
  397. package/lib/node/profiling-run.js.map +1 -1
  398. package/lib/node/rename-over-open-readers.d.ts +52 -0
  399. package/lib/node/rename-over-open-readers.d.ts.map +1 -0
  400. package/lib/node/rename-over-open-readers.js +66 -0
  401. package/lib/node/rename-over-open-readers.js.map +1 -0
  402. package/lib/node/socket-launcher.d.ts +20 -4
  403. package/lib/node/socket-launcher.d.ts.map +1 -1
  404. package/lib/node/socket-launcher.js +5 -4
  405. package/lib/node/socket-launcher.js.map +1 -1
  406. package/lib/node/stdio-launcher.d.ts +6 -5
  407. package/lib/node/stdio-launcher.d.ts.map +1 -1
  408. package/lib/node/stdio-launcher.js +2 -2
  409. package/lib/node/stdio-launcher.js.map +1 -1
  410. package/lib/testing/document-uri-policy-conformance.js.map +1 -1
  411. package/lib/testing/fake-description.js.map +1 -1
  412. package/lib/testing/fake-document.d.ts +16 -4
  413. package/lib/testing/fake-document.d.ts.map +1 -1
  414. package/lib/testing/fake-document.js +18 -3
  415. package/lib/testing/fake-document.js.map +1 -1
  416. package/lib/testing/index.d.ts +1 -1
  417. package/lib/testing/index.d.ts.map +1 -1
  418. package/lib/testing/index.js +2 -1
  419. package/lib/testing/index.js.map +1 -1
  420. package/lib/testing/langium-test-helpers.d.ts.map +1 -1
  421. package/lib/testing/langium-test-helpers.js +1 -0
  422. package/lib/testing/langium-test-helpers.js.map +1 -1
  423. package/lib/testing/make-noop-language-services.js.map +1 -1
  424. package/lib/testing/make-noop-shared-services.d.ts +14 -0
  425. package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
  426. package/lib/testing/make-noop-shared-services.js +28 -2
  427. package/lib/testing/make-noop-shared-services.js.map +1 -1
  428. package/lib/testing/make-test-services.d.ts +72 -14
  429. package/lib/testing/make-test-services.d.ts.map +1 -1
  430. package/lib/testing/make-test-services.js +42 -10
  431. package/lib/testing/make-test-services.js.map +1 -1
  432. package/lib/testing/make-test-tracer.d.ts +12 -0
  433. package/lib/testing/make-test-tracer.d.ts.map +1 -1
  434. package/lib/testing/make-test-tracer.js +13 -0
  435. package/lib/testing/make-test-tracer.js.map +1 -1
  436. package/lib/testing/node/golden-corpus.js.map +1 -1
  437. package/lib/testing/node/index.d.ts +1 -0
  438. package/lib/testing/node/index.d.ts.map +1 -1
  439. package/lib/testing/node/index.js +1 -0
  440. package/lib/testing/node/index.js.map +1 -1
  441. package/lib/testing/node/lsp-harness.d.ts.map +1 -1
  442. package/lib/testing/node/lsp-harness.js +2 -0
  443. package/lib/testing/node/lsp-harness.js.map +1 -1
  444. package/lib/testing/node/lsp-server-connection.d.ts +11 -3
  445. package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
  446. package/lib/testing/node/lsp-server-connection.js +43 -10
  447. package/lib/testing/node/lsp-server-connection.js.map +1 -1
  448. package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
  449. package/lib/testing/node/scratch-workspace.js +10 -5
  450. package/lib/testing/node/scratch-workspace.js.map +1 -1
  451. package/lib/testing/node/spawned-server.d.ts +14 -0
  452. package/lib/testing/node/spawned-server.d.ts.map +1 -1
  453. package/lib/testing/node/spawned-server.js +34 -2
  454. package/lib/testing/node/spawned-server.js.map +1 -1
  455. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  456. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  457. package/lib/testing/node/unhandled-rejections.js +32 -0
  458. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  459. package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
  460. package/lib/testing/playwright/e2e-profiling.js.map +1 -1
  461. package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
  462. package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
  463. package/lib/testing/playwright/flaky-network-proxy.js +164 -0
  464. package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
  465. package/lib/testing/playwright/index.d.ts +1 -0
  466. package/lib/testing/playwright/index.d.ts.map +1 -1
  467. package/lib/testing/playwright/index.js +1 -0
  468. package/lib/testing/playwright/index.js.map +1 -1
  469. package/lib/testing/playwright/server-log-capture.d.ts +24 -8
  470. package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
  471. package/lib/testing/playwright/server-log-capture.js +27 -6
  472. package/lib/testing/playwright/server-log-capture.js.map +1 -1
  473. package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
  474. package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
  475. package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
  476. package/lib/testing/run-update-pipeline.d.ts +4 -4
  477. package/lib/testing/run-update-pipeline.d.ts.map +1 -1
  478. package/lib/testing/stub-ast-document-manager.d.ts +11 -52
  479. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  480. package/lib/testing/stub-ast-document-manager.js +24 -65
  481. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  482. package/lib/testing/stub-document-builder.d.ts +26 -11
  483. package/lib/testing/stub-document-builder.d.ts.map +1 -1
  484. package/lib/testing/stub-document-builder.js +78 -5
  485. package/lib/testing/stub-document-builder.js.map +1 -1
  486. package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
  487. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  488. package/lib/testing/stub-hydranium-text-documents.js +115 -16
  489. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  490. package/lib/testing/stub-index-manager.js.map +1 -1
  491. package/lib/testing/stub-langium-documents.d.ts +3 -2
  492. package/lib/testing/stub-langium-documents.d.ts.map +1 -1
  493. package/lib/testing/stub-langium-documents.js.map +1 -1
  494. package/lib/testing/stub-model-service.d.ts +7 -6
  495. package/lib/testing/stub-model-service.d.ts.map +1 -1
  496. package/lib/testing/stub-model-service.js +4 -4
  497. package/lib/testing/stub-model-service.js.map +1 -1
  498. package/lib/testing/stub-project-manager.js.map +1 -1
  499. package/lib/testing/stub-self-save-registry.d.ts +1 -1
  500. package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
  501. package/lib/testing/stub-service-registry.d.ts +1 -1
  502. package/lib/testing/stub-service-registry.js.map +1 -1
  503. package/lib/testing/stub-writable-file-system.d.ts +1 -1
  504. package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
  505. package/lib/util/connection-liveness.d.ts +7 -6
  506. package/lib/util/connection-liveness.d.ts.map +1 -1
  507. package/lib/util/connection-liveness.js +35 -14
  508. package/lib/util/connection-liveness.js.map +1 -1
  509. package/lib/util/environment.d.ts.map +1 -1
  510. package/lib/util/environment.js.map +1 -1
  511. package/lib/util/registry.d.ts.map +1 -1
  512. package/package.json +32 -48
  513. package/src/documents/ast-document-manager.ts +379 -231
  514. package/src/documents/client-ids.ts +5 -22
  515. package/src/documents/client-session-errors.ts +24 -0
  516. package/src/documents/client-session-registry.ts +262 -0
  517. package/src/documents/dirty-state-tracker.ts +130 -0
  518. package/src/documents/document-release-handler.ts +365 -0
  519. package/src/documents/document-release-scheduler.ts +121 -0
  520. package/src/documents/file-system-task-queue.ts +68 -0
  521. package/src/documents/hydranium-text-documents.ts +931 -595
  522. package/src/documents/index.ts +10 -2
  523. package/src/documents/language-client-shadow.ts +451 -0
  524. package/src/documents/model-ledger.ts +66 -0
  525. package/src/documents/text-ledger.ts +112 -0
  526. package/src/documents/version-sync-service.ts +267 -0
  527. package/src/index.ts +7 -0
  528. package/src/langium/ast-extension/ast-node-builder.ts +66 -22
  529. package/src/langium/bootstrap.ts +42 -17
  530. package/src/langium/composite-ast-reflection.ts +107 -0
  531. package/src/langium/config/configuration-provider.ts +119 -0
  532. package/src/langium/config/index.ts +1 -0
  533. package/src/langium/diagnostics/logger.ts +12 -5
  534. package/src/langium/diagnostics/lsp-logger.ts +59 -15
  535. package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
  536. package/src/langium/document-builder/build-session.ts +87 -0
  537. package/src/langium/document-builder/document-builder.ts +825 -59
  538. package/src/langium/document-builder/index.ts +1 -0
  539. package/src/langium/integration-services.ts +83 -24
  540. package/src/langium/integrity/integrity-rule.ts +16 -8
  541. package/src/langium/integrity/integrity-service.ts +287 -62
  542. package/src/langium/keys/containment.ts +87 -0
  543. package/src/langium/keys/index.ts +1 -0
  544. package/src/langium/keys/name-based-key-provider.ts +4 -0
  545. package/src/langium/language-module.ts +48 -7
  546. package/src/langium/model-service/client-session.ts +644 -0
  547. package/src/langium/model-service/index.ts +2 -0
  548. package/src/langium/model-service/model-events.ts +75 -0
  549. package/src/langium/model-service/model-service.ts +790 -468
  550. package/src/langium/module.ts +210 -64
  551. package/src/langium/naming/name-provider.ts +27 -5
  552. package/src/langium/naming/name-separator-validation.ts +34 -5
  553. package/src/langium/project/abstract-project-manager.ts +9 -1
  554. package/src/langium/project/project-change-event.ts +2 -2
  555. package/src/langium/residency/cst-residency-service.ts +46 -15
  556. package/src/langium/scope/hydranium-scope-provider.ts +60 -22
  557. package/src/langium/serialization/abstract-serializer.ts +13 -32
  558. package/src/langium/service-registry.ts +41 -2
  559. package/src/langium/shared-services.ts +27 -6
  560. package/src/langium/transfer/transfer-encoder.ts +104 -37
  561. package/src/langium/trivia/comment-preserver.ts +1100 -0
  562. package/src/langium/trivia/document-ending-preserver.ts +55 -0
  563. package/src/langium/trivia/index.ts +14 -0
  564. package/src/langium/trivia/trivia-contribution.ts +39 -0
  565. package/src/langium/trivia/trivia-preserver.ts +54 -0
  566. package/src/langium/trivia/trivia-service.ts +99 -0
  567. package/src/langium/update-rewrite/update-rewrite.ts +1 -1
  568. package/src/langium/validation/document-validator.ts +537 -11
  569. package/src/langium/validation/validation-contribution-collector.ts +10 -1
  570. package/src/langium/workspace/document-uri-policy.ts +18 -14
  571. package/src/langium/workspace/file-not-found.ts +35 -0
  572. package/src/langium/workspace/file-system-provider.ts +205 -17
  573. package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
  574. package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
  575. package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
  576. package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
  577. package/src/langium/workspace/index.ts +1 -0
  578. package/src/langium/workspace/initialize-workspace.ts +43 -5
  579. package/src/langium/workspace/langium-documents.ts +124 -33
  580. package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
  581. package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
  582. package/src/langium/workspace/virtual-document.ts +96 -19
  583. package/src/langium/workspace/write-lock-scope.ts +24 -11
  584. package/src/locale/index.ts +10 -0
  585. package/src/locale/server-locale.ts +86 -0
  586. package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
  587. package/src/lsp/connection-features.ts +67 -0
  588. package/src/lsp/diagnostics-connection.ts +56 -0
  589. package/src/lsp/hydranium-document-update-handler.ts +187 -108
  590. package/src/lsp/index.ts +3 -1
  591. package/src/lsp/lsp-latency.ts +62 -0
  592. package/src/lsp/semantic-token-provider.ts +74 -7
  593. package/src/lsp/shared-module.ts +4 -8
  594. package/src/lsp/start-language-server.ts +13 -7
  595. package/src/messages/carriers.ts +78 -0
  596. package/src/messages/index.ts +36 -0
  597. package/src/messages/renderer.ts +212 -0
  598. package/src/node/heap-ceiling.ts +108 -0
  599. package/src/node/index.ts +1 -1
  600. package/src/node/latency-from-env.ts +1 -1
  601. package/src/node/measure-memory.ts +1 -0
  602. package/src/node/node-file-system-provider.ts +124 -53
  603. package/src/node/profile-capture.ts +9 -3
  604. package/src/node/profiling-run.ts +30 -8
  605. package/src/node/rename-over-open-readers.ts +78 -0
  606. package/src/node/socket-launcher.ts +24 -8
  607. package/src/node/stdio-launcher.ts +8 -7
  608. package/src/testing/fake-document.ts +24 -5
  609. package/src/testing/index.ts +2 -1
  610. package/src/testing/langium-test-helpers.ts +1 -0
  611. package/src/testing/make-noop-shared-services.ts +50 -2
  612. package/src/testing/make-test-services.ts +125 -31
  613. package/src/testing/make-test-tracer.ts +26 -0
  614. package/src/testing/node/index.ts +1 -0
  615. package/src/testing/node/lsp-harness.ts +2 -0
  616. package/src/testing/node/lsp-server-connection.ts +66 -12
  617. package/src/testing/node/scratch-workspace.ts +10 -5
  618. package/src/testing/node/spawned-server.ts +36 -2
  619. package/src/testing/node/unhandled-rejections.ts +31 -0
  620. package/src/testing/parse-semantic-root.ts +1 -1
  621. package/src/testing/playwright/flaky-network-proxy.ts +240 -0
  622. package/src/testing/playwright/index.ts +1 -0
  623. package/src/testing/playwright/server-log-capture.ts +45 -11
  624. package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
  625. package/src/testing/run-update-pipeline.ts +4 -4
  626. package/src/testing/stub-ast-document-manager.ts +36 -138
  627. package/src/testing/stub-document-builder.ts +102 -18
  628. package/src/testing/stub-hydranium-text-documents.ts +165 -27
  629. package/src/testing/stub-langium-documents.ts +3 -2
  630. package/src/testing/stub-model-service.ts +9 -8
  631. package/src/testing/stub-self-save-registry.ts +1 -1
  632. package/src/testing/stub-service-registry.ts +1 -1
  633. package/src/testing/stub-writable-file-system.ts +1 -1
  634. package/src/util/connection-liveness.ts +37 -14
  635. package/src/util/environment.ts +9 -1
  636. package/lib/documents/language-client-text-shadow.d.ts +0 -101
  637. package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
  638. package/lib/documents/language-client-text-shadow.js +0 -156
  639. package/lib/documents/language-client-text-shadow.js.map +0 -1
  640. package/lib/documents/self-save-registry.d.ts.map +0 -1
  641. package/lib/documents/self-save-registry.js.map +0 -1
  642. package/lib/lsp/instrument-connection.d.ts +0 -36
  643. package/lib/lsp/instrument-connection.d.ts.map +0 -1
  644. package/lib/lsp/instrument-connection.js +0 -62
  645. package/lib/lsp/instrument-connection.js.map +0 -1
  646. package/lib/node/process-memory.d.ts +0 -66
  647. package/lib/node/process-memory.d.ts.map +0 -1
  648. package/lib/node/process-memory.js +0 -252
  649. package/lib/node/process-memory.js.map +0 -1
  650. package/src/documents/language-client-text-shadow.ts +0 -175
  651. package/src/lsp/instrument-connection.ts +0 -66
  652. package/src/node/process-memory.ts +0 -299
@@ -0,0 +1,179 @@
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
+ import { type URI } from '@hydranium/langium';
10
+ import { type CanonicalUri, type Tracer } from '@hydranium/protocol';
11
+ import { type CancellationToken } from 'vscode-languageserver';
12
+ import { type LogNameOptions } from '../langium/diagnostics/logger.js';
13
+ import { type ServerSharedServices } from '../langium/module.js';
14
+ /**
15
+ * A document the store has released: no client holds its text any more. Its
16
+ * queries read the store live, not a snapshot taken at the release.
17
+ */
18
+ export interface ReleasedDocument {
19
+ readonly uri: CanonicalUri;
20
+ /** Whether `uri` names this document, under the store's own keying. */
21
+ isFor(uri: string): boolean;
22
+ /**
23
+ * Whether a client took the document back: it holds it again, or it waits
24
+ * out a new grace. Either way it is that client's, and the build keeps its text.
25
+ */
26
+ isReclaimed(): boolean;
27
+ }
28
+ /**
29
+ * The rejection of a release skipped because the connection or the workspace
30
+ * went away, with the error that showed it as `cause`. The store logs it at
31
+ * debug, as routine at teardown, and any other rejection as an error.
32
+ */
33
+ export declare class DocumentReleaseSkippedError extends Error {
34
+ constructor(cause: unknown);
35
+ }
36
+ /**
37
+ * Whether `error` is a {@link DocumentReleaseSkippedError}, by name, so one
38
+ * thrown by another installed copy of this package counts too.
39
+ */
40
+ export declare function isDocumentReleaseSkippedError(error: unknown): error is DocumentReleaseSkippedError;
41
+ /**
42
+ * Decides what the build keeps for a document the store has released. Called
43
+ * by the store at each release, for every head, after its release event.
44
+ *
45
+ * The returned promise settles the release: it resolves once the build holds
46
+ * what it keeps for the document, and rejects when that build failed and may
47
+ * still hold the released text. Until then, watchers keep a document released
48
+ * dirty marked dirty. On a resolve the store announces it clean, naming the
49
+ * store's last text while the build still has the document, and no text once
50
+ * it has none; on a rejection, no text. The store logs a throw or rejection; reject with a
51
+ * {@link DocumentReleaseSkippedError} for a release skipped at teardown.
52
+ *
53
+ * The data server announces the first build of a released document as the
54
+ * release, so a handler that builds nothing leaves that to whichever build
55
+ * comes next; one that carries a client's write keeps that client's name.
56
+ *
57
+ * Extend {@link DefaultDocumentReleaseHandler} to change only the policy: it
58
+ * keeps the locking and the wait for the build. An implementation written
59
+ * from scratch has to wait for that build itself before it resolves.
60
+ */
61
+ export interface DocumentReleaseHandler {
62
+ didReleaseDocument(released: ReleasedDocument): Promise<void>;
63
+ }
64
+ /** What the build does with a released document: rebuild it from its file, or remove it. */
65
+ export type DocumentReleaseDecision = 'rebuild' | 'remove';
66
+ /** How {@link DefaultDocumentReleaseHandler.runRelease} went. */
67
+ export type DocumentReleaseOutcome =
68
+ /** A client took the document back: what the build keeps is that client's. */
69
+ {
70
+ readonly kind: 'reclaimed';
71
+ }
72
+ /**
73
+ * The lock resolved the write without running it, and the write that
74
+ * cancelled it does not build this document. The framework's lock always
75
+ * runs a cancelled write; a rebound `WorkspaceLock` may not.
76
+ */
77
+ | {
78
+ readonly kind: 'discarded';
79
+ readonly decision: DocumentReleaseDecision;
80
+ }
81
+ /** The build started and was cancelled; `parsed` when it parsed the document first. */
82
+ | {
83
+ readonly kind: 'cancelled';
84
+ readonly decision: DocumentReleaseDecision;
85
+ readonly parsed: boolean;
86
+ }
87
+ /** The decision was carried out. */
88
+ | {
89
+ readonly kind: 'completed';
90
+ readonly decision: DocumentReleaseDecision;
91
+ readonly parsed: boolean;
92
+ }
93
+ /** The decision or the build threw; `decision` is unset when deciding did. */
94
+ | {
95
+ readonly kind: 'failed';
96
+ readonly decision: DocumentReleaseDecision | undefined;
97
+ readonly parsed: boolean;
98
+ readonly error: unknown;
99
+ }
100
+ /** The connection or the workspace went away: nothing more is built. `parsed` when the build parsed the document first. */
101
+ | {
102
+ readonly kind: 'skipped';
103
+ readonly parsed: boolean;
104
+ readonly error: unknown;
105
+ };
106
+ /**
107
+ * Rebuilds a released document from the file system provider, so the build
108
+ * stops carrying the unsaved text of its last client. Override
109
+ * `decideRelease` or `applyReleaseDecision` to change the policy and keep the
110
+ * locking and the wait for the build.
111
+ *
112
+ * The provider decides, for every scheme, by `exists`: a document it can
113
+ * serve is rebuilt from its text, and any other — an editor's `untitled:`
114
+ * buffer, a file never saved, or one deleted meanwhile — is removed
115
+ * from the workspace. A `virtual:` document survives, since the framework's
116
+ * provider for that scheme serves it from the index, whatever provider the
117
+ * host passes as `context.fileSystemProvider`; an edited one therefore keeps
118
+ * its last client's text, and keeping it read-only is the client's job.
119
+ *
120
+ * The answer is read in the document's disk queue, so the rebuild follows
121
+ * any save still queued rather than reverting past it; a file that goes
122
+ * after that read is removed when its rebuild finds none.
123
+ *
124
+ * Whether the document is still released is checked again inside the write
125
+ * lock, as its holder: checked only before waiting for the lock, a client that
126
+ * opens or re-creates the document meanwhile would have its text rebuilt over,
127
+ * or the document removed. A document some client has open again, or that
128
+ * waits out a new grace, is left to that client.
129
+ *
130
+ * The promise resolves once the revert has parsed the file, even if it is
131
+ * then cancelled, or else once the build it requests in its place has parsed
132
+ * it or removed the document. It rejects when that build fails, and when the
133
+ * revert is skipped because the connection or the workspace went away before
134
+ * it parsed the file, with a {@link DocumentReleaseSkippedError}.
135
+ */
136
+ export declare class DefaultDocumentReleaseHandler implements DocumentReleaseHandler {
137
+ protected readonly services: ServerSharedServices;
138
+ protected readonly tracer: Tracer;
139
+ constructor(services: ServerSharedServices, options?: LogNameOptions);
140
+ didReleaseDocument(released: ReleasedDocument): Promise<void>;
141
+ /**
142
+ * Decide, then carry the decision out under the write lock unless a client
143
+ * holds the document again. Answers how that went; a parse of the document
144
+ * seen meanwhile counts even when the build was cancelled after it, since
145
+ * the build it yields to does not parse again.
146
+ */
147
+ protected runRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseOutcome>;
148
+ /**
149
+ * `outcome` for the line each release logs at debug: its kind, the
150
+ * decision and whether the document was parsed.
151
+ */
152
+ protected formatReleaseOutcome(outcome: DocumentReleaseOutcome): string;
153
+ /**
154
+ * The policy: rebuild a document the file system provider can serve, and
155
+ * remove any other. Read in the document's disk queue, so it follows any
156
+ * save still queued rather than deciding past it.
157
+ */
158
+ protected decideRelease(released: ReleasedDocument, target: URI): Promise<DocumentReleaseDecision>;
159
+ /**
160
+ * Carry `decision` out under the write lock; a file gone since the decision
161
+ * is removed instead. An override must rebuild or remove the document:
162
+ * release settlement waits for its parse or removal, and one that does
163
+ * neither is followed by a recovery build that rebuilds it.
164
+ */
165
+ protected applyReleaseDecision(target: URI, decision: DocumentReleaseDecision, token: CancellationToken): Promise<void>;
166
+ /** The build in place of a release that stopped short; answers whether it ran. */
167
+ protected requestRecoveryBuild(released: ReleasedDocument, target: URI, deleted: boolean): Promise<boolean>;
168
+ /**
169
+ * Resolve now when the build holds the file's text of `target` or no longer
170
+ * has it, else once a parse or removal of `target` reaches the store:
171
+ * settled with the released text still in the build, the release would name
172
+ * that text. `startRecovery` requests the build in place of a revert that
173
+ * stopped short, started only once the parse and removal are watched, so a
174
+ * build that records the document at once is not missed. Rejects when that
175
+ * build fails, since no parse or removal is coming then.
176
+ */
177
+ protected waitForReleaseBuild(released: ReleasedDocument, target: URI, parsed: boolean, startRecovery: (() => Promise<void>) | undefined): Promise<void>;
178
+ }
179
+ //# sourceMappingURL=document-release-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-handler.d.ts","sourceRoot":"","sources":["../../src/documents/document-release-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
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
+ import { UriUtils } from '@hydranium/langium';
10
+ import { HYDRANIUM_BUILD_REASONS } from '../langium/document-builder/document-builder.js';
11
+ import { isFileNotFound } from '../langium/workspace/file-not-found.js';
12
+ import { isConnectionGoneError } from '../util/connection-liveness.js';
13
+ /**
14
+ * The rejection of a release skipped because the connection or the workspace
15
+ * went away, with the error that showed it as `cause`. The store logs it at
16
+ * debug, as routine at teardown, and any other rejection as an error.
17
+ */
18
+ export class DocumentReleaseSkippedError extends Error {
19
+ constructor(cause) {
20
+ super(`Release skipped: the connection or the workspace went away. ${cause instanceof Error ? cause.message : String(cause)}`, {
21
+ cause
22
+ });
23
+ this.name = 'DocumentReleaseSkippedError';
24
+ }
25
+ }
26
+ /**
27
+ * Whether `error` is a {@link DocumentReleaseSkippedError}, by name, so one
28
+ * thrown by another installed copy of this package counts too.
29
+ */
30
+ export function isDocumentReleaseSkippedError(error) {
31
+ return error instanceof Error && error.name === 'DocumentReleaseSkippedError';
32
+ }
33
+ /**
34
+ * Rebuilds a released document from the file system provider, so the build
35
+ * stops carrying the unsaved text of its last client. Override
36
+ * `decideRelease` or `applyReleaseDecision` to change the policy and keep the
37
+ * locking and the wait for the build.
38
+ *
39
+ * The provider decides, for every scheme, by `exists`: a document it can
40
+ * serve is rebuilt from its text, and any other — an editor's `untitled:`
41
+ * buffer, a file never saved, or one deleted meanwhile — is removed
42
+ * from the workspace. A `virtual:` document survives, since the framework's
43
+ * provider for that scheme serves it from the index, whatever provider the
44
+ * host passes as `context.fileSystemProvider`; an edited one therefore keeps
45
+ * its last client's text, and keeping it read-only is the client's job.
46
+ *
47
+ * The answer is read in the document's disk queue, so the rebuild follows
48
+ * any save still queued rather than reverting past it; a file that goes
49
+ * after that read is removed when its rebuild finds none.
50
+ *
51
+ * Whether the document is still released is checked again inside the write
52
+ * lock, as its holder: checked only before waiting for the lock, a client that
53
+ * opens or re-creates the document meanwhile would have its text rebuilt over,
54
+ * or the document removed. A document some client has open again, or that
55
+ * waits out a new grace, is left to that client.
56
+ *
57
+ * The promise resolves once the revert has parsed the file, even if it is
58
+ * then cancelled, or else once the build it requests in its place has parsed
59
+ * it or removed the document. It rejects when that build fails, and when the
60
+ * revert is skipped because the connection or the workspace went away before
61
+ * it parsed the file, with a {@link DocumentReleaseSkippedError}.
62
+ */
63
+ export class DefaultDocumentReleaseHandler {
64
+ services;
65
+ tracer;
66
+ constructor(services, options = {}) {
67
+ this.services = services;
68
+ this.tracer = services.Tracer.for(options.logName ?? this.constructor.name).trace('instantiated');
69
+ }
70
+ async didReleaseDocument(released) {
71
+ const target = UriUtils.toUri(released.uri);
72
+ const outcome = await this.runRelease(released, target);
73
+ this.tracer.with(released.uri).debug(`Release outcome: ${this.formatReleaseOutcome(outcome)}`);
74
+ if (outcome.kind === 'skipped') {
75
+ if (!outcome.parsed) {
76
+ throw new DocumentReleaseSkippedError(outcome.error);
77
+ }
78
+ // The build holds the file's text: only what followed its parse, such as the diagnostics publish, was lost.
79
+ const { error } = outcome;
80
+ this.tracer
81
+ .with(released.uri)
82
+ .debug(`Revert on release skipped after its parse: ${error instanceof Error ? error.message : String(error)}`);
83
+ return;
84
+ }
85
+ if (outcome.kind === 'failed') {
86
+ const { error } = outcome;
87
+ this.tracer
88
+ .with(released.uri)
89
+ .error(`Revert on release dropped. ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
90
+ }
91
+ const parsed = 'parsed' in outcome && outcome.parsed;
92
+ // Without it, a revert stopped short, or an override that built nothing,
93
+ // leaves the root on the released text. A failed one also lost the change
94
+ // the update handler held back at the release; a document known to have
95
+ // no file is removed, as the revert would have.
96
+ const stoppedShort = ((outcome.kind === 'discarded' || outcome.kind === 'cancelled' || outcome.kind === 'completed') &&
97
+ !parsed &&
98
+ this.services.workspace.LangiumDocuments.getDocument(target) !== undefined) ||
99
+ outcome.kind === 'failed';
100
+ const recover = async () => {
101
+ const failure = 'Build after a revert that stopped short failed; the build keeps the released text';
102
+ let built;
103
+ try {
104
+ built = await this.requestRecoveryBuild(released, target, 'decision' in outcome && outcome.decision === 'remove');
105
+ }
106
+ catch (err) {
107
+ throw new Error(`${failure}. ${err instanceof Error ? err.message : String(err)}`, { cause: err });
108
+ }
109
+ if (!built) {
110
+ throw new Error(failure);
111
+ }
112
+ };
113
+ await this.waitForReleaseBuild(released, target, parsed, stoppedShort && !released.isReclaimed() ? recover : undefined);
114
+ }
115
+ /**
116
+ * Decide, then carry the decision out under the write lock unless a client
117
+ * holds the document again. Answers how that went; a parse of the document
118
+ * seen meanwhile counts even when the build was cancelled after it, since
119
+ * the build it yields to does not parse again.
120
+ */
121
+ async runRelease(released, target) {
122
+ const workspace = this.services.workspace;
123
+ let decision;
124
+ let parsed = false;
125
+ let parses;
126
+ // Typed by assertion: the write's callback moves it, which narrowing does not see.
127
+ let progress = 'queued';
128
+ try {
129
+ // Decided before the lock: every build and read waits while the lock
130
+ // is held, and the default decision waits on the file's save I/O.
131
+ const decided = await this.decideRelease(released, target);
132
+ decision = decided;
133
+ await workspace.WorkspaceManager?.ready;
134
+ // Queuing the write cancels the running build, even when it then reverts nothing.
135
+ if (released.isReclaimed()) {
136
+ return { kind: 'reclaimed' };
137
+ }
138
+ await workspace.WorkspaceLock.write(async (token) => {
139
+ if (released.isReclaimed()) {
140
+ progress = 'reclaimed';
141
+ return;
142
+ }
143
+ parses = workspace.VersionSyncService.onDidRecordModel(document => {
144
+ parsed ||= released.isFor(document.uri.toString());
145
+ });
146
+ progress = 'building';
147
+ await this.applyReleaseDecision(target, decided, token);
148
+ progress = 'built';
149
+ });
150
+ // A cancelled build throws inside the write, and the lock resolves.
151
+ if (progress === 'reclaimed') {
152
+ return { kind: 'reclaimed' };
153
+ }
154
+ if (progress === 'queued') {
155
+ return { kind: 'discarded', decision: decided };
156
+ }
157
+ if (progress === 'building') {
158
+ return { kind: 'cancelled', decision: decided, parsed };
159
+ }
160
+ return { kind: 'completed', decision: decided, parsed };
161
+ }
162
+ catch (error) {
163
+ // A revert that finishes after the LSP peer went away fails its
164
+ // diagnostics publish, and one that runs after its workspace was torn
165
+ // down finds no file: teardown races, not failed reverts.
166
+ if (isConnectionGoneError(error) || isFileNotFound(error, target)) {
167
+ return { kind: 'skipped', parsed, error };
168
+ }
169
+ return { kind: 'failed', decision, parsed, error };
170
+ }
171
+ finally {
172
+ parses?.dispose();
173
+ }
174
+ }
175
+ /**
176
+ * `outcome` for the line each release logs at debug: its kind, the
177
+ * decision and whether the document was parsed.
178
+ */
179
+ formatReleaseOutcome(outcome) {
180
+ if (outcome.kind === 'reclaimed') {
181
+ return 'reclaimed by a client, built nothing';
182
+ }
183
+ const decision = 'decision' in outcome && outcome.decision !== undefined ? ` ${outcome.decision}` : '';
184
+ const parsed = 'parsed' in outcome ? (outcome.parsed ? ', parsed' : ', not parsed') : '';
185
+ return `${outcome.kind}${decision}${parsed}`;
186
+ }
187
+ /**
188
+ * The policy: rebuild a document the file system provider can serve, and
189
+ * remove any other. Read in the document's disk queue, so it follows any
190
+ * save still queued rather than deciding past it.
191
+ */
192
+ decideRelease(released, target) {
193
+ const workspace = this.services.workspace;
194
+ return workspace.FileSystemTaskQueue.enqueue(released.uri, async () => (await workspace.FileSystemProvider.exists(target)) ? 'rebuild' : 'remove');
195
+ }
196
+ /**
197
+ * Carry `decision` out under the write lock; a file gone since the decision
198
+ * is removed instead. An override must rebuild or remove the document:
199
+ * release settlement waits for its parse or removal, and one that does
200
+ * neither is followed by a recovery build that rebuilds it.
201
+ */
202
+ async applyReleaseDecision(target, decision, token) {
203
+ const builder = this.services.workspace.DocumentBuilder;
204
+ builder.markNextReason(HYDRANIUM_BUILD_REASONS.didRelease);
205
+ try {
206
+ await (decision === 'rebuild' ? builder.update([target], [], token) : builder.update([], [target], token));
207
+ }
208
+ catch (err) {
209
+ if (decision !== 'rebuild' || !isFileNotFound(err, target)) {
210
+ throw err;
211
+ }
212
+ this.tracer.with(target.toString()).debug('Revert found no file; removing the document instead');
213
+ builder.markNextReason(HYDRANIUM_BUILD_REASONS.didRelease);
214
+ await builder.update([], [target], token);
215
+ }
216
+ }
217
+ /** The build in place of a release that stopped short; answers whether it ran. */
218
+ requestRecoveryBuild(released, target, deleted) {
219
+ return this.services.workspace.VersionSyncService.requestRecoveryBuild(target, {
220
+ deleted,
221
+ reason: HYDRANIUM_BUILD_REASONS.didRelease,
222
+ // The update handler dropped the change it held back at the release.
223
+ ignoreDeferred: true,
224
+ stillNeeded: () => !released.isReclaimed()
225
+ });
226
+ }
227
+ /**
228
+ * Resolve now when the build holds the file's text of `target` or no longer
229
+ * has it, else once a parse or removal of `target` reaches the store:
230
+ * settled with the released text still in the build, the release would name
231
+ * that text. `startRecovery` requests the build in place of a revert that
232
+ * stopped short, started only once the parse and removal are watched, so a
233
+ * build that records the document at once is not missed. Rejects when that
234
+ * build fails, since no parse or removal is coming then.
235
+ */
236
+ waitForReleaseBuild(released, target, parsed, startRecovery) {
237
+ const workspace = this.services.workspace;
238
+ // A client holding the document again keeps what the build holds for it.
239
+ if (parsed || workspace.LangiumDocuments.getDocument(target) === undefined || released.isReclaimed()) {
240
+ // Settled now, so a failed recovery build is only logged.
241
+ startRecovery?.().catch((err) => this.tracer.with(released.uri).error(err instanceof Error ? err.message : String(err)));
242
+ return Promise.resolve();
243
+ }
244
+ return new Promise((resolve, reject) => {
245
+ let ended = false;
246
+ const finish = (end) => {
247
+ if (ended) {
248
+ return;
249
+ }
250
+ ended = true;
251
+ parses.dispose();
252
+ removals.dispose();
253
+ end();
254
+ };
255
+ const parses = workspace.VersionSyncService.onDidRecordModel(document => {
256
+ if (released.isFor(document.uri.toString())) {
257
+ finish(resolve);
258
+ }
259
+ });
260
+ const removals = workspace.DocumentBuilder.onUpdate((_changed, deleted) => {
261
+ if (deleted.some(uri => released.isFor(uri.toString()))) {
262
+ finish(resolve);
263
+ }
264
+ });
265
+ startRecovery?.().then(
266
+ // A recovery build no longer needed, for a reclaimed document, builds nothing.
267
+ () => {
268
+ if (released.isReclaimed()) {
269
+ finish(resolve);
270
+ }
271
+ }, (err) => {
272
+ // Settled by a parse that came first, so only logged.
273
+ if (ended) {
274
+ this.tracer.with(released.uri).error(err instanceof Error ? err.message : String(err));
275
+ }
276
+ else {
277
+ finish(() => reject(err));
278
+ }
279
+ });
280
+ });
281
+ }
282
+ }
283
+ //# sourceMappingURL=document-release-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-handler.js","sourceRoot":"","sources":["../../src/documents/document-release-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
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
+ import { type CanonicalUri, type Clock, type Stopwatch } from '@hydranium/protocol';
10
+ import { type Disposable } from 'vscode-languageserver';
11
+ /** What an open of a document whose release is deferred means for it, as {@link DocumentReleaseScheduler.resolveOpen} decides. */
12
+ export type DeferredReleaseOpenDecision =
13
+ /** The opener was lost from the document within its grace: it keeps the unsaved text. */
14
+ 'keep'
15
+ /** Any other opener: the document is released first, and opens as a first open does. */
16
+ | 'release'
17
+ /** No release was deferred. */
18
+ | 'none';
19
+ /**
20
+ * Decides when the store releases a document no client holds: at once, or,
21
+ * when its last client's connection was lost, once a grace has passed, so a
22
+ * client that reconnects in time finds its unsaved text.
23
+ */
24
+ export interface DocumentReleaseScheduler {
25
+ /** How long a deferred release waits; `0` releases at once. */
26
+ readonly graceMs: number;
27
+ /** `clientId` closed `key` because its connection was lost. */
28
+ recordLoss(key: CanonicalUri, clientId: string): void;
29
+ /** No client holds `key` after a loss: run `release` once the grace has passed, or now when there is none. */
30
+ defer(key: CanonicalUri, release: () => void): void;
31
+ isDeferred(key: CanonicalUri): boolean;
32
+ /** `clientId` opens `key`; a deferred release ends either way. */
33
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision;
34
+ /** End a deferred release of `key` without running it. */
35
+ cancel(key: CanonicalUri): void;
36
+ /** `key` was released: drop the losses recorded for it. */
37
+ clearLosses(key: CanonicalUri): void;
38
+ }
39
+ export declare class DefaultDocumentReleaseScheduler implements DocumentReleaseScheduler {
40
+ protected readonly clock: Clock;
41
+ readonly graceMs: number;
42
+ protected readonly deferred: Map<CanonicalUri, Disposable>;
43
+ /**
44
+ * Per document, the clients whose close of it was caused by a lost
45
+ * connection and that have not opened it again, each with a stopwatch
46
+ * started at its loss. Every such client counts, not only the last to
47
+ * close: one connection's sessions all end lost together, and any of them
48
+ * may reopen first. A stopwatch rather than a `now()` reading, because a
49
+ * wall-clock step would otherwise expire a claim early or revive one past
50
+ * its grace, against a grace timer that the step leaves alone.
51
+ */
52
+ protected readonly lostClients: Map<CanonicalUri, Map<string, Stopwatch>>;
53
+ constructor(clock: Clock, graceMs: number);
54
+ recordLoss(key: CanonicalUri, clientId: string): void;
55
+ defer(key: CanonicalUri, release: () => void): void;
56
+ isDeferred(key: CanonicalUri): boolean;
57
+ /**
58
+ * A claim past its grace counts as any other client's: without the limit,
59
+ * a client that returns late inherits the unsaved text of a holder lost
60
+ * after it. Cancelling for every open instead hands a lost client's unsaved
61
+ * text to whoever opens next, with nothing marking it unsaved.
62
+ */
63
+ resolveOpen(key: CanonicalUri, clientId: string): DeferredReleaseOpenDecision;
64
+ cancel(key: CanonicalUri): void;
65
+ clearLosses(key: CanonicalUri): void;
66
+ }
67
+ //# sourceMappingURL=document-release-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-scheduler.d.ts","sourceRoot":"","sources":["../../src/documents/document-release-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,kIAAkI;AAClI,MAAM,MAAM,2BAA2B;AACpC,yFAAyF;AACvF,MAAM;AACR,wFAAwF;GACtF,SAAS;AACX,+BAA+B;GAC7B,MAAM,CAAC;AAEZ;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,8GAA8G;IAC9G,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACpD,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC;IACvC,kEAAkE;IAClE,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,2BAA2B,CAAC;IAC9E,0DAA0D;IAC1D,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC,2DAA2D;IAC3D,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,qBAAa,+BAAgC,YAAW,wBAAwB;IAc1E,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAd3B,SAAS,CAAC,QAAQ,CAAC,QAAQ,gCAAuC;IAClE;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,4CAAmD;IAEjF,YACsB,KAAK,EAAE,KAAK,EACtB,OAAO,EAAE,MAAM,EACvB;IAEJ,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOpD;IAED,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAalD;IAED,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAErC;IAED;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,2BAA2B,CAgB5E;IAED,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAG9B;IAED,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEnC;CACH"}
@@ -0,0 +1,80 @@
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
+ export class DefaultDocumentReleaseScheduler {
10
+ clock;
11
+ graceMs;
12
+ deferred = new Map();
13
+ /**
14
+ * Per document, the clients whose close of it was caused by a lost
15
+ * connection and that have not opened it again, each with a stopwatch
16
+ * started at its loss. Every such client counts, not only the last to
17
+ * close: one connection's sessions all end lost together, and any of them
18
+ * may reopen first. A stopwatch rather than a `now()` reading, because a
19
+ * wall-clock step would otherwise expire a claim early or revive one past
20
+ * its grace, against a grace timer that the step leaves alone.
21
+ */
22
+ lostClients = new Map();
23
+ constructor(clock, graceMs) {
24
+ this.clock = clock;
25
+ this.graceMs = graceMs;
26
+ }
27
+ recordLoss(key, clientId) {
28
+ let lost = this.lostClients.get(key);
29
+ if (!lost) {
30
+ lost = new Map();
31
+ this.lostClients.set(key, lost);
32
+ }
33
+ lost.set(clientId, this.clock.stopwatch());
34
+ }
35
+ defer(key, release) {
36
+ this.cancel(key);
37
+ if (this.graceMs <= 0) {
38
+ release();
39
+ return;
40
+ }
41
+ this.deferred.set(key, this.clock.setTimer(() => {
42
+ this.deferred.delete(key);
43
+ release();
44
+ }, this.graceMs));
45
+ }
46
+ isDeferred(key) {
47
+ return this.deferred.has(key);
48
+ }
49
+ /**
50
+ * A claim past its grace counts as any other client's: without the limit,
51
+ * a client that returns late inherits the unsaved text of a holder lost
52
+ * after it. Cancelling for every open instead hands a lost client's unsaved
53
+ * text to whoever opens next, with nothing marking it unsaved.
54
+ */
55
+ resolveOpen(key, clientId) {
56
+ const lost = this.lostClients.get(key);
57
+ for (const [lostId, sinceLoss] of lost ?? []) {
58
+ if (sinceLoss.elapsedMs >= this.graceMs) {
59
+ lost?.delete(lostId);
60
+ }
61
+ }
62
+ const returning = lost?.delete(clientId) ?? false;
63
+ if (lost?.size === 0) {
64
+ this.lostClients.delete(key);
65
+ }
66
+ if (!this.deferred.has(key)) {
67
+ return 'none';
68
+ }
69
+ this.cancel(key);
70
+ return returning ? 'keep' : 'release';
71
+ }
72
+ cancel(key) {
73
+ this.deferred.get(key)?.dispose();
74
+ this.deferred.delete(key);
75
+ }
76
+ clearLosses(key) {
77
+ this.lostClients.delete(key);
78
+ }
79
+ }
80
+ //# sourceMappingURL=document-release-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-release-scheduler.js","sourceRoot":"","sources":["../../src/documents/document-release-scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAmClF,MAAM,OAAO,+BAA+B;IAcnB,KAAK;IACf,OAAO;IAdA,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClE;;;;;;;;OAQG;IACgB,WAAW,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEjF,YACsB,KAAY,EACtB,OAAe;qBADL,KAAK;uBACf,OAAO;IAChB,CAAC;IAEJ,UAAU,CAAC,GAAiB,EAAE,QAAgB;QAC3C,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACT,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAiB,EAAE,OAAmB;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;YACV,OAAO;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACd,GAAG,EACH,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,EAAE,CAAC;QACb,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAClB,CAAC;IACL,CAAC;IAED,UAAU,CAAC,GAAiB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,GAAiB,EAAE,QAAgB;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;QAClD,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,GAAiB;QAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACH"}