@hydranium/core 1.0.0-next.33 → 1.0.0-next.330
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +256 -124
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +293 -132
- 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 +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -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 +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +436 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +886 -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 +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -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 +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +83 -44
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- 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 +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.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/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +142 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts +18 -0
- package/lib/langium/diagnostics/format-log-arg.d.ts.map +1 -0
- package/lib/langium/diagnostics/format-log-arg.js +36 -0
- package/lib/langium/diagnostics/format-log-arg.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- 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 +68 -45
- 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 +28 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +283 -41
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +448 -78
- 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 +40 -24
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +17 -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 +95 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +303 -63
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- 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 +30 -5
- 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 +383 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +455 -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 +66 -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 +456 -300
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +571 -466
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +141 -40
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +52 -40
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +13 -6
- 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 +38 -14
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +24 -58
- 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/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +29 -11
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +37 -15
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.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 +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +41 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +57 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +4 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +4 -0
- 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 +13 -7
- 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 +86 -37
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +36 -25
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +471 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1026 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -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 +52 -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 +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 +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +263 -25
- 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 +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- 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 +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -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 +103 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- 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 +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/self-save-registry.d.ts +84 -0
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +33 -22
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +19 -5
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- 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 +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +235 -102
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +4 -1
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +4 -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/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.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 +11 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +18 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +3 -5
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +3 -5
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +32 -7
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +7 -1
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- 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 +5 -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/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- 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 +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +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 +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- 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 +4 -4
- package/lib/testing/make-noop-shared-services.d.ts.map +1 -1
- package/lib/testing/make-noop-shared-services.js +4 -4
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +51 -20
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +29 -13
- 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/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- 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 +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- 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 +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -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 +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.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 +31 -62
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +103 -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 +132 -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 +9 -8
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +6 -6
- 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/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +74 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +39 -58
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +467 -233
- 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 +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1011 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +275 -0
- package/src/index.ts +7 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +87 -51
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- 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/console-tee.ts +151 -0
- package/src/langium/diagnostics/format-log-arg.ts +36 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +70 -44
- package/src/langium/document-builder/build-pipeline-integration.ts +46 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +553 -78
- package/src/langium/integration-services.ts +59 -28
- package/src/langium/integrity/integrity-rule.ts +17 -8
- package/src/langium/integrity/integrity-service.ts +332 -69
- package/src/langium/language-module.ts +49 -8
- package/src/langium/model-service/client-session.ts +718 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +80 -0
- package/src/langium/model-service/model-service.ts +878 -494
- package/src/langium/module.ts +195 -72
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +54 -19
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +49 -16
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +74 -59
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +4 -0
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +16 -7
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +104 -47
- package/src/langium/trivia/comment-preserver.ts +1241 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -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 +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +311 -30
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +1 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/langium/workspace/self-save-registry.ts +118 -0
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +20 -5
- 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 +285 -111
- package/src/lsp/index.ts +4 -1
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -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 +18 -7
- package/src/messages/carriers.ts +3 -5
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +34 -6
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +5 -5
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-noop-shared-services.ts +6 -6
- package/src/testing/make-test-services.ts +93 -41
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -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 +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- 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 +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -128
- package/src/testing/stub-document-builder.ts +133 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +11 -10
- 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 +3 -2
- package/src/util/connection-liveness.ts +80 -15
- package/src/util/environment.ts +24 -2
- 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 +0 -55
- 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/documents/self-save-registry.ts +0 -81
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -0,0 +1,94 @@
|
|
|
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 Clock, SystemClock } from '@hydranium/protocol';
|
|
11
|
+
import * as fsp from 'node:fs/promises';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Errnos Windows raises when a replacing `rename` meets a handle already on the
|
|
15
|
+
* destination open. POSIX renames are unaffected by open handles, so these
|
|
16
|
+
* cannot fire there and the retry below costs nothing.
|
|
17
|
+
*/
|
|
18
|
+
export const RENAME_CONTENTION_CODES = new Set(['EPERM', 'EACCES', 'EBUSY']);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* How long a replacing rename may keep retrying before it gives up.
|
|
22
|
+
*
|
|
23
|
+
* BOUNDED, not open-ended: a genuine permission fault raises the same errno as
|
|
24
|
+
* contention and is distinguishable from it only by never clearing, so an
|
|
25
|
+
* unbounded wait would convert a hard error into a hang.
|
|
26
|
+
*
|
|
27
|
+
* The figure is a judgement, not a measurement, and the honest bound on it is
|
|
28
|
+
* that the previous 2s was observed EXHAUSTED on a loaded Windows CI runner
|
|
29
|
+
* while no upper bound has been established. What would settle it is recording
|
|
30
|
+
* how long a real contended rename takes to clear. graceful-fs tolerates 60s
|
|
31
|
+
* for Windows rename contention, but that is weaker support than it looks: it
|
|
32
|
+
* retries only where the destination has GONE, which is the opposite of
|
|
33
|
+
* replacing one a reader holds open.
|
|
34
|
+
*/
|
|
35
|
+
export const RENAME_BUDGET_MS = 10_000;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* How long a miss is waited out on Windows before it counts as an absence,
|
|
39
|
+
* since a replacing rename there can hide the name from a reader for a while.
|
|
40
|
+
* Bounded: a real deletion differs only by never ending, so it pays the whole
|
|
41
|
+
* budget. The figure is a judgement, not an established bound.
|
|
42
|
+
*/
|
|
43
|
+
export const RENAME_GAP_BUDGET_MS = 2_000;
|
|
44
|
+
|
|
45
|
+
/** Seams for the test, which cannot make a real rename fail on demand. */
|
|
46
|
+
export interface RenameOverOpenReadersOptions {
|
|
47
|
+
readonly rename?: (from: string, to: string) => Promise<void>;
|
|
48
|
+
readonly budgetMs?: number;
|
|
49
|
+
readonly clock?: Clock;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* `rename` the staged content over `destination`, retrying while Windows
|
|
54
|
+
* reports the destination as held open.
|
|
55
|
+
*
|
|
56
|
+
* The staging file exists so a reader never sees a half-written file, and on
|
|
57
|
+
* Windows the very presence of that reader is what makes the replacing rename
|
|
58
|
+
* fail — so the indivisible write breaks under exactly the contention it was
|
|
59
|
+
* built for, and it breaks intermittently, which is worse than never working.
|
|
60
|
+
* A reader's handle is released in milliseconds, so waiting turns a spurious
|
|
61
|
+
* failure into a slightly later success.
|
|
62
|
+
*
|
|
63
|
+
* Exhausting the budget rethrows the last failure, leaving the caller's cleanup
|
|
64
|
+
* and error contract unchanged. An errno OUTSIDE the contention set is rethrown
|
|
65
|
+
* without waiting at all: retrying a fault that will not clear only delays it.
|
|
66
|
+
*/
|
|
67
|
+
export async function renameOverOpenReaders(
|
|
68
|
+
staging: string,
|
|
69
|
+
destination: string,
|
|
70
|
+
options: RenameOverOpenReadersOptions = {}
|
|
71
|
+
): Promise<void> {
|
|
72
|
+
const rename = options.rename ?? fsp.rename;
|
|
73
|
+
const clock = options.clock ?? new SystemClock();
|
|
74
|
+
const budgetMs = options.budgetMs ?? RENAME_BUDGET_MS;
|
|
75
|
+
// A stopwatch, not two `now()` readings: a wall-clock jump would end the
|
|
76
|
+
// budget early or stretch it.
|
|
77
|
+
const waited = clock.stopwatch();
|
|
78
|
+
for (let attempt = 0; ; attempt++) {
|
|
79
|
+
try {
|
|
80
|
+
await rename(staging, destination);
|
|
81
|
+
return;
|
|
82
|
+
} catch (err: unknown) {
|
|
83
|
+
const code = err instanceof Error && 'code' in err ? String((err as NodeJS.ErrnoException).code) : undefined;
|
|
84
|
+
if (code === undefined || !RENAME_CONTENTION_CODES.has(code) || waited.elapsedMs >= budgetMs) {
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
// Backs off to keep a long contention window from spinning, capped so
|
|
88
|
+
// a late attempt still lands promptly once the handle is released.
|
|
89
|
+
// Not `clock.setTimer`: it unrefs its timer, so a process with only
|
|
90
|
+
// this write pending could exit mid-backoff.
|
|
91
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(2 ** attempt, 50)));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -49,7 +49,7 @@ export function startServerDiagnostics(shared: ServerSharedServicesMinimal, opti
|
|
|
49
49
|
productName,
|
|
50
50
|
version,
|
|
51
51
|
phaseDetailThresholdMs,
|
|
52
|
-
...nodeLogPreambleSections(phaseDetailThresholdMs)
|
|
52
|
+
...nodeLogPreambleSections(phaseDetailThresholdMs, options)
|
|
53
53
|
});
|
|
54
54
|
if (options.logInitialMemory ?? true) {
|
|
55
55
|
shared.Tracer.for('Process').memory('Initial Memory');
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Format } from '@hydranium/protocol';
|
|
10
|
+
import { Format, type Stopwatch, SystemClock } from '@hydranium/protocol';
|
|
11
11
|
import { DocumentState, type LangiumDocuments } from '@hydranium/langium';
|
|
12
12
|
import { isCstShed } from '../langium/residency/cst-residency-service.js';
|
|
13
13
|
import { performance } from 'node:perf_hooks';
|
|
@@ -15,7 +15,7 @@ import * as v8 from 'node:v8';
|
|
|
15
15
|
|
|
16
16
|
/** Cumulative samples kept across calls so each snapshot can report deltas. */
|
|
17
17
|
interface DeltaState {
|
|
18
|
-
|
|
18
|
+
sinceSample: Stopwatch;
|
|
19
19
|
cpu: NodeJS.CpuUsage;
|
|
20
20
|
elu: { idle: number; active: number };
|
|
21
21
|
}
|
|
@@ -62,7 +62,7 @@ export interface ServerStateSnapshotOptions {
|
|
|
62
62
|
* requested via `options` ({@link ServerStateSnapshotOptions}).
|
|
63
63
|
*/
|
|
64
64
|
export function formatServerState(documents?: LangiumDocuments, label?: string, options?: ServerStateSnapshotOptions): string {
|
|
65
|
-
const
|
|
65
|
+
const sinceSample = new SystemClock().stopwatch();
|
|
66
66
|
const mem = process.memoryUsage();
|
|
67
67
|
const heap = v8.getHeapStatistics();
|
|
68
68
|
const cpu = process.cpuUsage();
|
|
@@ -87,7 +87,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
|
|
|
87
87
|
`native contexts ${heap.number_of_native_contexts}, detached contexts ${heap.number_of_detached_contexts}`
|
|
88
88
|
);
|
|
89
89
|
if (lastSample) {
|
|
90
|
-
const wallMs =
|
|
90
|
+
const wallMs = lastSample.sinceSample.elapsedMs;
|
|
91
91
|
const userMs = (cpu.user - lastSample.cpu.user) / 1000;
|
|
92
92
|
const systemMs = (cpu.system - lastSample.cpu.system) / 1000;
|
|
93
93
|
const cpuPct = wallMs > 0 ? Math.round(((userMs + systemMs) / wallMs) * 100) : 0;
|
|
@@ -138,7 +138,7 @@ export function formatServerState(documents?: LangiumDocuments, label?: string,
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
lastSample = {
|
|
141
|
+
lastSample = { sinceSample, cpu, elu };
|
|
142
142
|
return lines.join('\n');
|
|
143
143
|
}
|
|
144
144
|
|
|
@@ -7,17 +7,30 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred } from '@hydranium/langium';
|
|
11
10
|
import * as net from 'node:net';
|
|
12
|
-
import type
|
|
11
|
+
import { Deferred, describeError, describeErrorWithStack, type Disposable, type Logger } from '@hydranium/protocol';
|
|
13
12
|
import { createMessageConnection, SocketMessageReader, SocketMessageWriter } from 'vscode-jsonrpc/node';
|
|
14
13
|
import type { MessageConnection } from 'vscode-jsonrpc';
|
|
15
14
|
import type { IntegratedServer } from '../launcher/integrated-server.js';
|
|
15
|
+
import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
|
|
16
|
+
import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Construction-time options for {@link startSocketServer}.
|
|
19
20
|
*/
|
|
20
21
|
export interface SocketServerOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Shared services tree the head serves from. Without an LSP head the
|
|
24
|
+
* launcher brings its workspace up before listening, so a client never
|
|
25
|
+
* reaches a workspace that is not up.
|
|
26
|
+
*/
|
|
27
|
+
readonly shared: ServerSharedServicesMinimal;
|
|
28
|
+
/**
|
|
29
|
+
* Workspace root(s) to initialize — a filesystem path or a `URI`. Required
|
|
30
|
+
* when no LSP head is composed, refused beside one: see
|
|
31
|
+
* {@link initializeWorkspaceWithoutLsp}.
|
|
32
|
+
*/
|
|
33
|
+
readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
|
|
21
34
|
/**
|
|
22
35
|
* Port to bind. Default `0` — OS-assigned ephemeral. Resolve the
|
|
23
36
|
* actual port off {@link StartedSocketServer.port} once `started`
|
|
@@ -25,9 +38,25 @@ export interface SocketServerOptions {
|
|
|
25
38
|
*/
|
|
26
39
|
readonly port?: number;
|
|
27
40
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
41
|
+
* Interface to bind. Default `'127.0.0.1'` (LOCAL ONLY) — a head whose
|
|
42
|
+
* port is OS-assigned and announced over the LSP connection is
|
|
43
|
+
* reachable only by a client on the same machine anyway, so a wider
|
|
44
|
+
* binding exposes a port nothing off-box can address. Matches
|
|
45
|
+
* `startGlspServer`'s default, so the two socket heads agree.
|
|
46
|
+
*
|
|
47
|
+
* Pass `'::'` for every interface: that is the dual-stack any-address,
|
|
48
|
+
* so both IPv4 and IPv6 clients connect. `'0.0.0.0'` is NOT the same —
|
|
49
|
+
* it takes IPv4 only and refuses `::1`.
|
|
50
|
+
*
|
|
51
|
+
* An address no local interface holds fails the bind, so `started`
|
|
52
|
+
* rejects with `EADDRNOTAVAIL` rather than falling back to a wider one.
|
|
53
|
+
*/
|
|
54
|
+
readonly host?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Optional logger for lifecycle lines and each connection's protocol
|
|
57
|
+
* faults. If omitted, the launcher runs silently — the adopter is expected
|
|
58
|
+
* to surface lifecycle events through their own logging in
|
|
59
|
+
* {@link OnClientConnection} if needed.
|
|
31
60
|
*/
|
|
32
61
|
readonly logger?: Logger;
|
|
33
62
|
/** Tag included in lifecycle log lines. Default `"SocketServer"`. */
|
|
@@ -56,10 +85,12 @@ export type OnClientConnection = (connection: MessageConnection) => Disposable;
|
|
|
56
85
|
/**
|
|
57
86
|
* Live socket server handle returned by {@link startSocketServer}.
|
|
58
87
|
*
|
|
59
|
-
* - {@link IntegratedServer.started} resolves once
|
|
60
|
-
* AND `port` is
|
|
88
|
+
* - {@link IntegratedServer.started} resolves once the workspace is up,
|
|
89
|
+
* where the launcher brings it up, AND `listen` resolves AND `port` is
|
|
90
|
+
* populated. It rejects, and nothing listens, when the bring-up fails.
|
|
61
91
|
* - {@link IntegratedServer.stopped} resolves when the underlying
|
|
62
|
-
* `net.Server` emits `close
|
|
92
|
+
* `net.Server` emits `close`, or once a failed bring-up has rejected
|
|
93
|
+
* `started`.
|
|
63
94
|
* - {@link port} is undefined until `started` resolves.
|
|
64
95
|
* - {@link close} triggers shutdown: disposes all active client
|
|
65
96
|
* connections and closes the underlying `net.Server`.
|
|
@@ -82,12 +113,17 @@ export interface StartedSocketServer extends IntegratedServer {
|
|
|
82
113
|
* close / server shutdown. Adopters keep per-client instance creation
|
|
83
114
|
* (their server objects) but don't re-implement the tracking machinery.
|
|
84
115
|
*
|
|
116
|
+
* **Without an LSP head the launcher brings the workspace up, then
|
|
117
|
+
* listens**, as `startStdioServer` does: a request served before the
|
|
118
|
+
* bring-up starts keeps its cross-file references unresolved for good.
|
|
119
|
+
*
|
|
85
120
|
* The port is only known once {@link StartedSocketServer.started} has
|
|
86
121
|
* resolved, so announcing it — via {@link publishPortOnLspConnection} —
|
|
87
122
|
* belongs after that await, not beside the call.
|
|
88
123
|
*/
|
|
89
124
|
export function startSocketServer(options: SocketServerOptions, onClientConnection: OnClientConnection): StartedSocketServer {
|
|
90
125
|
const port = options.port ?? 0;
|
|
126
|
+
const host = options.host ?? '127.0.0.1';
|
|
91
127
|
const logger = options.logger;
|
|
92
128
|
const tag = options.logTag ?? 'SocketServer';
|
|
93
129
|
const started = new Deferred<void>();
|
|
@@ -100,7 +136,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
100
136
|
const activeConnections: Array<{ connection: MessageConnection; adopterDisposable: Disposable }> = [];
|
|
101
137
|
|
|
102
138
|
const netServer = net.createServer(socket => {
|
|
103
|
-
const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket));
|
|
139
|
+
const connection = createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket), logger?.with(tag));
|
|
104
140
|
const adopterDisposable = onClientConnection(connection);
|
|
105
141
|
const entry = { connection, adopterDisposable };
|
|
106
142
|
activeConnections.push(entry);
|
|
@@ -115,7 +151,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
115
151
|
try {
|
|
116
152
|
adopterDisposable.dispose();
|
|
117
153
|
} catch (err) {
|
|
118
|
-
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${(err
|
|
154
|
+
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
|
|
119
155
|
}
|
|
120
156
|
connection.dispose();
|
|
121
157
|
const idx = activeConnections.indexOf(entry);
|
|
@@ -128,7 +164,34 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
128
164
|
connection.listen();
|
|
129
165
|
});
|
|
130
166
|
|
|
131
|
-
|
|
167
|
+
// The workspace manager logs a failed initialization itself; a refused
|
|
168
|
+
// `workspace` throws before `initializing` is set.
|
|
169
|
+
let initializing = false;
|
|
170
|
+
let closed = false;
|
|
171
|
+
const begin = async (): Promise<void> => {
|
|
172
|
+
const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
|
|
173
|
+
initializing = true;
|
|
174
|
+
await initialization;
|
|
175
|
+
initializing = false;
|
|
176
|
+
// A `close` during the bring-up has resolved `stopped` already.
|
|
177
|
+
if (closed) {
|
|
178
|
+
started.reject(new Error(`${tag} was closed before it listened`));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
netServer.listen(port, host);
|
|
182
|
+
};
|
|
183
|
+
begin().catch((err: unknown) => {
|
|
184
|
+
if (initializing) {
|
|
185
|
+
logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
|
|
186
|
+
} else {
|
|
187
|
+
logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
|
|
188
|
+
}
|
|
189
|
+
started.reject(err);
|
|
190
|
+
stopped.resolve();
|
|
191
|
+
});
|
|
192
|
+
// `started` is always observed internally, as `startStdioServer`'s is, so a
|
|
193
|
+
// caller that closes early and ignores it cannot crash the process.
|
|
194
|
+
void started.promise.catch(() => undefined);
|
|
132
195
|
netServer.on('listening', () => {
|
|
133
196
|
const addressInfo = netServer.address();
|
|
134
197
|
if (!addressInfo) {
|
|
@@ -144,11 +207,11 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
144
207
|
return;
|
|
145
208
|
}
|
|
146
209
|
handle.port = addressInfo.port;
|
|
147
|
-
logger?.info(`[${tag}] Ready to accept new client requests on port: ${addressInfo.port}`);
|
|
210
|
+
logger?.info(`[${tag}] Ready to accept new client requests on ${addressInfo.address} port: ${addressInfo.port}`);
|
|
148
211
|
started.resolve();
|
|
149
212
|
});
|
|
150
213
|
netServer.on('error', err => {
|
|
151
|
-
logger?.error(`[${tag}] Error: ${err
|
|
214
|
+
logger?.error(`[${tag}] Error: ${describeErrorWithStack(err)}`);
|
|
152
215
|
started.reject(err);
|
|
153
216
|
});
|
|
154
217
|
netServer.on('close', () => {
|
|
@@ -158,7 +221,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
158
221
|
try {
|
|
159
222
|
entry.adopterDisposable.dispose();
|
|
160
223
|
} catch (err) {
|
|
161
|
-
logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${(err
|
|
224
|
+
logger?.warn(`[${tag}] Adopter disposable threw on shutdown: ${describeErrorWithStack(err)}`);
|
|
162
225
|
}
|
|
163
226
|
entry.connection.dispose();
|
|
164
227
|
}
|
|
@@ -173,6 +236,7 @@ export function startSocketServer(options: SocketServerOptions, onClientConnecti
|
|
|
173
236
|
started: started.promise,
|
|
174
237
|
stopped: stopped.promise,
|
|
175
238
|
close(): void {
|
|
239
|
+
closed = true;
|
|
176
240
|
netServer.close();
|
|
177
241
|
}
|
|
178
242
|
};
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { DEFAULT_CPU_PROFILE_FILE_ENV } from '@hydranium/protocol';
|
|
11
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { Session } from 'node:inspector';
|
|
13
|
+
import { dirname } from 'node:path';
|
|
14
|
+
import { isMainThread } from 'node:worker_threads';
|
|
15
|
+
import { expandLogFilePlaceholders } from '../langium/diagnostics/logger.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Marks the profile started on `globalThis` rather than in this module, since
|
|
19
|
+
* a second installed copy of the package loads its own module and would start
|
|
20
|
+
* a second session writing a profile of its own.
|
|
21
|
+
*/
|
|
22
|
+
const CPU_PROFILE_STARTED: unique symbol = Symbol.for('@hydranium/core#startupCpuProfileStarted');
|
|
23
|
+
const processGlobal = globalThis as typeof globalThis & { [CPU_PROFILE_STARTED]?: true };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Start profiling this process when {@link DEFAULT_CPU_PROFILE_FILE_ENV} is
|
|
27
|
+
* set, and write the profile once, on `exit` or on SIGTERM. Called when
|
|
28
|
+
* `@hydranium/core/node` loads, so every Node head is profiled from before its
|
|
29
|
+
* workspace load; a no-op on a second call, from any copy of the package, and
|
|
30
|
+
* in a `worker_threads` worker.
|
|
31
|
+
*
|
|
32
|
+
* `--cpu-prof` is no substitute: it writes only on a normal exit, and SIGTERM
|
|
33
|
+
* ends a process without one. The SIGTERM listener re-raises the signal when it
|
|
34
|
+
* is the only one, so the process still ends by it; another listener keeps
|
|
35
|
+
* control of the ending. Samples accumulate for the life of the process, so
|
|
36
|
+
* this is for test runs, not a production server.
|
|
37
|
+
*
|
|
38
|
+
* A head in a worker is not profiled: a worker's session would write the main
|
|
39
|
+
* thread's file, since threads share the pid, no signal reaches it, and its
|
|
40
|
+
* `exit` listeners run neither when it is terminated nor when the process ends.
|
|
41
|
+
*
|
|
42
|
+
* A `ProfileCapture` window runs beside it in its own inspector session.
|
|
43
|
+
*/
|
|
44
|
+
export function startCpuProfileFromEnv(): void {
|
|
45
|
+
const template = process.env[DEFAULT_CPU_PROFILE_FILE_ENV];
|
|
46
|
+
if (!template || !isMainThread || processGlobal[CPU_PROFILE_STARTED]) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
processGlobal[CPU_PROFILE_STARTED] = true;
|
|
50
|
+
const session = new Session();
|
|
51
|
+
session.connect();
|
|
52
|
+
session.post('Profiler.enable');
|
|
53
|
+
session.post('Profiler.start');
|
|
54
|
+
let written = false;
|
|
55
|
+
// Synchronous throughout: an in-process session answers `post` before it
|
|
56
|
+
// returns, and nothing asynchronous runs after `exit`. The session is
|
|
57
|
+
// disconnected from the answer, so nothing here depends on that order.
|
|
58
|
+
const write = (): void => {
|
|
59
|
+
if (written) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
written = true;
|
|
63
|
+
const file = expandLogFilePlaceholders(template);
|
|
64
|
+
session.post('Profiler.stop', (error, result) => {
|
|
65
|
+
try {
|
|
66
|
+
if (error) {
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
70
|
+
writeFileSync(file, JSON.stringify(result.profile));
|
|
71
|
+
} catch (err: unknown) {
|
|
72
|
+
process.stderr.write(
|
|
73
|
+
`[hydranium] Could not write the CPU profile to ${file}: ${err instanceof Error ? err.message : String(err)}\n`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
session.disconnect();
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
process.once('exit', write);
|
|
80
|
+
// Registered until the write is done, not `once`: a `once` listener is gone
|
|
81
|
+
// before it runs, and with no listener left the default action ends the
|
|
82
|
+
// process on a second SIGTERM, which a host ending its process tree sends
|
|
83
|
+
// while the write is still running. Prepended: a `once` listener ahead of
|
|
84
|
+
// this one has removed itself by the time this counts, which would re-raise
|
|
85
|
+
// into its unfinished shutdown.
|
|
86
|
+
const writeOnSigterm = (): void => {
|
|
87
|
+
write();
|
|
88
|
+
process.removeListener('SIGTERM', writeOnSigterm);
|
|
89
|
+
if (process.listenerCount('SIGTERM') === 0) {
|
|
90
|
+
process.kill(process.pid, 'SIGTERM');
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
process.prependListener('SIGTERM', writeOnSigterm);
|
|
94
|
+
}
|
|
@@ -7,13 +7,12 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Deferred } from '@hydranium/
|
|
11
|
-
import type { Disposable, Logger } from '@hydranium/protocol';
|
|
10
|
+
import { Deferred, type Disposable, type Logger, describeError, describeErrorWithStack } from '@hydranium/protocol';
|
|
12
11
|
import type { MessageConnection } from 'vscode-jsonrpc';
|
|
13
12
|
import { createMessageConnection, StreamMessageReader, StreamMessageWriter } from 'vscode-jsonrpc/node';
|
|
14
13
|
import type { IntegratedServer } from '../launcher/integrated-server.js';
|
|
15
14
|
import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
|
|
16
|
-
import {
|
|
15
|
+
import { initializeWorkspaceWithoutLsp, type WorkspaceFolderInput } from '../langium/workspace/initialize-workspace.js';
|
|
17
16
|
|
|
18
17
|
/** Construction-time options for {@link startStdioServer}. */
|
|
19
18
|
export interface StdioServerOptions {
|
|
@@ -24,16 +23,17 @@ export interface StdioServerOptions {
|
|
|
24
23
|
*/
|
|
25
24
|
readonly shared: ServerSharedServicesMinimal;
|
|
26
25
|
/**
|
|
27
|
-
* Workspace root(s) to initialize — a filesystem path or a `URI`.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* Workspace root(s) to initialize — a filesystem path or a `URI`. Required
|
|
27
|
+
* when no LSP head is composed, refused beside one: see
|
|
28
|
+
* {@link initializeWorkspaceWithoutLsp}.
|
|
30
29
|
*/
|
|
31
30
|
readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
|
|
32
31
|
/**
|
|
33
|
-
* Optional logger for lifecycle lines
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
32
|
+
* Optional logger for lifecycle lines and the connection's protocol
|
|
33
|
+
* faults. Omitted means silent — note that a logger writing to **stdout**
|
|
34
|
+
* would corrupt this head's protocol stream, so anything passed here must
|
|
35
|
+
* sink elsewhere. The framework's own `LspLogger` writes to stderr when no
|
|
36
|
+
* LSP connection is bound, which is correct here.
|
|
37
37
|
*/
|
|
38
38
|
readonly logger?: Logger;
|
|
39
39
|
/** Tag included in lifecycle log lines. Default `"StdioServer"`. */
|
|
@@ -66,11 +66,10 @@ export interface StartedStdioServer extends IntegratedServer {
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Start a **stdio**-based protocol head — the transport `hydranium-cli` speaks,
|
|
69
|
-
* since
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* a launcher rather than four lines in each adopter's entry.
|
|
69
|
+
* since its data-server subcommands spawn a server command and drive JSON-RPC
|
|
70
|
+
* over its stdin/stdout. The socket counterpart is `startSocketServer`; the two
|
|
71
|
+
* differ more than the transport swap suggests, and the differences are the
|
|
72
|
+
* reason this is a launcher rather than four lines in each adopter's entry.
|
|
74
73
|
*
|
|
75
74
|
* **One client, not N.** A socket head accepts arbitrarily many connections and
|
|
76
75
|
* tracks them; a stdio head has exactly one peer — the process that spawned it
|
|
@@ -101,7 +100,8 @@ export function startStdioServer(
|
|
|
101
100
|
|
|
102
101
|
const connection = createMessageConnection(
|
|
103
102
|
new StreamMessageReader(options.input ?? process.stdin),
|
|
104
|
-
new StreamMessageWriter(options.output ?? process.stdout)
|
|
103
|
+
new StreamMessageWriter(options.output ?? process.stdout),
|
|
104
|
+
logger?.with(tag)
|
|
105
105
|
);
|
|
106
106
|
const adopterDisposable = onConnection(connection);
|
|
107
107
|
|
|
@@ -114,18 +114,24 @@ export function startStdioServer(
|
|
|
114
114
|
try {
|
|
115
115
|
adopterDisposable.dispose();
|
|
116
116
|
} catch (err: unknown) {
|
|
117
|
-
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${
|
|
117
|
+
logger?.warn(`[${tag}] Adopter disposable threw on cleanup: ${describeErrorWithStack(err)}`);
|
|
118
118
|
}
|
|
119
119
|
connection.dispose();
|
|
120
120
|
stopped.resolve();
|
|
121
121
|
};
|
|
122
122
|
connection.onClose(() => close());
|
|
123
123
|
|
|
124
|
+
// The workspace manager logs a failed initialization itself; a refused
|
|
125
|
+
// `workspace` throws before `initializing` is set.
|
|
126
|
+
let initializing = false;
|
|
124
127
|
const begin = async (): Promise<void> => {
|
|
128
|
+
const initialization = initializeWorkspaceWithoutLsp(options.shared, options.workspace);
|
|
129
|
+
initializing = true;
|
|
125
130
|
if (options.workspace !== undefined) {
|
|
126
131
|
logger?.info(`[${tag}] Initializing workspace`);
|
|
127
|
-
await initializeWorkspaceProgrammatically(options.shared, options.workspace);
|
|
128
132
|
}
|
|
133
|
+
await initialization;
|
|
134
|
+
initializing = false;
|
|
129
135
|
// Only now attach the reader — see the ordering note in the doc above.
|
|
130
136
|
connection.listen();
|
|
131
137
|
logger?.info(`[${tag}] Listening on stdio`);
|
|
@@ -137,7 +143,11 @@ export function startStdioServer(
|
|
|
137
143
|
// A failed startup must not leave a half-live head: report it on
|
|
138
144
|
// `started` and tear the connection down rather than listening over an
|
|
139
145
|
// uninitialized workspace.
|
|
140
|
-
|
|
146
|
+
if (initializing) {
|
|
147
|
+
logger?.debug(`[${tag}] Startup failed: the workspace did not initialize. ${describeError(err)}`);
|
|
148
|
+
} else {
|
|
149
|
+
logger?.error(`[${tag}] Startup failed: ${describeErrorWithStack(err)}`);
|
|
150
|
+
}
|
|
141
151
|
started.reject(err);
|
|
142
152
|
close();
|
|
143
153
|
}
|
|
@@ -96,7 +96,7 @@ export function documentUriPolicyConformance(
|
|
|
96
96
|
// Computed here rather than tallied from the assertions above, so the
|
|
97
97
|
// guard does not depend on the runner executing tests in declaration
|
|
98
98
|
// order (a `--shuffle` run would otherwise read it as zero).
|
|
99
|
-
it(`at least one sample URI is loadable
|
|
99
|
+
it(`at least one sample URI is loadable among ${sampleUris.join(', ')}`, () => {
|
|
100
100
|
const loadable = sampleUris.filter(uri => makePolicy().loadUri(uri) !== undefined);
|
|
101
101
|
expect(loadable.length > 0).toBe(true);
|
|
102
102
|
});
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { DocumentState, type AstNode, type AstReflection, type LangiumDocument, UriUtils, type URI } from '@hydranium/langium';
|
|
11
11
|
import { buildAstNode } from '../langium/ast-extension/ast-node-builder.js';
|
|
12
|
+
import { type AstDiagnostic } from '../langium/validation/document-validator.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Build a typed AST-node fixture for unit tests.
|
|
@@ -104,7 +105,7 @@ function stringifyFakeRoot(root: unknown): string {
|
|
|
104
105
|
* staging. Override via `options.state` for tests that gate on earlier
|
|
105
106
|
* phases.
|
|
106
107
|
*/
|
|
107
|
-
export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic =
|
|
108
|
+
export function makeFakeDocument<TAst extends AstNode = AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic>(
|
|
108
109
|
uri: string | URI,
|
|
109
110
|
root: TAst,
|
|
110
111
|
options: FakeDocumentOptions<TAst, TDiagnostic> = {}
|
package/src/testing/index.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* builders, the snapshot and URI-policy conformance primitives, the
|
|
15
15
|
* structured-write pipeline driver, and a re-export of `langium/test`.
|
|
16
16
|
*
|
|
17
|
-
* Neutrality is gated (`scripts/check-neutral-bundles.
|
|
17
|
+
* Neutrality is gated (`scripts/check-neutral-bundles.mts`). The test support
|
|
18
18
|
* that needs a real filesystem or a Node stream transport — the scratch
|
|
19
19
|
* workspace, the golden corpus, the LSP transport and its harness — lives at
|
|
20
20
|
* `@hydranium/core/testing/node`, on the same rule the package surface uses:
|
|
@@ -26,6 +26,7 @@ export * from './document-uri-policy-conformance.js';
|
|
|
26
26
|
export * from './fake-description.js';
|
|
27
27
|
export * from './fake-document.js';
|
|
28
28
|
export * from './fake-reflection.js';
|
|
29
|
+
// oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
|
|
29
30
|
export * from './langium-test-helpers.js';
|
|
30
31
|
export * from './make-noop-language-services.js';
|
|
31
32
|
export * from './make-noop-shared-services.js';
|
|
@@ -23,4 +23,5 @@
|
|
|
23
23
|
* contracts stays Langium upstream, so a rename there surfaces here rather than
|
|
24
24
|
* being absorbed by a hand-maintained list.
|
|
25
25
|
*/
|
|
26
|
+
// oxlint-disable-next-line import/export -- misreads export * from an npm package: https://github.com/oxc-project/oxc/pull/26872
|
|
26
27
|
export * from '@hydranium/langium/test';
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
import { type Clock, DefaultTracer, type Logger, NoopLogger, SystemClock, type Tracer } from '@hydranium/protocol';
|
|
11
11
|
import type { ServerSharedServicesMinimal } from '../langium/shared-services.js';
|
|
12
|
-
import { ServerLocale } from '../locale/server-locale.js';
|
|
13
|
-
import {
|
|
12
|
+
import { DefaultServerLocale, type ServerLocale } from '../locale/server-locale.js';
|
|
13
|
+
import { DefaultMessageRenderer, type MessageRenderer } from '../messages/renderer.js';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Overrides for {@link makeNoopSharedServices}. The three observability slots
|
|
@@ -35,14 +35,14 @@ export interface NoopSharedServicesOverrides {
|
|
|
35
35
|
ServerLocale?: (services: ServerSharedServicesMinimal) => ServerLocale;
|
|
36
36
|
/**
|
|
37
37
|
* Factory for the `MessageRenderer` slot. Default: the real
|
|
38
|
-
* {@link
|
|
38
|
+
* {@link DefaultMessageRenderer}, whose no-catalogue behaviour is a
|
|
39
39
|
* pass-through — so the default is the framework's own behaviour, not a stub.
|
|
40
40
|
*
|
|
41
41
|
* A factory rather than an instance, because a renderer reads the tree it is
|
|
42
42
|
* bound into. Both slots are resolved lazily, so an override is honoured
|
|
43
43
|
* however late the caller reads them.
|
|
44
44
|
*/
|
|
45
|
-
MessageRenderer?: (services: ServerSharedServicesMinimal) =>
|
|
45
|
+
MessageRenderer?: (services: ServerSharedServicesMinimal) => MessageRenderer;
|
|
46
46
|
/** Per-slot `workspace` overrides. Slots left out resolve to `undefined`. */
|
|
47
47
|
workspace?: Record<string, unknown>;
|
|
48
48
|
/** Any other minimal slot (`ServiceRegistry`, `AstReflection`, `additionalDocuments`, …). */
|
|
@@ -103,8 +103,8 @@ export function makeNoopSharedServices<T extends ServerSharedServicesMinimal = S
|
|
|
103
103
|
// both services emit an `instantiated` trace, so building them eagerly puts
|
|
104
104
|
// two lines into the capture of every test that passes a capturing logger
|
|
105
105
|
// and asserts on emptiness.
|
|
106
|
-
defineLazySlot(services, 'ServerLocale', () => serverLocale?.(services) ?? new
|
|
107
|
-
defineLazySlot(services, 'MessageRenderer', () => messageRenderer?.(services) ?? new
|
|
106
|
+
defineLazySlot(services, 'ServerLocale', () => serverLocale?.(services) ?? new DefaultServerLocale(services));
|
|
107
|
+
defineLazySlot(services, 'MessageRenderer', () => messageRenderer?.(services) ?? new DefaultMessageRenderer(services));
|
|
108
108
|
return services;
|
|
109
109
|
}
|
|
110
110
|
|