@hydranium/glsp-client-theia 1.0.0-next.18 → 1.0.0-next.181
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 +36 -13
- package/lib/browser/action-dispatcher.d.ts.map +1 -1
- package/lib/browser/action-dispatcher.js.map +1 -1
- package/lib/browser/client-contribution.d.ts +82 -25
- package/lib/browser/client-contribution.d.ts.map +1 -1
- package/lib/browser/client-contribution.js +218 -53
- package/lib/browser/client-contribution.js.map +1 -1
- package/lib/browser/diagram-loader.d.ts +15 -6
- package/lib/browser/diagram-loader.d.ts.map +1 -1
- package/lib/browser/diagram-loader.js +17 -9
- package/lib/browser/diagram-loader.js.map +1 -1
- package/lib/browser/diagram-only-marker-manager.d.ts.map +1 -1
- package/lib/browser/diagram-only-marker-manager.js.map +1 -1
- package/lib/browser/diagram-widget.d.ts +31 -24
- package/lib/browser/diagram-widget.d.ts.map +1 -1
- package/lib/browser/diagram-widget.js +50 -24
- package/lib/browser/diagram-widget.js.map +1 -1
- package/lib/browser/glsp-client-theia-module.d.ts.map +1 -1
- package/lib/browser/glsp-client-theia-module.js +2 -0
- package/lib/browser/glsp-client-theia-module.js.map +1 -1
- package/lib/browser/glsp-client.d.ts +17 -0
- package/lib/browser/glsp-client.d.ts.map +1 -0
- package/lib/browser/glsp-client.js +23 -0
- package/lib/browser/glsp-client.js.map +1 -0
- package/lib/browser/glsp-diagram-manager.d.ts +44 -0
- package/lib/browser/glsp-diagram-manager.d.ts.map +1 -1
- package/lib/browser/glsp-diagram-manager.js +99 -0
- package/lib/browser/glsp-diagram-manager.js.map +1 -1
- package/lib/browser/glsp-message-service.d.ts +8 -0
- package/lib/browser/glsp-message-service.d.ts.map +1 -1
- package/lib/browser/glsp-message-service.js +8 -0
- package/lib/browser/glsp-message-service.js.map +1 -1
- package/lib/browser/glsp-saveable.d.ts +66 -0
- package/lib/browser/glsp-saveable.d.ts.map +1 -0
- package/lib/browser/glsp-saveable.js +109 -0
- package/lib/browser/glsp-saveable.js.map +1 -0
- package/lib/browser/glsp-theia-frontend-module.d.ts.map +1 -1
- package/lib/browser/glsp-theia-frontend-module.js +1 -0
- package/lib/browser/glsp-theia-frontend-module.js.map +1 -1
- package/lib/browser/hidden-bounds-updater.d.ts +2 -4
- package/lib/browser/hidden-bounds-updater.d.ts.map +1 -1
- package/lib/browser/hidden-bounds-updater.js +7 -3
- package/lib/browser/hidden-bounds-updater.js.map +1 -1
- package/lib/browser/hydranium-glsp-diagram-configuration.d.ts.map +1 -1
- package/lib/browser/hydranium-glsp-diagram-configuration.js.map +1 -1
- package/lib/browser/index.d.ts +4 -0
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +3 -0
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/status-overlay.d.ts +23 -0
- package/lib/browser/status-overlay.d.ts.map +1 -0
- package/lib/browser/status-overlay.js +52 -0
- package/lib/browser/status-overlay.js.map +1 -0
- package/lib/node/connection-container-module.js.map +1 -1
- package/lib/node/glsp-server-connection-handler.d.ts +11 -10
- package/lib/node/glsp-server-connection-handler.d.ts.map +1 -1
- package/lib/node/glsp-server-connection-handler.js +12 -15
- package/lib/node/glsp-server-connection-handler.js.map +1 -1
- package/lib/testing/bind-recorder.js.map +1 -1
- package/package.json +28 -26
- package/src/browser/client-contribution.ts +243 -54
- package/src/browser/diagram-loader.ts +18 -11
- package/src/browser/diagram-widget.ts +58 -27
- package/src/browser/glsp-client-theia-module.ts +3 -1
- package/src/browser/glsp-client.ts +20 -0
- package/src/browser/glsp-diagram-manager.ts +113 -1
- package/src/browser/glsp-message-service.ts +8 -0
- package/src/browser/glsp-saveable.ts +110 -0
- package/src/browser/glsp-theia-frontend-module.ts +2 -1
- package/src/browser/hidden-bounds-updater.ts +5 -6
- package/src/browser/index.ts +8 -0
- package/src/browser/status-overlay.ts +43 -0
- package/src/node/glsp-server-connection-handler.ts +12 -14
- package/style/diagram-loading.css +2 -5
package/README.md
CHANGED
|
@@ -21,7 +21,9 @@ if you are mounting a hydranium GLSP diagram in a Theia application.
|
|
|
21
21
|
- **`createGlspClientTheiaModule(context, options)`** — the standard per-diagram
|
|
22
22
|
bindings, all unconditional: the cross-head `ChannelLogger`,
|
|
23
23
|
`HydraniumGlspActionDispatcher`, `HydraniumDiagramLoader`,
|
|
24
|
-
`HydraniumHiddenBoundsUpdater`,
|
|
24
|
+
`HydraniumHiddenBoundsUpdater`, `HydraniumGlspMessageService`, and
|
|
25
|
+
`HydraniumStatusOverlay`, which keeps GLSP's status overlay on the page after
|
|
26
|
+
sprotty's first render replaces the diagram's base div. Each
|
|
25
27
|
replaces a GLSP default with a strict superset of its behaviour, so a head that
|
|
26
28
|
wants the original rebinds that one token back.
|
|
27
29
|
- **Loading feedback that cannot silently vanish.** `HydraniumDiagramLoader`
|
|
@@ -47,12 +49,34 @@ if you are mounting a hydranium GLSP diagram in a Theia application.
|
|
|
47
49
|
`NoOpExternalMarkerManager` instead: markers still decorate the diagram, but
|
|
48
50
|
Theia's Problems view stops double-listing them.
|
|
49
51
|
**`AbstractHydraniumGlspDiagramManager`** derives the language-correlated
|
|
50
|
-
getters from one descriptor plus a label
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
getters from one descriptor plus a label, and `reopen` replaces a diagram
|
|
53
|
+
with a fresh widget in the same tab position, as the Retry of a failed load
|
|
54
|
+
does. It reopens every diagram when their client is lost, and a failed one
|
|
55
|
+
when a client starts.
|
|
56
|
+
- **`HydraniumGlspClientContribution`** — for a server that starts late: it
|
|
57
|
+
defers `start` until a workspace is open, fails a start that takes longer than
|
|
58
|
+
`startupTimeoutMs` (30 s by default), and starts a fresh client after a failed
|
|
59
|
+
start or a lost connection, after a delay that grows while clients keep
|
|
60
|
+
failing, reporting each attempt through `client-theia`'s
|
|
61
|
+
`ConnectionReporter`. `onDidStartClient` and `onDidLoseClient` announce each
|
|
62
|
+
client, and each start and loss is logged to the application-scope
|
|
63
|
+
`ChannelLogger` an adopter binds with `bindChannelLogger`. Its client is
|
|
64
|
+
`HydraniumGlspClient`, which ends a session without the server once the
|
|
65
|
+
connection is gone.
|
|
66
|
+
- **`HydraniumGlspSaveable`** — the diagram widget's saveable. Each save is a
|
|
67
|
+
`RequestSaveModelAction` the server answers: the save resolves on its own
|
|
68
|
+
response, and rejects on its own rejection or after 10 s rather than GLSP's
|
|
69
|
+
2 s. It stays dirty while a save is pending, so Theia's exit check still
|
|
70
|
+
counts it. The server answers through
|
|
71
|
+
`HydraniumGlspRequestSaveModelActionHandler`, which
|
|
72
|
+
`AbstractHydraniumGlspDiagramModule` registers; against a server that does
|
|
73
|
+
not advertise the request, the saveable behaves as GLSP's does. The dirty
|
|
74
|
+
flag follows the server, so an edit whose dirty state has not arrived when
|
|
75
|
+
Save All runs is not saved. Under the `fire-and-forget` `SaveDeliveryPolicy`
|
|
76
|
+
the server answers before the disk write finishes, and answers a failed
|
|
77
|
+
write as saved.
|
|
54
78
|
- **Backend (`./node`)** — `GlspServerConnectionHandler` (the socket bridge,
|
|
55
|
-
|
|
79
|
+
over `@hydranium/client-theia`'s `SocketChannelForwarder`) and
|
|
56
80
|
`createGlspConnectionContainerModule(handler)` for the frontend-scoped module
|
|
57
81
|
boilerplate.
|
|
58
82
|
|
|
@@ -73,7 +97,6 @@ hydranium GLSP server. The declared peer dependencies are:
|
|
|
73
97
|
| `@hydranium/client-theia` | `^1.0.0-next` |
|
|
74
98
|
| `@hydranium/protocol` | `^1.0.0-next` |
|
|
75
99
|
| `@theia/core` | `^1.70.0` |
|
|
76
|
-
| `@theia/output` | `^1.70.0` |
|
|
77
100
|
| `@theia/process` | `^1.70.0` |
|
|
78
101
|
| `@theia/workspace` | `^1.70.0` |
|
|
79
102
|
| `inversify` | `^6.0.0` |
|
|
@@ -107,12 +130,12 @@ stylesheet loaded afterwards.
|
|
|
107
130
|
|
|
108
131
|
## Entry points
|
|
109
132
|
|
|
110
|
-
| Subpath | Holds
|
|
111
|
-
| ----------- |
|
|
112
|
-
| `.` | Re-exports `./browser` — the larger of the two tiers and safe to load anywhere.
|
|
113
|
-
| `./browser` | The frontend module bases, `createGlspClientTheiaModule`, the dispatcher, loader, widget, bounds updater, message service, diagram manager and configuration bases, `NoOpExternalMarkerManager`
|
|
114
|
-
| `./node` | `GlspServerConnectionHandler`, `createGlspConnectionContainerModule`
|
|
115
|
-
| `./testing` | `makeBindRecorder`, the GLSP-module-specific Inversify double (the cross-head doubles live in `@hydranium/client-theia/testing`)
|
|
133
|
+
| Subpath | Holds | Environment |
|
|
134
|
+
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
|
|
135
|
+
| `.` | Re-exports `./browser` — the larger of the two tiers and safe to load anywhere. | browser-neutral (gated) |
|
|
136
|
+
| `./browser` | The frontend module bases, `createGlspClientTheiaModule`, the dispatcher, loader, widget and its saveable, bounds updater, message service, diagram manager and configuration bases, `NoOpExternalMarkerManager` | browser / Theia frontend (gated) |
|
|
137
|
+
| `./node` | `GlspServerConnectionHandler`, `createGlspConnectionContainerModule` | Node / Theia backend |
|
|
138
|
+
| `./testing` | `makeBindRecorder`, the GLSP-module-specific Inversify double (the cross-head doubles live in `@hydranium/client-theia/testing`) | browser-neutral (gated) |
|
|
116
139
|
|
|
117
140
|
Every subpath also has a `./lib/<name>` twin for consumers on
|
|
118
141
|
`moduleResolution: "Node"`. "Gated" means the repository's neutral-bundle check
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-dispatcher.d.ts","sourceRoot":"","sources":["../../src/browser/action-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,KAAK,MAAM,EAEX,oBAAoB,EAmBtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAiB,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;qCAGqC;AACrC,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAe7D,CAAC;AAEH;;gEAEgE;AAChE,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAInE,CAAC;AAEH;;6EAE6E;AAC7E,MAAM,WAAW,oCAAoC;IAClD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D;+DAC2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,qBACa,6BAA8B,SAAQ,oBAAoB;IAC7C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAG,aAAa,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAG,MAAM,CAAC;IAE1D,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjE,SAAS,CAAC,WAAW,SAAK;IAC1B,wEAAwE;IACxE,SAAS,CAAC,WAAW;YAAyB,MAAM;eAAS,MAAM;OAAM;IACzE,wFAAwF;IACxF,SAAS,CAAC,aAAa;YAA+B,MAAM;eAAS,MAAM;SAAO;
|
|
1
|
+
{"version":3,"file":"action-dispatcher.d.ts","sourceRoot":"","sources":["../../src/browser/action-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EACJ,KAAK,MAAM,EAEX,oBAAoB,EAmBtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAiB,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD;;;qCAGqC;AACrC,eAAO,MAAM,8BAA8B,EAAE,WAAW,CAAC,MAAM,CAe7D,CAAC;AAEH;;gEAEgE;AAChE,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAInE,CAAC;AAEH;;6EAE6E;AAC7E,MAAM,WAAW,oCAAoC;IAClD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D;+DAC2D;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAClD;AAED;;;;;;;;;;GAUG;AACH,qBACa,6BAA8B,SAAQ,oBAAoB;IAC7C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAG,aAAa,CAAC;IAC3C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAG,MAAM,CAAC;IAE1D,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjE,SAAS,CAAC,WAAW,SAAK;IAC1B,wEAAwE;IACxE,SAAS,CAAC,WAAW;YAAyB,MAAM;eAAS,MAAM;OAAM;IACzE,wFAAwF;IACxF,SAAS,CAAC,aAAa;YAA+B,MAAM;eAAS,MAAM;SAAO;IAElF,YAAyB,OAAO,CAAC,EAAE,oCAAoC,EAWtE;IAEQ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,kBAAkB,IAAI,IAAI,CAMnC;IAEQ,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/C;IAED,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAYxC;IAED,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAgBtE;IAED;gFAC4E;IAC5E,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA+B1C;IAED,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAGrE;IAED,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmC1C;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-dispatcher.js","sourceRoot":"","sources":["../../src/browser/action-dispatcher.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;AAElF,iDAsB8B;AAC9B,iEAAmF;AAEnF,4DAA6E;AAE7E;;;qCAGqC;AACxB,QAAA,8BAA8B,GAAwB,IAAI,GAAG,CAAS;IAChF,uBAAc,CAAC,IAAI;IACnB,0BAAiB,CAAC,IAAI;IACtB,4BAAmB,CAAC,IAAI;IACxB,6BAAoB,CAAC,IAAI;IACzB,4BAAmB,CAAC,IAAI;IACxB,0BAAiB,CAAC,IAAI;IACtB,yBAAgB,CAAC,IAAI;IACrB,2BAAkB,CAAC,IAAI;IACvB,qBAAY,CAAC,IAAI;IACjB,sBAAa,CAAC,IAAI;IAClB,qBAAY,CAAC,IAAI;IACjB,8BAAqB,CAAC,IAAI;IAC1B,2BAAkB,CAAC,IAAI;IACvB,+BAAsB,CAAC,IAAI;CAC7B,CAAC,CAAC;AAEH;;gEAEgE;AACnD,QAAA,4BAA4B,GAAgC,IAAI,GAAG,CAAiB;IAC9F,CAAC,2BAAkB,CAAC,IAAI,EAAE,uBAAc,CAAC,IAAI,CAAC;IAC9C,CAAC,+BAAsB,CAAC,IAAI,EAAE,2BAAkB,CAAC,IAAI,CAAC;IACtD,CAAC,4BAAmB,CAAC,IAAI,EAAE,6BAAoB,CAAC,IAAI,CAAC;CACvD,CAAC,CAAC;AAaH;;;;;;;;;;GAUG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,6BAAoB;IAC1B,OAAO,CAAiB;IACxB,MAAM,CAAU;IAEvC,WAAW,CAAsB;IACjC,SAAS,CAA8B;IACvC,gBAAgB,CAA8B;IAEvD,WAAW,GAAG,CAAC,CAAC;IAC1B,wEAAwE;IAC9D,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAC;IACzE,wFAAwF;IAC9E,aAAa,GAAG,IAAI,GAAG,EAAgD,CAAC;IAElF,YAAyB,OAA8C;QACpE,KAAK,EAAE,CAAC;QACR,MAAM,WAAW,GAAG,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"action-dispatcher.js","sourceRoot":"","sources":["../../src/browser/action-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,48 +6,105 @@
|
|
|
6
6
|
*
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
|
-
import { type GLSPClient } from '@eclipse-glsp/client';
|
|
9
|
+
import { type GLSPClient, type InitializeResult } from '@eclipse-glsp/client';
|
|
10
10
|
import { BaseGLSPClientContribution } from '@eclipse-glsp/theia-integration';
|
|
11
|
-
import {
|
|
11
|
+
import { ChannelLogger, ConnectionReporter, type ConnectionTarget } from '@hydranium/client-theia/lib/browser';
|
|
12
|
+
import { type Channel, Emitter, Event } from '@theia/core';
|
|
13
|
+
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
12
14
|
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* interleave); the ready marker is a server-printed substring that signals
|
|
16
|
-
* "the GLSP server is accepting client connections". */
|
|
15
|
+
export declare const DEFAULT_GLSP_CLIENT_STARTUP_TIMEOUT_MS = 30000;
|
|
16
|
+
/** Options for `HydraniumGlspClientContribution`. */
|
|
17
17
|
export interface ClientContributionOptions {
|
|
18
18
|
readonly languageContributionId: string;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
/** How long a start may take, from the workspace opening to the server
|
|
20
|
+
* answering `initializeServer`, before it fails; `0` or less waits for good. */
|
|
21
|
+
readonly startupTimeoutMs?: number;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Theia GLSP client contribution for adopters whose GLSP server runs in a
|
|
24
25
|
* sideloaded VS Code extension process (or any other deferred-start setup).
|
|
25
|
-
* The behaviours adopters reliably need are lifted:
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* "connecting" progress spinner) from firing prematurely.
|
|
27
|
+
* The client starts once a workspace is open and sends its first request at
|
|
28
|
+
* once; the backend handler holds it until its socket to the server is up. A
|
|
29
|
+
* start that fails, and a connection lost after one succeeded, start a fresh
|
|
30
|
+
* client after a backoff, for as long as the contribution lives. Each start is
|
|
31
|
+
* reported through the {@link ConnectionReporter}, and announced through
|
|
32
|
+
* {@link onDidStartClient} and {@link onDidLoseClient}.
|
|
34
33
|
*
|
|
35
34
|
* A `GLSPClient` override filtering inbound messages by clientId is
|
|
36
35
|
* deliberately NOT provided: upstream's `BaseJsonrpcGLSPClient.onActionMessage`
|
|
37
|
-
* already filters by clientId
|
|
38
|
-
* `BaseGLSPClientContribution.createGLSPClient` is correct as-is.
|
|
36
|
+
* already filters by clientId.
|
|
39
37
|
*/
|
|
40
38
|
export declare class HydraniumGlspClientContribution extends BaseGLSPClientContribution {
|
|
41
|
-
protected outputChannelManager: OutputChannelManager;
|
|
42
39
|
protected readonly workspaceService: WorkspaceService;
|
|
40
|
+
protected readonly connectionReporter: ConnectionReporter;
|
|
41
|
+
protected readonly logger: ChannelLogger;
|
|
43
42
|
readonly id: string;
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
/** Delay before the restart following each consecutive failed start or lost
|
|
44
|
+
* client; the last repeats. */
|
|
45
|
+
protected readonly restartDelaysMs: readonly number[];
|
|
46
|
+
/** How long a client must stay up before the restart delays start over, so
|
|
47
|
+
* a server that fails right after starting is not restarted at once. */
|
|
48
|
+
protected readonly restartEscalationResetMs: number;
|
|
49
|
+
protected consecutiveFailures: number;
|
|
50
|
+
protected restartTimer?: ReturnType<typeof setTimeout>;
|
|
51
|
+
/** When the current client started; `0` once a restart has taken it into account. */
|
|
52
|
+
protected startedAt: number;
|
|
53
|
+
/** Clients started so far, which numbers them in the log: they share {@link id}. */
|
|
54
|
+
protected startedClients: number;
|
|
55
|
+
/** The attempt waiting for a channel, if any. */
|
|
56
|
+
protected channelRequest?: Deferred<Channel>;
|
|
57
|
+
protected disposed: boolean;
|
|
58
|
+
protected readonly clientStartedEmitter: Emitter<GLSPClient>;
|
|
59
|
+
protected readonly clientLostEmitter: Emitter<void>;
|
|
60
|
+
/** Fires with each client once it has started and its server has answered. */
|
|
61
|
+
readonly onDidStartClient: Event<GLSPClient>;
|
|
62
|
+
/** Fires when the started client stops; {@link glspClient} already waits
|
|
63
|
+
* for its replacement then. */
|
|
64
|
+
readonly onDidLoseClient: Event<void>;
|
|
46
65
|
constructor(options: ClientContributionOptions);
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
66
|
+
/** The client every diagram load awaits; after a failed start, a fresh one. */
|
|
67
|
+
get glspClient(): Promise<GLSPClient>;
|
|
68
|
+
/** Start a fresh client over a fresh channel at once, if the last start failed. */
|
|
69
|
+
restart(): Promise<GLSPClient>;
|
|
70
|
+
/** Point {@link glspClient} at a fresh client still to start, and tear down
|
|
71
|
+
* the old one's channel. */
|
|
72
|
+
protected replaceClient(): void;
|
|
73
|
+
/** Settles the promise current when it began, so a start a restart overtook
|
|
74
|
+
* cannot settle its successor. */
|
|
75
|
+
protected activateClient(): Promise<void>;
|
|
76
|
+
/** Run `restart` after the delay for the failures so far, and return that delay. */
|
|
77
|
+
protected scheduleRestart(restart: () => void): number;
|
|
78
|
+
/** Once `client` stops, replace it and start its replacement after the
|
|
79
|
+
* restart delay, unless a dispose stopped it. */
|
|
80
|
+
protected restartOnLoss(client: GLSPClient): void;
|
|
81
|
+
/** Start the client and initialize its server, rejecting on failure; the
|
|
82
|
+
* caller settles {@link glspClient}. */
|
|
51
83
|
protected start(glspClient: GLSPClient): Promise<void>;
|
|
84
|
+
/** Without upstream's own error notification, which would duplicate the reporter's. */
|
|
85
|
+
protected initialize(glspClient: GLSPClient): Promise<InitializeResult>;
|
|
86
|
+
/** Upstream's base client, without the notifications of its Theia subclass,
|
|
87
|
+
* which would duplicate the reporter's. */
|
|
88
|
+
protected createGLSPClient(connectionProvider: Parameters<BaseGLSPClientContribution['createGLSPClient']>[0]): Promise<GLSPClient>;
|
|
89
|
+
/**
|
|
90
|
+
* Whichever channel arrives goes to the attempt waiting now, and one that
|
|
91
|
+
* arrives with none waiting is closed. Theia holds each open until its
|
|
92
|
+
* websocket is back, and after an outage every held open past the first
|
|
93
|
+
* throws "already open" without reaching its handler, so the first to arrive
|
|
94
|
+
* has to serve the latest attempt. Without Theia's replay, which would be a
|
|
95
|
+
* second opener of the same path.
|
|
96
|
+
*/
|
|
97
|
+
protected createChannelConnection(): ReturnType<BaseGLSPClientContribution['createChannelConnection']>;
|
|
98
|
+
/** Also closes the channel: upstream leaves a Theia channel open, and the
|
|
99
|
+
* next one on the same path then cannot open. */
|
|
100
|
+
protected disposeChannel(connection: Parameters<BaseGLSPClientContribution['disposeChannel']>[0], channel: Channel): Promise<void>;
|
|
101
|
+
/** Also fails a start in flight, so nothing reports it after this. */
|
|
102
|
+
dispose(): void;
|
|
103
|
+
protected workspaceOpened(): Promise<void>;
|
|
104
|
+
protected get connectionTarget(): ConnectionTarget;
|
|
105
|
+
/** One object per contribution: the reporter keys what it has shown on it. */
|
|
106
|
+
protected cachedConnectionTarget?: ConnectionTarget;
|
|
107
|
+
protected unreachableMessage(): string;
|
|
108
|
+
protected startupTimeoutMessage(): string;
|
|
52
109
|
}
|
|
53
110
|
//# sourceMappingURL=client-contribution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/client-contribution.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,
|
|
1
|
+
{"version":3,"file":"client-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/client-contribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,89 +20,254 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
20
20
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.HydraniumGlspClientContribution = void 0;
|
|
23
|
+
exports.HydraniumGlspClientContribution = exports.DEFAULT_GLSP_CLIENT_STARTUP_TIMEOUT_MS = void 0;
|
|
24
|
+
const client_1 = require("@eclipse-glsp/client");
|
|
24
25
|
const theia_integration_1 = require("@eclipse-glsp/theia-integration");
|
|
26
|
+
const common_1 = require("@eclipse-glsp/theia-integration/lib/common");
|
|
27
|
+
const browser_1 = require("@hydranium/client-theia/lib/browser");
|
|
28
|
+
const core_1 = require("@theia/core");
|
|
25
29
|
const promise_util_1 = require("@theia/core/lib/common/promise-util");
|
|
26
30
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
27
|
-
const
|
|
28
|
-
const
|
|
31
|
+
const browser_2 = require("@theia/workspace/lib/browser");
|
|
32
|
+
const glsp_client_1 = require("./glsp-client");
|
|
33
|
+
exports.DEFAULT_GLSP_CLIENT_STARTUP_TIMEOUT_MS = 30_000;
|
|
29
34
|
/**
|
|
30
35
|
* Theia GLSP client contribution for adopters whose GLSP server runs in a
|
|
31
36
|
* sideloaded VS Code extension process (or any other deferred-start setup).
|
|
32
|
-
* The behaviours adopters reliably need are lifted:
|
|
33
37
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* "connecting" progress spinner) from firing prematurely.
|
|
38
|
+
* The client starts once a workspace is open and sends its first request at
|
|
39
|
+
* once; the backend handler holds it until its socket to the server is up. A
|
|
40
|
+
* start that fails, and a connection lost after one succeeded, start a fresh
|
|
41
|
+
* client after a backoff, for as long as the contribution lives. Each start is
|
|
42
|
+
* reported through the {@link ConnectionReporter}, and announced through
|
|
43
|
+
* {@link onDidStartClient} and {@link onDidLoseClient}.
|
|
41
44
|
*
|
|
42
45
|
* A `GLSPClient` override filtering inbound messages by clientId is
|
|
43
46
|
* deliberately NOT provided: upstream's `BaseJsonrpcGLSPClient.onActionMessage`
|
|
44
|
-
* already filters by clientId
|
|
45
|
-
* `BaseGLSPClientContribution.createGLSPClient` is correct as-is.
|
|
47
|
+
* already filters by clientId.
|
|
46
48
|
*/
|
|
47
49
|
let HydraniumGlspClientContribution = class HydraniumGlspClientContribution extends theia_integration_1.BaseGLSPClientContribution {
|
|
48
|
-
outputChannelManager;
|
|
49
50
|
workspaceService;
|
|
51
|
+
connectionReporter;
|
|
52
|
+
logger;
|
|
50
53
|
id;
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
/** Delay before the restart following each consecutive failed start or lost
|
|
55
|
+
* client; the last repeats. */
|
|
56
|
+
restartDelaysMs = [1_000, 2_000, 4_000, 8_000];
|
|
57
|
+
/** How long a client must stay up before the restart delays start over, so
|
|
58
|
+
* a server that fails right after starting is not restarted at once. */
|
|
59
|
+
restartEscalationResetMs = 30_000;
|
|
60
|
+
consecutiveFailures = 0;
|
|
61
|
+
restartTimer;
|
|
62
|
+
/** When the current client started; `0` once a restart has taken it into account. */
|
|
63
|
+
startedAt = 0;
|
|
64
|
+
/** Clients started so far, which numbers them in the log: they share {@link id}. */
|
|
65
|
+
startedClients = 0;
|
|
66
|
+
/** The attempt waiting for a channel, if any. */
|
|
67
|
+
channelRequest;
|
|
68
|
+
disposed = false;
|
|
69
|
+
clientStartedEmitter = new core_1.Emitter();
|
|
70
|
+
clientLostEmitter = new core_1.Emitter();
|
|
71
|
+
/** Fires with each client once it has started and its server has answered. */
|
|
72
|
+
onDidStartClient = this.clientStartedEmitter.event;
|
|
73
|
+
/** Fires when the started client stops; {@link glspClient} already waits
|
|
74
|
+
* for its replacement then. */
|
|
75
|
+
onDidLoseClient = this.clientLostEmitter.event;
|
|
53
76
|
constructor(options) {
|
|
54
77
|
super();
|
|
55
78
|
this.id = options.languageContributionId;
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
79
|
+
this.glspClientStartupTimeout = options.startupTimeoutMs ?? exports.DEFAULT_GLSP_CLIENT_STARTUP_TIMEOUT_MS;
|
|
80
|
+
}
|
|
81
|
+
/** The client every diagram load awaits; after a failed start, a fresh one. */
|
|
82
|
+
get glspClient() {
|
|
83
|
+
return this.glspClientDeferred.state === 'rejected' ? this.restart() : this.glspClientDeferred.promise;
|
|
84
|
+
}
|
|
85
|
+
/** Start a fresh client over a fresh channel at once, if the last start failed. */
|
|
86
|
+
restart() {
|
|
87
|
+
if (!this.disposed && this.glspClientDeferred.state === 'rejected') {
|
|
88
|
+
this.replaceClient();
|
|
89
|
+
void this.activateClient();
|
|
90
|
+
}
|
|
91
|
+
return this.glspClientDeferred.promise;
|
|
92
|
+
}
|
|
93
|
+
/** Point {@link glspClient} at a fresh client still to start, and tear down
|
|
94
|
+
* the old one's channel. */
|
|
95
|
+
replaceClient() {
|
|
96
|
+
clearTimeout(this.restartTimer);
|
|
97
|
+
// Replaced before the old channel goes, so the old client stopping is
|
|
98
|
+
// not taken for a loss of the new one.
|
|
99
|
+
this.glspClientDeferred = new promise_util_1.Deferred();
|
|
100
|
+
this.toDispose.dispose();
|
|
101
|
+
// Upstream refuses to open a channel while the collection is disposed.
|
|
102
|
+
this.toDispose.push(core_1.Disposable.NULL);
|
|
103
|
+
}
|
|
104
|
+
/** Settles the promise current when it began, so a start a restart overtook
|
|
105
|
+
* cannot settle its successor. */
|
|
106
|
+
async activateClient() {
|
|
107
|
+
const pending = this.glspClientDeferred;
|
|
108
|
+
await this.workspaceOpened();
|
|
109
|
+
if (this.disposed) {
|
|
66
110
|
return;
|
|
67
111
|
}
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
112
|
+
const attempt = this.connectionReporter.connecting(this.connectionTarget);
|
|
113
|
+
const timeout = this.glspClientStartupTimeout > 0
|
|
114
|
+
? setTimeout(() => pending.reject(new Error(this.startupTimeoutMessage())), this.glspClientStartupTimeout)
|
|
115
|
+
: undefined;
|
|
116
|
+
pending.promise.then(client => {
|
|
117
|
+
clearTimeout(timeout);
|
|
118
|
+
attempt.connected();
|
|
119
|
+
this.startedAt = Date.now();
|
|
120
|
+
this.logger.info(`[${this.id}] Diagram client ${++this.startedClients} started.`);
|
|
121
|
+
this.clientStartedEmitter.fire(client);
|
|
122
|
+
this.restartOnLoss(client);
|
|
123
|
+
}, (error) => {
|
|
124
|
+
clearTimeout(timeout);
|
|
125
|
+
if (this.disposed) {
|
|
126
|
+
attempt.cancelled();
|
|
127
|
+
return;
|
|
74
128
|
}
|
|
129
|
+
attempt.failed(error instanceof Error ? error.message : String(error), () => void this.restart());
|
|
130
|
+
this.scheduleRestart(() => {
|
|
131
|
+
if (this.glspClientDeferred === pending) {
|
|
132
|
+
void this.restart();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
75
135
|
});
|
|
76
|
-
|
|
136
|
+
try {
|
|
137
|
+
const connection = await this.createConnection();
|
|
138
|
+
// Ahead of the client's own listener, whose teardown rejects with a
|
|
139
|
+
// transport message instead.
|
|
140
|
+
connection.onClose(() => pending.reject(new Error(this.unreachableMessage())));
|
|
141
|
+
const client = await this.createGLSPClient(connection);
|
|
142
|
+
connection.onDispose(() => client.stop());
|
|
143
|
+
await this.start(client);
|
|
144
|
+
pending.resolve(client);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
pending.reject(error);
|
|
148
|
+
}
|
|
77
149
|
}
|
|
150
|
+
/** Run `restart` after the delay for the failures so far, and return that delay. */
|
|
151
|
+
scheduleRestart(restart) {
|
|
152
|
+
if (this.startedAt > 0 && Date.now() - this.startedAt >= this.restartEscalationResetMs) {
|
|
153
|
+
this.consecutiveFailures = 0;
|
|
154
|
+
}
|
|
155
|
+
this.startedAt = 0;
|
|
156
|
+
const delay = this.restartDelaysMs[Math.min(this.consecutiveFailures, this.restartDelaysMs.length - 1)];
|
|
157
|
+
this.consecutiveFailures++;
|
|
158
|
+
clearTimeout(this.restartTimer);
|
|
159
|
+
this.restartTimer = setTimeout(restart, delay);
|
|
160
|
+
return delay;
|
|
161
|
+
}
|
|
162
|
+
/** Once `client` stops, replace it and start its replacement after the
|
|
163
|
+
* restart delay, unless a dispose stopped it. */
|
|
164
|
+
restartOnLoss(client) {
|
|
165
|
+
const listener = client.onCurrentStateChanged(state => {
|
|
166
|
+
if (state !== client_1.ClientState.ServerError && state !== client_1.ClientState.Stopped) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
listener.dispose();
|
|
170
|
+
if (!this.disposed) {
|
|
171
|
+
this.replaceClient();
|
|
172
|
+
this.clientLostEmitter.fire();
|
|
173
|
+
const delay = this.scheduleRestart(() => void this.activateClient());
|
|
174
|
+
// Upstream's client has just logged that it will not be restarted, which holds for it alone.
|
|
175
|
+
this.logger.info(`[${this.id}] Diagram client ${this.startedClients} lost; starting a fresh one in ${delay} ms.`);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/** Start the client and initialize its server, rejecting on failure; the
|
|
180
|
+
* caller settles {@link glspClient}. */
|
|
78
181
|
async start(glspClient) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
182
|
+
await glspClient.start();
|
|
183
|
+
await this.initialize(glspClient);
|
|
184
|
+
}
|
|
185
|
+
/** Without upstream's own error notification, which would duplicate the reporter's. */
|
|
186
|
+
async initialize(glspClient) {
|
|
187
|
+
return glspClient.initializeServer(await this.createInitializeParameters());
|
|
188
|
+
}
|
|
189
|
+
/** Upstream's base client, without the notifications of its Theia subclass,
|
|
190
|
+
* which would duplicate the reporter's. */
|
|
191
|
+
async createGLSPClient(connectionProvider) {
|
|
192
|
+
return new glsp_client_1.HydraniumGlspClient({ id: this.id, connectionProvider });
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Whichever channel arrives goes to the attempt waiting now, and one that
|
|
196
|
+
* arrives with none waiting is closed. Theia holds each open until its
|
|
197
|
+
* websocket is back, and after an outage every held open past the first
|
|
198
|
+
* throws "already open" without reaching its handler, so the first to arrive
|
|
199
|
+
* has to serve the latest attempt. Without Theia's replay, which would be a
|
|
200
|
+
* second opener of the same path.
|
|
201
|
+
*/
|
|
202
|
+
async createChannelConnection() {
|
|
203
|
+
this.channelRequest?.reject(new Error('A newer start took over the channel request.'));
|
|
204
|
+
const request = new promise_util_1.Deferred();
|
|
205
|
+
this.channelRequest = request;
|
|
206
|
+
this.connectionProvider.listen(common_1.GLSPContribution.getPath(this), (_path, channel) => {
|
|
207
|
+
const waiting = this.channelRequest;
|
|
208
|
+
this.channelRequest = undefined;
|
|
209
|
+
if (waiting && !this.disposed) {
|
|
210
|
+
waiting.resolve(channel);
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
channel.close();
|
|
214
|
+
}
|
|
215
|
+
}, false);
|
|
216
|
+
const channel = await request.promise;
|
|
217
|
+
const connection = (0, common_1.createChannelConnection)(channel);
|
|
218
|
+
this.toDispose.push(core_1.Disposable.create(() => this.disposeChannel(connection, channel)));
|
|
219
|
+
return connection;
|
|
220
|
+
}
|
|
221
|
+
/** Also closes the channel: upstream leaves a Theia channel open, and the
|
|
222
|
+
* next one on the same path then cannot open. */
|
|
223
|
+
async disposeChannel(connection, channel) {
|
|
224
|
+
await super.disposeChannel(connection, channel);
|
|
225
|
+
channel.close();
|
|
226
|
+
}
|
|
227
|
+
/** Also fails a start in flight, so nothing reports it after this. */
|
|
228
|
+
dispose() {
|
|
229
|
+
this.disposed = true;
|
|
230
|
+
clearTimeout(this.restartTimer);
|
|
231
|
+
this.glspClientDeferred.promise.catch(() => undefined);
|
|
232
|
+
this.glspClientDeferred.reject(new Error('The diagram client was disposed.'));
|
|
233
|
+
this.clientStartedEmitter.dispose();
|
|
234
|
+
this.clientLostEmitter.dispose();
|
|
235
|
+
super.dispose();
|
|
236
|
+
}
|
|
237
|
+
async workspaceOpened() {
|
|
82
238
|
const roots = this.workspaceService.tryGetRoots();
|
|
83
|
-
if (
|
|
84
|
-
await
|
|
85
|
-
const disposable = this.workspaceService.onWorkspaceChanged(changedRoots => {
|
|
86
|
-
if (changedRoots && changedRoots.length > 0) {
|
|
87
|
-
disposable.dispose();
|
|
88
|
-
resolve();
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
});
|
|
239
|
+
if (roots.length === 0) {
|
|
240
|
+
await core_1.Event.toPromise(core_1.Event.filter(this.workspaceService.onWorkspaceChanged, changedRoots => changedRoots.length > 0));
|
|
92
241
|
}
|
|
93
|
-
|
|
94
|
-
|
|
242
|
+
}
|
|
243
|
+
get connectionTarget() {
|
|
244
|
+
return (this.cachedConnectionTarget ??= {
|
|
245
|
+
connectingMessage: core_1.nls.localize('hydranium/glsp-client-theia/diagram-server-connecting', 'Connecting to the diagram server…'),
|
|
246
|
+
connectedMessage: core_1.nls.localize('hydranium/glsp-client-theia/diagram-server-connected', 'Connected to the diagram server.')
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/** One object per contribution: the reporter keys what it has shown on it. */
|
|
250
|
+
cachedConnectionTarget;
|
|
251
|
+
unreachableMessage() {
|
|
252
|
+
return core_1.nls.localize('hydranium/glsp-client-theia/diagram-server-unreachable', 'Could not connect to the diagram server.');
|
|
253
|
+
}
|
|
254
|
+
startupTimeoutMessage() {
|
|
255
|
+
return core_1.nls.localize('hydranium/glsp-client-theia/diagram-server-timeout', 'The diagram server did not answer within {0} seconds.', String(Math.round(this.glspClientStartupTimeout / 1000)));
|
|
95
256
|
}
|
|
96
257
|
};
|
|
97
258
|
exports.HydraniumGlspClientContribution = HydraniumGlspClientContribution;
|
|
98
259
|
__decorate([
|
|
99
|
-
(0, inversify_1.inject)(
|
|
100
|
-
__metadata("design:type",
|
|
101
|
-
], HydraniumGlspClientContribution.prototype, "outputChannelManager", void 0);
|
|
102
|
-
__decorate([
|
|
103
|
-
(0, inversify_1.inject)(browser_1.WorkspaceService),
|
|
104
|
-
__metadata("design:type", browser_1.WorkspaceService)
|
|
260
|
+
(0, inversify_1.inject)(browser_2.WorkspaceService),
|
|
261
|
+
__metadata("design:type", browser_2.WorkspaceService)
|
|
105
262
|
], HydraniumGlspClientContribution.prototype, "workspaceService", void 0);
|
|
263
|
+
__decorate([
|
|
264
|
+
(0, inversify_1.inject)(browser_1.ConnectionReporter),
|
|
265
|
+
__metadata("design:type", Object)
|
|
266
|
+
], HydraniumGlspClientContribution.prototype, "connectionReporter", void 0);
|
|
267
|
+
__decorate([
|
|
268
|
+
(0, inversify_1.inject)(browser_1.ChannelLogger),
|
|
269
|
+
__metadata("design:type", browser_1.ChannelLogger)
|
|
270
|
+
], HydraniumGlspClientContribution.prototype, "logger", void 0);
|
|
106
271
|
exports.HydraniumGlspClientContribution = HydraniumGlspClientContribution = __decorate([
|
|
107
272
|
(0, inversify_1.injectable)(),
|
|
108
273
|
__param(0, (0, inversify_1.unmanaged)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-contribution.js","sourceRoot":"","sources":["../../src/browser/client-contribution.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"client-contribution.js","sourceRoot":"","sources":["../../src/browser/client-contribution.ts"],"names":[],"mappings":"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"}
|