@agentshouse/mdruntime 0.1.0-cdb8840578a20 → 0.1.0-cdded6c080913

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 (365) 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 +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +250 -0
  8. package/dist/adapter.d.ts +151 -79
  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 +31 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +319 -107
  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 -88
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +10 -1
  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 +98 -11
  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 +717 -0
  43. package/dist/connection.d.ts +7 -129
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +97 -3359
  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-row.d.ts +33 -0
  50. package/dist/conversation-row.d.ts.map +1 -0
  51. package/dist/conversation-row.js +53 -0
  52. package/dist/conversation.d.ts +43 -18
  53. package/dist/conversation.d.ts.map +1 -1
  54. package/dist/conversation.js +718 -312
  55. package/dist/digest.d.ts +7 -0
  56. package/dist/digest.d.ts.map +1 -0
  57. package/dist/digest.js +113 -0
  58. package/dist/discovery.d.ts +10 -0
  59. package/dist/discovery.d.ts.map +1 -0
  60. package/dist/discovery.js +175 -0
  61. package/dist/durability.d.ts +16 -4
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +5 -0
  64. package/dist/entry.d.ts +5 -2
  65. package/dist/entry.d.ts.map +1 -1
  66. package/dist/entry.js +33 -28
  67. package/dist/figures.d.ts +48 -0
  68. package/dist/figures.d.ts.map +1 -0
  69. package/dist/figures.js +197 -0
  70. package/dist/file.d.ts +2 -19
  71. package/dist/file.d.ts.map +1 -1
  72. package/dist/file.js +7 -122
  73. package/dist/holdings.d.ts +29 -0
  74. package/dist/holdings.d.ts.map +1 -0
  75. package/dist/holdings.js +95 -0
  76. package/dist/host.d.ts +7 -8
  77. package/dist/host.d.ts.map +1 -1
  78. package/dist/host.js +101 -24
  79. package/dist/identity.d.ts +0 -2
  80. package/dist/identity.d.ts.map +1 -1
  81. package/dist/identity.js +0 -6
  82. package/dist/index.d.ts +32 -13
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +10 -1
  85. package/dist/install.d.ts +56 -0
  86. package/dist/install.d.ts.map +1 -0
  87. package/dist/install.js +560 -0
  88. package/dist/job.d.ts +33 -0
  89. package/dist/job.d.ts.map +1 -0
  90. package/dist/job.js +54 -0
  91. package/dist/lifecycle.d.ts +7 -0
  92. package/dist/lifecycle.d.ts.map +1 -0
  93. package/dist/lifecycle.js +267 -0
  94. package/dist/listing.d.ts +53 -0
  95. package/dist/listing.d.ts.map +1 -0
  96. package/dist/listing.js +175 -0
  97. package/dist/live.d.ts +23 -0
  98. package/dist/live.d.ts.map +1 -0
  99. package/dist/live.js +165 -0
  100. package/dist/locks.d.ts +9 -0
  101. package/dist/locks.d.ts.map +1 -0
  102. package/dist/locks.js +61 -0
  103. package/dist/log.d.ts +1 -0
  104. package/dist/log.d.ts.map +1 -1
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +61 -0
  108. package/dist/media.d.ts +8 -0
  109. package/dist/media.d.ts.map +1 -0
  110. package/dist/media.js +218 -0
  111. package/dist/memory.d.ts +19 -7
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +248 -103
  114. package/dist/messages.d.ts +52 -0
  115. package/dist/messages.d.ts.map +1 -0
  116. package/dist/messages.js +168 -0
  117. package/dist/model.d.ts +8 -10
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +6 -18
  120. package/dist/models.d.ts +14 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +193 -0
  123. package/dist/name.d.ts +4 -0
  124. package/dist/name.d.ts.map +1 -0
  125. package/dist/name.js +122 -0
  126. package/dist/observation.d.ts +17 -2
  127. package/dist/observation.d.ts.map +1 -1
  128. package/dist/observation.js +100 -5
  129. package/dist/opened.d.ts +22 -0
  130. package/dist/opened.d.ts.map +1 -0
  131. package/dist/opened.js +107 -0
  132. package/dist/opening.d.ts +4 -0
  133. package/dist/opening.d.ts.map +1 -0
  134. package/dist/opening.js +56 -0
  135. package/dist/outcome.d.ts +49 -8
  136. package/dist/outcome.d.ts.map +1 -1
  137. package/dist/outcome.js +42 -0
  138. package/dist/overlay.d.ts +4 -5
  139. package/dist/overlay.d.ts.map +1 -1
  140. package/dist/overlay.js +106 -156
  141. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/{chat/parts.js → parts.js} +45 -46
  144. package/dist/paths.d.ts +1 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +4 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +226 -0
  150. package/dist/queries.d.ts +16 -0
  151. package/dist/queries.d.ts.map +1 -0
  152. package/dist/queries.js +272 -0
  153. package/dist/query.d.ts +26 -185
  154. package/dist/query.d.ts.map +1 -1
  155. package/dist/query.js +3 -464
  156. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  157. package/dist/questions.d.ts.map +1 -0
  158. package/dist/{chat/questions.js → questions.js} +12 -1
  159. package/dist/reach.d.ts +19 -9
  160. package/dist/reach.d.ts.map +1 -1
  161. package/dist/reach.js +287 -99
  162. package/dist/react.d.ts +12 -4
  163. package/dist/react.d.ts.map +1 -1
  164. package/dist/react.js +7 -17
  165. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  166. package/dist/read.d.ts.map +1 -0
  167. package/dist/{chat/read.js → read.js} +4 -0
  168. package/dist/readiness.d.ts +14 -17
  169. package/dist/readiness.d.ts.map +1 -1
  170. package/dist/readiness.js +2 -8
  171. package/dist/reads.d.ts +36 -0
  172. package/dist/reads.d.ts.map +1 -0
  173. package/dist/reads.js +150 -0
  174. package/dist/recovery.d.ts +3 -2
  175. package/dist/recovery.d.ts.map +1 -1
  176. package/dist/recovery.js +43 -8
  177. package/dist/refresh.d.ts +17 -14
  178. package/dist/refresh.d.ts.map +1 -1
  179. package/dist/refresh.js +143 -52
  180. package/dist/refusal.d.ts +5 -0
  181. package/dist/refusal.d.ts.map +1 -0
  182. package/dist/refusal.js +56 -0
  183. package/dist/replica.d.ts +55 -33
  184. package/dist/replica.d.ts.map +1 -1
  185. package/dist/replica.js +331 -181
  186. package/dist/room-draft.d.ts +37 -6
  187. package/dist/room-draft.d.ts.map +1 -1
  188. package/dist/room-draft.js +161 -74
  189. package/dist/room-drafts.d.ts +24 -0
  190. package/dist/room-drafts.d.ts.map +1 -0
  191. package/dist/room-drafts.js +216 -0
  192. package/dist/rows.d.ts +31 -29
  193. package/dist/rows.d.ts.map +1 -1
  194. package/dist/rows.js +59 -116
  195. package/dist/runtime.d.ts +42 -0
  196. package/dist/runtime.d.ts.map +1 -0
  197. package/dist/runtime.js +1 -0
  198. package/dist/save.d.ts +53 -14
  199. package/dist/save.d.ts.map +1 -1
  200. package/dist/save.js +534 -187
  201. package/dist/saves.d.ts +70 -0
  202. package/dist/saves.d.ts.map +1 -0
  203. package/dist/saves.js +1004 -0
  204. package/dist/search.d.ts +15 -78
  205. package/dist/search.d.ts.map +1 -1
  206. package/dist/search.js +10 -184
  207. package/dist/seed.d.ts +25 -0
  208. package/dist/seed.d.ts.map +1 -0
  209. package/dist/seed.js +146 -0
  210. package/dist/shared.d.ts +7 -3
  211. package/dist/shared.d.ts.map +1 -1
  212. package/dist/shared.js +119 -66
  213. package/dist/shown.d.ts +31 -0
  214. package/dist/shown.d.ts.map +1 -0
  215. package/dist/shown.js +294 -0
  216. package/dist/socket/admission.d.ts +7 -0
  217. package/dist/socket/admission.d.ts.map +1 -0
  218. package/dist/socket/admission.js +39 -0
  219. package/dist/socket/answers.d.ts +6 -0
  220. package/dist/socket/answers.d.ts.map +1 -0
  221. package/dist/socket/answers.js +20 -0
  222. package/dist/socket/lanes.d.ts +20 -0
  223. package/dist/socket/lanes.d.ts.map +1 -0
  224. package/dist/socket/lanes.js +77 -0
  225. package/dist/socket/reads.d.ts +10 -0
  226. package/dist/socket/reads.d.ts.map +1 -0
  227. package/dist/socket/reads.js +31 -0
  228. package/dist/socket/rooms.d.ts +43 -0
  229. package/dist/socket/rooms.d.ts.map +1 -0
  230. package/dist/socket/rooms.js +90 -0
  231. package/dist/socket/session.d.ts +39 -0
  232. package/dist/socket/session.d.ts.map +1 -0
  233. package/dist/socket/session.js +23 -0
  234. package/dist/socket.d.ts +70 -0
  235. package/dist/socket.d.ts.map +1 -0
  236. package/dist/socket.js +175 -0
  237. package/dist/source.d.ts +61 -0
  238. package/dist/source.d.ts.map +1 -0
  239. package/dist/source.js +81 -0
  240. package/dist/status.d.ts +4 -5
  241. package/dist/status.d.ts.map +1 -1
  242. package/dist/status.js +3 -7
  243. package/dist/store/fences.d.ts +16 -0
  244. package/dist/store/fences.d.ts.map +1 -0
  245. package/dist/store/fences.js +26 -0
  246. package/dist/store/installs.d.ts +30 -0
  247. package/dist/store/installs.d.ts.map +1 -0
  248. package/dist/store/installs.js +34 -0
  249. package/dist/store/readiness.d.ts +10 -0
  250. package/dist/store/readiness.d.ts.map +1 -0
  251. package/dist/store/readiness.js +52 -0
  252. package/dist/store/records.d.ts +212 -0
  253. package/dist/store/records.d.ts.map +1 -0
  254. package/dist/store/records.js +408 -0
  255. package/dist/store/room-held.d.ts +8 -0
  256. package/dist/store/room-held.d.ts.map +1 -0
  257. package/dist/store/room-held.js +17 -0
  258. package/dist/store/space.d.ts +11 -0
  259. package/dist/store/space.d.ts.map +1 -0
  260. package/dist/store/space.js +43 -0
  261. package/dist/store/watchers.d.ts +17 -0
  262. package/dist/store/watchers.d.ts.map +1 -0
  263. package/dist/store/watchers.js +57 -0
  264. package/dist/store/writes.d.ts +24 -0
  265. package/dist/store/writes.d.ts.map +1 -0
  266. package/dist/store/writes.js +125 -0
  267. package/dist/store.d.ts +106 -150
  268. package/dist/store.d.ts.map +1 -1
  269. package/dist/store.js +136 -713
  270. package/dist/stored.d.ts +156 -0
  271. package/dist/stored.d.ts.map +1 -0
  272. package/dist/stored.js +637 -0
  273. package/dist/surface.d.ts +88 -0
  274. package/dist/surface.d.ts.map +1 -0
  275. package/dist/surface.js +222 -0
  276. package/dist/sync.d.ts +20 -0
  277. package/dist/sync.d.ts.map +1 -0
  278. package/dist/sync.js +531 -0
  279. package/dist/tables.d.ts +415 -0
  280. package/dist/tables.d.ts.map +1 -0
  281. package/dist/tables.js +740 -0
  282. package/dist/tallies.d.ts +18 -0
  283. package/dist/tallies.d.ts.map +1 -0
  284. package/dist/tallies.js +129 -0
  285. package/dist/transfer.d.ts +0 -5
  286. package/dist/transfer.d.ts.map +1 -1
  287. package/dist/turn.d.ts +5 -3
  288. package/dist/turn.d.ts.map +1 -1
  289. package/dist/turn.js +51 -21
  290. package/dist/validation.d.ts +29 -0
  291. package/dist/validation.d.ts.map +1 -0
  292. package/dist/validation.js +104 -0
  293. package/dist/windows.d.ts +11 -0
  294. package/dist/windows.d.ts.map +1 -0
  295. package/dist/windows.js +16 -0
  296. package/dist/wire.d.ts +50 -6
  297. package/dist/wire.d.ts.map +1 -1
  298. package/dist/wire.js +16 -2
  299. package/package.json +18 -19
  300. package/AGENTS.md +0 -300
  301. package/dist/acquisition.d.ts +0 -14
  302. package/dist/acquisition.d.ts.map +0 -1
  303. package/dist/acquisition.js +0 -24
  304. package/dist/chat/acts.d.ts +0 -33
  305. package/dist/chat/acts.d.ts.map +0 -1
  306. package/dist/chat/acts.js +0 -36
  307. package/dist/chat/context.d.ts +0 -3
  308. package/dist/chat/context.d.ts.map +0 -1
  309. package/dist/chat/input.d.ts +0 -9
  310. package/dist/chat/input.d.ts.map +0 -1
  311. package/dist/chat/input.js +0 -99
  312. package/dist/chat/kit.d.ts +0 -61
  313. package/dist/chat/kit.d.ts.map +0 -1
  314. package/dist/chat/kit.js +0 -123
  315. package/dist/chat/lasting.d.ts +0 -6
  316. package/dist/chat/lasting.d.ts.map +0 -1
  317. package/dist/chat/lasting.js +0 -19
  318. package/dist/chat/list.d.ts +0 -27
  319. package/dist/chat/list.d.ts.map +0 -1
  320. package/dist/chat/list.js +0 -63
  321. package/dist/chat/markdown.d.ts +0 -20
  322. package/dist/chat/markdown.d.ts.map +0 -1
  323. package/dist/chat/markdown.js +0 -188
  324. package/dist/chat/message.d.ts +0 -6
  325. package/dist/chat/message.d.ts.map +0 -1
  326. package/dist/chat/message.js +0 -192
  327. package/dist/chat/messages.d.ts +0 -22
  328. package/dist/chat/messages.d.ts.map +0 -1
  329. package/dist/chat/messages.js +0 -155
  330. package/dist/chat/name.d.ts +0 -6
  331. package/dist/chat/name.d.ts.map +0 -1
  332. package/dist/chat/name.js +0 -37
  333. package/dist/chat/opened.d.ts +0 -11
  334. package/dist/chat/opened.d.ts.map +0 -1
  335. package/dist/chat/opened.js +0 -17
  336. package/dist/chat/overlay.d.ts +0 -31
  337. package/dist/chat/overlay.d.ts.map +0 -1
  338. package/dist/chat/overlay.js +0 -97
  339. package/dist/chat/parts.d.ts.map +0 -1
  340. package/dist/chat/process.d.ts +0 -20
  341. package/dist/chat/process.d.ts.map +0 -1
  342. package/dist/chat/process.js +0 -32
  343. package/dist/chat/provider.d.ts +0 -63
  344. package/dist/chat/provider.d.ts.map +0 -1
  345. package/dist/chat/provider.js +0 -629
  346. package/dist/chat/question.d.ts +0 -9
  347. package/dist/chat/question.d.ts.map +0 -1
  348. package/dist/chat/question.js +0 -80
  349. package/dist/chat/questions.d.ts.map +0 -1
  350. package/dist/chat/read.d.ts.map +0 -1
  351. package/dist/chat/ready.d.ts +0 -34
  352. package/dist/chat/ready.d.ts.map +0 -1
  353. package/dist/chat/ready.js +0 -91
  354. package/dist/chat/style.d.ts +0 -4
  355. package/dist/chat/style.d.ts.map +0 -1
  356. package/dist/chat/style.js +0 -302
  357. package/dist/chat.d.ts +0 -14
  358. package/dist/chat.d.ts.map +0 -1
  359. package/dist/chat.js +0 -8
  360. package/dist/fence.d.ts +0 -6
  361. package/dist/fence.d.ts.map +0 -1
  362. package/dist/fence.js +0 -10
  363. package/dist/read-side.d.ts +0 -25
  364. package/dist/read-side.d.ts.map +0 -1
  365. package/dist/read-side.js +0 -639
@@ -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"}
@@ -0,0 +1,77 @@
1
+ const ROOM_READS = 256;
2
+ export function createLanes({ generation, continuing, stopping }) {
3
+ const lanes = new Map();
4
+ const roomLanes = new Map();
5
+ const roomReads = { free: ROOM_READS, waiting: [] };
6
+ const working = new Set();
7
+ const calling = new Set();
8
+ let roomWork = 0;
9
+ async function admittedRead(work) {
10
+ while (roomReads.free === 0) {
11
+ await new Promise((admit) => roomReads.waiting.push(admit));
12
+ }
13
+ roomReads.free -= 1;
14
+ try {
15
+ await work();
16
+ }
17
+ finally {
18
+ roomReads.free += 1;
19
+ roomReads.waiting.shift()?.();
20
+ }
21
+ }
22
+ function inRoom(locator, work) {
23
+ roomWork += 1;
24
+ const ran = (roomLanes.get(locator) ?? Promise.resolve()).then(async () => {
25
+ try {
26
+ return await work(continuing);
27
+ }
28
+ finally {
29
+ roomWork -= 1;
30
+ }
31
+ });
32
+ const chain = ran.then(() => undefined, () => undefined);
33
+ roomLanes.set(locator, chain);
34
+ working.add(chain);
35
+ void chain.finally(() => {
36
+ working.delete(chain);
37
+ if (roomLanes.get(locator) === chain)
38
+ roomLanes.delete(locator);
39
+ });
40
+ return ran;
41
+ }
42
+ return {
43
+ task(lane, work) {
44
+ if (stopping())
45
+ return Promise.resolve();
46
+ const held = lanes.get(lane);
47
+ const opened = generation();
48
+ const current = held?.generation === opened ? held : { generation: opened, chain: Promise.resolve() };
49
+ const turn = current.generation;
50
+ const live = () => turn === generation() && continuing();
51
+ const run = current.chain.then(() => work(live)).catch(() => undefined);
52
+ current.chain = run;
53
+ lanes.set(lane, current);
54
+ working.add(run);
55
+ void run.finally(() => working.delete(run));
56
+ return run;
57
+ },
58
+ inRoom,
59
+ roomTask(locator, work) {
60
+ if (stopping())
61
+ return Promise.resolve();
62
+ return inRoom(locator, (live) => admittedRead(() => work(live))).catch(() => undefined);
63
+ },
64
+ roomWork: () => roomWork,
65
+ current: () => Promise.all([...lanes.values()]
66
+ .filter((held) => held.generation === generation())
67
+ .map((held) => held.chain)),
68
+ finished: () => Promise.all(working),
69
+ calling: (operation) => calling.has(operation),
70
+ call(operation) {
71
+ calling.add(operation);
72
+ },
73
+ called(operation) {
74
+ calling.delete(operation);
75
+ },
76
+ };
77
+ }
@@ -0,0 +1,10 @@
1
+ import type { Adapter } from '../adapter.js';
2
+ import type { Reads } from '../bootstrap.js';
3
+ type HeldReads = {
4
+ readonly reads: Reads;
5
+ abort(): void;
6
+ stop(): void;
7
+ };
8
+ export declare function createReads(adapter: Adapter): HeldReads;
9
+ export {};
10
+ //# sourceMappingURL=reads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/socket/reads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiD,MAAM,eAAe,CAAC;AAC5F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAWF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAuBvD"}
@@ -0,0 +1,31 @@
1
+ function readUntil(read, signal) {
2
+ if (signal.aborted)
3
+ return Promise.resolve({ kind: 'transport-uncertainty' });
4
+ return new Promise((resolve, reject) => {
5
+ const stop = () => resolve({ kind: 'transport-uncertainty' });
6
+ signal.addEventListener('abort', stop, { once: true });
7
+ read.then(resolve, reject).finally(() => signal.removeEventListener('abort', stop));
8
+ });
9
+ }
10
+ export function createReads(adapter) {
11
+ let inFlight = new AbortController();
12
+ const refreshed = adapter.refresh?.bind(adapter);
13
+ return {
14
+ reads: {
15
+ bootstrap: (authorized, request) => readUntil(adapter.bootstrap(authorized, request), inFlight.signal),
16
+ ...(refreshed === undefined
17
+ ? {}
18
+ : {
19
+ refresh: (authorized, request) => readUntil(refreshed(authorized, request), inFlight.signal),
20
+ }),
21
+ reached: (locator, roomVersion, target) => adapter.reached(locator, roomVersion, target),
22
+ },
23
+ abort() {
24
+ inFlight.abort();
25
+ inFlight = new AbortController();
26
+ },
27
+ stop() {
28
+ inFlight.abort();
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,43 @@
1
+ import type { DiscoveredRoom, ProviderRefusal, TypedSelection } from '../adapter.js';
2
+ import type { ModelState } from '../model.js';
3
+ export type RoomDeclaration = Omit<DiscoveredRoom, 'roomVersion' | 'typedSelection'> & {
4
+ typedSelection?: TypedSelection | null;
5
+ };
6
+ export type Declared = {
7
+ readonly room: RoomDeclaration | null;
8
+ readonly available: boolean;
9
+ };
10
+ export type RoomStanding = {
11
+ readonly unreadable: boolean;
12
+ readonly refusal: ProviderRefusal | null;
13
+ readonly unheldModel: ModelState | null;
14
+ readonly stale: boolean;
15
+ readonly repairable: {
16
+ readonly reset: string | undefined;
17
+ } | null;
18
+ readonly repairing: boolean;
19
+ readonly reloadDue: boolean;
20
+ readonly confirmed: boolean;
21
+ readonly unpreparable: boolean;
22
+ };
23
+ export type Rooms = {
24
+ declare(locator: string, declared: Declared): void;
25
+ declared(locator: string): Declared | undefined;
26
+ declarations(): ReadonlyMap<string, Declared>;
27
+ discover(room: DiscoveredRoom): void;
28
+ discovered(locator: string): DiscoveredRoom | undefined;
29
+ discoveredRooms(): readonly DiscoveredRoom[];
30
+ undiscoverAll(): void;
31
+ standing(locator: string): RoomStanding;
32
+ stand(locator: string, change: Partial<RoomStanding>): void;
33
+ standingWhere(held: (room: RoomStanding) => boolean): readonly string[];
34
+ standAll(change: Partial<RoomStanding>): void;
35
+ forget(locator: string): void;
36
+ askAgain(locator: string, ask: () => void): void;
37
+ readied(locator: string): void;
38
+ unreadied(): void;
39
+ connectionLost(lapsed: () => void): void;
40
+ connectionLive(): void;
41
+ };
42
+ export declare function createRooms(): Rooms;
43
+ //# sourceMappingURL=rooms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../src/socket/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,gBAAgB,CAAC,GAAG;IACrF,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9F,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IACnE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC,CAAC;AAcF,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChD,YAAY,IAAI,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IACrC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IACxD,eAAe,IAAI,SAAS,cAAc,EAAE,CAAC;IAC7C,aAAa,IAAI,IAAI,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IACxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAC5D,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;IACxE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,IAAI,IAAI,CAAC;IAClB,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACzC,cAAc,IAAI,IAAI,CAAC;CACxB,CAAC;AAQF,wBAAgB,WAAW,IAAI,KAAK,CAsEnC"}
@@ -0,0 +1,90 @@
1
+ const STANDING = {
2
+ unreadable: false,
3
+ refusal: null,
4
+ unheldModel: null,
5
+ stale: false,
6
+ repairable: null,
7
+ repairing: false,
8
+ reloadDue: false,
9
+ confirmed: false,
10
+ unpreparable: false,
11
+ };
12
+ // A Room the Provider answers not ready is asked again after these waits, the last repeating, so a chunk build that catches up within seconds installs at once and a long one is asked every 15 seconds.
13
+ const NOT_READY_MS = [1_000, 2_000, 3_000, 5_000, 8_000, 11_000, 15_000];
14
+ // A Room that locks offline stays readable this long after the connection drops, so a laptop waking or changing network keeps working while a disconnected device locks soon after.
15
+ const LOCK_GRACE_MS = 120_000;
16
+ export function createRooms() {
17
+ const declared = new Map();
18
+ const discovered = new Map();
19
+ const standings = new Map();
20
+ const unready = new Map();
21
+ let lockGrace = null;
22
+ function readied(locator) {
23
+ const held = unready.get(locator);
24
+ if (held === undefined)
25
+ return;
26
+ if (held.timer !== null)
27
+ clearTimeout(held.timer);
28
+ unready.delete(locator);
29
+ }
30
+ return {
31
+ declare(locator, room) {
32
+ declared.set(locator, room);
33
+ },
34
+ declared: (locator) => declared.get(locator),
35
+ declarations: () => declared,
36
+ discover(room) {
37
+ discovered.set(room.locator, room);
38
+ },
39
+ discovered: (locator) => discovered.get(locator),
40
+ discoveredRooms: () => [...discovered.values()],
41
+ undiscoverAll() {
42
+ discovered.clear();
43
+ },
44
+ standing: (locator) => standings.get(locator) ?? STANDING,
45
+ stand(locator, change) {
46
+ standings.set(locator, { ...(standings.get(locator) ?? STANDING), ...change });
47
+ },
48
+ standingWhere: (held) => [...standings].filter(([, room]) => held(room)).map(([locator]) => locator),
49
+ standAll(change) {
50
+ for (const [locator, room] of standings)
51
+ standings.set(locator, { ...room, ...change });
52
+ },
53
+ forget(locator) {
54
+ declared.delete(locator);
55
+ discovered.delete(locator);
56
+ const { repairing, reloadDue } = standings.get(locator) ?? STANDING;
57
+ standings.set(locator, { ...STANDING, repairing, reloadDue });
58
+ },
59
+ askAgain(locator, ask) {
60
+ const held = unready.get(locator) ?? { tries: 0, timer: null };
61
+ unready.set(locator, held);
62
+ if (held.timer !== null)
63
+ return;
64
+ const wait = NOT_READY_MS[Math.min(held.tries, NOT_READY_MS.length - 1)];
65
+ held.tries += 1;
66
+ held.timer = setTimeout(() => {
67
+ held.timer = null;
68
+ ask();
69
+ }, wait);
70
+ },
71
+ readied,
72
+ unreadied() {
73
+ for (const locator of [...unready.keys()])
74
+ readied(locator);
75
+ },
76
+ connectionLost(lapsed) {
77
+ if (lockGrace !== null)
78
+ return;
79
+ lockGrace = setTimeout(() => {
80
+ lockGrace = null;
81
+ lapsed();
82
+ }, LOCK_GRACE_MS);
83
+ },
84
+ connectionLive() {
85
+ if (lockGrace !== null)
86
+ clearTimeout(lockGrace);
87
+ lockGrace = null;
88
+ },
89
+ };
90
+ }
@@ -0,0 +1,39 @@
1
+ import type { Authorization, ProviderRefusal, ServiceMode } from '../adapter.js';
2
+ import { type Cell } from '../cell.js';
3
+ import type { Open } from '../open.js';
4
+ import type { CycleProgress, SyncStatus } from '../status.js';
5
+ export type RefusalReason = 'missing-required-guarantee' | 'revoked-authorization';
6
+ export type ConnectionRefusalCode = Open<RefusalReason>;
7
+ export type ConnectionRefusal = {
8
+ code: ConnectionRefusalCode;
9
+ retryable: boolean;
10
+ reauthorizationOffered: boolean;
11
+ refusal: ProviderRefusal | null;
12
+ };
13
+ export type Moving = {
14
+ readonly state: SyncStatus['state'];
15
+ readonly providerUnreachable: boolean;
16
+ readonly resting: boolean;
17
+ };
18
+ export type Session = {
19
+ readonly closed: boolean;
20
+ readonly stopping: boolean;
21
+ readonly paused: boolean;
22
+ readonly authorization: Authorization | undefined;
23
+ readonly refusal: ConnectionRefusal | null;
24
+ readonly discoveries: number;
25
+ readonly roomsNamed: boolean;
26
+ readonly roomsListed: boolean;
27
+ readonly serviceMode: ServiceMode;
28
+ readonly haltedRefusal: boolean;
29
+ readonly openSignals: number;
30
+ readonly authorityChanges: number;
31
+ readonly currencyQueued: number | null;
32
+ readonly moving: Moving;
33
+ readonly complete: boolean;
34
+ readonly recorded: boolean;
35
+ readonly underway: CycleProgress | null;
36
+ readonly streamed: CycleProgress | null;
37
+ };
38
+ export declare function createSession(authorization: Authorization | undefined): Cell<Session>;
39
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/socket/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,4BAA4B,GAAG,uBAAuB,CAAC;AAEnF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,sBAAsB,EAAE,OAAO,CAAC;IAChC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,aAAa,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAqBrF"}
@@ -0,0 +1,23 @@
1
+ import { createCell } from '../cell.js';
2
+ export function createSession(authorization) {
3
+ return createCell({
4
+ closed: false,
5
+ stopping: false,
6
+ paused: false,
7
+ authorization,
8
+ refusal: null,
9
+ discoveries: 0,
10
+ roomsNamed: false,
11
+ roomsListed: false,
12
+ serviceMode: 'open',
13
+ haltedRefusal: false,
14
+ openSignals: 0,
15
+ authorityChanges: 0,
16
+ currencyQueued: null,
17
+ moving: { state: 'syncing', providerUnreachable: false, resting: false },
18
+ complete: false,
19
+ recorded: false,
20
+ underway: null,
21
+ streamed: null,
22
+ });
23
+ }
@@ -0,0 +1,70 @@
1
+ import type { Adapter, Authorization, ConversationEvent, Discovery, HeldRoom, RoomStreamEvent, ServiceMode } from './adapter.js';
2
+ import type { Reads } from './bootstrap.js';
3
+ import type { Cell } from './cell.js';
4
+ import type { Log } from './log.js';
5
+ import { type Admission } from './socket/admission.js';
6
+ import { type Answers } from './socket/answers.js';
7
+ import { type Lanes } from './socket/lanes.js';
8
+ import { type Rooms } from './socket/rooms.js';
9
+ import { type Session } from './socket/session.js';
10
+ export type { Live } from './socket/lanes.js';
11
+ export type { Declared, RoomDeclaration } from './socket/rooms.js';
12
+ export type { ConnectionRefusal, ConnectionRefusalCode, Moving, RefusalReason, } from './socket/session.js';
13
+ type SocketEvent = {
14
+ readonly kind: 'opened';
15
+ } | {
16
+ readonly kind: 'discovered';
17
+ readonly discovery: Discovery;
18
+ readonly missed: boolean;
19
+ } | {
20
+ readonly kind: 'closed';
21
+ readonly revoked: boolean;
22
+ readonly lost: boolean;
23
+ readonly opened: boolean;
24
+ } | Exclude<RoomStreamEvent, {
25
+ kind: 'opened' | 'discovered' | 'closed';
26
+ }>;
27
+ export type RuntimeSocket = Admission & Answers & {
28
+ readonly reads: Reads;
29
+ readonly streamed: boolean;
30
+ readonly session: Cell<Session>;
31
+ readonly rooms: Rooms;
32
+ readonly lanes: Lanes;
33
+ readonly ready: Promise<void>;
34
+ readonly firstDiscovery: Promise<void>;
35
+ conversations(): Adapter['conversations'];
36
+ search(): Adapter['search'];
37
+ discover(authorized: Authorization): ReturnType<NonNullable<Adapter['discover']>> | undefined;
38
+ follows: Adapter['follows'];
39
+ mutate: Adapter['mutate'];
40
+ binary: Adapter['binary'];
41
+ link: Adapter['link'];
42
+ attach: Adapter['attach'];
43
+ history: Adapter['history'];
44
+ action: Adapter['action'];
45
+ authorize(): Promise<void>;
46
+ observe(listen: (event: SocketEvent) => void): void;
47
+ observeConversations(listen: (event: ConversationEvent) => void): void;
48
+ observeServiceMode(listen: (mode: ServiceMode) => void): void;
49
+ close(): void;
50
+ readyFromStore(): void;
51
+ notifyReady(): void;
52
+ closed(): boolean;
53
+ stopping(): boolean;
54
+ continuing(): boolean;
55
+ reached(): boolean;
56
+ writesHeld(): boolean;
57
+ haltedSince(opens: number): boolean;
58
+ isOpen(): boolean;
59
+ isAnnounced(): boolean;
60
+ isHanded(): boolean;
61
+ generation(): number;
62
+ naming(): boolean;
63
+ hand(rooms: readonly HeldRoom[]): void;
64
+ name(room: HeldRoom): void;
65
+ named(): void;
66
+ abortReads(): void;
67
+ stopReads(): void;
68
+ };
69
+ export declare function createSocket(adapter: Adapter, journal: Log, authorization: Authorization | undefined): RuntimeSocket;
70
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
package/dist/socket.js ADDED
@@ -0,0 +1,175 @@
1
+ import { createAdmission } from './socket/admission.js';
2
+ import { createAnswers } from './socket/answers.js';
3
+ import { createLanes } from './socket/lanes.js';
4
+ import { createReads } from './socket/reads.js';
5
+ import { createRooms } from './socket/rooms.js';
6
+ import { createSession } from './socket/session.js';
7
+ export function createSocket(adapter, journal, authorization) {
8
+ const held = createReads(adapter);
9
+ const admission = createAdmission();
10
+ const answers = createAnswers();
11
+ const session = createSession(authorization);
12
+ const rooms = createRooms();
13
+ let readyFromStore = () => { };
14
+ const ready = new Promise((resolve) => {
15
+ readyFromStore = resolve;
16
+ });
17
+ let notifyDiscovered = () => { };
18
+ const firstDiscovery = new Promise((resolve) => {
19
+ notifyDiscovered = resolve;
20
+ });
21
+ let withdrawStream;
22
+ let withdrawConversations;
23
+ let withdrawServiceMode;
24
+ let socketOpen = false;
25
+ let announced = false;
26
+ let missedChange = false;
27
+ let handed = false;
28
+ let naming = 0;
29
+ let generation = 0;
30
+ function closed() {
31
+ return session.now().closed;
32
+ }
33
+ function continuing() {
34
+ const { closed, paused } = session.now();
35
+ return !closed && !paused;
36
+ }
37
+ function received(event, listen) {
38
+ if (event.kind === 'opened') {
39
+ socketOpen = true;
40
+ announced = false;
41
+ handed = false;
42
+ naming = 0;
43
+ generation += 1;
44
+ listen(event);
45
+ }
46
+ else if (event.kind === 'discovered') {
47
+ if (!socketOpen)
48
+ return;
49
+ announced = true;
50
+ const missed = missedChange;
51
+ missedChange = false;
52
+ listen({ ...event, missed });
53
+ }
54
+ else if (event.kind === 'closed') {
55
+ const opened = announced;
56
+ socketOpen = false;
57
+ announced = false;
58
+ missedChange ||= event.authorityChanged;
59
+ handed = false;
60
+ naming = 0;
61
+ listen({ kind: 'closed', revoked: event.revoked, lost: event.lost, opened });
62
+ }
63
+ else
64
+ listen(event);
65
+ }
66
+ return {
67
+ ...admission,
68
+ ...answers,
69
+ reads: held.reads,
70
+ streamed: adapter.roomStream !== undefined,
71
+ session,
72
+ rooms,
73
+ lanes: createLanes({
74
+ generation: () => generation,
75
+ continuing,
76
+ stopping: () => session.now().stopping,
77
+ }),
78
+ ready,
79
+ firstDiscovery,
80
+ conversations: () => adapter.conversations,
81
+ search: () => adapter.search,
82
+ discover: (authorized) => adapter.discover?.(authorized),
83
+ follows: (locator, roomVersion, next) => adapter.follows(locator, roomVersion, next),
84
+ mutate: (authorized, request, keepUpload) => adapter.mutate(authorized, request, keepUpload),
85
+ binary: (authorized, request) => adapter.binary(authorized, request),
86
+ link: (authorized, request) => adapter.link(authorized, request),
87
+ attach: (authorized, request) => adapter.attach(authorized, request),
88
+ history: (authorized, request) => adapter.history(authorized, request),
89
+ action: (authorized, request) => adapter.action(authorized, request),
90
+ async authorize() {
91
+ if (session.now().authorization !== undefined)
92
+ return;
93
+ try {
94
+ session.set({ authorization: await adapter.authorize() });
95
+ journal.record('connection authorize');
96
+ }
97
+ catch (error) {
98
+ journal.record('connection authorize transport-uncertainty');
99
+ throw error;
100
+ }
101
+ },
102
+ observe(listen) {
103
+ const stream = adapter.roomStream;
104
+ if (stream === undefined || withdrawStream !== undefined)
105
+ return;
106
+ withdrawStream = stream.observe((event) => {
107
+ const { closed, stopping } = session.now();
108
+ if (!closed && !stopping)
109
+ received(event, listen);
110
+ });
111
+ },
112
+ observeConversations(listen) {
113
+ const stream = adapter.conversations;
114
+ if (stream === undefined || withdrawConversations !== undefined)
115
+ return;
116
+ withdrawConversations = stream.observe(listen);
117
+ },
118
+ observeServiceMode(listen) {
119
+ withdrawServiceMode = adapter.serviceMode?.observe(listen);
120
+ },
121
+ close() {
122
+ session.set({ closed: true });
123
+ notifyDiscovered();
124
+ rooms.unreadied();
125
+ rooms.connectionLive();
126
+ withdrawStream?.();
127
+ withdrawStream = undefined;
128
+ withdrawConversations?.();
129
+ withdrawConversations = undefined;
130
+ withdrawServiceMode?.();
131
+ },
132
+ readyFromStore: () => readyFromStore(),
133
+ notifyReady() {
134
+ notifyDiscovered();
135
+ readyFromStore();
136
+ },
137
+ closed,
138
+ stopping: () => session.now().stopping,
139
+ continuing,
140
+ reached() {
141
+ const { moving, refusal } = session.now();
142
+ return (socketOpen || !moving.providerUnreachable) && refusal === null;
143
+ },
144
+ writesHeld() {
145
+ const { serviceMode, haltedRefusal } = session.now();
146
+ return serviceMode === 'write-halted' || haltedRefusal;
147
+ },
148
+ haltedSince(opens) {
149
+ const { serviceMode, openSignals } = session.now();
150
+ if (serviceMode === 'open' && openSignals !== opens)
151
+ return false;
152
+ session.set({ haltedRefusal: true });
153
+ return true;
154
+ },
155
+ isOpen: () => socketOpen,
156
+ isAnnounced: () => announced,
157
+ isHanded: () => handed,
158
+ generation: () => generation,
159
+ naming: () => naming !== 0,
160
+ hand(rooms) {
161
+ naming += 1;
162
+ adapter.roomStream?.hold(rooms);
163
+ handed = true;
164
+ },
165
+ name(room) {
166
+ naming += 1;
167
+ adapter.roomStream?.hold([room]);
168
+ },
169
+ named() {
170
+ naming = Math.max(0, naming - 1);
171
+ },
172
+ abortReads: held.abort,
173
+ stopReads: held.stop,
174
+ };
175
+ }
@@ -0,0 +1,61 @@
1
+ export type HouseSource = {
2
+ readonly kind: 'request';
3
+ readonly request: string;
4
+ readonly agentFunction: RequestAgentFunction | null;
5
+ readonly requester: {
6
+ readonly name: string;
7
+ readonly room: boolean;
8
+ };
9
+ readonly room: {
10
+ readonly ref: string;
11
+ readonly name: string;
12
+ };
13
+ readonly approved: string | null;
14
+ } | {
15
+ readonly kind: 'mail';
16
+ readonly request: string;
17
+ readonly room: string;
18
+ readonly report: boolean;
19
+ readonly agent: string;
20
+ readonly owner: string;
21
+ readonly approved: string | null;
22
+ readonly declined: string | null;
23
+ } | {
24
+ readonly kind: 'trigger';
25
+ readonly customer: boolean;
26
+ readonly trigger: string;
27
+ readonly room: {
28
+ readonly ref: string;
29
+ readonly name: string;
30
+ };
31
+ } | {
32
+ readonly kind: 'conversation';
33
+ readonly conversation: {
34
+ readonly id: string;
35
+ readonly name: string;
36
+ };
37
+ readonly agent: string;
38
+ } | {
39
+ readonly kind: 'declined';
40
+ readonly agent: string;
41
+ readonly owner: string;
42
+ };
43
+ export type ChatRequest = {
44
+ readonly request: string;
45
+ readonly room: string;
46
+ readonly message?: string;
47
+ };
48
+ export type ChatRoomRequest = {
49
+ readonly request: string;
50
+ readonly room: {
51
+ readonly ref: string;
52
+ readonly name: string;
53
+ };
54
+ };
55
+ type RequestAgentFunction = {
56
+ readonly name: string;
57
+ readonly version: number;
58
+ };
59
+ export declare function sourceOf(value: unknown, sender: string | null): HouseSource | null;
60
+ export {};
61
+ //# sourceMappingURL=source.d.ts.map