@earendil-works/chord 1.3.0 → 1.5.0

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 (841) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +129 -10
  3. package/dist/cell.d.ts +7 -7
  4. package/dist/cell.d.ts.map +1 -1
  5. package/dist/cell.js.map +1 -1
  6. package/dist/context/index.d.ts +8 -0
  7. package/dist/context/index.d.ts.map +1 -1
  8. package/dist/context/index.js +15 -0
  9. package/dist/context/index.js.map +1 -1
  10. package/dist/contract.d.ts +51 -52
  11. package/dist/contract.d.ts.map +1 -1
  12. package/dist/contract.js +19 -24
  13. package/dist/contract.js.map +1 -1
  14. package/dist/delta/apply-immutable-trusted.js +3 -4
  15. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  16. package/dist/delta/diff.d.ts.map +1 -1
  17. package/dist/delta/diff.js +5 -3
  18. package/dist/delta/diff.js.map +1 -1
  19. package/dist/delta/index.d.ts +9 -1
  20. package/dist/delta/index.d.ts.map +1 -1
  21. package/dist/delta/index.js +15 -11
  22. package/dist/delta/index.js.map +1 -1
  23. package/dist/delta/pending.d.ts +36 -0
  24. package/dist/delta/pending.d.ts.map +1 -0
  25. package/dist/delta/pending.js +143 -0
  26. package/dist/delta/pending.js.map +1 -0
  27. package/dist/delta/tracker.d.ts +12 -0
  28. package/dist/delta/tracker.d.ts.map +1 -1
  29. package/dist/delta/tracker.js +109 -39
  30. package/dist/delta/tracker.js.map +1 -1
  31. package/dist/host.d.ts.map +1 -1
  32. package/dist/host.js +9 -7
  33. package/dist/host.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/next/contracts/accepts.d.ts +81 -0
  39. package/dist/next/contracts/accepts.d.ts.map +1 -0
  40. package/dist/next/contracts/accepts.js +123 -0
  41. package/dist/next/contracts/accepts.js.map +1 -0
  42. package/dist/next/contracts/contract.d.ts +121 -0
  43. package/dist/next/contracts/contract.d.ts.map +1 -0
  44. package/dist/next/contracts/contract.js +50 -0
  45. package/dist/next/contracts/contract.js.map +1 -0
  46. package/dist/next/contracts/declare.d.ts +107 -0
  47. package/dist/next/contracts/declare.d.ts.map +1 -0
  48. package/dist/next/contracts/declare.js +136 -0
  49. package/dist/next/contracts/declare.js.map +1 -0
  50. package/dist/next/contracts/evolve.d.ts +92 -0
  51. package/dist/next/contracts/evolve.d.ts.map +1 -0
  52. package/dist/next/contracts/evolve.js +179 -0
  53. package/dist/next/contracts/evolve.js.map +1 -0
  54. package/dist/next/contracts/fingerprint.d.ts +16 -0
  55. package/dist/next/contracts/fingerprint.d.ts.map +1 -0
  56. package/dist/next/contracts/fingerprint.js +50 -0
  57. package/dist/next/contracts/fingerprint.js.map +1 -0
  58. package/dist/next/contracts/history.d.ts +71 -0
  59. package/dist/next/contracts/history.d.ts.map +1 -0
  60. package/dist/next/contracts/history.js +3 -0
  61. package/dist/next/contracts/history.js.map +1 -0
  62. package/dist/next/contracts/host-kind.d.ts +40 -0
  63. package/dist/next/contracts/host-kind.d.ts.map +1 -0
  64. package/dist/next/contracts/host-kind.js +37 -0
  65. package/dist/next/contracts/host-kind.js.map +1 -0
  66. package/dist/next/contracts/index.d.ts +7 -0
  67. package/dist/next/contracts/index.d.ts.map +1 -0
  68. package/dist/next/contracts/index.js +6 -0
  69. package/dist/next/contracts/index.js.map +1 -0
  70. package/dist/next/contracts/internal.d.ts +10 -0
  71. package/dist/next/contracts/internal.d.ts.map +1 -0
  72. package/dist/next/contracts/internal.js +9 -0
  73. package/dist/next/contracts/internal.js.map +1 -0
  74. package/dist/next/contracts/names.d.ts +3 -0
  75. package/dist/next/contracts/names.d.ts.map +1 -0
  76. package/dist/next/contracts/names.js +13 -0
  77. package/dist/next/contracts/names.js.map +1 -0
  78. package/dist/next/contracts/params.d.ts +28 -0
  79. package/dist/next/contracts/params.d.ts.map +1 -0
  80. package/dist/next/contracts/params.js +50 -0
  81. package/dist/next/contracts/params.js.map +1 -0
  82. package/dist/next/contracts/schema.d.ts +102 -0
  83. package/dist/next/contracts/schema.d.ts.map +1 -0
  84. package/dist/next/contracts/schema.js +103 -0
  85. package/dist/next/contracts/schema.js.map +1 -0
  86. package/dist/next/contracts/snapshot.d.ts +16 -0
  87. package/dist/next/contracts/snapshot.d.ts.map +1 -0
  88. package/dist/next/contracts/snapshot.js +167 -0
  89. package/dist/next/contracts/snapshot.js.map +1 -0
  90. package/dist/next/data/args.d.ts +50 -0
  91. package/dist/next/data/args.d.ts.map +1 -0
  92. package/dist/next/data/args.js +83 -0
  93. package/dist/next/data/args.js.map +1 -0
  94. package/dist/next/data/errors.d.ts +73 -0
  95. package/dist/next/data/errors.d.ts.map +1 -0
  96. package/dist/next/data/errors.js +107 -0
  97. package/dist/next/data/errors.js.map +1 -0
  98. package/dist/next/data/failure.d.ts +26 -0
  99. package/dist/next/data/failure.d.ts.map +1 -0
  100. package/dist/next/data/failure.js +72 -0
  101. package/dist/next/data/failure.js.map +1 -0
  102. package/dist/next/data/index.d.ts +4 -0
  103. package/dist/next/data/index.d.ts.map +1 -0
  104. package/dist/next/data/index.js +4 -0
  105. package/dist/next/data/index.js.map +1 -0
  106. package/dist/next/data/internal.d.ts +7 -0
  107. package/dist/next/data/internal.d.ts.map +1 -0
  108. package/dist/next/data/internal.js +8 -0
  109. package/dist/next/data/internal.js.map +1 -0
  110. package/dist/next/data/params.d.ts +20 -0
  111. package/dist/next/data/params.d.ts.map +1 -0
  112. package/dist/next/data/params.js +31 -0
  113. package/dist/next/data/params.js.map +1 -0
  114. package/dist/next/data/principal.d.ts +17 -0
  115. package/dist/next/data/principal.d.ts.map +1 -0
  116. package/dist/next/data/principal.js +41 -0
  117. package/dist/next/data/principal.js.map +1 -0
  118. package/dist/next/data/validator.d.ts +12 -0
  119. package/dist/next/data/validator.d.ts.map +1 -0
  120. package/dist/next/data/validator.js +34 -0
  121. package/dist/next/data/validator.js.map +1 -0
  122. package/dist/next/documents/address-source.d.ts +20 -0
  123. package/dist/next/documents/address-source.d.ts.map +1 -0
  124. package/dist/next/documents/address-source.js +44 -0
  125. package/dist/next/documents/address-source.js.map +1 -0
  126. package/dist/next/documents/definition.d.ts +84 -0
  127. package/dist/next/documents/definition.d.ts.map +1 -0
  128. package/dist/next/documents/definition.js +73 -0
  129. package/dist/next/documents/definition.js.map +1 -0
  130. package/dist/next/documents/documents.d.ts +106 -0
  131. package/dist/next/documents/documents.d.ts.map +1 -0
  132. package/dist/next/documents/documents.js +224 -0
  133. package/dist/next/documents/documents.js.map +1 -0
  134. package/dist/next/documents/fence.d.ts +9 -0
  135. package/dist/next/documents/fence.d.ts.map +1 -0
  136. package/dist/next/documents/fence.js +15 -0
  137. package/dist/next/documents/fence.js.map +1 -0
  138. package/dist/next/documents/handles.d.ts +76 -0
  139. package/dist/next/documents/handles.d.ts.map +1 -0
  140. package/dist/next/documents/handles.js +66 -0
  141. package/dist/next/documents/handles.js.map +1 -0
  142. package/dist/next/documents/index.d.ts +4 -0
  143. package/dist/next/documents/index.d.ts.map +1 -0
  144. package/dist/next/documents/index.js +3 -0
  145. package/dist/next/documents/index.js.map +1 -0
  146. package/dist/next/documents/internal.d.ts +9 -0
  147. package/dist/next/documents/internal.d.ts.map +1 -0
  148. package/dist/next/documents/internal.js +9 -0
  149. package/dist/next/documents/internal.js.map +1 -0
  150. package/dist/next/documents/keyed-slot.d.ts +103 -0
  151. package/dist/next/documents/keyed-slot.d.ts.map +1 -0
  152. package/dist/next/documents/keyed-slot.js +395 -0
  153. package/dist/next/documents/keyed-slot.js.map +1 -0
  154. package/dist/next/documents/line.d.ts +7 -0
  155. package/dist/next/documents/line.d.ts.map +1 -0
  156. package/dist/next/documents/line.js +14 -0
  157. package/dist/next/documents/line.js.map +1 -0
  158. package/dist/next/documents/persistence.d.ts +104 -0
  159. package/dist/next/documents/persistence.d.ts.map +1 -0
  160. package/dist/next/documents/persistence.js +128 -0
  161. package/dist/next/documents/persistence.js.map +1 -0
  162. package/dist/next/documents/residency.d.ts +31 -0
  163. package/dist/next/documents/residency.d.ts.map +1 -0
  164. package/dist/next/documents/residency.js +93 -0
  165. package/dist/next/documents/residency.js.map +1 -0
  166. package/dist/next/documents/slot.d.ts +109 -0
  167. package/dist/next/documents/slot.d.ts.map +1 -0
  168. package/dist/next/documents/slot.js +181 -0
  169. package/dist/next/documents/slot.js.map +1 -0
  170. package/dist/next/documents/transaction.d.ts +133 -0
  171. package/dist/next/documents/transaction.d.ts.map +1 -0
  172. package/dist/next/documents/transaction.js +409 -0
  173. package/dist/next/documents/transaction.js.map +1 -0
  174. package/dist/next/host/activity.d.ts +31 -0
  175. package/dist/next/host/activity.d.ts.map +1 -0
  176. package/dist/next/host/activity.js +40 -0
  177. package/dist/next/host/activity.js.map +1 -0
  178. package/dist/next/host/adapted.d.ts +49 -0
  179. package/dist/next/host/adapted.d.ts.map +1 -0
  180. package/dist/next/host/adapted.js +214 -0
  181. package/dist/next/host/adapted.js.map +1 -0
  182. package/dist/next/host/attempt.d.ts +278 -0
  183. package/dist/next/host/attempt.d.ts.map +1 -0
  184. package/dist/next/host/attempt.js +1072 -0
  185. package/dist/next/host/attempt.js.map +1 -0
  186. package/dist/next/host/backoff.d.ts +29 -0
  187. package/dist/next/host/backoff.d.ts.map +1 -0
  188. package/dist/next/host/backoff.js +69 -0
  189. package/dist/next/host/backoff.js.map +1 -0
  190. package/dist/next/host/ctx.d.ts +47 -0
  191. package/dist/next/host/ctx.d.ts.map +1 -0
  192. package/dist/next/host/ctx.js +108 -0
  193. package/dist/next/host/ctx.js.map +1 -0
  194. package/dist/next/host/deadline.d.ts +12 -0
  195. package/dist/next/host/deadline.d.ts.map +1 -0
  196. package/dist/next/host/deadline.js +40 -0
  197. package/dist/next/host/deadline.js.map +1 -0
  198. package/dist/next/host/dependencies.d.ts +65 -0
  199. package/dist/next/host/dependencies.d.ts.map +1 -0
  200. package/dist/next/host/dependencies.js +115 -0
  201. package/dist/next/host/dependencies.js.map +1 -0
  202. package/dist/next/host/destination.d.ts +48 -0
  203. package/dist/next/host/destination.d.ts.map +1 -0
  204. package/dist/next/host/destination.js +101 -0
  205. package/dist/next/host/destination.js.map +1 -0
  206. package/dist/next/host/facet.d.ts +79 -0
  207. package/dist/next/host/facet.d.ts.map +1 -0
  208. package/dist/next/host/facet.js +55 -0
  209. package/dist/next/host/facet.js.map +1 -0
  210. package/dist/next/host/follow.d.ts +52 -0
  211. package/dist/next/host/follow.d.ts.map +1 -0
  212. package/dist/next/host/follow.js +207 -0
  213. package/dist/next/host/follow.js.map +1 -0
  214. package/dist/next/host/host.d.ts +495 -0
  215. package/dist/next/host/host.d.ts.map +1 -0
  216. package/dist/next/host/host.js +1075 -0
  217. package/dist/next/host/host.js.map +1 -0
  218. package/dist/next/host/index.d.ts +17 -0
  219. package/dist/next/host/index.d.ts.map +1 -0
  220. package/dist/next/host/index.js +6 -0
  221. package/dist/next/host/index.js.map +1 -0
  222. package/dist/next/host/internal.d.ts +10 -0
  223. package/dist/next/host/internal.d.ts.map +1 -0
  224. package/dist/next/host/internal.js +8 -0
  225. package/dist/next/host/internal.js.map +1 -0
  226. package/dist/next/host/members.d.ts +50 -0
  227. package/dist/next/host/members.d.ts.map +1 -0
  228. package/dist/next/host/members.js +107 -0
  229. package/dist/next/host/members.js.map +1 -0
  230. package/dist/next/host/native.d.ts +55 -0
  231. package/dist/next/host/native.d.ts.map +1 -0
  232. package/dist/next/host/native.js +92 -0
  233. package/dist/next/host/native.js.map +1 -0
  234. package/dist/next/host/object.d.ts +290 -0
  235. package/dist/next/host/object.d.ts.map +1 -0
  236. package/dist/next/host/object.js +1127 -0
  237. package/dist/next/host/object.js.map +1 -0
  238. package/dist/next/host/parked.d.ts +23 -0
  239. package/dist/next/host/parked.d.ts.map +1 -0
  240. package/dist/next/host/parked.js +79 -0
  241. package/dist/next/host/parked.js.map +1 -0
  242. package/dist/next/host/presence.d.ts +34 -0
  243. package/dist/next/host/presence.d.ts.map +1 -0
  244. package/dist/next/host/presence.js +117 -0
  245. package/dist/next/host/presence.js.map +1 -0
  246. package/dist/next/host/ref-state.d.ts +53 -0
  247. package/dist/next/host/ref-state.d.ts.map +1 -0
  248. package/dist/next/host/ref-state.js +83 -0
  249. package/dist/next/host/ref-state.js.map +1 -0
  250. package/dist/next/host/reference-keys.d.ts +36 -0
  251. package/dist/next/host/reference-keys.d.ts.map +1 -0
  252. package/dist/next/host/reference-keys.js +168 -0
  253. package/dist/next/host/reference-keys.js.map +1 -0
  254. package/dist/next/host/reference-source.d.ts +65 -0
  255. package/dist/next/host/reference-source.d.ts.map +1 -0
  256. package/dist/next/host/reference-source.js +285 -0
  257. package/dist/next/host/reference-source.js.map +1 -0
  258. package/dist/next/host/reference.d.ts +308 -0
  259. package/dist/next/host/reference.d.ts.map +1 -0
  260. package/dist/next/host/reference.js +775 -0
  261. package/dist/next/host/reference.js.map +1 -0
  262. package/dist/next/host/retry-on.d.ts +28 -0
  263. package/dist/next/host/retry-on.d.ts.map +1 -0
  264. package/dist/next/host/retry-on.js +52 -0
  265. package/dist/next/host/retry-on.js.map +1 -0
  266. package/dist/next/host/revocation.d.ts +16 -0
  267. package/dist/next/host/revocation.d.ts.map +1 -0
  268. package/dist/next/host/revocation.js +27 -0
  269. package/dist/next/host/revocation.js.map +1 -0
  270. package/dist/next/host/root.d.ts +27 -0
  271. package/dist/next/host/root.d.ts.map +1 -0
  272. package/dist/next/host/root.js +68 -0
  273. package/dist/next/host/root.js.map +1 -0
  274. package/dist/next/host/route.d.ts +64 -0
  275. package/dist/next/host/route.d.ts.map +1 -0
  276. package/dist/next/host/route.js +190 -0
  277. package/dist/next/host/route.js.map +1 -0
  278. package/dist/next/host/routines.d.ts +76 -0
  279. package/dist/next/host/routines.d.ts.map +1 -0
  280. package/dist/next/host/routines.js +350 -0
  281. package/dist/next/host/routines.js.map +1 -0
  282. package/dist/next/host/sleep.d.ts +9 -0
  283. package/dist/next/host/sleep.d.ts.map +1 -0
  284. package/dist/next/host/sleep.js +40 -0
  285. package/dist/next/host/sleep.js.map +1 -0
  286. package/dist/next/host/staging.d.ts +94 -0
  287. package/dist/next/host/staging.d.ts.map +1 -0
  288. package/dist/next/host/staging.js +302 -0
  289. package/dist/next/host/staging.js.map +1 -0
  290. package/dist/next/host/unbound.d.ts +30 -0
  291. package/dist/next/host/unbound.d.ts.map +1 -0
  292. package/dist/next/host/unbound.js +67 -0
  293. package/dist/next/host/unbound.js.map +1 -0
  294. package/dist/next/host/uuid.d.ts +3 -0
  295. package/dist/next/host/uuid.d.ts.map +1 -0
  296. package/dist/next/host/uuid.js +38 -0
  297. package/dist/next/host/uuid.js.map +1 -0
  298. package/dist/next/index.d.ts +28 -0
  299. package/dist/next/index.d.ts.map +1 -0
  300. package/dist/next/index.js +18 -0
  301. package/dist/next/index.js.map +1 -0
  302. package/dist/next/jobs/definition.d.ts +96 -0
  303. package/dist/next/jobs/definition.d.ts.map +1 -0
  304. package/dist/next/jobs/definition.js +83 -0
  305. package/dist/next/jobs/definition.js.map +1 -0
  306. package/dist/next/jobs/index.d.ts +5 -0
  307. package/dist/next/jobs/index.d.ts.map +1 -0
  308. package/dist/next/jobs/index.js +3 -0
  309. package/dist/next/jobs/index.js.map +1 -0
  310. package/dist/next/jobs/internal.d.ts +3 -0
  311. package/dist/next/jobs/internal.d.ts.map +1 -0
  312. package/dist/next/jobs/internal.js +4 -0
  313. package/dist/next/jobs/internal.js.map +1 -0
  314. package/dist/next/jobs/job.d.ts +152 -0
  315. package/dist/next/jobs/job.d.ts.map +1 -0
  316. package/dist/next/jobs/job.js +320 -0
  317. package/dist/next/jobs/job.js.map +1 -0
  318. package/dist/next/jobs/persisted.d.ts +38 -0
  319. package/dist/next/jobs/persisted.d.ts.map +1 -0
  320. package/dist/next/jobs/persisted.js +95 -0
  321. package/dist/next/jobs/persisted.js.map +1 -0
  322. package/dist/next/jobs/records.d.ts +231 -0
  323. package/dist/next/jobs/records.d.ts.map +1 -0
  324. package/dist/next/jobs/records.js +869 -0
  325. package/dist/next/jobs/records.js.map +1 -0
  326. package/dist/next/jobs/run-states.d.ts +69 -0
  327. package/dist/next/jobs/run-states.d.ts.map +1 -0
  328. package/dist/next/jobs/run-states.js +228 -0
  329. package/dist/next/jobs/run-states.js.map +1 -0
  330. package/dist/next/jobs/run.d.ts +113 -0
  331. package/dist/next/jobs/run.d.ts.map +1 -0
  332. package/dist/next/jobs/run.js +200 -0
  333. package/dist/next/jobs/run.js.map +1 -0
  334. package/dist/next/jobs/running.d.ts +44 -0
  335. package/dist/next/jobs/running.d.ts.map +1 -0
  336. package/dist/next/jobs/running.js +117 -0
  337. package/dist/next/jobs/running.js.map +1 -0
  338. package/dist/next/jobs/stored.d.ts +63 -0
  339. package/dist/next/jobs/stored.d.ts.map +1 -0
  340. package/dist/next/jobs/stored.js +55 -0
  341. package/dist/next/jobs/stored.js.map +1 -0
  342. package/dist/next/link/binary.d.ts +4 -0
  343. package/dist/next/link/binary.d.ts.map +1 -0
  344. package/dist/next/link/binary.js +534 -0
  345. package/dist/next/link/binary.js.map +1 -0
  346. package/dist/next/link/channel.d.ts +63 -0
  347. package/dist/next/link/channel.d.ts.map +1 -0
  348. package/dist/next/link/channel.js +202 -0
  349. package/dist/next/link/channel.js.map +1 -0
  350. package/dist/next/link/errors.d.ts +7 -0
  351. package/dist/next/link/errors.d.ts.map +1 -0
  352. package/dist/next/link/errors.js +21 -0
  353. package/dist/next/link/errors.js.map +1 -0
  354. package/dist/next/link/index.d.ts +8 -0
  355. package/dist/next/link/index.d.ts.map +1 -0
  356. package/dist/next/link/index.js +8 -0
  357. package/dist/next/link/index.js.map +1 -0
  358. package/dist/next/link/internal.d.ts +9 -0
  359. package/dist/next/link/internal.d.ts.map +1 -0
  360. package/dist/next/link/internal.js +10 -0
  361. package/dist/next/link/internal.js.map +1 -0
  362. package/dist/next/link/ipc.d.ts +22 -0
  363. package/dist/next/link/ipc.d.ts.map +1 -0
  364. package/dist/next/link/ipc.js +64 -0
  365. package/dist/next/link/ipc.js.map +1 -0
  366. package/dist/next/link/link.d.ts +34 -0
  367. package/dist/next/link/link.d.ts.map +1 -0
  368. package/dist/next/link/link.js +87 -0
  369. package/dist/next/link/link.js.map +1 -0
  370. package/dist/next/link/message.d.ts +249 -0
  371. package/dist/next/link/message.d.ts.map +1 -0
  372. package/dist/next/link/message.js +123 -0
  373. package/dist/next/link/message.js.map +1 -0
  374. package/dist/next/link/part.d.ts +80 -0
  375. package/dist/next/link/part.d.ts.map +1 -0
  376. package/dist/next/link/part.js +164 -0
  377. package/dist/next/link/part.js.map +1 -0
  378. package/dist/next/link/text.d.ts +6 -0
  379. package/dist/next/link/text.d.ts.map +1 -0
  380. package/dist/next/link/text.js +335 -0
  381. package/dist/next/link/text.js.map +1 -0
  382. package/dist/next/link/values.d.ts +40 -0
  383. package/dist/next/link/values.d.ts.map +1 -0
  384. package/dist/next/link/values.js +117 -0
  385. package/dist/next/link/values.js.map +1 -0
  386. package/dist/next/link/websocket.d.ts +26 -0
  387. package/dist/next/link/websocket.d.ts.map +1 -0
  388. package/dist/next/link/websocket.js +91 -0
  389. package/dist/next/link/websocket.js.map +1 -0
  390. package/dist/next/registries/contribution.d.ts +50 -0
  391. package/dist/next/registries/contribution.d.ts.map +1 -0
  392. package/dist/next/registries/contribution.js +129 -0
  393. package/dist/next/registries/contribution.js.map +1 -0
  394. package/dist/next/registries/entries.d.ts +18 -0
  395. package/dist/next/registries/entries.d.ts.map +1 -0
  396. package/dist/next/registries/entries.js +42 -0
  397. package/dist/next/registries/entries.js.map +1 -0
  398. package/dist/next/registries/index.d.ts +3 -0
  399. package/dist/next/registries/index.d.ts.map +1 -0
  400. package/dist/next/registries/index.js +5 -0
  401. package/dist/next/registries/index.js.map +1 -0
  402. package/dist/next/registries/internal.d.ts +4 -0
  403. package/dist/next/registries/internal.d.ts.map +1 -0
  404. package/dist/next/registries/internal.js +5 -0
  405. package/dist/next/registries/internal.js.map +1 -0
  406. package/dist/next/registries/record.d.ts +94 -0
  407. package/dist/next/registries/record.d.ts.map +1 -0
  408. package/dist/next/registries/record.js +253 -0
  409. package/dist/next/registries/record.js.map +1 -0
  410. package/dist/next/registries/registry.d.ts +74 -0
  411. package/dist/next/registries/registry.d.ts.map +1 -0
  412. package/dist/next/registries/registry.js +14 -0
  413. package/dist/next/registries/registry.js.map +1 -0
  414. package/dist/next/registries/value.d.ts +48 -0
  415. package/dist/next/registries/value.d.ts.map +1 -0
  416. package/dist/next/registries/value.js +199 -0
  417. package/dist/next/registries/value.js.map +1 -0
  418. package/dist/next/remote/calls.d.ts +25 -0
  419. package/dist/next/remote/calls.d.ts.map +1 -0
  420. package/dist/next/remote/calls.js +62 -0
  421. package/dist/next/remote/calls.js.map +1 -0
  422. package/dist/next/remote/consumer.d.ts +42 -0
  423. package/dist/next/remote/consumer.d.ts.map +1 -0
  424. package/dist/next/remote/consumer.js +343 -0
  425. package/dist/next/remote/consumer.js.map +1 -0
  426. package/dist/next/remote/hold.d.ts +130 -0
  427. package/dist/next/remote/hold.d.ts.map +1 -0
  428. package/dist/next/remote/hold.js +537 -0
  429. package/dist/next/remote/hold.js.map +1 -0
  430. package/dist/next/remote/host-link.d.ts +77 -0
  431. package/dist/next/remote/host-link.d.ts.map +1 -0
  432. package/dist/next/remote/host-link.js +182 -0
  433. package/dist/next/remote/host-link.js.map +1 -0
  434. package/dist/next/remote/internal.d.ts +6 -0
  435. package/dist/next/remote/internal.d.ts.map +1 -0
  436. package/dist/next/remote/internal.js +6 -0
  437. package/dist/next/remote/internal.js.map +1 -0
  438. package/dist/next/remote/path.d.ts +46 -0
  439. package/dist/next/remote/path.d.ts.map +1 -0
  440. package/dist/next/remote/path.js +73 -0
  441. package/dist/next/remote/path.js.map +1 -0
  442. package/dist/next/remote/provider.d.ts +76 -0
  443. package/dist/next/remote/provider.d.ts.map +1 -0
  444. package/dist/next/remote/provider.js +506 -0
  445. package/dist/next/remote/provider.js.map +1 -0
  446. package/dist/next/remote/relay.d.ts +58 -0
  447. package/dist/next/remote/relay.d.ts.map +1 -0
  448. package/dist/next/remote/relay.js +117 -0
  449. package/dist/next/remote/relay.js.map +1 -0
  450. package/dist/next/remote/remote-object.d.ts +133 -0
  451. package/dist/next/remote/remote-object.d.ts.map +1 -0
  452. package/dist/next/remote/remote-object.js +411 -0
  453. package/dist/next/remote/remote-object.js.map +1 -0
  454. package/dist/next/remote/replica.d.ts +59 -0
  455. package/dist/next/remote/replica.d.ts.map +1 -0
  456. package/dist/next/remote/replica.js +125 -0
  457. package/dist/next/remote/replica.js.map +1 -0
  458. package/dist/next/state/batch.d.ts +64 -0
  459. package/dist/next/state/batch.d.ts.map +1 -0
  460. package/dist/next/state/batch.js +163 -0
  461. package/dist/next/state/batch.js.map +1 -0
  462. package/dist/next/state/derive.d.ts +52 -0
  463. package/dist/next/state/derive.d.ts.map +1 -0
  464. package/dist/next/state/derive.js +182 -0
  465. package/dist/next/state/derive.js.map +1 -0
  466. package/dist/next/state/index.d.ts +6 -0
  467. package/dist/next/state/index.d.ts.map +1 -0
  468. package/dist/next/state/index.js +4 -0
  469. package/dist/next/state/index.js.map +1 -0
  470. package/dist/next/state/internal.d.ts +6 -0
  471. package/dist/next/state/internal.d.ts.map +1 -0
  472. package/dist/next/state/internal.js +8 -0
  473. package/dist/next/state/internal.js.map +1 -0
  474. package/dist/next/state/native-source.d.ts +106 -0
  475. package/dist/next/state/native-source.d.ts.map +1 -0
  476. package/dist/next/state/native-source.js +240 -0
  477. package/dist/next/state/native-source.js.map +1 -0
  478. package/dist/next/state/watchable.d.ts +114 -0
  479. package/dist/next/state/watchable.d.ts.map +1 -0
  480. package/dist/next/state/watchable.js +156 -0
  481. package/dist/next/state/watchable.js.map +1 -0
  482. package/dist/next/state/writable.d.ts +32 -0
  483. package/dist/next/state/writable.d.ts.map +1 -0
  484. package/dist/next/state/writable.js +49 -0
  485. package/dist/next/state/writable.js.map +1 -0
  486. package/dist/next/store/adapter.d.ts +67 -0
  487. package/dist/next/store/adapter.d.ts.map +1 -0
  488. package/dist/next/store/adapter.js +118 -0
  489. package/dist/next/store/adapter.js.map +1 -0
  490. package/dist/next/store/allocator.d.ts +17 -0
  491. package/dist/next/store/allocator.d.ts.map +1 -0
  492. package/dist/next/store/allocator.js +30 -0
  493. package/dist/next/store/allocator.js.map +1 -0
  494. package/dist/next/store/applier.d.ts +8 -0
  495. package/dist/next/store/applier.d.ts.map +1 -0
  496. package/dist/next/store/applier.js +375 -0
  497. package/dist/next/store/applier.js.map +1 -0
  498. package/dist/next/store/apply-batch.d.ts +12 -0
  499. package/dist/next/store/apply-batch.d.ts.map +1 -0
  500. package/dist/next/store/apply-batch.js +83 -0
  501. package/dist/next/store/apply-batch.js.map +1 -0
  502. package/dist/next/store/archive.d.ts +32 -0
  503. package/dist/next/store/archive.d.ts.map +1 -0
  504. package/dist/next/store/archive.js +129 -0
  505. package/dist/next/store/archive.js.map +1 -0
  506. package/dist/next/store/backend.d.ts +10 -0
  507. package/dist/next/store/backend.d.ts.map +1 -0
  508. package/dist/next/store/backend.js +15 -0
  509. package/dist/next/store/backend.js.map +1 -0
  510. package/dist/next/store/catalog.d.ts +24 -0
  511. package/dist/next/store/catalog.d.ts.map +1 -0
  512. package/dist/next/store/catalog.js +17 -0
  513. package/dist/next/store/catalog.js.map +1 -0
  514. package/dist/next/store/claims.d.ts +23 -0
  515. package/dist/next/store/claims.d.ts.map +1 -0
  516. package/dist/next/store/claims.js +65 -0
  517. package/dist/next/store/claims.js.map +1 -0
  518. package/dist/next/store/columns.d.ts +77 -0
  519. package/dist/next/store/columns.d.ts.map +1 -0
  520. package/dist/next/store/columns.js +77 -0
  521. package/dist/next/store/columns.js.map +1 -0
  522. package/dist/next/store/engine.d.ts +176 -0
  523. package/dist/next/store/engine.d.ts.map +1 -0
  524. package/dist/next/store/engine.js +283 -0
  525. package/dist/next/store/engine.js.map +1 -0
  526. package/dist/next/store/evaluate.d.ts +17 -0
  527. package/dist/next/store/evaluate.d.ts.map +1 -0
  528. package/dist/next/store/evaluate.js +128 -0
  529. package/dist/next/store/evaluate.js.map +1 -0
  530. package/dist/next/store/export.d.ts +17 -0
  531. package/dist/next/store/export.d.ts.map +1 -0
  532. package/dist/next/store/export.js +200 -0
  533. package/dist/next/store/export.js.map +1 -0
  534. package/dist/next/store/expression.d.ts +150 -0
  535. package/dist/next/store/expression.d.ts.map +1 -0
  536. package/dist/next/store/expression.js +268 -0
  537. package/dist/next/store/expression.js.map +1 -0
  538. package/dist/next/store/import.d.ts +10 -0
  539. package/dist/next/store/import.d.ts.map +1 -0
  540. package/dist/next/store/import.js +276 -0
  541. package/dist/next/store/import.js.map +1 -0
  542. package/dist/next/store/index.d.ts +16 -0
  543. package/dist/next/store/index.d.ts.map +1 -0
  544. package/dist/next/store/index.js +13 -0
  545. package/dist/next/store/index.js.map +1 -0
  546. package/dist/next/store/json-column.d.ts +33 -0
  547. package/dist/next/store/json-column.d.ts.map +1 -0
  548. package/dist/next/store/json-column.js +61 -0
  549. package/dist/next/store/json-column.js.map +1 -0
  550. package/dist/next/store/jsonl.d.ts +9 -0
  551. package/dist/next/store/jsonl.d.ts.map +1 -0
  552. package/dist/next/store/jsonl.js +61 -0
  553. package/dist/next/store/jsonl.js.map +1 -0
  554. package/dist/next/store/outbox.d.ts +26 -0
  555. package/dist/next/store/outbox.d.ts.map +1 -0
  556. package/dist/next/store/outbox.js +80 -0
  557. package/dist/next/store/outbox.js.map +1 -0
  558. package/dist/next/store/query.d.ts +39 -0
  559. package/dist/next/store/query.d.ts.map +1 -0
  560. package/dist/next/store/query.js +97 -0
  561. package/dist/next/store/query.js.map +1 -0
  562. package/dist/next/store/refusal.d.ts +15 -0
  563. package/dist/next/store/refusal.d.ts.map +1 -0
  564. package/dist/next/store/refusal.js +36 -0
  565. package/dist/next/store/refusal.js.map +1 -0
  566. package/dist/next/store/rows.d.ts +80 -0
  567. package/dist/next/store/rows.d.ts.map +1 -0
  568. package/dist/next/store/rows.js +183 -0
  569. package/dist/next/store/rows.js.map +1 -0
  570. package/dist/next/store/schema.d.ts +25 -0
  571. package/dist/next/store/schema.d.ts.map +1 -0
  572. package/dist/next/store/schema.js +115 -0
  573. package/dist/next/store/schema.js.map +1 -0
  574. package/dist/next/store/sql.d.ts +73 -0
  575. package/dist/next/store/sql.d.ts.map +1 -0
  576. package/dist/next/store/sql.js +234 -0
  577. package/dist/next/store/sql.js.map +1 -0
  578. package/dist/next/store/step.d.ts +48 -0
  579. package/dist/next/store/step.d.ts.map +1 -0
  580. package/dist/next/store/step.js +50 -0
  581. package/dist/next/store/step.js.map +1 -0
  582. package/dist/next/store/store.d.ts +161 -0
  583. package/dist/next/store/store.d.ts.map +1 -0
  584. package/dist/next/store/store.js +627 -0
  585. package/dist/next/store/store.js.map +1 -0
  586. package/dist/next/store/table-changes.d.ts +29 -0
  587. package/dist/next/store/table-changes.d.ts.map +1 -0
  588. package/dist/next/store/table-changes.js +102 -0
  589. package/dist/next/store/table-changes.js.map +1 -0
  590. package/dist/next/store/table-evolve.d.ts +74 -0
  591. package/dist/next/store/table-evolve.d.ts.map +1 -0
  592. package/dist/next/store/table-evolve.js +201 -0
  593. package/dist/next/store/table-evolve.js.map +1 -0
  594. package/dist/next/store/table-handle.d.ts +67 -0
  595. package/dist/next/store/table-handle.d.ts.map +1 -0
  596. package/dist/next/store/table-handle.js +101 -0
  597. package/dist/next/store/table-handle.js.map +1 -0
  598. package/dist/next/store/table-history.d.ts +75 -0
  599. package/dist/next/store/table-history.d.ts.map +1 -0
  600. package/dist/next/store/table-history.js +42 -0
  601. package/dist/next/store/table-history.js.map +1 -0
  602. package/dist/next/store/table-migration.d.ts +16 -0
  603. package/dist/next/store/table-migration.d.ts.map +1 -0
  604. package/dist/next/store/table-migration.js +202 -0
  605. package/dist/next/store/table-migration.js.map +1 -0
  606. package/dist/next/store/table-writes.d.ts +125 -0
  607. package/dist/next/store/table-writes.d.ts.map +1 -0
  608. package/dist/next/store/table-writes.js +165 -0
  609. package/dist/next/store/table-writes.js.map +1 -0
  610. package/dist/next/store/table.d.ts +80 -0
  611. package/dist/next/store/table.d.ts.map +1 -0
  612. package/dist/next/store/table.js +103 -0
  613. package/dist/next/store/table.js.map +1 -0
  614. package/dist/next/store/text.d.ts +14 -0
  615. package/dist/next/store/text.d.ts.map +1 -0
  616. package/dist/next/store/text.js +51 -0
  617. package/dist/next/store/text.js.map +1 -0
  618. package/dist/next/store/writes.d.ts +5 -0
  619. package/dist/next/store/writes.d.ts.map +1 -0
  620. package/dist/next/store/writes.js +4 -0
  621. package/dist/next/store/writes.js.map +1 -0
  622. package/dist/next-node/compression.d.ts +7 -0
  623. package/dist/next-node/compression.d.ts.map +1 -0
  624. package/dist/next-node/compression.js +24 -0
  625. package/dist/next-node/compression.js.map +1 -0
  626. package/dist/next-node/http/admission.d.ts +63 -0
  627. package/dist/next-node/http/admission.d.ts.map +1 -0
  628. package/dist/next-node/http/admission.js +134 -0
  629. package/dist/next-node/http/admission.js.map +1 -0
  630. package/dist/next-node/http/authenticate.d.ts +21 -0
  631. package/dist/next-node/http/authenticate.d.ts.map +1 -0
  632. package/dist/next-node/http/authenticate.js +34 -0
  633. package/dist/next-node/http/authenticate.js.map +1 -0
  634. package/dist/next-node/http/cookies.d.ts +24 -0
  635. package/dist/next-node/http/cookies.d.ts.map +1 -0
  636. package/dist/next-node/http/cookies.js +62 -0
  637. package/dist/next-node/http/cookies.js.map +1 -0
  638. package/dist/next-node/http/file.d.ts +23 -0
  639. package/dist/next-node/http/file.d.ts.map +1 -0
  640. package/dist/next-node/http/file.js +94 -0
  641. package/dist/next-node/http/file.js.map +1 -0
  642. package/dist/next-node/http/headers.d.ts +37 -0
  643. package/dist/next-node/http/headers.d.ts.map +1 -0
  644. package/dist/next-node/http/headers.js +129 -0
  645. package/dist/next-node/http/headers.js.map +1 -0
  646. package/dist/next-node/http/http.d.ts +100 -0
  647. package/dist/next-node/http/http.d.ts.map +1 -0
  648. package/dist/next-node/http/http.js +462 -0
  649. package/dist/next-node/http/http.js.map +1 -0
  650. package/dist/next-node/http/incoming.d.ts +19 -0
  651. package/dist/next-node/http/incoming.d.ts.map +1 -0
  652. package/dist/next-node/http/incoming.js +31 -0
  653. package/dist/next-node/http/incoming.js.map +1 -0
  654. package/dist/next-node/http/index.d.ts +11 -0
  655. package/dist/next-node/http/index.d.ts.map +1 -0
  656. package/dist/next-node/http/index.js +12 -0
  657. package/dist/next-node/http/index.js.map +1 -0
  658. package/dist/next-node/http/node.d.ts +78 -0
  659. package/dist/next-node/http/node.d.ts.map +1 -0
  660. package/dist/next-node/http/node.js +291 -0
  661. package/dist/next-node/http/node.js.map +1 -0
  662. package/dist/next-node/http/request.d.ts +54 -0
  663. package/dist/next-node/http/request.d.ts.map +1 -0
  664. package/dist/next-node/http/request.js +116 -0
  665. package/dist/next-node/http/request.js.map +1 -0
  666. package/dist/next-node/http/response.d.ts +63 -0
  667. package/dist/next-node/http/response.d.ts.map +1 -0
  668. package/dist/next-node/http/response.js +202 -0
  669. package/dist/next-node/http/response.js.map +1 -0
  670. package/dist/next-node/http/router.d.ts +114 -0
  671. package/dist/next-node/http/router.d.ts.map +1 -0
  672. package/dist/next-node/http/router.js +261 -0
  673. package/dist/next-node/http/router.js.map +1 -0
  674. package/dist/next-node/http/upgrades.d.ts +58 -0
  675. package/dist/next-node/http/upgrades.d.ts.map +1 -0
  676. package/dist/next-node/http/upgrades.js +184 -0
  677. package/dist/next-node/http/upgrades.js.map +1 -0
  678. package/dist/next-node/plugins/build.d.ts +57 -0
  679. package/dist/next-node/plugins/build.d.ts.map +1 -0
  680. package/dist/next-node/plugins/build.js +334 -0
  681. package/dist/next-node/plugins/build.js.map +1 -0
  682. package/dist/next-node/plugins/discover.d.ts +36 -0
  683. package/dist/next-node/plugins/discover.d.ts.map +1 -0
  684. package/dist/next-node/plugins/discover.js +91 -0
  685. package/dist/next-node/plugins/discover.js.map +1 -0
  686. package/dist/next-node/plugins/evaluate.d.ts +33 -0
  687. package/dist/next-node/plugins/evaluate.d.ts.map +1 -0
  688. package/dist/next-node/plugins/evaluate.js +98 -0
  689. package/dist/next-node/plugins/evaluate.js.map +1 -0
  690. package/dist/next-node/plugins/index.d.ts +9 -0
  691. package/dist/next-node/plugins/index.d.ts.map +1 -0
  692. package/dist/next-node/plugins/index.js +11 -0
  693. package/dist/next-node/plugins/index.js.map +1 -0
  694. package/dist/next-node/plugins/install.d.ts +13 -0
  695. package/dist/next-node/plugins/install.d.ts.map +1 -0
  696. package/dist/next-node/plugins/install.js +37 -0
  697. package/dist/next-node/plugins/install.js.map +1 -0
  698. package/dist/next-node/plugins/plugins.d.ts +135 -0
  699. package/dist/next-node/plugins/plugins.d.ts.map +1 -0
  700. package/dist/next-node/plugins/plugins.js +206 -0
  701. package/dist/next-node/plugins/plugins.js.map +1 -0
  702. package/dist/next-node/plugins/runtime.d.ts +41 -0
  703. package/dist/next-node/plugins/runtime.d.ts.map +1 -0
  704. package/dist/next-node/plugins/runtime.js +136 -0
  705. package/dist/next-node/plugins/runtime.js.map +1 -0
  706. package/dist/next-node/plugins/stack.d.ts +16 -0
  707. package/dist/next-node/plugins/stack.d.ts.map +1 -0
  708. package/dist/next-node/plugins/stack.js +61 -0
  709. package/dist/next-node/plugins/stack.js.map +1 -0
  710. package/dist/next-node/plugins/watcher.d.ts +58 -0
  711. package/dist/next-node/plugins/watcher.d.ts.map +1 -0
  712. package/dist/next-node/plugins/watcher.js +281 -0
  713. package/dist/next-node/plugins/watcher.js.map +1 -0
  714. package/dist/next-node/workers/control.d.ts +83 -0
  715. package/dist/next-node/workers/control.d.ts.map +1 -0
  716. package/dist/next-node/workers/control.js +77 -0
  717. package/dist/next-node/workers/control.js.map +1 -0
  718. package/dist/next-node/workers/index.d.ts +5 -0
  719. package/dist/next-node/workers/index.d.ts.map +1 -0
  720. package/dist/next-node/workers/index.js +7 -0
  721. package/dist/next-node/workers/index.js.map +1 -0
  722. package/dist/next-node/workers/lock.d.ts +21 -0
  723. package/dist/next-node/workers/lock.d.ts.map +1 -0
  724. package/dist/next-node/workers/lock.js +137 -0
  725. package/dist/next-node/workers/lock.js.map +1 -0
  726. package/dist/next-node/workers/main.d.ts +46 -0
  727. package/dist/next-node/workers/main.d.ts.map +1 -0
  728. package/dist/next-node/workers/main.js +230 -0
  729. package/dist/next-node/workers/main.js.map +1 -0
  730. package/dist/next-node/workers/process.d.ts +42 -0
  731. package/dist/next-node/workers/process.d.ts.map +1 -0
  732. package/dist/next-node/workers/process.js +125 -0
  733. package/dist/next-node/workers/process.js.map +1 -0
  734. package/dist/next-node/workers/workers.d.ts +80 -0
  735. package/dist/next-node/workers/workers.d.ts.map +1 -0
  736. package/dist/next-node/workers/workers.js +572 -0
  737. package/dist/next-node/workers/workers.js.map +1 -0
  738. package/dist/object.d.ts +4 -4
  739. package/dist/object.d.ts.map +1 -1
  740. package/dist/object.js +3 -4
  741. package/dist/object.js.map +1 -1
  742. package/dist/output.d.ts +9 -3
  743. package/dist/output.d.ts.map +1 -1
  744. package/dist/output.js +21 -9
  745. package/dist/output.js.map +1 -1
  746. package/dist/remote.d.ts.map +1 -1
  747. package/dist/remote.js +2 -2
  748. package/dist/remote.js.map +1 -1
  749. package/dist/schema.d.ts +8 -4
  750. package/dist/schema.d.ts.map +1 -1
  751. package/dist/schema.js +180 -5
  752. package/dist/schema.js.map +1 -1
  753. package/dist/sqlite/cloudflare.d.ts +54 -0
  754. package/dist/sqlite/cloudflare.d.ts.map +1 -0
  755. package/dist/sqlite/cloudflare.js +144 -0
  756. package/dist/sqlite/cloudflare.js.map +1 -0
  757. package/dist/sqlite/database.d.ts +40 -0
  758. package/dist/sqlite/database.d.ts.map +1 -0
  759. package/dist/sqlite/database.js +2 -0
  760. package/dist/sqlite/database.js.map +1 -0
  761. package/dist/sqlite/index.d.ts +4 -0
  762. package/dist/sqlite/index.d.ts.map +1 -0
  763. package/dist/sqlite/index.js +3 -0
  764. package/dist/sqlite/index.js.map +1 -0
  765. package/dist/sqlite/migrations.d.ts +10 -0
  766. package/dist/sqlite/migrations.d.ts.map +1 -0
  767. package/dist/sqlite/migrations.js +33 -0
  768. package/dist/sqlite/migrations.js.map +1 -0
  769. package/dist/sqlite/node.d.ts +41 -0
  770. package/dist/sqlite/node.d.ts.map +1 -0
  771. package/dist/sqlite/node.js +191 -0
  772. package/dist/sqlite/node.js.map +1 -0
  773. package/dist/sqlite/schema.d.ts +3 -0
  774. package/dist/sqlite/schema.d.ts.map +1 -0
  775. package/dist/sqlite/schema.js +10 -0
  776. package/dist/sqlite/schema.js.map +1 -0
  777. package/dist/telemetry-sqlite/index.d.ts +24 -0
  778. package/dist/telemetry-sqlite/index.d.ts.map +1 -0
  779. package/dist/telemetry-sqlite/index.js +273 -0
  780. package/dist/telemetry-sqlite/index.js.map +1 -0
  781. package/dist/telemetry-sqlite/store.d.ts +9 -0
  782. package/dist/telemetry-sqlite/store.d.ts.map +1 -0
  783. package/dist/telemetry-sqlite/store.js +110 -0
  784. package/dist/telemetry-sqlite/store.js.map +1 -0
  785. package/dist/watch.d.ts +194 -0
  786. package/dist/watch.d.ts.map +1 -0
  787. package/dist/watch.js +383 -0
  788. package/dist/watch.js.map +1 -0
  789. package/dist/wire.d.ts +174 -193
  790. package/dist/wire.d.ts.map +1 -1
  791. package/dist/wire.js +81 -80
  792. package/dist/wire.js.map +1 -1
  793. package/docs/guide.md +15 -15
  794. package/docs/next/benchmarks.md +959 -0
  795. package/docs/next/decisions.md +2957 -0
  796. package/docs/next/dependencies/book.md +1671 -0
  797. package/docs/next/dependencies/index.html +2641 -0
  798. package/docs/next/dependencies/model.md +330 -0
  799. package/docs/next/design.md +2554 -0
  800. package/docs/next/durable-observers/book.md +432 -0
  801. package/docs/next/durable-observers/index.html +517 -0
  802. package/docs/next/flow-control/book.md +333 -0
  803. package/docs/next/flow-control/fold/index.html +265 -0
  804. package/docs/next/flow-control/index.html +548 -0
  805. package/docs/next/flow-control/window/index.html +228 -0
  806. package/docs/next/guide-plugins-hosts/book.md +607 -0
  807. package/docs/next/guide-plugins-hosts/index.html +652 -0
  808. package/docs/next/http-workers/book.md +378 -0
  809. package/docs/next/http-workers/index.html +515 -0
  810. package/docs/next/layer-1.md +311 -0
  811. package/docs/next/layer-2.md +216 -0
  812. package/docs/next/plugin-model/book.md +186 -0
  813. package/docs/next/plugin-model/index.html +310 -0
  814. package/docs/next/plugin-primer/book.md +273 -0
  815. package/docs/next/plugin-primer/index.html +430 -0
  816. package/docs/next/slice-1.md +236 -0
  817. package/docs/next/slice-10.md +285 -0
  818. package/docs/next/slice-11.md +93 -0
  819. package/docs/next/slice-2.md +174 -0
  820. package/docs/next/slice-3a.md +296 -0
  821. package/docs/next/slice-3b.md +197 -0
  822. package/docs/next/slice-4.md +146 -0
  823. package/docs/next/slice-4a.md +418 -0
  824. package/docs/next/slice-4b.md +208 -0
  825. package/docs/next/slice-5.md +281 -0
  826. package/docs/next/slice-6a.md +676 -0
  827. package/docs/next/slice-6b.md +332 -0
  828. package/docs/next/slice-7a.md +130 -0
  829. package/docs/next/slice-7b/book.md +608 -0
  830. package/docs/next/slice-7b/index.html +842 -0
  831. package/docs/next/slice-7b.md +255 -0
  832. package/docs/next/slice-7c.md +165 -0
  833. package/docs/next/slice-8.md +194 -0
  834. package/docs/next/slices.md +230 -0
  835. package/docs/next/store/book.md +665 -0
  836. package/docs/next/store/index.html +861 -0
  837. package/docs/next/store/walkthrough.md +193 -0
  838. package/docs/spec.md +9 -9
  839. package/docs/tutorial.md +26 -25
  840. package/package.json +42 -5
  841. package/src/delta/README.md +69 -0
@@ -0,0 +1,375 @@
1
+ // The applier (slice 6a §13, slice 6b §1.6): recorded writes applied as they were recorded, inside a backend
2
+ // transaction, checked against the store's own records (a trust boundary: archives, a replica's batches). One code
3
+ // path for import, bootstrap and batch apply, for every write kind; a recorded count the store does not reproduce
4
+ // stops applying (`Diverged`, S17).
5
+ import { checkName } from "../contracts/internal.js";
6
+ import { invalid } from "../data/internal.js";
7
+ import { COLUMN_NAME } from "./columns.js";
8
+ import { insertDocument, insertRevision, readDocument, retireRecord, writeContent, } from "./engine.js";
9
+ import { checkScalar, ROW_VERSION, toSqlite, versionColumn } from "./rows.js";
10
+ import { recordedPut, TableSql } from "./sql.js";
11
+ import { INDEX_NAME } from "./table.js";
12
+ import { applyAlter, applyDropIndex, applyIndex, applyTable } from "./table-writes.js";
13
+ /** A recorded write the store does not reproduce (a count, a revision): applying stops, the store diverged (S17). */
14
+ export class Diverged extends Error {
15
+ }
16
+ /** Applies `write` in `step`; a write the records refuse throws `invalid/args`, one they do not reproduce `Diverged`. */
17
+ export async function applyWrite(step, write, what) {
18
+ switch (write.kind) {
19
+ case "table":
20
+ checkTable(write, what);
21
+ await applyTable(step, write);
22
+ return;
23
+ case "index":
24
+ checkIndex(recordOf(step, write.table, what), write, what);
25
+ await applyIndex(step, write);
26
+ return;
27
+ case "dropIndex":
28
+ if (!Object.hasOwn(recordOf(step, write.table, what).indexes, write.name)) {
29
+ throw invalid("args", `${what}: no index ${JSON.stringify(write.name)}`);
30
+ }
31
+ await applyDropIndex(step, write);
32
+ return;
33
+ case "alter":
34
+ checkAlter(recordOf(step, write.table, what), write, what);
35
+ await applyAlter(step, write);
36
+ return;
37
+ case "put": {
38
+ const record = recordOf(step, write.table, what);
39
+ const { sql, physical } = recordedPut(write.table, record.columns);
40
+ await step.run(sql, ...putParams(record, write, physical, what));
41
+ return;
42
+ }
43
+ case "update":
44
+ case "delete":
45
+ case "updateWhere":
46
+ case "deleteWhere":
47
+ return applyCounted(step, write, what);
48
+ default:
49
+ return applyDocument(step, write, what);
50
+ }
51
+ }
52
+ /** Applies a document write: a creation, a change or a retirement on its recorded revision, an archive's revision. */
53
+ async function applyDocument(step, write, what) {
54
+ switch (write.kind) {
55
+ case "document.create":
56
+ await insertDocument(step, write.record, write.base === undefined ? undefined : json(write.base.value, what));
57
+ return;
58
+ case "document.revision": {
59
+ const { content } = write;
60
+ await insertRevision(step, write.id, write.seq, content.kind, content.version, contentText(content, what));
61
+ return;
62
+ }
63
+ case "document.change": {
64
+ const record = await liveAt(step, write.id, write.revision, what);
65
+ const { content } = write;
66
+ const text = contentText(content, what);
67
+ await writeContent(step, write.id, record.history, write.revision, content, text);
68
+ return;
69
+ }
70
+ case "document.retire":
71
+ await retireRecord(step, await liveAt(step, write.id, write.revision, what));
72
+ return;
73
+ }
74
+ }
75
+ /** A content's stored text: a base's value or a delta's ops, checked as JSON. */
76
+ function contentText(content, what) {
77
+ return json(content.kind === "base" ? content.value : content.ops, what);
78
+ }
79
+ /** The live record `id` at `revision`; another revision, or none, is a divergence. */
80
+ async function liveAt(step, id, revision, what) {
81
+ const record = await readDocument(step, id);
82
+ if (record === undefined || record.retiredAt !== undefined || record.revision !== revision) {
83
+ throw new Diverged(`${what}: document ${id} is not live at revision ${revision}`);
84
+ }
85
+ return record;
86
+ }
87
+ /** `value` serialized; one `JSON.stringify` cannot encode is refused. */
88
+ function json(value, what) {
89
+ let text;
90
+ try {
91
+ text = JSON.stringify(value);
92
+ }
93
+ catch (error) {
94
+ throw invalid("args", `${what}: not JSON (${String(error)})`);
95
+ }
96
+ if (text === undefined)
97
+ throw invalid("args", `${what}: not JSON`);
98
+ return text;
99
+ }
100
+ /**
101
+ * Applies a counted table write: its statement rendered from the record's columns and the recorded `key`, `where` and
102
+ * `set` (checked: only recorded columns, well-formed nodes), and its count compared with the recorded one.
103
+ */
104
+ async function applyCounted(step, write, what) {
105
+ const record = recordOf(step, write.table, what);
106
+ const columns = Object.entries(record.columns).map(([name, column]) => ({ name, type: column.type }));
107
+ const sql = new TableSql(write.table, columns, [], record.key);
108
+ let statement;
109
+ switch (write.kind) {
110
+ case "update":
111
+ statement = sql.update(setOf(record, write, what), keyParams(record, write.key, what), versionsOf(record, write, what));
112
+ break;
113
+ case "delete":
114
+ statement = { sql: sql.delete, params: keyParams(record, write.key, what) };
115
+ break;
116
+ case "updateWhere":
117
+ checkWhere(record, write.where, what);
118
+ statement = sql.updateWhere(write.where, setOf(record, write, what), versionsOf(record, write, what));
119
+ break;
120
+ case "deleteWhere":
121
+ checkWhere(record, write.where, what);
122
+ statement = sql.deleteWhere(write.where);
123
+ break;
124
+ }
125
+ const count = await step.runCounted(statement.sql, ...statement.params);
126
+ if (count !== write.count)
127
+ throw new Diverged(`${what}: changed ${count} rows, recorded ${write.count}`);
128
+ }
129
+ /** The recorded key as parameters in key order: exactly the key columns, each of its type. */
130
+ function keyParams(record, key, what) {
131
+ if (Object.keys(key).length !== record.key.length)
132
+ throw invalid("args", `${what}: not a key of ${record.table}`);
133
+ return record.key.map((name) => {
134
+ if (!Object.hasOwn(key, name))
135
+ throw invalid("args", `${what}: key column ${JSON.stringify(name)} is missing`);
136
+ return toSqlite(checkScalar(scalarType(record.columns[name]), key[name], `${what}: key`));
137
+ });
138
+ }
139
+ /** A recorded `set` with the migration stamp `$v` when it carries one; key columns never change (rule 13). */
140
+ function setOf(record, write, what) {
141
+ const { set } = write;
142
+ if (typeof set !== "object" || set === null || Object.keys(set).length === 0) {
143
+ throw invalid("args", `${what}: an empty or malformed set`);
144
+ }
145
+ for (const [column, node] of Object.entries(set)) {
146
+ if (!Object.hasOwn(record.columns, column) || record.key.includes(column)) {
147
+ throw invalid("args", `${what}: set writes ${JSON.stringify(column)}, no non-key column`);
148
+ }
149
+ checkExpr(record, node, what);
150
+ }
151
+ return write.version === undefined ? set : { ...set, [ROW_VERSION]: write.version };
152
+ }
153
+ /** The `json(...)` versions a `set` stamps: the recorded ones, of `json(...)` columns it sets, up to theirs. */
154
+ function versionsOf(record, write, what) {
155
+ const versions = new Map();
156
+ for (const [name, column] of Object.entries(record.columns)) {
157
+ if (column.type !== "json" || !Object.hasOwn(write.set, name))
158
+ continue;
159
+ // A clear stamps `NULL` whatever the version; a value stamps its recorded version.
160
+ const version = write.columns[name] ?? column.version;
161
+ if (!Number.isSafeInteger(version) || version < 1 || version > column.version) {
162
+ throw invalid("args", `${what}: no readable version for ${JSON.stringify(name)}`);
163
+ }
164
+ versions.set(name, version);
165
+ }
166
+ return versions;
167
+ }
168
+ /** A scalar column's type; `json(...)` columns are not scalars. */
169
+ function scalarType(column) {
170
+ return column.type === "json" ? "str" : column.type;
171
+ }
172
+ const COMPARISONS = ["eq", "ne", "lt", "lte", "gt", "gte"];
173
+ /** A recorded condition: well-formed nodes over recorded scalar columns (and the row's `$v`). */
174
+ function checkWhere(record, node, what) {
175
+ const refuse = () => {
176
+ throw invalid("args", `${what}: a malformed condition`);
177
+ };
178
+ if (typeof node !== "object" || node === null || Object.keys(node).length !== 1)
179
+ return refuse();
180
+ const [[op, operand]] = Object.entries(node);
181
+ const column = (name) => {
182
+ if (name === ROW_VERSION)
183
+ return;
184
+ if (typeof name !== "string" || record.columns[name] === undefined || record.columns[name].type === "json") {
185
+ refuse();
186
+ }
187
+ };
188
+ if (op === "and" || op === "or") {
189
+ if (!Array.isArray(operand))
190
+ return refuse();
191
+ for (const each of operand)
192
+ checkWhere(record, each, what);
193
+ }
194
+ else if (op === "not")
195
+ checkWhere(record, operand, what);
196
+ else if (op === "isNull")
197
+ column(operand);
198
+ else if (op === "inArray" || op === "prefix" || COMPARISONS.includes(op)) {
199
+ if (!Array.isArray(operand) || operand.length !== 2)
200
+ return refuse();
201
+ column(operand[0]);
202
+ const values = op === "inArray" ? operand[1] : [operand[1]];
203
+ if (!Array.isArray(values))
204
+ return refuse();
205
+ for (const value of values)
206
+ if (!isScalar(value) || (op === "prefix" && typeof value !== "string"))
207
+ refuse();
208
+ }
209
+ else
210
+ refuse();
211
+ }
212
+ const OPERATIONS = ["add", "sub", "max", "min", "concat", "coalesce"];
213
+ /** A recorded expression: scalars, `null`, JSON literals, recorded columns and the vocabulary's operations. */
214
+ function checkExpr(record, node, what) {
215
+ if (node === null || isScalar(node))
216
+ return;
217
+ const refuse = () => {
218
+ throw invalid("args", `${what}: a malformed expression`);
219
+ };
220
+ if (typeof node !== "object" || Object.keys(node).length !== 1)
221
+ return refuse();
222
+ const [[op, operand]] = Object.entries(node);
223
+ if (op === "col") {
224
+ if (typeof operand !== "string" || !Object.hasOwn(record.columns, operand))
225
+ refuse();
226
+ return;
227
+ }
228
+ if (op === "json")
229
+ return;
230
+ if (!Array.isArray(operand))
231
+ return refuse();
232
+ if (OPERATIONS.includes(op) && operand.length === 2) {
233
+ for (const each of operand)
234
+ checkExpr(record, each, what);
235
+ }
236
+ else if (op === "replacePrefix" && operand.length === 3) {
237
+ checkExpr(record, operand[0], what);
238
+ if (typeof operand[1] !== "string" || typeof operand[2] !== "string")
239
+ refuse();
240
+ }
241
+ else if (op === "when" && operand.length === 3) {
242
+ checkWhere(record, operand[0], what);
243
+ checkExpr(record, operand[1], what);
244
+ checkExpr(record, operand[2], what);
245
+ }
246
+ else
247
+ refuse();
248
+ }
249
+ function isScalar(value) {
250
+ return (typeof value === "string" || typeof value === "boolean" || (typeof value === "number" && Number.isFinite(value)));
251
+ }
252
+ /** A recorded table's SQL name (two names joined by `:`, R2), columns, key and json versions, by the name rules. */
253
+ function checkTable(write, what) {
254
+ const parts = write.table.split(":");
255
+ if (parts.length !== 2)
256
+ throw invalid("args", `${what}: table ${JSON.stringify(write.table)}: not owner:table`);
257
+ try {
258
+ for (const part of parts)
259
+ checkName(part, `${what}: table name part`);
260
+ }
261
+ catch (error) {
262
+ // `checkName` throws plain Errors.
263
+ throw invalid("args", error.message);
264
+ }
265
+ const folded = new Set();
266
+ for (const [name, column] of Object.entries(write.columns)) {
267
+ const where = `${what}: column ${JSON.stringify(name)}`;
268
+ if (!COLUMN_NAME.test(name) || folded.has(name.toLowerCase()))
269
+ throw invalid("args", `${where}: not a column name`);
270
+ folded.add(name.toLowerCase());
271
+ checkColumn(column, where);
272
+ }
273
+ if (write.key.length === 0)
274
+ throw invalid("args", `${what}: the key has no column`);
275
+ checkOrderColumns(write.columns, write.key, `${what}: the key`);
276
+ }
277
+ function checkColumn(column, what) {
278
+ const json = column.type === "json";
279
+ if (json !== (column.version !== undefined) || json !== (column.fingerprint !== undefined)) {
280
+ throw invalid("args", `${what}: a json(...) column has a version and a fingerprint, no other column has`);
281
+ }
282
+ if (column.default === undefined)
283
+ return;
284
+ if (json || column.optional)
285
+ throw invalid("args", `${what}: only a non-opt scalar column has a default`);
286
+ checkScalar(column.type, column.default, `${what}: the default`);
287
+ }
288
+ /** A recorded column edit of `record`'s next version or its own (the edits after a data step). */
289
+ function checkAlter(record, write, what) {
290
+ if (write.version !== record.version && write.version !== record.version + 1) {
291
+ throw invalid("args", `${what}: an edit of version ${write.version} on version ${record.version}`);
292
+ }
293
+ const { edit } = write;
294
+ const has = (name) => Object.hasOwn(record.columns, name);
295
+ const fresh = (name) => COLUMN_NAME.test(name) && !Object.keys(record.columns).some((each) => each.toLowerCase() === name.toLowerCase());
296
+ const indexed = (name) => record.key.includes(name) || Object.values(record.indexes).some((columns) => columns.includes(name));
297
+ const valid = edit.kind === "rename"
298
+ ? has(edit.from) && fresh(edit.to)
299
+ : edit.kind === "add"
300
+ ? fresh(edit.name) && (edit.column.optional === true || edit.column.default !== undefined)
301
+ : edit.kind === "drop"
302
+ ? has(edit.name) && !indexed(edit.name)
303
+ : has(edit.name) && record.columns[edit.name].type === "json" && edit.column.type === "json";
304
+ if (!valid)
305
+ throw invalid("args", `${what}: an ${edit.kind} edit the table cannot take`);
306
+ if (edit.kind === "add" || edit.kind === "json")
307
+ checkColumn(edit.column, `${what}: column ${JSON.stringify(edit.name)}`);
308
+ }
309
+ /** `names` are distinct, recorded, non-`opt` `str` or `int` columns. */
310
+ function checkOrderColumns(columns, names, what) {
311
+ if (new Set(names).size !== names.length)
312
+ throw invalid("args", `${what}: a column occurs twice`);
313
+ for (const name of names) {
314
+ const column = Object.hasOwn(columns, name) ? columns[name] : undefined;
315
+ if (column === undefined || column.optional || (column.type !== "str" && column.type !== "int")) {
316
+ throw invalid("args", `${what}: ${JSON.stringify(name)} is not a non-opt str or int column`);
317
+ }
318
+ }
319
+ }
320
+ function checkIndex(record, write, what) {
321
+ if (!INDEX_NAME.test(write.name) || Object.hasOwn(record.indexes, write.name)) {
322
+ throw invalid("args", `${what}: index ${JSON.stringify(write.name)}: not a new index name`);
323
+ }
324
+ checkOrderColumns(record.columns, write.columns, `${what}: index ${write.name}`);
325
+ }
326
+ /** The record of `table` in `step`; a write for a table not recorded is refused. */
327
+ function recordOf(step, table, what) {
328
+ const record = step.table(table);
329
+ if (record === undefined)
330
+ throw invalid("args", `${what}: table ${JSON.stringify(table)} is not recorded`);
331
+ return record;
332
+ }
333
+ /**
334
+ * The parameters of a `put` in `physical` order, checked against the recorded columns: every non-`opt` column, no
335
+ * other field, values of their types, `json(...)` cells as JSON (no plugin code runs) with a version up to the
336
+ * column's, and `version` up to the table's.
337
+ */
338
+ function putParams(record, write, physical, what) {
339
+ const { row, columns: versions, version } = write;
340
+ for (const field of Object.keys(row)) {
341
+ if (!Object.hasOwn(record.columns, field))
342
+ throw invalid("args", `${what}: unknown column ${JSON.stringify(field)}`);
343
+ }
344
+ for (const field of Object.keys(versions)) {
345
+ if (record.columns[field]?.type !== "json" || !Object.hasOwn(row, field)) {
346
+ throw invalid("args", `${what}: a version for ${JSON.stringify(field)}, which is no json(...) cell of the row`);
347
+ }
348
+ }
349
+ if (version > record.version) {
350
+ throw invalid("args", `${what}: version ${version} is newer than the table's version ${record.version}`);
351
+ }
352
+ const cells = new Map();
353
+ for (const [name, column] of Object.entries(record.columns)) {
354
+ const where = `${what}: column ${JSON.stringify(name)}`;
355
+ const value = row[name];
356
+ // A row has no explicit `null`: an absent field is `NULL`; a `json(...)` cell's `null` is the JSON value.
357
+ if (column.type === "json" ? !Object.hasOwn(row, name) : value === undefined) {
358
+ if (!column.optional)
359
+ throw invalid("args", `${where} is missing`);
360
+ cells.set(name, null);
361
+ continue;
362
+ }
363
+ if (column.type !== "json") {
364
+ cells.set(name, toSqlite(checkScalar(column.type, value, where)));
365
+ continue;
366
+ }
367
+ const version = versions[name];
368
+ if (version === undefined || version > column.version)
369
+ throw invalid("args", `${where}: no readable version`);
370
+ cells.set(name, json(value, where));
371
+ cells.set(versionColumn(name), version);
372
+ }
373
+ return physical.map((name) => (name === ROW_VERSION ? version : (cells.get(name) ?? null)));
374
+ }
375
+ //# sourceMappingURL=applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applier.js","sourceRoot":"","sources":["../../../src/next/store/applier.ts"],"names":[],"mappings":"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","sourcesContent":["// The applier (slice 6a §13, slice 6b §1.6): recorded writes applied as they were recorded, inside a backend\n// transaction, checked against the store's own records (a trust boundary: archives, a replica's batches). One code\n// path for import, bootstrap and batch apply, for every write kind; a recorded count the store does not reproduce\n// stops applying (`Diverged`, S17).\n\nimport type { SqliteValue } from \"../../sqlite/index.ts\";\nimport { checkName } from \"../contracts/internal.ts\";\nimport { invalid } from \"../data/internal.ts\";\nimport type { TableRecord } from \"./catalog.ts\";\nimport { COLUMN_NAME, type ColumnRecord } from \"./columns.ts\";\nimport {\n\ttype DocumentContent,\n\ttype DocumentRecord,\n\ttype DocumentWrite,\n\tinsertDocument,\n\tinsertRevision,\n\ttype RevisionContent,\n\treadDocument,\n\tretireRecord,\n\twriteContent,\n} from \"./engine.ts\";\nimport type { ExprNode, SetNode, WhereNode } from \"./expression.ts\";\nimport { checkScalar, ROW_VERSION, toSqlite, versionColumn } from \"./rows.ts\";\nimport { recordedPut, TableSql } from \"./sql.ts\";\nimport type { Step } from \"./step.ts\";\nimport { INDEX_NAME } from \"./table.ts\";\nimport { applyAlter, applyDropIndex, applyIndex, applyTable, type StoredKey, type TableWrite } from \"./table-writes.ts\";\nimport type { StoreWrite } from \"./writes.ts\";\n\n/** A recorded write the store does not reproduce (a count, a revision): applying stops, the store diverged (S17). */\nexport class Diverged extends Error {}\n\n/** Applies `write` in `step`; a write the records refuse throws `invalid/args`, one they do not reproduce `Diverged`. */\nexport async function applyWrite(step: Step, write: StoreWrite, what: string): Promise<void> {\n\tswitch (write.kind) {\n\t\tcase \"table\":\n\t\t\tcheckTable(write, what);\n\t\t\tawait applyTable(step, write);\n\t\t\treturn;\n\t\tcase \"index\":\n\t\t\tcheckIndex(recordOf(step, write.table, what), write, what);\n\t\t\tawait applyIndex(step, write);\n\t\t\treturn;\n\t\tcase \"dropIndex\":\n\t\t\tif (!Object.hasOwn(recordOf(step, write.table, what).indexes, write.name)) {\n\t\t\t\tthrow invalid(\"args\", `${what}: no index ${JSON.stringify(write.name)}`);\n\t\t\t}\n\t\t\tawait applyDropIndex(step, write);\n\t\t\treturn;\n\t\tcase \"alter\":\n\t\t\tcheckAlter(recordOf(step, write.table, what), write, what);\n\t\t\tawait applyAlter(step, write);\n\t\t\treturn;\n\t\tcase \"put\": {\n\t\t\tconst record = recordOf(step, write.table, what);\n\t\t\tconst { sql, physical } = recordedPut(write.table, record.columns);\n\t\t\tawait step.run(sql, ...putParams(record, write, physical, what));\n\t\t\treturn;\n\t\t}\n\t\tcase \"update\":\n\t\tcase \"delete\":\n\t\tcase \"updateWhere\":\n\t\tcase \"deleteWhere\":\n\t\t\treturn applyCounted(step, write, what);\n\t\tdefault:\n\t\t\treturn applyDocument(step, write, what);\n\t}\n}\n\n/** Applies a document write: a creation, a change or a retirement on its recorded revision, an archive's revision. */\nasync function applyDocument(step: Step, write: DocumentWrite, what: string): Promise<void> {\n\tswitch (write.kind) {\n\t\tcase \"document.create\":\n\t\t\tawait insertDocument(step, write.record, write.base === undefined ? undefined : json(write.base.value, what));\n\t\t\treturn;\n\t\tcase \"document.revision\": {\n\t\t\tconst { content } = write;\n\t\t\tawait insertRevision(step, write.id, write.seq, content.kind, content.version, contentText(content, what));\n\t\t\treturn;\n\t\t}\n\t\tcase \"document.change\": {\n\t\t\tconst record = await liveAt(step, write.id, write.revision, what);\n\t\t\tconst { content } = write;\n\t\t\tconst text = contentText(content, what);\n\t\t\tawait writeContent(step, write.id, record.history, write.revision, content, text);\n\t\t\treturn;\n\t\t}\n\t\tcase \"document.retire\":\n\t\t\tawait retireRecord(step, await liveAt(step, write.id, write.revision, what));\n\t\t\treturn;\n\t}\n}\n\n/** A content's stored text: a base's value or a delta's ops, checked as JSON. */\nfunction contentText(content: DocumentContent | RevisionContent, what: string): string {\n\treturn json(content.kind === \"base\" ? content.value : content.ops, what);\n}\n\n/** The live record `id` at `revision`; another revision, or none, is a divergence. */\nasync function liveAt(step: Step, id: number, revision: number, what: string): Promise<DocumentRecord> {\n\tconst record = await readDocument(step, id);\n\tif (record === undefined || record.retiredAt !== undefined || record.revision !== revision) {\n\t\tthrow new Diverged(`${what}: document ${id} is not live at revision ${revision}`);\n\t}\n\treturn record;\n}\n\n/** `value` serialized; one `JSON.stringify` cannot encode is refused. */\nfunction json(value: unknown, what: string): string {\n\tlet text: string | undefined;\n\ttry {\n\t\ttext = JSON.stringify(value);\n\t} catch (error) {\n\t\tthrow invalid(\"args\", `${what}: not JSON (${String(error)})`);\n\t}\n\tif (text === undefined) throw invalid(\"args\", `${what}: not JSON`);\n\treturn text;\n}\n\n/**\n * Applies a counted table write: its statement rendered from the record's columns and the recorded `key`, `where` and\n * `set` (checked: only recorded columns, well-formed nodes), and its count compared with the recorded one.\n */\nasync function applyCounted(\n\tstep: Step,\n\twrite: Extract<TableWrite, { readonly kind: \"update\" | \"delete\" | \"updateWhere\" | \"deleteWhere\" }>,\n\twhat: string,\n): Promise<void> {\n\tconst record = recordOf(step, write.table, what);\n\tconst columns = Object.entries(record.columns).map(([name, column]) => ({ name, type: column.type }));\n\tconst sql = new TableSql(write.table, columns, [], record.key);\n\tlet statement: { readonly sql: string; readonly params: SqliteValue[] };\n\tswitch (write.kind) {\n\t\tcase \"update\":\n\t\t\tstatement = sql.update(\n\t\t\t\tsetOf(record, write, what),\n\t\t\t\tkeyParams(record, write.key, what),\n\t\t\t\tversionsOf(record, write, what),\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"delete\":\n\t\t\tstatement = { sql: sql.delete, params: keyParams(record, write.key, what) };\n\t\t\tbreak;\n\t\tcase \"updateWhere\":\n\t\t\tcheckWhere(record, write.where, what);\n\t\t\tstatement = sql.updateWhere(write.where, setOf(record, write, what), versionsOf(record, write, what));\n\t\t\tbreak;\n\t\tcase \"deleteWhere\":\n\t\t\tcheckWhere(record, write.where, what);\n\t\t\tstatement = sql.deleteWhere(write.where);\n\t\t\tbreak;\n\t}\n\tconst count = await step.runCounted(statement.sql, ...statement.params);\n\tif (count !== write.count) throw new Diverged(`${what}: changed ${count} rows, recorded ${write.count}`);\n}\n\n/** The recorded key as parameters in key order: exactly the key columns, each of its type. */\nfunction keyParams(record: TableRecord, key: StoredKey, what: string): SqliteValue[] {\n\tif (Object.keys(key).length !== record.key.length) throw invalid(\"args\", `${what}: not a key of ${record.table}`);\n\treturn record.key.map((name) => {\n\t\tif (!Object.hasOwn(key, name)) throw invalid(\"args\", `${what}: key column ${JSON.stringify(name)} is missing`);\n\t\treturn toSqlite(checkScalar(scalarType(record.columns[name]!), key[name], `${what}: key`));\n\t});\n}\n\n/** A recorded `set` with the migration stamp `$v` when it carries one; key columns never change (rule 13). */\nfunction setOf(\n\trecord: TableRecord,\n\twrite: Extract<TableWrite, { readonly kind: \"update\" | \"updateWhere\" }>,\n\twhat: string,\n): SetNode {\n\tconst { set } = write;\n\tif (typeof set !== \"object\" || set === null || Object.keys(set).length === 0) {\n\t\tthrow invalid(\"args\", `${what}: an empty or malformed set`);\n\t}\n\tfor (const [column, node] of Object.entries(set)) {\n\t\tif (!Object.hasOwn(record.columns, column) || record.key.includes(column)) {\n\t\t\tthrow invalid(\"args\", `${what}: set writes ${JSON.stringify(column)}, no non-key column`);\n\t\t}\n\t\tcheckExpr(record, node, what);\n\t}\n\treturn write.version === undefined ? set : { ...set, [ROW_VERSION]: write.version };\n}\n\n/** The `json(...)` versions a `set` stamps: the recorded ones, of `json(...)` columns it sets, up to theirs. */\nfunction versionsOf(\n\trecord: TableRecord,\n\twrite: Extract<TableWrite, { readonly kind: \"update\" | \"updateWhere\" }>,\n\twhat: string,\n): Map<string, number> {\n\tconst versions = new Map<string, number>();\n\tfor (const [name, column] of Object.entries(record.columns)) {\n\t\tif (column.type !== \"json\" || !Object.hasOwn(write.set, name)) continue;\n\t\t// A clear stamps `NULL` whatever the version; a value stamps its recorded version.\n\t\tconst version = write.columns[name] ?? column.version!;\n\t\tif (!Number.isSafeInteger(version) || version < 1 || version > column.version!) {\n\t\t\tthrow invalid(\"args\", `${what}: no readable version for ${JSON.stringify(name)}`);\n\t\t}\n\t\tversions.set(name, version);\n\t}\n\treturn versions;\n}\n\n/** A scalar column's type; `json(...)` columns are not scalars. */\nfunction scalarType(column: ColumnRecord): \"str\" | \"int\" | \"num\" | \"bool\" {\n\treturn column.type === \"json\" ? \"str\" : column.type;\n}\n\nconst COMPARISONS = [\"eq\", \"ne\", \"lt\", \"lte\", \"gt\", \"gte\"] as const;\n\n/** A recorded condition: well-formed nodes over recorded scalar columns (and the row's `$v`). */\nfunction checkWhere(record: TableRecord, node: unknown, what: string): asserts node is WhereNode {\n\tconst refuse = (): never => {\n\t\tthrow invalid(\"args\", `${what}: a malformed condition`);\n\t};\n\tif (typeof node !== \"object\" || node === null || Object.keys(node).length !== 1) return refuse();\n\tconst [[op, operand]] = Object.entries(node) as [[string, unknown]];\n\tconst column = (name: unknown): void => {\n\t\tif (name === ROW_VERSION) return;\n\t\tif (typeof name !== \"string\" || record.columns[name] === undefined || record.columns[name]!.type === \"json\") {\n\t\t\trefuse();\n\t\t}\n\t};\n\tif (op === \"and\" || op === \"or\") {\n\t\tif (!Array.isArray(operand)) return refuse();\n\t\tfor (const each of operand) checkWhere(record, each, what);\n\t} else if (op === \"not\") checkWhere(record, operand, what);\n\telse if (op === \"isNull\") column(operand);\n\telse if (op === \"inArray\" || op === \"prefix\" || (COMPARISONS as readonly string[]).includes(op)) {\n\t\tif (!Array.isArray(operand) || operand.length !== 2) return refuse();\n\t\tcolumn(operand[0]);\n\t\tconst values = op === \"inArray\" ? operand[1] : [operand[1]];\n\t\tif (!Array.isArray(values)) return refuse();\n\t\tfor (const value of values) if (!isScalar(value) || (op === \"prefix\" && typeof value !== \"string\")) refuse();\n\t} else refuse();\n}\n\nconst OPERATIONS = [\"add\", \"sub\", \"max\", \"min\", \"concat\", \"coalesce\"] as const;\n\n/** A recorded expression: scalars, `null`, JSON literals, recorded columns and the vocabulary's operations. */\nfunction checkExpr(record: TableRecord, node: unknown, what: string): asserts node is ExprNode {\n\tif (node === null || isScalar(node)) return;\n\tconst refuse = (): never => {\n\t\tthrow invalid(\"args\", `${what}: a malformed expression`);\n\t};\n\tif (typeof node !== \"object\" || Object.keys(node).length !== 1) return refuse();\n\tconst [[op, operand]] = Object.entries(node) as [[string, unknown]];\n\tif (op === \"col\") {\n\t\tif (typeof operand !== \"string\" || !Object.hasOwn(record.columns, operand)) refuse();\n\t\treturn;\n\t}\n\tif (op === \"json\") return;\n\tif (!Array.isArray(operand)) return refuse();\n\tif ((OPERATIONS as readonly string[]).includes(op) && operand.length === 2) {\n\t\tfor (const each of operand) checkExpr(record, each, what);\n\t} else if (op === \"replacePrefix\" && operand.length === 3) {\n\t\tcheckExpr(record, operand[0], what);\n\t\tif (typeof operand[1] !== \"string\" || typeof operand[2] !== \"string\") refuse();\n\t} else if (op === \"when\" && operand.length === 3) {\n\t\tcheckWhere(record, operand[0], what);\n\t\tcheckExpr(record, operand[1], what);\n\t\tcheckExpr(record, operand[2], what);\n\t} else refuse();\n}\n\nfunction isScalar(value: unknown): boolean {\n\treturn (\n\t\ttypeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value))\n\t);\n}\n\n/** A recorded table's SQL name (two names joined by `:`, R2), columns, key and json versions, by the name rules. */\nfunction checkTable(write: Extract<TableWrite, { readonly kind: \"table\" }>, what: string): void {\n\tconst parts = write.table.split(\":\");\n\tif (parts.length !== 2) throw invalid(\"args\", `${what}: table ${JSON.stringify(write.table)}: not owner:table`);\n\ttry {\n\t\tfor (const part of parts) checkName(part, `${what}: table name part`);\n\t} catch (error) {\n\t\t// `checkName` throws plain Errors.\n\t\tthrow invalid(\"args\", (error as Error).message);\n\t}\n\tconst folded = new Set<string>();\n\tfor (const [name, column] of Object.entries(write.columns)) {\n\t\tconst where = `${what}: column ${JSON.stringify(name)}`;\n\t\tif (!COLUMN_NAME.test(name) || folded.has(name.toLowerCase()))\n\t\t\tthrow invalid(\"args\", `${where}: not a column name`);\n\t\tfolded.add(name.toLowerCase());\n\t\tcheckColumn(column, where);\n\t}\n\tif (write.key.length === 0) throw invalid(\"args\", `${what}: the key has no column`);\n\tcheckOrderColumns(write.columns, write.key, `${what}: the key`);\n}\n\nfunction checkColumn(column: ColumnRecord, what: string): void {\n\tconst json = column.type === \"json\";\n\tif (json !== (column.version !== undefined) || json !== (column.fingerprint !== undefined)) {\n\t\tthrow invalid(\"args\", `${what}: a json(...) column has a version and a fingerprint, no other column has`);\n\t}\n\tif (column.default === undefined) return;\n\tif (json || column.optional) throw invalid(\"args\", `${what}: only a non-opt scalar column has a default`);\n\tcheckScalar(column.type, column.default, `${what}: the default`);\n}\n\n/** A recorded column edit of `record`'s next version or its own (the edits after a data step). */\nfunction checkAlter(record: TableRecord, write: Extract<TableWrite, { readonly kind: \"alter\" }>, what: string): void {\n\tif (write.version !== record.version && write.version !== record.version + 1) {\n\t\tthrow invalid(\"args\", `${what}: an edit of version ${write.version} on version ${record.version}`);\n\t}\n\tconst { edit } = write;\n\tconst has = (name: string): boolean => Object.hasOwn(record.columns, name);\n\tconst fresh = (name: string): boolean =>\n\t\tCOLUMN_NAME.test(name) && !Object.keys(record.columns).some((each) => each.toLowerCase() === name.toLowerCase());\n\tconst indexed = (name: string): boolean =>\n\t\trecord.key.includes(name) || Object.values(record.indexes).some((columns) => columns.includes(name));\n\tconst valid =\n\t\tedit.kind === \"rename\"\n\t\t\t? has(edit.from) && fresh(edit.to)\n\t\t\t: edit.kind === \"add\"\n\t\t\t\t? fresh(edit.name) && (edit.column.optional === true || edit.column.default !== undefined)\n\t\t\t\t: edit.kind === \"drop\"\n\t\t\t\t\t? has(edit.name) && !indexed(edit.name)\n\t\t\t\t\t: has(edit.name) && record.columns[edit.name]!.type === \"json\" && edit.column.type === \"json\";\n\tif (!valid) throw invalid(\"args\", `${what}: an ${edit.kind} edit the table cannot take`);\n\tif (edit.kind === \"add\" || edit.kind === \"json\")\n\t\tcheckColumn(edit.column, `${what}: column ${JSON.stringify(edit.name)}`);\n}\n\n/** `names` are distinct, recorded, non-`opt` `str` or `int` columns. */\nfunction checkOrderColumns(\n\tcolumns: { readonly [name: string]: ColumnRecord },\n\tnames: readonly string[],\n\twhat: string,\n): void {\n\tif (new Set(names).size !== names.length) throw invalid(\"args\", `${what}: a column occurs twice`);\n\tfor (const name of names) {\n\t\tconst column = Object.hasOwn(columns, name) ? columns[name] : undefined;\n\t\tif (column === undefined || column.optional || (column.type !== \"str\" && column.type !== \"int\")) {\n\t\t\tthrow invalid(\"args\", `${what}: ${JSON.stringify(name)} is not a non-opt str or int column`);\n\t\t}\n\t}\n}\n\nfunction checkIndex(record: TableRecord, write: Extract<TableWrite, { readonly kind: \"index\" }>, what: string): void {\n\tif (!INDEX_NAME.test(write.name) || Object.hasOwn(record.indexes, write.name)) {\n\t\tthrow invalid(\"args\", `${what}: index ${JSON.stringify(write.name)}: not a new index name`);\n\t}\n\tcheckOrderColumns(record.columns, write.columns, `${what}: index ${write.name}`);\n}\n\n/** The record of `table` in `step`; a write for a table not recorded is refused. */\nfunction recordOf(step: Step, table: string, what: string): TableRecord {\n\tconst record = step.table(table);\n\tif (record === undefined) throw invalid(\"args\", `${what}: table ${JSON.stringify(table)} is not recorded`);\n\treturn record;\n}\n\n/**\n * The parameters of a `put` in `physical` order, checked against the recorded columns: every non-`opt` column, no\n * other field, values of their types, `json(...)` cells as JSON (no plugin code runs) with a version up to the\n * column's, and `version` up to the table's.\n */\nfunction putParams(\n\trecord: TableRecord,\n\twrite: Extract<TableWrite, { readonly kind: \"put\" }>,\n\tphysical: readonly string[],\n\twhat: string,\n): SqliteValue[] {\n\tconst { row, columns: versions, version } = write;\n\tfor (const field of Object.keys(row)) {\n\t\tif (!Object.hasOwn(record.columns, field))\n\t\t\tthrow invalid(\"args\", `${what}: unknown column ${JSON.stringify(field)}`);\n\t}\n\tfor (const field of Object.keys(versions)) {\n\t\tif (record.columns[field]?.type !== \"json\" || !Object.hasOwn(row, field)) {\n\t\t\tthrow invalid(\n\t\t\t\t\"args\",\n\t\t\t\t`${what}: a version for ${JSON.stringify(field)}, which is no json(...) cell of the row`,\n\t\t\t);\n\t\t}\n\t}\n\tif (version > record.version) {\n\t\tthrow invalid(\"args\", `${what}: version ${version} is newer than the table's version ${record.version}`);\n\t}\n\tconst cells = new Map<string, SqliteValue>();\n\tfor (const [name, column] of Object.entries(record.columns)) {\n\t\tconst where = `${what}: column ${JSON.stringify(name)}`;\n\t\tconst value = row[name];\n\t\t// A row has no explicit `null`: an absent field is `NULL`; a `json(...)` cell's `null` is the JSON value.\n\t\tif (column.type === \"json\" ? !Object.hasOwn(row, name) : value === undefined) {\n\t\t\tif (!column.optional) throw invalid(\"args\", `${where} is missing`);\n\t\t\tcells.set(name, null);\n\t\t\tcontinue;\n\t\t}\n\t\tif (column.type !== \"json\") {\n\t\t\tcells.set(name, toSqlite(checkScalar(column.type, value, where)));\n\t\t\tcontinue;\n\t\t}\n\t\tconst version = versions[name];\n\t\tif (version === undefined || version > column.version!) throw invalid(\"args\", `${where}: no readable version`);\n\t\tcells.set(name, json(value, where));\n\t\tcells.set(versionColumn(name), version);\n\t}\n\treturn physical.map((name) => (name === ROW_VERSION ? version : (cells.get(name) ?? null)));\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { Context } from "../../context/index.ts";
2
+ import { type OutboxCommit } from "./outbox.ts";
3
+ import type { ChordStore } from "./store.ts";
4
+ /**
5
+ * Applies `commits` (from an outbox, in seq order) to `store`: refused while an owner holds a claim on it, once it
6
+ * diverged, or when the first commit does not follow its `lastSeq` or one does not follow the one before; a write the
7
+ * store's records refuse rolls the whole batch back (`invalid/args`); a recorded count the store does not reproduce
8
+ * rolls it back and marks the store diverged, so every later batch is refused. Commits written to the store's outbox
9
+ * too when it has one.
10
+ */
11
+ export declare function applyBatch(store: ChordStore, commits: readonly OutboxCommit[], context: Context): Promise<void>;
12
+ //# sourceMappingURL=apply-batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-batch.d.ts","sourceRoot":"","sources":["../../../src/next/store/apply-batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAOtD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/D,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/G"}
@@ -0,0 +1,83 @@
1
+ // Batch apply (slice 6b §1.6, S5, S17): a replica takes commits `from..to` as an outbox gave them, in one backend
2
+ // transaction through the store's commit queue, each write applied with its commit's seq by the applier (a trust
3
+ // boundary), `lastSeq` and the allocator set from the last commit. Internal: the sync layer's entry point.
4
+ import { invalid } from "../data/internal.js";
5
+ import { IdAllocator } from "./allocator.js";
6
+ import { applyWrite, Diverged } from "./applier.js";
7
+ import { checkWrite } from "./archive.js";
8
+ import { writeCatalog } from "./catalog.js";
9
+ import { OUTBOX_FORMAT } from "./outbox.js";
10
+ import { TABLES } from "./schema.js";
11
+ import { Step } from "./step.js";
12
+ /**
13
+ * Applies `commits` (from an outbox, in seq order) to `store`: refused while an owner holds a claim on it, once it
14
+ * diverged, or when the first commit does not follow its `lastSeq` or one does not follow the one before; a write the
15
+ * store's records refuse rolls the whole batch back (`invalid/args`); a recorded count the store does not reproduce
16
+ * rolls it back and marks the store diverged, so every later batch is refused. Commits written to the store's outbox
17
+ * too when it has one.
18
+ */
19
+ export function applyBatch(store, commits, context) {
20
+ let checked;
21
+ try {
22
+ checked = commits.map((commit, index) => checkCommit(commit, `batch: commit ${index}`, context));
23
+ }
24
+ catch (error) {
25
+ return Promise.reject(error);
26
+ }
27
+ return store.replay((executor, catalog) => replay(store, checked, executor, catalog), (error) => error instanceof Diverged);
28
+ }
29
+ /** One commit's envelope and writes, checked (a trust boundary). */
30
+ function checkCommit(commit, what, context) {
31
+ const { seq, nextId, writes } = commit;
32
+ if (!Number.isSafeInteger(seq) || !Number.isSafeInteger(nextId) || !Array.isArray(writes)) {
33
+ throw invalid("args", `${what}: not an outbox commit`);
34
+ }
35
+ return {
36
+ seq: seq,
37
+ nextId: nextId,
38
+ writes: writes.map((write, index) => checkWrite(write, `${what}: write ${index}`, context)),
39
+ };
40
+ }
41
+ /** The batch inside the store's turn: seqs continuous from `lastSeq`, allocator values never falling. */
42
+ async function replay(store, commits, executor, catalog) {
43
+ const tables = new Map(catalog);
44
+ const changed = new Map();
45
+ let lastSeq = store.lastSeq;
46
+ let nextId = store.nextId;
47
+ for (const [index, commit] of commits.entries()) {
48
+ const what = `batch: commit ${index} (seq ${commit.seq})`;
49
+ if (commit.seq !== lastSeq + 1)
50
+ throw invalid("args", `${what}: does not follow seq ${lastSeq}`);
51
+ if (commit.nextId < nextId)
52
+ throw invalid("args", `${what}: its next id ${commit.nextId} is below ${nextId}`);
53
+ const step = new Step(executor, commit.seq, new IdAllocator(commit.nextId), tables);
54
+ for (const [position, write] of commit.writes.entries()) {
55
+ const where = `${what}: write ${position} (${write.kind})`;
56
+ if (write.kind === "document.create")
57
+ checkCreated(write.record.id, commit.nextId, where);
58
+ await applyWrite(step, write, where);
59
+ }
60
+ await writeCatalog(step);
61
+ for (const [name, record] of step.tables) {
62
+ tables.set(name, record);
63
+ changed.set(name, record);
64
+ }
65
+ if (store.recordsOutbox) {
66
+ await executor.run(`INSERT INTO ${TABLES.outbox} (seq, format, next_id, writes) VALUES (?, ?, ?, ?)`, commit.seq, OUTBOX_FORMAT, commit.nextId, JSON.stringify(commit.writes));
67
+ }
68
+ lastSeq = commit.seq;
69
+ nextId = commit.nextId;
70
+ }
71
+ await executor.run(`UPDATE ${TABLES.meta} SET last_seq = ?, next_id = ? WHERE singleton = 1`, lastSeq, nextId);
72
+ return { lastSeq, nextId, tables: changed };
73
+ }
74
+ /**
75
+ * A created document's id is below its commit's next id (the allocator never mints it again), or equal to a saturated
76
+ * next id (`Number.MAX_SAFE_INTEGER` may be written, as import allows).
77
+ */
78
+ function checkCreated(id, nextId, what) {
79
+ if (id < nextId || (nextId === Number.MAX_SAFE_INTEGER && id === nextId))
80
+ return;
81
+ throw invalid("args", `${what}: id ${id} is not below the commit's next id ${nextId}`);
82
+ }
83
+ //# sourceMappingURL=apply-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-batch.js","sourceRoot":"","sources":["../../../src/next/store/apply-batch.ts"],"names":[],"mappings":"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","sourcesContent":["// Batch apply (slice 6b §1.6, S5, S17): a replica takes commits `from..to` as an outbox gave them, in one backend\n// transaction through the store's commit queue, each write applied with its commit's seq by the applier (a trust\n// boundary), `lastSeq` and the allocator set from the last commit. Internal: the sync layer's entry point.\n\nimport type { Context } from \"../../context/index.ts\";\nimport type { SqliteExecutor } from \"../../sqlite/index.ts\";\nimport { invalid } from \"../data/internal.ts\";\nimport { IdAllocator } from \"./allocator.ts\";\nimport { applyWrite, Diverged } from \"./applier.ts\";\nimport { checkWrite } from \"./archive.ts\";\nimport { type TableRecord, writeCatalog } from \"./catalog.ts\";\nimport { OUTBOX_FORMAT, type OutboxCommit } from \"./outbox.ts\";\nimport { TABLES } from \"./schema.ts\";\nimport { Step } from \"./step.ts\";\nimport type { ChordStore, Replayed } from \"./store.ts\";\n\n/**\n * Applies `commits` (from an outbox, in seq order) to `store`: refused while an owner holds a claim on it, once it\n * diverged, or when the first commit does not follow its `lastSeq` or one does not follow the one before; a write the\n * store's records refuse rolls the whole batch back (`invalid/args`); a recorded count the store does not reproduce\n * rolls it back and marks the store diverged, so every later batch is refused. Commits written to the store's outbox\n * too when it has one.\n */\nexport function applyBatch(store: ChordStore, commits: readonly OutboxCommit[], context: Context): Promise<void> {\n\tlet checked: OutboxCommit[];\n\ttry {\n\t\tchecked = commits.map((commit, index) => checkCommit(commit, `batch: commit ${index}`, context));\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n\treturn store.replay(\n\t\t(executor, catalog) => replay(store, checked, executor, catalog),\n\t\t(error) => error instanceof Diverged,\n\t);\n}\n\n/** One commit's envelope and writes, checked (a trust boundary). */\nfunction checkCommit(commit: OutboxCommit, what: string, context: Context): OutboxCommit {\n\tconst { seq, nextId, writes } = commit as Partial<OutboxCommit>;\n\tif (!Number.isSafeInteger(seq) || !Number.isSafeInteger(nextId) || !Array.isArray(writes)) {\n\t\tthrow invalid(\"args\", `${what}: not an outbox commit`);\n\t}\n\treturn {\n\t\tseq: seq!,\n\t\tnextId: nextId!,\n\t\twrites: writes.map((write, index) => checkWrite(write, `${what}: write ${index}`, context)),\n\t};\n}\n\n/** The batch inside the store's turn: seqs continuous from `lastSeq`, allocator values never falling. */\nasync function replay(\n\tstore: ChordStore,\n\tcommits: readonly OutboxCommit[],\n\texecutor: SqliteExecutor,\n\tcatalog: ReadonlyMap<string, TableRecord>,\n): Promise<Replayed> {\n\tconst tables = new Map(catalog);\n\tconst changed = new Map<string, TableRecord>();\n\tlet lastSeq = store.lastSeq;\n\tlet nextId = store.nextId;\n\tfor (const [index, commit] of commits.entries()) {\n\t\tconst what = `batch: commit ${index} (seq ${commit.seq})`;\n\t\tif (commit.seq !== lastSeq + 1) throw invalid(\"args\", `${what}: does not follow seq ${lastSeq}`);\n\t\tif (commit.nextId < nextId) throw invalid(\"args\", `${what}: its next id ${commit.nextId} is below ${nextId}`);\n\t\tconst step = new Step(executor, commit.seq, new IdAllocator(commit.nextId), tables);\n\t\tfor (const [position, write] of commit.writes.entries()) {\n\t\t\tconst where = `${what}: write ${position} (${write.kind})`;\n\t\t\tif (write.kind === \"document.create\") checkCreated(write.record.id, commit.nextId, where);\n\t\t\tawait applyWrite(step, write, where);\n\t\t}\n\t\tawait writeCatalog(step);\n\t\tfor (const [name, record] of step.tables) {\n\t\t\ttables.set(name, record);\n\t\t\tchanged.set(name, record);\n\t\t}\n\t\tif (store.recordsOutbox) {\n\t\t\tawait executor.run(\n\t\t\t\t`INSERT INTO ${TABLES.outbox} (seq, format, next_id, writes) VALUES (?, ?, ?, ?)`,\n\t\t\t\tcommit.seq,\n\t\t\t\tOUTBOX_FORMAT,\n\t\t\t\tcommit.nextId,\n\t\t\t\tJSON.stringify(commit.writes),\n\t\t\t);\n\t\t}\n\t\tlastSeq = commit.seq;\n\t\tnextId = commit.nextId;\n\t}\n\tawait executor.run(`UPDATE ${TABLES.meta} SET last_seq = ?, next_id = ? WHERE singleton = 1`, lastSeq, nextId);\n\treturn { lastSeq, nextId, tables: changed };\n}\n\n/**\n * A created document's id is below its commit's next id (the allocator never mints it again), or equal to a saturated\n * next id (`Number.MAX_SAFE_INTEGER` may be written, as import allows).\n */\nfunction checkCreated(id: number, nextId: number, what: string): void {\n\tif (id < nextId || (nextId === Number.MAX_SAFE_INTEGER && id === nextId)) return;\n\tthrow invalid(\"args\", `${what}: id ${id} is not below the commit's next id ${nextId}`);\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { Context } from "../../context/index.ts";
2
+ import type { DocumentWrite } from "./engine.ts";
3
+ import type { TableWrite } from "./table-writes.ts";
4
+ import type { StoreWrite } from "./writes.ts";
5
+ /** The archive format `export` writes; `import` takes this one only. */
6
+ export declare const ARCHIVE_FORMAT = 1;
7
+ /** The first part: the format, the store's schema version, its `lastSeq` and the allocator's next id (rule 24, D3). */
8
+ export type ArchiveManifest = {
9
+ readonly kind: "manifest";
10
+ readonly format: number;
11
+ readonly schema: number;
12
+ readonly lastSeq: number;
13
+ readonly nextId: number;
14
+ };
15
+ /**
16
+ * One part of an archive, in this order: the manifest; per table (by SQL name) its `table` write, its `put`s and its
17
+ * `index` writes; per document record (by id, live and retired) its `document.create` without a base, then its kept
18
+ * revisions in seq order; `end` with the count of the parts between.
19
+ */
20
+ export type ArchivePart = ArchiveManifest | Extract<TableWrite, {
21
+ readonly kind: "table" | "put" | "index";
22
+ }> | Extract<DocumentWrite, {
23
+ readonly kind: "document.create" | "document.revision";
24
+ }> | {
25
+ readonly kind: "end";
26
+ readonly writes: number;
27
+ };
28
+ /** Checks one imported part against the archive schema (a trust boundary); `invalid/args` naming its position. */
29
+ export declare function checkPart(part: unknown, position: number, context: Context): ArchivePart;
30
+ /** Checks one write of a batch's commit against the write schema (a trust boundary); `what` names its place. */
31
+ export declare function checkWrite(write: unknown, what: string, context: Context): StoreWrite;
32
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/next/store/archive.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAgBtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,wEAAwE;AACxE,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,uHAAuH;AACvH,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACpB,eAAe,GACf,OAAO,CAAC,UAAU,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAA;CAAE,CAAC,GACjE,OAAO,CAAC,aAAa,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAAA;CAAE,CAAC,GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA4HrD,kHAAkH;AAClH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAOxF;AAED,gHAAgH;AAChH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAKrF"}