@hydranium/glsp-server 1.0.0-next.79 → 1.0.0-next.85
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/lib/command/hydranium-glsp-recording-command.d.ts +21 -21
- package/lib/command/hydranium-glsp-recording-command.d.ts.map +1 -1
- package/lib/command/hydranium-glsp-recording-command.js +24 -25
- package/lib/command/hydranium-glsp-recording-command.js.map +1 -1
- package/lib/state/abstract-hydranium-glsp-state.d.ts +65 -42
- package/lib/state/abstract-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/abstract-hydranium-glsp-state.js +58 -41
- package/lib/state/abstract-hydranium-glsp-state.js.map +1 -1
- package/lib/state/full-text-hydranium-glsp-state.d.ts +3 -3
- package/lib/state/full-text-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/full-text-hydranium-glsp-state.js +4 -3
- package/lib/state/full-text-hydranium-glsp-state.js.map +1 -1
- package/lib/state/reconcile-source-model-write.d.ts +7 -6
- package/lib/state/reconcile-source-model-write.d.ts.map +1 -1
- package/lib/state/reconcile-source-model-write.js +4 -4
- package/lib/state/reconcile-source-model-write.js.map +1 -1
- package/lib/state/reconciling-multi-document-glsp-state.d.ts +15 -14
- package/lib/state/reconciling-multi-document-glsp-state.d.ts.map +1 -1
- package/lib/state/reconciling-multi-document-glsp-state.js +21 -20
- package/lib/state/reconciling-multi-document-glsp-state.js.map +1 -1
- package/lib/state/reconciling-transfer-hydranium-glsp-state.d.ts +3 -3
- package/lib/state/reconciling-transfer-hydranium-glsp-state.d.ts.map +1 -1
- package/lib/state/reconciling-transfer-hydranium-glsp-state.js +6 -6
- package/lib/state/reconciling-transfer-hydranium-glsp-state.js.map +1 -1
- package/lib/storage/hydranium-glsp-storage.d.ts +10 -10
- package/lib/storage/hydranium-glsp-storage.d.ts.map +1 -1
- package/lib/storage/hydranium-glsp-storage.js.map +1 -1
- package/lib/validation/diagnostic-markers.d.ts +2 -2
- package/lib/validation/diagnostic-markers.d.ts.map +1 -1
- package/lib/validation/diagnostic-markers.js.map +1 -1
- 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 +7 -7
- package/src/command/hydranium-glsp-recording-command.ts +25 -25
- package/src/state/abstract-hydranium-glsp-state.ts +85 -51
- package/src/state/full-text-hydranium-glsp-state.ts +5 -4
- package/src/state/reconcile-source-model-write.ts +10 -9
- package/src/state/reconciling-multi-document-glsp-state.ts +22 -21
- package/src/state/reconciling-transfer-hydranium-glsp-state.ts +7 -7
- package/src/storage/hydranium-glsp-storage.ts +10 -10
- package/src/validation/diagnostic-markers.ts +2 -2
- package/src/validation/hydranium-glsp-model-validator.ts +3 -3
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { type AnyObject, type JsonModelState, JsonRecordingCommand, type MaybePromise } from '@eclipse-glsp/server';
|
|
10
10
|
import { type AstNode } from '@hydranium/langium';
|
|
11
11
|
import { type AbstractHydraniumGlspState } from '../state/abstract-hydranium-glsp-state.js';
|
|
12
|
+
import { type BasedOn } from '@hydranium/protocol';
|
|
12
13
|
/**
|
|
13
14
|
* Source-model state shape consumed by {@link HydraniumGlspRecordingCommand}.
|
|
14
15
|
* The intersection ties together GLSP's read-side
|
|
@@ -42,13 +43,13 @@ export type HydraniumGlspRecordingState<TSourceModel extends AnyObject> = Abstra
|
|
|
42
43
|
*
|
|
43
44
|
* **postChange semantics.** GLSP's `JsonRecordingCommand.postChange` calls
|
|
44
45
|
* `modelState.updateSourceModel(newModel)` with the model only. The
|
|
45
|
-
* framework lift overrides `postChange` so it also threads the
|
|
46
|
-
* version
|
|
46
|
+
* framework lift overrides `postChange` so it also threads the snapshot
|
|
47
|
+
* version taken at command start — letting the downstream
|
|
47
48
|
* `ModelService.update` opt into the `ConflictError` gate. Undo / redo
|
|
48
|
-
* postChange calls
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* postChange calls pass `'anything'`: the user authored against the recorded
|
|
50
|
+
* patch, not against a specific server version, so re-applying it should
|
|
51
|
+
* succeed regardless of intervening edits. The recorded patch itself encodes
|
|
52
|
+
* the semantic intent.
|
|
52
53
|
*/
|
|
53
54
|
export declare class HydraniumGlspRecordingCommand<TSourceModel extends AnyObject> extends JsonRecordingCommand<TSourceModel> {
|
|
54
55
|
/** Human-readable label for the operation; appears in the timing-pair log line. */
|
|
@@ -60,13 +61,13 @@ export declare class HydraniumGlspRecordingCommand<TSourceModel extends AnyObjec
|
|
|
60
61
|
protected readonly redoAction?: (() => MaybePromise<void>) | undefined;
|
|
61
62
|
protected modelState: HydraniumGlspRecordingState<TSourceModel>;
|
|
62
63
|
/**
|
|
63
|
-
*
|
|
64
|
-
* {@link postChange} so
|
|
65
|
-
*
|
|
66
|
-
* returns so undo / redo paths fall through
|
|
67
|
-
*
|
|
64
|
+
* What the command was authored against, taken at {@link execute} start and
|
|
65
|
+
* threaded into {@link postChange} so
|
|
66
|
+
* {@link AbstractHydraniumGlspState.updateSourceModel} gates on it. Reset to
|
|
67
|
+
* `'anything'` after `execute` returns so undo / redo paths fall through
|
|
68
|
+
* ungated.
|
|
68
69
|
*/
|
|
69
|
-
protected
|
|
70
|
+
protected activeBasedOn: BasedOn;
|
|
70
71
|
/**
|
|
71
72
|
* Source-model snapshots captured at {@link execute} — the state the
|
|
72
73
|
* command left ({@link afterSnapshot}) and the state it started from
|
|
@@ -92,21 +93,20 @@ export declare class HydraniumGlspRecordingCommand<TSourceModel extends AnyObjec
|
|
|
92
93
|
* via {@link AbstractHydraniumGlspState.updateSourceModel}). The label combines
|
|
93
94
|
* the operation name with the source-uri-stamped logger.
|
|
94
95
|
*
|
|
95
|
-
*
|
|
96
|
-
* can thread
|
|
97
|
-
*
|
|
98
|
-
* see a stale captured version.
|
|
96
|
+
* Takes {@link AbstractHydraniumGlspState.basedOn} at start so {@link postChange}
|
|
97
|
+
* can thread it into `updateSourceModel`. Scoped with `try`/`finally` so undo
|
|
98
|
+
* / redo paths invoked later do not see a stale value.
|
|
99
99
|
*/
|
|
100
100
|
execute(): Promise<void>;
|
|
101
101
|
/**
|
|
102
102
|
* Override of GLSP's {@link JsonRecordingCommand.postChange} so the
|
|
103
103
|
* call to {@link AbstractHydraniumGlspState.updateSourceModel} threads the
|
|
104
|
-
*
|
|
104
|
+
* based-on version alongside the new model.
|
|
105
105
|
*
|
|
106
|
-
* During {@link execute}
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
106
|
+
* During {@link execute} it is the snapshot version taken at command start;
|
|
107
|
+
* during {@link undo} / {@link redo} it is `'anything'` — replaying a
|
|
108
|
+
* recorded patch does not author against a specific server version, so no
|
|
109
|
+
* gate applies.
|
|
110
110
|
*/
|
|
111
111
|
protected postChange(newModel: TSourceModel): MaybePromise<void>;
|
|
112
112
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydranium-glsp-recording-command.d.ts","sourceRoot":"","sources":["../../src/command/hydranium-glsp-recording-command.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"hydranium-glsp-recording-command.d.ts","sourceRoot":"","sources":["../../src/command/hydranium-glsp-recording-command.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,MAAM,2BAA2B,CAAC,YAAY,SAAS,SAAS,IAAI,0BAA0B,CAAC,OAAO,EAAE,YAAY,CAAC,GACxH,cAAc,CAAC,YAAY,CAAC,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,6BAA6B,CAAC,YAAY,SAAS,SAAS,CAAE,SAAQ,oBAAoB,CAAC,YAAY,CAAC;IA0B/G,mFAAmF;IACnF,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAEhC;uEACmE;IACnE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAE,MAAM,YAAY,CAAC,IAAI,CAAC;IACxD,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAE,MAAM,YAAY,CAAC,IAAI,CAAC;IAhC3D,UAAkB,UAAU,EAAE,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAExE;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,EAAE,OAAO,CAAc;IAE9C;;;;;;;;OAQG;IACH,SAAS,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC;IACxC,SAAS,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC;gBAGpC,UAAU,EAAE,2BAA2B,CAAC,YAAY,CAAC;IACrD,mFAAmF;IAChE,KAAK,EAAE,MAAM,EAChC,SAAS,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC;IACnC;uEACmE;IAChD,UAAU,CAAC,GAAE,MAAM,YAAY,CAAC,IAAI,CAAC,aAAA;IACxD,gEAAgE;IAC7C,UAAU,CAAC,GAAE,MAAM,YAAY,CAAC,IAAI,CAAC,aAAA;IAK3D;;;;;;;;;OASG;IACY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAavC;;;;;;;;;OASG;cACgB,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;IAIzE;;;;;;;;;;;OAWG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBpC;;;;OAIG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBtC"}
|
|
@@ -29,26 +29,26 @@ import { JsonRecordingCommand } from '@eclipse-glsp/server';
|
|
|
29
29
|
*
|
|
30
30
|
* **postChange semantics.** GLSP's `JsonRecordingCommand.postChange` calls
|
|
31
31
|
* `modelState.updateSourceModel(newModel)` with the model only. The
|
|
32
|
-
* framework lift overrides `postChange` so it also threads the
|
|
33
|
-
* version
|
|
32
|
+
* framework lift overrides `postChange` so it also threads the snapshot
|
|
33
|
+
* version taken at command start — letting the downstream
|
|
34
34
|
* `ModelService.update` opt into the `ConflictError` gate. Undo / redo
|
|
35
|
-
* postChange calls
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
35
|
+
* postChange calls pass `'anything'`: the user authored against the recorded
|
|
36
|
+
* patch, not against a specific server version, so re-applying it should
|
|
37
|
+
* succeed regardless of intervening edits. The recorded patch itself encodes
|
|
38
|
+
* the semantic intent.
|
|
39
39
|
*/
|
|
40
40
|
export class HydraniumGlspRecordingCommand extends JsonRecordingCommand {
|
|
41
41
|
label;
|
|
42
42
|
undoAction;
|
|
43
43
|
redoAction;
|
|
44
44
|
/**
|
|
45
|
-
*
|
|
46
|
-
* {@link postChange} so
|
|
47
|
-
*
|
|
48
|
-
* returns so undo / redo paths fall through
|
|
49
|
-
*
|
|
45
|
+
* What the command was authored against, taken at {@link execute} start and
|
|
46
|
+
* threaded into {@link postChange} so
|
|
47
|
+
* {@link AbstractHydraniumGlspState.updateSourceModel} gates on it. Reset to
|
|
48
|
+
* `'anything'` after `execute` returns so undo / redo paths fall through
|
|
49
|
+
* ungated.
|
|
50
50
|
*/
|
|
51
|
-
|
|
51
|
+
activeBasedOn = 'anything';
|
|
52
52
|
/**
|
|
53
53
|
* Source-model snapshots captured at {@link execute} — the state the
|
|
54
54
|
* command left ({@link afterSnapshot}) and the state it started from
|
|
@@ -79,36 +79,35 @@ export class HydraniumGlspRecordingCommand extends JsonRecordingCommand {
|
|
|
79
79
|
* via {@link AbstractHydraniumGlspState.updateSourceModel}). The label combines
|
|
80
80
|
* the operation name with the source-uri-stamped logger.
|
|
81
81
|
*
|
|
82
|
-
*
|
|
83
|
-
* can thread
|
|
84
|
-
*
|
|
85
|
-
* see a stale captured version.
|
|
82
|
+
* Takes {@link AbstractHydraniumGlspState.basedOn} at start so {@link postChange}
|
|
83
|
+
* can thread it into `updateSourceModel`. Scoped with `try`/`finally` so undo
|
|
84
|
+
* / redo paths invoked later do not see a stale value.
|
|
86
85
|
*/
|
|
87
86
|
async execute() {
|
|
88
87
|
const logger = this.modelState.logger.for('HydraniumGlspRecordingCommand');
|
|
89
|
-
this.
|
|
90
|
-
logger.debug(`Executing '${this.label}' (based-on doc.version=v${this.
|
|
88
|
+
this.activeBasedOn = this.modelState.basedOn;
|
|
89
|
+
logger.debug(`Executing '${this.label}' (based-on doc.version=v${this.modelState.version})`);
|
|
91
90
|
this.beforeSnapshot = this.deepClone(await this.getJsonObject());
|
|
92
91
|
try {
|
|
93
92
|
await this.modelState.tracer.for('HydraniumGlspRecordingCommand').time(`Execute command '${this.label}'`, () => super.execute());
|
|
94
93
|
}
|
|
95
94
|
finally {
|
|
96
|
-
this.
|
|
95
|
+
this.activeBasedOn = 'anything';
|
|
97
96
|
}
|
|
98
97
|
this.afterSnapshot = this.deepClone(await this.getJsonObject());
|
|
99
98
|
}
|
|
100
99
|
/**
|
|
101
100
|
* Override of GLSP's {@link JsonRecordingCommand.postChange} so the
|
|
102
101
|
* call to {@link AbstractHydraniumGlspState.updateSourceModel} threads the
|
|
103
|
-
*
|
|
102
|
+
* based-on version alongside the new model.
|
|
104
103
|
*
|
|
105
|
-
* During {@link execute}
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
104
|
+
* During {@link execute} it is the snapshot version taken at command start;
|
|
105
|
+
* during {@link undo} / {@link redo} it is `'anything'` — replaying a
|
|
106
|
+
* recorded patch does not author against a specific server version, so no
|
|
107
|
+
* gate applies.
|
|
109
108
|
*/
|
|
110
109
|
postChange(newModel) {
|
|
111
|
-
return this.modelState.updateSourceModel(newModel, this.
|
|
110
|
+
return this.modelState.updateSourceModel(newModel, this.activeBasedOn);
|
|
112
111
|
}
|
|
113
112
|
/**
|
|
114
113
|
* Reconcile the recorded `after → before` transition against the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydranium-glsp-recording-command.js","sourceRoot":"","sources":["../../src/command/hydranium-glsp-recording-command.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAuC,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"hydranium-glsp-recording-command.js","sourceRoot":"","sources":["../../src/command/hydranium-glsp-recording-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { DefaultModelState, type MaybePromise } from '@eclipse-glsp/server';
|
|
|
10
10
|
import { Emitter, type Event } from 'vscode-jsonrpc';
|
|
11
11
|
import { type AstNode, DocumentState } from '@hydranium/langium';
|
|
12
12
|
import { type HydraniumScopeProvider, type LanguageTarget, type NameProvider, type ReferenceCandidateProvider, type ServerLanguageServices, type ServerSharedServices } from '@hydranium/core';
|
|
13
|
-
import type
|
|
13
|
+
import { type BasedOn, type SnapshotVersion, type ConflictResolver, type Logger, type Tracer } from '@hydranium/protocol';
|
|
14
14
|
import { type HydraniumGlspIndex } from './hydranium-glsp-index.js';
|
|
15
15
|
import { ModelReadyTimeoutError } from './model-ready-timeout-error.js';
|
|
16
16
|
/**
|
|
@@ -74,9 +74,9 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
74
74
|
protected _sourceUri: string;
|
|
75
75
|
protected _sourceRoot: TRoot;
|
|
76
76
|
protected _tracer?: Tracer;
|
|
77
|
-
protected
|
|
78
|
-
/**
|
|
79
|
-
protected readonly _secondaryVersions: Map<string,
|
|
77
|
+
protected _basedOn: SnapshotVersion;
|
|
78
|
+
/** Snapshot versions of the secondary write set, keyed by URI. See {@link trackSecondaryDocument}. */
|
|
79
|
+
protected readonly _secondaryVersions: Map<string, SnapshotVersion>;
|
|
80
80
|
/** Backing emitter for {@link onSecondaryUrisChanged}; fired only on a membership change. */
|
|
81
81
|
protected readonly secondaryUrisChangedEmitter: Emitter<void>;
|
|
82
82
|
/** Default of one minute. */
|
|
@@ -170,27 +170,33 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
170
170
|
/** URI-tagged once {@link setSourceRoot} has run; the class-tagged injected {@link baseTracer} before that. */
|
|
171
171
|
get tracer(): Tracer;
|
|
172
172
|
/**
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
* at that point in time — frozen until the next `setSourceRoot`, then
|
|
176
|
-
* re-read from `LangiumDocuments`.
|
|
173
|
+
* Snapshot version taken at the last {@link setSourceRoot} call — frozen
|
|
174
|
+
* until the next one, then re-read from the document store.
|
|
177
175
|
*
|
|
178
176
|
* Threaded by `HydraniumGlspRecordingCommand` into
|
|
179
|
-
* {@link updateSourceModel}
|
|
180
|
-
*
|
|
181
|
-
* conflict gate against the captured based-on version. See
|
|
177
|
+
* {@link updateSourceModel} so the downstream `ModelService.update` /
|
|
178
|
+
* `.save` call gates against what the command was authored on. See
|
|
182
179
|
* `@hydranium/protocol#ConflictError` for the detection contract.
|
|
183
180
|
*
|
|
181
|
+
* **This, not a number read at write time, is what a write must be gated
|
|
182
|
+
* on.** A version read when the write is issued is the store's current one,
|
|
183
|
+
* so it matches by construction and the gate can never fire.
|
|
184
|
+
*/
|
|
185
|
+
get basedOn(): SnapshotVersion;
|
|
186
|
+
/**
|
|
187
|
+
* Text-document version of {@link basedOn}. Mirrors the server-side
|
|
188
|
+
* `TextDocuments.version(uri)` counter as of the snapshot.
|
|
189
|
+
*
|
|
184
190
|
* Falls back to `0` when the document is absent from `LangiumDocuments`
|
|
185
|
-
*
|
|
186
|
-
* that was never opened. Callers that need to distinguish
|
|
191
|
+
* when the snapshot is taken — the same observable state callers see for a
|
|
192
|
+
* doc that was never opened. Callers that need to distinguish
|
|
187
193
|
* "never-versioned" from "v0" must consult the document registry
|
|
188
194
|
* directly.
|
|
189
195
|
*/
|
|
190
196
|
get version(): number;
|
|
191
197
|
/**
|
|
192
|
-
* Register `uri` as a document this state also writes,
|
|
193
|
-
* text-document version.
|
|
198
|
+
* Register `uri` as a document this state also writes, snapshotting its
|
|
199
|
+
* current text-document version.
|
|
194
200
|
*
|
|
195
201
|
* A diagram whose layout lives in its own file, or whose canvas creates
|
|
196
202
|
* elements in a referenced semantic document, writes more than the document
|
|
@@ -203,7 +209,7 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
203
209
|
* identified once the operation names the node. What the framework supplies
|
|
204
210
|
* is the part an adopter cannot reconstruct after the fact — the version each
|
|
205
211
|
* document was at BEFORE the command mutated anything (see
|
|
206
|
-
* {@link
|
|
212
|
+
* {@link snapshotVersionOf}). Idempotent; registering the primary is ignored,
|
|
207
213
|
* since {@link version} already tracks it. Registering a URI not already in
|
|
208
214
|
* the set fires {@link onSecondaryUrisChanged}.
|
|
209
215
|
*/
|
|
@@ -215,14 +221,15 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
215
221
|
untrackSecondaryDocuments(): void;
|
|
216
222
|
/**
|
|
217
223
|
* Fires whenever the secondary write set gains or loses a URI — never when a
|
|
218
|
-
* tracked document's
|
|
224
|
+
* tracked document's snapshot version is merely refreshed, which happens on
|
|
219
225
|
* every {@link setSourceRoot} and changes nothing a subscriber cares about.
|
|
220
226
|
*
|
|
221
227
|
* **This exists so no caller has to know when the set can change.** The set is
|
|
222
228
|
* usually discovered rather than known, and the discovery point is an
|
|
223
|
-
* operation handler naming a node — not a
|
|
224
|
-
* re-derived the set after each
|
|
225
|
-
* it silently: the document would simply never be
|
|
229
|
+
* operation handler naming a node — not a read of the source root. A
|
|
230
|
+
* subscriber that instead re-derived the set after each such read would miss
|
|
231
|
+
* exactly that case, and miss it silently: the document would simply never be
|
|
232
|
+
* watched, with nothing logged.
|
|
226
233
|
* Announcing the change here moves the obligation to the one place that can
|
|
227
234
|
* always discharge it.
|
|
228
235
|
*
|
|
@@ -235,25 +242,32 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
235
242
|
/** Registered secondary document URIs, in registration order. */
|
|
236
243
|
get secondaryUris(): readonly string[];
|
|
237
244
|
/**
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
245
|
+
* Snapshot version for `uri` — {@link basedOn} for the primary, the version
|
|
246
|
+
* taken at {@link trackSecondaryDocument} (refreshed by {@link setSourceRoot})
|
|
247
|
+
* for a secondary, `undefined` for anything untracked.
|
|
241
248
|
*
|
|
242
|
-
* `undefined` rather than
|
|
249
|
+
* `undefined` rather than v0 for an untracked URI deliberately: `0` is a real
|
|
243
250
|
* version meaning "present but never edited", so collapsing the two would let
|
|
244
|
-
* a caller gate a write against a document
|
|
251
|
+
* a caller gate a write against a document this state never read.
|
|
245
252
|
*/
|
|
246
|
-
|
|
253
|
+
snapshotVersionOf(uri: string): SnapshotVersion | undefined;
|
|
247
254
|
/**
|
|
248
|
-
* Read a document's
|
|
249
|
-
* canonicalizing gateway
|
|
250
|
-
* the document keyed by its real path rather than
|
|
251
|
-
* would silently weaken the conflict gate).
|
|
252
|
-
*
|
|
253
|
-
*
|
|
255
|
+
* Read a document's version out of the live store and mark it as a snapshot,
|
|
256
|
+
* through the model service's canonicalizing gateway so a URI spelled through
|
|
257
|
+
* a symlink still resolves to the document keyed by its real path rather than
|
|
258
|
+
* stranding at `0` (which would silently weaken the conflict gate).
|
|
259
|
+
*
|
|
260
|
+
* **Call this only at the point the source root is read.** It is the one
|
|
261
|
+
* place the framework turns a live version into a snapshot one, and the value
|
|
262
|
+
* is true only because that is where it is called. Called at write time it
|
|
263
|
+
* answers with the version the write is about to be compared against, so the
|
|
264
|
+
* gate passes unconditionally.
|
|
265
|
+
*
|
|
266
|
+
* Falls back to v0 for a URI the store does not know, matching what
|
|
267
|
+
* {@link version} reports for a document that was never opened.
|
|
254
268
|
*/
|
|
255
|
-
protected
|
|
256
|
-
/** Re-
|
|
269
|
+
protected readSnapshotVersion(uri: string): SnapshotVersion;
|
|
270
|
+
/** Re-take every registered secondary's snapshot version from the document store. */
|
|
257
271
|
protected refreshSecondaryVersions(): void;
|
|
258
272
|
/**
|
|
259
273
|
* Re-capture the source root from the current Langium document,
|
|
@@ -320,14 +334,23 @@ export declare abstract class AbstractHydraniumGlspState<TRoot extends AstNode,
|
|
|
320
334
|
* `JsonModelState` shape meet the framework state via structural
|
|
321
335
|
* intersection at the recording-command call site.
|
|
322
336
|
*
|
|
323
|
-
* `
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
329
|
-
*
|
|
337
|
+
* `basedOn` is the snapshot version taken at command start by
|
|
338
|
+
* `HydraniumGlspRecordingCommand.execute`. Adopters that route through
|
|
339
|
+
* `ModelService.update` / `.save` forward it as the args' `basedOn` field;
|
|
340
|
+
* adopters whose write path doesn't go through `ModelService` ignore it.
|
|
341
|
+
* `'anything'` when the writer is not the recording command (an external
|
|
342
|
+
* storage refresh, an undo replaying a recorded patch), which is a write
|
|
343
|
+
* authored against no particular server version.
|
|
344
|
+
*
|
|
345
|
+
* **Optional, and every implementation must default it to {@link basedOn}
|
|
346
|
+
* rather than to `'anything'`.** Optional is forced: GLSP's `JsonModelState`
|
|
347
|
+
* declares a one-parameter `updateSourceModel` and calls it with one
|
|
348
|
+
* argument, so a second required parameter makes the state unassignable to
|
|
349
|
+
* the slot it has to fill. Defaulting to the state's own snapshot version is
|
|
350
|
+
* what keeps that from costing anything — an operation handler calling
|
|
351
|
+
* `updateSourceModel(model)` gets the gate, and skipping it has to be typed
|
|
352
|
+
* out as `'anything'`.
|
|
330
353
|
*/
|
|
331
|
-
abstract updateSourceModel(model: TSourceModel,
|
|
354
|
+
abstract updateSourceModel(model: TSourceModel, basedOn?: BasedOn): MaybePromise<void>;
|
|
332
355
|
}
|
|
333
356
|
//# sourceMappingURL=abstract-hydranium-glsp-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-hydranium-glsp-state.d.ts","sourceRoot":"","sources":["../../src/state/abstract-hydranium-glsp-state.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAkB,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,OAAO,EAAE,aAAa,EAAO,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACJ,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"abstract-hydranium-glsp-state.d.ts","sourceRoot":"","sources":["../../src/state/abstract-hydranium-glsp-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ import { DefaultModelState, SOURCE_URI_ARG } from '@eclipse-glsp/server';
|
|
|
20
20
|
import { Emitter } from 'vscode-jsonrpc';
|
|
21
21
|
import { inject, injectable, optional } from 'inversify';
|
|
22
22
|
import { DocumentState, URI } from '@hydranium/langium';
|
|
23
|
+
import { asSnapshotVersion } from '@hydranium/protocol';
|
|
23
24
|
import { HydraniumTypes } from './hydranium-shared-core-services.js';
|
|
24
25
|
import { ModelReadyTimeoutError } from './model-ready-timeout-error.js';
|
|
25
26
|
/**
|
|
@@ -82,8 +83,8 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
82
83
|
_sourceUri;
|
|
83
84
|
_sourceRoot;
|
|
84
85
|
_tracer;
|
|
85
|
-
|
|
86
|
-
/**
|
|
86
|
+
_basedOn = asSnapshotVersion(0);
|
|
87
|
+
/** Snapshot versions of the secondary write set, keyed by URI. See {@link trackSecondaryDocument}. */
|
|
87
88
|
_secondaryVersions = new Map();
|
|
88
89
|
/** Backing emitter for {@link onSecondaryUrisChanged}; fired only on a membership change. */
|
|
89
90
|
secondaryUrisChangedEmitter = new Emitter();
|
|
@@ -103,7 +104,7 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
103
104
|
setSourceRoot(uri, root) {
|
|
104
105
|
this._sourceUri = uri;
|
|
105
106
|
this._sourceRoot = root;
|
|
106
|
-
this.
|
|
107
|
+
this._basedOn = this.readSnapshotVersion(uri);
|
|
107
108
|
// Re-read the secondary write set for the same reason the primary is
|
|
108
109
|
// re-read: the write that brought us here advanced their versions too, and
|
|
109
110
|
// a stale based-on version would gate the NEXT command against a
|
|
@@ -112,7 +113,7 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
112
113
|
this.refreshSecondaryVersions();
|
|
113
114
|
this.set(SOURCE_URI_ARG, uri);
|
|
114
115
|
this._tracer = this.baseTracer.withUri(uri);
|
|
115
|
-
this.tracer.debug(`Captured source root at doc.version=v${this.
|
|
116
|
+
this.tracer.debug(`Captured source root at doc.version=v${this._basedOn}`);
|
|
116
117
|
this.checkDeclaredLanguage(uri);
|
|
117
118
|
this.index.indexSourceRoot(root, uri);
|
|
118
119
|
}
|
|
@@ -218,32 +219,40 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
218
219
|
return this._tracer ?? this.baseTracer;
|
|
219
220
|
}
|
|
220
221
|
/**
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* at that point in time — frozen until the next `setSourceRoot`, then
|
|
224
|
-
* re-read from `LangiumDocuments`.
|
|
222
|
+
* Snapshot version taken at the last {@link setSourceRoot} call — frozen
|
|
223
|
+
* until the next one, then re-read from the document store.
|
|
225
224
|
*
|
|
226
225
|
* Threaded by `HydraniumGlspRecordingCommand` into
|
|
227
|
-
* {@link updateSourceModel}
|
|
228
|
-
*
|
|
229
|
-
* conflict gate against the captured based-on version. See
|
|
226
|
+
* {@link updateSourceModel} so the downstream `ModelService.update` /
|
|
227
|
+
* `.save` call gates against what the command was authored on. See
|
|
230
228
|
* `@hydranium/protocol#ConflictError` for the detection contract.
|
|
231
229
|
*
|
|
230
|
+
* **This, not a number read at write time, is what a write must be gated
|
|
231
|
+
* on.** A version read when the write is issued is the store's current one,
|
|
232
|
+
* so it matches by construction and the gate can never fire.
|
|
233
|
+
*/
|
|
234
|
+
get basedOn() {
|
|
235
|
+
return this._basedOn;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Text-document version of {@link basedOn}. Mirrors the server-side
|
|
239
|
+
* `TextDocuments.version(uri)` counter as of the snapshot.
|
|
240
|
+
*
|
|
232
241
|
* Falls back to `0` when the document is absent from `LangiumDocuments`
|
|
233
|
-
*
|
|
234
|
-
* that was never opened. Callers that need to distinguish
|
|
242
|
+
* when the snapshot is taken — the same observable state callers see for a
|
|
243
|
+
* doc that was never opened. Callers that need to distinguish
|
|
235
244
|
* "never-versioned" from "v0" must consult the document registry
|
|
236
245
|
* directly.
|
|
237
246
|
*/
|
|
238
247
|
get version() {
|
|
239
|
-
return this.
|
|
248
|
+
return this._basedOn;
|
|
240
249
|
}
|
|
241
250
|
// ============================================================
|
|
242
251
|
// Secondary documents — the write set beyond the primary
|
|
243
252
|
// ============================================================
|
|
244
253
|
/**
|
|
245
|
-
* Register `uri` as a document this state also writes,
|
|
246
|
-
* text-document version.
|
|
254
|
+
* Register `uri` as a document this state also writes, snapshotting its
|
|
255
|
+
* current text-document version.
|
|
247
256
|
*
|
|
248
257
|
* A diagram whose layout lives in its own file, or whose canvas creates
|
|
249
258
|
* elements in a referenced semantic document, writes more than the document
|
|
@@ -256,7 +265,7 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
256
265
|
* identified once the operation names the node. What the framework supplies
|
|
257
266
|
* is the part an adopter cannot reconstruct after the fact — the version each
|
|
258
267
|
* document was at BEFORE the command mutated anything (see
|
|
259
|
-
* {@link
|
|
268
|
+
* {@link snapshotVersionOf}). Idempotent; registering the primary is ignored,
|
|
260
269
|
* since {@link version} already tracks it. Registering a URI not already in
|
|
261
270
|
* the set fires {@link onSecondaryUrisChanged}.
|
|
262
271
|
*/
|
|
@@ -265,7 +274,7 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
265
274
|
return;
|
|
266
275
|
}
|
|
267
276
|
const added = !this._secondaryVersions.has(uri);
|
|
268
|
-
this._secondaryVersions.set(uri, this.
|
|
277
|
+
this._secondaryVersions.set(uri, this.readSnapshotVersion(uri));
|
|
269
278
|
if (added) {
|
|
270
279
|
this.secondaryUrisChangedEmitter.fire();
|
|
271
280
|
}
|
|
@@ -283,14 +292,15 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
283
292
|
}
|
|
284
293
|
/**
|
|
285
294
|
* Fires whenever the secondary write set gains or loses a URI — never when a
|
|
286
|
-
* tracked document's
|
|
295
|
+
* tracked document's snapshot version is merely refreshed, which happens on
|
|
287
296
|
* every {@link setSourceRoot} and changes nothing a subscriber cares about.
|
|
288
297
|
*
|
|
289
298
|
* **This exists so no caller has to know when the set can change.** The set is
|
|
290
299
|
* usually discovered rather than known, and the discovery point is an
|
|
291
|
-
* operation handler naming a node — not a
|
|
292
|
-
* re-derived the set after each
|
|
293
|
-
* it silently: the document would simply never be
|
|
300
|
+
* operation handler naming a node — not a read of the source root. A
|
|
301
|
+
* subscriber that instead re-derived the set after each such read would miss
|
|
302
|
+
* exactly that case, and miss it silently: the document would simply never be
|
|
303
|
+
* watched, with nothing logged.
|
|
294
304
|
* Announcing the change here moves the obligation to the one place that can
|
|
295
305
|
* always discharge it.
|
|
296
306
|
*
|
|
@@ -307,35 +317,42 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
307
317
|
return [...this._secondaryVersions.keys()];
|
|
308
318
|
}
|
|
309
319
|
/**
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
320
|
+
* Snapshot version for `uri` — {@link basedOn} for the primary, the version
|
|
321
|
+
* taken at {@link trackSecondaryDocument} (refreshed by {@link setSourceRoot})
|
|
322
|
+
* for a secondary, `undefined` for anything untracked.
|
|
313
323
|
*
|
|
314
|
-
* `undefined` rather than
|
|
324
|
+
* `undefined` rather than v0 for an untracked URI deliberately: `0` is a real
|
|
315
325
|
* version meaning "present but never edited", so collapsing the two would let
|
|
316
|
-
* a caller gate a write against a document
|
|
326
|
+
* a caller gate a write against a document this state never read.
|
|
317
327
|
*/
|
|
318
|
-
|
|
328
|
+
snapshotVersionOf(uri) {
|
|
319
329
|
if (uri === this._sourceUri) {
|
|
320
|
-
return this.
|
|
330
|
+
return this._basedOn;
|
|
321
331
|
}
|
|
322
332
|
return this._secondaryVersions.get(uri);
|
|
323
333
|
}
|
|
324
334
|
/**
|
|
325
|
-
* Read a document's
|
|
326
|
-
* canonicalizing gateway
|
|
327
|
-
* the document keyed by its real path rather than
|
|
328
|
-
* would silently weaken the conflict gate).
|
|
329
|
-
*
|
|
330
|
-
*
|
|
335
|
+
* Read a document's version out of the live store and mark it as a snapshot,
|
|
336
|
+
* through the model service's canonicalizing gateway so a URI spelled through
|
|
337
|
+
* a symlink still resolves to the document keyed by its real path rather than
|
|
338
|
+
* stranding at `0` (which would silently weaken the conflict gate).
|
|
339
|
+
*
|
|
340
|
+
* **Call this only at the point the source root is read.** It is the one
|
|
341
|
+
* place the framework turns a live version into a snapshot one, and the value
|
|
342
|
+
* is true only because that is where it is called. Called at write time it
|
|
343
|
+
* answers with the version the write is about to be compared against, so the
|
|
344
|
+
* gate passes unconditionally.
|
|
345
|
+
*
|
|
346
|
+
* Falls back to v0 for a URI the store does not know, matching what
|
|
347
|
+
* {@link version} reports for a document that was never opened.
|
|
331
348
|
*/
|
|
332
|
-
|
|
333
|
-
return this.sharedServices.model.ModelService.
|
|
349
|
+
readSnapshotVersion(uri) {
|
|
350
|
+
return this.sharedServices.model.ModelService.snapshot(uri)?.version ?? asSnapshotVersion(0);
|
|
334
351
|
}
|
|
335
|
-
/** Re-
|
|
352
|
+
/** Re-take every registered secondary's snapshot version from the document store. */
|
|
336
353
|
refreshSecondaryVersions() {
|
|
337
354
|
for (const uri of [...this._secondaryVersions.keys()]) {
|
|
338
|
-
this._secondaryVersions.set(uri, this.
|
|
355
|
+
this._secondaryVersions.set(uri, this.readSnapshotVersion(uri));
|
|
339
356
|
}
|
|
340
357
|
}
|
|
341
358
|
/**
|
|
@@ -382,8 +399,8 @@ let AbstractHydraniumGlspState = class AbstractHydraniumGlspState extends Defaul
|
|
|
382
399
|
const timeout = new Promise((resolve, reject) => {
|
|
383
400
|
timer = this.sharedServices.Clock.setTimer(() => {
|
|
384
401
|
const elapsed = Math.round(stopwatch.elapsedMs);
|
|
385
|
-
//
|
|
386
|
-
//
|
|
402
|
+
// Through the model service's canonicalizing gateway, so a symlinked
|
|
403
|
+
// `_sourceUri` is not reported as a hard timeout.
|
|
387
404
|
const doc = this.sharedServices.model.ModelService.getDocument(uri);
|
|
388
405
|
if (doc && doc.state >= state) {
|
|
389
406
|
this.logger.warn(`Missed '${DocumentState[state]}' notification after ${elapsed}ms; document is already at state ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-hydranium-glsp-state.js","sourceRoot":"","sources":["../../src/state/abstract-hydranium-glsp-state.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;;;;;;;;;;;AAElF,OAAO,EAAE,iBAAiB,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAc,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAgB,aAAa,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"abstract-hydranium-glsp-state.js","sourceRoot":"","sources":["../../src/state/abstract-hydranium-glsp-state.ts"],"names":[],"mappings":"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"}
|