@earendil-works/chord 1.4.0 → 1.5.1

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 (1299) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +115 -90
  3. package/dist/context/index.d.ts +1 -1
  4. package/dist/context/index.d.ts.map +1 -1
  5. package/dist/context/index.js +1 -1
  6. package/dist/context/index.js.map +1 -1
  7. package/dist/contracts/accepts.d.ts +81 -0
  8. package/dist/contracts/accepts.d.ts.map +1 -0
  9. package/dist/contracts/accepts.js +123 -0
  10. package/dist/contracts/accepts.js.map +1 -0
  11. package/dist/contracts/contract.d.ts +121 -0
  12. package/dist/contracts/contract.d.ts.map +1 -0
  13. package/dist/contracts/contract.js +50 -0
  14. package/dist/contracts/contract.js.map +1 -0
  15. package/dist/contracts/declare.d.ts +107 -0
  16. package/dist/contracts/declare.d.ts.map +1 -0
  17. package/dist/contracts/declare.js +136 -0
  18. package/dist/contracts/declare.js.map +1 -0
  19. package/dist/contracts/evolve.d.ts +92 -0
  20. package/dist/contracts/evolve.d.ts.map +1 -0
  21. package/dist/contracts/evolve.js +179 -0
  22. package/dist/contracts/evolve.js.map +1 -0
  23. package/dist/contracts/fingerprint.d.ts +16 -0
  24. package/dist/contracts/fingerprint.d.ts.map +1 -0
  25. package/dist/contracts/fingerprint.js +50 -0
  26. package/dist/contracts/fingerprint.js.map +1 -0
  27. package/dist/contracts/history.d.ts +71 -0
  28. package/dist/contracts/history.d.ts.map +1 -0
  29. package/dist/contracts/history.js +3 -0
  30. package/dist/contracts/history.js.map +1 -0
  31. package/dist/contracts/host-kind.d.ts +40 -0
  32. package/dist/contracts/host-kind.d.ts.map +1 -0
  33. package/dist/contracts/host-kind.js +37 -0
  34. package/dist/contracts/host-kind.js.map +1 -0
  35. package/dist/contracts/index.d.ts +7 -0
  36. package/dist/contracts/index.d.ts.map +1 -0
  37. package/dist/contracts/index.js +6 -0
  38. package/dist/contracts/index.js.map +1 -0
  39. package/dist/contracts/internal.d.ts +10 -0
  40. package/dist/contracts/internal.d.ts.map +1 -0
  41. package/dist/contracts/internal.js +9 -0
  42. package/dist/contracts/internal.js.map +1 -0
  43. package/dist/contracts/names.d.ts +3 -0
  44. package/dist/contracts/names.d.ts.map +1 -0
  45. package/dist/contracts/names.js +13 -0
  46. package/dist/contracts/names.js.map +1 -0
  47. package/dist/contracts/params.d.ts +28 -0
  48. package/dist/contracts/params.d.ts.map +1 -0
  49. package/dist/contracts/params.js +50 -0
  50. package/dist/contracts/params.js.map +1 -0
  51. package/dist/contracts/schema.d.ts +102 -0
  52. package/dist/contracts/schema.d.ts.map +1 -0
  53. package/dist/contracts/schema.js +103 -0
  54. package/dist/contracts/schema.js.map +1 -0
  55. package/dist/contracts/snapshot.d.ts +16 -0
  56. package/dist/contracts/snapshot.d.ts.map +1 -0
  57. package/dist/contracts/snapshot.js +167 -0
  58. package/dist/contracts/snapshot.js.map +1 -0
  59. package/dist/data/args.d.ts +50 -0
  60. package/dist/data/args.d.ts.map +1 -0
  61. package/dist/data/args.js +83 -0
  62. package/dist/data/args.js.map +1 -0
  63. package/dist/data/errors.d.ts +80 -0
  64. package/dist/data/errors.d.ts.map +1 -0
  65. package/dist/data/errors.js +116 -0
  66. package/dist/data/errors.js.map +1 -0
  67. package/dist/data/failure.d.ts +26 -0
  68. package/dist/data/failure.d.ts.map +1 -0
  69. package/dist/data/failure.js +77 -0
  70. package/dist/data/failure.js.map +1 -0
  71. package/dist/data/index.d.ts +4 -0
  72. package/dist/data/index.d.ts.map +1 -0
  73. package/dist/data/index.js +5 -0
  74. package/dist/data/index.js.map +1 -0
  75. package/dist/data/internal.d.ts +7 -0
  76. package/dist/data/internal.d.ts.map +1 -0
  77. package/dist/data/internal.js +8 -0
  78. package/dist/data/internal.js.map +1 -0
  79. package/dist/data/params.d.ts +20 -0
  80. package/dist/data/params.d.ts.map +1 -0
  81. package/dist/data/params.js +31 -0
  82. package/dist/data/params.js.map +1 -0
  83. package/dist/data/principal.d.ts +22 -0
  84. package/dist/data/principal.d.ts.map +1 -0
  85. package/dist/data/principal.js +49 -0
  86. package/dist/data/principal.js.map +1 -0
  87. package/dist/data/validator.d.ts +12 -0
  88. package/dist/data/validator.d.ts.map +1 -0
  89. package/dist/data/validator.js +35 -0
  90. package/dist/data/validator.js.map +1 -0
  91. package/dist/delta/apply-immutable-trusted.js +3 -4
  92. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  93. package/dist/delta/diff.d.ts.map +1 -1
  94. package/dist/delta/diff.js +5 -3
  95. package/dist/delta/diff.js.map +1 -1
  96. package/dist/delta/index.d.ts +9 -1
  97. package/dist/delta/index.d.ts.map +1 -1
  98. package/dist/delta/index.js +15 -11
  99. package/dist/delta/index.js.map +1 -1
  100. package/dist/delta/pending.d.ts +36 -0
  101. package/dist/delta/pending.d.ts.map +1 -0
  102. package/dist/delta/pending.js +143 -0
  103. package/dist/delta/pending.js.map +1 -0
  104. package/dist/delta/tracker.d.ts +12 -0
  105. package/dist/delta/tracker.d.ts.map +1 -1
  106. package/dist/delta/tracker.js +109 -39
  107. package/dist/delta/tracker.js.map +1 -1
  108. package/dist/documents/address-source.d.ts +20 -0
  109. package/dist/documents/address-source.d.ts.map +1 -0
  110. package/dist/documents/address-source.js +44 -0
  111. package/dist/documents/address-source.js.map +1 -0
  112. package/dist/documents/definition.d.ts +84 -0
  113. package/dist/documents/definition.d.ts.map +1 -0
  114. package/dist/documents/definition.js +74 -0
  115. package/dist/documents/definition.js.map +1 -0
  116. package/dist/documents/documents.d.ts +126 -0
  117. package/dist/documents/documents.d.ts.map +1 -0
  118. package/dist/documents/documents.js +248 -0
  119. package/dist/documents/documents.js.map +1 -0
  120. package/dist/documents/fence.d.ts +9 -0
  121. package/dist/documents/fence.d.ts.map +1 -0
  122. package/dist/documents/fence.js +15 -0
  123. package/dist/documents/fence.js.map +1 -0
  124. package/dist/documents/handles.d.ts +76 -0
  125. package/dist/documents/handles.d.ts.map +1 -0
  126. package/dist/documents/handles.js +66 -0
  127. package/dist/documents/handles.js.map +1 -0
  128. package/dist/documents/index.d.ts +4 -0
  129. package/dist/documents/index.d.ts.map +1 -0
  130. package/dist/documents/index.js +3 -0
  131. package/dist/documents/index.js.map +1 -0
  132. package/dist/documents/internal.d.ts +9 -0
  133. package/dist/documents/internal.d.ts.map +1 -0
  134. package/dist/documents/internal.js +9 -0
  135. package/dist/documents/internal.js.map +1 -0
  136. package/dist/documents/keyed-slot.d.ts +103 -0
  137. package/dist/documents/keyed-slot.d.ts.map +1 -0
  138. package/dist/documents/keyed-slot.js +395 -0
  139. package/dist/documents/keyed-slot.js.map +1 -0
  140. package/dist/documents/line.d.ts +7 -0
  141. package/dist/documents/line.d.ts.map +1 -0
  142. package/dist/documents/line.js +14 -0
  143. package/dist/documents/line.js.map +1 -0
  144. package/dist/documents/persistence.d.ts +104 -0
  145. package/dist/documents/persistence.d.ts.map +1 -0
  146. package/dist/documents/persistence.js +129 -0
  147. package/dist/documents/persistence.js.map +1 -0
  148. package/dist/documents/residency.d.ts +31 -0
  149. package/dist/documents/residency.d.ts.map +1 -0
  150. package/dist/documents/residency.js +93 -0
  151. package/dist/documents/residency.js.map +1 -0
  152. package/dist/documents/slot.d.ts +109 -0
  153. package/dist/documents/slot.d.ts.map +1 -0
  154. package/dist/documents/slot.js +181 -0
  155. package/dist/documents/slot.js.map +1 -0
  156. package/dist/documents/transaction.d.ts +143 -0
  157. package/dist/documents/transaction.d.ts.map +1 -0
  158. package/dist/documents/transaction.js +442 -0
  159. package/dist/documents/transaction.js.map +1 -0
  160. package/dist/host/activity.d.ts +31 -0
  161. package/dist/host/activity.d.ts.map +1 -0
  162. package/dist/host/activity.js +40 -0
  163. package/dist/host/activity.js.map +1 -0
  164. package/dist/host/adapted.d.ts +49 -0
  165. package/dist/host/adapted.d.ts.map +1 -0
  166. package/dist/host/adapted.js +214 -0
  167. package/dist/host/adapted.js.map +1 -0
  168. package/dist/host/attempt.d.ts +308 -0
  169. package/dist/host/attempt.d.ts.map +1 -0
  170. package/dist/host/attempt.js +1199 -0
  171. package/dist/host/attempt.js.map +1 -0
  172. package/dist/host/backoff.d.ts +29 -0
  173. package/dist/host/backoff.d.ts.map +1 -0
  174. package/dist/host/backoff.js +69 -0
  175. package/dist/host/backoff.js.map +1 -0
  176. package/dist/host/ctx.d.ts +94 -0
  177. package/dist/host/ctx.d.ts.map +1 -0
  178. package/dist/host/ctx.js +200 -0
  179. package/dist/host/ctx.js.map +1 -0
  180. package/dist/host/deadline.d.ts +12 -0
  181. package/dist/host/deadline.d.ts.map +1 -0
  182. package/dist/host/deadline.js +40 -0
  183. package/dist/host/deadline.js.map +1 -0
  184. package/dist/host/dependencies.d.ts +65 -0
  185. package/dist/host/dependencies.d.ts.map +1 -0
  186. package/dist/host/dependencies.js +115 -0
  187. package/dist/host/dependencies.js.map +1 -0
  188. package/dist/host/destination.d.ts +48 -0
  189. package/dist/host/destination.d.ts.map +1 -0
  190. package/dist/host/destination.js +101 -0
  191. package/dist/host/destination.js.map +1 -0
  192. package/dist/host/facet.d.ts +84 -0
  193. package/dist/host/facet.d.ts.map +1 -0
  194. package/dist/host/facet.js +55 -0
  195. package/dist/host/facet.js.map +1 -0
  196. package/dist/host/follow.d.ts +52 -0
  197. package/dist/host/follow.d.ts.map +1 -0
  198. package/dist/host/follow.js +207 -0
  199. package/dist/host/follow.js.map +1 -0
  200. package/dist/host/host.d.ts +571 -0
  201. package/dist/host/host.d.ts.map +1 -0
  202. package/dist/host/host.js +1318 -0
  203. package/dist/host/host.js.map +1 -0
  204. package/dist/host/index.d.ts +17 -0
  205. package/dist/host/index.d.ts.map +1 -0
  206. package/dist/host/index.js +6 -0
  207. package/dist/host/index.js.map +1 -0
  208. package/dist/host/internal.d.ts +11 -0
  209. package/dist/host/internal.d.ts.map +1 -0
  210. package/dist/host/internal.js +9 -0
  211. package/dist/host/internal.js.map +1 -0
  212. package/dist/host/members.d.ts +50 -0
  213. package/dist/host/members.d.ts.map +1 -0
  214. package/dist/host/members.js +107 -0
  215. package/dist/host/members.js.map +1 -0
  216. package/dist/host/native.d.ts +64 -0
  217. package/dist/host/native.d.ts.map +1 -0
  218. package/dist/host/native.js +126 -0
  219. package/dist/host/native.js.map +1 -0
  220. package/dist/host/object.d.ts +331 -0
  221. package/dist/host/object.d.ts.map +1 -0
  222. package/dist/host/object.js +1296 -0
  223. package/dist/host/object.js.map +1 -0
  224. package/dist/host/old-work.d.ts +34 -0
  225. package/dist/host/old-work.d.ts.map +1 -0
  226. package/dist/host/old-work.js +52 -0
  227. package/dist/host/old-work.js.map +1 -0
  228. package/dist/host/parked.d.ts +23 -0
  229. package/dist/host/parked.d.ts.map +1 -0
  230. package/dist/host/parked.js +79 -0
  231. package/dist/host/parked.js.map +1 -0
  232. package/dist/host/presence.d.ts +34 -0
  233. package/dist/host/presence.d.ts.map +1 -0
  234. package/dist/host/presence.js +117 -0
  235. package/dist/host/presence.js.map +1 -0
  236. package/dist/host/readiness.d.ts +27 -0
  237. package/dist/host/readiness.d.ts.map +1 -0
  238. package/dist/host/readiness.js +134 -0
  239. package/dist/host/readiness.js.map +1 -0
  240. package/dist/host/ref-state.d.ts +53 -0
  241. package/dist/host/ref-state.d.ts.map +1 -0
  242. package/dist/host/ref-state.js +83 -0
  243. package/dist/host/ref-state.js.map +1 -0
  244. package/dist/host/reference-keys.d.ts +36 -0
  245. package/dist/host/reference-keys.d.ts.map +1 -0
  246. package/dist/host/reference-keys.js +168 -0
  247. package/dist/host/reference-keys.js.map +1 -0
  248. package/dist/host/reference-source.d.ts +65 -0
  249. package/dist/host/reference-source.d.ts.map +1 -0
  250. package/dist/host/reference-source.js +285 -0
  251. package/dist/host/reference-source.js.map +1 -0
  252. package/dist/host/reference.d.ts +321 -0
  253. package/dist/host/reference.d.ts.map +1 -0
  254. package/dist/host/reference.js +797 -0
  255. package/dist/host/reference.js.map +1 -0
  256. package/dist/host/reload-cycle.d.ts +16 -0
  257. package/dist/host/reload-cycle.d.ts.map +1 -0
  258. package/dist/host/reload-cycle.js +81 -0
  259. package/dist/host/reload-cycle.js.map +1 -0
  260. package/dist/host/retry-on.d.ts +28 -0
  261. package/dist/host/retry-on.d.ts.map +1 -0
  262. package/dist/host/retry-on.js +52 -0
  263. package/dist/host/retry-on.js.map +1 -0
  264. package/dist/host/revocation.d.ts +16 -0
  265. package/dist/host/revocation.d.ts.map +1 -0
  266. package/dist/host/revocation.js +27 -0
  267. package/dist/host/revocation.js.map +1 -0
  268. package/dist/host/root.d.ts +37 -0
  269. package/dist/host/root.d.ts.map +1 -0
  270. package/dist/host/root.js +68 -0
  271. package/dist/host/root.js.map +1 -0
  272. package/dist/host/route.d.ts +64 -0
  273. package/dist/host/route.d.ts.map +1 -0
  274. package/dist/host/route.js +227 -0
  275. package/dist/host/route.js.map +1 -0
  276. package/dist/host/routines.d.ts +78 -0
  277. package/dist/host/routines.d.ts.map +1 -0
  278. package/dist/host/routines.js +398 -0
  279. package/dist/host/routines.js.map +1 -0
  280. package/dist/host/sleep.d.ts +9 -0
  281. package/dist/host/sleep.d.ts.map +1 -0
  282. package/dist/host/sleep.js +40 -0
  283. package/dist/host/sleep.js.map +1 -0
  284. package/dist/host/staging.d.ts +94 -0
  285. package/dist/host/staging.d.ts.map +1 -0
  286. package/dist/host/staging.js +304 -0
  287. package/dist/host/staging.js.map +1 -0
  288. package/dist/host/unbound-clock.d.ts +23 -0
  289. package/dist/host/unbound-clock.d.ts.map +1 -0
  290. package/dist/host/unbound-clock.js +58 -0
  291. package/dist/host/unbound-clock.js.map +1 -0
  292. package/dist/host/unbound.d.ts +37 -0
  293. package/dist/host/unbound.d.ts.map +1 -0
  294. package/dist/host/unbound.js +88 -0
  295. package/dist/host/unbound.js.map +1 -0
  296. package/dist/host/uuid.d.ts +3 -0
  297. package/dist/host/uuid.d.ts.map +1 -0
  298. package/dist/host/uuid.js +38 -0
  299. package/dist/host/uuid.js.map +1 -0
  300. package/dist/index.d.ts +29 -18
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +20 -9
  303. package/dist/index.js.map +1 -1
  304. package/dist/jobs/definition.d.ts +96 -0
  305. package/dist/jobs/definition.d.ts.map +1 -0
  306. package/dist/jobs/definition.js +83 -0
  307. package/dist/jobs/definition.js.map +1 -0
  308. package/dist/jobs/index.d.ts +5 -0
  309. package/dist/jobs/index.d.ts.map +1 -0
  310. package/dist/jobs/index.js +3 -0
  311. package/dist/jobs/index.js.map +1 -0
  312. package/dist/jobs/internal.d.ts +3 -0
  313. package/dist/jobs/internal.d.ts.map +1 -0
  314. package/dist/jobs/internal.js +4 -0
  315. package/dist/jobs/internal.js.map +1 -0
  316. package/dist/jobs/job.d.ts +149 -0
  317. package/dist/jobs/job.d.ts.map +1 -0
  318. package/dist/jobs/job.js +387 -0
  319. package/dist/jobs/job.js.map +1 -0
  320. package/dist/jobs/persisted.d.ts +38 -0
  321. package/dist/jobs/persisted.d.ts.map +1 -0
  322. package/dist/jobs/persisted.js +95 -0
  323. package/dist/jobs/persisted.js.map +1 -0
  324. package/dist/jobs/records.d.ts +231 -0
  325. package/dist/jobs/records.d.ts.map +1 -0
  326. package/dist/jobs/records.js +871 -0
  327. package/dist/jobs/records.js.map +1 -0
  328. package/dist/jobs/run-states.d.ts +69 -0
  329. package/dist/jobs/run-states.d.ts.map +1 -0
  330. package/dist/jobs/run-states.js +228 -0
  331. package/dist/jobs/run-states.js.map +1 -0
  332. package/dist/jobs/run.d.ts +117 -0
  333. package/dist/jobs/run.d.ts.map +1 -0
  334. package/dist/jobs/run.js +204 -0
  335. package/dist/jobs/run.js.map +1 -0
  336. package/dist/jobs/running.d.ts +44 -0
  337. package/dist/jobs/running.d.ts.map +1 -0
  338. package/dist/jobs/running.js +117 -0
  339. package/dist/jobs/running.js.map +1 -0
  340. package/dist/jobs/stored.d.ts +63 -0
  341. package/dist/jobs/stored.d.ts.map +1 -0
  342. package/dist/jobs/stored.js +55 -0
  343. package/dist/jobs/stored.js.map +1 -0
  344. package/dist/link/binary.d.ts +4 -0
  345. package/dist/link/binary.d.ts.map +1 -0
  346. package/dist/link/binary.js +544 -0
  347. package/dist/link/binary.js.map +1 -0
  348. package/dist/link/channel.d.ts +68 -0
  349. package/dist/link/channel.d.ts.map +1 -0
  350. package/dist/link/channel.js +215 -0
  351. package/dist/link/channel.js.map +1 -0
  352. package/dist/link/errors.d.ts +7 -0
  353. package/dist/link/errors.d.ts.map +1 -0
  354. package/dist/link/errors.js +21 -0
  355. package/dist/link/errors.js.map +1 -0
  356. package/dist/link/index.d.ts +8 -0
  357. package/dist/link/index.d.ts.map +1 -0
  358. package/dist/link/index.js +8 -0
  359. package/dist/link/index.js.map +1 -0
  360. package/dist/link/internal.d.ts +9 -0
  361. package/dist/link/internal.d.ts.map +1 -0
  362. package/dist/link/internal.js +10 -0
  363. package/dist/link/internal.js.map +1 -0
  364. package/dist/link/ipc.d.ts +22 -0
  365. package/dist/link/ipc.d.ts.map +1 -0
  366. package/dist/link/ipc.js +64 -0
  367. package/dist/link/ipc.js.map +1 -0
  368. package/dist/link/link.d.ts +34 -0
  369. package/dist/link/link.d.ts.map +1 -0
  370. package/dist/link/link.js +87 -0
  371. package/dist/link/link.js.map +1 -0
  372. package/dist/link/message.d.ts +262 -0
  373. package/dist/link/message.d.ts.map +1 -0
  374. package/dist/link/message.js +156 -0
  375. package/dist/link/message.js.map +1 -0
  376. package/dist/link/part.d.ts +80 -0
  377. package/dist/link/part.d.ts.map +1 -0
  378. package/dist/link/part.js +165 -0
  379. package/dist/link/part.js.map +1 -0
  380. package/dist/link/text.d.ts +6 -0
  381. package/dist/link/text.d.ts.map +1 -0
  382. package/dist/link/text.js +355 -0
  383. package/dist/link/text.js.map +1 -0
  384. package/dist/link/values.d.ts +40 -0
  385. package/dist/link/values.d.ts.map +1 -0
  386. package/dist/link/values.js +121 -0
  387. package/dist/link/values.js.map +1 -0
  388. package/dist/link/websocket.d.ts +26 -0
  389. package/dist/link/websocket.d.ts.map +1 -0
  390. package/dist/link/websocket.js +91 -0
  391. package/dist/link/websocket.js.map +1 -0
  392. package/dist/node/app/app.d.ts +269 -0
  393. package/dist/node/app/app.d.ts.map +1 -0
  394. package/dist/node/app/app.js +513 -0
  395. package/dist/node/app/app.js.map +1 -0
  396. package/dist/node/app/archive.d.ts +37 -0
  397. package/dist/node/app/archive.d.ts.map +1 -0
  398. package/dist/node/app/archive.js +204 -0
  399. package/dist/node/app/archive.js.map +1 -0
  400. package/dist/node/app/blobs.d.ts +23 -0
  401. package/dist/node/app/blobs.d.ts.map +1 -0
  402. package/dist/node/app/blobs.js +64 -0
  403. package/dist/node/app/blobs.js.map +1 -0
  404. package/dist/node/app/data.d.ts +35 -0
  405. package/dist/node/app/data.d.ts.map +1 -0
  406. package/dist/node/app/data.js +44 -0
  407. package/dist/node/app/data.js.map +1 -0
  408. package/dist/node/app/ephemeral-sessions.d.ts +20 -0
  409. package/dist/node/app/ephemeral-sessions.d.ts.map +1 -0
  410. package/dist/node/app/ephemeral-sessions.js +69 -0
  411. package/dist/node/app/ephemeral-sessions.js.map +1 -0
  412. package/dist/node/app/ephemeral.d.ts +11 -0
  413. package/dist/node/app/ephemeral.d.ts.map +1 -0
  414. package/dist/node/app/ephemeral.js +34 -0
  415. package/dist/node/app/ephemeral.js.map +1 -0
  416. package/dist/node/app/files-copy.d.ts +13 -0
  417. package/dist/node/app/files-copy.d.ts.map +1 -0
  418. package/dist/node/app/files-copy.js +86 -0
  419. package/dist/node/app/files-copy.js.map +1 -0
  420. package/dist/node/app/files-entry.d.ts +4 -0
  421. package/dist/node/app/files-entry.d.ts.map +1 -0
  422. package/dist/node/app/files-entry.js +7 -0
  423. package/dist/node/app/files-entry.js.map +1 -0
  424. package/dist/node/app/files-index.d.ts +180 -0
  425. package/dist/node/app/files-index.d.ts.map +1 -0
  426. package/dist/node/app/files-index.js +535 -0
  427. package/dist/node/app/files-index.js.map +1 -0
  428. package/dist/node/app/files.d.ts +363 -0
  429. package/dist/node/app/files.d.ts.map +1 -0
  430. package/dist/node/app/files.js +368 -0
  431. package/dist/node/app/files.js.map +1 -0
  432. package/dist/node/app/folder-views.d.ts +21 -0
  433. package/dist/node/app/folder-views.d.ts.map +1 -0
  434. package/dist/node/app/folder-views.js +55 -0
  435. package/dist/node/app/folder-views.js.map +1 -0
  436. package/dist/node/app/index.d.ts +12 -0
  437. package/dist/node/app/index.d.ts.map +1 -0
  438. package/dist/node/app/index.js +15 -0
  439. package/dist/node/app/index.js.map +1 -0
  440. package/dist/node/app/info.d.ts +66 -0
  441. package/dist/node/app/info.d.ts.map +1 -0
  442. package/dist/node/app/info.js +37 -0
  443. package/dist/node/app/info.js.map +1 -0
  444. package/dist/node/app/invite.d.ts +5 -0
  445. package/dist/node/app/invite.d.ts.map +1 -0
  446. package/dist/node/app/invite.js +64 -0
  447. package/dist/node/app/invite.js.map +1 -0
  448. package/dist/node/app/layout.d.ts +36 -0
  449. package/dist/node/app/layout.d.ts.map +1 -0
  450. package/dist/node/app/layout.js +87 -0
  451. package/dist/node/app/layout.js.map +1 -0
  452. package/dist/node/app/owner.d.ts +31 -0
  453. package/dist/node/app/owner.d.ts.map +1 -0
  454. package/dist/node/app/owner.js +104 -0
  455. package/dist/node/app/owner.js.map +1 -0
  456. package/dist/node/app/pairing.d.ts +55 -0
  457. package/dist/node/app/pairing.d.ts.map +1 -0
  458. package/dist/node/app/pairing.js +183 -0
  459. package/dist/node/app/pairing.js.map +1 -0
  460. package/dist/node/app/secrets.d.ts +16 -0
  461. package/dist/node/app/secrets.d.ts.map +1 -0
  462. package/dist/node/app/secrets.js +72 -0
  463. package/dist/node/app/secrets.js.map +1 -0
  464. package/dist/node/app/sessions.d.ts +72 -0
  465. package/dist/node/app/sessions.d.ts.map +1 -0
  466. package/dist/node/app/sessions.js +222 -0
  467. package/dist/node/app/sessions.js.map +1 -0
  468. package/dist/node/app/tar.d.ts +24 -0
  469. package/dist/node/app/tar.d.ts.map +1 -0
  470. package/dist/node/app/tar.js +167 -0
  471. package/dist/node/app/tar.js.map +1 -0
  472. package/dist/node/app/uploads.d.ts +37 -0
  473. package/dist/node/app/uploads.d.ts.map +1 -0
  474. package/dist/node/app/uploads.js +157 -0
  475. package/dist/node/app/uploads.js.map +1 -0
  476. package/dist/node/app/users.d.ts +37 -0
  477. package/dist/node/app/users.d.ts.map +1 -0
  478. package/dist/node/app/users.js +62 -0
  479. package/dist/node/app/users.js.map +1 -0
  480. package/dist/node/app/worker.d.ts +18 -0
  481. package/dist/node/app/worker.d.ts.map +1 -0
  482. package/dist/node/app/worker.js +84 -0
  483. package/dist/node/app/worker.js.map +1 -0
  484. package/dist/node/compression.d.ts +7 -0
  485. package/dist/node/compression.d.ts.map +1 -0
  486. package/dist/node/compression.js +25 -0
  487. package/dist/node/compression.js.map +1 -0
  488. package/dist/node/http/admission.d.ts +63 -0
  489. package/dist/node/http/admission.d.ts.map +1 -0
  490. package/dist/node/http/admission.js +134 -0
  491. package/dist/node/http/admission.js.map +1 -0
  492. package/dist/node/http/authenticate.d.ts +21 -0
  493. package/dist/node/http/authenticate.d.ts.map +1 -0
  494. package/dist/node/http/authenticate.js +34 -0
  495. package/dist/node/http/authenticate.js.map +1 -0
  496. package/dist/node/http/cookies.d.ts +32 -0
  497. package/dist/node/http/cookies.d.ts.map +1 -0
  498. package/dist/node/http/cookies.js +70 -0
  499. package/dist/node/http/cookies.js.map +1 -0
  500. package/dist/node/http/file.d.ts +23 -0
  501. package/dist/node/http/file.d.ts.map +1 -0
  502. package/dist/node/http/file.js +94 -0
  503. package/dist/node/http/file.js.map +1 -0
  504. package/dist/node/http/headers.d.ts +37 -0
  505. package/dist/node/http/headers.d.ts.map +1 -0
  506. package/dist/node/http/headers.js +136 -0
  507. package/dist/node/http/headers.js.map +1 -0
  508. package/dist/node/http/http.d.ts +111 -0
  509. package/dist/node/http/http.d.ts.map +1 -0
  510. package/dist/node/http/http.js +524 -0
  511. package/dist/node/http/http.js.map +1 -0
  512. package/dist/node/http/incoming.d.ts +19 -0
  513. package/dist/node/http/incoming.d.ts.map +1 -0
  514. package/dist/node/http/incoming.js +31 -0
  515. package/dist/node/http/incoming.js.map +1 -0
  516. package/dist/node/http/index.d.ts +11 -0
  517. package/dist/node/http/index.d.ts.map +1 -0
  518. package/dist/node/http/index.js +12 -0
  519. package/dist/node/http/index.js.map +1 -0
  520. package/dist/node/http/node.d.ts +78 -0
  521. package/dist/node/http/node.d.ts.map +1 -0
  522. package/dist/node/http/node.js +291 -0
  523. package/dist/node/http/node.js.map +1 -0
  524. package/dist/node/http/request.d.ts +60 -0
  525. package/dist/node/http/request.d.ts.map +1 -0
  526. package/dist/node/http/request.js +118 -0
  527. package/dist/node/http/request.js.map +1 -0
  528. package/dist/node/http/response.d.ts +63 -0
  529. package/dist/node/http/response.d.ts.map +1 -0
  530. package/dist/node/http/response.js +202 -0
  531. package/dist/node/http/response.js.map +1 -0
  532. package/dist/node/http/router.d.ts +132 -0
  533. package/dist/node/http/router.d.ts.map +1 -0
  534. package/dist/node/http/router.js +267 -0
  535. package/dist/node/http/router.js.map +1 -0
  536. package/dist/node/http/upgrades.d.ts +61 -0
  537. package/dist/node/http/upgrades.d.ts.map +1 -0
  538. package/dist/node/http/upgrades.js +192 -0
  539. package/dist/node/http/upgrades.js.map +1 -0
  540. package/dist/node/plugins/base-inputs.d.ts +14 -0
  541. package/dist/node/plugins/base-inputs.d.ts.map +1 -0
  542. package/dist/node/plugins/base-inputs.js +33 -0
  543. package/dist/node/plugins/base-inputs.js.map +1 -0
  544. package/dist/node/plugins/build.d.ts +77 -0
  545. package/dist/node/plugins/build.d.ts.map +1 -0
  546. package/dist/node/plugins/build.js +576 -0
  547. package/dist/node/plugins/build.js.map +1 -0
  548. package/dist/node/plugins/css-modules.d.ts +13 -0
  549. package/dist/node/plugins/css-modules.d.ts.map +1 -0
  550. package/dist/node/plugins/css-modules.js +58 -0
  551. package/dist/node/plugins/css-modules.js.map +1 -0
  552. package/dist/node/plugins/discover.d.ts +67 -0
  553. package/dist/node/plugins/discover.d.ts.map +1 -0
  554. package/dist/node/plugins/discover.js +369 -0
  555. package/dist/node/plugins/discover.js.map +1 -0
  556. package/dist/node/plugins/evaluate.d.ts +33 -0
  557. package/dist/node/plugins/evaluate.d.ts.map +1 -0
  558. package/dist/node/plugins/evaluate.js +121 -0
  559. package/dist/node/plugins/evaluate.js.map +1 -0
  560. package/dist/node/plugins/index.d.ts +11 -0
  561. package/dist/node/plugins/index.d.ts.map +1 -0
  562. package/dist/node/plugins/index.js +13 -0
  563. package/dist/node/plugins/index.js.map +1 -0
  564. package/dist/node/plugins/install.d.ts +38 -0
  565. package/dist/node/plugins/install.d.ts.map +1 -0
  566. package/dist/node/plugins/install.js +213 -0
  567. package/dist/node/plugins/install.js.map +1 -0
  568. package/dist/node/plugins/plugins.d.ts +162 -0
  569. package/dist/node/plugins/plugins.d.ts.map +1 -0
  570. package/dist/node/plugins/plugins.js +244 -0
  571. package/dist/node/plugins/plugins.js.map +1 -0
  572. package/dist/node/plugins/runtime.d.ts +57 -0
  573. package/dist/node/plugins/runtime.d.ts.map +1 -0
  574. package/dist/node/plugins/runtime.js +92 -0
  575. package/dist/node/plugins/runtime.js.map +1 -0
  576. package/dist/node/plugins/stack.d.ts +16 -0
  577. package/dist/node/plugins/stack.d.ts.map +1 -0
  578. package/dist/node/plugins/stack.js +61 -0
  579. package/dist/node/plugins/stack.js.map +1 -0
  580. package/dist/node/plugins/testing.d.ts +58 -0
  581. package/dist/node/plugins/testing.d.ts.map +1 -0
  582. package/dist/node/plugins/testing.js +210 -0
  583. package/dist/node/plugins/testing.js.map +1 -0
  584. package/dist/node/plugins/watcher.d.ts +69 -0
  585. package/dist/node/plugins/watcher.d.ts.map +1 -0
  586. package/dist/node/plugins/watcher.js +622 -0
  587. package/dist/node/plugins/watcher.js.map +1 -0
  588. package/dist/node/surfaces/bundle.d.ts +31 -0
  589. package/dist/node/surfaces/bundle.d.ts.map +1 -0
  590. package/dist/node/surfaces/bundle.js +118 -0
  591. package/dist/node/surfaces/bundle.js.map +1 -0
  592. package/dist/node/surfaces/current.d.ts +17 -0
  593. package/dist/node/surfaces/current.d.ts.map +1 -0
  594. package/dist/node/surfaces/current.js +54 -0
  595. package/dist/node/surfaces/current.js.map +1 -0
  596. package/dist/node/surfaces/index.d.ts +6 -0
  597. package/dist/node/surfaces/index.d.ts.map +1 -0
  598. package/dist/node/surfaces/index.js +6 -0
  599. package/dist/node/surfaces/index.js.map +1 -0
  600. package/dist/node/surfaces/published.d.ts +27 -0
  601. package/dist/node/surfaces/published.d.ts.map +1 -0
  602. package/dist/node/surfaces/published.js +142 -0
  603. package/dist/node/surfaces/published.js.map +1 -0
  604. package/dist/node/surfaces/served.d.ts +15 -0
  605. package/dist/node/surfaces/served.d.ts.map +1 -0
  606. package/dist/node/surfaces/served.js +42 -0
  607. package/dist/node/surfaces/served.js.map +1 -0
  608. package/dist/node/surfaces/surface-build.d.ts +53 -0
  609. package/dist/node/surfaces/surface-build.d.ts.map +1 -0
  610. package/dist/node/surfaces/surface-build.js +105 -0
  611. package/dist/node/surfaces/surface-build.js.map +1 -0
  612. package/dist/node/surfaces/tui.d.ts +40 -0
  613. package/dist/node/surfaces/tui.d.ts.map +1 -0
  614. package/dist/node/surfaces/tui.js +55 -0
  615. package/dist/node/surfaces/tui.js.map +1 -0
  616. package/dist/node/surfaces/web.d.ts +56 -0
  617. package/dist/node/surfaces/web.d.ts.map +1 -0
  618. package/dist/node/surfaces/web.js +108 -0
  619. package/dist/node/surfaces/web.js.map +1 -0
  620. package/dist/node/tui/actions.d.ts +49 -0
  621. package/dist/node/tui/actions.d.ts.map +1 -0
  622. package/dist/node/tui/actions.js +195 -0
  623. package/dist/node/tui/actions.js.map +1 -0
  624. package/dist/node/tui/credentials.d.ts +17 -0
  625. package/dist/node/tui/credentials.d.ts.map +1 -0
  626. package/dist/node/tui/credentials.js +54 -0
  627. package/dist/node/tui/credentials.js.map +1 -0
  628. package/dist/node/tui/filter.d.ts +5 -0
  629. package/dist/node/tui/filter.d.ts.map +1 -0
  630. package/dist/node/tui/filter.js +79 -0
  631. package/dist/node/tui/filter.js.map +1 -0
  632. package/dist/node/tui/index.d.ts +6 -0
  633. package/dist/node/tui/index.d.ts.map +1 -0
  634. package/dist/node/tui/index.js +6 -0
  635. package/dist/node/tui/index.js.map +1 -0
  636. package/dist/node/tui/launcher.d.ts +40 -0
  637. package/dist/node/tui/launcher.d.ts.map +1 -0
  638. package/dist/node/tui/launcher.js +439 -0
  639. package/dist/node/tui/launcher.js.map +1 -0
  640. package/dist/node/tui/pipe.d.ts +18 -0
  641. package/dist/node/tui/pipe.d.ts.map +1 -0
  642. package/dist/node/tui/pipe.js +134 -0
  643. package/dist/node/tui/pipe.js.map +1 -0
  644. package/dist/node/tui/sandbox.d.ts +54 -0
  645. package/dist/node/tui/sandbox.d.ts.map +1 -0
  646. package/dist/node/tui/sandbox.js +431 -0
  647. package/dist/node/tui/sandbox.js.map +1 -0
  648. package/dist/node/workers/base.d.ts +30 -0
  649. package/dist/node/workers/base.d.ts.map +1 -0
  650. package/dist/node/workers/base.js +255 -0
  651. package/dist/node/workers/base.js.map +1 -0
  652. package/dist/node/workers/child.d.ts +4 -0
  653. package/dist/node/workers/child.d.ts.map +1 -0
  654. package/dist/node/workers/child.js +6 -0
  655. package/dist/node/workers/child.js.map +1 -0
  656. package/dist/node/workers/control.d.ts +83 -0
  657. package/dist/node/workers/control.d.ts.map +1 -0
  658. package/dist/node/workers/control.js +77 -0
  659. package/dist/node/workers/control.js.map +1 -0
  660. package/dist/node/workers/index.d.ts +4 -0
  661. package/dist/node/workers/index.d.ts.map +1 -0
  662. package/dist/node/workers/index.js +7 -0
  663. package/dist/node/workers/index.js.map +1 -0
  664. package/dist/node/workers/lock.d.ts +30 -0
  665. package/dist/node/workers/lock.d.ts.map +1 -0
  666. package/dist/node/workers/lock.js +180 -0
  667. package/dist/node/workers/lock.js.map +1 -0
  668. package/dist/node/workers/main.d.ts +46 -0
  669. package/dist/node/workers/main.d.ts.map +1 -0
  670. package/dist/node/workers/main.js +230 -0
  671. package/dist/node/workers/main.js.map +1 -0
  672. package/dist/node/workers/process.d.ts +42 -0
  673. package/dist/node/workers/process.d.ts.map +1 -0
  674. package/dist/node/workers/process.js +125 -0
  675. package/dist/node/workers/process.js.map +1 -0
  676. package/dist/node/workers/workers.d.ts +122 -0
  677. package/dist/node/workers/workers.d.ts.map +1 -0
  678. package/dist/node/workers/workers.js +677 -0
  679. package/dist/node/workers/workers.js.map +1 -0
  680. package/dist/output.d.ts +1 -1
  681. package/dist/output.d.ts.map +1 -1
  682. package/dist/output.js +4 -2
  683. package/dist/output.js.map +1 -1
  684. package/dist/react/hooks.d.ts +43 -0
  685. package/dist/react/hooks.d.ts.map +1 -0
  686. package/dist/react/hooks.js +82 -0
  687. package/dist/react/hooks.js.map +1 -0
  688. package/dist/react/index.d.ts +3 -0
  689. package/dist/react/index.d.ts.map +1 -0
  690. package/dist/react/index.js +4 -0
  691. package/dist/react/index.js.map +1 -0
  692. package/dist/react/stores.d.ts +9 -0
  693. package/dist/react/stores.d.ts.map +1 -0
  694. package/dist/react/stores.js +37 -0
  695. package/dist/react/stores.js.map +1 -0
  696. package/dist/registries/contribution.d.ts +50 -0
  697. package/dist/registries/contribution.d.ts.map +1 -0
  698. package/dist/registries/contribution.js +129 -0
  699. package/dist/registries/contribution.js.map +1 -0
  700. package/dist/registries/entries.d.ts +18 -0
  701. package/dist/registries/entries.d.ts.map +1 -0
  702. package/dist/registries/entries.js +42 -0
  703. package/dist/registries/entries.js.map +1 -0
  704. package/dist/registries/index.d.ts +3 -0
  705. package/dist/registries/index.d.ts.map +1 -0
  706. package/dist/registries/index.js +5 -0
  707. package/dist/registries/index.js.map +1 -0
  708. package/dist/registries/internal.d.ts +4 -0
  709. package/dist/registries/internal.d.ts.map +1 -0
  710. package/dist/registries/internal.js +5 -0
  711. package/dist/registries/internal.js.map +1 -0
  712. package/dist/registries/record.d.ts +115 -0
  713. package/dist/registries/record.d.ts.map +1 -0
  714. package/dist/registries/record.js +283 -0
  715. package/dist/registries/record.js.map +1 -0
  716. package/dist/registries/registry.d.ts +74 -0
  717. package/dist/registries/registry.d.ts.map +1 -0
  718. package/dist/registries/registry.js +14 -0
  719. package/dist/registries/registry.js.map +1 -0
  720. package/dist/registries/value.d.ts +48 -0
  721. package/dist/registries/value.d.ts.map +1 -0
  722. package/dist/registries/value.js +224 -0
  723. package/dist/registries/value.js.map +1 -0
  724. package/dist/remote/calls.d.ts +25 -0
  725. package/dist/remote/calls.d.ts.map +1 -0
  726. package/dist/remote/calls.js +62 -0
  727. package/dist/remote/calls.js.map +1 -0
  728. package/dist/remote/consumer.d.ts +43 -0
  729. package/dist/remote/consumer.d.ts.map +1 -0
  730. package/dist/remote/consumer.js +350 -0
  731. package/dist/remote/consumer.js.map +1 -0
  732. package/dist/remote/hold.d.ts +141 -0
  733. package/dist/remote/hold.d.ts.map +1 -0
  734. package/dist/remote/hold.js +579 -0
  735. package/dist/remote/hold.js.map +1 -0
  736. package/dist/remote/host-link.d.ts +77 -0
  737. package/dist/remote/host-link.d.ts.map +1 -0
  738. package/dist/remote/host-link.js +184 -0
  739. package/dist/remote/host-link.js.map +1 -0
  740. package/dist/remote/internal.d.ts +6 -0
  741. package/dist/remote/internal.d.ts.map +1 -0
  742. package/dist/remote/internal.js +6 -0
  743. package/dist/remote/internal.js.map +1 -0
  744. package/dist/remote/path.d.ts +46 -0
  745. package/dist/remote/path.d.ts.map +1 -0
  746. package/dist/remote/path.js +73 -0
  747. package/dist/remote/path.js.map +1 -0
  748. package/dist/remote/provider.d.ts +89 -0
  749. package/dist/remote/provider.d.ts.map +1 -0
  750. package/dist/remote/provider.js +597 -0
  751. package/dist/remote/provider.js.map +1 -0
  752. package/dist/remote/relay.d.ts +69 -0
  753. package/dist/remote/relay.d.ts.map +1 -0
  754. package/dist/remote/relay.js +219 -0
  755. package/dist/remote/relay.js.map +1 -0
  756. package/dist/remote/remote-object.d.ts +138 -0
  757. package/dist/remote/remote-object.d.ts.map +1 -0
  758. package/dist/remote/remote-object.js +492 -0
  759. package/dist/remote/remote-object.js.map +1 -0
  760. package/dist/remote/replica.d.ts +59 -0
  761. package/dist/remote/replica.d.ts.map +1 -0
  762. package/dist/remote/replica.js +125 -0
  763. package/dist/remote/replica.js.map +1 -0
  764. package/dist/sqlite/cloudflare.d.ts +2 -0
  765. package/dist/sqlite/cloudflare.d.ts.map +1 -1
  766. package/dist/sqlite/cloudflare.js +10 -0
  767. package/dist/sqlite/cloudflare.js.map +1 -1
  768. package/dist/sqlite/database.d.ts +5 -2
  769. package/dist/sqlite/database.d.ts.map +1 -1
  770. package/dist/sqlite/database.js.map +1 -1
  771. package/dist/sqlite/node.d.ts +13 -2
  772. package/dist/sqlite/node.d.ts.map +1 -1
  773. package/dist/sqlite/node.js +31 -8
  774. package/dist/sqlite/node.js.map +1 -1
  775. package/dist/state/batch.d.ts +64 -0
  776. package/dist/state/batch.d.ts.map +1 -0
  777. package/dist/state/batch.js +164 -0
  778. package/dist/state/batch.js.map +1 -0
  779. package/dist/state/derive.d.ts +52 -0
  780. package/dist/state/derive.d.ts.map +1 -0
  781. package/dist/state/derive.js +182 -0
  782. package/dist/state/derive.js.map +1 -0
  783. package/dist/state/index.d.ts +6 -0
  784. package/dist/state/index.d.ts.map +1 -0
  785. package/dist/state/index.js +4 -0
  786. package/dist/state/index.js.map +1 -0
  787. package/dist/state/internal.d.ts +6 -0
  788. package/dist/state/internal.d.ts.map +1 -0
  789. package/dist/state/internal.js +8 -0
  790. package/dist/state/internal.js.map +1 -0
  791. package/dist/state/native-source.d.ts +106 -0
  792. package/dist/state/native-source.d.ts.map +1 -0
  793. package/dist/state/native-source.js +240 -0
  794. package/dist/state/native-source.js.map +1 -0
  795. package/dist/state/watchable.d.ts +114 -0
  796. package/dist/state/watchable.d.ts.map +1 -0
  797. package/dist/state/watchable.js +156 -0
  798. package/dist/state/watchable.js.map +1 -0
  799. package/dist/state/writable.d.ts +32 -0
  800. package/dist/state/writable.d.ts.map +1 -0
  801. package/dist/state/writable.js +49 -0
  802. package/dist/state/writable.js.map +1 -0
  803. package/dist/store/adapter.d.ts +67 -0
  804. package/dist/store/adapter.d.ts.map +1 -0
  805. package/dist/store/adapter.js +118 -0
  806. package/dist/store/adapter.js.map +1 -0
  807. package/dist/store/allocator.d.ts +17 -0
  808. package/dist/store/allocator.d.ts.map +1 -0
  809. package/dist/store/allocator.js +30 -0
  810. package/dist/store/allocator.js.map +1 -0
  811. package/dist/store/applier.d.ts +8 -0
  812. package/dist/store/applier.d.ts.map +1 -0
  813. package/dist/store/applier.js +375 -0
  814. package/dist/store/applier.js.map +1 -0
  815. package/dist/store/apply-batch.d.ts +12 -0
  816. package/dist/store/apply-batch.d.ts.map +1 -0
  817. package/dist/store/apply-batch.js +83 -0
  818. package/dist/store/apply-batch.js.map +1 -0
  819. package/dist/store/archive.d.ts +32 -0
  820. package/dist/store/archive.d.ts.map +1 -0
  821. package/dist/store/archive.js +130 -0
  822. package/dist/store/archive.js.map +1 -0
  823. package/dist/store/backend.d.ts +10 -0
  824. package/dist/store/backend.d.ts.map +1 -0
  825. package/dist/store/backend.js +15 -0
  826. package/dist/store/backend.js.map +1 -0
  827. package/dist/store/catalog.d.ts +24 -0
  828. package/dist/store/catalog.d.ts.map +1 -0
  829. package/dist/store/catalog.js +17 -0
  830. package/dist/store/catalog.js.map +1 -0
  831. package/dist/store/claims.d.ts +23 -0
  832. package/dist/store/claims.d.ts.map +1 -0
  833. package/dist/store/claims.js +65 -0
  834. package/dist/store/claims.js.map +1 -0
  835. package/dist/store/columns.d.ts +77 -0
  836. package/dist/store/columns.d.ts.map +1 -0
  837. package/dist/store/columns.js +77 -0
  838. package/dist/store/columns.js.map +1 -0
  839. package/dist/store/engine.d.ts +176 -0
  840. package/dist/store/engine.d.ts.map +1 -0
  841. package/dist/store/engine.js +283 -0
  842. package/dist/store/engine.js.map +1 -0
  843. package/dist/store/evaluate.d.ts +17 -0
  844. package/dist/store/evaluate.d.ts.map +1 -0
  845. package/dist/store/evaluate.js +128 -0
  846. package/dist/store/evaluate.js.map +1 -0
  847. package/dist/store/export.d.ts +17 -0
  848. package/dist/store/export.d.ts.map +1 -0
  849. package/dist/store/export.js +200 -0
  850. package/dist/store/export.js.map +1 -0
  851. package/dist/store/expression.d.ts +150 -0
  852. package/dist/store/expression.d.ts.map +1 -0
  853. package/dist/store/expression.js +268 -0
  854. package/dist/store/expression.js.map +1 -0
  855. package/dist/store/import.d.ts +10 -0
  856. package/dist/store/import.d.ts.map +1 -0
  857. package/dist/store/import.js +276 -0
  858. package/dist/store/import.js.map +1 -0
  859. package/dist/store/index.d.ts +16 -0
  860. package/dist/store/index.d.ts.map +1 -0
  861. package/dist/store/index.js +13 -0
  862. package/dist/store/index.js.map +1 -0
  863. package/dist/store/json-column.d.ts +33 -0
  864. package/dist/store/json-column.d.ts.map +1 -0
  865. package/dist/store/json-column.js +62 -0
  866. package/dist/store/json-column.js.map +1 -0
  867. package/dist/store/jsonl.d.ts +9 -0
  868. package/dist/store/jsonl.d.ts.map +1 -0
  869. package/dist/store/jsonl.js +61 -0
  870. package/dist/store/jsonl.js.map +1 -0
  871. package/dist/store/live-query.d.ts +108 -0
  872. package/dist/store/live-query.d.ts.map +1 -0
  873. package/dist/store/live-query.js +254 -0
  874. package/dist/store/live-query.js.map +1 -0
  875. package/dist/store/outbox.d.ts +26 -0
  876. package/dist/store/outbox.d.ts.map +1 -0
  877. package/dist/store/outbox.js +80 -0
  878. package/dist/store/outbox.js.map +1 -0
  879. package/dist/store/query.d.ts +39 -0
  880. package/dist/store/query.d.ts.map +1 -0
  881. package/dist/store/query.js +97 -0
  882. package/dist/store/query.js.map +1 -0
  883. package/dist/store/refusal.d.ts +15 -0
  884. package/dist/store/refusal.d.ts.map +1 -0
  885. package/dist/store/refusal.js +36 -0
  886. package/dist/store/refusal.js.map +1 -0
  887. package/dist/store/rows.d.ts +80 -0
  888. package/dist/store/rows.d.ts.map +1 -0
  889. package/dist/store/rows.js +183 -0
  890. package/dist/store/rows.js.map +1 -0
  891. package/dist/store/schema.d.ts +25 -0
  892. package/dist/store/schema.d.ts.map +1 -0
  893. package/dist/store/schema.js +115 -0
  894. package/dist/store/schema.js.map +1 -0
  895. package/dist/store/sql.d.ts +73 -0
  896. package/dist/store/sql.d.ts.map +1 -0
  897. package/dist/store/sql.js +234 -0
  898. package/dist/store/sql.js.map +1 -0
  899. package/dist/store/step.d.ts +50 -0
  900. package/dist/store/step.d.ts.map +1 -0
  901. package/dist/store/step.js +52 -0
  902. package/dist/store/step.js.map +1 -0
  903. package/dist/store/store.d.ts +171 -0
  904. package/dist/store/store.d.ts.map +1 -0
  905. package/dist/store/store.js +818 -0
  906. package/dist/store/store.js.map +1 -0
  907. package/dist/store/table-changes.d.ts +29 -0
  908. package/dist/store/table-changes.d.ts.map +1 -0
  909. package/dist/store/table-changes.js +102 -0
  910. package/dist/store/table-changes.js.map +1 -0
  911. package/dist/store/table-evolve.d.ts +74 -0
  912. package/dist/store/table-evolve.d.ts.map +1 -0
  913. package/dist/store/table-evolve.js +201 -0
  914. package/dist/store/table-evolve.js.map +1 -0
  915. package/dist/store/table-handle.d.ts +73 -0
  916. package/dist/store/table-handle.d.ts.map +1 -0
  917. package/dist/store/table-handle.js +101 -0
  918. package/dist/store/table-handle.js.map +1 -0
  919. package/dist/store/table-history.d.ts +75 -0
  920. package/dist/store/table-history.d.ts.map +1 -0
  921. package/dist/store/table-history.js +42 -0
  922. package/dist/store/table-history.js.map +1 -0
  923. package/dist/store/table-migration.d.ts +16 -0
  924. package/dist/store/table-migration.d.ts.map +1 -0
  925. package/dist/store/table-migration.js +202 -0
  926. package/dist/store/table-migration.js.map +1 -0
  927. package/dist/store/table-writes.d.ts +125 -0
  928. package/dist/store/table-writes.d.ts.map +1 -0
  929. package/dist/store/table-writes.js +170 -0
  930. package/dist/store/table-writes.js.map +1 -0
  931. package/dist/store/table.d.ts +80 -0
  932. package/dist/store/table.d.ts.map +1 -0
  933. package/dist/store/table.js +103 -0
  934. package/dist/store/table.js.map +1 -0
  935. package/dist/store/text.d.ts +14 -0
  936. package/dist/store/text.d.ts.map +1 -0
  937. package/dist/store/text.js +51 -0
  938. package/dist/store/text.js.map +1 -0
  939. package/dist/store/writes.d.ts +5 -0
  940. package/dist/store/writes.d.ts.map +1 -0
  941. package/dist/store/writes.js +4 -0
  942. package/dist/store/writes.js.map +1 -0
  943. package/dist/surfaces/active-language.d.ts +20 -0
  944. package/dist/surfaces/active-language.d.ts.map +1 -0
  945. package/dist/surfaces/active-language.js +78 -0
  946. package/dist/surfaces/active-language.js.map +1 -0
  947. package/dist/surfaces/active-theme.d.ts +16 -0
  948. package/dist/surfaces/active-theme.d.ts.map +1 -0
  949. package/dist/surfaces/active-theme.js +47 -0
  950. package/dist/surfaces/active-theme.js.map +1 -0
  951. package/dist/surfaces/client.d.ts +96 -0
  952. package/dist/surfaces/client.d.ts.map +1 -0
  953. package/dist/surfaces/client.js +264 -0
  954. package/dist/surfaces/client.js.map +1 -0
  955. package/dist/surfaces/connection.d.ts +49 -0
  956. package/dist/surfaces/connection.d.ts.map +1 -0
  957. package/dist/surfaces/connection.js +142 -0
  958. package/dist/surfaces/connection.js.map +1 -0
  959. package/dist/surfaces/format.d.ts +5 -0
  960. package/dist/surfaces/format.d.ts.map +1 -0
  961. package/dist/surfaces/format.js +37 -0
  962. package/dist/surfaces/format.js.map +1 -0
  963. package/dist/surfaces/index.d.ts +15 -0
  964. package/dist/surfaces/index.d.ts.map +1 -0
  965. package/dist/surfaces/index.js +18 -0
  966. package/dist/surfaces/index.js.map +1 -0
  967. package/dist/surfaces/language.d.ts +53 -0
  968. package/dist/surfaces/language.d.ts.map +1 -0
  969. package/dist/surfaces/language.js +74 -0
  970. package/dist/surfaces/language.js.map +1 -0
  971. package/dist/surfaces/loaded.d.ts +42 -0
  972. package/dist/surfaces/loaded.d.ts.map +1 -0
  973. package/dist/surfaces/loaded.js +116 -0
  974. package/dist/surfaces/loaded.js.map +1 -0
  975. package/dist/surfaces/locale-choice.d.ts +25 -0
  976. package/dist/surfaces/locale-choice.d.ts.map +1 -0
  977. package/dist/surfaces/locale-choice.js +14 -0
  978. package/dist/surfaces/locale-choice.js.map +1 -0
  979. package/dist/surfaces/messages.d.ts +67 -0
  980. package/dist/surfaces/messages.d.ts.map +1 -0
  981. package/dist/surfaces/messages.js +112 -0
  982. package/dist/surfaces/messages.js.map +1 -0
  983. package/dist/surfaces/page-state.d.ts +14 -0
  984. package/dist/surfaces/page-state.d.ts.map +1 -0
  985. package/dist/surfaces/page-state.js +43 -0
  986. package/dist/surfaces/page-state.js.map +1 -0
  987. package/dist/surfaces/preference.d.ts +32 -0
  988. package/dist/surfaces/preference.d.ts.map +1 -0
  989. package/dist/surfaces/preference.js +72 -0
  990. package/dist/surfaces/preference.js.map +1 -0
  991. package/dist/surfaces/registered.d.ts +33 -0
  992. package/dist/surfaces/registered.d.ts.map +1 -0
  993. package/dist/surfaces/registered.js +51 -0
  994. package/dist/surfaces/registered.js.map +1 -0
  995. package/dist/surfaces/scripts.d.ts +84 -0
  996. package/dist/surfaces/scripts.d.ts.map +1 -0
  997. package/dist/surfaces/scripts.js +28 -0
  998. package/dist/surfaces/scripts.js.map +1 -0
  999. package/dist/surfaces/theme-choice.d.ts +31 -0
  1000. package/dist/surfaces/theme-choice.d.ts.map +1 -0
  1001. package/dist/surfaces/theme-choice.js +18 -0
  1002. package/dist/surfaces/theme-choice.js.map +1 -0
  1003. package/dist/surfaces/themes.d.ts +43 -0
  1004. package/dist/surfaces/themes.d.ts.map +1 -0
  1005. package/dist/surfaces/themes.js +110 -0
  1006. package/dist/surfaces/themes.js.map +1 -0
  1007. package/dist/surfaces/translations.d.ts +29 -0
  1008. package/dist/surfaces/translations.d.ts.map +1 -0
  1009. package/dist/surfaces/translations.js +57 -0
  1010. package/dist/surfaces/translations.js.map +1 -0
  1011. package/dist/sync/batch.d.ts +18 -0
  1012. package/dist/sync/batch.d.ts.map +1 -0
  1013. package/dist/sync/batch.js +125 -0
  1014. package/dist/sync/batch.js.map +1 -0
  1015. package/dist/sync/client.d.ts +166 -0
  1016. package/dist/sync/client.d.ts.map +1 -0
  1017. package/dist/sync/client.js +438 -0
  1018. package/dist/sync/client.js.map +1 -0
  1019. package/dist/sync/files.d.ts +46 -0
  1020. package/dist/sync/files.d.ts.map +1 -0
  1021. package/dist/sync/files.js +13 -0
  1022. package/dist/sync/files.js.map +1 -0
  1023. package/dist/sync/filesystem.d.ts +37 -0
  1024. package/dist/sync/filesystem.d.ts.map +1 -0
  1025. package/dist/sync/filesystem.js +185 -0
  1026. package/dist/sync/filesystem.js.map +1 -0
  1027. package/dist/sync/index.d.ts +8 -0
  1028. package/dist/sync/index.d.ts.map +1 -0
  1029. package/dist/sync/index.js +9 -0
  1030. package/dist/sync/index.js.map +1 -0
  1031. package/dist/sync/lines.d.ts +18 -0
  1032. package/dist/sync/lines.d.ts.map +1 -0
  1033. package/dist/sync/lines.js +46 -0
  1034. package/dist/sync/lines.js.map +1 -0
  1035. package/dist/sync/remote.d.ts +130 -0
  1036. package/dist/sync/remote.d.ts.map +1 -0
  1037. package/dist/sync/remote.js +46 -0
  1038. package/dist/sync/remote.js.map +1 -0
  1039. package/dist/sync/state.d.ts +17 -0
  1040. package/dist/sync/state.d.ts.map +1 -0
  1041. package/dist/sync/state.js +40 -0
  1042. package/dist/sync/state.js.map +1 -0
  1043. package/dist/telemetry-ingest/batch.d.ts +70 -0
  1044. package/dist/telemetry-ingest/batch.d.ts.map +1 -0
  1045. package/dist/telemetry-ingest/batch.js +110 -0
  1046. package/dist/telemetry-ingest/batch.js.map +1 -0
  1047. package/dist/telemetry-ingest/facet.d.ts +21 -0
  1048. package/dist/telemetry-ingest/facet.d.ts.map +1 -0
  1049. package/dist/telemetry-ingest/facet.js +96 -0
  1050. package/dist/telemetry-ingest/facet.js.map +1 -0
  1051. package/dist/telemetry-ingest/index.d.ts +5 -0
  1052. package/dist/telemetry-ingest/index.d.ts.map +1 -0
  1053. package/dist/telemetry-ingest/index.js +8 -0
  1054. package/dist/telemetry-ingest/index.js.map +1 -0
  1055. package/dist/telemetry-ingest/recorder.d.ts +50 -0
  1056. package/dist/telemetry-ingest/recorder.d.ts.map +1 -0
  1057. package/dist/telemetry-ingest/recorder.js +298 -0
  1058. package/dist/telemetry-ingest/recorder.js.map +1 -0
  1059. package/dist/telemetry-ingest/sender.d.ts +14 -0
  1060. package/dist/telemetry-ingest/sender.d.ts.map +1 -0
  1061. package/dist/telemetry-ingest/sender.js +64 -0
  1062. package/dist/telemetry-ingest/sender.js.map +1 -0
  1063. package/dist/telemetry-sqlite/index.d.ts +13 -4
  1064. package/dist/telemetry-sqlite/index.d.ts.map +1 -1
  1065. package/dist/telemetry-sqlite/index.js +81 -241
  1066. package/dist/telemetry-sqlite/index.js.map +1 -1
  1067. package/dist/telemetry-sqlite/node.d.ts +13 -0
  1068. package/dist/telemetry-sqlite/node.d.ts.map +1 -0
  1069. package/dist/telemetry-sqlite/node.js +27 -0
  1070. package/dist/telemetry-sqlite/node.js.map +1 -0
  1071. package/dist/telemetry-sqlite/schema.d.ts +9 -0
  1072. package/dist/telemetry-sqlite/schema.d.ts.map +1 -0
  1073. package/dist/telemetry-sqlite/schema.js +61 -0
  1074. package/dist/telemetry-sqlite/schema.js.map +1 -0
  1075. package/dist/telemetry-sqlite/store.d.ts +3 -0
  1076. package/dist/telemetry-sqlite/store.d.ts.map +1 -1
  1077. package/dist/telemetry-sqlite/store.js +24 -13
  1078. package/dist/telemetry-sqlite/store.js.map +1 -1
  1079. package/dist/telemetry.d.ts +937 -0
  1080. package/dist/telemetry.d.ts.map +1 -0
  1081. package/dist/telemetry.js +470 -0
  1082. package/dist/telemetry.js.map +1 -0
  1083. package/dist/tui/bridge.d.ts +112 -0
  1084. package/dist/tui/bridge.d.ts.map +1 -0
  1085. package/dist/tui/bridge.js +9 -0
  1086. package/dist/tui/bridge.js.map +1 -0
  1087. package/dist/tui/channel.d.ts +44 -0
  1088. package/dist/tui/channel.d.ts.map +1 -0
  1089. package/dist/tui/channel.js +150 -0
  1090. package/dist/tui/channel.js.map +1 -0
  1091. package/dist/tui/frames.d.ts +5 -0
  1092. package/dist/tui/frames.d.ts.map +1 -0
  1093. package/dist/tui/frames.js +52 -0
  1094. package/dist/tui/frames.js.map +1 -0
  1095. package/dist/tui/index.d.ts +7 -0
  1096. package/dist/tui/index.d.ts.map +1 -0
  1097. package/dist/tui/index.js +8 -0
  1098. package/dist/tui/index.js.map +1 -0
  1099. package/dist/tui/runtime.d.ts +46 -0
  1100. package/dist/tui/runtime.d.ts.map +1 -0
  1101. package/dist/tui/runtime.js +101 -0
  1102. package/dist/tui/runtime.js.map +1 -0
  1103. package/dist/tui/scope.d.ts +46 -0
  1104. package/dist/tui/scope.d.ts.map +1 -0
  1105. package/dist/tui/scope.js +141 -0
  1106. package/dist/tui/scope.js.map +1 -0
  1107. package/dist/tui/terminal.d.ts +15 -0
  1108. package/dist/tui/terminal.d.ts.map +1 -0
  1109. package/dist/tui/terminal.js +37 -0
  1110. package/dist/tui/terminal.js.map +1 -0
  1111. package/dist/tui/theme.d.ts +17 -0
  1112. package/dist/tui/theme.d.ts.map +1 -0
  1113. package/dist/tui/theme.js +38 -0
  1114. package/dist/tui/theme.js.map +1 -0
  1115. package/dist/watch.d.ts +194 -0
  1116. package/dist/watch.d.ts.map +1 -0
  1117. package/dist/watch.js +383 -0
  1118. package/dist/watch.js.map +1 -0
  1119. package/dist/web/environment.d.ts +4 -0
  1120. package/dist/web/environment.d.ts.map +1 -0
  1121. package/dist/web/environment.js +37 -0
  1122. package/dist/web/environment.js.map +1 -0
  1123. package/dist/web/index.d.ts +5 -0
  1124. package/dist/web/index.d.ts.map +1 -0
  1125. package/dist/web/index.js +7 -0
  1126. package/dist/web/index.js.map +1 -0
  1127. package/dist/web/language.d.ts +7 -0
  1128. package/dist/web/language.d.ts.map +1 -0
  1129. package/dist/web/language.js +21 -0
  1130. package/dist/web/language.js.map +1 -0
  1131. package/dist/web/page.d.ts +29 -0
  1132. package/dist/web/page.d.ts.map +1 -0
  1133. package/dist/web/page.js +92 -0
  1134. package/dist/web/page.js.map +1 -0
  1135. package/dist/web/scripts.d.ts +23 -0
  1136. package/dist/web/scripts.d.ts.map +1 -0
  1137. package/dist/web/scripts.js +50 -0
  1138. package/dist/web/scripts.js.map +1 -0
  1139. package/dist/web/styles.d.ts +17 -0
  1140. package/dist/web/styles.d.ts.map +1 -0
  1141. package/dist/web/styles.js +218 -0
  1142. package/dist/web/styles.js.map +1 -0
  1143. package/dist/web/themes.d.ts +6 -0
  1144. package/dist/web/themes.d.ts.map +1 -0
  1145. package/dist/web/themes.js +31 -0
  1146. package/dist/web/themes.js.map +1 -0
  1147. package/docs/benchmarks.md +1036 -0
  1148. package/docs/decisions.md +3436 -0
  1149. package/docs/dependencies/book.md +1671 -0
  1150. package/docs/dependencies/index.html +2641 -0
  1151. package/docs/dependencies/model.md +330 -0
  1152. package/docs/design.md +3065 -0
  1153. package/docs/durable-observers/book.md +432 -0
  1154. package/docs/durable-observers/index.html +517 -0
  1155. package/docs/flow-control/book.md +333 -0
  1156. package/docs/flow-control/fold/index.html +265 -0
  1157. package/docs/flow-control/index.html +548 -0
  1158. package/docs/flow-control/window/index.html +228 -0
  1159. package/docs/guide-plugins-hosts/book.md +957 -0
  1160. package/docs/guide-plugins-hosts/index.html +952 -0
  1161. package/docs/http-workers/book.md +378 -0
  1162. package/docs/http-workers/index.html +515 -0
  1163. package/docs/i18n/book.md +217 -0
  1164. package/docs/i18n/index.html +344 -0
  1165. package/docs/layer-1.md +311 -0
  1166. package/docs/layer-2.md +216 -0
  1167. package/docs/p3-features/README.md +6 -0
  1168. package/docs/p3-features/book.md +478 -0
  1169. package/docs/plugin-authoring.md +276 -0
  1170. package/docs/plugin-model/book.md +186 -0
  1171. package/docs/plugin-model/index.html +310 -0
  1172. package/docs/plugin-primer/book.md +273 -0
  1173. package/docs/plugin-primer/index.html +430 -0
  1174. package/docs/slice-1.md +236 -0
  1175. package/docs/slice-10.md +288 -0
  1176. package/docs/slice-11.md +114 -0
  1177. package/docs/slice-12.md +132 -0
  1178. package/docs/slice-13.md +121 -0
  1179. package/docs/slice-2.md +174 -0
  1180. package/docs/slice-3a.md +296 -0
  1181. package/docs/slice-3b.md +197 -0
  1182. package/docs/slice-4.md +146 -0
  1183. package/docs/slice-4a.md +418 -0
  1184. package/docs/slice-4b.md +208 -0
  1185. package/docs/slice-5.md +281 -0
  1186. package/docs/slice-6a.md +676 -0
  1187. package/docs/slice-6b.md +332 -0
  1188. package/docs/slice-7a.md +130 -0
  1189. package/docs/slice-7b/book.md +608 -0
  1190. package/docs/slice-7b/index.html +842 -0
  1191. package/docs/slice-7b.md +255 -0
  1192. package/docs/slice-7c.md +165 -0
  1193. package/docs/slice-8.md +194 -0
  1194. package/docs/slice-9.md +110 -0
  1195. package/docs/slices.md +241 -0
  1196. package/docs/store/book.md +670 -0
  1197. package/docs/store/index.html +861 -0
  1198. package/docs/store/walkthrough.md +193 -0
  1199. package/docs/theming/book.md +223 -0
  1200. package/docs/theming/index.html +371 -0
  1201. package/docs/tutorial/book.md +2169 -0
  1202. package/docs/tutorial/index.html +2112 -0
  1203. package/docs/tutorial/screens/click-after.png +0 -0
  1204. package/docs/tutorial/screens/click-before.png +0 -0
  1205. package/docs/tutorial/screens/edited.png +0 -0
  1206. package/docs/tutorial/screens/french.png +0 -0
  1207. package/docs/tutorial/screens/harbor.png +0 -0
  1208. package/docs/tutorial/screens/page.png +0 -0
  1209. package/docs/tutorial/screens/traces-ada.png +0 -0
  1210. package/docs/tutorial/screens/traces.png +0 -0
  1211. package/package.json +114 -20
  1212. package/src/delta/README.md +69 -0
  1213. package/dist/cell.d.ts +0 -122
  1214. package/dist/cell.d.ts.map +0 -1
  1215. package/dist/cell.js +0 -356
  1216. package/dist/cell.js.map +0 -1
  1217. package/dist/cluster.d.ts +0 -27
  1218. package/dist/cluster.d.ts.map +0 -1
  1219. package/dist/cluster.js +0 -230
  1220. package/dist/cluster.js.map +0 -1
  1221. package/dist/connection.d.ts +0 -270
  1222. package/dist/connection.d.ts.map +0 -1
  1223. package/dist/connection.js +0 -1216
  1224. package/dist/connection.js.map +0 -1
  1225. package/dist/contract.d.ts +0 -208
  1226. package/dist/contract.d.ts.map +0 -1
  1227. package/dist/contract.js +0 -246
  1228. package/dist/contract.js.map +0 -1
  1229. package/dist/declare.d.ts +0 -33
  1230. package/dist/declare.d.ts.map +0 -1
  1231. package/dist/declare.js +0 -2
  1232. package/dist/declare.js.map +0 -1
  1233. package/dist/errors.d.ts +0 -28
  1234. package/dist/errors.d.ts.map +0 -1
  1235. package/dist/errors.js +0 -59
  1236. package/dist/errors.js.map +0 -1
  1237. package/dist/host.d.ts +0 -348
  1238. package/dist/host.d.ts.map +0 -1
  1239. package/dist/host.js +0 -1000
  1240. package/dist/host.js.map +0 -1
  1241. package/dist/link.d.ts +0 -107
  1242. package/dist/link.d.ts.map +0 -1
  1243. package/dist/link.js +0 -355
  1244. package/dist/link.js.map +0 -1
  1245. package/dist/loader.d.ts +0 -4
  1246. package/dist/loader.d.ts.map +0 -1
  1247. package/dist/loader.js +0 -73
  1248. package/dist/loader.js.map +0 -1
  1249. package/dist/manager.d.ts +0 -115
  1250. package/dist/manager.d.ts.map +0 -1
  1251. package/dist/manager.js +0 -345
  1252. package/dist/manager.js.map +0 -1
  1253. package/dist/node.d.ts +0 -4
  1254. package/dist/node.d.ts.map +0 -1
  1255. package/dist/node.js +0 -4
  1256. package/dist/node.js.map +0 -1
  1257. package/dist/object.d.ts +0 -438
  1258. package/dist/object.d.ts.map +0 -1
  1259. package/dist/object.js +0 -1571
  1260. package/dist/object.js.map +0 -1
  1261. package/dist/publish.d.ts +0 -5
  1262. package/dist/publish.d.ts.map +0 -1
  1263. package/dist/publish.js +0 -40
  1264. package/dist/publish.js.map +0 -1
  1265. package/dist/registry.d.ts +0 -25
  1266. package/dist/registry.d.ts.map +0 -1
  1267. package/dist/registry.js +0 -6
  1268. package/dist/registry.js.map +0 -1
  1269. package/dist/reload.d.ts +0 -126
  1270. package/dist/reload.d.ts.map +0 -1
  1271. package/dist/reload.js +0 -653
  1272. package/dist/reload.js.map +0 -1
  1273. package/dist/remote.d.ts +0 -165
  1274. package/dist/remote.d.ts.map +0 -1
  1275. package/dist/remote.js +0 -612
  1276. package/dist/remote.js.map +0 -1
  1277. package/dist/schema.d.ts +0 -21
  1278. package/dist/schema.d.ts.map +0 -1
  1279. package/dist/schema.js +0 -228
  1280. package/dist/schema.js.map +0 -1
  1281. package/dist/state.d.ts +0 -92
  1282. package/dist/state.d.ts.map +0 -1
  1283. package/dist/state.js +0 -287
  1284. package/dist/state.js.map +0 -1
  1285. package/dist/types.d.ts +0 -88
  1286. package/dist/types.d.ts.map +0 -1
  1287. package/dist/types.js +0 -2
  1288. package/dist/types.js.map +0 -1
  1289. package/dist/websocket.d.ts +0 -15
  1290. package/dist/websocket.d.ts.map +0 -1
  1291. package/dist/websocket.js +0 -16
  1292. package/dist/websocket.js.map +0 -1
  1293. package/dist/wire.d.ts +0 -216
  1294. package/dist/wire.d.ts.map +0 -1
  1295. package/dist/wire.js +0 -165
  1296. package/dist/wire.js.map +0 -1
  1297. package/docs/guide.md +0 -814
  1298. package/docs/spec.md +0 -288
  1299. package/docs/tutorial.md +0 -931
@@ -0,0 +1,185 @@
1
+ import { isNotFound, unwrap } from "./files.js";
2
+ import { remoteHead, } from "./remote.js";
3
+ const pad = (value) => String(value).padStart(16, "0");
4
+ /** How much of a body is read from its file at a time. */
5
+ const READ_CHUNK = 256 * 1024;
6
+ /** One buffer as a body. */
7
+ async function* once(bytes) {
8
+ yield bytes;
9
+ }
10
+ const SLOT_NAME = /^(\d{16})\.json$/;
11
+ const SNAPSHOT_NAME = /^(\d{16})\.batch$/;
12
+ const SESSION_ID = /^[A-Za-z0-9_-][A-Za-z0-9._-]*$/;
13
+ /** A session ID names a file or directory: refuse anything that could leave the root. */
14
+ export function checkSessionId(sessionId) {
15
+ if (!SESSION_ID.test(sessionId))
16
+ throw new Error(`Invalid session ID for a sync directory: ${sessionId}`);
17
+ return sessionId;
18
+ }
19
+ /**
20
+ * A remote store in a directory, laid out as the real remote is: per session, one slot per batch start, holding where
21
+ * the batch ends and which device created it, and snapshots named by their end. As the real remote, it creates a slot
22
+ * only where the history ends. Creating a slot is check-then-write,
23
+ * without the atomicity of the real remote across processes: for development and tests, with one process writing.
24
+ *
25
+ * ```text
26
+ * {root}/{session}/slots/{after}.json { after, to, device, archive?, folded? }, written once
27
+ * {root}/{session}/batches/{after}.batch the commits (or an archive), until folded
28
+ * {root}/{session}/snapshots/{to}.batch a store archive
29
+ * {root}/{session}/meta.json the host's description, last write wins
30
+ * ```
31
+ */
32
+ export class FileSystemSyncRemote {
33
+ #fs;
34
+ #root;
35
+ constructor(fs, root) {
36
+ this.#fs = fs;
37
+ this.#root = root;
38
+ }
39
+ async putBatch(sessionId, after, to, device, body, context, options = {}) {
40
+ const existing = await this.#slot(sessionId, after, context);
41
+ if (existing !== undefined)
42
+ return { type: "exists", to: existing.to, device: existing.device };
43
+ const head = remoteHead(await this.list(sessionId, context));
44
+ if (after !== head)
45
+ return { type: "not_head", head };
46
+ await this.#write(sessionId, ["batches"], `${pad(after)}.batch`, body, context);
47
+ // The slot is written last: it is what makes the batch exist.
48
+ const slot = { after, to, device, ...(options.archive === true ? { archive: true } : {}) };
49
+ await this.#write(sessionId, ["slots"], `${pad(after)}.json`, once(new TextEncoder().encode(JSON.stringify(slot))), context);
50
+ return { type: "created" };
51
+ }
52
+ async getBatch(sessionId, after, context) {
53
+ const slot = await this.#slot(sessionId, after, context);
54
+ if (slot === undefined || slot.folded)
55
+ return undefined;
56
+ return this.#stream(context, sessionId, "batches", `${pad(after)}.batch`);
57
+ }
58
+ getSnapshot(sessionId, to, context) {
59
+ return this.#stream(context, sessionId, "snapshots", `${pad(to)}.batch`);
60
+ }
61
+ async putSnapshot(sessionId, to, body, context) {
62
+ await this.#write(sessionId, ["snapshots"], `${pad(to)}.batch`, body, context);
63
+ }
64
+ async foldBatches(sessionId, afters, context) {
65
+ for (const after of afters) {
66
+ const slot = await this.#slot(sessionId, after, context);
67
+ if (slot === undefined || slot.folded)
68
+ continue;
69
+ const folded = { ...slot, folded: true };
70
+ await this.#write(sessionId, ["slots"], `${pad(after)}.json`, once(new TextEncoder().encode(JSON.stringify(folded))), context);
71
+ const body = await this.#path(context, sessionId, "batches", `${pad(after)}.batch`);
72
+ unwrap(await this.#fs.remove(body, { force: true }, context));
73
+ }
74
+ }
75
+ async deleteSnapshots(sessionId, snapshots, context) {
76
+ for (const to of snapshots) {
77
+ const path = await this.#path(context, sessionId, "snapshots", `${pad(to)}.batch`);
78
+ unwrap(await this.#fs.remove(path, { force: true }, context));
79
+ }
80
+ }
81
+ async list(sessionId, context) {
82
+ const batches = [];
83
+ for (const name of await this.#names(context, sessionId, "slots")) {
84
+ const match = SLOT_NAME.exec(name);
85
+ if (match === null)
86
+ continue;
87
+ const slot = await this.#slot(sessionId, Number(match[1]), context);
88
+ if (slot !== undefined)
89
+ batches.push(slot);
90
+ }
91
+ const snapshots = [];
92
+ for (const name of await this.#names(context, sessionId, "snapshots")) {
93
+ const match = SNAPSHOT_NAME.exec(name);
94
+ if (match !== null)
95
+ snapshots.push(Number(match[1]));
96
+ }
97
+ return { batches, snapshots };
98
+ }
99
+ /** Every session, every time: a directory keeps no change order. */
100
+ async sessions(_cursor, context) {
101
+ const result = await this.#fs.listDir(this.#root, context);
102
+ const names = isNotFound(result)
103
+ ? []
104
+ : unwrap(result)
105
+ .filter((info) => info.kind === "directory" && SESSION_ID.test(info.name))
106
+ .map((info) => info.name)
107
+ .sort();
108
+ const sessions = [];
109
+ for (const id of names) {
110
+ sessions.push({
111
+ id,
112
+ head: remoteHead(await this.list(id, context)),
113
+ meta: await this.getMeta(id, context),
114
+ });
115
+ }
116
+ return { sessions, cursor: "", more: false };
117
+ }
118
+ async putMeta(sessionId, meta, context) {
119
+ await this.#write(sessionId, [], "meta.json", once(new TextEncoder().encode(JSON.stringify(meta))), context);
120
+ }
121
+ async getMeta(sessionId, context) {
122
+ const bytes = await this.#read(context, sessionId, "meta.json");
123
+ return bytes === undefined ? undefined : JSON.parse(new TextDecoder().decode(bytes));
124
+ }
125
+ async #slot(sessionId, after, context) {
126
+ const bytes = await this.#read(context, sessionId, "slots", `${pad(after)}.json`);
127
+ return bytes === undefined ? undefined : JSON.parse(new TextDecoder().decode(bytes));
128
+ }
129
+ async #names(context, sessionId, ...parts) {
130
+ const result = await this.#fs.listDir(await this.#path(context, sessionId, ...parts), context);
131
+ if (isNotFound(result))
132
+ return [];
133
+ return unwrap(result).map((info) => info.name);
134
+ }
135
+ async #read(context, sessionId, ...parts) {
136
+ const result = await this.#fs.readBinaryFile(await this.#path(context, sessionId, ...parts), context);
137
+ if (isNotFound(result))
138
+ return undefined;
139
+ return unwrap(result);
140
+ }
141
+ /** A body streamed back from its file, a chunk at a time; undefined when the file is missing. */
142
+ async #stream(context, sessionId, ...parts) {
143
+ const opened = await this.#fs.openBinaryReader(await this.#path(context, sessionId, ...parts), undefined, context);
144
+ if (isNotFound(opened))
145
+ return undefined;
146
+ const reader = unwrap(opened);
147
+ return (async function* () {
148
+ try {
149
+ for (let offset = 0;;) {
150
+ const chunk = unwrap(await reader.read(offset, READ_CHUNK, context));
151
+ if (chunk.length === 0)
152
+ return;
153
+ offset += chunk.length;
154
+ yield chunk;
155
+ }
156
+ }
157
+ finally {
158
+ await reader.close(context);
159
+ }
160
+ })();
161
+ }
162
+ /**
163
+ * Write a body through a temporary file and a rename, so a reader never sees half a file; the body is appended chunk
164
+ * by chunk as it streams.
165
+ */
166
+ async #write(sessionId, directory, name, body, context) {
167
+ unwrap(await this.#fs.createDir(await this.#path(context, sessionId, ...directory), { recursive: true }, context));
168
+ const path = await this.#path(context, sessionId, ...directory, name);
169
+ const temporary = await this.#path(context, sessionId, ...directory, `${name}.tmp`);
170
+ unwrap(await this.#fs.writeFile(temporary, new Uint8Array(), context));
171
+ try {
172
+ for await (const chunk of body)
173
+ unwrap(await this.#fs.appendFile(temporary, chunk, context));
174
+ }
175
+ catch (error) {
176
+ await this.#fs.remove(temporary, { force: true }, context);
177
+ throw error;
178
+ }
179
+ unwrap(await this.#fs.renameFile(temporary, path, context));
180
+ }
181
+ async #path(context, sessionId, ...parts) {
182
+ return unwrap(await this.#fs.joinPath([this.#root, checkSessionId(sessionId), ...parts], context));
183
+ }
184
+ }
185
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/sync/filesystem.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context } from \"../context/index.ts\";\nimport type { SyncBody } from \"./batch.ts\";\nimport { isNotFound, type SyncFileSystem, unwrap } from \"./files.ts\";\nimport {\n\ttype BatchInfo,\n\ttype JsonObject,\n\ttype PutBatchResult,\n\ttype RemoteListing,\n\tremoteHead,\n\ttype Seq,\n\ttype SessionChanges,\n\ttype SessionSyncMaintenance,\n} from \"./remote.ts\";\n\nconst pad = (value: number): string => String(value).padStart(16, \"0\");\n/** How much of a body is read from its file at a time. */\nconst READ_CHUNK = 256 * 1024;\n\n/** One buffer as a body. */\nasync function* once(bytes: Uint8Array): SyncBody {\n\tyield bytes;\n}\nconst SLOT_NAME = /^(\\d{16})\\.json$/;\nconst SNAPSHOT_NAME = /^(\\d{16})\\.batch$/;\nconst SESSION_ID = /^[A-Za-z0-9_-][A-Za-z0-9._-]*$/;\n\n/** A session ID names a file or directory: refuse anything that could leave the root. */\nexport function checkSessionId(sessionId: string): string {\n\tif (!SESSION_ID.test(sessionId)) throw new Error(`Invalid session ID for a sync directory: ${sessionId}`);\n\treturn sessionId;\n}\n\n/**\n * A remote store in a directory, laid out as the real remote is: per session, one slot per batch start, holding where\n * the batch ends and which device created it, and snapshots named by their end. As the real remote, it creates a slot\n * only where the history ends. Creating a slot is check-then-write,\n * without the atomicity of the real remote across processes: for development and tests, with one process writing.\n *\n * ```text\n * {root}/{session}/slots/{after}.json { after, to, device, archive?, folded? }, written once\n * {root}/{session}/batches/{after}.batch the commits (or an archive), until folded\n * {root}/{session}/snapshots/{to}.batch a store archive\n * {root}/{session}/meta.json the host's description, last write wins\n * ```\n */\nexport class FileSystemSyncRemote implements SessionSyncMaintenance {\n\treadonly #fs: SyncFileSystem;\n\treadonly #root: string;\n\n\tconstructor(fs: SyncFileSystem, root: string) {\n\t\tthis.#fs = fs;\n\t\tthis.#root = root;\n\t}\n\n\tasync putBatch(\n\t\tsessionId: string,\n\t\tafter: Seq,\n\t\tto: Seq,\n\t\tdevice: string,\n\t\tbody: SyncBody,\n\t\tcontext: Context,\n\t\toptions: { readonly archive?: boolean } = {},\n\t): Promise<PutBatchResult> {\n\t\tconst existing = await this.#slot(sessionId, after, context);\n\t\tif (existing !== undefined) return { type: \"exists\", to: existing.to, device: existing.device };\n\t\tconst head = remoteHead(await this.list(sessionId, context));\n\t\tif (after !== head) return { type: \"not_head\", head };\n\t\tawait this.#write(sessionId, [\"batches\"], `${pad(after)}.batch`, body, context);\n\t\t// The slot is written last: it is what makes the batch exist.\n\t\tconst slot: BatchInfo = { after, to, device, ...(options.archive === true ? { archive: true as const } : {}) };\n\t\tawait this.#write(\n\t\t\tsessionId,\n\t\t\t[\"slots\"],\n\t\t\t`${pad(after)}.json`,\n\t\t\tonce(new TextEncoder().encode(JSON.stringify(slot))),\n\t\t\tcontext,\n\t\t);\n\t\treturn { type: \"created\" };\n\t}\n\n\tasync getBatch(sessionId: string, after: Seq, context: Context): Promise<SyncBody | undefined> {\n\t\tconst slot = await this.#slot(sessionId, after, context);\n\t\tif (slot === undefined || slot.folded) return undefined;\n\t\treturn this.#stream(context, sessionId, \"batches\", `${pad(after)}.batch`);\n\t}\n\n\tgetSnapshot(sessionId: string, to: Seq, context: Context): Promise<SyncBody | undefined> {\n\t\treturn this.#stream(context, sessionId, \"snapshots\", `${pad(to)}.batch`);\n\t}\n\n\tasync putSnapshot(sessionId: string, to: Seq, body: SyncBody, context: Context): Promise<void> {\n\t\tawait this.#write(sessionId, [\"snapshots\"], `${pad(to)}.batch`, body, context);\n\t}\n\n\tasync foldBatches(sessionId: string, afters: readonly Seq[], context: Context): Promise<void> {\n\t\tfor (const after of afters) {\n\t\t\tconst slot = await this.#slot(sessionId, after, context);\n\t\t\tif (slot === undefined || slot.folded) continue;\n\t\t\tconst folded: BatchInfo = { ...slot, folded: true };\n\t\t\tawait this.#write(\n\t\t\t\tsessionId,\n\t\t\t\t[\"slots\"],\n\t\t\t\t`${pad(after)}.json`,\n\t\t\t\tonce(new TextEncoder().encode(JSON.stringify(folded))),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tconst body = await this.#path(context, sessionId, \"batches\", `${pad(after)}.batch`);\n\t\t\tunwrap(await this.#fs.remove(body, { force: true }, context));\n\t\t}\n\t}\n\n\tasync deleteSnapshots(sessionId: string, snapshots: readonly Seq[], context: Context): Promise<void> {\n\t\tfor (const to of snapshots) {\n\t\t\tconst path = await this.#path(context, sessionId, \"snapshots\", `${pad(to)}.batch`);\n\t\t\tunwrap(await this.#fs.remove(path, { force: true }, context));\n\t\t}\n\t}\n\n\tasync list(sessionId: string, context: Context): Promise<RemoteListing> {\n\t\tconst batches: BatchInfo[] = [];\n\t\tfor (const name of await this.#names(context, sessionId, \"slots\")) {\n\t\t\tconst match = SLOT_NAME.exec(name);\n\t\t\tif (match === null) continue;\n\t\t\tconst slot = await this.#slot(sessionId, Number(match[1]), context);\n\t\t\tif (slot !== undefined) batches.push(slot);\n\t\t}\n\t\tconst snapshots: Seq[] = [];\n\t\tfor (const name of await this.#names(context, sessionId, \"snapshots\")) {\n\t\t\tconst match = SNAPSHOT_NAME.exec(name);\n\t\t\tif (match !== null) snapshots.push(Number(match[1]));\n\t\t}\n\t\treturn { batches, snapshots };\n\t}\n\n\t/** Every session, every time: a directory keeps no change order. */\n\tasync sessions(_cursor: string | undefined, context: Context): Promise<SessionChanges> {\n\t\tconst result = await this.#fs.listDir(this.#root, context);\n\t\tconst names = isNotFound(result)\n\t\t\t? []\n\t\t\t: unwrap(result)\n\t\t\t\t\t.filter((info) => info.kind === \"directory\" && SESSION_ID.test(info.name))\n\t\t\t\t\t.map((info) => info.name)\n\t\t\t\t\t.sort();\n\t\tconst sessions = [];\n\t\tfor (const id of names) {\n\t\t\tsessions.push({\n\t\t\t\tid,\n\t\t\t\thead: remoteHead(await this.list(id, context)),\n\t\t\t\tmeta: await this.getMeta(id, context),\n\t\t\t});\n\t\t}\n\t\treturn { sessions, cursor: \"\", more: false };\n\t}\n\n\tasync putMeta(sessionId: string, meta: JsonObject, context: Context): Promise<void> {\n\t\tawait this.#write(sessionId, [], \"meta.json\", once(new TextEncoder().encode(JSON.stringify(meta))), context);\n\t}\n\n\tasync getMeta(sessionId: string, context: Context): Promise<JsonObject | undefined> {\n\t\tconst bytes = await this.#read(context, sessionId, \"meta.json\");\n\t\treturn bytes === undefined ? undefined : (JSON.parse(new TextDecoder().decode(bytes)) as JsonObject);\n\t}\n\n\tasync #slot(sessionId: string, after: Seq, context: Context): Promise<BatchInfo | undefined> {\n\t\tconst bytes = await this.#read(context, sessionId, \"slots\", `${pad(after)}.json`);\n\t\treturn bytes === undefined ? undefined : (JSON.parse(new TextDecoder().decode(bytes)) as BatchInfo);\n\t}\n\n\tasync #names(context: Context, sessionId: string, ...parts: string[]): Promise<string[]> {\n\t\tconst result = await this.#fs.listDir(await this.#path(context, sessionId, ...parts), context);\n\t\tif (isNotFound(result)) return [];\n\t\treturn unwrap(result).map((info) => info.name);\n\t}\n\n\tasync #read(context: Context, sessionId: string, ...parts: string[]): Promise<Uint8Array | undefined> {\n\t\tconst result = await this.#fs.readBinaryFile(await this.#path(context, sessionId, ...parts), context);\n\t\tif (isNotFound(result)) return undefined;\n\t\treturn unwrap(result);\n\t}\n\n\t/** A body streamed back from its file, a chunk at a time; undefined when the file is missing. */\n\tasync #stream(context: Context, sessionId: string, ...parts: string[]): Promise<SyncBody | undefined> {\n\t\tconst opened = await this.#fs.openBinaryReader(\n\t\t\tawait this.#path(context, sessionId, ...parts),\n\t\t\tundefined,\n\t\t\tcontext,\n\t\t);\n\t\tif (isNotFound(opened)) return undefined;\n\t\tconst reader = unwrap(opened);\n\t\treturn (async function* () {\n\t\t\ttry {\n\t\t\t\tfor (let offset = 0; ; ) {\n\t\t\t\t\tconst chunk = unwrap(await reader.read(offset, READ_CHUNK, context));\n\t\t\t\t\tif (chunk.length === 0) return;\n\t\t\t\t\toffset += chunk.length;\n\t\t\t\t\tyield chunk;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait reader.close(context);\n\t\t\t}\n\t\t})();\n\t}\n\n\t/**\n\t * Write a body through a temporary file and a rename, so a reader never sees half a file; the body is appended chunk\n\t * by chunk as it streams.\n\t */\n\tasync #write(\n\t\tsessionId: string,\n\t\tdirectory: readonly string[],\n\t\tname: string,\n\t\tbody: SyncBody,\n\t\tcontext: Context,\n\t): Promise<void> {\n\t\tunwrap(\n\t\t\tawait this.#fs.createDir(await this.#path(context, sessionId, ...directory), { recursive: true }, context),\n\t\t);\n\t\tconst path = await this.#path(context, sessionId, ...directory, name);\n\t\tconst temporary = await this.#path(context, sessionId, ...directory, `${name}.tmp`);\n\t\tunwrap(await this.#fs.writeFile(temporary, new Uint8Array(), context));\n\t\ttry {\n\t\t\tfor await (const chunk of body) unwrap(await this.#fs.appendFile(temporary, chunk, context));\n\t\t} catch (error) {\n\t\t\tawait this.#fs.remove(temporary, { force: true }, context);\n\t\t\tthrow error;\n\t\t}\n\t\tunwrap(await this.#fs.renameFile(temporary, path, context));\n\t}\n\n\tasync #path(context: Context, sessionId: string, ...parts: string[]): Promise<string> {\n\t\treturn unwrap(await this.#fs.joinPath([this.#root, checkSessionId(sessionId), ...parts], context));\n\t}\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export { decodeBatch, decodeBatchLines, decodeSnapshot, encodeBatch, encodeSnapshot, type SyncBody, } from "./batch.ts";
2
+ export { APPLY_BYTES, BATCH_BYTES, FlushScheduler, type FlushSchedulerOptions, foldSession, type LocalCopy, OutboxUnavailableError, pullSession, readOutbox, type SyncState, type SyncStateStore, storeHead, UnsyncedCommitsError, type UploadResult, uploadSession, } from "./client.ts";
3
+ export type { FileResult, SyncFileInfo, SyncFileReader, SyncFileSystem } from "./files.ts";
4
+ export { checkSessionId, FileSystemSyncRemote } from "./filesystem.ts";
5
+ export { decodeLogLine, encodeLogLine, LOG_VERSION, LogFormatError } from "./lines.ts";
6
+ export { type BatchInfo, HistoryUnavailableError, type JsonObject, LOG_START, type PutBatchResult, type RemoteHistory, type RemoteListing, remoteHead, remoteHistory, type Seq, type SessionChanges, type SessionSummary, type SessionSyncMaintenance, type SessionSyncStore, } from "./remote.ts";
7
+ export { FileSyncStateStore } from "./state.ts";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,KAAK,QAAQ,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,WAAW,EACX,WAAW,EACX,cAAc,EACd,KAAK,qBAAqB,EAC1B,WAAW,EACX,KAAK,SAAS,EACd,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,SAAS,EACT,oBAAoB,EACpB,KAAK,YAAY,EACjB,aAAa,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EACN,KAAK,SAAS,EACd,uBAAuB,EACvB,KAAK,UAAU,EACf,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,UAAU,EACV,aAAa,EACb,KAAK,GAAG,EACR,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Session sync over a store's outbox (`@earendil-works/chord/sync`, experimental). Portable: the remote and the host's
2
+ // sync state are interfaces, and the directory-backed ones take their file operations (`SyncFileSystem`).
3
+ export { decodeBatch, decodeBatchLines, decodeSnapshot, encodeBatch, encodeSnapshot, } from "./batch.js";
4
+ export { APPLY_BYTES, BATCH_BYTES, FlushScheduler, foldSession, OutboxUnavailableError, pullSession, readOutbox, storeHead, UnsyncedCommitsError, uploadSession, } from "./client.js";
5
+ export { checkSessionId, FileSystemSyncRemote } from "./filesystem.js";
6
+ export { decodeLogLine, encodeLogLine, LOG_VERSION, LogFormatError } from "./lines.js";
7
+ export { HistoryUnavailableError, LOG_START, remoteHead, remoteHistory, } from "./remote.js";
8
+ export { FileSyncStateStore } from "./state.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,0GAA0G;AAE1G,OAAO,EACN,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,GAEd,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,WAAW,EACX,WAAW,EACX,cAAc,EAEd,WAAW,EAEX,sBAAsB,EACtB,WAAW,EACX,UAAU,EAGV,SAAS,EACT,oBAAoB,EAEpB,aAAa,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAEN,uBAAuB,EAEvB,SAAS,EAIT,UAAU,EACV,aAAa,GAMb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Session sync over a store's outbox (`@earendil-works/chord/sync`, experimental). Portable: the remote and the host's\n// sync state are interfaces, and the directory-backed ones take their file operations (`SyncFileSystem`).\n\nexport {\n\tdecodeBatch,\n\tdecodeBatchLines,\n\tdecodeSnapshot,\n\tencodeBatch,\n\tencodeSnapshot,\n\ttype SyncBody,\n} from \"./batch.ts\";\nexport {\n\tAPPLY_BYTES,\n\tBATCH_BYTES,\n\tFlushScheduler,\n\ttype FlushSchedulerOptions,\n\tfoldSession,\n\ttype LocalCopy,\n\tOutboxUnavailableError,\n\tpullSession,\n\treadOutbox,\n\ttype SyncState,\n\ttype SyncStateStore,\n\tstoreHead,\n\tUnsyncedCommitsError,\n\ttype UploadResult,\n\tuploadSession,\n} from \"./client.ts\";\nexport type { FileResult, SyncFileInfo, SyncFileReader, SyncFileSystem } from \"./files.ts\";\nexport { checkSessionId, FileSystemSyncRemote } from \"./filesystem.ts\";\nexport { decodeLogLine, encodeLogLine, LOG_VERSION, LogFormatError } from \"./lines.ts\";\nexport {\n\ttype BatchInfo,\n\tHistoryUnavailableError,\n\ttype JsonObject,\n\tLOG_START,\n\ttype PutBatchResult,\n\ttype RemoteHistory,\n\ttype RemoteListing,\n\tremoteHead,\n\tremoteHistory,\n\ttype Seq,\n\ttype SessionChanges,\n\ttype SessionSummary,\n\ttype SessionSyncMaintenance,\n\ttype SessionSyncStore,\n} from \"./remote.ts\";\nexport { FileSyncStateStore } from \"./state.ts\";\n"]}
@@ -0,0 +1,18 @@
1
+ import type { OutboxCommit } from "../store/outbox.ts";
2
+ /**
3
+ * Version of the line envelope. It changes when the envelope changes; the writes inside carry the store outbox's own
4
+ * `format`, which `applyBatch()` checks.
5
+ */
6
+ export declare const LOG_VERSION = 2;
7
+ export declare class LogFormatError extends Error {
8
+ constructor(message: string, options?: ErrorOptions);
9
+ }
10
+ /** One outbox commit as a JSON line, terminated by a newline. */
11
+ export declare function encodeLogLine(commit: OutboxCommit): string;
12
+ /**
13
+ * One line (without its newline) as an outbox commit; `number` names the line in errors. A line of an unknown version
14
+ * is an error: an older pi must not apply writes it does not understand. The writes themselves are checked by
15
+ * `applyBatch()`, a trust boundary.
16
+ */
17
+ export declare function decodeLogLine(text: string, number: number): OutboxCommit;
18
+ //# sourceMappingURL=lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/sync/lines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,WAAW,IAAI,CAAC;AAS7B,qBAAa,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACD;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAoBxE"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Version of the line envelope. It changes when the envelope changes; the writes inside carry the store outbox's own
3
+ * `format`, which `applyBatch()` checks.
4
+ */
5
+ export const LOG_VERSION = 2;
6
+ export class LogFormatError extends Error {
7
+ constructor(message, options) {
8
+ super(message, options);
9
+ this.name = "LogFormatError";
10
+ }
11
+ }
12
+ /** One outbox commit as a JSON line, terminated by a newline. */
13
+ export function encodeLogLine(commit) {
14
+ const line = { v: LOG_VERSION, seq: commit.seq, nextId: commit.nextId, writes: commit.writes };
15
+ return `${JSON.stringify(line)}\n`;
16
+ }
17
+ /**
18
+ * One line (without its newline) as an outbox commit; `number` names the line in errors. A line of an unknown version
19
+ * is an error: an older pi must not apply writes it does not understand. The writes themselves are checked by
20
+ * `applyBatch()`, a trust boundary.
21
+ */
22
+ export function decodeLogLine(text, number) {
23
+ let value;
24
+ try {
25
+ value = JSON.parse(text);
26
+ }
27
+ catch (error) {
28
+ throw new LogFormatError(`Log line ${number} is not JSON`, { cause: error });
29
+ }
30
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
31
+ throw new LogFormatError(`Log line ${number} is not an object`);
32
+ }
33
+ const line = value;
34
+ if (line.v !== LOG_VERSION)
35
+ throw new LogFormatError(`Log line ${number} has unknown version ${String(line.v)}`);
36
+ if (typeof line.seq !== "number" || !Number.isSafeInteger(line.seq) || line.seq < 1) {
37
+ throw new LogFormatError(`Log line ${number} has no valid sequence`);
38
+ }
39
+ if (typeof line.nextId !== "number" || !Number.isSafeInteger(line.nextId)) {
40
+ throw new LogFormatError(`Log line ${number} has no valid next id`);
41
+ }
42
+ if (!Array.isArray(line.writes))
43
+ throw new LogFormatError(`Log line ${number} has no writes`);
44
+ return { seq: line.seq, nextId: line.nextId, writes: line.writes };
45
+ }
46
+ //# sourceMappingURL=lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/sync/lines.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAS7B,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC9B,CAAC;CACD;AAED,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,MAAoB;IACjD,MAAM,IAAI,GAAY,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACxG,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACzD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,mBAAmB,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,IAAI,GAAG,KAAoD,CAAC;IAClE,IAAI,IAAI,CAAC,CAAC,KAAK,WAAW;QAAE,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,wBAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjH,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,wBAAwB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,uBAAuB,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,YAAY,MAAM,gBAAgB,CAAC,CAAC;IAC9F,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import type { OutboxCommit } from \"../store/outbox.ts\";\n\n/**\n * Version of the line envelope. It changes when the envelope changes; the writes inside carry the store outbox's own\n * `format`, which `applyBatch()` checks.\n */\nexport const LOG_VERSION = 2;\n\ntype LogLine = {\n\treadonly v: typeof LOG_VERSION;\n\treadonly seq: number;\n\treadonly nextId: number;\n\treadonly writes: OutboxCommit[\"writes\"];\n};\n\nexport class LogFormatError extends Error {\n\tconstructor(message: string, options?: ErrorOptions) {\n\t\tsuper(message, options);\n\t\tthis.name = \"LogFormatError\";\n\t}\n}\n\n/** One outbox commit as a JSON line, terminated by a newline. */\nexport function encodeLogLine(commit: OutboxCommit): string {\n\tconst line: LogLine = { v: LOG_VERSION, seq: commit.seq, nextId: commit.nextId, writes: commit.writes };\n\treturn `${JSON.stringify(line)}\\n`;\n}\n\n/**\n * One line (without its newline) as an outbox commit; `number` names the line in errors. A line of an unknown version\n * is an error: an older pi must not apply writes it does not understand. The writes themselves are checked by\n * `applyBatch()`, a trust boundary.\n */\nexport function decodeLogLine(text: string, number: number): OutboxCommit {\n\tlet value: unknown;\n\ttry {\n\t\tvalue = JSON.parse(text);\n\t} catch (error) {\n\t\tthrow new LogFormatError(`Log line ${number} is not JSON`, { cause: error });\n\t}\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\tthrow new LogFormatError(`Log line ${number} is not an object`);\n\t}\n\tconst line = value as Partial<LogLine> & { readonly v?: unknown };\n\tif (line.v !== LOG_VERSION) throw new LogFormatError(`Log line ${number} has unknown version ${String(line.v)}`);\n\tif (typeof line.seq !== \"number\" || !Number.isSafeInteger(line.seq) || line.seq < 1) {\n\t\tthrow new LogFormatError(`Log line ${number} has no valid sequence`);\n\t}\n\tif (typeof line.nextId !== \"number\" || !Number.isSafeInteger(line.nextId)) {\n\t\tthrow new LogFormatError(`Log line ${number} has no valid next id`);\n\t}\n\tif (!Array.isArray(line.writes)) throw new LogFormatError(`Log line ${number} has no writes`);\n\treturn { seq: line.seq, nextId: line.nextId, writes: line.writes };\n}\n"]}
@@ -0,0 +1,130 @@
1
+ import type { Context } from "../context/index.ts";
2
+ import type { SyncBody } from "./batch.ts";
3
+ /** A store's commit sequence (`store.lastSeq`, an outbox commit's `seq`); 0 is before every commit. */
4
+ export type Seq = number;
5
+ /** A JSON object: a session's description on the remote. */
6
+ export type JsonObject = {
7
+ [key: string]: unknown;
8
+ };
9
+ /** The sequence before every commit: a store without commits is at it. */
10
+ export declare const LOG_START: Seq;
11
+ /**
12
+ * A slot of a session's remote history: the batch of outbox commits after `after`, up to `to`, uploaded by `device`. A
13
+ * store creates each slot once and never replaces it, so the device whose upload creates it continues the session from
14
+ * `after`, and a device that finds it taken by another one holds a different history.
15
+ */
16
+ export type BatchInfo = {
17
+ readonly after: Seq;
18
+ readonly to: Seq;
19
+ readonly device: string;
20
+ /** Folding dropped its commits into a snapshot; the slot stays taken. */
21
+ readonly folded?: true;
22
+ /**
23
+ * The body is a store archive at `to` instead of commits: the first upload of a session whose outbox does not reach
24
+ * back to its first commit. Only the slot after 0 can be one.
25
+ */
26
+ readonly archive?: true;
27
+ };
28
+ /** What a remote store holds for one session. A snapshot is a store archive at its sequence, folded from batches. */
29
+ export type RemoteListing = {
30
+ readonly batches: readonly BatchInfo[];
31
+ readonly snapshots: readonly Seq[];
32
+ };
33
+ export type PutBatchResult = {
34
+ readonly type: "created";
35
+ }
36
+ /** The slot is taken; by this device, after an upload whose response was lost, or by another one. */
37
+ | {
38
+ readonly type: "exists";
39
+ readonly to: Seq;
40
+ readonly device: string;
41
+ }
42
+ /**
43
+ * No slot starts at `after`, and the history does not end there: a slot there would branch the chain inside a batch
44
+ * or leave a gap. The uploader's history is not the remote's from `after` on.
45
+ */
46
+ | {
47
+ readonly type: "not_head";
48
+ readonly head: Seq;
49
+ }
50
+ /**
51
+ * The upload's `epoch` is not the session's current one: another device was given the right to write the session
52
+ * since this one was. Who grants it, and when, is the remote's (RFC 0074's single writer); Chord only reports it.
53
+ */
54
+ | {
55
+ readonly type: "stale_epoch";
56
+ readonly epoch: number;
57
+ };
58
+ /** A session as the remote's listing describes it. */
59
+ export type SessionSummary = {
60
+ readonly id: string;
61
+ /** Where its history ends; `LOG_START` for a session with a description and no history. */
62
+ readonly head: Seq;
63
+ readonly meta: JsonObject | undefined;
64
+ };
65
+ /** Sessions changed after a cursor, and the cursor to continue from. */
66
+ export type SessionChanges = {
67
+ readonly sessions: readonly SessionSummary[];
68
+ /** Pass it to the next call; opaque. */
69
+ readonly cursor: string;
70
+ /** More changes follow right away: call again with `cursor`. */
71
+ readonly more: boolean;
72
+ };
73
+ /** The client's view of a remote store. Clients never delete or fold. */
74
+ export interface SessionSyncStore {
75
+ /**
76
+ * Create the slot after `after` unless it exists or the history does not end at `after`. `body` is a stream read once;
77
+ * a remote that answers without reading it (`exists`, `not_head`) leaves it unread.
78
+ */
79
+ putBatch(sessionId: string, after: Seq, to: Seq, device: string, body: SyncBody, context: Context, options?: {
80
+ readonly archive?: boolean;
81
+ /** The writer's epoch: a remote that issues epochs refuses a stale one (`stale_epoch`); others ignore it. */
82
+ readonly epoch?: number;
83
+ }): Promise<PutBatchResult>;
84
+ /** A batch's body; `undefined` when its slot is folded or absent. */
85
+ getBatch(sessionId: string, after: Seq, context: Context): Promise<SyncBody | undefined>;
86
+ getSnapshot(sessionId: string, to: Seq, context: Context): Promise<SyncBody | undefined>;
87
+ list(sessionId: string, context: Context): Promise<RemoteListing>;
88
+ /**
89
+ * The sessions changed after `cursor` (all of them without one). A remote may also list sessions that did not change,
90
+ * so a caller compares what it gets with what it has.
91
+ */
92
+ sessions(cursor: string | undefined, context: Context): Promise<SessionChanges>;
93
+ /**
94
+ * The host's description of a session (title, location, which device started it), outside its history: the last
95
+ * write wins, and it may be ahead of or behind the batches.
96
+ */
97
+ putMeta(sessionId: string, meta: JsonObject, context: Context): Promise<void>;
98
+ getMeta(sessionId: string, context: Context): Promise<JsonObject | undefined>;
99
+ }
100
+ /** The remote's own side: folding history into snapshots, which clients never do. */
101
+ export interface SessionSyncMaintenance extends SessionSyncStore {
102
+ putSnapshot(sessionId: string, to: Seq, body: SyncBody, context: Context): Promise<void>;
103
+ /** Drop the bodies of these slots, keeping the slots taken so nobody can create them again. */
104
+ foldBatches(sessionId: string, afters: readonly Seq[], context: Context): Promise<void>;
105
+ deleteSnapshots(sessionId: string, snapshots: readonly Seq[], context: Context): Promise<void>;
106
+ }
107
+ /** What a copy applies to reach the remote's head. */
108
+ export type RemoteHistory = {
109
+ /** The snapshot a restore starts from. */
110
+ readonly snapshot?: Seq;
111
+ /**
112
+ * The batches to apply in order. The first may start before the copy's head, when a pull stopped inside it; its
113
+ * commits at or below the head are skipped.
114
+ */
115
+ readonly batches: readonly BatchInfo[];
116
+ /** Where applying them ends. */
117
+ readonly head: Seq;
118
+ };
119
+ /** The remote's history no longer continues from a copy's head, after folding: restore into a fresh store. */
120
+ export declare class HistoryUnavailableError extends Error {
121
+ constructor(head: Seq);
122
+ }
123
+ /**
124
+ * The history a copy at `from` applies, or a restore without `from`. Slots are created once, so at most one batch
125
+ * starts at each sequence and the history is a single chain.
126
+ */
127
+ export declare function remoteHistory(listing: RemoteListing, from?: Seq): RemoteHistory;
128
+ /** The furthest head the remote's history reaches. */
129
+ export declare function remoteHead(listing: RemoteListing): Seq;
130
+ //# sourceMappingURL=remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/sync/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /** The sequence before every commit: a store without commits is at it. */
2
+ export const LOG_START = 0;
3
+ /** The remote's history no longer continues from a copy's head, after folding: restore into a fresh store. */
4
+ export class HistoryUnavailableError extends Error {
5
+ constructor(head) {
6
+ super(`The remote history does not continue from ${head}`);
7
+ this.name = "HistoryUnavailableError";
8
+ }
9
+ }
10
+ /**
11
+ * The history a copy at `from` applies, or a restore without `from`. Slots are created once, so at most one batch
12
+ * starts at each sequence and the history is a single chain.
13
+ */
14
+ export function remoteHistory(listing, from) {
15
+ const chain = new Map(listing.batches.map((batch) => [batch.after, batch]));
16
+ let snapshot;
17
+ let at;
18
+ const batches = [];
19
+ if (from === undefined || from === LOG_START) {
20
+ snapshot = listing.snapshots.length === 0 ? undefined : Math.max(...listing.snapshots);
21
+ at = snapshot ?? LOG_START;
22
+ }
23
+ else {
24
+ at = from;
25
+ // A pull that stopped inside a batch finishes it; only one batch can contain the head.
26
+ const inside = listing.batches.find((batch) => batch.after < from && from < batch.to);
27
+ if (inside !== undefined) {
28
+ batches.push(inside);
29
+ at = inside.to;
30
+ }
31
+ }
32
+ for (let next = chain.get(at); next !== undefined; next = chain.get(at)) {
33
+ batches.push(next);
34
+ at = next.to;
35
+ }
36
+ return { ...(snapshot === undefined ? {} : { snapshot }), batches, head: at };
37
+ }
38
+ /** The furthest head the remote's history reaches. */
39
+ export function remoteHead(listing) {
40
+ const chain = new Map(listing.batches.map((batch) => [batch.after, batch]));
41
+ let at = LOG_START;
42
+ for (let next = chain.get(at); next !== undefined; next = chain.get(at))
43
+ at = next.to;
44
+ return at;
45
+ }
46
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/sync/remote.ts"],"names":[],"mappings":"AASA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,SAAS,GAAQ,CAAC,CAAC;AAmHhC,8GAA8G;AAC9G,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACjD,YAAY,IAAS;QACpB,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACvC,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB,EAAE,IAAU;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAyB,CAAC;IAC9B,IAAI,EAAO,CAAC;IACZ,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9C,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAS,CAAC;QAChG,EAAE,GAAG,QAAQ,IAAI,SAAS,CAAC;IAC5B,CAAC;SAAM,CAAC;QACP,EAAE,GAAG,IAAI,CAAC;QACV,uFAAuF;QACvF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IACD,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACd,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,UAAU,CAAC,OAAsB;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,EAAE,GAAQ,SAAS,CAAC;IACxB,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACtF,OAAO,EAAE,CAAC;AACX,CAAC","sourcesContent":["import type { Context } from \"../context/index.ts\";\nimport type { SyncBody } from \"./batch.ts\";\n\n/** A store's commit sequence (`store.lastSeq`, an outbox commit's `seq`); 0 is before every commit. */\nexport type Seq = number;\n\n/** A JSON object: a session's description on the remote. */\nexport type JsonObject = { [key: string]: unknown };\n\n/** The sequence before every commit: a store without commits is at it. */\nexport const LOG_START: Seq = 0;\n\n/**\n * A slot of a session's remote history: the batch of outbox commits after `after`, up to `to`, uploaded by `device`. A\n * store creates each slot once and never replaces it, so the device whose upload creates it continues the session from\n * `after`, and a device that finds it taken by another one holds a different history.\n */\nexport type BatchInfo = {\n\treadonly after: Seq;\n\treadonly to: Seq;\n\treadonly device: string;\n\t/** Folding dropped its commits into a snapshot; the slot stays taken. */\n\treadonly folded?: true;\n\t/**\n\t * The body is a store archive at `to` instead of commits: the first upload of a session whose outbox does not reach\n\t * back to its first commit. Only the slot after 0 can be one.\n\t */\n\treadonly archive?: true;\n};\n\n/** What a remote store holds for one session. A snapshot is a store archive at its sequence, folded from batches. */\nexport type RemoteListing = {\n\treadonly batches: readonly BatchInfo[];\n\treadonly snapshots: readonly Seq[];\n};\n\nexport type PutBatchResult =\n\t| { readonly type: \"created\" }\n\t/** The slot is taken; by this device, after an upload whose response was lost, or by another one. */\n\t| { readonly type: \"exists\"; readonly to: Seq; readonly device: string }\n\t/**\n\t * No slot starts at `after`, and the history does not end there: a slot there would branch the chain inside a batch\n\t * or leave a gap. The uploader's history is not the remote's from `after` on.\n\t */\n\t| { readonly type: \"not_head\"; readonly head: Seq }\n\t/**\n\t * The upload's `epoch` is not the session's current one: another device was given the right to write the session\n\t * since this one was. Who grants it, and when, is the remote's (RFC 0074's single writer); Chord only reports it.\n\t */\n\t| { readonly type: \"stale_epoch\"; readonly epoch: number };\n\n/** A session as the remote's listing describes it. */\nexport type SessionSummary = {\n\treadonly id: string;\n\t/** Where its history ends; `LOG_START` for a session with a description and no history. */\n\treadonly head: Seq;\n\treadonly meta: JsonObject | undefined;\n};\n\n/** Sessions changed after a cursor, and the cursor to continue from. */\nexport type SessionChanges = {\n\treadonly sessions: readonly SessionSummary[];\n\t/** Pass it to the next call; opaque. */\n\treadonly cursor: string;\n\t/** More changes follow right away: call again with `cursor`. */\n\treadonly more: boolean;\n};\n\n/** The client's view of a remote store. Clients never delete or fold. */\nexport interface SessionSyncStore {\n\t/**\n\t * Create the slot after `after` unless it exists or the history does not end at `after`. `body` is a stream read once;\n\t * a remote that answers without reading it (`exists`, `not_head`) leaves it unread.\n\t */\n\tputBatch(\n\t\tsessionId: string,\n\t\tafter: Seq,\n\t\tto: Seq,\n\t\tdevice: string,\n\t\tbody: SyncBody,\n\t\tcontext: Context,\n\t\toptions?: {\n\t\t\treadonly archive?: boolean;\n\t\t\t/** The writer's epoch: a remote that issues epochs refuses a stale one (`stale_epoch`); others ignore it. */\n\t\t\treadonly epoch?: number;\n\t\t},\n\t): Promise<PutBatchResult>;\n\t/** A batch's body; `undefined` when its slot is folded or absent. */\n\tgetBatch(sessionId: string, after: Seq, context: Context): Promise<SyncBody | undefined>;\n\tgetSnapshot(sessionId: string, to: Seq, context: Context): Promise<SyncBody | undefined>;\n\tlist(sessionId: string, context: Context): Promise<RemoteListing>;\n\t/**\n\t * The sessions changed after `cursor` (all of them without one). A remote may also list sessions that did not change,\n\t * so a caller compares what it gets with what it has.\n\t */\n\tsessions(cursor: string | undefined, context: Context): Promise<SessionChanges>;\n\t/**\n\t * The host's description of a session (title, location, which device started it), outside its history: the last\n\t * write wins, and it may be ahead of or behind the batches.\n\t */\n\tputMeta(sessionId: string, meta: JsonObject, context: Context): Promise<void>;\n\tgetMeta(sessionId: string, context: Context): Promise<JsonObject | undefined>;\n}\n\n/** The remote's own side: folding history into snapshots, which clients never do. */\nexport interface SessionSyncMaintenance extends SessionSyncStore {\n\tputSnapshot(sessionId: string, to: Seq, body: SyncBody, context: Context): Promise<void>;\n\t/** Drop the bodies of these slots, keeping the slots taken so nobody can create them again. */\n\tfoldBatches(sessionId: string, afters: readonly Seq[], context: Context): Promise<void>;\n\tdeleteSnapshots(sessionId: string, snapshots: readonly Seq[], context: Context): Promise<void>;\n}\n\n/** What a copy applies to reach the remote's head. */\nexport type RemoteHistory = {\n\t/** The snapshot a restore starts from. */\n\treadonly snapshot?: Seq;\n\t/**\n\t * The batches to apply in order. The first may start before the copy's head, when a pull stopped inside it; its\n\t * commits at or below the head are skipped.\n\t */\n\treadonly batches: readonly BatchInfo[];\n\t/** Where applying them ends. */\n\treadonly head: Seq;\n};\n\n/** The remote's history no longer continues from a copy's head, after folding: restore into a fresh store. */\nexport class HistoryUnavailableError extends Error {\n\tconstructor(head: Seq) {\n\t\tsuper(`The remote history does not continue from ${head}`);\n\t\tthis.name = \"HistoryUnavailableError\";\n\t}\n}\n\n/**\n * The history a copy at `from` applies, or a restore without `from`. Slots are created once, so at most one batch\n * starts at each sequence and the history is a single chain.\n */\nexport function remoteHistory(listing: RemoteListing, from?: Seq): RemoteHistory {\n\tconst chain = new Map(listing.batches.map((batch) => [batch.after, batch]));\n\tlet snapshot: Seq | undefined;\n\tlet at: Seq;\n\tconst batches: BatchInfo[] = [];\n\tif (from === undefined || from === LOG_START) {\n\t\tsnapshot = listing.snapshots.length === 0 ? undefined : (Math.max(...listing.snapshots) as Seq);\n\t\tat = snapshot ?? LOG_START;\n\t} else {\n\t\tat = from;\n\t\t// A pull that stopped inside a batch finishes it; only one batch can contain the head.\n\t\tconst inside = listing.batches.find((batch) => batch.after < from && from < batch.to);\n\t\tif (inside !== undefined) {\n\t\t\tbatches.push(inside);\n\t\t\tat = inside.to;\n\t\t}\n\t}\n\tfor (let next = chain.get(at); next !== undefined; next = chain.get(at)) {\n\t\tbatches.push(next);\n\t\tat = next.to;\n\t}\n\treturn { ...(snapshot === undefined ? {} : { snapshot }), batches, head: at };\n}\n\n/** The furthest head the remote's history reaches. */\nexport function remoteHead(listing: RemoteListing): Seq {\n\tconst chain = new Map(listing.batches.map((batch) => [batch.after, batch]));\n\tlet at: Seq = LOG_START;\n\tfor (let next = chain.get(at); next !== undefined; next = chain.get(at)) at = next.to;\n\treturn at;\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { Context } from "../context/index.ts";
2
+ import type { SyncState, SyncStateStore } from "./client.ts";
3
+ import { type SyncFileSystem } from "./files.ts";
4
+ /**
5
+ * Sync state in a directory, one JSON file per session, replaced through a temporary file and a rename. Losing the
6
+ * directory loses nothing that matters: a copy without commits of its own takes the remote's head, and one with
7
+ * commits finds out by uploading.
8
+ */
9
+ export declare class FileSyncStateStore implements SyncStateStore {
10
+ #private;
11
+ constructor(fs: SyncFileSystem, directory: string);
12
+ get(sessionId: string, context: Context): Promise<SyncState | undefined>;
13
+ set(sessionId: string, state: SyncState, context: Context): Promise<void>;
14
+ /** Forget a session, as when its copy is renamed or deleted. */
15
+ delete(sessionId: string, context: Context): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/sync/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAc,KAAK,cAAc,EAAU,MAAM,YAAY,CAAC;AAIrE;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,cAAc;;IAIxD,YAAY,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAGhD;IAEK,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAQ7E;IAEK,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9E;IAED,gEAAgE;IAC1D,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;CAKD"}
@@ -0,0 +1,40 @@
1
+ import { isNotFound, unwrap } from "./files.js";
2
+ import { checkSessionId } from "./filesystem.js";
3
+ /**
4
+ * Sync state in a directory, one JSON file per session, replaced through a temporary file and a rename. Losing the
5
+ * directory loses nothing that matters: a copy without commits of its own takes the remote's head, and one with
6
+ * commits finds out by uploading.
7
+ */
8
+ export class FileSyncStateStore {
9
+ #fs;
10
+ #directory;
11
+ constructor(fs, directory) {
12
+ this.#fs = fs;
13
+ this.#directory = directory;
14
+ }
15
+ async get(sessionId, context) {
16
+ const result = await this.#fs.readTextFile(await this.#path(sessionId, ".json", context), context);
17
+ if (isNotFound(result))
18
+ return undefined;
19
+ const stored = JSON.parse(unwrap(result));
20
+ return {
21
+ syncedHead: stored.syncedHead,
22
+ ...(stored.pulling === undefined ? {} : { pulling: stored.pulling }),
23
+ };
24
+ }
25
+ async set(sessionId, state, context) {
26
+ unwrap(await this.#fs.createDir(this.#directory, { recursive: true }, context));
27
+ const path = await this.#path(sessionId, ".json", context);
28
+ const temporary = await this.#path(sessionId, ".json.tmp", context);
29
+ unwrap(await this.#fs.writeFile(temporary, JSON.stringify(state), context));
30
+ unwrap(await this.#fs.renameFile(temporary, path, context));
31
+ }
32
+ /** Forget a session, as when its copy is renamed or deleted. */
33
+ async delete(sessionId, context) {
34
+ unwrap(await this.#fs.remove(await this.#path(sessionId, ".json", context), { force: true }, context));
35
+ }
36
+ async #path(sessionId, suffix, context) {
37
+ return unwrap(await this.#fs.joinPath([this.#directory, `${checkSessionId(sessionId)}${suffix}`], context));
38
+ }
39
+ }
40
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/sync/state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAuB,MAAM,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IACrB,GAAG,CAAiB;IACpB,UAAU,CAAS;IAE5B,YAAY,EAAkB,EAAE,SAAiB;QAChD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,OAAgB;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QACnG,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,SAAS,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAwC,CAAC;QACjF,OAAO;YACN,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;SACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,KAAgB,EAAE,OAAgB;QAC9D,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,OAAgB;QAC/C,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAgB;QAC9D,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7G,CAAC;CACD","sourcesContent":["import type { Context } from \"../context/index.ts\";\nimport type { SyncState, SyncStateStore } from \"./client.ts\";\nimport { isNotFound, type SyncFileSystem, unwrap } from \"./files.ts\";\nimport { checkSessionId } from \"./filesystem.ts\";\nimport type { Seq } from \"./remote.ts\";\n\n/**\n * Sync state in a directory, one JSON file per session, replaced through a temporary file and a rename. Losing the\n * directory loses nothing that matters: a copy without commits of its own takes the remote's head, and one with\n * commits finds out by uploading.\n */\nexport class FileSyncStateStore implements SyncStateStore {\n\treadonly #fs: SyncFileSystem;\n\treadonly #directory: string;\n\n\tconstructor(fs: SyncFileSystem, directory: string) {\n\t\tthis.#fs = fs;\n\t\tthis.#directory = directory;\n\t}\n\n\tasync get(sessionId: string, context: Context): Promise<SyncState | undefined> {\n\t\tconst result = await this.#fs.readTextFile(await this.#path(sessionId, \".json\", context), context);\n\t\tif (isNotFound(result)) return undefined;\n\t\tconst stored = JSON.parse(unwrap(result)) as { syncedHead?: Seq; pulling?: Seq };\n\t\treturn {\n\t\t\tsyncedHead: stored.syncedHead,\n\t\t\t...(stored.pulling === undefined ? {} : { pulling: stored.pulling }),\n\t\t};\n\t}\n\n\tasync set(sessionId: string, state: SyncState, context: Context): Promise<void> {\n\t\tunwrap(await this.#fs.createDir(this.#directory, { recursive: true }, context));\n\t\tconst path = await this.#path(sessionId, \".json\", context);\n\t\tconst temporary = await this.#path(sessionId, \".json.tmp\", context);\n\t\tunwrap(await this.#fs.writeFile(temporary, JSON.stringify(state), context));\n\t\tunwrap(await this.#fs.renameFile(temporary, path, context));\n\t}\n\n\t/** Forget a session, as when its copy is renamed or deleted. */\n\tasync delete(sessionId: string, context: Context): Promise<void> {\n\t\tunwrap(await this.#fs.remove(await this.#path(sessionId, \".json\", context), { force: true }, context));\n\t}\n\n\tasync #path(sessionId: string, suffix: string, context: Context): Promise<string> {\n\t\treturn unwrap(await this.#fs.joinPath([this.#directory, `${checkSessionId(sessionId)}${suffix}`], context));\n\t}\n}\n"]}