@hydranium/core 1.0.0-next.115 → 1.0.0-next.117

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.
Files changed (62) hide show
  1. package/README.md +3 -1
  2. package/lib/documents/ast-document-manager.d.ts +52 -2
  3. package/lib/documents/ast-document-manager.d.ts.map +1 -1
  4. package/lib/documents/ast-document-manager.js +67 -5
  5. package/lib/documents/ast-document-manager.js.map +1 -1
  6. package/lib/documents/client-session-errors.d.ts +44 -0
  7. package/lib/documents/client-session-errors.d.ts.map +1 -0
  8. package/lib/documents/client-session-errors.js +57 -0
  9. package/lib/documents/client-session-errors.js.map +1 -0
  10. package/lib/documents/client-session-registry.d.ts +118 -0
  11. package/lib/documents/client-session-registry.d.ts.map +1 -0
  12. package/lib/documents/client-session-registry.js +171 -0
  13. package/lib/documents/client-session-registry.js.map +1 -0
  14. package/lib/documents/hydranium-text-documents.d.ts +69 -17
  15. package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
  16. package/lib/documents/hydranium-text-documents.js +135 -44
  17. package/lib/documents/hydranium-text-documents.js.map +1 -1
  18. package/lib/documents/index.d.ts +2 -0
  19. package/lib/documents/index.d.ts.map +1 -1
  20. package/lib/documents/index.js +2 -0
  21. package/lib/documents/index.js.map +1 -1
  22. package/lib/langium/integrity/integrity-service.d.ts +8 -7
  23. package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
  24. package/lib/langium/integrity/integrity-service.js +35 -27
  25. package/lib/langium/integrity/integrity-service.js.map +1 -1
  26. package/lib/langium/model-service/client-session.d.ts +120 -0
  27. package/lib/langium/model-service/client-session.d.ts.map +1 -0
  28. package/lib/langium/model-service/client-session.js +175 -0
  29. package/lib/langium/model-service/client-session.js.map +1 -0
  30. package/lib/langium/model-service/index.d.ts +1 -0
  31. package/lib/langium/model-service/index.d.ts.map +1 -1
  32. package/lib/langium/model-service/index.js +1 -0
  33. package/lib/langium/model-service/index.js.map +1 -1
  34. package/lib/langium/model-service/model-service.d.ts +57 -1
  35. package/lib/langium/model-service/model-service.d.ts.map +1 -1
  36. package/lib/langium/model-service/model-service.js +123 -9
  37. package/lib/langium/model-service/model-service.js.map +1 -1
  38. package/lib/lsp/hydranium-document-update-handler.d.ts +6 -0
  39. package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
  40. package/lib/lsp/hydranium-document-update-handler.js +20 -3
  41. package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
  42. package/lib/testing/stub-ast-document-manager.d.ts +4 -3
  43. package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
  44. package/lib/testing/stub-ast-document-manager.js +3 -0
  45. package/lib/testing/stub-ast-document-manager.js.map +1 -1
  46. package/lib/testing/stub-hydranium-text-documents.d.ts +13 -5
  47. package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
  48. package/lib/testing/stub-hydranium-text-documents.js +45 -14
  49. package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
  50. package/package.json +5 -5
  51. package/src/documents/ast-document-manager.ts +107 -6
  52. package/src/documents/client-session-errors.ts +54 -0
  53. package/src/documents/client-session-registry.ts +211 -0
  54. package/src/documents/hydranium-text-documents.ts +150 -47
  55. package/src/documents/index.ts +2 -0
  56. package/src/langium/integrity/integrity-service.ts +36 -26
  57. package/src/langium/model-service/client-session.ts +257 -0
  58. package/src/langium/model-service/index.ts +1 -0
  59. package/src/langium/model-service/model-service.ts +151 -9
  60. package/src/lsp/hydranium-document-update-handler.ts +22 -4
  61. package/src/testing/stub-ast-document-manager.ts +7 -2
  62. package/src/testing/stub-hydranium-text-documents.ts +62 -18
@@ -278,9 +278,11 @@ export class DefaultIntegrityService {
278
278
  await this.reconcileDocument(document, cancelToken);
279
279
  return;
280
280
  }
281
- // Keep the same version so HydraniumTextDocuments doesn't reject subsequent client edits.
282
- // Use manager.update so the `instanceof FullTextDocument` gate in the bare
283
- // `TextDocument.update` doesn't trip on adopter-custom text-document types.
281
+ // A committed repair is a new version; a document no client has open keeps
282
+ // its number here, and the re-versioning below moves it once the build
283
+ // has reconciled. Through the store's `update`, so the `instanceof
284
+ // FullTextDocument` gate in the bare `TextDocument.update` does not trip
285
+ // on adopter-custom text-document types.
284
286
  const textDocument = commit.status === 'committed' ? commit.document : this.textDocuments.update(document.textDocument, [{ text: newText }], version);
285
287
  await this.syncCorrections(textDocument, parsedFrom);
286
288
  await this.reconcileDocument(document, cancelToken);
@@ -406,8 +408,11 @@ export class DefaultIntegrityService {
406
408
  }
407
409
  // Closed files, silent mode: write to disk directly.
408
410
  if (this.syncMode === 'silent') {
411
+ const repaired = document.getText();
409
412
  // Async write so the integrity pass does not block the event loop on a slow filesystem.
410
- await this.fileSystemProvider.writeFile(UriUtils.toUri(document.uri), document.getText());
413
+ // In the URI's disk queue, behind any save already queued: written
414
+ // beside one, the older repair can land last and stay on disk.
415
+ await this.services.shared.workspace.AstDocumentManager.queueDiskTask(document.uri, () => this.fileSystemProvider.writeFile(UriUtils.toUri(document.uri), repaired));
411
416
  return;
412
417
  }
413
418
  // Closed files, editor mode: stage content so the next open picks it up via applyEdit.
@@ -418,33 +423,36 @@ export class DefaultIntegrityService {
418
423
  * the text the repair was computed from — so the write carries the repair
419
424
  * and nothing a holder could still discard.
420
425
  *
421
- * The store is compared again once the read returns, and the write is
422
- * skipped if it no longer holds the repair. A save does not wait for the
423
- * build this repair belongs to, so an edit and its save can land while the
424
- * read is pending; writing the older repair then would overwrite a saved
425
- * edit on disk. The skipped repair loses nothing: the edit drives a build
426
- * of its own, and a save writes the store's text. A file that cannot be read
427
- * is left alone too: there is no evidence it matches.
426
+ * The read, the compare and the write run as one task in the URI's disk
427
+ * queue, so no save of the file lands between them. The store is compared
428
+ * again once the read returns, and the write is skipped if it no longer
429
+ * holds the repair: an edit does not wait for the queue, and writing the
430
+ * older repair then puts text on disk that no participant holds. The
431
+ * skipped repair loses nothing: the edit drives a build of its own, and a
432
+ * save writes the store's text. A file that cannot be read is left alone
433
+ * too: there is no evidence it matches.
428
434
  */
429
435
  async persistIfDiskMatches(document, parsedFrom) {
430
436
  const uri = UriUtils.toUri(document.uri);
431
437
  const repaired = document.getText();
432
- let onDisk;
433
- try {
434
- onDisk = await this.fileSystemProvider.readFile(uri);
435
- }
436
- catch (error) {
437
- this.tracer.with(document.uri).debug(`Held document unreadable on disk, repair left to the next save: ${String(error)}`);
438
- return;
439
- }
440
- if (onDisk !== parsedFrom) {
441
- return;
442
- }
443
- if (this.textDocuments.get(document.uri)?.getText() !== repaired) {
444
- this.tracer.with(document.uri).debug('Held document changed while disk was read, repair left to that change');
445
- return;
446
- }
447
- await this.fileSystemProvider.writeFile(uri, repaired);
438
+ await this.services.shared.workspace.AstDocumentManager.queueDiskTask(document.uri, async () => {
439
+ let onDisk;
440
+ try {
441
+ onDisk = await this.fileSystemProvider.readFile(uri);
442
+ }
443
+ catch (error) {
444
+ this.tracer.with(document.uri).debug(`Held document unreadable on disk, repair left to the next save: ${String(error)}`);
445
+ return;
446
+ }
447
+ if (onDisk !== parsedFrom) {
448
+ return;
449
+ }
450
+ if (this.textDocuments.get(document.uri)?.getText() !== repaired) {
451
+ this.tracer.with(document.uri).debug('Held document changed while disk was read, repair left to that change');
452
+ return;
453
+ }
454
+ await this.fileSystemProvider.writeFile(uri, repaired);
455
+ });
448
456
  }
449
457
  /**
450
458
  * Format a rule's name for inclusion in user-facing diagnostic strings
@@ -1 +1 @@
1
- {"version":3,"file":"integrity-service.js","sourceRoot":"","sources":["../../../src/langium/integrity/integrity-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrity-service.js","sourceRoot":"","sources":["../../../src/langium/integrity/integrity-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import { type MaybePromise, type TransferElement, type TransferSaveArgs, type TransferUpdateArgs } from '@hydranium/protocol';
10
+ import { type AstNode } from '@hydranium/langium';
11
+ import { type CancellationToken } from 'vscode-languageserver';
12
+ import { type AstDocument } from '../../documents/ast-document-manager.js';
13
+ import { type OpenOptions } from '../../documents/client-session-registry.js';
14
+ import { type ServerSharedServices } from '../module.js';
15
+ import { type AstDiagnostic } from '../validation/document-validator.js';
16
+ import { type ModelService } from './model-service.js';
17
+ /**
18
+ * One participant's handle on the documents it works on, started by
19
+ * `ModelService.createSession`.
20
+ *
21
+ * The session writes only what it has open: `update` and `save` fail with
22
+ * `DocumentNotOpenError` unless this session has the URI open when the text is
23
+ * applied, and the check and the apply are one synchronous step, so a write
24
+ * either lands while the document is open or fails. A document stays open until
25
+ * this session closes it, the session ends, or the file is deleted.
26
+ *
27
+ * One open per URI, without reference counting: opening a URI the session
28
+ * already has open changes nothing, and one `close` ends it.
29
+ *
30
+ * After `dispose`, every other member throws `SessionClosedError`
31
+ * synchronously, before returning a promise.
32
+ *
33
+ * Reads need no session and live on `ModelService`.
34
+ */
35
+ export interface ClientSession<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic, TTransfer extends TransferElement = TransferElement, TOpenOptions extends OpenOptions = OpenOptions> {
36
+ /** Unique in the process while the session is live: the author label on its writes and the key of its opens. */
37
+ readonly clientId: string;
38
+ readonly label: string;
39
+ /**
40
+ * Open `uri` for this session, reading it from disk unless some client has
41
+ * it open already. `options` are kept for this open until it closes; a
42
+ * repeat open, concurrent or not, keeps the options of the first.
43
+ */
44
+ open(uri: string, options?: TOpenOptions): Promise<void>;
45
+ /**
46
+ * Create a document with `text` and open it for this session. It reaches
47
+ * disk on the first `save`. Fails when the file exists or any client has the
48
+ * URI open, and of two creates of one URI at most one succeeds.
49
+ */
50
+ create(uri: string, text: string): Promise<void>;
51
+ update(args: Omit<TransferUpdateArgs<TTransfer>, 'clientId'>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
52
+ /** Write `args.model` as {@link update} does, then persist the document. */
53
+ save(args: Omit<TransferSaveArgs<TTransfer>, 'clientId'>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
54
+ /** Close this session's open of `uri`, at once. A no-op when it does not have `uri` open. */
55
+ close(uri: string): Promise<void>;
56
+ /**
57
+ * Open `uri`, run `fn`, and close `uri` when `fn` settles, whether it
58
+ * returned or threw. A URI the session already had open, or is still
59
+ * opening through another call, stays open: the close undoes only the open
60
+ * this call made.
61
+ */
62
+ withOpen<T>(uri: string, fn: () => MaybePromise<T>): Promise<T>;
63
+ /** Whether an event's `sourceClientId` names this session, i.e. the event echoes its own write. */
64
+ isOwnEcho(sourceClientId: string): boolean;
65
+ /** End the session: close everything it has open and free its id. Idempotent. */
66
+ dispose(): void;
67
+ }
68
+ /**
69
+ * The framework's {@link ClientSession}, built by
70
+ * `DefaultModelService.newSession`.
71
+ *
72
+ * Writes go through the owning `ModelService`, so its overrides apply to a
73
+ * session's writes as they do to anyone's. The open rule is enforced there, not
74
+ * here, because only the service reaches the point where the text is applied.
75
+ *
76
+ * An override of {@link dispose} calls `super.dispose()`: that is what closes
77
+ * the session's opens and frees its id.
78
+ */
79
+ export declare class DefaultClientSession<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic, TTransfer extends TransferElement = TransferElement, TOpenOptions extends OpenOptions = OpenOptions> implements ClientSession<TAst, TDiagnostic, TTransfer, TOpenOptions> {
80
+ protected readonly modelService: ModelService<TAst, TDiagnostic, TTransfer>;
81
+ protected readonly services: ServerSharedServices;
82
+ readonly clientId: string;
83
+ readonly label: string;
84
+ protected disposed: boolean;
85
+ /**
86
+ * This session's opens still under way, by canonical URI. Recorded before
87
+ * the first await, so a second open of the same URI joins the first rather
88
+ * than racing it, and `withOpen` can tell an open another call is making.
89
+ */
90
+ protected readonly pendingOpens: Map<string, Promise<void>>;
91
+ constructor(modelService: ModelService<TAst, TDiagnostic, TTransfer>, services: ServerSharedServices, clientId: string, label: string);
92
+ open(uri: string, options?: TOpenOptions): Promise<void>;
93
+ create(uri: string, text: string): Promise<void>;
94
+ update(args: Omit<TransferUpdateArgs<TTransfer>, 'clientId'>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
95
+ save(args: Omit<TransferSaveArgs<TTransfer>, 'clientId'>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
96
+ close(uri: string): Promise<void>;
97
+ withOpen<T>(uri: string, fn: () => MaybePromise<T>): Promise<T>;
98
+ isOwnEcho(sourceClientId: string): boolean;
99
+ dispose(): void;
100
+ protected assertLive(): void;
101
+ /** Open `uri`, or join the open of it this session already has under way, whose options then stand. */
102
+ protected openDocument(uri: string, options: TOpenOptions | undefined): Promise<void>;
103
+ protected registerOpen(uri: string, options: TOpenOptions | undefined): Promise<void>;
104
+ protected canonicalKey(uri: string): string;
105
+ protected createDocument(uri: string, text: string): Promise<void>;
106
+ protected runWithOpen<T>(uri: string, fn: () => MaybePromise<T>): Promise<T>;
107
+ /**
108
+ * Undo an open that completed after the session ended, then fail it.
109
+ *
110
+ * Ending the session closed only what it had open at that moment. An open
111
+ * still reading from disk registers afterwards, under an id that is no
112
+ * longer a session, and nothing would ever close it.
113
+ *
114
+ * Opens are keyed by id, so once a new session holds the same id this open
115
+ * is indistinguishable from one of its own, and closing it would close the
116
+ * new session's. It is left to that session, which releases it at its end.
117
+ */
118
+ protected rejectIfEnded(uri: string, wasOpen: boolean): Promise<void>;
119
+ }
120
+ //# sourceMappingURL=client-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-session.d.ts","sourceRoot":"","sources":["../../../src/langium/model-service/client-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 CrossBreeze, EclipseSource and others.
3
+ *
4
+ * This program and the accompanying materials are made available under the
5
+ * terms of the MIT License which is available in the project root.
6
+ *
7
+ * SPDX-License-Identifier: MIT
8
+ ********************************************************************************/
9
+ import { UriUtils } from '@hydranium/langium';
10
+ import { SessionClosedError } from '../../documents/client-session-errors.js';
11
+ /**
12
+ * The framework's {@link ClientSession}, built by
13
+ * `DefaultModelService.newSession`.
14
+ *
15
+ * Writes go through the owning `ModelService`, so its overrides apply to a
16
+ * session's writes as they do to anyone's. The open rule is enforced there, not
17
+ * here, because only the service reaches the point where the text is applied.
18
+ *
19
+ * An override of {@link dispose} calls `super.dispose()`: that is what closes
20
+ * the session's opens and frees its id.
21
+ */
22
+ export class DefaultClientSession {
23
+ modelService;
24
+ services;
25
+ clientId;
26
+ label;
27
+ disposed = false;
28
+ /**
29
+ * This session's opens still under way, by canonical URI. Recorded before
30
+ * the first await, so a second open of the same URI joins the first rather
31
+ * than racing it, and `withOpen` can tell an open another call is making.
32
+ */
33
+ pendingOpens = new Map();
34
+ constructor(modelService, services, clientId, label) {
35
+ this.modelService = modelService;
36
+ this.services = services;
37
+ this.clientId = clientId;
38
+ this.label = label;
39
+ }
40
+ open(uri, options) {
41
+ this.assertLive();
42
+ return this.openDocument(uri, options);
43
+ }
44
+ create(uri, text) {
45
+ this.assertLive();
46
+ return this.createDocument(uri, text);
47
+ }
48
+ update(args, cancelToken) {
49
+ this.assertLive();
50
+ return this.modelService.update({ ...args, clientId: this.clientId }, cancelToken);
51
+ }
52
+ save(args, cancelToken) {
53
+ this.assertLive();
54
+ return this.modelService.save({ ...args, clientId: this.clientId }, cancelToken);
55
+ }
56
+ close(uri) {
57
+ this.assertLive();
58
+ return this.modelService.close({ uri, clientId: this.clientId });
59
+ }
60
+ withOpen(uri, fn) {
61
+ this.assertLive();
62
+ return this.runWithOpen(uri, fn);
63
+ }
64
+ isOwnEcho(sourceClientId) {
65
+ this.assertLive();
66
+ return sourceClientId === this.clientId;
67
+ }
68
+ dispose() {
69
+ if (this.disposed) {
70
+ return;
71
+ }
72
+ this.disposed = true;
73
+ this.services.workspace.TextDocuments.closeSession(this.clientId);
74
+ }
75
+ assertLive() {
76
+ if (this.disposed) {
77
+ throw new SessionClosedError(this.clientId);
78
+ }
79
+ }
80
+ /** Open `uri`, or join the open of it this session already has under way, whose options then stand. */
81
+ openDocument(uri, options) {
82
+ const key = this.canonicalKey(uri);
83
+ const pending = this.pendingOpens.get(key);
84
+ if (pending) {
85
+ return pending;
86
+ }
87
+ const opening = this.registerOpen(uri, options).finally(() => {
88
+ if (this.pendingOpens.get(key) === opening) {
89
+ this.pendingOpens.delete(key);
90
+ }
91
+ });
92
+ this.pendingOpens.set(key, opening);
93
+ return opening;
94
+ }
95
+ async registerOpen(uri, options) {
96
+ const textDocuments = this.services.workspace.TextDocuments;
97
+ const wasOpen = textDocuments.isOpenInClient(uri, this.clientId);
98
+ await this.modelService.open({ uri, clientId: this.clientId });
99
+ await this.rejectIfEnded(uri, wasOpen);
100
+ if (!wasOpen && options !== undefined) {
101
+ textDocuments.setOpenOptions(uri, this.clientId, options);
102
+ }
103
+ }
104
+ canonicalKey(uri) {
105
+ return this.services.workspace.DocumentUriPolicy.canonicalUri(uri);
106
+ }
107
+ async createDocument(uri, text) {
108
+ if (await this.services.workspace.FileSystemProvider.exists(UriUtils.toUri(uri))) {
109
+ throw new Error(`Cannot create ${uri}: the file exists`);
110
+ }
111
+ this.assertLive();
112
+ if (this.modelService.isOpen(uri)) {
113
+ throw new Error(`Cannot create ${uri}: it is open in a client`);
114
+ }
115
+ // The check above cannot see an open that registers while this one is
116
+ // under way, and opening an already-open URI only attaches, dropping
117
+ // `text`. Only an open that creates the document fires `onDidOpen`, so
118
+ // hearing it for this session, during this open, is what proves the
119
+ // document holds `text`; the client list afterwards cannot, since a
120
+ // client that registered first may have closed again by then.
121
+ const key = this.canonicalKey(uri);
122
+ let created = false;
123
+ const listener = this.services.workspace.TextDocuments.onDidOpen(event => {
124
+ if (event.clientId === this.clientId && event.document.uri === key) {
125
+ created = true;
126
+ }
127
+ });
128
+ try {
129
+ await this.modelService.open({ uri, clientId: this.clientId, text });
130
+ }
131
+ finally {
132
+ listener.dispose();
133
+ }
134
+ await this.rejectIfEnded(uri, false);
135
+ if (!created) {
136
+ await this.modelService.close({ uri, clientId: this.clientId });
137
+ throw new Error(`Cannot create ${uri}: it is open in a client`);
138
+ }
139
+ }
140
+ async runWithOpen(uri, fn) {
141
+ // An open another call of this session is still making counts as made:
142
+ // closing it afterwards would take away an open that call asked for.
143
+ const alreadyOpen = this.services.workspace.TextDocuments.isOpenInClient(uri, this.clientId) || this.pendingOpens.has(this.canonicalKey(uri));
144
+ await this.openDocument(uri, undefined);
145
+ try {
146
+ return await fn();
147
+ }
148
+ finally {
149
+ if (!alreadyOpen && !this.disposed) {
150
+ await this.modelService.close({ uri, clientId: this.clientId });
151
+ }
152
+ }
153
+ }
154
+ /**
155
+ * Undo an open that completed after the session ended, then fail it.
156
+ *
157
+ * Ending the session closed only what it had open at that moment. An open
158
+ * still reading from disk registers afterwards, under an id that is no
159
+ * longer a session, and nothing would ever close it.
160
+ *
161
+ * Opens are keyed by id, so once a new session holds the same id this open
162
+ * is indistinguishable from one of its own, and closing it would close the
163
+ * new session's. It is left to that session, which releases it at its end.
164
+ */
165
+ async rejectIfEnded(uri, wasOpen) {
166
+ if (!this.disposed) {
167
+ return;
168
+ }
169
+ if (!wasOpen && this.modelService.getSession(this.clientId) === undefined) {
170
+ await this.modelService.close({ uri, clientId: this.clientId });
171
+ }
172
+ throw new SessionClosedError(this.clientId);
173
+ }
174
+ }
175
+ //# sourceMappingURL=client-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-session.js","sourceRoot":"","sources":["../../../src/langium/model-service/client-session.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,5 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  export * from './model-service.js';
10
+ export * from './client-session.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/langium/model-service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/langium/model-service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -7,4 +7,5 @@
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
9
  export * from './model-service.js';
10
+ export * from './client-session.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/langium/model-service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/langium/model-service/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -6,14 +6,16 @@
6
6
  *
7
7
  * SPDX-License-Identifier: MIT
8
8
  ********************************************************************************/
9
- import { type CanonicalUri, type CloseModelArgs, type MaybeObservableValue, type MaybePromise, ObservableValue, type TransferElement, type OpenModelArgs, type Tracer, type TransferSaveArgs, type TransferUpdateArgs } from '@hydranium/protocol';
9
+ import { type BasedOn, type CanonicalUri, type CloseModelArgs, type MaybeObservableValue, type MaybePromise, ObservableValue, type TransferElement, type OpenModelArgs, type Tracer, type TransferSaveArgs, type TransferUpdateArgs } from '@hydranium/protocol';
10
10
  import { type AstNode, DocumentState, type LangiumDocument, type URI } from '@hydranium/langium';
11
11
  import { type AstDiagnostic } from '../validation/document-validator.js';
12
12
  import { type DocumentUriPolicy } from '../workspace/document-uri-policy.js';
13
13
  import { type CancellationToken, type Disposable } from 'vscode-languageserver';
14
14
  import { AstDocument, type AstDocumentSavedEvent, type AstDocumentUpdatedEvent } from '../../documents/ast-document-manager.js';
15
15
  import { type LogNameOptions } from '../diagnostics/logger.js';
16
+ import { type OpenOptions } from '../../documents/client-session-registry.js';
16
17
  import { type ServerSharedServices } from '../module.js';
18
+ import { type ClientSession } from './client-session.js';
17
19
  /**
18
20
  * The undo-stack entry for a server-authored write pushed to the editor.
19
21
  *
@@ -227,6 +229,17 @@ export interface ModelService<TAst extends AstNode, TDiagnostic extends AstDiagn
227
229
  onModelUpdated(uri: string, listener: (event: AstDocumentUpdatedEvent<TAst, TDiagnostic>) => void): Disposable;
228
230
  onModelSaved(uri: string, listener: (event: AstDocumentSavedEvent<TAst, TDiagnostic>) => void): Disposable;
229
231
  onClientClosed(uri: string, clientId: string, listener: () => void): Disposable;
232
+ /**
233
+ * Start a client session. The id defaults to `label#` plus a random UUID;
234
+ * a fixed `clientId` is taken as given. Throws `DuplicateClientIdError` when
235
+ * the id is reserved by the framework, held by another live session, or has
236
+ * documents open under it as a client that is not a session.
237
+ *
238
+ * `TOpenOptions` types the options the session's `open` takes.
239
+ */
240
+ createSession<TOpenOptions extends OpenOptions = OpenOptions>(label?: string, clientId?: string): ClientSession<TAst, TDiagnostic, TTransfer, TOpenOptions>;
241
+ /** The live session started under `clientId`, or `undefined` once it has ended or was never started. */
242
+ getSession(clientId: string): ClientSession<TAst, TDiagnostic, TTransfer> | undefined;
230
243
  }
231
244
  export declare class DefaultModelService<TAst extends AstNode, TDiagnostic extends AstDiagnostic = AstDiagnostic,
232
245
  /**
@@ -266,6 +279,19 @@ TTransfer extends TransferElement = TransferElement> implements ModelService<TAs
266
279
  */
267
280
  protected readonly syncChains: Map<string, Promise<void>>;
268
281
  protected readonly pendingSync: Map<string, string>;
282
+ /**
283
+ * The live sessions this service started, by client id. {@link update}
284
+ * reads it to tell a session's write, which must find its document open,
285
+ * from a write under a plain client id, which opens it.
286
+ */
287
+ protected readonly sessions: Map<string, ClientSession<TAst, TDiagnostic, TTransfer, object>>;
288
+ /**
289
+ * Drops an ended session from {@link sessions}. Subscribed by the first
290
+ * {@link createSession} rather than at construction, so a services tree with
291
+ * no text store, or one that knows nothing of sessions, still constructs
292
+ * this service.
293
+ */
294
+ protected sessionCloseListener?: Disposable;
269
295
  /**
270
296
  * Workspace-level readiness gate. Resolves when the framework has
271
297
  * finished its first workspace build cycle and the `ModelService`
@@ -466,8 +492,22 @@ TTransfer extends TransferElement = TransferElement> implements ModelService<TAs
466
492
  * with vN's specific settled snapshot, intermediate-phase
467
493
  * observability, slow-warn / hard-timeout behaviour) override this
468
494
  * method.
495
+ *
496
+ * **Upsert, except for a session.** Under a plain client id the write opens
497
+ * the document for that client first, creating it from the payload when no
498
+ * file exists. Under the id of a live session from {@link createSession} it
499
+ * opens nothing, and fails with `DocumentNotOpenError` unless the session
500
+ * has the URI open at the moment the text is applied.
469
501
  */
470
502
  update(args: TransferUpdateArgs<TTransfer>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
503
+ /**
504
+ * Throw {@link ConflictError} when `basedOn` names a version other than
505
+ * `currentVersion`. {@link update} calls it at the door and again in the
506
+ * synchronous step that applies the text, and has to call it synchronously
507
+ * there: a check separated from the apply by an await lets two writes based
508
+ * on one version both apply.
509
+ */
510
+ protected checkBasedOn(uri: string, basedOn: BasedOn, currentVersion: number): void;
471
511
  /**
472
512
  * Persist `uri` to disk. Same content-change + settled-phase flow as
473
513
  * {@link update}, then writes via the
@@ -476,6 +516,11 @@ TTransfer extends TransferElement = TransferElement> implements ModelService<TAs
476
516
  * the `onDidSave` event regardless of who originated the persist).
477
517
  *
478
518
  * Returns the post-save AST snapshot.
519
+ *
520
+ * Under the id of a live session the save also fails with
521
+ * `DocumentNotOpenError` when the session closes the URI while the text is
522
+ * being built, and writes nothing. Once the manager has taken the text, the
523
+ * write completes whatever the session does next.
479
524
  */
480
525
  save(args: TransferSaveArgs<TTransfer>, cancelToken?: CancellationToken): Promise<AstDocument<TAst, TDiagnostic>>;
481
526
  /**
@@ -557,6 +602,17 @@ TTransfer extends TransferElement = TransferElement> implements ModelService<TAs
557
602
  * nothing logged. Use {@link snapshot} for that, or a phase read.
558
603
  */
559
604
  getDocument(uri: string): LangiumDocument | undefined;
605
+ createSession<TOpenOptions extends OpenOptions = OpenOptions>(label?: string, clientId?: string): ClientSession<TAst, TDiagnostic, TTransfer, TOpenOptions>;
606
+ getSession(clientId: string): ClientSession<TAst, TDiagnostic, TTransfer> | undefined;
607
+ /**
608
+ * Build the handle for a session {@link createSession} has already
609
+ * registered. The override point for a custom session class; narrow the
610
+ * return type to it.
611
+ *
612
+ * Registration and the uniqueness check have already happened when this
613
+ * runs, so an override cannot skip them.
614
+ */
615
+ protected newSession<TOpenOptions extends OpenOptions = OpenOptions>(clientId: string, label: string): ClientSession<TAst, TDiagnostic, TTransfer, TOpenOptions>;
560
616
  /**
561
617
  * Mirror a server-side change of `document` back to the LSP textual language
562
618
  * client, run per document as it reaches the post-integrity settled phase.