@hydranium/core 1.0.0-next.114 → 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.
- package/README.md +3 -1
- package/lib/documents/ast-document-manager.d.ts +52 -2
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +67 -5
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +44 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +57 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +118 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +171 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +77 -25
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +143 -52
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +2 -0
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +2 -0
- package/lib/documents/index.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +13 -5
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +37 -6
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +81 -17
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +120 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +175 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +1 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +1 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-service.d.ts +76 -8
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +148 -21
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.d.ts +6 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +20 -3
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +4 -3
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +3 -0
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +13 -5
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +45 -14
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/package.json +5 -5
- package/src/documents/ast-document-manager.ts +107 -6
- package/src/documents/client-session-errors.ts +54 -0
- package/src/documents/client-session-registry.ts +211 -0
- package/src/documents/hydranium-text-documents.ts +158 -55
- package/src/documents/index.ts +2 -0
- package/src/langium/integrity/integrity-rule.ts +13 -5
- package/src/langium/integrity/integrity-service.ts +84 -17
- package/src/langium/model-service/client-session.ts +257 -0
- package/src/langium/model-service/index.ts +1 -0
- package/src/langium/model-service/model-service.ts +176 -21
- package/src/lsp/hydranium-document-update-handler.ts +22 -4
- package/src/testing/stub-ast-document-manager.ts +7 -2
- package/src/testing/stub-hydranium-text-documents.ts +62 -18
|
@@ -0,0 +1,171 @@
|
|
|
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 { FRAMEWORK_CLIENT_IDS } from '@hydranium/protocol';
|
|
10
|
+
import { Emitter } from 'vscode-languageserver';
|
|
11
|
+
import { INTEGRITY_CLIENT_ID } from '../langium/integrity/integrity-rule.js';
|
|
12
|
+
import { DuplicateClientIdError, SessionClosedError } from './client-session-errors.js';
|
|
13
|
+
/**
|
|
14
|
+
* The ids no client session may be started under: the wire's well-known ids and
|
|
15
|
+
* the integrity author. Each names a framework participant rather than a
|
|
16
|
+
* client, and a session holding one would have its writes read as that
|
|
17
|
+
* participant's.
|
|
18
|
+
*/
|
|
19
|
+
export const RESERVED_CLIENT_IDS = [...FRAMEWORK_CLIENT_IDS, INTEGRITY_CLIENT_ID];
|
|
20
|
+
/**
|
|
21
|
+
* Which client has which document open, and which client ids are registered
|
|
22
|
+
* sessions — the open facts every head shares, composed by
|
|
23
|
+
* `HydraniumTextDocuments`.
|
|
24
|
+
*
|
|
25
|
+
* Opens are recorded for every client id, registered or not. An id that was
|
|
26
|
+
* never registered is a client that predates sessions and writes through the
|
|
27
|
+
* flat `clientId` calls; its opens are tracked exactly as a session's are, and
|
|
28
|
+
* only the session table ignores it. Requiring registration before an open
|
|
29
|
+
* would refuse every such client.
|
|
30
|
+
*
|
|
31
|
+
* One open per `(client, uri)`, with no reference count: a repeat open changes
|
|
32
|
+
* nothing, and one close ends it.
|
|
33
|
+
*
|
|
34
|
+
* Pure bookkeeping. Closing a document is the store's job, because a close has
|
|
35
|
+
* to reach the text store and its listeners; the store asks this class what to
|
|
36
|
+
* close and records each close here.
|
|
37
|
+
*/
|
|
38
|
+
export class ClientSessionRegistry {
|
|
39
|
+
sessions = new Map();
|
|
40
|
+
clientsByUri = new Map();
|
|
41
|
+
/** Each client's opens, with the options it opened them with. */
|
|
42
|
+
opensByClient = new Map();
|
|
43
|
+
reservedIds = new Set(RESERVED_CLIENT_IDS);
|
|
44
|
+
sessionClosedEmitter = new Emitter();
|
|
45
|
+
/** Fires once a session has been removed from the table, after all its opens closed. */
|
|
46
|
+
get onDidCloseSession() {
|
|
47
|
+
return this.sessionClosedEmitter.event;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Enter `clientId` in the session table.
|
|
51
|
+
*
|
|
52
|
+
* Throws {@link DuplicateClientIdError} when the id is live anywhere in the
|
|
53
|
+
* process: reserved, registered (including by a session that is still
|
|
54
|
+
* closing), or holding opens as a client that is not a session. The last
|
|
55
|
+
* matters because the id is the author label and the echo key, and a
|
|
56
|
+
* session sharing one with another client would take that client's writes
|
|
57
|
+
* for its own.
|
|
58
|
+
*/
|
|
59
|
+
register(clientId) {
|
|
60
|
+
if (this.reservedIds.has(clientId) || this.sessions.has(clientId) || this.opensByClient.has(clientId)) {
|
|
61
|
+
throw new DuplicateClientIdError(clientId);
|
|
62
|
+
}
|
|
63
|
+
this.sessions.set(clientId, 'live');
|
|
64
|
+
}
|
|
65
|
+
/** Whether `clientId` is in the session table, live or closing. */
|
|
66
|
+
isRegistered(clientId) {
|
|
67
|
+
return this.sessions.has(clientId);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Mark `clientId` as closing and return every URI it has open, as a copy the
|
|
71
|
+
* caller can close while this registry changes underneath it.
|
|
72
|
+
*/
|
|
73
|
+
beginClose(clientId) {
|
|
74
|
+
if (this.sessions.has(clientId)) {
|
|
75
|
+
this.sessions.set(clientId, 'closing');
|
|
76
|
+
}
|
|
77
|
+
return this.opensOf(clientId);
|
|
78
|
+
}
|
|
79
|
+
/** Remove `clientId` from the session table and announce it. A no-op for an id that is not registered. */
|
|
80
|
+
unregister(clientId) {
|
|
81
|
+
if (!this.sessions.delete(clientId)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.sessionClosedEmitter.fire(Object.freeze({ clientId }));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Record that `clientId` opened `uri`, with no options. Returns `false` when
|
|
88
|
+
* it already had it open, in which case nothing changes.
|
|
89
|
+
*
|
|
90
|
+
* Throws {@link SessionClosedError} for a session that is closing.
|
|
91
|
+
*/
|
|
92
|
+
addOpen(uri, clientId) {
|
|
93
|
+
if (this.sessions.get(clientId) === 'closing') {
|
|
94
|
+
throw new SessionClosedError(clientId);
|
|
95
|
+
}
|
|
96
|
+
let opens = this.opensByClient.get(clientId);
|
|
97
|
+
if (opens?.has(uri)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (!opens) {
|
|
101
|
+
opens = new Map();
|
|
102
|
+
this.opensByClient.set(clientId, opens);
|
|
103
|
+
}
|
|
104
|
+
opens.set(uri, undefined);
|
|
105
|
+
let clients = this.clientsByUri.get(uri);
|
|
106
|
+
if (!clients) {
|
|
107
|
+
clients = new Set();
|
|
108
|
+
this.clientsByUri.set(uri, clients);
|
|
109
|
+
}
|
|
110
|
+
clients.add(clientId);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
/** Record that `clientId` closed `uri`. Returns `false` when it did not have it open. */
|
|
114
|
+
removeOpen(uri, clientId) {
|
|
115
|
+
const opens = this.opensByClient.get(clientId);
|
|
116
|
+
if (!opens?.delete(uri)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (opens.size === 0) {
|
|
120
|
+
this.opensByClient.delete(clientId);
|
|
121
|
+
}
|
|
122
|
+
const clients = this.clientsByUri.get(uri);
|
|
123
|
+
clients?.delete(clientId);
|
|
124
|
+
if (!clients?.size) {
|
|
125
|
+
this.clientsByUri.delete(uri);
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/** Whether `clientId` has `uri` open. */
|
|
130
|
+
isOpenIn(uri, clientId) {
|
|
131
|
+
return !!this.clientsByUri.get(uri)?.has(clientId);
|
|
132
|
+
}
|
|
133
|
+
/** Whether any client has `uri` open. */
|
|
134
|
+
isOpen(uri) {
|
|
135
|
+
return this.clientsByUri.has(uri);
|
|
136
|
+
}
|
|
137
|
+
/** The clients that have `uri` open, in the order they opened it. */
|
|
138
|
+
clientsOf(uri) {
|
|
139
|
+
return [...(this.clientsByUri.get(uri) ?? [])];
|
|
140
|
+
}
|
|
141
|
+
/** The URIs `clientId` has open, in the order it opened them. */
|
|
142
|
+
opensOf(clientId) {
|
|
143
|
+
return [...(this.opensByClient.get(clientId)?.keys() ?? [])];
|
|
144
|
+
}
|
|
145
|
+
/** Every document open in at least one client, with the clients that have it open. */
|
|
146
|
+
openDocuments() {
|
|
147
|
+
return [...this.clientsByUri].map(([uri, clients]) => ({ uri, clients: [...clients] }));
|
|
148
|
+
}
|
|
149
|
+
/** The options `clientId` opened `uri` with, or `undefined` when it gave none or does not have it open. */
|
|
150
|
+
openOptions(uri, clientId) {
|
|
151
|
+
return this.opensByClient.get(clientId)?.get(uri);
|
|
152
|
+
}
|
|
153
|
+
/** Replace the options of an existing open. Does nothing when `clientId` does not have `uri` open. */
|
|
154
|
+
setOpenOptions(uri, clientId, options) {
|
|
155
|
+
const opens = this.opensByClient.get(clientId);
|
|
156
|
+
if (opens?.has(uri)) {
|
|
157
|
+
opens.set(uri, options);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Forget every session and open without announcing anything. Subscriptions
|
|
162
|
+
* stay, so a listener registered before the clear hears the sessions that
|
|
163
|
+
* end after it.
|
|
164
|
+
*/
|
|
165
|
+
clear() {
|
|
166
|
+
this.sessions.clear();
|
|
167
|
+
this.clientsByUri.clear();
|
|
168
|
+
this.opensByClient.clear();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=client-session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-session-registry.js","sourceRoot":"","sources":["../../src/documents/client-session-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
* SPDX-License-Identifier: MIT
|
|
9
9
|
********************************************************************************/
|
|
10
10
|
import { NormalizedTextDocuments } from '@hydranium/langium/lsp';
|
|
11
|
+
import { type URI } from '@hydranium/langium';
|
|
11
12
|
import { type ServerSharedServices } from '../langium/module.js';
|
|
12
13
|
import { type ApplyWorkspaceEditResult, type CancellationToken, type Connection, type DidChangeTextDocumentParams, type DidCloseTextDocumentParams, type DidOpenTextDocumentParams, type DidSaveTextDocumentParams, type Disposable, type Emitter, type Event, type HandlerResult, type RequestHandler, type TextDocumentChangeEvent, type TextDocumentWillSaveEvent, type TextDocumentsConfiguration, type TextEdit, type WillSaveTextDocumentParams } from 'vscode-languageserver';
|
|
13
14
|
import { type DocumentUri, TextDocument, type TextDocumentContentChangeEvent } from 'vscode-languageserver-textdocument';
|
|
14
15
|
import { type CanonicalUri, type LanguageClientUri, type Tracer } from '@hydranium/protocol';
|
|
15
16
|
import { type LogNameOptions } from '../langium/diagnostics/logger.js';
|
|
17
|
+
import { type ClientSessionClosedEvent, ClientSessionRegistry, type OpenOptions } from './client-session-registry.js';
|
|
16
18
|
import { LanguageClientTextShadow } from './language-client-text-shadow.js';
|
|
17
19
|
export interface ClientTextDocumentChangeEvent<T> extends TextDocumentChangeEvent<T> {
|
|
18
20
|
clientId: string;
|
|
@@ -49,8 +51,6 @@ export interface HydraniumTextDocumentsOptions<T extends TextDocument = TextDocu
|
|
|
49
51
|
* change that caused it.
|
|
50
52
|
*/
|
|
51
53
|
export interface DocumentTrackingRecord {
|
|
52
|
-
/** Client ids currently holding this document open (multi-client membership). */
|
|
53
|
-
readonly clients: Set<string>;
|
|
54
54
|
/** Author of each version, sparse-indexed by the SHARED (server-assigned) version number. */
|
|
55
55
|
readonly versionAuthors: string[];
|
|
56
56
|
/**
|
|
@@ -171,7 +171,8 @@ export type LanguageClientChangeOrigin =
|
|
|
171
171
|
* Multi-client text-document tracking on top of Langium's `NormalizedTextDocuments`.
|
|
172
172
|
*
|
|
173
173
|
* Adds the framework features used by the integrity, model-server, and GLSP layers:
|
|
174
|
-
* - Per-document client membership (multiple clients can attach to the same
|
|
174
|
+
* - Per-document client membership (multiple clients can attach to the same
|
|
175
|
+
* URI) and the client-session table, both kept by {@link __sessions}.
|
|
175
176
|
* - A SERVER-OWNED shared version sequence: per-URI, monotonic across
|
|
176
177
|
* close/reopen cycles, advancing exactly when the synced content changes.
|
|
177
178
|
* Client-declared version ids (Monaco's buffer numbering) feed only a
|
|
@@ -190,14 +191,18 @@ export type LanguageClientChangeOrigin =
|
|
|
190
191
|
export declare class HydraniumTextDocuments<T extends TextDocument = TextDocument> extends NormalizedTextDocuments<T> {
|
|
191
192
|
protected services: ServerSharedServices;
|
|
192
193
|
/**
|
|
193
|
-
* Per-URI client-facing tracking ({@link DocumentTrackingRecord})
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
* {@link __shadow} (its own abstraction); the parsed-document store stays in
|
|
198
|
-
* the inherited `__syncedDocuments`.
|
|
194
|
+
* Per-URI client-facing tracking ({@link DocumentTrackingRecord}), keyed by
|
|
195
|
+
* canonical URI. One record per URI, so dropping it clears every axis at
|
|
196
|
+
* once. Which client has the document open is kept apart, in
|
|
197
|
+
* {@link __sessions}.
|
|
199
198
|
*/
|
|
200
199
|
protected __documents: Map<CanonicalUri, DocumentTrackingRecord>;
|
|
200
|
+
/**
|
|
201
|
+
* Which client has which document open, and which client ids are registered
|
|
202
|
+
* sessions. Every open-state predicate on this class reads it, so an open
|
|
203
|
+
* recorded anywhere else is invisible to the last-close transition.
|
|
204
|
+
*/
|
|
205
|
+
protected readonly __sessions: ClientSessionRegistry;
|
|
201
206
|
/**
|
|
202
207
|
* Per-URI shared-version continuity across close/reopen cycles
|
|
203
208
|
* ({@link VersionSequence}), written at last-client close and consulted by
|
|
@@ -412,10 +417,12 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
412
417
|
* its own numbering, so requiring the two to agree would refuse every commit
|
|
413
418
|
* on the path this exists for. Content is the thing both sides can be held to.
|
|
414
419
|
*
|
|
415
|
-
*
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
*
|
|
420
|
+
* A changed text is a new version authored by {@link INTEGRITY_CLIENT_ID}.
|
|
421
|
+
* Kept at the old version, the repair is invisible to every reader keyed on
|
|
422
|
+
* versions: a write based on the unrepaired version passes the based-on gate
|
|
423
|
+
* and replaces the repair, and an echo filter credits the repair to the
|
|
424
|
+
* client whose edit it corrected. No change event is fired: the repair
|
|
425
|
+
* rides the build already under way, and an event would re-enter it.
|
|
419
426
|
*/
|
|
420
427
|
commitRepair(uri: DocumentUri, parsedFrom: string, repaired: string): RepairCommit<T>;
|
|
421
428
|
getAuthor(uri: DocumentUri, version?: number): string | undefined;
|
|
@@ -424,8 +431,8 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
424
431
|
* True iff any client still holds `uri` open. Distinct from {@link isOpen},
|
|
425
432
|
* which reads `__syncedDocuments` — that map is cleared only AFTER the
|
|
426
433
|
* `onDidClose` event fires for the last client, so `isOpen` returns `true`
|
|
427
|
-
* during the close event itself. `isOpenInAnyClient` reads the
|
|
428
|
-
*
|
|
434
|
+
* during the close event itself. `isOpenInAnyClient` reads the open table
|
|
435
|
+
* ({@link __sessions}), which is updated BEFORE the fire, so an `onDidClose`
|
|
429
436
|
* subscriber that finds this `false` knows the last client just closed and a
|
|
430
437
|
* disk re-read / rebuild can proceed.
|
|
431
438
|
*/
|
|
@@ -435,8 +442,8 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
435
442
|
isOnlyOpenInClient(uri: DocumentUri, client: string): boolean;
|
|
436
443
|
/**
|
|
437
444
|
* Every document currently held open by at least one client, with the client
|
|
438
|
-
* ids holding it. Reads the same
|
|
439
|
-
*
|
|
445
|
+
* ids holding it. Reads the same open table as {@link isOpenInAnyClient}, so
|
|
446
|
+
* it reflects a last-client close immediately.
|
|
440
447
|
*
|
|
441
448
|
* Diagnostics-oriented — the server-state snapshot lists these so an operator
|
|
442
449
|
* can see WHY a document is pinned: a document that lingers here after its
|
|
@@ -444,21 +451,66 @@ export declare class HydraniumTextDocuments<T extends TextDocument = TextDocumen
|
|
|
444
451
|
* under a shedding policy, explains why its CST is never shed).
|
|
445
452
|
*/
|
|
446
453
|
openDocuments(): OpenDocument[];
|
|
454
|
+
/** Fires once a client session has ended, after every document it had open was closed. */
|
|
455
|
+
get onDidCloseSession(): Event<ClientSessionClosedEvent>;
|
|
456
|
+
/**
|
|
457
|
+
* Start a client session under `clientId`. Throws `DuplicateClientIdError`
|
|
458
|
+
* where {@link ClientSessionRegistry.register} refuses the id.
|
|
459
|
+
*/
|
|
460
|
+
registerSession(clientId: string): void;
|
|
461
|
+
/**
|
|
462
|
+
* End the client session `clientId`: close every document it has open, then
|
|
463
|
+
* free the id. Immediate — each close runs the ordinary close path before
|
|
464
|
+
* this returns. A no-op for an id that is not a registered session.
|
|
465
|
+
*/
|
|
466
|
+
closeSession(clientId: string): void;
|
|
467
|
+
/** The options `clientId` opened `uri` with, or `undefined` when it gave none or does not have it open. */
|
|
468
|
+
openOptions(uri: DocumentUri, clientId: string): OpenOptions | undefined;
|
|
469
|
+
/** Replace the options of an existing open. Does nothing when `clientId` does not have `uri` open. */
|
|
470
|
+
setOpenOptions(uri: DocumentUri, clientId: string, options: OpenOptions | undefined): void;
|
|
471
|
+
/**
|
|
472
|
+
* The file behind `uri` was deleted: close every open of it except the
|
|
473
|
+
* language client's.
|
|
474
|
+
*
|
|
475
|
+
* The editor's open is left alone because the editor owns it: it keeps the
|
|
476
|
+
* buffer of a deleted file and goes on sending changes for it, and a store
|
|
477
|
+
* that had closed the document would drop every one of them until the editor
|
|
478
|
+
* reopened.
|
|
479
|
+
*/
|
|
480
|
+
notifyDocumentDeleted(uri: DocumentUri): void;
|
|
481
|
+
/**
|
|
482
|
+
* Remove the document for `uri`, closing every open of it first — the
|
|
483
|
+
* editor's included, since the document it would keep editing is gone.
|
|
484
|
+
*
|
|
485
|
+
* The base removes the synced document without consulting the open table,
|
|
486
|
+
* which leaves every open recorded against a document that no longer exists:
|
|
487
|
+
* the store then answers that the URI is open, and the next open attaches to
|
|
488
|
+
* nothing.
|
|
489
|
+
*/
|
|
490
|
+
delete(uri: string | URI | T): void;
|
|
491
|
+
/**
|
|
492
|
+
* A client id as log lines print it. An id containing `#` is cut eight
|
|
493
|
+
* characters after its last `#`, which leaves a minted `label#uuid` as the
|
|
494
|
+
* label and enough of the UUID to tell sessions apart; an id without `#`
|
|
495
|
+
* prints whole. The full id goes out at trace level wherever a session
|
|
496
|
+
* starts or ends.
|
|
497
|
+
*/
|
|
498
|
+
protected formatClientId(clientId: string): string;
|
|
447
499
|
/**
|
|
448
|
-
* Stages integrity-updated content for a document no
|
|
500
|
+
* Stages integrity-updated content for a document no client holds.
|
|
449
501
|
*
|
|
450
502
|
* When `workspace/applyEdit` targets a closed file, the client opens it from
|
|
451
503
|
* disk (stale) and sends `didOpen` before applying the edit. This staged
|
|
452
504
|
* content is consumed by {@link notifyDidOpenTextDocument} to replace the
|
|
453
505
|
* stale disk text, preventing a brief revert of the integrity update.
|
|
454
506
|
*
|
|
455
|
-
* Only a FIRST open consumes it
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
* tracking record.
|
|
460
|
-
*
|
|
461
|
-
*
|
|
507
|
+
* Only a FIRST open consumes it, so stage only for a URI no client holds
|
|
508
|
+
* ({@link isOpenInAnyClient} is `false`). A URI held only through another
|
|
509
|
+
* head is not closed: an editor attaching to it joins the existing entry and
|
|
510
|
+
* never reads the stage, and the last close discards the stage with the
|
|
511
|
+
* tracking record. An entry lingers only if `workspace/applyEdit` fails and
|
|
512
|
+
* the file is never opened — the memory cost is one serialised string per
|
|
513
|
+
* URI.
|
|
462
514
|
*/
|
|
463
515
|
stagePendingContent(uri: DocumentUri, text: string): void;
|
|
464
516
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydranium-text-documents.d.ts","sourceRoot":"","sources":["../../src/documents/hydranium-text-documents.ts"],"names":[],"mappings":"AAAA;;;;;;;;kFAQkF;AAalF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"hydranium-text-documents.d.ts","sourceRoot":"","sources":["../../src/documents/hydranium-text-documents.ts"],"names":[],"mappings":"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"}
|