@hydranium/core 1.0.0-next.24 → 1.0.0-next.242
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -18
- package/lib/documents/ast-document-manager.d.ts +219 -122
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +241 -130
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +79 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +69 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +179 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +283 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +49 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +34 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +399 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +816 -483
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +218 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +283 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/documents/version-sync-service.d.ts +134 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +171 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +32 -9
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +60 -22
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +23 -16
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +66 -28
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +10 -3
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +12 -5
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +17 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +57 -16
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +32 -5
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +294 -33
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +477 -61
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +61 -19
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +10 -5
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +16 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +81 -24
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +264 -57
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +64 -0
- package/lib/langium/keys/containment.d.ts.map +1 -0
- package/lib/langium/keys/containment.js +53 -0
- package/lib/langium/keys/containment.js.map +1 -0
- package/lib/langium/keys/index.d.ts +1 -0
- package/lib/langium/keys/index.d.ts.map +1 -1
- package/lib/langium/keys/index.js +1 -0
- package/lib/langium/keys/index.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +4 -0
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +4 -0
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +29 -4
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +18 -4
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +343 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +411 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +61 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +432 -282
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +504 -438
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +150 -35
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +47 -35
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +25 -4
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +2 -1
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts +23 -0
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/naming/name-separator-validation.js +30 -1
- package/lib/langium/naming/name-separator-validation.js.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +9 -2
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +30 -10
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +23 -57
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +48 -13
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +56 -20
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +11 -20
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +12 -21
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +1 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +21 -6
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/single-langium-copy.d.ts +22 -0
- package/lib/langium/single-langium-copy.d.ts.map +1 -0
- package/lib/langium/single-langium-copy.js +36 -0
- package/lib/langium/single-langium-copy.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +77 -26
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +46 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +423 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +906 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +43 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +48 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +50 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +280 -9
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +448 -5
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/document-uri-policy.d.ts +15 -10
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +7 -5
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +135 -9
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +93 -14
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +56 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +79 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +82 -9
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +128 -10
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -3
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +41 -15
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +1 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +1 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +31 -2
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +13 -5
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +46 -4
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +60 -5
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +1 -8
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +0 -7
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +38 -7
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +29 -16
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +48 -15
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +78 -18
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +20 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +12 -4
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/locale/index.d.ts +10 -0
- package/lib/locale/index.d.ts.map +1 -0
- package/lib/locale/index.js +10 -0
- package/lib/locale/index.js.map +1 -0
- package/lib/locale/server-locale.d.ts +73 -0
- package/lib/locale/server-locale.d.ts.map +1 -0
- package/lib/locale/server-locale.js +61 -0
- package/lib/locale/server-locale.js.map +1 -0
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +92 -81
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +153 -99
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +3 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +3 -1
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +34 -1
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +55 -8
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +8 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +13 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +54 -0
- package/lib/messages/carriers.d.ts.map +1 -0
- package/lib/messages/carriers.js +62 -0
- package/lib/messages/carriers.js.map +1 -0
- package/lib/messages/index.d.ts +25 -0
- package/lib/messages/index.d.ts.map +1 -0
- package/lib/messages/index.js +25 -0
- package/lib/messages/index.js.map +1 -0
- package/lib/messages/renderer.d.ts +142 -0
- package/lib/messages/renderer.d.ts.map +1 -0
- package/lib/messages/renderer.js +165 -0
- package/lib/messages/renderer.js.map +1 -0
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +1 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +1 -0
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +41 -6
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +109 -49
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +8 -2
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +1 -1
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +52 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +66 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/socket-launcher.d.ts +20 -4
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +5 -4
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/stdio-launcher.d.ts +6 -5
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +2 -2
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +16 -4
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js +18 -3
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.d.ts +14 -0
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +28 -2
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +72 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +42 -10
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +11 -3
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +43 -10
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +14 -0
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +34 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +24 -8
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +27 -6
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +10 -1
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +4 -4
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -52
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +24 -65
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +26 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +78 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +115 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +7 -6
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/util/connection-liveness.d.ts +7 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +35 -14
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +32 -48
- package/src/documents/ast-document-manager.ts +379 -231
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +130 -0
- package/src/documents/document-release-handler.ts +365 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +68 -0
- package/src/documents/hydranium-text-documents.ts +931 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +451 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +267 -0
- package/src/index.ts +8 -0
- package/src/langium/ast-extension/ast-node-builder.ts +66 -22
- package/src/langium/bootstrap.ts +66 -28
- package/src/langium/composite-ast-reflection.ts +112 -0
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/logger.ts +12 -5
- package/src/langium/diagnostics/lsp-logger.ts +59 -15
- package/src/langium/document-builder/build-pipeline-integration.ts +50 -5
- package/src/langium/document-builder/document-builder.ts +565 -59
- package/src/langium/integration-services.ts +83 -24
- package/src/langium/integrity/integrity-rule.ts +16 -8
- package/src/langium/integrity/integrity-service.ts +287 -62
- package/src/langium/keys/containment.ts +87 -0
- package/src/langium/keys/index.ts +1 -0
- package/src/langium/keys/name-based-key-provider.ts +4 -0
- package/src/langium/language-module.ts +48 -7
- package/src/langium/model-service/client-session.ts +644 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +75 -0
- package/src/langium/model-service/model-service.ts +790 -468
- package/src/langium/module.ts +199 -64
- package/src/langium/naming/name-provider.ts +27 -5
- package/src/langium/naming/name-separator-validation.ts +34 -5
- package/src/langium/project/abstract-project-manager.ts +9 -1
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +45 -14
- package/src/langium/scope/hydranium-scope-provider.ts +60 -22
- package/src/langium/serialization/abstract-serializer.ts +13 -32
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +21 -6
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -37
- package/src/langium/trivia/comment-preserver.ts +1100 -0
- package/src/langium/trivia/document-ending-preserver.ts +55 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +54 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +523 -10
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +15 -10
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +205 -17
- package/src/langium/workspace/hydranium-langium-document-factory.ts +117 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +154 -14
- package/src/langium/workspace/in-memory-file-system-provider.ts +48 -17
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +43 -5
- package/src/langium/workspace/langium-documents.ts +75 -6
- package/src/langium/workspace/persistent-file-system-provider.ts +1 -8
- package/src/{documents → langium/workspace}/self-save-registry.ts +54 -15
- package/src/langium/workspace/virtual-document.ts +96 -19
- package/src/langium/workspace/write-lock-scope.ts +24 -11
- package/src/locale/index.ts +10 -0
- package/src/locale/server-locale.ts +86 -0
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/hydranium-document-update-handler.ts +187 -108
- package/src/lsp/index.ts +3 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/semantic-token-provider.ts +74 -7
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +13 -7
- package/src/messages/carriers.ts +78 -0
- package/src/messages/index.ts +36 -0
- package/src/messages/renderer.ts +212 -0
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +1 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/measure-memory.ts +1 -0
- package/src/node/node-file-system-provider.ts +124 -53
- package/src/node/profile-capture.ts +9 -3
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +78 -0
- package/src/node/socket-launcher.ts +24 -8
- package/src/node/stdio-launcher.ts +8 -7
- package/src/testing/fake-document.ts +24 -5
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +50 -2
- package/src/testing/make-test-services.ts +125 -31
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +66 -12
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +36 -2
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +45 -11
- package/src/testing/playwright/server-log-rename-reporter.ts +12 -1
- package/src/testing/run-update-pipeline.ts +4 -4
- package/src/testing/stub-ast-document-manager.ts +36 -138
- package/src/testing/stub-document-builder.ts +102 -18
- package/src/testing/stub-hydranium-text-documents.ts +165 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +1 -1
- package/src/util/connection-liveness.ts +37 -14
- package/src/util/environment.ts +9 -1
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -175
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -8,26 +8,9 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* client, and/or a structured-form client. Each kind carries a stable id so
|
|
16
|
-
* the server can route outbound corrections, edits, and notifications to the
|
|
17
|
-
* right transport.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
/** Identifier for an LSP-text client (Monaco, VS Code, …). */
|
|
21
|
-
export const LANGUAGE_CLIENT_ID = 'language-client';
|
|
22
|
-
|
|
23
|
-
/** Fallback identifier when a document's author is unknown (e.g. cold workspace-init load). */
|
|
24
|
-
export const UNKNOWN_CLIENT_ID = 'unknown';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Synthetic author id on the `onDocumentUpdated` broadcast a data-server
|
|
28
|
-
* emits after the LAST client closed a document and the framework rebuilt it
|
|
29
|
-
* from its disk content (discarding unsaved in-session edits). Not a real
|
|
30
|
-
* client: it lets consumers distinguish the revert broadcast from
|
|
31
|
-
* client-authored updates.
|
|
11
|
+
* Re-export, because these are WIRE values and the side that has to recognise
|
|
12
|
+
* them is the client. They are defined in `@hydranium/protocol` so a frontend
|
|
13
|
+
* can name them without depending on the server tier; this path stays so
|
|
14
|
+
* server-side code keeps importing them from where it already does.
|
|
32
15
|
*/
|
|
33
|
-
export
|
|
16
|
+
export { FRAMEWORK_CLIENT_IDS, LANGUAGE_CLIENT_ID, DOCUMENT_RELEASE_CLIENT_ID, UNKNOWN_CLIENT_ID } from '@hydranium/protocol';
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Re-export, because these errors cross the wire and the side that has to
|
|
12
|
+
* recognise them is the client. They are defined in `@hydranium/protocol` so a
|
|
13
|
+
* frontend can name them without depending on the server tier.
|
|
14
|
+
*/
|
|
15
|
+
export {
|
|
16
|
+
DocumentNotOpenError,
|
|
17
|
+
DuplicateClientIdError,
|
|
18
|
+
ReservedClientIdError,
|
|
19
|
+
SessionClosedError,
|
|
20
|
+
isDocumentNotOpenError,
|
|
21
|
+
isDuplicateClientIdError,
|
|
22
|
+
isReservedClientIdError,
|
|
23
|
+
isSessionClosedError
|
|
24
|
+
} from '@hydranium/protocol';
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
+
import { type CanonicalUri, FRAMEWORK_CLIENT_IDS } from '@hydranium/protocol';
|
|
11
|
+
import { Emitter, type Event } from 'vscode-languageserver';
|
|
12
|
+
import { INTEGRITY_CLIENT_ID } from '../langium/integrity/integrity-rule.js';
|
|
13
|
+
import { DuplicateClientIdError, ReservedClientIdError, SessionClosedError } from './client-session-errors.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* What a client session states about one of its opens, kept by the session
|
|
17
|
+
* and readable only while that open lasts.
|
|
18
|
+
*
|
|
19
|
+
* Any object type: an adopter declares the fields its own open path reads and
|
|
20
|
+
* passes that type as a session's `TOpenOptions`. Kept per open rather than
|
|
21
|
+
* per document, so two sessions opening one document with different options
|
|
22
|
+
* each keep their own.
|
|
23
|
+
*/
|
|
24
|
+
export type OpenOptions = object;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A session is `'live'` from its registration, which is synchronous, so no
|
|
28
|
+
* state comes before it. `'closing'` covers the span in which the session's
|
|
29
|
+
* opens are being closed: the id is still taken, and the session can open
|
|
30
|
+
* nothing more, so an open issued from a close listener cannot outlive the
|
|
31
|
+
* session that made it. An id with no state has no session: it was never
|
|
32
|
+
* registered, or has closed.
|
|
33
|
+
*/
|
|
34
|
+
export type ClientSessionState = 'live' | 'closing';
|
|
35
|
+
|
|
36
|
+
/** Delivered by {@link ClientSessionRegistry.onDidCloseSession}. */
|
|
37
|
+
export interface ClientSessionClosedEvent {
|
|
38
|
+
readonly clientId: string;
|
|
39
|
+
readonly cause: SessionEndCause;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Why a close happened. `'lost'` is a close caused by the client's connection
|
|
44
|
+
* going away rather than by the client, and only such a last close waits out
|
|
45
|
+
* the store's release grace: a client that closed or ended on purpose has
|
|
46
|
+
* discarded its unsaved edits, while one that lost its connection may be about
|
|
47
|
+
* to register again and open the document once more.
|
|
48
|
+
*/
|
|
49
|
+
export type SessionEndCause = 'closed' | 'lost';
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The ids no client session may be started under: the wire's well-known ids and
|
|
53
|
+
* the integrity author. Each names a framework participant rather than a
|
|
54
|
+
* client, and a session holding one would have its writes read as that
|
|
55
|
+
* participant's.
|
|
56
|
+
*/
|
|
57
|
+
export const RESERVED_CLIENT_IDS: readonly string[] = [...FRAMEWORK_CLIENT_IDS, INTEGRITY_CLIENT_ID];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Which client has which document open, and which client ids are registered
|
|
61
|
+
* sessions — the open facts every head shares, composed by
|
|
62
|
+
* `HydraniumTextDocuments`.
|
|
63
|
+
*
|
|
64
|
+
* Opens are recorded for every client id, registered or not. The language
|
|
65
|
+
* client opens under its reserved id without a session, over the LSP
|
|
66
|
+
* connection, and its opens are tracked exactly as a session's are; only the
|
|
67
|
+
* session table ignores it. Requiring registration before an open would refuse
|
|
68
|
+
* the editor.
|
|
69
|
+
*
|
|
70
|
+
* One open per `(client, uri)`, with no reference count: a repeat open changes
|
|
71
|
+
* nothing, and one close ends it.
|
|
72
|
+
*
|
|
73
|
+
* Pure bookkeeping. Closing a document is the store's job, because a close has
|
|
74
|
+
* to reach the text store and its listeners; the store asks this class what to
|
|
75
|
+
* close and records each close here.
|
|
76
|
+
*/
|
|
77
|
+
export class ClientSessionRegistry {
|
|
78
|
+
protected readonly sessions = new Map<string, ClientSessionState>();
|
|
79
|
+
protected readonly clientsByUri = new Map<CanonicalUri, Set<string>>();
|
|
80
|
+
protected readonly opensByClient = new Map<string, Set<CanonicalUri>>();
|
|
81
|
+
/**
|
|
82
|
+
* Per document, the newest version id each client declared for its own
|
|
83
|
+
* buffer: the baseline of the store's per-client staleness guard. A
|
|
84
|
+
* client's goes when it closes the document, every one when the store
|
|
85
|
+
* releases it.
|
|
86
|
+
*/
|
|
87
|
+
protected readonly clientVersions = new Map<CanonicalUri, Map<string, number>>();
|
|
88
|
+
protected readonly reservedIds: ReadonlySet<string> = new Set(RESERVED_CLIENT_IDS);
|
|
89
|
+
protected readonly sessionClosedEmitter = new Emitter<ClientSessionClosedEvent>();
|
|
90
|
+
|
|
91
|
+
/** Fires once a session has been removed from the table, after all its opens closed. */
|
|
92
|
+
get onDidCloseSession(): Event<ClientSessionClosedEvent> {
|
|
93
|
+
return this.sessionClosedEmitter.event;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Enter `clientId` in the session table.
|
|
98
|
+
*
|
|
99
|
+
* Throws {@link ReservedClientIdError} for a reserved id, and
|
|
100
|
+
* {@link DuplicateClientIdError} when the id is live anywhere in the
|
|
101
|
+
* process: registered (including by a session that is still closing), or
|
|
102
|
+
* holding opens as a client that is not a session. The last matters because
|
|
103
|
+
* the id is the author label and the echo key, and a session sharing one
|
|
104
|
+
* with another client would take that client's writes for its own.
|
|
105
|
+
*/
|
|
106
|
+
register(clientId: string): void {
|
|
107
|
+
if (this.reservedIds.has(clientId)) {
|
|
108
|
+
throw new ReservedClientIdError(clientId);
|
|
109
|
+
}
|
|
110
|
+
if (this.sessions.has(clientId) || this.opensByClient.has(clientId)) {
|
|
111
|
+
throw new DuplicateClientIdError(clientId);
|
|
112
|
+
}
|
|
113
|
+
this.sessions.set(clientId, 'live');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Whether `clientId` is in the session table, live or closing. */
|
|
117
|
+
isRegistered(clientId: string): boolean {
|
|
118
|
+
return this.sessions.has(clientId);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Mark `clientId` as closing and return every URI it has open, as a copy the
|
|
123
|
+
* caller can close while this registry changes underneath it.
|
|
124
|
+
*/
|
|
125
|
+
beginClose(clientId: string): CanonicalUri[] {
|
|
126
|
+
if (this.sessions.has(clientId)) {
|
|
127
|
+
this.sessions.set(clientId, 'closing');
|
|
128
|
+
}
|
|
129
|
+
return this.opensOf(clientId);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Remove `clientId` from the session table, with every client version it
|
|
134
|
+
* declared, and announce it with `cause`. A no-op for an id that is not
|
|
135
|
+
* registered. The versions go too: a client registered again under the same
|
|
136
|
+
* id counts its versions afresh.
|
|
137
|
+
*/
|
|
138
|
+
unregister(clientId: string, cause: SessionEndCause = 'closed'): void {
|
|
139
|
+
if (!this.sessions.delete(clientId)) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
for (const [uri, versions] of this.clientVersions) {
|
|
143
|
+
if (versions.delete(clientId) && versions.size === 0) {
|
|
144
|
+
this.clientVersions.delete(uri);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
this.sessionClosedEmitter.fire(Object.freeze({ clientId, cause }));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Record that `clientId` opened `uri`. Returns `false` when
|
|
152
|
+
* it already had it open, in which case nothing changes.
|
|
153
|
+
*
|
|
154
|
+
* Throws {@link SessionClosedError} for a session that is closing.
|
|
155
|
+
*/
|
|
156
|
+
addOpen(uri: CanonicalUri, clientId: string): boolean {
|
|
157
|
+
this.assertCanOpen(clientId);
|
|
158
|
+
let opens = this.opensByClient.get(clientId);
|
|
159
|
+
if (opens?.has(uri)) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
if (!opens) {
|
|
163
|
+
opens = new Set();
|
|
164
|
+
this.opensByClient.set(clientId, opens);
|
|
165
|
+
}
|
|
166
|
+
opens.add(uri);
|
|
167
|
+
let clients = this.clientsByUri.get(uri);
|
|
168
|
+
if (!clients) {
|
|
169
|
+
clients = new Set();
|
|
170
|
+
this.clientsByUri.set(uri, clients);
|
|
171
|
+
}
|
|
172
|
+
clients.add(clientId);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** Throws {@link SessionClosedError} when `clientId` is a session that is closing, and so can open nothing more. */
|
|
177
|
+
assertCanOpen(clientId: string): void {
|
|
178
|
+
if (this.sessions.get(clientId) === 'closing') {
|
|
179
|
+
throw new SessionClosedError(clientId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Record that `clientId` closed `uri`. Returns `false` when it did not have it open. */
|
|
184
|
+
removeOpen(uri: CanonicalUri, clientId: string): boolean {
|
|
185
|
+
const opens = this.opensByClient.get(clientId);
|
|
186
|
+
if (!opens?.delete(uri)) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
if (opens.size === 0) {
|
|
190
|
+
this.opensByClient.delete(clientId);
|
|
191
|
+
}
|
|
192
|
+
const clients = this.clientsByUri.get(uri);
|
|
193
|
+
clients?.delete(clientId);
|
|
194
|
+
if (!clients?.size) {
|
|
195
|
+
this.clientsByUri.delete(uri);
|
|
196
|
+
}
|
|
197
|
+
const versions = this.clientVersions.get(uri);
|
|
198
|
+
versions?.delete(clientId);
|
|
199
|
+
if (!versions?.size) {
|
|
200
|
+
this.clientVersions.delete(uri);
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Take `version` as the newest `clientId` declared for `uri`, whether or not it has `uri` open. */
|
|
206
|
+
setClientVersion(uri: CanonicalUri, clientId: string, version: number): void {
|
|
207
|
+
let versions = this.clientVersions.get(uri);
|
|
208
|
+
if (!versions) {
|
|
209
|
+
versions = new Map();
|
|
210
|
+
this.clientVersions.set(uri, versions);
|
|
211
|
+
}
|
|
212
|
+
versions.set(clientId, version);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** The newest version id `clientId` declared for `uri`. */
|
|
216
|
+
clientVersionOf(uri: CanonicalUri, clientId: string): number | undefined {
|
|
217
|
+
return this.clientVersions.get(uri)?.get(clientId);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Drop every client version of `uri`, for a document the store released. */
|
|
221
|
+
forgetClientVersions(uri: CanonicalUri): void {
|
|
222
|
+
this.clientVersions.delete(uri);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Whether `clientId` has `uri` open. */
|
|
226
|
+
isOpenIn(uri: CanonicalUri, clientId: string): boolean {
|
|
227
|
+
return !!this.clientsByUri.get(uri)?.has(clientId);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** Whether any client has `uri` open. */
|
|
231
|
+
isOpen(uri: CanonicalUri): boolean {
|
|
232
|
+
return this.clientsByUri.has(uri);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** The clients that have `uri` open, in the order they opened it. */
|
|
236
|
+
clientsOf(uri: CanonicalUri): string[] {
|
|
237
|
+
return [...(this.clientsByUri.get(uri) ?? [])];
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** The URIs `clientId` has open, in the order it opened them. */
|
|
241
|
+
opensOf(clientId: string): CanonicalUri[] {
|
|
242
|
+
return [...(this.opensByClient.get(clientId) ?? [])];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Every document open in at least one client, with the clients that have it open. */
|
|
246
|
+
openDocuments(): Array<{ readonly uri: CanonicalUri; readonly clients: string[] }> {
|
|
247
|
+
return [...this.clientsByUri].map(([uri, clients]) => ({ uri, clients: [...clients] }));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Forget every session and open without announcing
|
|
252
|
+
* anything, for a test double that resets between tests. Subscriptions
|
|
253
|
+
* stay, so a listener registered before the clear hears the sessions that
|
|
254
|
+
* end after it.
|
|
255
|
+
*/
|
|
256
|
+
clear(): void {
|
|
257
|
+
this.sessions.clear();
|
|
258
|
+
this.clientsByUri.clear();
|
|
259
|
+
this.opensByClient.clear();
|
|
260
|
+
this.clientVersions.clear();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
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 { type CanonicalUri, type TextState } from '@hydranium/protocol';
|
|
11
|
+
import { Emitter, type Event } from 'vscode-languageserver';
|
|
12
|
+
import { type TextDocument } from 'vscode-languageserver-textdocument';
|
|
13
|
+
import { type TextLedger } from './text-ledger.js';
|
|
14
|
+
|
|
15
|
+
/** Delivered by the store's `onDidChangeDirty`, which forwards {@link DirtyStateTracker.onDidChangeDirty}. */
|
|
16
|
+
export interface DocumentDirtyChangedEvent {
|
|
17
|
+
readonly uri: CanonicalUri;
|
|
18
|
+
/**
|
|
19
|
+
* The text the new answer of {@link DirtyStateTracker.isDirty} was decided
|
|
20
|
+
* on. The answer changes with the text, before any build, so it can name
|
|
21
|
+
* text whose model has not been sent yet. Absent when the document no longer
|
|
22
|
+
* exists, or when the build that follows its release failed.
|
|
23
|
+
*/
|
|
24
|
+
readonly text?: TextState;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Owed by a document released dirty: the announcement that it is clean. A
|
|
29
|
+
* first open before it is made takes it over, and each release owes one of its
|
|
30
|
+
* own, so announcing for an earlier release cannot announce a later one clean.
|
|
31
|
+
*/
|
|
32
|
+
export interface CleanAnnouncement {
|
|
33
|
+
/** Whether it is still owed: neither made nor taken over. */
|
|
34
|
+
isOwed(): boolean;
|
|
35
|
+
/** Make it, naming `text`; a no-op once it is no longer owed. */
|
|
36
|
+
announce(text?: TextState): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Whether each tracked document differs from its disk baseline: what the
|
|
41
|
+
* server last knew the file to hold. The store reports every change of its
|
|
42
|
+
* text and of the baseline; this decides the answer and announces it when it
|
|
43
|
+
* changes.
|
|
44
|
+
*/
|
|
45
|
+
export interface DirtyStateTracker {
|
|
46
|
+
readonly onDidChangeDirty: Event<DocumentDirtyChangedEvent>;
|
|
47
|
+
/** `false` for a document not tracked. */
|
|
48
|
+
isDirty(key: CanonicalUri): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Track `key` from its first open, holding `document`, while its file
|
|
51
|
+
* holds `diskText`. Takes over the clean announcement a release still owes, so its
|
|
52
|
+
* own answer decides the flip.
|
|
53
|
+
*/
|
|
54
|
+
track(key: CanonicalUri, document: TextDocument, diskText: string | undefined): void;
|
|
55
|
+
/** The text of `key` is now `document`'s. A no-op for a document not tracked. */
|
|
56
|
+
refreshDirty(key: CanonicalUri, document: TextDocument): void;
|
|
57
|
+
/** The file behind `key` holds `text`, `undefined` for none. A no-op for a document not tracked. */
|
|
58
|
+
setDiskBaseline(key: CanonicalUri, document: TextDocument, text: string | undefined): void;
|
|
59
|
+
/**
|
|
60
|
+
* The store released `key`. Answers the clean announcement a document
|
|
61
|
+
* released dirty now owes; `undefined` for one released clean.
|
|
62
|
+
*/
|
|
63
|
+
release(key: CanonicalUri): CleanAnnouncement | undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class DefaultDirtyStateTracker implements DirtyStateTracker {
|
|
67
|
+
protected readonly states = new Map<CanonicalUri, { baseline: string | undefined; dirty: boolean }>();
|
|
68
|
+
/** Per document released dirty, the token of the announcement it owes. */
|
|
69
|
+
protected readonly owedClean = new Map<CanonicalUri, object>();
|
|
70
|
+
protected readonly dirtyChangedEmitter = new Emitter<DocumentDirtyChangedEvent>();
|
|
71
|
+
|
|
72
|
+
/** @param textLedger hashes the text an announcement names. */
|
|
73
|
+
constructor(protected readonly textLedger: TextLedger) {}
|
|
74
|
+
|
|
75
|
+
get onDidChangeDirty(): Event<DocumentDirtyChangedEvent> {
|
|
76
|
+
return this.dirtyChangedEmitter.event;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
isDirty(key: CanonicalUri): boolean {
|
|
80
|
+
return this.states.get(key)?.dirty ?? false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
track(key: CanonicalUri, document: TextDocument, diskText: string | undefined): void {
|
|
84
|
+
this.states.set(key, { baseline: diskText, dirty: this.owedClean.delete(key) });
|
|
85
|
+
this.refreshDirty(key, document);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
refreshDirty(key: CanonicalUri, document: TextDocument): void {
|
|
89
|
+
const state = this.states.get(key);
|
|
90
|
+
if (!state) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const dirty = document.getText() !== state.baseline;
|
|
94
|
+
if (dirty !== state.dirty) {
|
|
95
|
+
state.dirty = dirty;
|
|
96
|
+
this.dirtyChangedEmitter.fire(
|
|
97
|
+
Object.freeze({ uri: key, text: { version: document.version, hash: this.textLedger.hashOf(document), dirty } })
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
setDiskBaseline(key: CanonicalUri, document: TextDocument, text: string | undefined): void {
|
|
103
|
+
const state = this.states.get(key);
|
|
104
|
+
if (!state) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
state.baseline = text;
|
|
108
|
+
this.refreshDirty(key, document);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
release(key: CanonicalUri): CleanAnnouncement | undefined {
|
|
112
|
+
const dirty = this.states.get(key)?.dirty;
|
|
113
|
+
this.states.delete(key);
|
|
114
|
+
if (!dirty) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const token = {};
|
|
118
|
+
this.owedClean.set(key, token);
|
|
119
|
+
const isOwed = (): boolean => this.owedClean.get(key) === token;
|
|
120
|
+
return {
|
|
121
|
+
isOwed,
|
|
122
|
+
announce: text => {
|
|
123
|
+
if (isOwed()) {
|
|
124
|
+
this.owedClean.delete(key);
|
|
125
|
+
this.dirtyChangedEmitter.fire(Object.freeze(text ? { uri: key, text } : { uri: key }));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|