@hydranium/protocol 1.0.0-next.39 → 1.0.0-next.390

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 (311) hide show
  1. package/README.md +46 -83
  2. package/lib/abstract-logger.d.ts +11 -0
  3. package/lib/abstract-logger.d.ts.map +1 -1
  4. package/lib/abstract-logger.js +16 -0
  5. package/lib/abstract-logger.js.map +1 -1
  6. package/lib/client/data-connection.d.ts +303 -0
  7. package/lib/client/data-connection.d.ts.map +1 -0
  8. package/lib/client/data-connection.js +534 -0
  9. package/lib/client/data-connection.js.map +1 -0
  10. package/lib/client/data-events.d.ts +11 -2
  11. package/lib/client/data-events.d.ts.map +1 -1
  12. package/lib/client/data-events.js +13 -1
  13. package/lib/client/data-events.js.map +1 -1
  14. package/lib/client/data-port.d.ts +34 -24
  15. package/lib/client/data-port.d.ts.map +1 -1
  16. package/lib/client/data-session.d.ts +762 -89
  17. package/lib/client/data-session.d.ts.map +1 -1
  18. package/lib/client/data-session.js +1253 -115
  19. package/lib/client/data-session.js.map +1 -1
  20. package/lib/client/index.d.ts +16 -9
  21. package/lib/client/index.d.ts.map +1 -1
  22. package/lib/client/index.js +16 -9
  23. package/lib/client/index.js.map +1 -1
  24. package/lib/client/message-relay.d.ts +6 -4
  25. package/lib/client/message-relay.d.ts.map +1 -1
  26. package/lib/client/message-relay.js +4 -4
  27. package/lib/client/message-relay.js.map +1 -1
  28. package/lib/client/post-message-transport.d.ts +69 -3
  29. package/lib/client/post-message-transport.d.ts.map +1 -1
  30. package/lib/client/post-message-transport.js +175 -1
  31. package/lib/client/post-message-transport.js.map +1 -1
  32. package/lib/client/rpc-connection.d.ts +173 -0
  33. package/lib/client/rpc-connection.d.ts.map +1 -0
  34. package/lib/client/rpc-connection.js +225 -0
  35. package/lib/client/rpc-connection.js.map +1 -0
  36. package/lib/client/worker-handshake.d.ts +94 -0
  37. package/lib/client/worker-handshake.d.ts.map +1 -0
  38. package/lib/client/worker-handshake.js +51 -0
  39. package/lib/client/worker-handshake.js.map +1 -0
  40. package/lib/client/working-copy.d.ts +420 -0
  41. package/lib/client/working-copy.d.ts.map +1 -0
  42. package/lib/client/working-copy.js +958 -0
  43. package/lib/client/working-copy.js.map +1 -0
  44. package/lib/client-ids.d.ts +45 -0
  45. package/lib/client-ids.d.ts.map +1 -0
  46. package/lib/client-ids.js +48 -0
  47. package/lib/client-ids.js.map +1 -0
  48. package/lib/clock.d.ts +50 -10
  49. package/lib/clock.d.ts.map +1 -1
  50. package/lib/clock.js +36 -1
  51. package/lib/clock.js.map +1 -1
  52. package/lib/console-logger.d.ts +23 -0
  53. package/lib/console-logger.d.ts.map +1 -0
  54. package/lib/console-logger.js +39 -0
  55. package/lib/console-logger.js.map +1 -0
  56. package/lib/data/data-protocol-methods.d.ts +4 -4
  57. package/lib/data/data-protocol-methods.d.ts.map +1 -1
  58. package/lib/data/data-protocol-methods.js +7 -0
  59. package/lib/data/data-protocol-methods.js.map +1 -1
  60. package/lib/data/data-server-protocol.d.ts +160 -50
  61. package/lib/data/data-server-protocol.d.ts.map +1 -1
  62. package/lib/data/events.d.ts +75 -31
  63. package/lib/data/events.d.ts.map +1 -1
  64. package/lib/data/requests.d.ts +84 -11
  65. package/lib/data/requests.d.ts.map +1 -1
  66. package/lib/debouncer.d.ts +7 -4
  67. package/lib/debouncer.d.ts.map +1 -1
  68. package/lib/debouncer.js +10 -10
  69. package/lib/debouncer.js.map +1 -1
  70. package/lib/errors.d.ts +241 -48
  71. package/lib/errors.d.ts.map +1 -1
  72. package/lib/errors.js +395 -60
  73. package/lib/errors.js.map +1 -1
  74. package/lib/format-log-arg.d.ts +33 -0
  75. package/lib/format-log-arg.d.ts.map +1 -0
  76. package/lib/format-log-arg.js +158 -0
  77. package/lib/format-log-arg.js.map +1 -0
  78. package/lib/glsp-edits-settled-actions.d.ts +54 -0
  79. package/lib/glsp-edits-settled-actions.d.ts.map +1 -0
  80. package/lib/glsp-edits-settled-actions.js +28 -0
  81. package/lib/glsp-edits-settled-actions.js.map +1 -0
  82. package/lib/glsp-request-model-args.d.ts +16 -0
  83. package/lib/glsp-request-model-args.d.ts.map +1 -0
  84. package/lib/glsp-request-model-args.js +19 -0
  85. package/lib/glsp-request-model-args.js.map +1 -0
  86. package/lib/glsp-save-model-actions.d.ts +55 -0
  87. package/lib/glsp-save-model-actions.d.ts.map +1 -0
  88. package/lib/glsp-save-model-actions.js +28 -0
  89. package/lib/glsp-save-model-actions.js.map +1 -0
  90. package/lib/index.d.ts +11 -0
  91. package/lib/index.d.ts.map +1 -1
  92. package/lib/index.js +11 -0
  93. package/lib/index.js.map +1 -1
  94. package/lib/latency-collector.d.ts +10 -4
  95. package/lib/latency-collector.d.ts.map +1 -1
  96. package/lib/latency-collector.js +2 -0
  97. package/lib/latency-collector.js.map +1 -1
  98. package/lib/logger.d.ts +38 -7
  99. package/lib/logger.d.ts.map +1 -1
  100. package/lib/logger.js +42 -4
  101. package/lib/logger.js.map +1 -1
  102. package/lib/messages/index.d.ts +4 -2
  103. package/lib/messages/index.d.ts.map +1 -1
  104. package/lib/messages/index.js +17 -4
  105. package/lib/messages/index.js.map +1 -1
  106. package/lib/messages/primitives.d.ts +59 -4
  107. package/lib/messages/primitives.d.ts.map +1 -1
  108. package/lib/messages/primitives.js +97 -4
  109. package/lib/messages/primitives.js.map +1 -1
  110. package/lib/model-server.d.ts +58 -11
  111. package/lib/model-server.d.ts.map +1 -1
  112. package/lib/model-server.js +4 -2
  113. package/lib/model-server.js.map +1 -1
  114. package/lib/model-service/base-version.d.ts +67 -0
  115. package/lib/model-service/base-version.d.ts.map +1 -0
  116. package/lib/model-service/base-version.js +44 -0
  117. package/lib/model-service/base-version.js.map +1 -0
  118. package/lib/model-service/index.d.ts +1 -1
  119. package/lib/model-service/index.d.ts.map +1 -1
  120. package/lib/model-service/index.js +4 -5
  121. package/lib/model-service/index.js.map +1 -1
  122. package/lib/model-service/reference-candidate.d.ts +5 -3
  123. package/lib/model-service/reference-candidate.d.ts.map +1 -1
  124. package/lib/node/index.d.ts +10 -0
  125. package/lib/node/index.d.ts.map +1 -0
  126. package/lib/node/index.js +29 -0
  127. package/lib/node/index.js.map +1 -0
  128. package/lib/node/process-memory.d.ts +66 -0
  129. package/lib/node/process-memory.d.ts.map +1 -0
  130. package/lib/node/process-memory.js +291 -0
  131. package/lib/node/process-memory.js.map +1 -0
  132. package/lib/noop-logger.d.ts.map +1 -1
  133. package/lib/noop-logger.js.map +1 -1
  134. package/lib/observable-value.js.map +1 -1
  135. package/lib/patch-merge.d.ts +63 -35
  136. package/lib/patch-merge.d.ts.map +1 -1
  137. package/lib/patch-merge.js +171 -25
  138. package/lib/patch-merge.js.map +1 -1
  139. package/lib/pending-work-tracker.d.ts +33 -0
  140. package/lib/pending-work-tracker.d.ts.map +1 -0
  141. package/lib/pending-work-tracker.js +48 -0
  142. package/lib/pending-work-tracker.js.map +1 -0
  143. package/lib/profile-session.d.ts +24 -8
  144. package/lib/profile-session.d.ts.map +1 -1
  145. package/lib/profile-session.js +13 -4
  146. package/lib/profile-session.js.map +1 -1
  147. package/lib/profiling.d.ts +15 -2
  148. package/lib/profiling.d.ts.map +1 -1
  149. package/lib/profiling.js.map +1 -1
  150. package/lib/project.d.ts +6 -2
  151. package/lib/project.d.ts.map +1 -1
  152. package/lib/project.js.map +1 -1
  153. package/lib/random-uuid.d.ts +14 -0
  154. package/lib/random-uuid.d.ts.map +1 -0
  155. package/lib/random-uuid.js +24 -0
  156. package/lib/random-uuid.js.map +1 -0
  157. package/lib/reconcile-write.d.ts +70 -0
  158. package/lib/reconcile-write.d.ts.map +1 -0
  159. package/lib/reconcile-write.js +69 -0
  160. package/lib/reconcile-write.js.map +1 -0
  161. package/lib/rpc/bind-rpc-methods.d.ts +6 -2
  162. package/lib/rpc/bind-rpc-methods.d.ts.map +1 -1
  163. package/lib/rpc/bind-rpc-methods.js +17 -7
  164. package/lib/rpc/bind-rpc-methods.js.map +1 -1
  165. package/lib/rpc/create-rpc-proxy.d.ts +3 -0
  166. package/lib/rpc/create-rpc-proxy.d.ts.map +1 -1
  167. package/lib/rpc/create-rpc-proxy.js +6 -1
  168. package/lib/rpc/create-rpc-proxy.js.map +1 -1
  169. package/lib/rpc/index.d.ts +1 -0
  170. package/lib/rpc/index.d.ts.map +1 -1
  171. package/lib/rpc/index.js +1 -0
  172. package/lib/rpc/index.js.map +1 -1
  173. package/lib/rpc/send-by-method-name.d.ts +76 -0
  174. package/lib/rpc/send-by-method-name.d.ts.map +1 -0
  175. package/lib/rpc/send-by-method-name.js +120 -0
  176. package/lib/rpc/send-by-method-name.js.map +1 -0
  177. package/lib/rpc/wire-prefix.js.map +1 -1
  178. package/lib/save-text-document.d.ts +40 -0
  179. package/lib/save-text-document.d.ts.map +1 -0
  180. package/lib/save-text-document.js +34 -0
  181. package/lib/save-text-document.js.map +1 -0
  182. package/lib/testing/catalogue-audit.js.map +1 -1
  183. package/lib/testing/data-doubles.d.ts +36 -11
  184. package/lib/testing/data-doubles.d.ts.map +1 -1
  185. package/lib/testing/data-doubles.js +47 -9
  186. package/lib/testing/data-doubles.js.map +1 -1
  187. package/lib/testing/fake-clock.d.ts +17 -2
  188. package/lib/testing/fake-clock.d.ts.map +1 -1
  189. package/lib/testing/fake-clock.js +61 -46
  190. package/lib/testing/fake-clock.js.map +1 -1
  191. package/lib/testing/harness.d.ts +9 -0
  192. package/lib/testing/harness.d.ts.map +1 -1
  193. package/lib/testing/index.d.ts +1 -0
  194. package/lib/testing/index.d.ts.map +1 -1
  195. package/lib/testing/index.js +4 -3
  196. package/lib/testing/index.js.map +1 -1
  197. package/lib/testing/node/duplex-connection.d.ts.map +1 -1
  198. package/lib/testing/node/duplex-connection.js +3 -2
  199. package/lib/testing/node/duplex-connection.js.map +1 -1
  200. package/lib/testing/node/duplex-stream.js.map +1 -1
  201. package/lib/testing/node/index.d.ts +2 -0
  202. package/lib/testing/node/index.d.ts.map +1 -1
  203. package/lib/testing/node/index.js +3 -2
  204. package/lib/testing/node/index.js.map +1 -1
  205. package/lib/testing/node/message-port-pair.d.ts +25 -0
  206. package/lib/testing/node/message-port-pair.d.ts.map +1 -0
  207. package/lib/testing/node/message-port-pair.js +26 -0
  208. package/lib/testing/node/message-port-pair.js.map +1 -0
  209. package/lib/testing/node/unhandled-rejections.d.ts +20 -0
  210. package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
  211. package/lib/testing/node/unhandled-rejections.js +35 -0
  212. package/lib/testing/node/unhandled-rejections.js.map +1 -0
  213. package/lib/testing/transfer-node-builder.d.ts +81 -0
  214. package/lib/testing/transfer-node-builder.d.ts.map +1 -0
  215. package/lib/testing/transfer-node-builder.js +47 -0
  216. package/lib/testing/transfer-node-builder.js.map +1 -0
  217. package/lib/testing/wait-for.d.ts +9 -3
  218. package/lib/testing/wait-for.d.ts.map +1 -1
  219. package/lib/testing/wait-for.js +57 -11
  220. package/lib/testing/wait-for.js.map +1 -1
  221. package/lib/tracer.d.ts.map +1 -1
  222. package/lib/tracer.js +5 -9
  223. package/lib/tracer.js.map +1 -1
  224. package/lib/transfer-diagnostic.d.ts +11 -0
  225. package/lib/transfer-diagnostic.d.ts.map +1 -1
  226. package/lib/transfer-diagnostic.js +17 -0
  227. package/lib/transfer-diagnostic.js.map +1 -1
  228. package/lib/transfer-document.d.ts +108 -32
  229. package/lib/transfer-document.d.ts.map +1 -1
  230. package/lib/transfer-document.js +17 -9
  231. package/lib/transfer-document.js.map +1 -1
  232. package/lib/transfer-element.d.ts +4 -4
  233. package/lib/types.d.ts +32 -0
  234. package/lib/types.d.ts.map +1 -0
  235. package/lib/{model-service/args.js → types.js} +2 -2
  236. package/lib/types.js.map +1 -0
  237. package/lib/uri.d.ts.map +1 -1
  238. package/lib/uri.js.map +1 -1
  239. package/lib/util.d.ts +8 -2
  240. package/lib/util.d.ts.map +1 -1
  241. package/lib/util.js +32 -4
  242. package/lib/util.js.map +1 -1
  243. package/package.json +24 -40
  244. package/src/abstract-logger.ts +18 -0
  245. package/src/client/data-connection.ts +654 -0
  246. package/src/client/data-events.ts +15 -1
  247. package/src/client/data-port.ts +36 -25
  248. package/src/client/data-session.ts +1606 -137
  249. package/src/client/index.ts +16 -9
  250. package/src/client/message-relay.ts +6 -4
  251. package/src/client/post-message-transport.ts +224 -4
  252. package/src/client/rpc-connection.ts +302 -0
  253. package/src/client/worker-handshake.ts +121 -0
  254. package/src/client/working-copy.ts +1116 -0
  255. package/src/client-ids.ts +49 -0
  256. package/src/clock.ts +68 -10
  257. package/src/console-logger.ts +39 -0
  258. package/src/data/data-protocol-methods.ts +8 -1
  259. package/src/data/data-server-protocol.ts +184 -49
  260. package/src/data/events.ts +77 -31
  261. package/src/data/requests.ts +90 -11
  262. package/src/debouncer.ts +11 -11
  263. package/src/errors.ts +496 -71
  264. package/src/format-log-arg.ts +176 -0
  265. package/src/glsp-edits-settled-actions.ts +62 -0
  266. package/src/glsp-request-model-args.ts +16 -0
  267. package/src/glsp-save-model-actions.ts +64 -0
  268. package/src/index.ts +11 -0
  269. package/src/latency-collector.ts +10 -3
  270. package/src/logger.ts +44 -8
  271. package/src/messages/index.ts +12 -2
  272. package/src/messages/primitives.ts +129 -5
  273. package/src/model-server.ts +62 -17
  274. package/src/model-service/base-version.ts +75 -0
  275. package/src/model-service/index.ts +4 -5
  276. package/src/model-service/reference-candidate.ts +5 -3
  277. package/src/node/index.ts +14 -0
  278. package/src/node/process-memory.ts +299 -0
  279. package/src/patch-merge.ts +230 -45
  280. package/src/pending-work-tracker.ts +48 -0
  281. package/src/profile-session.ts +31 -11
  282. package/src/profiling.ts +15 -2
  283. package/src/project.ts +6 -2
  284. package/src/random-uuid.ts +21 -0
  285. package/src/reconcile-write.ts +131 -0
  286. package/src/rpc/README.md +6 -6
  287. package/src/rpc/bind-rpc-methods.ts +18 -8
  288. package/src/rpc/create-rpc-proxy.ts +6 -1
  289. package/src/rpc/index.ts +1 -0
  290. package/src/rpc/send-by-method-name.ts +140 -0
  291. package/src/save-text-document.ts +39 -0
  292. package/src/testing/data-doubles.ts +119 -19
  293. package/src/testing/fake-clock.ts +76 -48
  294. package/src/testing/harness.ts +10 -0
  295. package/src/testing/index.ts +4 -3
  296. package/src/testing/node/duplex-connection.ts +3 -2
  297. package/src/testing/node/index.ts +3 -2
  298. package/src/testing/node/message-port-pair.ts +40 -0
  299. package/src/testing/node/unhandled-rejections.ts +31 -0
  300. package/src/testing/transfer-node-builder.ts +107 -0
  301. package/src/testing/wait-for.ts +61 -13
  302. package/src/tracer.ts +5 -9
  303. package/src/transfer-diagnostic.ts +17 -0
  304. package/src/transfer-document.ts +130 -34
  305. package/src/transfer-element.ts +4 -4
  306. package/src/types.ts +30 -0
  307. package/src/util.ts +33 -6
  308. package/lib/model-service/args.d.ts +0 -64
  309. package/lib/model-service/args.d.ts.map +0 -1
  310. package/lib/model-service/args.js.map +0 -1
  311. package/src/model-service/args.ts +0 -67
@@ -0,0 +1,420 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2026 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 Disposable, Emitter, type Event } from 'vscode-jsonrpc';
10
+ import { type Clock } from '../clock';
11
+ import { type ModelVersion } from '../model-service/base-version';
12
+ import { type ConflictResolver } from '../patch-merge';
13
+ import { PendingWorkTracker } from '../pending-work-tracker';
14
+ import { type ReconcileWriteOutcome, type VersionedModel } from '../reconcile-write';
15
+ import type { TransferDiagnostic } from '../transfer-diagnostic';
16
+ import { type LoadedTransferDocument, type TextState, TransferDocument, type TransferSavedDocument } from '../transfer-document';
17
+ import type { TransferElement } from '../transfer-element';
18
+ import { Deferred } from '../util';
19
+ import type { DataEvents } from './data-events';
20
+ import type { DataSession, DataSessionRestoreEvent } from './data-session';
21
+ /** What the write that carried an {@link WorkingCopy.edit} did. */
22
+ export type WorkingCopyEditOutcome =
23
+ /** The write landed against an unchanged document. */
24
+ {
25
+ readonly status: 'applied';
26
+ }
27
+ /** The write raced a foreign edit to other paths, and both landed. */
28
+ | {
29
+ readonly status: 'merged';
30
+ }
31
+ /**
32
+ * The edit raced a foreign edit of the same path, or kept racing foreign
33
+ * edits, and was dropped, or wrote a path an edit before it lost that way.
34
+ * The copy shows the server's value, unless the read after the last race
35
+ * failed.
36
+ */
37
+ | {
38
+ readonly status: 'conflict';
39
+ }
40
+ /** Nothing was written: the server already held the edit, or it changed nothing. */
41
+ | {
42
+ readonly status: 'unchanged';
43
+ }
44
+ /**
45
+ * Nothing was written, because the copy was closed, its file deleted, a
46
+ * restore could not open it again or its open's second read failed, before
47
+ * a write carried the edit.
48
+ */
49
+ | {
50
+ readonly status: 'unavailable';
51
+ };
52
+ /**
53
+ * One open of a {@link WorkingCopy}, from the answer to its first read until a
54
+ * close, a deletion or a failure ends it. A request records its answer only
55
+ * while the open it was sent under is still the copy's, so nothing of an
56
+ * ended open reaches the next.
57
+ */
58
+ export interface WorkingCopyOpen<TTransfer extends TransferElement> {
59
+ /** The last document the server sent. */
60
+ snapshot: TransferDocument<TTransfer>;
61
+ /** The copy's restores heard when {@link snapshot} was taken. */
62
+ snapshotRestores: number;
63
+ /**
64
+ * Whether {@link snapshot} was taken while a write was out, so it may hold
65
+ * the edits {@link sending} applies again. A base made on it then is
66
+ * unconfirmed, so its first write is reconciled, not sent.
67
+ */
68
+ snapshotUnderWrite?: boolean;
69
+ /** Edits not yet written, in edit order, each until the write that carries it answers. */
70
+ queued: {
71
+ readonly change: (root: TTransfer) => TTransfer;
72
+ readonly outcome: Deferred<WorkingCopyEditOutcome>;
73
+ }[];
74
+ /**
75
+ * The root the first queued edit was made on, the write in flight
76
+ * included, and the snapshot version their write is gated on. A foreign
77
+ * update that lands while they wait then conflicts and is reconciled,
78
+ * instead of being written over, and the copy's own write does not.
79
+ * `restores` is the copy's restores heard when that root was taken. A base
80
+ * from before a restore conflicts on its first write. `unconfirmed` marks
81
+ * a base whose write before a conflict dropped edits from. The root is then
82
+ * the one that write was made on with only the edits it kept, so an edit
83
+ * restating a dropped value conflicts, and its first write conflicts too.
84
+ * It also marks a base made on a {@link snapshotUnderWrite}. `dropped`
85
+ * makes any edit of a path a dropped edit wrote conflict, a revert to the
86
+ * value before it included.
87
+ */
88
+ base?: VersionedModel<TTransfer> & {
89
+ readonly restores: number;
90
+ readonly unconfirmed?: boolean;
91
+ /** The root the user saw before a conflict dropped edits, and the paths those edits wrote. */
92
+ readonly dropped?: {
93
+ readonly seen: TTransfer;
94
+ readonly paths: readonly string[];
95
+ };
96
+ };
97
+ /** Edits of the write in flight, in edit order. */
98
+ sending: WorkingCopyOpen<TTransfer>['queued'];
99
+ /** Whether a write loop runs. */
100
+ writing: boolean;
101
+ /** The server's dirty flag, as last sent. */
102
+ serverDirty: boolean;
103
+ /** Requests out whose answer replaces the snapshot. */
104
+ snapshotRequests: number;
105
+ /**
106
+ * The newest document the server sent while a request is out, held until a
107
+ * request answers with no write out, or for
108
+ * {@link WorkingCopy.settleWritesMs} at most.
109
+ */
110
+ held?: TransferDocument<TTransfer>;
111
+ /** Takes {@link held} once it has waited {@link WorkingCopy.settleWritesMs}. */
112
+ holdTimer?: Disposable;
113
+ /** The text version of the dirty flag last taken, so an answer built earlier does not undo a later save. */
114
+ dirtyVersion?: number;
115
+ /** Whether that flag came as a dirty event, which a document at its version does not undo. */
116
+ dirtyFromEvent: boolean;
117
+ }
118
+ /**
119
+ * The client's working copy of one data-server document: the server's latest
120
+ * snapshot of it, plus the edits the server has not confirmed yet.
121
+ *
122
+ * - **Follows the server.** Another client's update replaces the snapshot and
123
+ * fires {@link onDidChange}. This session's own echoes are skipped while a
124
+ * write is out, since the write's answer carries them. A document the
125
+ * server sends while a write, a save, a reread or the open's second read is
126
+ * out waits. The newest is taken when one of them answers and no write is
127
+ * out, or once the first of them has waited {@link settleWritesMs}. A write
128
+ * still out then has its edits applied to a document that may hold them
129
+ * already, so an edit that does not give the same root twice may show twice
130
+ * until its write answers. A batch made on that document has its first
131
+ * write reconciled, so the edit is not written twice.
132
+ * - **Batches edits behind a write.** An edit goes out at once when no write
133
+ * is out. The edits made while one is out go out after it, as one write of
134
+ * the whole root, gated on the version of the snapshot the first of them
135
+ * was made on, or of the answer to the copy's write before when that was
136
+ * built from the write's own text or holds its model unchanged. Each edit
137
+ * resolves to a {@link WorkingCopyEditOutcome}, its batch's unless the
138
+ * batch splits on a conflict.
139
+ * - **Reconciles.** A write that meets a newer version goes through
140
+ * `reconcileWrite`: the edits are replayed onto the refetched root, and a
141
+ * same-path collision drops the edit that made it in favour of the
142
+ * server's value. The other edits of its batch are still written.
143
+ * - **Counts its own edits as dirty.** {@link dirty} is the server's flag, or
144
+ * true while an edit is unanswered, so a host never shows clean text with
145
+ * an edit still on its way.
146
+ *
147
+ * Its session's own writes of the document are taken as echoes while a
148
+ * write is out, so the copy is the only writer of the document on its
149
+ * session. One heard with none out is taken, as a late write of a copy
150
+ * before it may be.
151
+ *
152
+ * One URI per copy, for its whole life. Opening another document is a new
153
+ * copy, so no queued edit can land on a document it was not made for. Open a
154
+ * new copy of the same document on the same session only once the last one's
155
+ * {@link close} has settled, since the copy does not check it. The session
156
+ * holds one open per document, so a close sent later would end the new copy's
157
+ * open too.
158
+ *
159
+ * An edit is a function of the root and runs again on every newer snapshot
160
+ * until its write answers, so it must be pure. Running it once and keeping the
161
+ * result would hide a foreign update behind the edit's stale copy of the root.
162
+ * One that throws on a newer root makes {@link root} throw too, until its
163
+ * write answers.
164
+ */
165
+ export declare class WorkingCopy<TTransfer extends TransferElement> {
166
+ protected readonly session: DataSession<TTransfer>;
167
+ protected readonly events: DataEvents<TTransfer>;
168
+ /** The document followed, as the caller spells it, which the session keys its open by. */
169
+ readonly uri: string;
170
+ protected readonly changeEmitter: Emitter<void>;
171
+ /** Fires whenever {@link root} or {@link diagnostics} may have changed. */
172
+ readonly onDidChange: Event<void>;
173
+ protected readonly dirtyEmitter: Emitter<void>;
174
+ /** Fires whenever {@link dirty} changes. Apart from {@link onDidChange}, since a save changes no content. */
175
+ readonly onDidChangeDirty: Event<void>;
176
+ /** Asked for each conflicting write, see {@link reconcile}. */
177
+ protected readonly conflictResolver: ConflictResolver;
178
+ /**
179
+ * Writes of one reconcile, the first included, before a still-conflicting
180
+ * one is dropped. A first write the copy refuses unsent, on a base from
181
+ * before a restore or one a conflict dropped edits from, counts too. A
182
+ * split batch reconciles twice, so one batch makes at most twice the cap
183
+ * less one writes. Absent, `reconcileWrite`'s default applies.
184
+ */
185
+ protected readonly maxWrites?: number;
186
+ /**
187
+ * How long {@link save}, {@link close} and {@link whenWritesSettled} wait
188
+ * for the copy's edits before going on anyway, and how long a document the
189
+ * server sends is held for a request at most.
190
+ */
191
+ protected readonly settleWritesMs: number;
192
+ /** The clock of {@link settleWritesMs}. */
193
+ protected readonly clock: Clock;
194
+ /**
195
+ * The open the copy follows. A close, a deletion or a failure ends it, and a
196
+ * request sent under an earlier one neither counts nor answers.
197
+ */
198
+ protected current?: WorkingCopyOpen<TTransfer>;
199
+ /** Restores heard that may have renumbered the versions, see {@link handleDocumentRestored}. */
200
+ protected restores: number;
201
+ /** Every edit until its write answers, so a settle waits on rereads after a conflict too. */
202
+ protected readonly editsInFlight: PendingWorkTracker;
203
+ /** {@link dirty} as last announced. */
204
+ protected announcedDirty: boolean;
205
+ /** Requests being settled, during which {@link onDidChangeDirty} waits, since their answer is not taken yet. */
206
+ protected settling: number;
207
+ /** The open, under way or done, which a later call shares until a deletion or a failure clears it. */
208
+ protected opening?: Promise<void>;
209
+ /** The close, once called. The copy does not open again after it. */
210
+ protected closing?: Promise<void>;
211
+ /** The listeners on the session and its events, ended once {@link dispose} ran and the edits have answered. */
212
+ protected readonly subscriptions: Disposable[];
213
+ /** Set by {@link dispose}, after which nothing is announced. */
214
+ protected disposed: boolean;
215
+ /** Set once {@link close} stopped waiting for the open, which then ends when it answers. */
216
+ protected openAbandoned: boolean;
217
+ constructor(session: DataSession<TTransfer>, events: DataEvents<TTransfer>,
218
+ /** The document followed, as the caller spells it, which the session keys its open by. */
219
+ uri: string);
220
+ /** The last document the server sent, without the edits it has not confirmed. `undefined` before {@link open}. */
221
+ get snapshot(): TransferDocument<TTransfer> | undefined;
222
+ /** The version of {@link snapshot}. A write is gated on the version its batch was made on, see the class doc. */
223
+ get version(): ModelVersion | undefined;
224
+ /** The server's root with every unconfirmed edit applied. `undefined` when no document is loaded. */
225
+ get root(): TTransfer | undefined;
226
+ /**
227
+ * Diagnostics as of the last snapshot. A write answers once its document is
228
+ * validated, so they hold for the copy's own edits without an update push.
229
+ * After a reconnect the ones from before stay until the copy's reread
230
+ * answers, or the next update when it fails.
231
+ */
232
+ get diagnostics(): readonly TransferDiagnostic[];
233
+ /** Whether the server's text differs from the file, or an edit has not been confirmed. */
234
+ get dirty(): boolean;
235
+ /** Whether an edit has not answered yet. Synchronous, for an unload guard. */
236
+ get hasWritesInFlight(): boolean;
237
+ /**
238
+ * Open and watch the document, then read it again with diagnostics. The
239
+ * open settles before validation, so without the second read a document
240
+ * that was never edited reports no problems. Fires a change once both reads
241
+ * have answered and the open stands, and before that only for a document a
242
+ * restore hands over meanwhile. Repeated calls share the first one, and a
243
+ * failed open may be retried. Rejects once {@link close} was called, and
244
+ * with a `DocumentNotOpenError` when the file is gone by the second read. A
245
+ * failed second read rejects once the session is connected, so after a
246
+ * dropped connection it waits for the reconnect, and resolves when the
247
+ * restore took the document over.
248
+ */
249
+ open(): Promise<void>;
250
+ /**
251
+ * Queue `change` for the next write. The edit shows in {@link root} at once.
252
+ * Resolves to the outcome of the write that carried it, and rejects when
253
+ * that write fails for another reason than a conflict, as with a
254
+ * `DocumentSyntaxError` while the document does not parse. Rejects with a
255
+ * `DocumentNotOpenError` when the copy follows no document, and with what
256
+ * `change` throws on {@link root}, queueing nothing. A change that throws
257
+ * only on a later root rejects every edit of the write that carries it.
258
+ */
259
+ edit(change: (root: TTransfer) => TTransfer): Promise<WorkingCopyEditOutcome>;
260
+ /**
261
+ * Wait for every edit to answer, those made during the wait included, and
262
+ * persist the server's text when it differs from the file, whoever wrote
263
+ * it. Resolves to what the persist answered, or `undefined` when nothing
264
+ * needed saving. Rejects with a `DocumentNotOpenError` when the copy
265
+ * follows no document, at the call or once the edits have answered, or
266
+ * follows one opened again meanwhile. Rejects with a `ConflictError` when
267
+ * the text moved past the copy's version or the copy's document is from
268
+ * before the latest restore, and with a `SaveFailedError` when an edit has
269
+ * not answered within {@link settleWritesMs}.
270
+ */
271
+ save(): Promise<TransferSavedDocument<TTransfer> | undefined>;
272
+ /**
273
+ * Resolve to `true` once no edit is pending, those made during the wait
274
+ * included, or to `false` once {@link settleWritesMs} has passed first.
275
+ * Never rejects.
276
+ */
277
+ whenWritesSettled(): Promise<boolean>;
278
+ /**
279
+ * Resolve to `true` once `opening` has settled and no edit is pending, those
280
+ * made during the wait included, or to `false` once {@link settleWritesMs}
281
+ * has passed first.
282
+ */
283
+ protected whenEditsIdle(opening?: Promise<void>): Promise<boolean>;
284
+ /**
285
+ * Wait for an open under way and the edits, those made during the wait
286
+ * included, up to {@link settleWritesMs}, and close the document. Final:
287
+ * the copy does not open again, and a later call shares this one.
288
+ */
289
+ close(): Promise<void>;
290
+ /** The work of {@link close}, after the open it ends and the edits, within one bound. */
291
+ protected closeAfter(opening: Promise<void> | undefined): Promise<void>;
292
+ /**
293
+ * Announce nothing more. Unanswered edits are still written while the
294
+ * session lives, since dropping them would lose what the user typed, and
295
+ * the copy follows the document until they have answered, so their writes
296
+ * still heed a restore or a deletion. A host that ends the session as well
297
+ * waits for {@link whenWritesSettled} first.
298
+ */
299
+ dispose(): void;
300
+ /** Both reads of {@link open}. */
301
+ protected load(): Promise<void>;
302
+ /** Write the batches of `open` until none is left, one at a time, so each can be based on the answer to the last. */
303
+ protected writeQueued(open: WorkingCopyOpen<TTransfer>): Promise<void>;
304
+ /**
305
+ * Write one batch, made on `base`, and settle its edits. The batch leaves
306
+ * {@link root} before the server's answer is taken and the one change is
307
+ * fired for it, since a reader would otherwise apply it again over an
308
+ * answer that holds or refused it.
309
+ */
310
+ protected writeBatch(open: WorkingCopyOpen<TTransfer>, batch: WorkingCopyOpen<TTransfer>['queued'], base: WorkingCopyOpen<TTransfer>['base']): Promise<void>;
311
+ /**
312
+ * Replay a conflicting batch onto `theirs` one edit at a time, each as the
313
+ * change from the root before it, and write the edits that do not collide.
314
+ * One edit's collision then drops only that edit.
315
+ */
316
+ protected splitConflict(open: WorkingCopyOpen<TTransfer>, roots: readonly TTransfer[], theirs: LoadedTransferDocument<TTransfer>, restores: number): Promise<{
317
+ answer?: TransferDocument<TTransfer>;
318
+ outcomes: (WorkingCopyEditOutcome | Promise<never>)[];
319
+ }>;
320
+ /**
321
+ * Write `ours`, based on `base`, and reconcile a conflict. Resolves to the
322
+ * last document the write and its rereads answered, which {@link writeBatch}
323
+ * takes, so the copy shows the server's value for an edit the reconcile
324
+ * dropped. `restores` is {@link restores} when its last reread was taken.
325
+ *
326
+ * A base from before a restore is not sent but refused as a conflict, so
327
+ * the write is reconciled against the restarted server's document. Its
328
+ * version could match that server's by chance and the write would land.
329
+ * An unconfirmed base is refused the same way. Only a batch's own write,
330
+ * `whole`, can move the base of the edits queued meanwhile.
331
+ *
332
+ * A merged write comes back as `persisted` when it was gated on a reread
333
+ * that equals the root the edit was made on, since it raced no foreign
334
+ * edit. It then carries no `conflict` or `writes`.
335
+ */
336
+ protected reconcile(open: WorkingCopyOpen<TTransfer>, base: NonNullable<WorkingCopyOpen<TTransfer>['base']>, ours: TTransfer, whole: boolean): Promise<{
337
+ readonly outcome: ReconcileWriteOutcome;
338
+ readonly answer?: TransferDocument<TTransfer>;
339
+ readonly restores: number;
340
+ }>;
341
+ /** The outcome an edit reports for what {@link reconcile} did. */
342
+ protected toEditOutcome(outcome: ReconcileWriteOutcome): WorkingCopyEditOutcome;
343
+ /** Drop the snapshot when the document's file is removed, so no edit is based on a document the server no longer has. */
344
+ protected handleDocumentDeleted(event: {
345
+ uri: string;
346
+ }): void;
347
+ /** End the open as a deletion does, and settle the edits not yet written as `unavailable`. */
348
+ protected dropDocument(): void;
349
+ /**
350
+ * Drop the document and every edit not yet written, and return those edits
351
+ * for the caller to settle. Made on the document that went, they never
352
+ * reach one opened again. Requests still out answer to nothing, since a
353
+ * late answer would bring the document back.
354
+ */
355
+ protected unload(): WorkingCopyOpen<TTransfer>['queued'];
356
+ /**
357
+ * Follow the document again after a reconnect. A restarted server numbers
358
+ * versions afresh, so the versions held from before compare with nothing,
359
+ * and a change made while the connection was down sent no event. Queued
360
+ * edits keep their base, so their write is reconciled against what the
361
+ * restarted server holds and a field changed meanwhile conflicts. A restore
362
+ * that finds the snapshot's text at its version is not counted, as in the
363
+ * session, so a brief drop costs no conflict.
364
+ */
365
+ protected handleDocumentRestored(event: DataSessionRestoreEvent<TTransfer>): void;
366
+ /** Read the document of `open` again with diagnostics, and take the answer. */
367
+ protected reread(open: WorkingCopyOpen<TTransfer>): Promise<void>;
368
+ /** Follow a server push for the document. */
369
+ protected handleDocumentUpdated(event: {
370
+ document: TransferDocument<TTransfer>;
371
+ sourceClientId: string;
372
+ }): void;
373
+ /**
374
+ * Take the dirty flag of a document the server sent, and the document itself
375
+ * unless a request is out. A document older than the snapshot is skipped.
376
+ */
377
+ protected offer(open: WorkingCopyOpen<TTransfer>, document: TransferDocument<TTransfer>, announce: boolean): void;
378
+ /**
379
+ * Hold `document` until a request answers. A document first held
380
+ * {@link settleWritesMs} ago is taken then, so a request that hangs does
381
+ * not hide other clients' changes for longer.
382
+ */
383
+ protected hold(open: WorkingCopyOpen<TTransfer>, document: TransferDocument<TTransfer>): void;
384
+ /** Stop holding a document for `open`, and return the one it held. */
385
+ protected unhold(open: WorkingCopyOpen<TTransfer>): TransferDocument<TTransfer> | undefined;
386
+ /**
387
+ * Take `document` as the new snapshot. Fires a change unless the model's
388
+ * hash is the one held, which also means equally validated, or `announce`
389
+ * is false, as for a write's answers, which {@link writeBatch} announces
390
+ * once the write's edits are off {@link root}.
391
+ */
392
+ protected adopt(open: WorkingCopyOpen<TTransfer>, document: TransferDocument<TTransfer>, announce?: boolean): void;
393
+ /**
394
+ * End a request, and take the newest document the server sent while
395
+ * requests were out, its answer included. None is taken while a write is
396
+ * out, since it may already hold that write's edits, which {@link root}
397
+ * would then apply again. Versions are compared only within that window,
398
+ * and a restore clears what it held, since a restarted server numbers
399
+ * afresh. {@link dirty} is announced once the answer is taken.
400
+ */
401
+ protected settleRequest(open: WorkingCopyOpen<TTransfer>, answer: TransferDocument<TTransfer> | undefined, announce?: boolean): void;
402
+ /** {@link settleRequest} past its check that `open` is followed, without announcing {@link dirty}. */
403
+ protected settleAnswer(open: WorkingCopyOpen<TTransfer>, answer: TransferDocument<TTransfer> | undefined, announce: boolean): void;
404
+ /**
405
+ * Take a dirty flag the server sent, `announced` when it came as a dirty
406
+ * event. While a request is out, one decided on older text than the last
407
+ * is skipped, and so is a document's at the version of the last event,
408
+ * since a save changes the flag but not the version, and that document may
409
+ * have been built before it. Outside that window any is taken, as after a
410
+ * restart that numbers versions afresh.
411
+ */
412
+ protected takeDirty(open: WorkingCopyOpen<TTransfer>, text: (Pick<TextState, 'dirty'> & Partial<Pick<TextState, 'version'>>) | undefined, announced?: boolean): void;
413
+ /** Fire {@link onDidChangeDirty} when {@link dirty} differs from what was last announced, unless a request is being settled. */
414
+ protected announceDirty(): void;
415
+ /** The open the copy follows, or a throw when it follows none. */
416
+ protected requireOpen(): WorkingCopyOpen<TTransfer>;
417
+ /** Throw once {@link dispose} ran. */
418
+ protected assertLive(): void;
419
+ }
420
+ //# sourceMappingURL=working-copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-copy.d.ts","sourceRoot":"","sources":["../../src/client/working-copy.ts"],"names":[],"mappings":"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"}