@hydranium/glsp-server 1.0.0-next.31 → 1.0.0-next.315
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 +80 -88
- package/lib/browser/start-glsp-server-in-worker.d.ts +43 -42
- package/lib/browser/start-glsp-server-in-worker.d.ts.map +1 -1
- package/lib/browser/start-glsp-server-in-worker.js +62 -13
- package/lib/browser/start-glsp-server-in-worker.js.map +1 -1
- package/lib/command/diagram-edit-dropped-error.d.ts +31 -0
- package/lib/command/diagram-edit-dropped-error.d.ts.map +1 -0
- package/lib/command/diagram-edit-dropped-error.js +48 -0
- package/lib/command/diagram-edit-dropped-error.js.map +1 -0
- package/lib/command/hydranium-glsp-command-stack.d.ts +33 -0
- package/lib/command/hydranium-glsp-command-stack.d.ts.map +1 -0
- package/lib/command/hydranium-glsp-command-stack.js +63 -0
- package/lib/command/hydranium-glsp-command-stack.js.map +1 -0
- package/lib/command/hydranium-glsp-operation-action-handler.d.ts +64 -0
- package/lib/command/hydranium-glsp-operation-action-handler.d.ts.map +1 -0
- package/lib/command/hydranium-glsp-operation-action-handler.js +142 -0
- package/lib/command/hydranium-glsp-operation-action-handler.js.map +1 -0
- package/lib/command/hydranium-glsp-operation-command.d.ts +250 -0
- package/lib/command/hydranium-glsp-operation-command.d.ts.map +1 -0
- package/lib/command/hydranium-glsp-operation-command.js +491 -0
- package/lib/command/hydranium-glsp-operation-command.js.map +1 -0
- package/lib/command/hydranium-glsp-recording-command.d.ts +26 -87
- package/lib/command/hydranium-glsp-recording-command.d.ts.map +1 -1
- package/lib/command/hydranium-glsp-recording-command.js +40 -117
- package/lib/command/hydranium-glsp-recording-command.js.map +1 -1
- package/lib/command/hydranium-glsp-undo-redo-action-handler.d.ts +23 -0
- package/lib/command/hydranium-glsp-undo-redo-action-handler.d.ts.map +1 -0
- package/lib/command/hydranium-glsp-undo-redo-action-handler.js +41 -0
- package/lib/command/hydranium-glsp-undo-redo-action-handler.js.map +1 -0
- package/lib/command/index.d.ts +5 -0
- package/lib/command/index.d.ts.map +1 -1
- package/lib/command/index.js +5 -0
- package/lib/command/index.js.map +1 -1
- package/lib/computed-bounds/hydranium-glsp-computed-bounds-action-handler.d.ts +1 -1
- package/lib/computed-bounds/hydranium-glsp-computed-bounds-action-handler.d.ts.map +1 -1
- package/lib/computed-bounds/hydranium-glsp-computed-bounds-action-handler.js +2 -2
- package/lib/computed-bounds/hydranium-glsp-computed-bounds-action-handler.js.map +1 -1
- package/lib/dispatcher/server-action-dispatcher.d.ts +25 -24
- package/lib/dispatcher/server-action-dispatcher.d.ts.map +1 -1
- package/lib/dispatcher/server-action-dispatcher.js +38 -26
- package/lib/dispatcher/server-action-dispatcher.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/launcher/abstract-hydranium-glsp-diagram-module.d.ts +35 -59
- package/lib/launcher/abstract-hydranium-glsp-diagram-module.d.ts.map +1 -1
- package/lib/launcher/abstract-hydranium-glsp-diagram-module.js +60 -71
- package/lib/launcher/abstract-hydranium-glsp-diagram-module.js.map +1 -1
- package/lib/launcher/drop-notifications-to-gone-client.d.ts +23 -0
- package/lib/launcher/drop-notifications-to-gone-client.d.ts.map +1 -0
- package/lib/launcher/drop-notifications-to-gone-client.js +43 -0
- package/lib/launcher/drop-notifications-to-gone-client.js.map +1 -0
- package/lib/launcher/glsp-app-module.d.ts +1 -2
- package/lib/launcher/glsp-app-module.d.ts.map +1 -1
- package/lib/launcher/glsp-app-module.js.map +1 -1
- package/lib/launcher/glsp-connection-logger.d.ts +19 -0
- package/lib/launcher/glsp-connection-logger.d.ts.map +1 -0
- package/lib/launcher/glsp-connection-logger.js +24 -0
- package/lib/launcher/glsp-connection-logger.js.map +1 -0
- package/lib/launcher/glsp-server-overrides.d.ts +10 -8
- package/lib/launcher/glsp-server-overrides.d.ts.map +1 -1
- package/lib/launcher/glsp-server-overrides.js +25 -11
- package/lib/launcher/glsp-server-overrides.js.map +1 -1
- package/lib/launcher/hydranium-glsp-server.d.ts +60 -15
- package/lib/launcher/hydranium-glsp-server.d.ts.map +1 -1
- package/lib/launcher/hydranium-glsp-server.js +145 -22
- package/lib/launcher/hydranium-glsp-server.js.map +1 -1
- package/lib/launcher/index.d.ts +2 -0
- package/lib/launcher/index.d.ts.map +1 -1
- package/lib/launcher/index.js +5 -4
- package/lib/launcher/index.js.map +1 -1
- package/lib/logging/glsp-client-logger.d.ts +10 -6
- package/lib/logging/glsp-client-logger.d.ts.map +1 -1
- package/lib/logging/glsp-client-logger.js +14 -7
- package/lib/logging/glsp-client-logger.js.map +1 -1
- package/lib/messages/index.d.ts +11 -6
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +11 -6
- package/lib/messages/index.js.map +1 -1
- package/lib/node/start-glsp-server.d.ts +50 -15
- package/lib/node/start-glsp-server.d.ts.map +1 -1
- package/lib/node/start-glsp-server.js +97 -30
- package/lib/node/start-glsp-server.js.map +1 -1
- package/lib/state/abstract-hydranium-glsp-state.d.ts +326 -102
- package/lib/state/abstract-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/abstract-hydranium-glsp-state.js +529 -139
- package/lib/state/abstract-hydranium-glsp-state.js.map +1 -1
- package/lib/state/diagram-status.d.ts +38 -0
- package/lib/state/diagram-status.d.ts.map +1 -0
- package/lib/state/diagram-status.js +27 -0
- package/lib/state/diagram-status.js.map +1 -0
- package/lib/state/full-text-hydranium-glsp-state.d.ts +22 -9
- package/lib/state/full-text-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/full-text-hydranium-glsp-state.js +45 -18
- package/lib/state/full-text-hydranium-glsp-state.js.map +1 -1
- package/lib/state/hydranium-glsp-index.d.ts +40 -29
- package/lib/state/hydranium-glsp-index.d.ts.map +1 -1
- package/lib/state/hydranium-glsp-index.js +82 -45
- package/lib/state/hydranium-glsp-index.js.map +1 -1
- package/lib/state/hydranium-shared-core-services.d.ts +16 -29
- package/lib/state/hydranium-shared-core-services.d.ts.map +1 -1
- package/lib/state/hydranium-shared-core-services.js +15 -28
- package/lib/state/hydranium-shared-core-services.js.map +1 -1
- package/lib/state/index.d.ts +1 -0
- package/lib/state/index.d.ts.map +1 -1
- package/lib/state/index.js +1 -0
- package/lib/state/index.js.map +1 -1
- package/lib/state/model-ready-timeout-error.d.ts.map +1 -1
- package/lib/state/model-ready-timeout-error.js.map +1 -1
- package/lib/state/reconcile-source-model-write.d.ts +13 -27
- package/lib/state/reconcile-source-model-write.d.ts.map +1 -1
- package/lib/state/reconcile-source-model-write.js +44 -32
- package/lib/state/reconcile-source-model-write.js.map +1 -1
- package/lib/state/reconciling-multi-document-glsp-state.d.ts +125 -69
- package/lib/state/reconciling-multi-document-glsp-state.d.ts.map +1 -1
- package/lib/state/reconciling-multi-document-glsp-state.js +242 -100
- package/lib/state/reconciling-multi-document-glsp-state.js.map +1 -1
- package/lib/state/reconciling-transfer-hydranium-glsp-state.d.ts +36 -28
- package/lib/state/reconciling-transfer-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/reconciling-transfer-hydranium-glsp-state.js +59 -42
- package/lib/state/reconciling-transfer-hydranium-glsp-state.js.map +1 -1
- package/lib/status/diagram-status-reporter.d.ts +44 -0
- package/lib/status/diagram-status-reporter.d.ts.map +1 -0
- package/lib/status/diagram-status-reporter.js +88 -0
- package/lib/status/diagram-status-reporter.js.map +1 -0
- package/lib/status/hydranium-glsp-request-model-action-handler.d.ts +27 -0
- package/lib/status/hydranium-glsp-request-model-action-handler.d.ts.map +1 -0
- package/lib/status/hydranium-glsp-request-model-action-handler.js +52 -0
- package/lib/status/hydranium-glsp-request-model-action-handler.js.map +1 -0
- package/lib/status/hydranium-glsp-set-edit-mode-action-handler.d.ts +27 -0
- package/lib/status/hydranium-glsp-set-edit-mode-action-handler.d.ts.map +1 -0
- package/lib/status/hydranium-glsp-set-edit-mode-action-handler.js +53 -0
- package/lib/status/hydranium-glsp-set-edit-mode-action-handler.js.map +1 -0
- package/lib/status/index.d.ts +12 -0
- package/lib/status/index.d.ts.map +1 -0
- package/lib/status/index.js +12 -0
- package/lib/status/index.js.map +1 -0
- package/lib/storage/hydranium-glsp-request-save-model-action-handler.d.ts +30 -0
- package/lib/storage/hydranium-glsp-request-save-model-action-handler.d.ts.map +1 -0
- package/lib/storage/hydranium-glsp-request-save-model-action-handler.js +47 -0
- package/lib/storage/hydranium-glsp-request-save-model-action-handler.js.map +1 -0
- package/lib/storage/hydranium-glsp-storage.d.ts +324 -143
- package/lib/storage/hydranium-glsp-storage.d.ts.map +1 -1
- package/lib/storage/hydranium-glsp-storage.js +569 -213
- package/lib/storage/hydranium-glsp-storage.js.map +1 -1
- package/lib/storage/index.d.ts +2 -1
- package/lib/storage/index.d.ts.map +1 -1
- package/lib/storage/index.js +2 -1
- package/lib/storage/index.js.map +1 -1
- package/lib/storage/save-delivery-policy.d.ts +51 -0
- package/lib/storage/save-delivery-policy.d.ts.map +1 -0
- package/lib/storage/{save-conflict-policy.js → save-delivery-policy.js} +7 -8
- package/lib/storage/save-delivery-policy.js.map +1 -0
- package/lib/submission/hydranium-glsp-submission-handler.d.ts +44 -4
- package/lib/submission/hydranium-glsp-submission-handler.d.ts.map +1 -1
- package/lib/submission/hydranium-glsp-submission-handler.js +82 -6
- package/lib/submission/hydranium-glsp-submission-handler.js.map +1 -1
- package/lib/testing/glsp-harness.d.ts +34 -7
- package/lib/testing/glsp-harness.d.ts.map +1 -1
- package/lib/testing/glsp-harness.js +47 -19
- package/lib/testing/glsp-harness.js.map +1 -1
- package/lib/validation/diagnostic-markers.d.ts +3 -3
- package/lib/validation/diagnostic-markers.d.ts.map +1 -1
- package/lib/validation/diagnostic-markers.js +1 -1
- package/lib/validation/diagnostic-markers.js.map +1 -1
- package/lib/validation/hydranium-glsp-model-validator.d.ts +1 -2
- package/lib/validation/hydranium-glsp-model-validator.d.ts.map +1 -1
- package/lib/validation/hydranium-glsp-model-validator.js +1 -1
- package/lib/validation/hydranium-glsp-model-validator.js.map +1 -1
- package/package.json +31 -52
- package/src/browser/start-glsp-server-in-worker.ts +79 -51
- package/src/command/diagram-edit-dropped-error.ts +51 -0
- package/src/command/hydranium-glsp-command-stack.ts +47 -0
- package/src/command/hydranium-glsp-operation-action-handler.ts +141 -0
- package/src/command/hydranium-glsp-operation-command.ts +602 -0
- package/src/command/hydranium-glsp-recording-command.ts +40 -121
- package/src/command/hydranium-glsp-undo-redo-action-handler.ts +29 -0
- package/src/command/index.ts +10 -0
- package/src/computed-bounds/hydranium-glsp-computed-bounds-action-handler.ts +2 -2
- package/src/dispatcher/server-action-dispatcher.ts +39 -31
- package/src/index.ts +1 -0
- package/src/launcher/abstract-hydranium-glsp-diagram-module.ts +79 -91
- package/src/launcher/drop-notifications-to-gone-client.ts +47 -0
- package/src/launcher/glsp-app-module.ts +1 -2
- package/src/launcher/glsp-connection-logger.ts +27 -0
- package/src/launcher/glsp-server-overrides.ts +27 -11
- package/src/launcher/hydranium-glsp-server.ts +153 -23
- package/src/launcher/index.ts +5 -4
- package/src/logging/glsp-client-logger.ts +16 -9
- package/src/messages/index.ts +16 -6
- package/src/node/start-glsp-server.ts +133 -40
- package/src/state/abstract-hydranium-glsp-state.ts +609 -154
- package/src/state/diagram-status.ts +41 -0
- package/src/state/full-text-hydranium-glsp-state.ts +46 -18
- package/src/state/hydranium-glsp-index.ts +85 -41
- package/src/state/hydranium-shared-core-services.ts +16 -29
- package/src/state/index.ts +1 -0
- package/src/state/reconcile-source-model-write.ts +51 -53
- package/src/state/reconciling-multi-document-glsp-state.ts +276 -102
- package/src/state/reconciling-transfer-hydranium-glsp-state.ts +67 -45
- package/src/status/diagram-status-reporter.ts +106 -0
- package/src/status/hydranium-glsp-request-model-action-handler.ts +43 -0
- package/src/status/hydranium-glsp-set-edit-mode-action-handler.ts +38 -0
- package/src/status/index.ts +12 -0
- package/src/storage/hydranium-glsp-request-save-model-action-handler.ts +40 -0
- package/src/storage/hydranium-glsp-storage.ts +647 -223
- package/src/storage/index.ts +2 -1
- package/src/storage/save-delivery-policy.ts +49 -0
- package/src/submission/hydranium-glsp-submission-handler.ts +91 -5
- package/src/testing/glsp-harness.ts +67 -25
- package/src/validation/diagnostic-markers.ts +3 -3
- package/src/validation/hydranium-glsp-model-validator.ts +4 -5
- package/lib/storage/save-conflict-policy.d.ts +0 -56
- package/lib/storage/save-conflict-policy.d.ts.map +0 -1
- package/lib/storage/save-conflict-policy.js.map +0 -1
- package/src/storage/save-conflict-policy.ts +0 -52
|
@@ -6,12 +6,32 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { type Logger as GlspLogger, type ServerModule } from '@eclipse-glsp/server/node.js';
|
|
10
|
-
import {
|
|
11
|
-
import type
|
|
9
|
+
import { type Logger as GlspLogger, type ServerModule, SocketServerLauncher } from '@eclipse-glsp/server/node.js';
|
|
10
|
+
import { ContainerModule } from 'inversify';
|
|
11
|
+
import { type Logger } from '@hydranium/protocol';
|
|
12
12
|
import type * as net from 'node:net';
|
|
13
|
-
import type
|
|
13
|
+
import { type IntegratedServer, type WorkspaceFolderInput } from '@hydranium/core';
|
|
14
14
|
import type { LspConnectionLike } from '@hydranium/core/node';
|
|
15
|
+
/**
|
|
16
|
+
* The default socket launcher of {@link startGlspServer}: GLSP's own,
|
|
17
|
+
* with each connection built from this package's copy of `vscode-jsonrpc`, so a
|
|
18
|
+
* framework error thrown in a handler keeps its code. The connection sends
|
|
19
|
+
* GLSP's typed messages by method name, since GLSP builds them from its copy.
|
|
20
|
+
*/
|
|
21
|
+
export declare class HydraniumGlspSocketServerLauncher extends SocketServerLauncher {
|
|
22
|
+
protected createConnection(socket: net.Socket): ReturnType<SocketServerLauncher['createConnection']>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Binds GLSP's own `SocketServerLauncher` token to
|
|
26
|
+
* {@link HydraniumGlspSocketServerLauncher}. {@link startGlspServer} loads it
|
|
27
|
+
* before the adopter's `appModules`, so an adopter replaces the launcher with
|
|
28
|
+
* `rebind`; a second `bind` makes the resolve ambiguous and the start throws.
|
|
29
|
+
* A replacement extends {@link HydraniumGlspSocketServerLauncher}: GLSP's own
|
|
30
|
+
* launcher builds its connection from GLSP's copy, so framework errors lose
|
|
31
|
+
* their code, and GLSP's typed messages throw where its packages nest
|
|
32
|
+
* separate copies.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createGlspSocketLauncherModule(): ContainerModule;
|
|
15
35
|
/**
|
|
16
36
|
* Options for {@link startGlspServer}.
|
|
17
37
|
*
|
|
@@ -53,12 +73,20 @@ export interface GlspServerOptions {
|
|
|
53
73
|
/**
|
|
54
74
|
* Additional Inversify modules to load on the app container AFTER GLSP's
|
|
55
75
|
* own app module (via `createAppModule`, which binds `InjectionContainer`
|
|
56
|
-
* plus the GLSP-version-specific app bindings)
|
|
76
|
+
* plus the GLSP-version-specific app bindings), the framework overrides
|
|
57
77
|
* that route GLSP's logger and logger factory through the adopter logger
|
|
58
|
-
* and add the shared Tracer
|
|
59
|
-
* (e.g. their own shared-services
|
|
78
|
+
* and add the shared Tracer, and {@link createGlspSocketLauncherModule}.
|
|
79
|
+
* Adopters wire language-services bindings (e.g. their own shared-services
|
|
80
|
+
* symbol) here, and replace the launcher with `rebind`.
|
|
60
81
|
*/
|
|
61
82
|
readonly appModules?: ReadonlyArray<ContainerModule>;
|
|
83
|
+
/**
|
|
84
|
+
* Workspace root(s) to initialize — a filesystem path or a `URI`. Required
|
|
85
|
+
* when no LSP head is composed, refused beside one: see
|
|
86
|
+
* `initializeWorkspaceWithoutLsp`. The shared services are the ones
|
|
87
|
+
* `HydraniumGlspAppModule` binds in {@link appModules}.
|
|
88
|
+
*/
|
|
89
|
+
readonly workspace?: WorkspaceFolderInput | ReadonlyArray<WorkspaceFolderInput>;
|
|
62
90
|
/**
|
|
63
91
|
* Optional LSP connection used to register a port-discovery request
|
|
64
92
|
* handler. When both `lspConnection` and `portCommand` are set, the
|
|
@@ -92,12 +120,14 @@ export interface GlspServerOptions {
|
|
|
92
120
|
/**
|
|
93
121
|
* Live GLSP server handle returned by {@link startGlspServer}.
|
|
94
122
|
*
|
|
95
|
-
* - {@link IntegratedServer.started} resolves once the
|
|
96
|
-
*
|
|
97
|
-
* registered on the
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* `
|
|
123
|
+
* - {@link IntegratedServer.started} resolves once the workspace is up,
|
|
124
|
+
* where the launcher brings it up, AND the GLSP socket is listening AND
|
|
125
|
+
* (if configured) the port-discovery handler has been registered on the
|
|
126
|
+
* LSP connection. It rejects, and nothing listens, when the bring-up fails.
|
|
127
|
+
* - {@link IntegratedServer.stopped} settles as GLSP's
|
|
128
|
+
* `SocketServerLauncher.start` promise does (i.e. once the underlying
|
|
129
|
+
* `net.Server` has closed), or resolves once a failed bring-up has
|
|
130
|
+
* rejected `started`.
|
|
101
131
|
* - {@link port} is `undefined` until `started` resolves.
|
|
102
132
|
*/
|
|
103
133
|
export interface StartedGlspServer extends IntegratedServer {
|
|
@@ -106,17 +136,22 @@ export interface StartedGlspServer extends IntegratedServer {
|
|
|
106
136
|
/**
|
|
107
137
|
* Start a GLSP socket head. Builds the GLSP app container with framework-
|
|
108
138
|
* default `Logger` / `LoggerFactory` bindings, layers adopter modules,
|
|
109
|
-
* resolves {@link SocketServerLauncher},
|
|
139
|
+
* resolves the launcher bound to {@link SocketServerLauncher}, by default
|
|
140
|
+
* {@link HydraniumGlspSocketServerLauncher}, configures the adopter
|
|
110
141
|
* {@link ServerModule}, and starts listening.
|
|
111
142
|
*
|
|
112
143
|
* **GLSP launcher coupling.** GLSP's {@link SocketServerLauncher} owns the
|
|
113
|
-
* `net.Server` and
|
|
144
|
+
* `net.Server` and each connection's server instance;
|
|
114
145
|
* the framework wrapper composes ABOVE that launcher rather than replacing
|
|
115
146
|
* it. The framework's own `startSocketServer`
|
|
116
147
|
* helper is NOT used here — it's designed for stdio/raw-JSON-RPC heads
|
|
117
148
|
* (data-server's pattern), not GLSP's Inversify-driven per-connection
|
|
118
149
|
* server-instance model. Bridging the two would lose GLSP's action-handler
|
|
119
150
|
* registry plumbing.
|
|
151
|
+
*
|
|
152
|
+
* **Without an LSP head the launcher brings the workspace up, then
|
|
153
|
+
* listens**, as `startSocketServer` does: a diagram loaded before the
|
|
154
|
+
* bring-up starts keeps its cross-file edges missing for good.
|
|
120
155
|
*/
|
|
121
156
|
export declare function startGlspServer(options: GlspServerOptions): StartedGlspServer;
|
|
122
157
|
//# sourceMappingURL=start-glsp-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-glsp-server.d.ts","sourceRoot":"","sources":["../../src/node/start-glsp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,KAAK,MAAM,IAAI,UAAU,EACzB,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"start-glsp-server.d.ts","sourceRoot":"","sources":["../../src/node/start-glsp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,KAAK,MAAM,IAAI,UAAU,EACzB,KAAK,YAAY,EAEjB,oBAAoB,EAGtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAa,eAAe,EAAc,MAAM,WAAW,CAAC;AACnE,OAAO,EAAqE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,OAAO,EAEJ,KAAK,gBAAgB,EAErB,KAAK,oBAAoB,EAC3B,MAAM,iBAAiB,CAAC;AAMzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;GAKG;AACH,qBACa,iCAAkC,SAAQ,oBAAoB;IACxE,UAAmB,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAW5G;CACH;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,IAAI,eAAe,CAIhE;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;IACvD;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC;;;;;;;;OAQG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACrD;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAChF;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,CA+G7E"}
|
|
@@ -6,25 +6,71 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
10
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
12
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
13
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
14
|
+
};
|
|
9
15
|
import { SocketServerLauncher, createAppModule, defaultSocketLaunchOptions } from '@eclipse-glsp/server/node.js';
|
|
10
|
-
import { Container } from 'inversify';
|
|
11
|
-
import { Deferred } from '@hydranium/
|
|
16
|
+
import { Container, ContainerModule, injectable } from 'inversify';
|
|
17
|
+
import { Deferred, describeError, describeErrorWithStack, sendByMethodName } from '@hydranium/protocol';
|
|
18
|
+
import { createMessageConnection, SocketMessageReader, SocketMessageWriter } from 'vscode-jsonrpc/node';
|
|
19
|
+
import { initializeWorkspaceWithoutLsp } from '@hydranium/core';
|
|
20
|
+
import { dropNotificationsToGoneClient } from '../launcher/drop-notifications-to-gone-client.js';
|
|
21
|
+
import { createGlspConnectionLogger } from '../launcher/glsp-connection-logger.js';
|
|
12
22
|
import { createGlspFrameworkOverrides } from '../launcher/glsp-framework-overrides.js';
|
|
13
23
|
import { createGlspServerOverrides } from '../launcher/glsp-server-overrides.js';
|
|
24
|
+
import { HydraniumTypes } from '../state/hydranium-shared-core-services.js';
|
|
25
|
+
/**
|
|
26
|
+
* The default socket launcher of {@link startGlspServer}: GLSP's own,
|
|
27
|
+
* with each connection built from this package's copy of `vscode-jsonrpc`, so a
|
|
28
|
+
* framework error thrown in a handler keeps its code. The connection sends
|
|
29
|
+
* GLSP's typed messages by method name, since GLSP builds them from its copy.
|
|
30
|
+
*/
|
|
31
|
+
let HydraniumGlspSocketServerLauncher = class HydraniumGlspSocketServerLauncher extends SocketServerLauncher {
|
|
32
|
+
createConnection(socket) {
|
|
33
|
+
return dropNotificationsToGoneClient(sendByMethodName(createMessageConnection(new SocketMessageReader(socket), new SocketMessageWriter(socket), createGlspConnectionLogger(this.logger))), this.logger);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
HydraniumGlspSocketServerLauncher = __decorate([
|
|
37
|
+
injectable()
|
|
38
|
+
], HydraniumGlspSocketServerLauncher);
|
|
39
|
+
export { HydraniumGlspSocketServerLauncher };
|
|
40
|
+
/**
|
|
41
|
+
* Binds GLSP's own `SocketServerLauncher` token to
|
|
42
|
+
* {@link HydraniumGlspSocketServerLauncher}. {@link startGlspServer} loads it
|
|
43
|
+
* before the adopter's `appModules`, so an adopter replaces the launcher with
|
|
44
|
+
* `rebind`; a second `bind` makes the resolve ambiguous and the start throws.
|
|
45
|
+
* A replacement extends {@link HydraniumGlspSocketServerLauncher}: GLSP's own
|
|
46
|
+
* launcher builds its connection from GLSP's copy, so framework errors lose
|
|
47
|
+
* their code, and GLSP's typed messages throw where its packages nest
|
|
48
|
+
* separate copies.
|
|
49
|
+
*/
|
|
50
|
+
export function createGlspSocketLauncherModule() {
|
|
51
|
+
return new ContainerModule(bind => {
|
|
52
|
+
bind(SocketServerLauncher).to(HydraniumGlspSocketServerLauncher);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
14
55
|
/**
|
|
15
56
|
* Start a GLSP socket head. Builds the GLSP app container with framework-
|
|
16
57
|
* default `Logger` / `LoggerFactory` bindings, layers adopter modules,
|
|
17
|
-
* resolves {@link SocketServerLauncher},
|
|
58
|
+
* resolves the launcher bound to {@link SocketServerLauncher}, by default
|
|
59
|
+
* {@link HydraniumGlspSocketServerLauncher}, configures the adopter
|
|
18
60
|
* {@link ServerModule}, and starts listening.
|
|
19
61
|
*
|
|
20
62
|
* **GLSP launcher coupling.** GLSP's {@link SocketServerLauncher} owns the
|
|
21
|
-
* `net.Server` and
|
|
63
|
+
* `net.Server` and each connection's server instance;
|
|
22
64
|
* the framework wrapper composes ABOVE that launcher rather than replacing
|
|
23
65
|
* it. The framework's own `startSocketServer`
|
|
24
66
|
* helper is NOT used here — it's designed for stdio/raw-JSON-RPC heads
|
|
25
67
|
* (data-server's pattern), not GLSP's Inversify-driven per-connection
|
|
26
68
|
* server-instance model. Bridging the two would lose GLSP's action-handler
|
|
27
69
|
* registry plumbing.
|
|
70
|
+
*
|
|
71
|
+
* **Without an LSP head the launcher brings the workspace up, then
|
|
72
|
+
* listens**, as `startSocketServer` does: a diagram loaded before the
|
|
73
|
+
* bring-up starts keeps its cross-file edges missing for good.
|
|
28
74
|
*/
|
|
29
75
|
export function startGlspServer(options) {
|
|
30
76
|
const launchOptions = {
|
|
@@ -42,17 +88,19 @@ export function startGlspServer(options) {
|
|
|
42
88
|
// adopter's logger, so GLSP server logs flow through options.createLogger.
|
|
43
89
|
const glspAppModule = createAppModule({ ...launchOptions, consoleLog: false, fileLog: false });
|
|
44
90
|
const appContainer = new Container();
|
|
45
|
-
appContainer.load(glspAppModule, createGlspFrameworkOverrides(options.createLogger), ...(options.appModules ?? []));
|
|
46
|
-
const launcher = appContainer.
|
|
91
|
+
appContainer.load(glspAppModule, createGlspFrameworkOverrides(options.createLogger), createGlspSocketLauncherModule(), ...(options.appModules ?? []));
|
|
92
|
+
const launcher = appContainer.get(SocketServerLauncher);
|
|
47
93
|
// Passed as an additional module rather than folded into the app container:
|
|
48
94
|
// the launcher loads these into the per-connection SERVER container, which is
|
|
49
|
-
// the
|
|
50
|
-
// can be rebound.
|
|
95
|
+
// the tier where each connection gets a server of its own.
|
|
51
96
|
launcher.configure(options.serverModule, createGlspServerOverrides());
|
|
52
97
|
const started = new Deferred();
|
|
98
|
+
const stopped = new Deferred();
|
|
53
99
|
const portHandle = { port: undefined };
|
|
54
|
-
|
|
55
|
-
|
|
100
|
+
const listen = () => {
|
|
101
|
+
// `start` creates the `net.Server` and listens, so the listeners below
|
|
102
|
+
// attach to it synchronously after the call, before any event fires.
|
|
103
|
+
Promise.resolve(launcher.start(launchOptions)).then(() => stopped.resolve(), (error) => stopped.reject(error));
|
|
56
104
|
// GLSP's `SocketServerLauncher.netServer` field is `protected`; we
|
|
57
105
|
// access it via property indexing. The alternative is to fork the
|
|
58
106
|
// launcher or add a 'listening' callback to GLSP upstream.
|
|
@@ -64,7 +112,7 @@ export function startGlspServer(options) {
|
|
|
64
112
|
if (options.lspConnection && options.portCommand) {
|
|
65
113
|
options.lspConnection.onRequest(options.portCommand, () => portHandle.port);
|
|
66
114
|
}
|
|
67
|
-
lifecycle?.info(`[GlspServer] Ready to accept new client requests on port: ${address.port}`);
|
|
115
|
+
lifecycle?.info(`[GlspServer] Ready to accept new client requests on ${address.address} port: ${address.port}`);
|
|
68
116
|
started.resolve();
|
|
69
117
|
}
|
|
70
118
|
else {
|
|
@@ -75,29 +123,48 @@ export function startGlspServer(options) {
|
|
|
75
123
|
}
|
|
76
124
|
});
|
|
77
125
|
netServer.on('error', (err) => {
|
|
78
|
-
lifecycle?.error(`[GlspServer] Error: ${err
|
|
126
|
+
lifecycle?.error(`[GlspServer] Error: ${describeErrorWithStack(err)}`);
|
|
79
127
|
started.reject(err);
|
|
80
128
|
});
|
|
81
129
|
if (options.onClientConnection) {
|
|
82
130
|
netServer.on('connection', options.onClientConnection);
|
|
83
131
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
132
|
+
};
|
|
133
|
+
// The workspace manager logs a failed initialization itself; a refused
|
|
134
|
+
// `workspace` throws before `initializing` is set.
|
|
135
|
+
let initializing = false;
|
|
136
|
+
const begin = async () => {
|
|
137
|
+
const shared = appContainer.isBound(HydraniumTypes.SharedCoreServices)
|
|
138
|
+
? appContainer.get(HydraniumTypes.SharedCoreServices)
|
|
139
|
+
: undefined;
|
|
140
|
+
if (shared === undefined) {
|
|
141
|
+
throw new Error('[hydranium] startGlspServer found no shared services in its app container. Add `new HydraniumGlspAppModule({ shared })` to `appModules`.');
|
|
142
|
+
}
|
|
143
|
+
const initialization = initializeWorkspaceWithoutLsp(shared, options.workspace);
|
|
144
|
+
initializing = true;
|
|
145
|
+
await initialization;
|
|
146
|
+
initializing = false;
|
|
147
|
+
listen();
|
|
148
|
+
};
|
|
149
|
+
begin().catch((error) => {
|
|
150
|
+
if (initializing) {
|
|
151
|
+
lifecycle?.debug(`[GlspServer] Startup failed: the workspace did not initialize. ${describeError(error)}`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
lifecycle?.error(`[GlspServer] Startup failed: ${describeErrorWithStack(error)}`);
|
|
155
|
+
}
|
|
156
|
+
started.reject(error);
|
|
157
|
+
stopped.resolve();
|
|
158
|
+
});
|
|
159
|
+
// `started` is always observed internally, as `startStdioServer`'s is, so a
|
|
160
|
+
// caller that closes early and ignores it cannot crash the process.
|
|
161
|
+
void started.promise.catch(() => undefined);
|
|
162
|
+
return {
|
|
163
|
+
get port() {
|
|
164
|
+
return portHandle.port;
|
|
165
|
+
},
|
|
166
|
+
started: started.promise,
|
|
167
|
+
stopped: stopped.promise
|
|
168
|
+
};
|
|
102
169
|
}
|
|
103
170
|
//# sourceMappingURL=start-glsp-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-glsp-server.js","sourceRoot":"","sources":["../../src/node/start-glsp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF
|
|
1
|
+
{"version":3,"file":"start-glsp-server.js","sourceRoot":"","sources":["../../src/node/start-glsp-server.ts"],"names":[],"mappings":"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"}
|