@agentshouse/mdruntime 0.1.0-c3fa75348e547 → 0.1.0-c3faae279d4d2

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 (368) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +385 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +150 -81
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +7 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +40 -41
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +30 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +320 -111
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +12 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +64 -0
  25. package/dist/change-set.d.ts +9 -16
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -89
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +14 -3
  31. package/dist/chat-types.d.ts +5 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +13 -0
  34. package/dist/client.d.ts +33 -10
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +90 -10
  37. package/dist/collection.d.ts +11 -21
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +39 -291
  40. package/dist/compile.d.ts +16 -0
  41. package/dist/compile.d.ts.map +1 -0
  42. package/dist/compile.js +711 -0
  43. package/dist/connection.d.ts +7 -132
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +100 -3568
  46. package/dist/context.d.ts +2 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/{chat/context.js → context.js} +1 -4
  49. package/dist/conversation-live.d.ts +136 -0
  50. package/dist/conversation-live.d.ts.map +1 -0
  51. package/dist/conversation-live.js +248 -0
  52. package/dist/conversation-row.d.ts +33 -0
  53. package/dist/conversation-row.d.ts.map +1 -0
  54. package/dist/conversation-row.js +53 -0
  55. package/dist/conversation.d.ts +53 -44
  56. package/dist/conversation.d.ts.map +1 -1
  57. package/dist/conversation.js +938 -715
  58. package/dist/digest.d.ts +7 -0
  59. package/dist/digest.d.ts.map +1 -0
  60. package/dist/digest.js +113 -0
  61. package/dist/discovery.d.ts +10 -0
  62. package/dist/discovery.d.ts.map +1 -0
  63. package/dist/discovery.js +175 -0
  64. package/dist/durability.d.ts +16 -4
  65. package/dist/durability.d.ts.map +1 -1
  66. package/dist/durability.js +5 -0
  67. package/dist/entry.d.ts +5 -2
  68. package/dist/entry.d.ts.map +1 -1
  69. package/dist/entry.js +33 -28
  70. package/dist/figures.d.ts +49 -0
  71. package/dist/figures.d.ts.map +1 -0
  72. package/dist/figures.js +197 -0
  73. package/dist/file.d.ts +2 -19
  74. package/dist/file.d.ts.map +1 -1
  75. package/dist/file.js +7 -122
  76. package/dist/holdings.d.ts +29 -0
  77. package/dist/holdings.d.ts.map +1 -0
  78. package/dist/holdings.js +95 -0
  79. package/dist/host.d.ts +4 -10
  80. package/dist/host.d.ts.map +1 -1
  81. package/dist/host.js +74 -41
  82. package/dist/identity.d.ts +0 -2
  83. package/dist/identity.d.ts.map +1 -1
  84. package/dist/identity.js +0 -6
  85. package/dist/index.d.ts +33 -13
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +12 -2
  88. package/dist/install.d.ts +56 -0
  89. package/dist/install.d.ts.map +1 -0
  90. package/dist/install.js +554 -0
  91. package/dist/job.d.ts +33 -0
  92. package/dist/job.d.ts.map +1 -0
  93. package/dist/job.js +54 -0
  94. package/dist/lifecycle.d.ts +7 -0
  95. package/dist/lifecycle.d.ts.map +1 -0
  96. package/dist/lifecycle.js +268 -0
  97. package/dist/listing.d.ts +53 -0
  98. package/dist/listing.d.ts.map +1 -0
  99. package/dist/listing.js +176 -0
  100. package/dist/live.d.ts +23 -0
  101. package/dist/live.d.ts.map +1 -0
  102. package/dist/live.js +163 -0
  103. package/dist/locks.d.ts +9 -0
  104. package/dist/locks.d.ts.map +1 -0
  105. package/dist/locks.js +61 -0
  106. package/dist/log.d.ts +1 -0
  107. package/dist/log.d.ts.map +1 -1
  108. package/dist/lost.d.ts +5 -0
  109. package/dist/lost.d.ts.map +1 -0
  110. package/dist/lost.js +61 -0
  111. package/dist/media.d.ts +8 -0
  112. package/dist/media.d.ts.map +1 -0
  113. package/dist/media.js +218 -0
  114. package/dist/memory.d.ts +14 -7
  115. package/dist/memory.d.ts.map +1 -1
  116. package/dist/memory.js +241 -107
  117. package/dist/messages.d.ts +52 -0
  118. package/dist/messages.d.ts.map +1 -0
  119. package/dist/messages.js +162 -0
  120. package/dist/model.d.ts +8 -10
  121. package/dist/model.d.ts.map +1 -1
  122. package/dist/model.js +6 -18
  123. package/dist/models.d.ts +14 -0
  124. package/dist/models.d.ts.map +1 -0
  125. package/dist/models.js +195 -0
  126. package/dist/name.d.ts +4 -0
  127. package/dist/name.d.ts.map +1 -0
  128. package/dist/name.js +122 -0
  129. package/dist/observation.d.ts +17 -2
  130. package/dist/observation.d.ts.map +1 -1
  131. package/dist/observation.js +107 -17
  132. package/dist/opened.d.ts +22 -0
  133. package/dist/opened.d.ts.map +1 -0
  134. package/dist/opened.js +107 -0
  135. package/dist/opening.d.ts +4 -0
  136. package/dist/opening.d.ts.map +1 -0
  137. package/dist/opening.js +57 -0
  138. package/dist/outcome.d.ts +49 -8
  139. package/dist/outcome.d.ts.map +1 -1
  140. package/dist/outcome.js +42 -0
  141. package/dist/overlay.d.ts +3 -5
  142. package/dist/overlay.d.ts.map +1 -1
  143. package/dist/overlay.js +98 -172
  144. package/dist/{chat/parts.d.ts → parts.d.ts} +12 -9
  145. package/dist/parts.d.ts.map +1 -0
  146. package/dist/{chat/parts.js → parts.js} +53 -46
  147. package/dist/paths.d.ts +2 -0
  148. package/dist/paths.d.ts.map +1 -1
  149. package/dist/paths.js +26 -0
  150. package/dist/preparation.d.ts +20 -0
  151. package/dist/preparation.d.ts.map +1 -0
  152. package/dist/preparation.js +226 -0
  153. package/dist/queries.d.ts +16 -0
  154. package/dist/queries.d.ts.map +1 -0
  155. package/dist/queries.js +272 -0
  156. package/dist/query.d.ts +25 -191
  157. package/dist/query.d.ts.map +1 -1
  158. package/dist/query.js +3 -470
  159. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  160. package/dist/questions.d.ts.map +1 -0
  161. package/dist/{chat/questions.js → questions.js} +13 -2
  162. package/dist/reach.d.ts +20 -9
  163. package/dist/reach.d.ts.map +1 -1
  164. package/dist/reach.js +287 -99
  165. package/dist/react.d.ts +11 -4
  166. package/dist/react.d.ts.map +1 -1
  167. package/dist/react.js +2 -14
  168. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  169. package/dist/read.d.ts.map +1 -0
  170. package/dist/{chat/read.js → read.js} +4 -0
  171. package/dist/readiness.d.ts +13 -17
  172. package/dist/readiness.d.ts.map +1 -1
  173. package/dist/readiness.js +2 -8
  174. package/dist/reads.d.ts +36 -10
  175. package/dist/reads.d.ts.map +1 -1
  176. package/dist/reads.js +157 -84
  177. package/dist/recovery.d.ts +3 -2
  178. package/dist/recovery.d.ts.map +1 -1
  179. package/dist/recovery.js +43 -8
  180. package/dist/refresh.d.ts +18 -15
  181. package/dist/refresh.d.ts.map +1 -1
  182. package/dist/refresh.js +143 -58
  183. package/dist/refusal.d.ts +5 -0
  184. package/dist/refusal.d.ts.map +1 -0
  185. package/dist/refusal.js +55 -0
  186. package/dist/replica.d.ts +56 -33
  187. package/dist/replica.d.ts.map +1 -1
  188. package/dist/replica.js +332 -190
  189. package/dist/room-draft.d.ts +25 -8
  190. package/dist/room-draft.d.ts.map +1 -1
  191. package/dist/room-draft.js +161 -74
  192. package/dist/room-drafts.d.ts +24 -0
  193. package/dist/room-drafts.d.ts.map +1 -0
  194. package/dist/room-drafts.js +217 -0
  195. package/dist/rows.d.ts +31 -30
  196. package/dist/rows.d.ts.map +1 -1
  197. package/dist/rows.js +59 -118
  198. package/dist/runtime.d.ts +43 -0
  199. package/dist/runtime.d.ts.map +1 -0
  200. package/dist/runtime.js +1 -0
  201. package/dist/save.d.ts +57 -14
  202. package/dist/save.d.ts.map +1 -1
  203. package/dist/save.js +537 -192
  204. package/dist/saves.d.ts +70 -0
  205. package/dist/saves.d.ts.map +1 -0
  206. package/dist/saves.js +1005 -0
  207. package/dist/search.d.ts +12 -82
  208. package/dist/search.d.ts.map +1 -1
  209. package/dist/search.js +10 -207
  210. package/dist/seed.d.ts +11 -2
  211. package/dist/seed.d.ts.map +1 -1
  212. package/dist/seed.js +89 -5
  213. package/dist/shared.d.ts +6 -7
  214. package/dist/shared.d.ts.map +1 -1
  215. package/dist/shared.js +75 -104
  216. package/dist/shown.d.ts +31 -0
  217. package/dist/shown.d.ts.map +1 -0
  218. package/dist/shown.js +292 -0
  219. package/dist/socket/admission.d.ts +7 -0
  220. package/dist/socket/admission.d.ts.map +1 -0
  221. package/dist/socket/admission.js +39 -0
  222. package/dist/socket/answers.d.ts +6 -0
  223. package/dist/socket/answers.d.ts.map +1 -0
  224. package/dist/socket/answers.js +20 -0
  225. package/dist/socket/lanes.d.ts +20 -0
  226. package/dist/socket/lanes.d.ts.map +1 -0
  227. package/dist/socket/lanes.js +77 -0
  228. package/dist/socket/reads.d.ts +10 -0
  229. package/dist/socket/reads.d.ts.map +1 -0
  230. package/dist/socket/reads.js +31 -0
  231. package/dist/socket/rooms.d.ts +44 -0
  232. package/dist/socket/rooms.d.ts.map +1 -0
  233. package/dist/socket/rooms.js +90 -0
  234. package/dist/socket/session.d.ts +38 -0
  235. package/dist/socket/session.d.ts.map +1 -0
  236. package/dist/socket/session.js +23 -0
  237. package/dist/socket.d.ts +70 -0
  238. package/dist/socket.d.ts.map +1 -0
  239. package/dist/socket.js +175 -0
  240. package/dist/source.d.ts +61 -0
  241. package/dist/source.d.ts.map +1 -0
  242. package/dist/source.js +82 -0
  243. package/dist/status.d.ts +4 -5
  244. package/dist/status.d.ts.map +1 -1
  245. package/dist/status.js +3 -7
  246. package/dist/store/fences.d.ts +16 -0
  247. package/dist/store/fences.d.ts.map +1 -0
  248. package/dist/store/fences.js +26 -0
  249. package/dist/store/installs.d.ts +30 -0
  250. package/dist/store/installs.d.ts.map +1 -0
  251. package/dist/store/installs.js +34 -0
  252. package/dist/store/readiness.d.ts +10 -0
  253. package/dist/store/readiness.d.ts.map +1 -0
  254. package/dist/store/readiness.js +52 -0
  255. package/dist/store/records.d.ts +212 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +431 -0
  258. package/dist/store/room-held.d.ts +8 -0
  259. package/dist/store/room-held.d.ts.map +1 -0
  260. package/dist/store/room-held.js +17 -0
  261. package/dist/store/space.d.ts +11 -0
  262. package/dist/store/space.d.ts.map +1 -0
  263. package/dist/store/space.js +41 -0
  264. package/dist/store/watchers.d.ts +17 -0
  265. package/dist/store/watchers.d.ts.map +1 -0
  266. package/dist/store/watchers.js +56 -0
  267. package/dist/store/writes.d.ts +24 -0
  268. package/dist/store/writes.d.ts.map +1 -0
  269. package/dist/store/writes.js +125 -0
  270. package/dist/store.d.ts +106 -158
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +136 -734
  273. package/dist/stored.d.ts +156 -0
  274. package/dist/stored.d.ts.map +1 -0
  275. package/dist/stored.js +649 -0
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +223 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +532 -0
  282. package/dist/tables.d.ts +416 -0
  283. package/dist/tables.d.ts.map +1 -0
  284. package/dist/tables.js +740 -0
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +129 -0
  288. package/dist/transfer.d.ts +0 -5
  289. package/dist/transfer.d.ts.map +1 -1
  290. package/dist/turn.d.ts +5 -3
  291. package/dist/turn.d.ts.map +1 -1
  292. package/dist/turn.js +51 -21
  293. package/dist/validation.d.ts +29 -0
  294. package/dist/validation.d.ts.map +1 -0
  295. package/dist/validation.js +104 -0
  296. package/dist/windows.d.ts +11 -0
  297. package/dist/windows.d.ts.map +1 -0
  298. package/dist/windows.js +16 -0
  299. package/dist/wire.d.ts +50 -6
  300. package/dist/wire.d.ts.map +1 -1
  301. package/dist/wire.js +16 -2
  302. package/package.json +18 -19
  303. package/AGENTS.md +0 -299
  304. package/dist/acquisition.d.ts +0 -14
  305. package/dist/acquisition.d.ts.map +0 -1
  306. package/dist/acquisition.js +0 -24
  307. package/dist/chat/acts.d.ts +0 -33
  308. package/dist/chat/acts.d.ts.map +0 -1
  309. package/dist/chat/acts.js +0 -36
  310. package/dist/chat/context.d.ts +0 -3
  311. package/dist/chat/context.d.ts.map +0 -1
  312. package/dist/chat/input.d.ts +0 -9
  313. package/dist/chat/input.d.ts.map +0 -1
  314. package/dist/chat/input.js +0 -99
  315. package/dist/chat/kit.d.ts +0 -61
  316. package/dist/chat/kit.d.ts.map +0 -1
  317. package/dist/chat/kit.js +0 -123
  318. package/dist/chat/lasting.d.ts +0 -6
  319. package/dist/chat/lasting.d.ts.map +0 -1
  320. package/dist/chat/lasting.js +0 -19
  321. package/dist/chat/list.d.ts +0 -27
  322. package/dist/chat/list.d.ts.map +0 -1
  323. package/dist/chat/list.js +0 -63
  324. package/dist/chat/markdown.d.ts +0 -20
  325. package/dist/chat/markdown.d.ts.map +0 -1
  326. package/dist/chat/markdown.js +0 -188
  327. package/dist/chat/message.d.ts +0 -6
  328. package/dist/chat/message.d.ts.map +0 -1
  329. package/dist/chat/message.js +0 -192
  330. package/dist/chat/messages.d.ts +0 -22
  331. package/dist/chat/messages.d.ts.map +0 -1
  332. package/dist/chat/messages.js +0 -155
  333. package/dist/chat/name.d.ts +0 -6
  334. package/dist/chat/name.d.ts.map +0 -1
  335. package/dist/chat/name.js +0 -37
  336. package/dist/chat/opened.d.ts +0 -11
  337. package/dist/chat/opened.d.ts.map +0 -1
  338. package/dist/chat/opened.js +0 -17
  339. package/dist/chat/overlay.d.ts +0 -31
  340. package/dist/chat/overlay.d.ts.map +0 -1
  341. package/dist/chat/overlay.js +0 -97
  342. package/dist/chat/parts.d.ts.map +0 -1
  343. package/dist/chat/process.d.ts +0 -20
  344. package/dist/chat/process.d.ts.map +0 -1
  345. package/dist/chat/process.js +0 -32
  346. package/dist/chat/provider.d.ts +0 -63
  347. package/dist/chat/provider.d.ts.map +0 -1
  348. package/dist/chat/provider.js +0 -629
  349. package/dist/chat/question.d.ts +0 -9
  350. package/dist/chat/question.d.ts.map +0 -1
  351. package/dist/chat/question.js +0 -80
  352. package/dist/chat/questions.d.ts.map +0 -1
  353. package/dist/chat/read.d.ts.map +0 -1
  354. package/dist/chat/ready.d.ts +0 -34
  355. package/dist/chat/ready.d.ts.map +0 -1
  356. package/dist/chat/ready.js +0 -91
  357. package/dist/chat/style.d.ts +0 -4
  358. package/dist/chat/style.d.ts.map +0 -1
  359. package/dist/chat/style.js +0 -302
  360. package/dist/chat.d.ts +0 -14
  361. package/dist/chat.d.ts.map +0 -1
  362. package/dist/chat.js +0 -8
  363. package/dist/fence.d.ts +0 -6
  364. package/dist/fence.d.ts.map +0 -1
  365. package/dist/fence.js +0 -10
  366. package/dist/read-side.d.ts +0 -25
  367. package/dist/read-side.d.ts.map +0 -1
  368. package/dist/read-side.js +0 -642
package/dist/shared.js CHANGED
@@ -1,7 +1,7 @@
1
+ import { finished, ROW_WEIGHT } from './turn.js';
1
2
  const BITS = 5;
2
3
  const MASK = (1 << BITS) - 1;
3
4
  const roots = new WeakMap();
4
- const tallies = new WeakMap();
5
5
  function hashOf(key) {
6
6
  let hash = 0x811c9dc5;
7
7
  for (let index = 0; index < key.length; index += 1) {
@@ -100,21 +100,15 @@ function lone(node) {
100
100
  }
101
101
  function taken(node, hash, key, shift) {
102
102
  if (isLeaf(node))
103
- return node.key === key ? undefined : node;
103
+ return undefined;
104
104
  if (isCollision(node)) {
105
105
  const leaves = node.leaves.filter((leaf) => leaf.key !== key);
106
- if (leaves.length === node.leaves.length)
107
- return node;
108
106
  return leaves.length === 1 ? leaves[0] : { hash: node.hash, leaves };
109
107
  }
110
108
  const bit = 1 << fragment(hash, shift);
111
- if ((node.bitmap & bit) === 0)
112
- return node;
113
109
  const at = slot(node.bitmap, bit);
114
110
  const child = node.children[at];
115
111
  const next = taken(child, hash, key, shift + BITS);
116
- if (next === child)
117
- return node;
118
112
  if (next === undefined) {
119
113
  if (node.children.length === 1)
120
114
  return undefined;
@@ -179,122 +173,95 @@ function facade(root) {
179
173
  roots.set(map, root);
180
174
  return map;
181
175
  }
182
- function rootOf(map) {
176
+ const guarded = new WeakMap();
177
+ export function guarding(values, handler) {
178
+ const map = new Proxy(values, handler);
179
+ guarded.set(map, values);
180
+ return map;
181
+ }
182
+ export function* entriesIn(map) {
183
+ const root = roots.get(map);
184
+ if (root === undefined) {
185
+ const values = guarded.get(map) ?? map;
186
+ for (const key of Object.keys(values))
187
+ yield [key, values[key]];
188
+ return;
189
+ }
190
+ for (const leaf of leavesOf(root.node))
191
+ yield [leaf.key, leaf.value];
192
+ }
193
+ function* rooted(map) {
183
194
  const held = roots.get(map);
184
195
  if (held !== undefined)
185
196
  return held;
186
197
  let node;
187
- let size = 0;
188
- for (const [key, value] of Object.entries(map)) {
198
+ for (const [key, value] of entriesIn(map)) {
189
199
  node = put(node, { key, hash: hashOf(key), value }, 0);
190
- size += 1;
200
+ yield ROW_WEIGHT;
191
201
  }
192
- return { node, size };
202
+ return { node };
193
203
  }
194
- export function shared(map) {
195
- return roots.has(map) ? map : facade(rootOf(map));
204
+ const RUN = 1 << 10;
205
+ function* merged(left, right) {
206
+ const into = [];
207
+ let at = 0;
208
+ let from = 0;
209
+ while (at < left.length || from < right.length) {
210
+ into.push(from === right.length || (at < left.length && left[at] < right[from])
211
+ ? left[at++]
212
+ : right[from++]);
213
+ yield ROW_WEIGHT;
214
+ }
215
+ return into;
196
216
  }
197
- export function patched(base, set, removed = []) {
198
- const root = rootOf(base);
199
- const weighed = [...(tallies.get(base) ?? [])];
200
- let node = root.node;
201
- let size = root.size;
202
- const shift = (key, before, after) => {
203
- for (const entry of weighed) {
204
- entry[1] +=
205
- (after === undefined ? 0 : entry[0](key, after)) -
206
- (before === undefined ? 0 : entry[0](key, before.value));
217
+ function* pathsOf(map) {
218
+ for (const [key] of entriesIn(map))
219
+ yield key;
220
+ }
221
+ export function* sortedKeys(map) {
222
+ return yield* sorting(pathsOf(map));
223
+ }
224
+ export function* sorting(keys) {
225
+ let runs = [];
226
+ let run = [];
227
+ for (const key of keys) {
228
+ run.push(key);
229
+ yield ROW_WEIGHT;
230
+ if (run.length === RUN) {
231
+ runs.push(run.sort());
232
+ run = [];
207
233
  }
208
- };
234
+ }
235
+ if (run.length > 0)
236
+ runs.push(run.sort());
237
+ while (runs.length > 1) {
238
+ const next = [];
239
+ for (let at = 0; at < runs.length; at += 2) {
240
+ next.push(at + 1 === runs.length ? runs[at] : yield* merged(runs[at], runs[at + 1]));
241
+ }
242
+ runs = next;
243
+ }
244
+ return runs[0] ?? [];
245
+ }
246
+ export function* patching(base, set, removed = []) {
247
+ const root = yield* rooted(base);
248
+ let node = root.node;
209
249
  for (const key of removed) {
210
250
  if (node === undefined)
211
251
  break;
212
- const before = lookup({ node, size }, key);
252
+ const before = lookup({ node }, key);
213
253
  if (before === undefined)
214
254
  continue;
215
255
  node = taken(node, before.hash, key, 0);
216
- size -= 1;
217
- shift(key, before, undefined);
256
+ yield ROW_WEIGHT;
218
257
  }
219
258
  for (const [key, value] of set) {
220
- const before = lookup({ node, size }, key);
221
259
  node = put(node, { key, hash: hashOf(key), value }, 0);
222
- if (before === undefined)
223
- size += 1;
224
- shift(key, before, value);
260
+ yield ROW_WEIGHT;
225
261
  }
226
262
  if (node === root.node && roots.has(base))
227
263
  return base;
228
- const map = facade({ node, size });
229
- if (weighed.length > 0)
230
- tallies.set(map, new Map(weighed));
231
- return map;
232
- }
233
- export function tally(map, weigh) {
234
- const held = tallies.get(map);
235
- const known = held?.get(weigh);
236
- if (known !== undefined)
237
- return known;
238
- let total = 0;
239
- for (const [key, value] of Object.entries(map))
240
- total += weigh(key, value);
241
- if (roots.has(map)) {
242
- const kept = held ?? new Map();
243
- kept.set(weigh, total);
244
- tallies.set(map, kept);
245
- }
246
- return total;
247
- }
248
- export function sizeOf(map) {
249
- return roots.get(map)?.size ?? Object.keys(map).length;
250
- }
251
- function collect(node, into) {
252
- for (const leaf of leavesOf(node))
253
- into.add(leaf.key);
254
- }
255
- function compared(left, right, shift, same, into) {
256
- if (left === right)
257
- return;
258
- if (left === undefined)
259
- return collect(right, into);
260
- if (right === undefined)
261
- return collect(left, into);
262
- if (!isLeaf(left) && !isCollision(left) && !isLeaf(right) && !isCollision(right)) {
263
- const bits = left.bitmap | right.bitmap;
264
- for (let remaining = bits; remaining !== 0; remaining &= remaining - 1) {
265
- const bit = remaining & -remaining;
266
- compared((left.bitmap & bit) === 0 ? undefined : left.children[slot(left.bitmap, bit)], (right.bitmap & bit) === 0 ? undefined : right.children[slot(right.bitmap, bit)], shift + BITS, same, into);
267
- }
268
- return;
269
- }
270
- const before = new Map([...leavesOf(left)].map((leaf) => [leaf.key, leaf.value]));
271
- for (const leaf of leavesOf(right)) {
272
- const held = before.get(leaf.key);
273
- before.delete(leaf.key);
274
- if (held === undefined || !same(held, leaf.value))
275
- into.add(leaf.key);
276
- }
277
- for (const key of before.keys())
278
- into.add(key);
279
- }
280
- export function differing(left, right, same = Object.is) {
281
- const into = new Set();
282
- if (left === right)
283
- return into;
284
- const leftRoot = roots.get(left);
285
- const rightRoot = roots.get(right);
286
- if (leftRoot !== undefined && rightRoot !== undefined) {
287
- compared(leftRoot.node, rightRoot.node, 0, same, into);
288
- return into;
289
- }
290
- for (const key of Object.keys(left)) {
291
- if (!Object.hasOwn(right, key) || !same(left[key], right[key]))
292
- into.add(key);
293
- }
294
- for (const key of Object.keys(right))
295
- if (!Object.hasOwn(left, key))
296
- into.add(key);
297
- return into;
264
+ return facade({ node });
298
265
  }
299
266
  const drafts = new WeakMap();
300
267
  const GONE = Symbol('gone');
@@ -355,6 +322,9 @@ export function drafted(base) {
355
322
  return draft;
356
323
  }
357
324
  export function settled(draft) {
325
+ return finished(settling(draft));
326
+ }
327
+ export function* settling(draft) {
358
328
  const held = drafts.get(draft);
359
329
  const set = [];
360
330
  const removed = [];
@@ -363,6 +333,7 @@ export function settled(draft) {
363
333
  removed.push(key);
364
334
  else
365
335
  set.push([key, value]);
336
+ yield ROW_WEIGHT;
366
337
  }
367
- return patched(held.base, set, removed);
338
+ return yield* patching(held.base, set, removed);
368
339
  }
@@ -0,0 +1,31 @@
1
+ import type { DiscoveredRoom, Member } from './adapter.js';
2
+ import type { ChangeSet } from './change-set.js';
3
+ import type { QueueEntry } from './outcome.js';
4
+ import type { Runtime } from './runtime.js';
5
+ import type { Live, Moving } from './socket.js';
6
+ import { type CycleProgress } from './status.js';
7
+ export declare const ROOMS_TOPIC = "rooms";
8
+ export declare const STATUS_TOPIC = "sync-status";
9
+ export declare const REFUSAL_TOPIC = "connection-refusal";
10
+ export declare const STORAGE_LOSS_TOPIC = "storage-loss";
11
+ export declare const SERVICE_MODE_TOPIC = "service-mode";
12
+ export declare const MEMBER_TOPIC = "member";
13
+ export declare const AUTHORITY_TOPIC = "authority-changes";
14
+ export declare const LOCKS_TOPIC = "locks";
15
+ export declare const queueTopic: (locator: string) => string;
16
+ export declare function recoverReads({ liveQueries, figures }: Runtime): void;
17
+ export declare function emitRooms(runtime: Runtime, changed?: readonly string[]): Promise<void>;
18
+ export declare function emitKnownRooms(runtime: Runtime): void;
19
+ export declare function emitRefusal(runtime: Runtime): void;
20
+ export declare function emitStorageLoss({ store }: Runtime): void;
21
+ export declare function emitMember({ store }: Runtime, member: Member | null): void;
22
+ export declare function show(runtime: Runtime): Promise<void>;
23
+ export declare function moveTo(runtime: Runtime, next: Moving): Promise<void>;
24
+ export declare function statusShown(runtime: Runtime): Promise<void>;
25
+ export declare function transferring({ socket }: Runtime): Moving;
26
+ export declare function pendingShown(runtime: Runtime): Promise<void>;
27
+ export declare function entriesOf(runtime: Runtime, locator: string): Promise<readonly QueueEntry[]>;
28
+ export declare function publishChangeSet(runtime: Runtime, set: ChangeSet): Promise<void>;
29
+ export declare function roomUnreadable(runtime: Runtime, room: DiscoveredRoom): void;
30
+ export declare function rest(runtime: Runtime, progress: CycleProgress | null, live?: Live): Promise<void>;
31
+ //# sourceMappingURL=shown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shown.d.ts","sourceRoot":"","sources":["../src/shown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA6B,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAC;AAiB7F,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAElD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,UAAU,YAAa,MAAM,WAA4B,CAAC;AA0CvE,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,OAAO,QAG7D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAI9C;AA8ED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,QAK3C;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,QAGjD;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,QAEnE;AAsBD,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAepD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;AAYD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAGjG;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,QAIpE;AAED,wBAAsB,IAAI,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,IAAI,GAAE,IAAqC,iBAgC5C"}
package/dist/shown.js ADDED
@@ -0,0 +1,292 @@
1
+ import { conversationsChanged, conversationsLearned } from './conversation.js';
2
+ import { listingNow, list, patchedListing, shownRooms } from './listing.js';
3
+ import { emitPresentation, publishRoomDrafts } from './room-drafts.js';
4
+ import { same } from './status.js';
5
+ export const ROOMS_TOPIC = 'rooms';
6
+ export const STATUS_TOPIC = 'sync-status';
7
+ export const REFUSAL_TOPIC = 'connection-refusal';
8
+ export const STORAGE_LOSS_TOPIC = 'storage-loss';
9
+ export const SERVICE_MODE_TOPIC = 'service-mode';
10
+ export const MEMBER_TOPIC = 'member';
11
+ export const AUTHORITY_TOPIC = 'authority-changes';
12
+ export const LOCKS_TOPIC = 'locks';
13
+ export const queueTopic = (locator) => `queue\u0000${locator}`;
14
+ async function attended({ store, localSaves }) {
15
+ const isFenced = store.fences.has;
16
+ const held = await (await store.open()).status();
17
+ const attentionRequired = held.returned.flatMap((record) => record.returned === null || isFenced(record.locator)
18
+ ? []
19
+ : [{ room: record.locator, path: record.path, returned: structuredClone(record.returned) }]);
20
+ attentionRequired.sort((left, right) => {
21
+ if (left.room !== right.room)
22
+ return left.room < right.room ? -1 : 1;
23
+ if (left.path !== right.path)
24
+ return left.path < right.path ? -1 : 1;
25
+ return 0;
26
+ });
27
+ const changed = new Map();
28
+ if (!localSaves) {
29
+ for (const change of held.unsent) {
30
+ if (!isFenced(change.room))
31
+ changed.set(`${change.room}\u0000${change.path}`, change);
32
+ }
33
+ }
34
+ const unsent = [...changed]
35
+ .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
36
+ .map(([, change]) => change);
37
+ return {
38
+ queued: !localSaves && held.queued.some((locator) => !isFenced(locator)),
39
+ lastCompleted: held.lastCompleted,
40
+ attentionRequired,
41
+ unsent,
42
+ reset: held.resets.reduce((earliest, { locator, reset }) => isFenced(locator) || (earliest !== null && earliest <= reset) ? earliest : reset, null),
43
+ };
44
+ }
45
+ async function queuedWork({ store, localSaves }) {
46
+ const held = await (await store.open()).queued();
47
+ return !localSaves && held.some((locator) => !store.fences.has(locator));
48
+ }
49
+ export function recoverReads({ liveQueries, figures }) {
50
+ liveQueries.recover();
51
+ figures.recover();
52
+ }
53
+ export function emitRooms(runtime, changed) {
54
+ recoverReads(runtime);
55
+ runtime.store.readiness.queue();
56
+ return changed === undefined
57
+ ? publishRooms(runtime, 'all')
58
+ : publishRooms(runtime, 'changed', changed);
59
+ }
60
+ export function emitKnownRooms(runtime) {
61
+ conversationsLearned(runtime.conversations);
62
+ if (runtime.store.watching(ROOMS_TOPIC, 'waiting').length === 0)
63
+ return;
64
+ void publishRooms(runtime, 'known');
65
+ }
66
+ function roomsOwedWith(held, mode, touched) {
67
+ if (held === undefined) {
68
+ return {
69
+ all: mode === 'all',
70
+ changed: new Set(mode === 'changed' ? touched : []),
71
+ counted: new Set(mode === 'changed' ? [] : touched),
72
+ };
73
+ }
74
+ held.all ||= mode === 'all';
75
+ for (const locator of touched) {
76
+ (mode === 'changed' ? held.changed : held.counted).add(locator);
77
+ }
78
+ return held;
79
+ }
80
+ async function deliverRooms(runtime, owed) {
81
+ const { store, socket } = runtime;
82
+ const waiting = () => store.watching(ROOMS_TOPIC, 'waiting');
83
+ if (socket.closed() || store.watching(ROOMS_TOPIC).length === 0)
84
+ return;
85
+ const patched = owed.all || owed.changed.size === 0 || waiting().length > 0
86
+ ? null
87
+ : await patchedListing(runtime, new Set([...owed.changed, ...owed.counted]));
88
+ if (patched === null && owed.changed.size > 0)
89
+ owed.all = true;
90
+ if (patched === null && !owed.all && owed.counted.size > 0) {
91
+ const held = await store.covering().catch(() => null);
92
+ if (held === null)
93
+ return;
94
+ const { roomsShown } = store.device.now();
95
+ owed.all = [...owed.counted].some((locator) => held.rooms.has(locator) &&
96
+ roomsShown?.get(locator)?.documents !== held.rooms.get(locator).documents);
97
+ if (owed.all) {
98
+ recoverReads(runtime);
99
+ store.readiness.queue();
100
+ }
101
+ else if (waiting().length === 0)
102
+ return;
103
+ }
104
+ const listing = patched ?? (await listingNow(runtime).catch(() => null));
105
+ if (listing === null || socket.closed())
106
+ return;
107
+ const { roomsListed, refusal, moving } = socket.session.now();
108
+ const joining = waiting().length > 0 &&
109
+ (roomsListed || listing.size > 0 || refusal !== null || moving.providerUnreachable);
110
+ if (!owed.all && patched === null && !joining)
111
+ return;
112
+ const value = shownRooms(runtime, listing);
113
+ const { roomsShown } = store.device.now();
114
+ const moved = owed.all ||
115
+ patched !== null ||
116
+ (roomsShown !== null &&
117
+ JSON.stringify(shownRooms(runtime, roomsShown)) !== JSON.stringify(value));
118
+ if (moved)
119
+ for (const watcher of store.watching(ROOMS_TOPIC, 'ready'))
120
+ watcher.answer(value);
121
+ if (joining)
122
+ for (const watcher of waiting())
123
+ watcher.answer(value);
124
+ store.device.set({
125
+ roomsShown: store.watching(ROOMS_TOPIC, 'ready').length === 0 ? null : listing,
126
+ });
127
+ }
128
+ function publishRooms(runtime, mode, touched = []) {
129
+ if (runtime.socket.closed())
130
+ return Promise.resolve();
131
+ return runtime.store.owing(ROOMS_TOPIC, (held) => roomsOwedWith(held, mode, touched), (owed) => deliverRooms(runtime, owed));
132
+ }
133
+ export function emitRefusal(runtime) {
134
+ const { store, socket } = runtime;
135
+ store.readiness.queue();
136
+ store.tell(REFUSAL_TOPIC, socket.session.now().refusal);
137
+ emitKnownRooms(runtime);
138
+ }
139
+ export function emitStorageLoss({ store }) {
140
+ store.readiness.queue();
141
+ store.tell(STORAGE_LOSS_TOPIC, store.device.now().storageLoss);
142
+ }
143
+ export function emitMember({ store }, member) {
144
+ store.tell(MEMBER_TOPIC, member);
145
+ }
146
+ async function deliverStatus(runtime, owed) {
147
+ const { store, socket } = runtime;
148
+ const held = await attended(runtime);
149
+ if (socket.closed())
150
+ return;
151
+ for (const { moving, current } of owed) {
152
+ const state = moving.resting && held.queued ? 'pending' : moving.state;
153
+ const next = {
154
+ state: state === 'synced' && !current ? 'syncing' : state,
155
+ lastCompleted: held.lastCompleted,
156
+ providerUnreachable: moving.providerUnreachable,
157
+ attentionRequired: held.attentionRequired,
158
+ unsent: held.unsent,
159
+ reset: held.reset,
160
+ };
161
+ if (same(store.device.now().status, next))
162
+ continue;
163
+ store.device.set({ status: next });
164
+ store.tell(STATUS_TOPIC, next);
165
+ }
166
+ }
167
+ export function show(runtime) {
168
+ const { store, socket, conversations } = runtime;
169
+ if (socket.closed())
170
+ return Promise.resolve();
171
+ store.readiness.queue();
172
+ emitKnownRooms(runtime);
173
+ const moved = { moving: socket.session.now().moving, current: conversations.current() };
174
+ return store.owing(STATUS_TOPIC, (held) => {
175
+ if (held === undefined)
176
+ return [moved];
177
+ held.push(moved);
178
+ return held;
179
+ }, (owed) => deliverStatus(runtime, owed));
180
+ }
181
+ export function moveTo(runtime, next) {
182
+ if (runtime.socket.closed())
183
+ return Promise.resolve();
184
+ runtime.socket.session.set({ moving: next });
185
+ return show(runtime);
186
+ }
187
+ export function statusShown(runtime) {
188
+ return moveTo(runtime, runtime.socket.session.now().moving);
189
+ }
190
+ export function transferring({ socket }) {
191
+ return { ...socket.session.now().moving, state: 'syncing', resting: false };
192
+ }
193
+ export function pendingShown(runtime) {
194
+ const { socket, localSaves } = runtime;
195
+ if (!localSaves)
196
+ socket.session.set({ recorded: false });
197
+ const { moving } = socket.session.now();
198
+ return moveTo(runtime, localSaves ? moving : { ...moving, state: 'pending', resting: false });
199
+ }
200
+ function entryOf({ localSaves }, states, batch) {
201
+ if (localSaves)
202
+ return Object.freeze({ batch, state: 'local' });
203
+ const state = states.get(batch.id);
204
+ return Object.freeze({ batch, ...(state?.submission ?? { state: 'waiting' }) });
205
+ }
206
+ export async function entriesOf(runtime, locator) {
207
+ const { queue, states } = await runtime.store.work(locator);
208
+ return queue.map((batch) => entryOf(runtime, states, batch));
209
+ }
210
+ function emitQueue(runtime, locator) {
211
+ const { store, socket } = runtime;
212
+ const listening = () => store.watching(queueTopic(locator));
213
+ if (socket.closed() || listening().length === 0)
214
+ return Promise.resolve();
215
+ return store.publication(async () => {
216
+ if (socket.closed() || listening().length === 0)
217
+ return;
218
+ const entries = await entriesOf(runtime, locator);
219
+ if (socket.closed())
220
+ return;
221
+ for (const watcher of listening())
222
+ watcher.answer(entries);
223
+ });
224
+ }
225
+ export function publishChangeSet(runtime, set) {
226
+ const { store, liveQueries, figures, conversations } = runtime;
227
+ liveQueries.touched(set);
228
+ figures.touched(set);
229
+ for (const { locator, path } of set.documents) {
230
+ if (path !== null)
231
+ store.attached.drop(locator, path);
232
+ }
233
+ const shownNow = [];
234
+ if (set.queues.length > 0 || set.drafts.length > 0)
235
+ shownNow.push(show(runtime));
236
+ if (set.rooms.length > 0)
237
+ shownNow.push(emitRooms(runtime, set.rooms));
238
+ else if (set.documents.length > 0) {
239
+ shownNow.push(publishRooms(runtime, 'counted', [...new Set(set.documents.map(({ locator }) => locator))]));
240
+ }
241
+ for (const locator of set.queues)
242
+ shownNow.push(emitQueue(runtime, locator));
243
+ if (set.drafts.length > 0)
244
+ shownNow.push(publishRoomDrafts(runtime, false));
245
+ else if (set.documents.length > 0) {
246
+ shownNow.push(publishRoomDrafts(runtime, false, set.documents));
247
+ }
248
+ for (const app of set.presentations)
249
+ shownNow.push(emitPresentation(runtime, app));
250
+ conversationsChanged(conversations, set);
251
+ return Promise.all(shownNow).then(() => undefined);
252
+ }
253
+ export function roomUnreadable(runtime, room) {
254
+ runtime.socket.rooms.stand(room.locator, { unreadable: true });
255
+ list(runtime, room, false);
256
+ emitRooms(runtime);
257
+ }
258
+ export async function rest(runtime, progress, live = () => !runtime.socket.closed()) {
259
+ const { store, socket } = runtime;
260
+ const { session, lanes, rooms } = socket;
261
+ if (!live())
262
+ return;
263
+ const settled = () => session.now().complete &&
264
+ lanes.roomWork() === 0 &&
265
+ !socket.naming() &&
266
+ rooms.standingWhere(({ stale }) => stale).length === 0;
267
+ let synced = settled();
268
+ if (synced && !session.now().recorded) {
269
+ const queued = await queuedWork(runtime).catch(() => true);
270
+ if (!live())
271
+ return;
272
+ synced = !queued && settled();
273
+ }
274
+ if (synced && !session.now().recorded) {
275
+ const completedAt = new Date().toISOString();
276
+ try {
277
+ await (await store.open()).fact('lastCompleted', completedAt);
278
+ if (!live())
279
+ return;
280
+ session.set({ recorded: true });
281
+ }
282
+ catch {
283
+ synced = false;
284
+ }
285
+ }
286
+ const { complete, moving } = session.now();
287
+ moveTo(runtime, {
288
+ state: synced && complete && lanes.roomWork() === 0 && !socket.naming() ? 'synced' : 'syncing',
289
+ providerUnreachable: progress === null ? moving.providerUnreachable : !progress.reachable,
290
+ resting: true,
291
+ });
292
+ }
@@ -0,0 +1,7 @@
1
+ export type Admission = {
2
+ heldStream(): Promise<() => void>;
3
+ unqueued(): Promise<void>;
4
+ queued(text: number): () => void;
5
+ };
6
+ export declare function createAdmission(): Admission;
7
+ //# sourceMappingURL=admission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/socket/admission.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,eAAe,IAAI,SAAS,CAmC3C"}
@@ -0,0 +1,39 @@
1
+ const STREAMS_HELD = 4;
2
+ const QUEUED_TEXT = 1 << 23;
3
+ export function createAdmission() {
4
+ let streamsFree = STREAMS_HELD;
5
+ let queuedText = 0;
6
+ const installWaiters = [];
7
+ function once(release) {
8
+ let released = false;
9
+ return () => {
10
+ if (released)
11
+ return;
12
+ released = true;
13
+ release();
14
+ for (const admit of installWaiters.splice(0))
15
+ admit();
16
+ };
17
+ }
18
+ return {
19
+ async heldStream() {
20
+ while (streamsFree === 0)
21
+ await new Promise((admit) => installWaiters.push(admit));
22
+ streamsFree -= 1;
23
+ return once(() => {
24
+ streamsFree += 1;
25
+ });
26
+ },
27
+ async unqueued() {
28
+ while (queuedText >= QUEUED_TEXT) {
29
+ await new Promise((admit) => installWaiters.push(admit));
30
+ }
31
+ },
32
+ queued(text) {
33
+ queuedText += text;
34
+ return once(() => {
35
+ queuedText -= text;
36
+ });
37
+ },
38
+ };
39
+ }
@@ -0,0 +1,6 @@
1
+ export type Answers = {
2
+ awaitingAnswer(locator: string): () => void;
3
+ answered(locator: string): Promise<void> | undefined;
4
+ };
5
+ export declare function createAnswers(): Answers;
6
+ //# sourceMappingURL=answers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../../src/socket/answers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CACtD,CAAC;AAEF,wBAAgB,aAAa,IAAI,OAAO,CAkBvC"}
@@ -0,0 +1,20 @@
1
+ export function createAnswers() {
2
+ const answering = new Map();
3
+ return {
4
+ awaitingAnswer(locator) {
5
+ answering.get(locator)?.release();
6
+ let release = () => { };
7
+ const answered = new Promise((resolve) => {
8
+ release = resolve;
9
+ });
10
+ const awaited = { answered, release };
11
+ answering.set(locator, awaited);
12
+ return () => {
13
+ if (answering.get(locator) === awaited)
14
+ answering.delete(locator);
15
+ release();
16
+ };
17
+ },
18
+ answered: (locator) => answering.get(locator)?.answered,
19
+ };
20
+ }
@@ -0,0 +1,20 @@
1
+ export type Live = () => boolean;
2
+ type LaneRules = {
3
+ generation(): number;
4
+ continuing(): boolean;
5
+ stopping(): boolean;
6
+ };
7
+ export type Lanes = {
8
+ task(lane: string, work: (live: Live) => Promise<void>): Promise<void>;
9
+ inRoom<T>(locator: string, work: (live: Live) => Promise<T>): Promise<T>;
10
+ roomTask(locator: string, work: (live: Live) => Promise<void>): Promise<void>;
11
+ roomWork(): number;
12
+ current(): Promise<unknown>;
13
+ finished(): Promise<unknown>;
14
+ calling(operation: string): boolean;
15
+ call(operation: string): void;
16
+ called(operation: string): void;
17
+ };
18
+ export declare function createLanes({ generation, continuing, stopping }: LaneRules): Lanes;
19
+ export {};
20
+ //# sourceMappingURL=lanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lanes.d.ts","sourceRoot":"","sources":["../../src/socket/lanes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;AAIjC,KAAK,SAAS,GAAG;IACf,UAAU,IAAI,MAAM,CAAC;IACrB,UAAU,IAAI,OAAO,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,IAAI,MAAM,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAIF,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,SAAS,GAAG,KAAK,CAgFlF"}