@earendil-works/chord 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1299) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +115 -90
  3. package/dist/context/index.d.ts +1 -1
  4. package/dist/context/index.d.ts.map +1 -1
  5. package/dist/context/index.js +1 -1
  6. package/dist/context/index.js.map +1 -1
  7. package/dist/contracts/accepts.d.ts +81 -0
  8. package/dist/contracts/accepts.d.ts.map +1 -0
  9. package/dist/contracts/accepts.js +123 -0
  10. package/dist/contracts/accepts.js.map +1 -0
  11. package/dist/contracts/contract.d.ts +121 -0
  12. package/dist/contracts/contract.d.ts.map +1 -0
  13. package/dist/contracts/contract.js +50 -0
  14. package/dist/contracts/contract.js.map +1 -0
  15. package/dist/contracts/declare.d.ts +107 -0
  16. package/dist/contracts/declare.d.ts.map +1 -0
  17. package/dist/contracts/declare.js +136 -0
  18. package/dist/contracts/declare.js.map +1 -0
  19. package/dist/contracts/evolve.d.ts +92 -0
  20. package/dist/contracts/evolve.d.ts.map +1 -0
  21. package/dist/contracts/evolve.js +179 -0
  22. package/dist/contracts/evolve.js.map +1 -0
  23. package/dist/contracts/fingerprint.d.ts +16 -0
  24. package/dist/contracts/fingerprint.d.ts.map +1 -0
  25. package/dist/contracts/fingerprint.js +50 -0
  26. package/dist/contracts/fingerprint.js.map +1 -0
  27. package/dist/contracts/history.d.ts +71 -0
  28. package/dist/contracts/history.d.ts.map +1 -0
  29. package/dist/contracts/history.js +3 -0
  30. package/dist/contracts/history.js.map +1 -0
  31. package/dist/contracts/host-kind.d.ts +40 -0
  32. package/dist/contracts/host-kind.d.ts.map +1 -0
  33. package/dist/contracts/host-kind.js +37 -0
  34. package/dist/contracts/host-kind.js.map +1 -0
  35. package/dist/contracts/index.d.ts +7 -0
  36. package/dist/contracts/index.d.ts.map +1 -0
  37. package/dist/contracts/index.js +6 -0
  38. package/dist/contracts/index.js.map +1 -0
  39. package/dist/contracts/internal.d.ts +10 -0
  40. package/dist/contracts/internal.d.ts.map +1 -0
  41. package/dist/contracts/internal.js +9 -0
  42. package/dist/contracts/internal.js.map +1 -0
  43. package/dist/contracts/names.d.ts +3 -0
  44. package/dist/contracts/names.d.ts.map +1 -0
  45. package/dist/contracts/names.js +13 -0
  46. package/dist/contracts/names.js.map +1 -0
  47. package/dist/contracts/params.d.ts +28 -0
  48. package/dist/contracts/params.d.ts.map +1 -0
  49. package/dist/contracts/params.js +50 -0
  50. package/dist/contracts/params.js.map +1 -0
  51. package/dist/contracts/schema.d.ts +102 -0
  52. package/dist/contracts/schema.d.ts.map +1 -0
  53. package/dist/contracts/schema.js +103 -0
  54. package/dist/contracts/schema.js.map +1 -0
  55. package/dist/contracts/snapshot.d.ts +16 -0
  56. package/dist/contracts/snapshot.d.ts.map +1 -0
  57. package/dist/contracts/snapshot.js +167 -0
  58. package/dist/contracts/snapshot.js.map +1 -0
  59. package/dist/data/args.d.ts +50 -0
  60. package/dist/data/args.d.ts.map +1 -0
  61. package/dist/data/args.js +83 -0
  62. package/dist/data/args.js.map +1 -0
  63. package/dist/data/errors.d.ts +80 -0
  64. package/dist/data/errors.d.ts.map +1 -0
  65. package/dist/data/errors.js +116 -0
  66. package/dist/data/errors.js.map +1 -0
  67. package/dist/data/failure.d.ts +26 -0
  68. package/dist/data/failure.d.ts.map +1 -0
  69. package/dist/data/failure.js +77 -0
  70. package/dist/data/failure.js.map +1 -0
  71. package/dist/data/index.d.ts +4 -0
  72. package/dist/data/index.d.ts.map +1 -0
  73. package/dist/data/index.js +5 -0
  74. package/dist/data/index.js.map +1 -0
  75. package/dist/data/internal.d.ts +7 -0
  76. package/dist/data/internal.d.ts.map +1 -0
  77. package/dist/data/internal.js +8 -0
  78. package/dist/data/internal.js.map +1 -0
  79. package/dist/data/params.d.ts +20 -0
  80. package/dist/data/params.d.ts.map +1 -0
  81. package/dist/data/params.js +31 -0
  82. package/dist/data/params.js.map +1 -0
  83. package/dist/data/principal.d.ts +22 -0
  84. package/dist/data/principal.d.ts.map +1 -0
  85. package/dist/data/principal.js +49 -0
  86. package/dist/data/principal.js.map +1 -0
  87. package/dist/data/validator.d.ts +12 -0
  88. package/dist/data/validator.d.ts.map +1 -0
  89. package/dist/data/validator.js +35 -0
  90. package/dist/data/validator.js.map +1 -0
  91. package/dist/delta/apply-immutable-trusted.js +3 -4
  92. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  93. package/dist/delta/diff.d.ts.map +1 -1
  94. package/dist/delta/diff.js +5 -3
  95. package/dist/delta/diff.js.map +1 -1
  96. package/dist/delta/index.d.ts +9 -1
  97. package/dist/delta/index.d.ts.map +1 -1
  98. package/dist/delta/index.js +15 -11
  99. package/dist/delta/index.js.map +1 -1
  100. package/dist/delta/pending.d.ts +36 -0
  101. package/dist/delta/pending.d.ts.map +1 -0
  102. package/dist/delta/pending.js +143 -0
  103. package/dist/delta/pending.js.map +1 -0
  104. package/dist/delta/tracker.d.ts +12 -0
  105. package/dist/delta/tracker.d.ts.map +1 -1
  106. package/dist/delta/tracker.js +109 -39
  107. package/dist/delta/tracker.js.map +1 -1
  108. package/dist/documents/address-source.d.ts +20 -0
  109. package/dist/documents/address-source.d.ts.map +1 -0
  110. package/dist/documents/address-source.js +44 -0
  111. package/dist/documents/address-source.js.map +1 -0
  112. package/dist/documents/definition.d.ts +84 -0
  113. package/dist/documents/definition.d.ts.map +1 -0
  114. package/dist/documents/definition.js +74 -0
  115. package/dist/documents/definition.js.map +1 -0
  116. package/dist/documents/documents.d.ts +126 -0
  117. package/dist/documents/documents.d.ts.map +1 -0
  118. package/dist/documents/documents.js +248 -0
  119. package/dist/documents/documents.js.map +1 -0
  120. package/dist/documents/fence.d.ts +9 -0
  121. package/dist/documents/fence.d.ts.map +1 -0
  122. package/dist/documents/fence.js +15 -0
  123. package/dist/documents/fence.js.map +1 -0
  124. package/dist/documents/handles.d.ts +76 -0
  125. package/dist/documents/handles.d.ts.map +1 -0
  126. package/dist/documents/handles.js +66 -0
  127. package/dist/documents/handles.js.map +1 -0
  128. package/dist/documents/index.d.ts +4 -0
  129. package/dist/documents/index.d.ts.map +1 -0
  130. package/dist/documents/index.js +3 -0
  131. package/dist/documents/index.js.map +1 -0
  132. package/dist/documents/internal.d.ts +9 -0
  133. package/dist/documents/internal.d.ts.map +1 -0
  134. package/dist/documents/internal.js +9 -0
  135. package/dist/documents/internal.js.map +1 -0
  136. package/dist/documents/keyed-slot.d.ts +103 -0
  137. package/dist/documents/keyed-slot.d.ts.map +1 -0
  138. package/dist/documents/keyed-slot.js +395 -0
  139. package/dist/documents/keyed-slot.js.map +1 -0
  140. package/dist/documents/line.d.ts +7 -0
  141. package/dist/documents/line.d.ts.map +1 -0
  142. package/dist/documents/line.js +14 -0
  143. package/dist/documents/line.js.map +1 -0
  144. package/dist/documents/persistence.d.ts +104 -0
  145. package/dist/documents/persistence.d.ts.map +1 -0
  146. package/dist/documents/persistence.js +129 -0
  147. package/dist/documents/persistence.js.map +1 -0
  148. package/dist/documents/residency.d.ts +31 -0
  149. package/dist/documents/residency.d.ts.map +1 -0
  150. package/dist/documents/residency.js +93 -0
  151. package/dist/documents/residency.js.map +1 -0
  152. package/dist/documents/slot.d.ts +109 -0
  153. package/dist/documents/slot.d.ts.map +1 -0
  154. package/dist/documents/slot.js +181 -0
  155. package/dist/documents/slot.js.map +1 -0
  156. package/dist/documents/transaction.d.ts +143 -0
  157. package/dist/documents/transaction.d.ts.map +1 -0
  158. package/dist/documents/transaction.js +442 -0
  159. package/dist/documents/transaction.js.map +1 -0
  160. package/dist/host/activity.d.ts +31 -0
  161. package/dist/host/activity.d.ts.map +1 -0
  162. package/dist/host/activity.js +40 -0
  163. package/dist/host/activity.js.map +1 -0
  164. package/dist/host/adapted.d.ts +49 -0
  165. package/dist/host/adapted.d.ts.map +1 -0
  166. package/dist/host/adapted.js +214 -0
  167. package/dist/host/adapted.js.map +1 -0
  168. package/dist/host/attempt.d.ts +308 -0
  169. package/dist/host/attempt.d.ts.map +1 -0
  170. package/dist/host/attempt.js +1199 -0
  171. package/dist/host/attempt.js.map +1 -0
  172. package/dist/host/backoff.d.ts +29 -0
  173. package/dist/host/backoff.d.ts.map +1 -0
  174. package/dist/host/backoff.js +69 -0
  175. package/dist/host/backoff.js.map +1 -0
  176. package/dist/host/ctx.d.ts +94 -0
  177. package/dist/host/ctx.d.ts.map +1 -0
  178. package/dist/host/ctx.js +200 -0
  179. package/dist/host/ctx.js.map +1 -0
  180. package/dist/host/deadline.d.ts +12 -0
  181. package/dist/host/deadline.d.ts.map +1 -0
  182. package/dist/host/deadline.js +40 -0
  183. package/dist/host/deadline.js.map +1 -0
  184. package/dist/host/dependencies.d.ts +65 -0
  185. package/dist/host/dependencies.d.ts.map +1 -0
  186. package/dist/host/dependencies.js +115 -0
  187. package/dist/host/dependencies.js.map +1 -0
  188. package/dist/host/destination.d.ts +48 -0
  189. package/dist/host/destination.d.ts.map +1 -0
  190. package/dist/host/destination.js +101 -0
  191. package/dist/host/destination.js.map +1 -0
  192. package/dist/host/facet.d.ts +84 -0
  193. package/dist/host/facet.d.ts.map +1 -0
  194. package/dist/host/facet.js +55 -0
  195. package/dist/host/facet.js.map +1 -0
  196. package/dist/host/follow.d.ts +52 -0
  197. package/dist/host/follow.d.ts.map +1 -0
  198. package/dist/host/follow.js +207 -0
  199. package/dist/host/follow.js.map +1 -0
  200. package/dist/host/host.d.ts +571 -0
  201. package/dist/host/host.d.ts.map +1 -0
  202. package/dist/host/host.js +1318 -0
  203. package/dist/host/host.js.map +1 -0
  204. package/dist/host/index.d.ts +17 -0
  205. package/dist/host/index.d.ts.map +1 -0
  206. package/dist/host/index.js +6 -0
  207. package/dist/host/index.js.map +1 -0
  208. package/dist/host/internal.d.ts +11 -0
  209. package/dist/host/internal.d.ts.map +1 -0
  210. package/dist/host/internal.js +9 -0
  211. package/dist/host/internal.js.map +1 -0
  212. package/dist/host/members.d.ts +50 -0
  213. package/dist/host/members.d.ts.map +1 -0
  214. package/dist/host/members.js +107 -0
  215. package/dist/host/members.js.map +1 -0
  216. package/dist/host/native.d.ts +64 -0
  217. package/dist/host/native.d.ts.map +1 -0
  218. package/dist/host/native.js +126 -0
  219. package/dist/host/native.js.map +1 -0
  220. package/dist/host/object.d.ts +331 -0
  221. package/dist/host/object.d.ts.map +1 -0
  222. package/dist/host/object.js +1296 -0
  223. package/dist/host/object.js.map +1 -0
  224. package/dist/host/old-work.d.ts +34 -0
  225. package/dist/host/old-work.d.ts.map +1 -0
  226. package/dist/host/old-work.js +52 -0
  227. package/dist/host/old-work.js.map +1 -0
  228. package/dist/host/parked.d.ts +23 -0
  229. package/dist/host/parked.d.ts.map +1 -0
  230. package/dist/host/parked.js +79 -0
  231. package/dist/host/parked.js.map +1 -0
  232. package/dist/host/presence.d.ts +34 -0
  233. package/dist/host/presence.d.ts.map +1 -0
  234. package/dist/host/presence.js +117 -0
  235. package/dist/host/presence.js.map +1 -0
  236. package/dist/host/readiness.d.ts +27 -0
  237. package/dist/host/readiness.d.ts.map +1 -0
  238. package/dist/host/readiness.js +134 -0
  239. package/dist/host/readiness.js.map +1 -0
  240. package/dist/host/ref-state.d.ts +53 -0
  241. package/dist/host/ref-state.d.ts.map +1 -0
  242. package/dist/host/ref-state.js +83 -0
  243. package/dist/host/ref-state.js.map +1 -0
  244. package/dist/host/reference-keys.d.ts +36 -0
  245. package/dist/host/reference-keys.d.ts.map +1 -0
  246. package/dist/host/reference-keys.js +168 -0
  247. package/dist/host/reference-keys.js.map +1 -0
  248. package/dist/host/reference-source.d.ts +65 -0
  249. package/dist/host/reference-source.d.ts.map +1 -0
  250. package/dist/host/reference-source.js +285 -0
  251. package/dist/host/reference-source.js.map +1 -0
  252. package/dist/host/reference.d.ts +321 -0
  253. package/dist/host/reference.d.ts.map +1 -0
  254. package/dist/host/reference.js +797 -0
  255. package/dist/host/reference.js.map +1 -0
  256. package/dist/host/reload-cycle.d.ts +16 -0
  257. package/dist/host/reload-cycle.d.ts.map +1 -0
  258. package/dist/host/reload-cycle.js +81 -0
  259. package/dist/host/reload-cycle.js.map +1 -0
  260. package/dist/host/retry-on.d.ts +28 -0
  261. package/dist/host/retry-on.d.ts.map +1 -0
  262. package/dist/host/retry-on.js +52 -0
  263. package/dist/host/retry-on.js.map +1 -0
  264. package/dist/host/revocation.d.ts +16 -0
  265. package/dist/host/revocation.d.ts.map +1 -0
  266. package/dist/host/revocation.js +27 -0
  267. package/dist/host/revocation.js.map +1 -0
  268. package/dist/host/root.d.ts +37 -0
  269. package/dist/host/root.d.ts.map +1 -0
  270. package/dist/host/root.js +68 -0
  271. package/dist/host/root.js.map +1 -0
  272. package/dist/host/route.d.ts +64 -0
  273. package/dist/host/route.d.ts.map +1 -0
  274. package/dist/host/route.js +227 -0
  275. package/dist/host/route.js.map +1 -0
  276. package/dist/host/routines.d.ts +78 -0
  277. package/dist/host/routines.d.ts.map +1 -0
  278. package/dist/host/routines.js +398 -0
  279. package/dist/host/routines.js.map +1 -0
  280. package/dist/host/sleep.d.ts +9 -0
  281. package/dist/host/sleep.d.ts.map +1 -0
  282. package/dist/host/sleep.js +40 -0
  283. package/dist/host/sleep.js.map +1 -0
  284. package/dist/host/staging.d.ts +94 -0
  285. package/dist/host/staging.d.ts.map +1 -0
  286. package/dist/host/staging.js +304 -0
  287. package/dist/host/staging.js.map +1 -0
  288. package/dist/host/unbound-clock.d.ts +23 -0
  289. package/dist/host/unbound-clock.d.ts.map +1 -0
  290. package/dist/host/unbound-clock.js +58 -0
  291. package/dist/host/unbound-clock.js.map +1 -0
  292. package/dist/host/unbound.d.ts +37 -0
  293. package/dist/host/unbound.d.ts.map +1 -0
  294. package/dist/host/unbound.js +88 -0
  295. package/dist/host/unbound.js.map +1 -0
  296. package/dist/host/uuid.d.ts +3 -0
  297. package/dist/host/uuid.d.ts.map +1 -0
  298. package/dist/host/uuid.js +38 -0
  299. package/dist/host/uuid.js.map +1 -0
  300. package/dist/index.d.ts +29 -18
  301. package/dist/index.d.ts.map +1 -1
  302. package/dist/index.js +20 -9
  303. package/dist/index.js.map +1 -1
  304. package/dist/jobs/definition.d.ts +96 -0
  305. package/dist/jobs/definition.d.ts.map +1 -0
  306. package/dist/jobs/definition.js +83 -0
  307. package/dist/jobs/definition.js.map +1 -0
  308. package/dist/jobs/index.d.ts +5 -0
  309. package/dist/jobs/index.d.ts.map +1 -0
  310. package/dist/jobs/index.js +3 -0
  311. package/dist/jobs/index.js.map +1 -0
  312. package/dist/jobs/internal.d.ts +3 -0
  313. package/dist/jobs/internal.d.ts.map +1 -0
  314. package/dist/jobs/internal.js +4 -0
  315. package/dist/jobs/internal.js.map +1 -0
  316. package/dist/jobs/job.d.ts +149 -0
  317. package/dist/jobs/job.d.ts.map +1 -0
  318. package/dist/jobs/job.js +387 -0
  319. package/dist/jobs/job.js.map +1 -0
  320. package/dist/jobs/persisted.d.ts +38 -0
  321. package/dist/jobs/persisted.d.ts.map +1 -0
  322. package/dist/jobs/persisted.js +95 -0
  323. package/dist/jobs/persisted.js.map +1 -0
  324. package/dist/jobs/records.d.ts +231 -0
  325. package/dist/jobs/records.d.ts.map +1 -0
  326. package/dist/jobs/records.js +871 -0
  327. package/dist/jobs/records.js.map +1 -0
  328. package/dist/jobs/run-states.d.ts +69 -0
  329. package/dist/jobs/run-states.d.ts.map +1 -0
  330. package/dist/jobs/run-states.js +228 -0
  331. package/dist/jobs/run-states.js.map +1 -0
  332. package/dist/jobs/run.d.ts +117 -0
  333. package/dist/jobs/run.d.ts.map +1 -0
  334. package/dist/jobs/run.js +204 -0
  335. package/dist/jobs/run.js.map +1 -0
  336. package/dist/jobs/running.d.ts +44 -0
  337. package/dist/jobs/running.d.ts.map +1 -0
  338. package/dist/jobs/running.js +117 -0
  339. package/dist/jobs/running.js.map +1 -0
  340. package/dist/jobs/stored.d.ts +63 -0
  341. package/dist/jobs/stored.d.ts.map +1 -0
  342. package/dist/jobs/stored.js +55 -0
  343. package/dist/jobs/stored.js.map +1 -0
  344. package/dist/link/binary.d.ts +4 -0
  345. package/dist/link/binary.d.ts.map +1 -0
  346. package/dist/link/binary.js +544 -0
  347. package/dist/link/binary.js.map +1 -0
  348. package/dist/link/channel.d.ts +68 -0
  349. package/dist/link/channel.d.ts.map +1 -0
  350. package/dist/link/channel.js +215 -0
  351. package/dist/link/channel.js.map +1 -0
  352. package/dist/link/errors.d.ts +7 -0
  353. package/dist/link/errors.d.ts.map +1 -0
  354. package/dist/link/errors.js +21 -0
  355. package/dist/link/errors.js.map +1 -0
  356. package/dist/link/index.d.ts +8 -0
  357. package/dist/link/index.d.ts.map +1 -0
  358. package/dist/link/index.js +8 -0
  359. package/dist/link/index.js.map +1 -0
  360. package/dist/link/internal.d.ts +9 -0
  361. package/dist/link/internal.d.ts.map +1 -0
  362. package/dist/link/internal.js +10 -0
  363. package/dist/link/internal.js.map +1 -0
  364. package/dist/link/ipc.d.ts +22 -0
  365. package/dist/link/ipc.d.ts.map +1 -0
  366. package/dist/link/ipc.js +64 -0
  367. package/dist/link/ipc.js.map +1 -0
  368. package/dist/link/link.d.ts +34 -0
  369. package/dist/link/link.d.ts.map +1 -0
  370. package/dist/link/link.js +87 -0
  371. package/dist/link/link.js.map +1 -0
  372. package/dist/link/message.d.ts +262 -0
  373. package/dist/link/message.d.ts.map +1 -0
  374. package/dist/link/message.js +156 -0
  375. package/dist/link/message.js.map +1 -0
  376. package/dist/link/part.d.ts +80 -0
  377. package/dist/link/part.d.ts.map +1 -0
  378. package/dist/link/part.js +165 -0
  379. package/dist/link/part.js.map +1 -0
  380. package/dist/link/text.d.ts +6 -0
  381. package/dist/link/text.d.ts.map +1 -0
  382. package/dist/link/text.js +355 -0
  383. package/dist/link/text.js.map +1 -0
  384. package/dist/link/values.d.ts +40 -0
  385. package/dist/link/values.d.ts.map +1 -0
  386. package/dist/link/values.js +121 -0
  387. package/dist/link/values.js.map +1 -0
  388. package/dist/link/websocket.d.ts +26 -0
  389. package/dist/link/websocket.d.ts.map +1 -0
  390. package/dist/link/websocket.js +91 -0
  391. package/dist/link/websocket.js.map +1 -0
  392. package/dist/node/app/app.d.ts +269 -0
  393. package/dist/node/app/app.d.ts.map +1 -0
  394. package/dist/node/app/app.js +513 -0
  395. package/dist/node/app/app.js.map +1 -0
  396. package/dist/node/app/archive.d.ts +37 -0
  397. package/dist/node/app/archive.d.ts.map +1 -0
  398. package/dist/node/app/archive.js +204 -0
  399. package/dist/node/app/archive.js.map +1 -0
  400. package/dist/node/app/blobs.d.ts +23 -0
  401. package/dist/node/app/blobs.d.ts.map +1 -0
  402. package/dist/node/app/blobs.js +64 -0
  403. package/dist/node/app/blobs.js.map +1 -0
  404. package/dist/node/app/data.d.ts +35 -0
  405. package/dist/node/app/data.d.ts.map +1 -0
  406. package/dist/node/app/data.js +44 -0
  407. package/dist/node/app/data.js.map +1 -0
  408. package/dist/node/app/ephemeral-sessions.d.ts +20 -0
  409. package/dist/node/app/ephemeral-sessions.d.ts.map +1 -0
  410. package/dist/node/app/ephemeral-sessions.js +69 -0
  411. package/dist/node/app/ephemeral-sessions.js.map +1 -0
  412. package/dist/node/app/ephemeral.d.ts +11 -0
  413. package/dist/node/app/ephemeral.d.ts.map +1 -0
  414. package/dist/node/app/ephemeral.js +34 -0
  415. package/dist/node/app/ephemeral.js.map +1 -0
  416. package/dist/node/app/files-copy.d.ts +13 -0
  417. package/dist/node/app/files-copy.d.ts.map +1 -0
  418. package/dist/node/app/files-copy.js +86 -0
  419. package/dist/node/app/files-copy.js.map +1 -0
  420. package/dist/node/app/files-entry.d.ts +4 -0
  421. package/dist/node/app/files-entry.d.ts.map +1 -0
  422. package/dist/node/app/files-entry.js +7 -0
  423. package/dist/node/app/files-entry.js.map +1 -0
  424. package/dist/node/app/files-index.d.ts +180 -0
  425. package/dist/node/app/files-index.d.ts.map +1 -0
  426. package/dist/node/app/files-index.js +535 -0
  427. package/dist/node/app/files-index.js.map +1 -0
  428. package/dist/node/app/files.d.ts +363 -0
  429. package/dist/node/app/files.d.ts.map +1 -0
  430. package/dist/node/app/files.js +368 -0
  431. package/dist/node/app/files.js.map +1 -0
  432. package/dist/node/app/folder-views.d.ts +21 -0
  433. package/dist/node/app/folder-views.d.ts.map +1 -0
  434. package/dist/node/app/folder-views.js +55 -0
  435. package/dist/node/app/folder-views.js.map +1 -0
  436. package/dist/node/app/index.d.ts +12 -0
  437. package/dist/node/app/index.d.ts.map +1 -0
  438. package/dist/node/app/index.js +15 -0
  439. package/dist/node/app/index.js.map +1 -0
  440. package/dist/node/app/info.d.ts +66 -0
  441. package/dist/node/app/info.d.ts.map +1 -0
  442. package/dist/node/app/info.js +37 -0
  443. package/dist/node/app/info.js.map +1 -0
  444. package/dist/node/app/invite.d.ts +5 -0
  445. package/dist/node/app/invite.d.ts.map +1 -0
  446. package/dist/node/app/invite.js +64 -0
  447. package/dist/node/app/invite.js.map +1 -0
  448. package/dist/node/app/layout.d.ts +36 -0
  449. package/dist/node/app/layout.d.ts.map +1 -0
  450. package/dist/node/app/layout.js +87 -0
  451. package/dist/node/app/layout.js.map +1 -0
  452. package/dist/node/app/owner.d.ts +31 -0
  453. package/dist/node/app/owner.d.ts.map +1 -0
  454. package/dist/node/app/owner.js +104 -0
  455. package/dist/node/app/owner.js.map +1 -0
  456. package/dist/node/app/pairing.d.ts +55 -0
  457. package/dist/node/app/pairing.d.ts.map +1 -0
  458. package/dist/node/app/pairing.js +183 -0
  459. package/dist/node/app/pairing.js.map +1 -0
  460. package/dist/node/app/secrets.d.ts +16 -0
  461. package/dist/node/app/secrets.d.ts.map +1 -0
  462. package/dist/node/app/secrets.js +72 -0
  463. package/dist/node/app/secrets.js.map +1 -0
  464. package/dist/node/app/sessions.d.ts +72 -0
  465. package/dist/node/app/sessions.d.ts.map +1 -0
  466. package/dist/node/app/sessions.js +222 -0
  467. package/dist/node/app/sessions.js.map +1 -0
  468. package/dist/node/app/tar.d.ts +24 -0
  469. package/dist/node/app/tar.d.ts.map +1 -0
  470. package/dist/node/app/tar.js +167 -0
  471. package/dist/node/app/tar.js.map +1 -0
  472. package/dist/node/app/uploads.d.ts +37 -0
  473. package/dist/node/app/uploads.d.ts.map +1 -0
  474. package/dist/node/app/uploads.js +157 -0
  475. package/dist/node/app/uploads.js.map +1 -0
  476. package/dist/node/app/users.d.ts +37 -0
  477. package/dist/node/app/users.d.ts.map +1 -0
  478. package/dist/node/app/users.js +62 -0
  479. package/dist/node/app/users.js.map +1 -0
  480. package/dist/node/app/worker.d.ts +18 -0
  481. package/dist/node/app/worker.d.ts.map +1 -0
  482. package/dist/node/app/worker.js +84 -0
  483. package/dist/node/app/worker.js.map +1 -0
  484. package/dist/node/compression.d.ts +7 -0
  485. package/dist/node/compression.d.ts.map +1 -0
  486. package/dist/node/compression.js +25 -0
  487. package/dist/node/compression.js.map +1 -0
  488. package/dist/node/http/admission.d.ts +63 -0
  489. package/dist/node/http/admission.d.ts.map +1 -0
  490. package/dist/node/http/admission.js +134 -0
  491. package/dist/node/http/admission.js.map +1 -0
  492. package/dist/node/http/authenticate.d.ts +21 -0
  493. package/dist/node/http/authenticate.d.ts.map +1 -0
  494. package/dist/node/http/authenticate.js +34 -0
  495. package/dist/node/http/authenticate.js.map +1 -0
  496. package/dist/node/http/cookies.d.ts +32 -0
  497. package/dist/node/http/cookies.d.ts.map +1 -0
  498. package/dist/node/http/cookies.js +70 -0
  499. package/dist/node/http/cookies.js.map +1 -0
  500. package/dist/node/http/file.d.ts +23 -0
  501. package/dist/node/http/file.d.ts.map +1 -0
  502. package/dist/node/http/file.js +94 -0
  503. package/dist/node/http/file.js.map +1 -0
  504. package/dist/node/http/headers.d.ts +37 -0
  505. package/dist/node/http/headers.d.ts.map +1 -0
  506. package/dist/node/http/headers.js +136 -0
  507. package/dist/node/http/headers.js.map +1 -0
  508. package/dist/node/http/http.d.ts +111 -0
  509. package/dist/node/http/http.d.ts.map +1 -0
  510. package/dist/node/http/http.js +524 -0
  511. package/dist/node/http/http.js.map +1 -0
  512. package/dist/node/http/incoming.d.ts +19 -0
  513. package/dist/node/http/incoming.d.ts.map +1 -0
  514. package/dist/node/http/incoming.js +31 -0
  515. package/dist/node/http/incoming.js.map +1 -0
  516. package/dist/node/http/index.d.ts +11 -0
  517. package/dist/node/http/index.d.ts.map +1 -0
  518. package/dist/node/http/index.js +12 -0
  519. package/dist/node/http/index.js.map +1 -0
  520. package/dist/node/http/node.d.ts +78 -0
  521. package/dist/node/http/node.d.ts.map +1 -0
  522. package/dist/node/http/node.js +291 -0
  523. package/dist/node/http/node.js.map +1 -0
  524. package/dist/node/http/request.d.ts +60 -0
  525. package/dist/node/http/request.d.ts.map +1 -0
  526. package/dist/node/http/request.js +118 -0
  527. package/dist/node/http/request.js.map +1 -0
  528. package/dist/node/http/response.d.ts +63 -0
  529. package/dist/node/http/response.d.ts.map +1 -0
  530. package/dist/node/http/response.js +202 -0
  531. package/dist/node/http/response.js.map +1 -0
  532. package/dist/node/http/router.d.ts +132 -0
  533. package/dist/node/http/router.d.ts.map +1 -0
  534. package/dist/node/http/router.js +267 -0
  535. package/dist/node/http/router.js.map +1 -0
  536. package/dist/node/http/upgrades.d.ts +61 -0
  537. package/dist/node/http/upgrades.d.ts.map +1 -0
  538. package/dist/node/http/upgrades.js +192 -0
  539. package/dist/node/http/upgrades.js.map +1 -0
  540. package/dist/node/plugins/base-inputs.d.ts +14 -0
  541. package/dist/node/plugins/base-inputs.d.ts.map +1 -0
  542. package/dist/node/plugins/base-inputs.js +33 -0
  543. package/dist/node/plugins/base-inputs.js.map +1 -0
  544. package/dist/node/plugins/build.d.ts +77 -0
  545. package/dist/node/plugins/build.d.ts.map +1 -0
  546. package/dist/node/plugins/build.js +576 -0
  547. package/dist/node/plugins/build.js.map +1 -0
  548. package/dist/node/plugins/css-modules.d.ts +13 -0
  549. package/dist/node/plugins/css-modules.d.ts.map +1 -0
  550. package/dist/node/plugins/css-modules.js +58 -0
  551. package/dist/node/plugins/css-modules.js.map +1 -0
  552. package/dist/node/plugins/discover.d.ts +67 -0
  553. package/dist/node/plugins/discover.d.ts.map +1 -0
  554. package/dist/node/plugins/discover.js +369 -0
  555. package/dist/node/plugins/discover.js.map +1 -0
  556. package/dist/node/plugins/evaluate.d.ts +33 -0
  557. package/dist/node/plugins/evaluate.d.ts.map +1 -0
  558. package/dist/node/plugins/evaluate.js +121 -0
  559. package/dist/node/plugins/evaluate.js.map +1 -0
  560. package/dist/node/plugins/index.d.ts +11 -0
  561. package/dist/node/plugins/index.d.ts.map +1 -0
  562. package/dist/node/plugins/index.js +13 -0
  563. package/dist/node/plugins/index.js.map +1 -0
  564. package/dist/node/plugins/install.d.ts +38 -0
  565. package/dist/node/plugins/install.d.ts.map +1 -0
  566. package/dist/node/plugins/install.js +213 -0
  567. package/dist/node/plugins/install.js.map +1 -0
  568. package/dist/node/plugins/plugins.d.ts +162 -0
  569. package/dist/node/plugins/plugins.d.ts.map +1 -0
  570. package/dist/node/plugins/plugins.js +244 -0
  571. package/dist/node/plugins/plugins.js.map +1 -0
  572. package/dist/node/plugins/runtime.d.ts +57 -0
  573. package/dist/node/plugins/runtime.d.ts.map +1 -0
  574. package/dist/node/plugins/runtime.js +92 -0
  575. package/dist/node/plugins/runtime.js.map +1 -0
  576. package/dist/node/plugins/stack.d.ts +16 -0
  577. package/dist/node/plugins/stack.d.ts.map +1 -0
  578. package/dist/node/plugins/stack.js +61 -0
  579. package/dist/node/plugins/stack.js.map +1 -0
  580. package/dist/node/plugins/testing.d.ts +58 -0
  581. package/dist/node/plugins/testing.d.ts.map +1 -0
  582. package/dist/node/plugins/testing.js +210 -0
  583. package/dist/node/plugins/testing.js.map +1 -0
  584. package/dist/node/plugins/watcher.d.ts +69 -0
  585. package/dist/node/plugins/watcher.d.ts.map +1 -0
  586. package/dist/node/plugins/watcher.js +622 -0
  587. package/dist/node/plugins/watcher.js.map +1 -0
  588. package/dist/node/surfaces/bundle.d.ts +31 -0
  589. package/dist/node/surfaces/bundle.d.ts.map +1 -0
  590. package/dist/node/surfaces/bundle.js +118 -0
  591. package/dist/node/surfaces/bundle.js.map +1 -0
  592. package/dist/node/surfaces/current.d.ts +17 -0
  593. package/dist/node/surfaces/current.d.ts.map +1 -0
  594. package/dist/node/surfaces/current.js +54 -0
  595. package/dist/node/surfaces/current.js.map +1 -0
  596. package/dist/node/surfaces/index.d.ts +6 -0
  597. package/dist/node/surfaces/index.d.ts.map +1 -0
  598. package/dist/node/surfaces/index.js +6 -0
  599. package/dist/node/surfaces/index.js.map +1 -0
  600. package/dist/node/surfaces/published.d.ts +27 -0
  601. package/dist/node/surfaces/published.d.ts.map +1 -0
  602. package/dist/node/surfaces/published.js +142 -0
  603. package/dist/node/surfaces/published.js.map +1 -0
  604. package/dist/node/surfaces/served.d.ts +15 -0
  605. package/dist/node/surfaces/served.d.ts.map +1 -0
  606. package/dist/node/surfaces/served.js +42 -0
  607. package/dist/node/surfaces/served.js.map +1 -0
  608. package/dist/node/surfaces/surface-build.d.ts +53 -0
  609. package/dist/node/surfaces/surface-build.d.ts.map +1 -0
  610. package/dist/node/surfaces/surface-build.js +105 -0
  611. package/dist/node/surfaces/surface-build.js.map +1 -0
  612. package/dist/node/surfaces/tui.d.ts +40 -0
  613. package/dist/node/surfaces/tui.d.ts.map +1 -0
  614. package/dist/node/surfaces/tui.js +55 -0
  615. package/dist/node/surfaces/tui.js.map +1 -0
  616. package/dist/node/surfaces/web.d.ts +56 -0
  617. package/dist/node/surfaces/web.d.ts.map +1 -0
  618. package/dist/node/surfaces/web.js +108 -0
  619. package/dist/node/surfaces/web.js.map +1 -0
  620. package/dist/node/tui/actions.d.ts +49 -0
  621. package/dist/node/tui/actions.d.ts.map +1 -0
  622. package/dist/node/tui/actions.js +195 -0
  623. package/dist/node/tui/actions.js.map +1 -0
  624. package/dist/node/tui/credentials.d.ts +17 -0
  625. package/dist/node/tui/credentials.d.ts.map +1 -0
  626. package/dist/node/tui/credentials.js +54 -0
  627. package/dist/node/tui/credentials.js.map +1 -0
  628. package/dist/node/tui/filter.d.ts +5 -0
  629. package/dist/node/tui/filter.d.ts.map +1 -0
  630. package/dist/node/tui/filter.js +79 -0
  631. package/dist/node/tui/filter.js.map +1 -0
  632. package/dist/node/tui/index.d.ts +6 -0
  633. package/dist/node/tui/index.d.ts.map +1 -0
  634. package/dist/node/tui/index.js +6 -0
  635. package/dist/node/tui/index.js.map +1 -0
  636. package/dist/node/tui/launcher.d.ts +40 -0
  637. package/dist/node/tui/launcher.d.ts.map +1 -0
  638. package/dist/node/tui/launcher.js +439 -0
  639. package/dist/node/tui/launcher.js.map +1 -0
  640. package/dist/node/tui/pipe.d.ts +18 -0
  641. package/dist/node/tui/pipe.d.ts.map +1 -0
  642. package/dist/node/tui/pipe.js +134 -0
  643. package/dist/node/tui/pipe.js.map +1 -0
  644. package/dist/node/tui/sandbox.d.ts +54 -0
  645. package/dist/node/tui/sandbox.d.ts.map +1 -0
  646. package/dist/node/tui/sandbox.js +431 -0
  647. package/dist/node/tui/sandbox.js.map +1 -0
  648. package/dist/node/workers/base.d.ts +30 -0
  649. package/dist/node/workers/base.d.ts.map +1 -0
  650. package/dist/node/workers/base.js +255 -0
  651. package/dist/node/workers/base.js.map +1 -0
  652. package/dist/node/workers/child.d.ts +4 -0
  653. package/dist/node/workers/child.d.ts.map +1 -0
  654. package/dist/node/workers/child.js +6 -0
  655. package/dist/node/workers/child.js.map +1 -0
  656. package/dist/node/workers/control.d.ts +83 -0
  657. package/dist/node/workers/control.d.ts.map +1 -0
  658. package/dist/node/workers/control.js +77 -0
  659. package/dist/node/workers/control.js.map +1 -0
  660. package/dist/node/workers/index.d.ts +4 -0
  661. package/dist/node/workers/index.d.ts.map +1 -0
  662. package/dist/node/workers/index.js +7 -0
  663. package/dist/node/workers/index.js.map +1 -0
  664. package/dist/node/workers/lock.d.ts +30 -0
  665. package/dist/node/workers/lock.d.ts.map +1 -0
  666. package/dist/node/workers/lock.js +180 -0
  667. package/dist/node/workers/lock.js.map +1 -0
  668. package/dist/node/workers/main.d.ts +46 -0
  669. package/dist/node/workers/main.d.ts.map +1 -0
  670. package/dist/node/workers/main.js +230 -0
  671. package/dist/node/workers/main.js.map +1 -0
  672. package/dist/node/workers/process.d.ts +42 -0
  673. package/dist/node/workers/process.d.ts.map +1 -0
  674. package/dist/node/workers/process.js +125 -0
  675. package/dist/node/workers/process.js.map +1 -0
  676. package/dist/node/workers/workers.d.ts +122 -0
  677. package/dist/node/workers/workers.d.ts.map +1 -0
  678. package/dist/node/workers/workers.js +677 -0
  679. package/dist/node/workers/workers.js.map +1 -0
  680. package/dist/output.d.ts +1 -1
  681. package/dist/output.d.ts.map +1 -1
  682. package/dist/output.js +4 -2
  683. package/dist/output.js.map +1 -1
  684. package/dist/react/hooks.d.ts +43 -0
  685. package/dist/react/hooks.d.ts.map +1 -0
  686. package/dist/react/hooks.js +82 -0
  687. package/dist/react/hooks.js.map +1 -0
  688. package/dist/react/index.d.ts +3 -0
  689. package/dist/react/index.d.ts.map +1 -0
  690. package/dist/react/index.js +4 -0
  691. package/dist/react/index.js.map +1 -0
  692. package/dist/react/stores.d.ts +9 -0
  693. package/dist/react/stores.d.ts.map +1 -0
  694. package/dist/react/stores.js +37 -0
  695. package/dist/react/stores.js.map +1 -0
  696. package/dist/registries/contribution.d.ts +50 -0
  697. package/dist/registries/contribution.d.ts.map +1 -0
  698. package/dist/registries/contribution.js +129 -0
  699. package/dist/registries/contribution.js.map +1 -0
  700. package/dist/registries/entries.d.ts +18 -0
  701. package/dist/registries/entries.d.ts.map +1 -0
  702. package/dist/registries/entries.js +42 -0
  703. package/dist/registries/entries.js.map +1 -0
  704. package/dist/registries/index.d.ts +3 -0
  705. package/dist/registries/index.d.ts.map +1 -0
  706. package/dist/registries/index.js +5 -0
  707. package/dist/registries/index.js.map +1 -0
  708. package/dist/registries/internal.d.ts +4 -0
  709. package/dist/registries/internal.d.ts.map +1 -0
  710. package/dist/registries/internal.js +5 -0
  711. package/dist/registries/internal.js.map +1 -0
  712. package/dist/registries/record.d.ts +115 -0
  713. package/dist/registries/record.d.ts.map +1 -0
  714. package/dist/registries/record.js +283 -0
  715. package/dist/registries/record.js.map +1 -0
  716. package/dist/registries/registry.d.ts +74 -0
  717. package/dist/registries/registry.d.ts.map +1 -0
  718. package/dist/registries/registry.js +14 -0
  719. package/dist/registries/registry.js.map +1 -0
  720. package/dist/registries/value.d.ts +48 -0
  721. package/dist/registries/value.d.ts.map +1 -0
  722. package/dist/registries/value.js +224 -0
  723. package/dist/registries/value.js.map +1 -0
  724. package/dist/remote/calls.d.ts +25 -0
  725. package/dist/remote/calls.d.ts.map +1 -0
  726. package/dist/remote/calls.js +62 -0
  727. package/dist/remote/calls.js.map +1 -0
  728. package/dist/remote/consumer.d.ts +43 -0
  729. package/dist/remote/consumer.d.ts.map +1 -0
  730. package/dist/remote/consumer.js +350 -0
  731. package/dist/remote/consumer.js.map +1 -0
  732. package/dist/remote/hold.d.ts +141 -0
  733. package/dist/remote/hold.d.ts.map +1 -0
  734. package/dist/remote/hold.js +579 -0
  735. package/dist/remote/hold.js.map +1 -0
  736. package/dist/remote/host-link.d.ts +77 -0
  737. package/dist/remote/host-link.d.ts.map +1 -0
  738. package/dist/remote/host-link.js +184 -0
  739. package/dist/remote/host-link.js.map +1 -0
  740. package/dist/remote/internal.d.ts +6 -0
  741. package/dist/remote/internal.d.ts.map +1 -0
  742. package/dist/remote/internal.js +6 -0
  743. package/dist/remote/internal.js.map +1 -0
  744. package/dist/remote/path.d.ts +46 -0
  745. package/dist/remote/path.d.ts.map +1 -0
  746. package/dist/remote/path.js +73 -0
  747. package/dist/remote/path.js.map +1 -0
  748. package/dist/remote/provider.d.ts +89 -0
  749. package/dist/remote/provider.d.ts.map +1 -0
  750. package/dist/remote/provider.js +597 -0
  751. package/dist/remote/provider.js.map +1 -0
  752. package/dist/remote/relay.d.ts +69 -0
  753. package/dist/remote/relay.d.ts.map +1 -0
  754. package/dist/remote/relay.js +219 -0
  755. package/dist/remote/relay.js.map +1 -0
  756. package/dist/remote/remote-object.d.ts +138 -0
  757. package/dist/remote/remote-object.d.ts.map +1 -0
  758. package/dist/remote/remote-object.js +492 -0
  759. package/dist/remote/remote-object.js.map +1 -0
  760. package/dist/remote/replica.d.ts +59 -0
  761. package/dist/remote/replica.d.ts.map +1 -0
  762. package/dist/remote/replica.js +125 -0
  763. package/dist/remote/replica.js.map +1 -0
  764. package/dist/sqlite/cloudflare.d.ts +2 -0
  765. package/dist/sqlite/cloudflare.d.ts.map +1 -1
  766. package/dist/sqlite/cloudflare.js +10 -0
  767. package/dist/sqlite/cloudflare.js.map +1 -1
  768. package/dist/sqlite/database.d.ts +5 -2
  769. package/dist/sqlite/database.d.ts.map +1 -1
  770. package/dist/sqlite/database.js.map +1 -1
  771. package/dist/sqlite/node.d.ts +13 -2
  772. package/dist/sqlite/node.d.ts.map +1 -1
  773. package/dist/sqlite/node.js +31 -8
  774. package/dist/sqlite/node.js.map +1 -1
  775. package/dist/state/batch.d.ts +64 -0
  776. package/dist/state/batch.d.ts.map +1 -0
  777. package/dist/state/batch.js +164 -0
  778. package/dist/state/batch.js.map +1 -0
  779. package/dist/state/derive.d.ts +52 -0
  780. package/dist/state/derive.d.ts.map +1 -0
  781. package/dist/state/derive.js +182 -0
  782. package/dist/state/derive.js.map +1 -0
  783. package/dist/state/index.d.ts +6 -0
  784. package/dist/state/index.d.ts.map +1 -0
  785. package/dist/state/index.js +4 -0
  786. package/dist/state/index.js.map +1 -0
  787. package/dist/state/internal.d.ts +6 -0
  788. package/dist/state/internal.d.ts.map +1 -0
  789. package/dist/state/internal.js +8 -0
  790. package/dist/state/internal.js.map +1 -0
  791. package/dist/state/native-source.d.ts +106 -0
  792. package/dist/state/native-source.d.ts.map +1 -0
  793. package/dist/state/native-source.js +240 -0
  794. package/dist/state/native-source.js.map +1 -0
  795. package/dist/state/watchable.d.ts +114 -0
  796. package/dist/state/watchable.d.ts.map +1 -0
  797. package/dist/state/watchable.js +156 -0
  798. package/dist/state/watchable.js.map +1 -0
  799. package/dist/state/writable.d.ts +32 -0
  800. package/dist/state/writable.d.ts.map +1 -0
  801. package/dist/state/writable.js +49 -0
  802. package/dist/state/writable.js.map +1 -0
  803. package/dist/store/adapter.d.ts +67 -0
  804. package/dist/store/adapter.d.ts.map +1 -0
  805. package/dist/store/adapter.js +118 -0
  806. package/dist/store/adapter.js.map +1 -0
  807. package/dist/store/allocator.d.ts +17 -0
  808. package/dist/store/allocator.d.ts.map +1 -0
  809. package/dist/store/allocator.js +30 -0
  810. package/dist/store/allocator.js.map +1 -0
  811. package/dist/store/applier.d.ts +8 -0
  812. package/dist/store/applier.d.ts.map +1 -0
  813. package/dist/store/applier.js +375 -0
  814. package/dist/store/applier.js.map +1 -0
  815. package/dist/store/apply-batch.d.ts +12 -0
  816. package/dist/store/apply-batch.d.ts.map +1 -0
  817. package/dist/store/apply-batch.js +83 -0
  818. package/dist/store/apply-batch.js.map +1 -0
  819. package/dist/store/archive.d.ts +32 -0
  820. package/dist/store/archive.d.ts.map +1 -0
  821. package/dist/store/archive.js +130 -0
  822. package/dist/store/archive.js.map +1 -0
  823. package/dist/store/backend.d.ts +10 -0
  824. package/dist/store/backend.d.ts.map +1 -0
  825. package/dist/store/backend.js +15 -0
  826. package/dist/store/backend.js.map +1 -0
  827. package/dist/store/catalog.d.ts +24 -0
  828. package/dist/store/catalog.d.ts.map +1 -0
  829. package/dist/store/catalog.js +17 -0
  830. package/dist/store/catalog.js.map +1 -0
  831. package/dist/store/claims.d.ts +23 -0
  832. package/dist/store/claims.d.ts.map +1 -0
  833. package/dist/store/claims.js +65 -0
  834. package/dist/store/claims.js.map +1 -0
  835. package/dist/store/columns.d.ts +77 -0
  836. package/dist/store/columns.d.ts.map +1 -0
  837. package/dist/store/columns.js +77 -0
  838. package/dist/store/columns.js.map +1 -0
  839. package/dist/store/engine.d.ts +176 -0
  840. package/dist/store/engine.d.ts.map +1 -0
  841. package/dist/store/engine.js +283 -0
  842. package/dist/store/engine.js.map +1 -0
  843. package/dist/store/evaluate.d.ts +17 -0
  844. package/dist/store/evaluate.d.ts.map +1 -0
  845. package/dist/store/evaluate.js +128 -0
  846. package/dist/store/evaluate.js.map +1 -0
  847. package/dist/store/export.d.ts +17 -0
  848. package/dist/store/export.d.ts.map +1 -0
  849. package/dist/store/export.js +200 -0
  850. package/dist/store/export.js.map +1 -0
  851. package/dist/store/expression.d.ts +150 -0
  852. package/dist/store/expression.d.ts.map +1 -0
  853. package/dist/store/expression.js +268 -0
  854. package/dist/store/expression.js.map +1 -0
  855. package/dist/store/import.d.ts +10 -0
  856. package/dist/store/import.d.ts.map +1 -0
  857. package/dist/store/import.js +276 -0
  858. package/dist/store/import.js.map +1 -0
  859. package/dist/store/index.d.ts +16 -0
  860. package/dist/store/index.d.ts.map +1 -0
  861. package/dist/store/index.js +13 -0
  862. package/dist/store/index.js.map +1 -0
  863. package/dist/store/json-column.d.ts +33 -0
  864. package/dist/store/json-column.d.ts.map +1 -0
  865. package/dist/store/json-column.js +62 -0
  866. package/dist/store/json-column.js.map +1 -0
  867. package/dist/store/jsonl.d.ts +9 -0
  868. package/dist/store/jsonl.d.ts.map +1 -0
  869. package/dist/store/jsonl.js +61 -0
  870. package/dist/store/jsonl.js.map +1 -0
  871. package/dist/store/live-query.d.ts +108 -0
  872. package/dist/store/live-query.d.ts.map +1 -0
  873. package/dist/store/live-query.js +254 -0
  874. package/dist/store/live-query.js.map +1 -0
  875. package/dist/store/outbox.d.ts +26 -0
  876. package/dist/store/outbox.d.ts.map +1 -0
  877. package/dist/store/outbox.js +80 -0
  878. package/dist/store/outbox.js.map +1 -0
  879. package/dist/store/query.d.ts +39 -0
  880. package/dist/store/query.d.ts.map +1 -0
  881. package/dist/store/query.js +97 -0
  882. package/dist/store/query.js.map +1 -0
  883. package/dist/store/refusal.d.ts +15 -0
  884. package/dist/store/refusal.d.ts.map +1 -0
  885. package/dist/store/refusal.js +36 -0
  886. package/dist/store/refusal.js.map +1 -0
  887. package/dist/store/rows.d.ts +80 -0
  888. package/dist/store/rows.d.ts.map +1 -0
  889. package/dist/store/rows.js +183 -0
  890. package/dist/store/rows.js.map +1 -0
  891. package/dist/store/schema.d.ts +25 -0
  892. package/dist/store/schema.d.ts.map +1 -0
  893. package/dist/store/schema.js +115 -0
  894. package/dist/store/schema.js.map +1 -0
  895. package/dist/store/sql.d.ts +73 -0
  896. package/dist/store/sql.d.ts.map +1 -0
  897. package/dist/store/sql.js +234 -0
  898. package/dist/store/sql.js.map +1 -0
  899. package/dist/store/step.d.ts +50 -0
  900. package/dist/store/step.d.ts.map +1 -0
  901. package/dist/store/step.js +52 -0
  902. package/dist/store/step.js.map +1 -0
  903. package/dist/store/store.d.ts +171 -0
  904. package/dist/store/store.d.ts.map +1 -0
  905. package/dist/store/store.js +818 -0
  906. package/dist/store/store.js.map +1 -0
  907. package/dist/store/table-changes.d.ts +29 -0
  908. package/dist/store/table-changes.d.ts.map +1 -0
  909. package/dist/store/table-changes.js +102 -0
  910. package/dist/store/table-changes.js.map +1 -0
  911. package/dist/store/table-evolve.d.ts +74 -0
  912. package/dist/store/table-evolve.d.ts.map +1 -0
  913. package/dist/store/table-evolve.js +201 -0
  914. package/dist/store/table-evolve.js.map +1 -0
  915. package/dist/store/table-handle.d.ts +73 -0
  916. package/dist/store/table-handle.d.ts.map +1 -0
  917. package/dist/store/table-handle.js +101 -0
  918. package/dist/store/table-handle.js.map +1 -0
  919. package/dist/store/table-history.d.ts +75 -0
  920. package/dist/store/table-history.d.ts.map +1 -0
  921. package/dist/store/table-history.js +42 -0
  922. package/dist/store/table-history.js.map +1 -0
  923. package/dist/store/table-migration.d.ts +16 -0
  924. package/dist/store/table-migration.d.ts.map +1 -0
  925. package/dist/store/table-migration.js +202 -0
  926. package/dist/store/table-migration.js.map +1 -0
  927. package/dist/store/table-writes.d.ts +125 -0
  928. package/dist/store/table-writes.d.ts.map +1 -0
  929. package/dist/store/table-writes.js +170 -0
  930. package/dist/store/table-writes.js.map +1 -0
  931. package/dist/store/table.d.ts +80 -0
  932. package/dist/store/table.d.ts.map +1 -0
  933. package/dist/store/table.js +103 -0
  934. package/dist/store/table.js.map +1 -0
  935. package/dist/store/text.d.ts +14 -0
  936. package/dist/store/text.d.ts.map +1 -0
  937. package/dist/store/text.js +51 -0
  938. package/dist/store/text.js.map +1 -0
  939. package/dist/store/writes.d.ts +5 -0
  940. package/dist/store/writes.d.ts.map +1 -0
  941. package/dist/store/writes.js +4 -0
  942. package/dist/store/writes.js.map +1 -0
  943. package/dist/surfaces/active-language.d.ts +20 -0
  944. package/dist/surfaces/active-language.d.ts.map +1 -0
  945. package/dist/surfaces/active-language.js +78 -0
  946. package/dist/surfaces/active-language.js.map +1 -0
  947. package/dist/surfaces/active-theme.d.ts +16 -0
  948. package/dist/surfaces/active-theme.d.ts.map +1 -0
  949. package/dist/surfaces/active-theme.js +47 -0
  950. package/dist/surfaces/active-theme.js.map +1 -0
  951. package/dist/surfaces/client.d.ts +96 -0
  952. package/dist/surfaces/client.d.ts.map +1 -0
  953. package/dist/surfaces/client.js +264 -0
  954. package/dist/surfaces/client.js.map +1 -0
  955. package/dist/surfaces/connection.d.ts +49 -0
  956. package/dist/surfaces/connection.d.ts.map +1 -0
  957. package/dist/surfaces/connection.js +142 -0
  958. package/dist/surfaces/connection.js.map +1 -0
  959. package/dist/surfaces/format.d.ts +5 -0
  960. package/dist/surfaces/format.d.ts.map +1 -0
  961. package/dist/surfaces/format.js +37 -0
  962. package/dist/surfaces/format.js.map +1 -0
  963. package/dist/surfaces/index.d.ts +15 -0
  964. package/dist/surfaces/index.d.ts.map +1 -0
  965. package/dist/surfaces/index.js +18 -0
  966. package/dist/surfaces/index.js.map +1 -0
  967. package/dist/surfaces/language.d.ts +53 -0
  968. package/dist/surfaces/language.d.ts.map +1 -0
  969. package/dist/surfaces/language.js +74 -0
  970. package/dist/surfaces/language.js.map +1 -0
  971. package/dist/surfaces/loaded.d.ts +42 -0
  972. package/dist/surfaces/loaded.d.ts.map +1 -0
  973. package/dist/surfaces/loaded.js +116 -0
  974. package/dist/surfaces/loaded.js.map +1 -0
  975. package/dist/surfaces/locale-choice.d.ts +25 -0
  976. package/dist/surfaces/locale-choice.d.ts.map +1 -0
  977. package/dist/surfaces/locale-choice.js +14 -0
  978. package/dist/surfaces/locale-choice.js.map +1 -0
  979. package/dist/surfaces/messages.d.ts +67 -0
  980. package/dist/surfaces/messages.d.ts.map +1 -0
  981. package/dist/surfaces/messages.js +112 -0
  982. package/dist/surfaces/messages.js.map +1 -0
  983. package/dist/surfaces/page-state.d.ts +14 -0
  984. package/dist/surfaces/page-state.d.ts.map +1 -0
  985. package/dist/surfaces/page-state.js +43 -0
  986. package/dist/surfaces/page-state.js.map +1 -0
  987. package/dist/surfaces/preference.d.ts +32 -0
  988. package/dist/surfaces/preference.d.ts.map +1 -0
  989. package/dist/surfaces/preference.js +72 -0
  990. package/dist/surfaces/preference.js.map +1 -0
  991. package/dist/surfaces/registered.d.ts +33 -0
  992. package/dist/surfaces/registered.d.ts.map +1 -0
  993. package/dist/surfaces/registered.js +51 -0
  994. package/dist/surfaces/registered.js.map +1 -0
  995. package/dist/surfaces/scripts.d.ts +84 -0
  996. package/dist/surfaces/scripts.d.ts.map +1 -0
  997. package/dist/surfaces/scripts.js +28 -0
  998. package/dist/surfaces/scripts.js.map +1 -0
  999. package/dist/surfaces/theme-choice.d.ts +31 -0
  1000. package/dist/surfaces/theme-choice.d.ts.map +1 -0
  1001. package/dist/surfaces/theme-choice.js +18 -0
  1002. package/dist/surfaces/theme-choice.js.map +1 -0
  1003. package/dist/surfaces/themes.d.ts +43 -0
  1004. package/dist/surfaces/themes.d.ts.map +1 -0
  1005. package/dist/surfaces/themes.js +110 -0
  1006. package/dist/surfaces/themes.js.map +1 -0
  1007. package/dist/surfaces/translations.d.ts +29 -0
  1008. package/dist/surfaces/translations.d.ts.map +1 -0
  1009. package/dist/surfaces/translations.js +57 -0
  1010. package/dist/surfaces/translations.js.map +1 -0
  1011. package/dist/sync/batch.d.ts +18 -0
  1012. package/dist/sync/batch.d.ts.map +1 -0
  1013. package/dist/sync/batch.js +125 -0
  1014. package/dist/sync/batch.js.map +1 -0
  1015. package/dist/sync/client.d.ts +166 -0
  1016. package/dist/sync/client.d.ts.map +1 -0
  1017. package/dist/sync/client.js +438 -0
  1018. package/dist/sync/client.js.map +1 -0
  1019. package/dist/sync/files.d.ts +46 -0
  1020. package/dist/sync/files.d.ts.map +1 -0
  1021. package/dist/sync/files.js +13 -0
  1022. package/dist/sync/files.js.map +1 -0
  1023. package/dist/sync/filesystem.d.ts +37 -0
  1024. package/dist/sync/filesystem.d.ts.map +1 -0
  1025. package/dist/sync/filesystem.js +185 -0
  1026. package/dist/sync/filesystem.js.map +1 -0
  1027. package/dist/sync/index.d.ts +8 -0
  1028. package/dist/sync/index.d.ts.map +1 -0
  1029. package/dist/sync/index.js +9 -0
  1030. package/dist/sync/index.js.map +1 -0
  1031. package/dist/sync/lines.d.ts +18 -0
  1032. package/dist/sync/lines.d.ts.map +1 -0
  1033. package/dist/sync/lines.js +46 -0
  1034. package/dist/sync/lines.js.map +1 -0
  1035. package/dist/sync/remote.d.ts +130 -0
  1036. package/dist/sync/remote.d.ts.map +1 -0
  1037. package/dist/sync/remote.js +46 -0
  1038. package/dist/sync/remote.js.map +1 -0
  1039. package/dist/sync/state.d.ts +17 -0
  1040. package/dist/sync/state.d.ts.map +1 -0
  1041. package/dist/sync/state.js +40 -0
  1042. package/dist/sync/state.js.map +1 -0
  1043. package/dist/telemetry-ingest/batch.d.ts +70 -0
  1044. package/dist/telemetry-ingest/batch.d.ts.map +1 -0
  1045. package/dist/telemetry-ingest/batch.js +110 -0
  1046. package/dist/telemetry-ingest/batch.js.map +1 -0
  1047. package/dist/telemetry-ingest/facet.d.ts +21 -0
  1048. package/dist/telemetry-ingest/facet.d.ts.map +1 -0
  1049. package/dist/telemetry-ingest/facet.js +96 -0
  1050. package/dist/telemetry-ingest/facet.js.map +1 -0
  1051. package/dist/telemetry-ingest/index.d.ts +5 -0
  1052. package/dist/telemetry-ingest/index.d.ts.map +1 -0
  1053. package/dist/telemetry-ingest/index.js +8 -0
  1054. package/dist/telemetry-ingest/index.js.map +1 -0
  1055. package/dist/telemetry-ingest/recorder.d.ts +50 -0
  1056. package/dist/telemetry-ingest/recorder.d.ts.map +1 -0
  1057. package/dist/telemetry-ingest/recorder.js +298 -0
  1058. package/dist/telemetry-ingest/recorder.js.map +1 -0
  1059. package/dist/telemetry-ingest/sender.d.ts +14 -0
  1060. package/dist/telemetry-ingest/sender.d.ts.map +1 -0
  1061. package/dist/telemetry-ingest/sender.js +64 -0
  1062. package/dist/telemetry-ingest/sender.js.map +1 -0
  1063. package/dist/telemetry-sqlite/index.d.ts +13 -4
  1064. package/dist/telemetry-sqlite/index.d.ts.map +1 -1
  1065. package/dist/telemetry-sqlite/index.js +81 -241
  1066. package/dist/telemetry-sqlite/index.js.map +1 -1
  1067. package/dist/telemetry-sqlite/node.d.ts +13 -0
  1068. package/dist/telemetry-sqlite/node.d.ts.map +1 -0
  1069. package/dist/telemetry-sqlite/node.js +27 -0
  1070. package/dist/telemetry-sqlite/node.js.map +1 -0
  1071. package/dist/telemetry-sqlite/schema.d.ts +9 -0
  1072. package/dist/telemetry-sqlite/schema.d.ts.map +1 -0
  1073. package/dist/telemetry-sqlite/schema.js +61 -0
  1074. package/dist/telemetry-sqlite/schema.js.map +1 -0
  1075. package/dist/telemetry-sqlite/store.d.ts +3 -0
  1076. package/dist/telemetry-sqlite/store.d.ts.map +1 -1
  1077. package/dist/telemetry-sqlite/store.js +24 -13
  1078. package/dist/telemetry-sqlite/store.js.map +1 -1
  1079. package/dist/telemetry.d.ts +937 -0
  1080. package/dist/telemetry.d.ts.map +1 -0
  1081. package/dist/telemetry.js +470 -0
  1082. package/dist/telemetry.js.map +1 -0
  1083. package/dist/tui/bridge.d.ts +112 -0
  1084. package/dist/tui/bridge.d.ts.map +1 -0
  1085. package/dist/tui/bridge.js +9 -0
  1086. package/dist/tui/bridge.js.map +1 -0
  1087. package/dist/tui/channel.d.ts +44 -0
  1088. package/dist/tui/channel.d.ts.map +1 -0
  1089. package/dist/tui/channel.js +150 -0
  1090. package/dist/tui/channel.js.map +1 -0
  1091. package/dist/tui/frames.d.ts +5 -0
  1092. package/dist/tui/frames.d.ts.map +1 -0
  1093. package/dist/tui/frames.js +52 -0
  1094. package/dist/tui/frames.js.map +1 -0
  1095. package/dist/tui/index.d.ts +7 -0
  1096. package/dist/tui/index.d.ts.map +1 -0
  1097. package/dist/tui/index.js +8 -0
  1098. package/dist/tui/index.js.map +1 -0
  1099. package/dist/tui/runtime.d.ts +46 -0
  1100. package/dist/tui/runtime.d.ts.map +1 -0
  1101. package/dist/tui/runtime.js +101 -0
  1102. package/dist/tui/runtime.js.map +1 -0
  1103. package/dist/tui/scope.d.ts +46 -0
  1104. package/dist/tui/scope.d.ts.map +1 -0
  1105. package/dist/tui/scope.js +141 -0
  1106. package/dist/tui/scope.js.map +1 -0
  1107. package/dist/tui/terminal.d.ts +15 -0
  1108. package/dist/tui/terminal.d.ts.map +1 -0
  1109. package/dist/tui/terminal.js +37 -0
  1110. package/dist/tui/terminal.js.map +1 -0
  1111. package/dist/tui/theme.d.ts +17 -0
  1112. package/dist/tui/theme.d.ts.map +1 -0
  1113. package/dist/tui/theme.js +38 -0
  1114. package/dist/tui/theme.js.map +1 -0
  1115. package/dist/watch.d.ts +194 -0
  1116. package/dist/watch.d.ts.map +1 -0
  1117. package/dist/watch.js +383 -0
  1118. package/dist/watch.js.map +1 -0
  1119. package/dist/web/environment.d.ts +4 -0
  1120. package/dist/web/environment.d.ts.map +1 -0
  1121. package/dist/web/environment.js +37 -0
  1122. package/dist/web/environment.js.map +1 -0
  1123. package/dist/web/index.d.ts +5 -0
  1124. package/dist/web/index.d.ts.map +1 -0
  1125. package/dist/web/index.js +7 -0
  1126. package/dist/web/index.js.map +1 -0
  1127. package/dist/web/language.d.ts +7 -0
  1128. package/dist/web/language.d.ts.map +1 -0
  1129. package/dist/web/language.js +21 -0
  1130. package/dist/web/language.js.map +1 -0
  1131. package/dist/web/page.d.ts +29 -0
  1132. package/dist/web/page.d.ts.map +1 -0
  1133. package/dist/web/page.js +92 -0
  1134. package/dist/web/page.js.map +1 -0
  1135. package/dist/web/scripts.d.ts +23 -0
  1136. package/dist/web/scripts.d.ts.map +1 -0
  1137. package/dist/web/scripts.js +50 -0
  1138. package/dist/web/scripts.js.map +1 -0
  1139. package/dist/web/styles.d.ts +17 -0
  1140. package/dist/web/styles.d.ts.map +1 -0
  1141. package/dist/web/styles.js +218 -0
  1142. package/dist/web/styles.js.map +1 -0
  1143. package/dist/web/themes.d.ts +6 -0
  1144. package/dist/web/themes.d.ts.map +1 -0
  1145. package/dist/web/themes.js +31 -0
  1146. package/dist/web/themes.js.map +1 -0
  1147. package/docs/benchmarks.md +1036 -0
  1148. package/docs/decisions.md +3436 -0
  1149. package/docs/dependencies/book.md +1671 -0
  1150. package/docs/dependencies/index.html +2641 -0
  1151. package/docs/dependencies/model.md +330 -0
  1152. package/docs/design.md +3065 -0
  1153. package/docs/durable-observers/book.md +432 -0
  1154. package/docs/durable-observers/index.html +517 -0
  1155. package/docs/flow-control/book.md +333 -0
  1156. package/docs/flow-control/fold/index.html +265 -0
  1157. package/docs/flow-control/index.html +548 -0
  1158. package/docs/flow-control/window/index.html +228 -0
  1159. package/docs/guide-plugins-hosts/book.md +957 -0
  1160. package/docs/guide-plugins-hosts/index.html +952 -0
  1161. package/docs/http-workers/book.md +378 -0
  1162. package/docs/http-workers/index.html +515 -0
  1163. package/docs/i18n/book.md +217 -0
  1164. package/docs/i18n/index.html +344 -0
  1165. package/docs/layer-1.md +311 -0
  1166. package/docs/layer-2.md +216 -0
  1167. package/docs/p3-features/README.md +6 -0
  1168. package/docs/p3-features/book.md +478 -0
  1169. package/docs/plugin-authoring.md +276 -0
  1170. package/docs/plugin-model/book.md +186 -0
  1171. package/docs/plugin-model/index.html +310 -0
  1172. package/docs/plugin-primer/book.md +273 -0
  1173. package/docs/plugin-primer/index.html +430 -0
  1174. package/docs/slice-1.md +236 -0
  1175. package/docs/slice-10.md +288 -0
  1176. package/docs/slice-11.md +114 -0
  1177. package/docs/slice-12.md +132 -0
  1178. package/docs/slice-13.md +121 -0
  1179. package/docs/slice-2.md +174 -0
  1180. package/docs/slice-3a.md +296 -0
  1181. package/docs/slice-3b.md +197 -0
  1182. package/docs/slice-4.md +146 -0
  1183. package/docs/slice-4a.md +418 -0
  1184. package/docs/slice-4b.md +208 -0
  1185. package/docs/slice-5.md +281 -0
  1186. package/docs/slice-6a.md +676 -0
  1187. package/docs/slice-6b.md +332 -0
  1188. package/docs/slice-7a.md +130 -0
  1189. package/docs/slice-7b/book.md +608 -0
  1190. package/docs/slice-7b/index.html +842 -0
  1191. package/docs/slice-7b.md +255 -0
  1192. package/docs/slice-7c.md +165 -0
  1193. package/docs/slice-8.md +194 -0
  1194. package/docs/slice-9.md +110 -0
  1195. package/docs/slices.md +241 -0
  1196. package/docs/store/book.md +670 -0
  1197. package/docs/store/index.html +861 -0
  1198. package/docs/store/walkthrough.md +193 -0
  1199. package/docs/theming/book.md +223 -0
  1200. package/docs/theming/index.html +371 -0
  1201. package/docs/tutorial/book.md +2169 -0
  1202. package/docs/tutorial/index.html +2112 -0
  1203. package/docs/tutorial/screens/click-after.png +0 -0
  1204. package/docs/tutorial/screens/click-before.png +0 -0
  1205. package/docs/tutorial/screens/edited.png +0 -0
  1206. package/docs/tutorial/screens/french.png +0 -0
  1207. package/docs/tutorial/screens/harbor.png +0 -0
  1208. package/docs/tutorial/screens/page.png +0 -0
  1209. package/docs/tutorial/screens/traces-ada.png +0 -0
  1210. package/docs/tutorial/screens/traces.png +0 -0
  1211. package/package.json +114 -20
  1212. package/src/delta/README.md +69 -0
  1213. package/dist/cell.d.ts +0 -122
  1214. package/dist/cell.d.ts.map +0 -1
  1215. package/dist/cell.js +0 -356
  1216. package/dist/cell.js.map +0 -1
  1217. package/dist/cluster.d.ts +0 -27
  1218. package/dist/cluster.d.ts.map +0 -1
  1219. package/dist/cluster.js +0 -230
  1220. package/dist/cluster.js.map +0 -1
  1221. package/dist/connection.d.ts +0 -270
  1222. package/dist/connection.d.ts.map +0 -1
  1223. package/dist/connection.js +0 -1216
  1224. package/dist/connection.js.map +0 -1
  1225. package/dist/contract.d.ts +0 -208
  1226. package/dist/contract.d.ts.map +0 -1
  1227. package/dist/contract.js +0 -246
  1228. package/dist/contract.js.map +0 -1
  1229. package/dist/declare.d.ts +0 -33
  1230. package/dist/declare.d.ts.map +0 -1
  1231. package/dist/declare.js +0 -2
  1232. package/dist/declare.js.map +0 -1
  1233. package/dist/errors.d.ts +0 -28
  1234. package/dist/errors.d.ts.map +0 -1
  1235. package/dist/errors.js +0 -59
  1236. package/dist/errors.js.map +0 -1
  1237. package/dist/host.d.ts +0 -348
  1238. package/dist/host.d.ts.map +0 -1
  1239. package/dist/host.js +0 -1000
  1240. package/dist/host.js.map +0 -1
  1241. package/dist/link.d.ts +0 -107
  1242. package/dist/link.d.ts.map +0 -1
  1243. package/dist/link.js +0 -355
  1244. package/dist/link.js.map +0 -1
  1245. package/dist/loader.d.ts +0 -4
  1246. package/dist/loader.d.ts.map +0 -1
  1247. package/dist/loader.js +0 -73
  1248. package/dist/loader.js.map +0 -1
  1249. package/dist/manager.d.ts +0 -115
  1250. package/dist/manager.d.ts.map +0 -1
  1251. package/dist/manager.js +0 -345
  1252. package/dist/manager.js.map +0 -1
  1253. package/dist/node.d.ts +0 -4
  1254. package/dist/node.d.ts.map +0 -1
  1255. package/dist/node.js +0 -4
  1256. package/dist/node.js.map +0 -1
  1257. package/dist/object.d.ts +0 -438
  1258. package/dist/object.d.ts.map +0 -1
  1259. package/dist/object.js +0 -1571
  1260. package/dist/object.js.map +0 -1
  1261. package/dist/publish.d.ts +0 -5
  1262. package/dist/publish.d.ts.map +0 -1
  1263. package/dist/publish.js +0 -40
  1264. package/dist/publish.js.map +0 -1
  1265. package/dist/registry.d.ts +0 -25
  1266. package/dist/registry.d.ts.map +0 -1
  1267. package/dist/registry.js +0 -6
  1268. package/dist/registry.js.map +0 -1
  1269. package/dist/reload.d.ts +0 -126
  1270. package/dist/reload.d.ts.map +0 -1
  1271. package/dist/reload.js +0 -653
  1272. package/dist/reload.js.map +0 -1
  1273. package/dist/remote.d.ts +0 -165
  1274. package/dist/remote.d.ts.map +0 -1
  1275. package/dist/remote.js +0 -612
  1276. package/dist/remote.js.map +0 -1
  1277. package/dist/schema.d.ts +0 -21
  1278. package/dist/schema.d.ts.map +0 -1
  1279. package/dist/schema.js +0 -228
  1280. package/dist/schema.js.map +0 -1
  1281. package/dist/state.d.ts +0 -92
  1282. package/dist/state.d.ts.map +0 -1
  1283. package/dist/state.js +0 -287
  1284. package/dist/state.js.map +0 -1
  1285. package/dist/types.d.ts +0 -88
  1286. package/dist/types.d.ts.map +0 -1
  1287. package/dist/types.js +0 -2
  1288. package/dist/types.js.map +0 -1
  1289. package/dist/websocket.d.ts +0 -15
  1290. package/dist/websocket.d.ts.map +0 -1
  1291. package/dist/websocket.js +0 -16
  1292. package/dist/websocket.js.map +0 -1
  1293. package/dist/wire.d.ts +0 -216
  1294. package/dist/wire.d.ts.map +0 -1
  1295. package/dist/wire.js +0 -165
  1296. package/dist/wire.js.map +0 -1
  1297. package/docs/guide.md +0 -814
  1298. package/docs/spec.md +0 -288
  1299. package/docs/tutorial.md +0 -931
@@ -0,0 +1,18 @@
1
+ import type { Principal } from "../../data/index.ts";
2
+ import { type PrincipalAttributes } from "../../host/index.ts";
3
+ import type { Watchable } from "../../watch.ts";
4
+ import type { AppApi, AppKind } from "./app.ts";
5
+ /** What `startWorker` takes: the app's API and kinds as the server's `startServer` has them, this process's modules. */
6
+ export type WorkerOptions<P extends Principal = Principal> = {
7
+ readonly api: AppApi;
8
+ readonly kinds: Readonly<Record<string, AppKind>>;
9
+ /** Extra keep-alive counts of the app (a record of numbers, all zero when idle). */
10
+ readonly busy?: Watchable<Readonly<Record<string, number>>>;
11
+ /** Who a span was for (`createHost`'s `principalAttributes`): this worker's hook, as the server's is its own. */
12
+ readonly principalAttributes?: PrincipalAttributes<P>;
13
+ /** The worker host's errors (`HostError`) and a failed start's. */
14
+ readonly onError: (error: unknown) => void;
15
+ };
16
+ /** Runs this process as a worker of the app: once the start message arrived, its host is up and its plugins loaded. */
17
+ export declare function startWorker<P extends Principal>(options: WorkerOptions<P>): void;
18
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/node/app/worker.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAM3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAY,MAAM,UAAU,CAAC;AAM1D,wHAAwH;AACxH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,oFAAoF;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5D,iHAAiH;IACjH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACtD,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC3C,CAAC;AAQF,uHAAuH;AACvH,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAiEhF"}
@@ -0,0 +1,84 @@
1
+ // `startWorker` (slice 13 §1): a worker of an app built with the kit, in its entry module. `workerMain` plus the kit's
2
+ // part: the worker's directory under its kind and address with its store, the host at the worker's address acting as
3
+ // the principal the server gave it, connected to the server first, its plugins loaded with the kit's worker facets
4
+ // (`WorkerInfo`, `Files`, `Translations` for a worker that renders final text); when the server has a telemetry store,
5
+ // the host records in memory and sends its spans and metrics to the server every second (decision "The server is the
6
+ // one place telemetry is stored").
7
+ import { join } from "node:path";
8
+ import { setTimeout as sleep } from "node:timers/promises";
9
+ import { createHost } from "../../host/index.js";
10
+ import { openNodeSqliteDatabase } from "../../sqlite/node.js";
11
+ import { openStore, sqliteBackend } from "../../store/index.js";
12
+ import { translationsFacet } from "../../surfaces/index.js";
13
+ import { sendWorkerTelemetry, TelemetryRecorder } from "../../telemetry-ingest/index.js";
14
+ import { workerMain } from "../workers/child.js";
15
+ import { hostDataFacet } from "./data.js";
16
+ import { filesFacet } from "./files.js";
17
+ import { workerInfoFacet } from "./info.js";
18
+ import { privateDirectory, privateStore } from "./layout.js";
19
+ /** How many finished spans a worker keeps while it cannot send (past it new ones are dropped). */
20
+ const WORKER_QUEUE = 10_000;
21
+ /** How often a worker sends what it recorded. */
22
+ const WORKER_SEND_MS = 1000;
23
+ /** Runs this process as a worker of the app: once the start message arrived, its host is up and its plugins loaded. */
24
+ export function startWorker(options) {
25
+ // The worker's facet kind comes with the start message: every kind's packages are offered, its own are imported.
26
+ const packages = Object.assign({}, ...Object.values(options.kinds).map((kind) => kind.packages ?? {}));
27
+ workerMain(async ({ address, start, parent, plugins, onClose }, context) => {
28
+ // The server's `startServer` sends `{ kit, app }`.
29
+ const { kit, app } = start;
30
+ await privateDirectory(kit.dir);
31
+ await privateStore(join(kit.dir, "store.sqlite"));
32
+ const store = await openStore(sqliteBackend(await openNodeSqliteDatabase(join(kit.dir, "store.sqlite"))), context);
33
+ onClose((ctx) => store.close(ctx));
34
+ const scope = crypto.randomUUID();
35
+ const recorder = kit.telemetry ? new TelemetryRecorder(() => scope, WORKER_QUEUE) : undefined;
36
+ const { principalAttributes } = options;
37
+ // Principals are the app's: the server made these with its `principal` options.
38
+ const host = createHost({
39
+ address,
40
+ principal: kit.principal,
41
+ store,
42
+ telemetry: recorder,
43
+ ...(principalAttributes === undefined ? {} : { principalAttributes }),
44
+ ...kit.timeouts,
45
+ onError: options.onError,
46
+ });
47
+ onClose((ctx) => host.close(ctx));
48
+ // First: the server sees the worker started, then the load runs.
49
+ host.connect(parent, { principal: kit.server, trusted: true }, context);
50
+ const info = {
51
+ address: { kind: address.kind, key: address.key, params: address.params },
52
+ start: app,
53
+ };
54
+ const core = [
55
+ { name: "chord.app.worker-info", facet: workerInfoFacet(info) },
56
+ { name: "chord.app.files", facet: filesFacet(join(kit.dir, "files"), kit.files, kit.uploads) },
57
+ {
58
+ name: "chord.app.data",
59
+ facet: hostDataFacet(store, join(kit.dir, "files"), kit.server),
60
+ },
61
+ { name: "chord.translations", facet: translationsFacet() },
62
+ ];
63
+ await plugins.load(host, { kind: kit.facet, core }, context);
64
+ if (recorder !== undefined) {
65
+ const sender = sendWorkerTelemetry(host, recorder, context);
66
+ const timer = setInterval(() => void sender.send(false), WORKER_SEND_MS);
67
+ timer.unref();
68
+ // Held after the load (a host holds nothing before). Closers run in reverse: this one before the host
69
+ // closes, the last spans and partial metrics sent while the link is up, for at most a second.
70
+ onClose(async () => {
71
+ clearInterval(timer);
72
+ await Promise.race([sender.send(true), sleep(WORKER_SEND_MS, undefined, { ref: false })]);
73
+ sender.stop();
74
+ });
75
+ }
76
+ return options.busy === undefined ? {} : { busy: options.busy };
77
+ }, {
78
+ hostPackages: { ...options.api.modules, ...packages },
79
+ // Worker errors are public (decision "worker errors in public"): a fixed message, never the error's own.
80
+ redact: () => ({ message: "worker failed" }),
81
+ onError: options.onError,
82
+ });
83
+ }
84
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/node/app/worker.ts"],"names":[],"mappings":"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","sourcesContent":["// `startWorker` (slice 13 §1): a worker of an app built with the kit, in its entry module. `workerMain` plus the kit's\n// part: the worker's directory under its kind and address with its store, the host at the worker's address acting as\n// the principal the server gave it, connected to the server first, its plugins loaded with the kit's worker facets\n// (`WorkerInfo`, `Files`, `Translations` for a worker that renders final text); when the server has a telemetry store,\n// the host records in memory and sends its spans and metrics to the server every second (decision \"The server is the\n// one place telemetry is stored\").\n\nimport { join } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport type { Principal } from \"../../data/index.ts\";\nimport { createHost, type PrincipalAttributes } from \"../../host/index.ts\";\nimport type { JsonValue } from \"../../json.ts\";\nimport { openNodeSqliteDatabase } from \"../../sqlite/node.ts\";\nimport { openStore, sqliteBackend } from \"../../store/index.ts\";\nimport { translationsFacet } from \"../../surfaces/index.ts\";\nimport { sendWorkerTelemetry, TelemetryRecorder } from \"../../telemetry-ingest/index.ts\";\nimport type { Watchable } from \"../../watch.ts\";\nimport { workerMain } from \"../workers/child.ts\";\nimport type { AppApi, AppKind, KitStart } from \"./app.ts\";\nimport { hostDataFacet } from \"./data.ts\";\nimport { filesFacet } from \"./files.ts\";\nimport { workerInfoFacet } from \"./info.ts\";\nimport { privateDirectory, privateStore } from \"./layout.ts\";\n\n/** What `startWorker` takes: the app's API and kinds as the server's `startServer` has them, this process's modules. */\nexport type WorkerOptions<P extends Principal = Principal> = {\n\treadonly api: AppApi;\n\treadonly kinds: Readonly<Record<string, AppKind>>;\n\t/** Extra keep-alive counts of the app (a record of numbers, all zero when idle). */\n\treadonly busy?: Watchable<Readonly<Record<string, number>>>;\n\t/** Who a span was for (`createHost`'s `principalAttributes`): this worker's hook, as the server's is its own. */\n\treadonly principalAttributes?: PrincipalAttributes<P>;\n\t/** The worker host's errors (`HostError`) and a failed start's. */\n\treadonly onError: (error: unknown) => void;\n};\n\n/** How many finished spans a worker keeps while it cannot send (past it new ones are dropped). */\nconst WORKER_QUEUE = 10_000;\n\n/** How often a worker sends what it recorded. */\nconst WORKER_SEND_MS = 1000;\n\n/** Runs this process as a worker of the app: once the start message arrived, its host is up and its plugins loaded. */\nexport function startWorker<P extends Principal>(options: WorkerOptions<P>): void {\n\t// The worker's facet kind comes with the start message: every kind's packages are offered, its own are imported.\n\tconst packages = Object.assign({}, ...Object.values(options.kinds).map((kind) => kind.packages ?? {}));\n\tworkerMain(\n\t\tasync ({ address, start, parent, plugins, onClose }, context) => {\n\t\t\t// The server's `startServer` sends `{ kit, app }`.\n\t\t\tconst { kit, app } = start as { readonly kit: KitStart; readonly app: JsonValue };\n\t\t\tawait privateDirectory(kit.dir);\n\t\t\tawait privateStore(join(kit.dir, \"store.sqlite\"));\n\t\t\tconst store = await openStore(\n\t\t\t\tsqliteBackend(await openNodeSqliteDatabase(join(kit.dir, \"store.sqlite\"))),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t\tonClose((ctx) => store.close(ctx));\n\t\t\tconst scope = crypto.randomUUID();\n\t\t\tconst recorder = kit.telemetry ? new TelemetryRecorder(() => scope, WORKER_QUEUE) : undefined;\n\t\t\tconst { principalAttributes } = options;\n\t\t\t// Principals are the app's: the server made these with its `principal` options.\n\t\t\tconst host = createHost<P>({\n\t\t\t\taddress,\n\t\t\t\tprincipal: kit.principal as unknown as P,\n\t\t\t\tstore,\n\t\t\t\ttelemetry: recorder,\n\t\t\t\t...(principalAttributes === undefined ? {} : { principalAttributes }),\n\t\t\t\t...kit.timeouts,\n\t\t\t\tonError: options.onError,\n\t\t\t});\n\t\t\tonClose((ctx) => host.close(ctx));\n\t\t\t// First: the server sees the worker started, then the load runs.\n\t\t\thost.connect(parent, { principal: kit.server as unknown as P, trusted: true }, context);\n\t\t\tconst info = {\n\t\t\t\taddress: { kind: address.kind, key: address.key, params: address.params as JsonValue },\n\t\t\t\tstart: app,\n\t\t\t};\n\t\t\tconst core = [\n\t\t\t\t{ name: \"chord.app.worker-info\", facet: workerInfoFacet<P>(info) },\n\t\t\t\t{ name: \"chord.app.files\", facet: filesFacet<P>(join(kit.dir, \"files\"), kit.files, kit.uploads) },\n\t\t\t\t{\n\t\t\t\t\tname: \"chord.app.data\",\n\t\t\t\t\tfacet: hostDataFacet<P>(store, join(kit.dir, \"files\"), kit.server as unknown as P),\n\t\t\t\t},\n\t\t\t\t{ name: \"chord.translations\", facet: translationsFacet<P>() },\n\t\t\t];\n\t\t\tawait plugins.load(host, { kind: kit.facet, core }, context);\n\t\t\tif (recorder !== undefined) {\n\t\t\t\tconst sender = sendWorkerTelemetry(host, recorder, context);\n\t\t\t\tconst timer = setInterval(() => void sender.send(false), WORKER_SEND_MS);\n\t\t\t\ttimer.unref();\n\t\t\t\t// Held after the load (a host holds nothing before). Closers run in reverse: this one before the host\n\t\t\t\t// closes, the last spans and partial metrics sent while the link is up, for at most a second.\n\t\t\t\tonClose(async () => {\n\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\tawait Promise.race([sender.send(true), sleep(WORKER_SEND_MS, undefined, { ref: false })]);\n\t\t\t\t\tsender.stop();\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn options.busy === undefined ? {} : { busy: options.busy };\n\t\t},\n\t\t{\n\t\t\thostPackages: { ...options.api.modules, ...packages },\n\t\t\t// Worker errors are public (decision \"worker errors in public\"): a fixed message, never the error's own.\n\t\t\tredact: () => ({ message: \"worker failed\" }),\n\t\t\tonError: options.onError,\n\t\t},\n\t);\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Compression } from "../link/index.ts";
2
+ /**
3
+ * Raw deflate at level 1 (`deflateRawSync`), and inflate bounded by `maxOutputLength` (`inflateRawSync`): past the
4
+ * limit `too_large`, data that is no raw deflate stream `corrupt`.
5
+ */
6
+ export declare const nodeCompression: Compression;
7
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/node/compression.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,WAY7B,CAAC"}
@@ -0,0 +1,25 @@
1
+ // Compression for Chord v2 hosts on Node (§22, slice 4b): the synchronous compressor `createHost({ compression })`
2
+ // takes, over Node's zlib. Node-only, so it lives in `src/node`, outside the portable core (which imports no Node
3
+ // module).
4
+ import { constants as buffer } from "node:buffer";
5
+ import { deflateRawSync, inflateRawSync } from "node:zlib";
6
+ /**
7
+ * Raw deflate at level 1 (`deflateRawSync`), and inflate bounded by `maxOutputLength` (`inflateRawSync`): past the
8
+ * limit `too_large`, data that is no raw deflate stream `corrupt`.
9
+ */
10
+ export const nodeCompression = {
11
+ deflate: (bytes) => deflateRawSync(bytes, { level: 1 }),
12
+ inflate: (bytes, limit) => {
13
+ try {
14
+ // zlib refuses a bound of 0: inflate at most one byte, and one byte is past a limit of 0.
15
+ const inflated = inflateRawSync(bytes, { maxOutputLength: Math.max(1, Math.min(limit, buffer.MAX_LENGTH)) });
16
+ return inflated.byteLength > limit ? { kind: "too_large" } : { kind: "bytes", bytes: inflated };
17
+ }
18
+ catch (error) {
19
+ if (error.code === "ERR_BUFFER_TOO_LARGE")
20
+ return { kind: "too_large" };
21
+ return { kind: "corrupt", error };
22
+ }
23
+ },
24
+ };
25
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/node/compression.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,kHAAkH;AAClH,WAAW;AAEX,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3D;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC3C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,IAAI,CAAC;YACJ,0FAA0F;YAC1F,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7G,OAAO,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACjG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAK,KAAqC,CAAC,IAAI,KAAK,sBAAsB;gBAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACzG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;IACF,CAAC;CACD,CAAC","sourcesContent":["// Compression for Chord v2 hosts on Node (§22, slice 4b): the synchronous compressor `createHost({ compression })`\n// takes, over Node's zlib. Node-only, so it lives in `src/node`, outside the portable core (which imports no Node\n// module).\n\nimport { constants as buffer } from \"node:buffer\";\nimport { deflateRawSync, inflateRawSync } from \"node:zlib\";\nimport type { Compression } from \"../link/index.ts\";\n\n/**\n * Raw deflate at level 1 (`deflateRawSync`), and inflate bounded by `maxOutputLength` (`inflateRawSync`): past the\n * limit `too_large`, data that is no raw deflate stream `corrupt`.\n */\nexport const nodeCompression: Compression = {\n\tdeflate: (bytes) => deflateRawSync(bytes, { level: 1 }),\n\tinflate: (bytes, limit) => {\n\t\ttry {\n\t\t\t// zlib refuses a bound of 0: inflate at most one byte, and one byte is past a limit of 0.\n\t\t\tconst inflated = inflateRawSync(bytes, { maxOutputLength: Math.max(1, Math.min(limit, buffer.MAX_LENGTH)) });\n\t\t\treturn inflated.byteLength > limit ? { kind: \"too_large\" } : { kind: \"bytes\", bytes: inflated };\n\t\t} catch (error) {\n\t\t\tif ((error as { readonly code?: unknown }).code === \"ERR_BUFFER_TOO_LARGE\") return { kind: \"too_large\" };\n\t\t\treturn { kind: \"corrupt\", error };\n\t\t}\n\t},\n};\n"]}
@@ -0,0 +1,63 @@
1
+ import type { Incoming } from "./incoming.ts";
2
+ import type { HttpRelay } from "./router.ts";
3
+ /** Where an admitted request came from. */
4
+ export type Provenance = {
5
+ readonly kind: "local";
6
+ } | {
7
+ readonly kind: "remote";
8
+ readonly host: string;
9
+ } | {
10
+ readonly kind: "relayed";
11
+ readonly relay: string;
12
+ readonly origin: string;
13
+ };
14
+ /** The connection a request arrived on, as its listener knows it (a mounted handler passes what it has). */
15
+ export type Connection = {
16
+ readonly localAddress?: string;
17
+ readonly localPort?: number;
18
+ readonly remoteAddress?: string;
19
+ };
20
+ /** An admitted request: its provenance, its own origin, the origin allowed to frame it (a relay's), how it came. */
21
+ export type Admitted = {
22
+ readonly provenance: Provenance;
23
+ readonly origin: string;
24
+ readonly framer: string | undefined;
25
+ /** The allowed host it came through: its connections end when that host leaves. */
26
+ readonly allowed: string | undefined;
27
+ /** The relay that verified it: its connections end when that relay leaves. */
28
+ readonly relay: HttpRelay | undefined;
29
+ };
30
+ /** What admission refuses, and the relay hook that threw (reported by the caller). */
31
+ export type Refused = {
32
+ readonly kind: "refused";
33
+ readonly failed?: {
34
+ readonly relay: string;
35
+ readonly error: unknown;
36
+ };
37
+ };
38
+ /**
39
+ * Admits `request` arriving on `connection` with the allowed `hosts` and contributed `relays`, or refuses it (403):
40
+ * no or several `Host`s, a host neither loopback nor allowed, a loopback `Host` on another connection, forwarded
41
+ * headers no relay verifies.
42
+ */
43
+ export declare function admit(request: Incoming, connection: Connection, hosts: ReadonlySet<string>, relays: readonly HttpRelay[]): Admitted | Refused;
44
+ /** What the Fetch Metadata and `Origin` checks read: a request's headers by name. */
45
+ export type HeaderSource = Pick<Incoming, "header">;
46
+ /** Whether `admission` refused its request. */
47
+ export declare function refused(admission: Admitted | Refused): admission is Refused;
48
+ /**
49
+ * Whether a request is another site's (Fetch Metadata, p2's rule): `Sec-Fetch-Site` neither `same-origin` nor `none`,
50
+ * or a frame or embed not from this origin. A request without the headers (a script, the TUI) is not.
51
+ */
52
+ export declare function isForeign(headers: HeaderSource): boolean;
53
+ /**
54
+ * Whether a foreign request is a top-level navigation (a link followed to a page): `GET`, `navigate`, a `document` (or
55
+ * `empty`: Chrome on Android launching an installed app).
56
+ */
57
+ export declare function isNavigation(method: string, headers: HeaderSource): boolean;
58
+ /**
59
+ * Whether `headers`' `Origin` is acceptable for a request whose own origin is `origin`: absent or equal, and for an
60
+ * unsafe method from a browser (one sending Fetch Metadata) present and equal.
61
+ */
62
+ export declare function originAccepted(method: string, headers: HeaderSource, origin: string): boolean;
63
+ //# sourceMappingURL=admission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../../src/node/http/admission.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,4GAA4G;AAC5G,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,oHAAoH;AACpH,MAAM,MAAM,QAAQ,GAAG;IACtB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,sFAAsF;AACtF,MAAM,MAAM,OAAO,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CACtE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,KAAK,CACpB,OAAO,EAAE,QAAQ,EACjB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAC1B,MAAM,EAAE,SAAS,SAAS,EAAE,GAC1B,QAAQ,GAAG,OAAO,CAyBpB;AAED,qFAAqF;AACrF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAEpD,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,IAAI,OAAO,CAE3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAIxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAK3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAI7F"}
@@ -0,0 +1,134 @@
1
+ // Admission (slice 10 §2, R4; decision "The HTTP component's security baseline" (1)-(3), "Relays"): where a request
2
+ // comes from, decided before anything else. Local only when the connection arrived on a loopback address, its `Host`
3
+ // is a loopback name with the listening port, and it carries no forwarded header; a forwarded request on loopback only
4
+ // when a contributed relay verifies it; otherwise only through an allowed host (https); else refused. Foreign requests
5
+ // (another site's, by Fetch Metadata) and a foreign `Origin` are classified here; the handler applies them per route.
6
+ /**
7
+ * Admits `request` arriving on `connection` with the allowed `hosts` and contributed `relays`, or refuses it (403):
8
+ * no or several `Host`s, a host neither loopback nor allowed, a loopback `Host` on another connection, forwarded
9
+ * headers no relay verifies.
10
+ */
11
+ export function admit(request, connection, hosts, relays) {
12
+ const host = request.header("host")?.toLowerCase();
13
+ // Several `Host` headers arrive joined with commas.
14
+ if (host === undefined || host === "" || host.includes(","))
15
+ return REFUSED;
16
+ const { localAddress, localPort } = connection;
17
+ if (isLoopbackName(host, localPort)) {
18
+ if (localAddress === undefined || !isLoopbackAddress(localAddress))
19
+ return REFUSED;
20
+ if (!request.forwarded())
21
+ return {
22
+ provenance: LOCAL,
23
+ origin: `http://${host}`,
24
+ framer: undefined,
25
+ allowed: undefined,
26
+ relay: undefined,
27
+ };
28
+ return relayed(request, relays);
29
+ }
30
+ if (!hosts.has(host))
31
+ return REFUSED;
32
+ return {
33
+ provenance: { kind: "remote", host },
34
+ origin: `https://${host}`,
35
+ framer: undefined,
36
+ allowed: host,
37
+ relay: undefined,
38
+ };
39
+ }
40
+ /** Whether `admission` refused its request. */
41
+ export function refused(admission) {
42
+ return "kind" in admission;
43
+ }
44
+ /**
45
+ * Whether a request is another site's (Fetch Metadata, p2's rule): `Sec-Fetch-Site` neither `same-origin` nor `none`,
46
+ * or a frame or embed not from this origin. A request without the headers (a script, the TUI) is not.
47
+ */
48
+ export function isForeign(headers) {
49
+ const site = headers.header("sec-fetch-site");
50
+ if (site !== null && site !== "same-origin" && site !== "none")
51
+ return true;
52
+ return site !== "same-origin" && FRAMES.has(headers.header("sec-fetch-dest") ?? "");
53
+ }
54
+ /**
55
+ * Whether a foreign request is a top-level navigation (a link followed to a page): `GET`, `navigate`, a `document` (or
56
+ * `empty`: Chrome on Android launching an installed app).
57
+ */
58
+ export function isNavigation(method, headers) {
59
+ const dest = headers.header("sec-fetch-dest");
60
+ return (method === "GET" && headers.header("sec-fetch-mode") === "navigate" && (dest === "document" || dest === "empty"));
61
+ }
62
+ /**
63
+ * Whether `headers`' `Origin` is acceptable for a request whose own origin is `origin`: absent or equal, and for an
64
+ * unsafe method from a browser (one sending Fetch Metadata) present and equal.
65
+ */
66
+ export function originAccepted(method, headers, origin) {
67
+ const sent = headers.header("origin");
68
+ if (sent !== null)
69
+ return sent === origin;
70
+ return SAFE.has(method) || headers.header("sec-fetch-site") === null;
71
+ }
72
+ const REFUSED = { kind: "refused" };
73
+ const LOCAL = { kind: "local" };
74
+ const LOOPBACK_NAMES = ["127.0.0.1", "localhost", "[::1]"];
75
+ /** Whether `host` (lowercased) names this server on loopback with `port` (without it on port 80). */
76
+ function isLoopbackName(host, port) {
77
+ if (port === undefined)
78
+ return false;
79
+ for (const name of LOOPBACK_NAMES) {
80
+ if (host === `${name}:${port}`)
81
+ return true;
82
+ if (port === 80 && host === name)
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ /** Whether `address` is a loopback address: 127.0.0.0/8, ::1, or 127.x mapped into IPv6. */
88
+ function isLoopbackAddress(address) {
89
+ return address === "::1" || address.startsWith("127.") || address.startsWith("::ffff:127.");
90
+ }
91
+ /** A forwarded request on loopback: admitted as relayed when a relay verifies it, else refused. */
92
+ function relayed(request, relays) {
93
+ for (const relay of relays) {
94
+ let verified;
95
+ try {
96
+ verified = relay.verify(request.request());
97
+ }
98
+ catch (error) {
99
+ return { kind: "refused", failed: { relay: relay.name, error } };
100
+ }
101
+ if (verified === undefined)
102
+ continue;
103
+ // Its origins reach the CSP: each must be one origin and nothing else (Fable's recheck N2).
104
+ for (const origin of [verified.origin, verified.framer]) {
105
+ if (origin === undefined || isOrigin(origin))
106
+ continue;
107
+ const error = new Error(`relay ${relay.name}: ${JSON.stringify(origin)} is no origin`);
108
+ return { kind: "refused", failed: { relay: relay.name, error } };
109
+ }
110
+ return {
111
+ provenance: { kind: "relayed", relay: relay.name, origin: verified.origin },
112
+ origin: verified.origin,
113
+ framer: verified.framer,
114
+ allowed: undefined,
115
+ relay,
116
+ };
117
+ }
118
+ return REFUSED;
119
+ }
120
+ /** Whether `text` is exactly an origin (`https://host[:port]`): what the URL parser serializes it to. */
121
+ function isOrigin(text) {
122
+ try {
123
+ const url = new URL(text);
124
+ return (url.protocol === "https:" || url.protocol === "http:") && url.origin === text;
125
+ }
126
+ catch {
127
+ return false;
128
+ }
129
+ }
130
+ /** The `Sec-Fetch-Dest` of a frame or an embed. */
131
+ const FRAMES = new Set(["iframe", "frame", "embed", "object", "fencedframe"]);
132
+ /** The methods that change nothing. */
133
+ const SAFE = new Set(["GET", "HEAD", "OPTIONS"]);
134
+ //# sourceMappingURL=admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admission.js","sourceRoot":"","sources":["../../../src/node/http/admission.ts"],"names":[],"mappings":"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","sourcesContent":["// Admission (slice 10 §2, R4; decision \"The HTTP component's security baseline\" (1)-(3), \"Relays\"): where a request\n// comes from, decided before anything else. Local only when the connection arrived on a loopback address, its `Host`\n// is a loopback name with the listening port, and it carries no forwarded header; a forwarded request on loopback only\n// when a contributed relay verifies it; otherwise only through an allowed host (https); else refused. Foreign requests\n// (another site's, by Fetch Metadata) and a foreign `Origin` are classified here; the handler applies them per route.\n\nimport type { Incoming } from \"./incoming.ts\";\nimport type { HttpRelay } from \"./router.ts\";\n\n/** Where an admitted request came from. */\nexport type Provenance =\n\t| { readonly kind: \"local\" }\n\t| { readonly kind: \"remote\"; readonly host: string }\n\t| { readonly kind: \"relayed\"; readonly relay: string; readonly origin: string };\n\n/** The connection a request arrived on, as its listener knows it (a mounted handler passes what it has). */\nexport type Connection = {\n\treadonly localAddress?: string;\n\treadonly localPort?: number;\n\treadonly remoteAddress?: string;\n};\n\n/** An admitted request: its provenance, its own origin, the origin allowed to frame it (a relay's), how it came. */\nexport type Admitted = {\n\treadonly provenance: Provenance;\n\treadonly origin: string;\n\treadonly framer: string | undefined;\n\t/** The allowed host it came through: its connections end when that host leaves. */\n\treadonly allowed: string | undefined;\n\t/** The relay that verified it: its connections end when that relay leaves. */\n\treadonly relay: HttpRelay | undefined;\n};\n\n/** What admission refuses, and the relay hook that threw (reported by the caller). */\nexport type Refused = {\n\treadonly kind: \"refused\";\n\treadonly failed?: { readonly relay: string; readonly error: unknown };\n};\n\n/**\n * Admits `request` arriving on `connection` with the allowed `hosts` and contributed `relays`, or refuses it (403):\n * no or several `Host`s, a host neither loopback nor allowed, a loopback `Host` on another connection, forwarded\n * headers no relay verifies.\n */\nexport function admit(\n\trequest: Incoming,\n\tconnection: Connection,\n\thosts: ReadonlySet<string>,\n\trelays: readonly HttpRelay[],\n): Admitted | Refused {\n\tconst host = request.header(\"host\")?.toLowerCase();\n\t// Several `Host` headers arrive joined with commas.\n\tif (host === undefined || host === \"\" || host.includes(\",\")) return REFUSED;\n\tconst { localAddress, localPort } = connection;\n\tif (isLoopbackName(host, localPort)) {\n\t\tif (localAddress === undefined || !isLoopbackAddress(localAddress)) return REFUSED;\n\t\tif (!request.forwarded())\n\t\t\treturn {\n\t\t\t\tprovenance: LOCAL,\n\t\t\t\torigin: `http://${host}`,\n\t\t\t\tframer: undefined,\n\t\t\t\tallowed: undefined,\n\t\t\t\trelay: undefined,\n\t\t\t};\n\t\treturn relayed(request, relays);\n\t}\n\tif (!hosts.has(host)) return REFUSED;\n\treturn {\n\t\tprovenance: { kind: \"remote\", host },\n\t\torigin: `https://${host}`,\n\t\tframer: undefined,\n\t\tallowed: host,\n\t\trelay: undefined,\n\t};\n}\n\n/** What the Fetch Metadata and `Origin` checks read: a request's headers by name. */\nexport type HeaderSource = Pick<Incoming, \"header\">;\n\n/** Whether `admission` refused its request. */\nexport function refused(admission: Admitted | Refused): admission is Refused {\n\treturn \"kind\" in admission;\n}\n\n/**\n * Whether a request is another site's (Fetch Metadata, p2's rule): `Sec-Fetch-Site` neither `same-origin` nor `none`,\n * or a frame or embed not from this origin. A request without the headers (a script, the TUI) is not.\n */\nexport function isForeign(headers: HeaderSource): boolean {\n\tconst site = headers.header(\"sec-fetch-site\");\n\tif (site !== null && site !== \"same-origin\" && site !== \"none\") return true;\n\treturn site !== \"same-origin\" && FRAMES.has(headers.header(\"sec-fetch-dest\") ?? \"\");\n}\n\n/**\n * Whether a foreign request is a top-level navigation (a link followed to a page): `GET`, `navigate`, a `document` (or\n * `empty`: Chrome on Android launching an installed app).\n */\nexport function isNavigation(method: string, headers: HeaderSource): boolean {\n\tconst dest = headers.header(\"sec-fetch-dest\");\n\treturn (\n\t\tmethod === \"GET\" && headers.header(\"sec-fetch-mode\") === \"navigate\" && (dest === \"document\" || dest === \"empty\")\n\t);\n}\n\n/**\n * Whether `headers`' `Origin` is acceptable for a request whose own origin is `origin`: absent or equal, and for an\n * unsafe method from a browser (one sending Fetch Metadata) present and equal.\n */\nexport function originAccepted(method: string, headers: HeaderSource, origin: string): boolean {\n\tconst sent = headers.header(\"origin\");\n\tif (sent !== null) return sent === origin;\n\treturn SAFE.has(method) || headers.header(\"sec-fetch-site\") === null;\n}\n\nconst REFUSED: Refused = { kind: \"refused\" };\n\nconst LOCAL: Provenance = { kind: \"local\" };\n\nconst LOOPBACK_NAMES = [\"127.0.0.1\", \"localhost\", \"[::1]\"];\n\n/** Whether `host` (lowercased) names this server on loopback with `port` (without it on port 80). */\nfunction isLoopbackName(host: string, port: number | undefined): boolean {\n\tif (port === undefined) return false;\n\tfor (const name of LOOPBACK_NAMES) {\n\t\tif (host === `${name}:${port}`) return true;\n\t\tif (port === 80 && host === name) return true;\n\t}\n\treturn false;\n}\n\n/** Whether `address` is a loopback address: 127.0.0.0/8, ::1, or 127.x mapped into IPv6. */\nfunction isLoopbackAddress(address: string): boolean {\n\treturn address === \"::1\" || address.startsWith(\"127.\") || address.startsWith(\"::ffff:127.\");\n}\n\n/** A forwarded request on loopback: admitted as relayed when a relay verifies it, else refused. */\nfunction relayed(request: Incoming, relays: readonly HttpRelay[]): Admitted | Refused {\n\tfor (const relay of relays) {\n\t\tlet verified: ReturnType<HttpRelay[\"verify\"]>;\n\t\ttry {\n\t\t\tverified = relay.verify(request.request());\n\t\t} catch (error) {\n\t\t\treturn { kind: \"refused\", failed: { relay: relay.name, error } };\n\t\t}\n\t\tif (verified === undefined) continue;\n\t\t// Its origins reach the CSP: each must be one origin and nothing else (Fable's recheck N2).\n\t\tfor (const origin of [verified.origin, verified.framer]) {\n\t\t\tif (origin === undefined || isOrigin(origin)) continue;\n\t\t\tconst error = new Error(`relay ${relay.name}: ${JSON.stringify(origin)} is no origin`);\n\t\t\treturn { kind: \"refused\", failed: { relay: relay.name, error } };\n\t\t}\n\t\treturn {\n\t\t\tprovenance: { kind: \"relayed\", relay: relay.name, origin: verified.origin },\n\t\t\torigin: verified.origin,\n\t\t\tframer: verified.framer,\n\t\t\tallowed: undefined,\n\t\t\trelay,\n\t\t};\n\t}\n\treturn REFUSED;\n}\n\n/** Whether `text` is exactly an origin (`https://host[:port]`): what the URL parser serializes it to. */\nfunction isOrigin(text: string): boolean {\n\ttry {\n\t\tconst url = new URL(text);\n\t\treturn (url.protocol === \"https:\" || url.protocol === \"http:\") && url.origin === text;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** The `Sec-Fetch-Dest` of a frame or an embed. */\nconst FRAMES: ReadonlySet<string> = new Set([\"iframe\", \"frame\", \"embed\", \"object\", \"fencedframe\"]);\n\n/** The methods that change nothing. */\nconst SAFE: ReadonlySet<string> = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n"]}
@@ -0,0 +1,21 @@
1
+ import type { Context } from "../../context/index.ts";
2
+ import type { Principal } from "../../data/index.ts";
3
+ import { type RegistryTable } from "../../registries/index.ts";
4
+ import type { HttpRequest } from "./request.ts";
5
+ /** Who `request` is, or `undefined` (anonymous here, maybe another authenticator knows). */
6
+ export type Authenticator = (request: HttpRequest, context: Context) => Principal | undefined | Promise<Principal | undefined>;
7
+ /** An authenticator with its plugin, as the component asks it. */
8
+ export type AuthenticatorEntry = {
9
+ readonly plugin: string;
10
+ readonly authenticate: Authenticator;
11
+ };
12
+ /** The registry of authenticators (served by `http.facet`). */
13
+ export declare const Authenticators: import("../../registries/registry.ts").Registry<Authenticator, readonly AuthenticatorEntry[]>;
14
+ /** Composes `Authenticators`: every contribution in contributor order. */
15
+ export declare function composeAuthenticators(table: RegistryTable<Authenticator>): readonly AuthenticatorEntry[];
16
+ /**
17
+ * The principal of `request`: the first one an authenticator returns, in order; one that throws is reported through
18
+ * `failed` and skipped; none: `undefined` (anonymous). Once `context` is aborted no further authenticator starts.
19
+ */
20
+ export declare function authenticate(authenticators: readonly AuthenticatorEntry[], request: HttpRequest, failed: (plugin: string, error: unknown) => void, context: Context): Promise<Principal | undefined>;
21
+ //# sourceMappingURL=authenticate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.d.ts","sourceRoot":"","sources":["../../../src/node/http/authenticate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GAAG,CAC3B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,OAAO,KACZ,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;AAE5D,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAA;CAAE,CAAC;AAEnG,+DAA+D;AAC/D,eAAO,MAAM,cAAc,+FAK1B,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,SAAS,kBAAkB,EAAE,CAExG;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,cAAc,EAAE,SAAS,kBAAkB,EAAE,EAC7C,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,EAChD,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAYhC"}
@@ -0,0 +1,34 @@
1
+ // Who someone is (decision "The HTTP server is a native object", replacing the `authenticate` option): the registry
2
+ // `Authenticators`, one function per contributor, asked in contributor order (plugin name: an order with no meaning, so
3
+ // an app needing precedence between credentials contributes one authenticator that decides); the first principal
4
+ // returned wins, a throwing one is reported and skipped.
5
+ import { defineRegistry } from "../../registries/index.js";
6
+ /** The registry of authenticators (served by `http.facet`). */
7
+ export const Authenticators = defineRegistry("chord.http.authenticators", {
8
+ version: 1,
9
+ });
10
+ /** Composes `Authenticators`: every contribution in contributor order. */
11
+ export function composeAuthenticators(table) {
12
+ return table.map(({ plugin, value }) => ({ plugin, authenticate: value }));
13
+ }
14
+ /**
15
+ * The principal of `request`: the first one an authenticator returns, in order; one that throws is reported through
16
+ * `failed` and skipped; none: `undefined` (anonymous). Once `context` is aborted no further authenticator starts.
17
+ */
18
+ export async function authenticate(authenticators, request, failed, context) {
19
+ for (const { plugin, authenticate } of authenticators) {
20
+ // A request gone or sealed starts no new work (Sol's second recheck C).
21
+ if (context.abortSignal?.aborted)
22
+ return undefined;
23
+ try {
24
+ const principal = await authenticate(request, context);
25
+ if (principal !== undefined)
26
+ return principal;
27
+ }
28
+ catch (error) {
29
+ failed(plugin, error);
30
+ }
31
+ }
32
+ return undefined;
33
+ }
34
+ //# sourceMappingURL=authenticate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../../../src/node/http/authenticate.ts"],"names":[],"mappings":"AAAA,oHAAoH;AACpH,wHAAwH;AACxH,iHAAiH;AACjH,yDAAyD;AAIzD,OAAO,EAAE,cAAc,EAAsB,MAAM,2BAA2B,CAAC;AAY/E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAC3C,2BAA2B,EAC3B;IACC,OAAO,EAAE,CAAC;CACV,CACD,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,KAAmC;IACxE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,cAA6C,EAC7C,OAAoB,EACpB,MAAgD,EAChD,OAAgB;IAEhB,KAAK,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,cAAc,EAAE,CAAC;QACvD,wEAAwE;QACxE,IAAI,OAAO,CAAC,WAAW,EAAE,OAAO;YAAE,OAAO,SAAS,CAAC;QACnD,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["// Who someone is (decision \"The HTTP server is a native object\", replacing the `authenticate` option): the registry\n// `Authenticators`, one function per contributor, asked in contributor order (plugin name: an order with no meaning, so\n// an app needing precedence between credentials contributes one authenticator that decides); the first principal\n// returned wins, a throwing one is reported and skipped.\n\nimport type { Context } from \"../../context/index.ts\";\nimport type { Principal } from \"../../data/index.ts\";\nimport { defineRegistry, type RegistryTable } from \"../../registries/index.ts\";\nimport type { HttpRequest } from \"./request.ts\";\n\n/** Who `request` is, or `undefined` (anonymous here, maybe another authenticator knows). */\nexport type Authenticator = (\n\trequest: HttpRequest,\n\tcontext: Context,\n) => Principal | undefined | Promise<Principal | undefined>;\n\n/** An authenticator with its plugin, as the component asks it. */\nexport type AuthenticatorEntry = { readonly plugin: string; readonly authenticate: Authenticator };\n\n/** The registry of authenticators (served by `http.facet`). */\nexport const Authenticators = defineRegistry<Authenticator, readonly AuthenticatorEntry[]>(\n\t\"chord.http.authenticators\",\n\t{\n\t\tversion: 1,\n\t},\n);\n\n/** Composes `Authenticators`: every contribution in contributor order. */\nexport function composeAuthenticators(table: RegistryTable<Authenticator>): readonly AuthenticatorEntry[] {\n\treturn table.map(({ plugin, value }) => ({ plugin, authenticate: value }));\n}\n\n/**\n * The principal of `request`: the first one an authenticator returns, in order; one that throws is reported through\n * `failed` and skipped; none: `undefined` (anonymous). Once `context` is aborted no further authenticator starts.\n */\nexport async function authenticate(\n\tauthenticators: readonly AuthenticatorEntry[],\n\trequest: HttpRequest,\n\tfailed: (plugin: string, error: unknown) => void,\n\tcontext: Context,\n): Promise<Principal | undefined> {\n\tfor (const { plugin, authenticate } of authenticators) {\n\t\t// A request gone or sealed starts no new work (Sol's second recheck C).\n\t\tif (context.abortSignal?.aborted) return undefined;\n\t\ttry {\n\t\t\tconst principal = await authenticate(request, context);\n\t\t\tif (principal !== undefined) return principal;\n\t\t} catch (error) {\n\t\t\tfailed(plugin, error);\n\t\t}\n\t}\n\treturn undefined;\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import type { HttpRequest } from "./request.ts";
2
+ /** What `cookie` takes besides the name and the value. */
3
+ export type CookieOptions = {
4
+ /** The key it is signed with (HMAC-SHA256). */
5
+ readonly secret: string;
6
+ /** The request it answers (its provenance): a remote one gets `Secure`. */
7
+ readonly request: Pick<HttpRequest, "provenance">;
8
+ /** `Strict` by default; `Lax` lets a top-level navigation from another site carry it. */
9
+ readonly sameSite?: "Strict" | "Lax";
10
+ /** Seconds until it expires; none: a session cookie. */
11
+ readonly maxAge?: number;
12
+ };
13
+ /**
14
+ * A signed `Set-Cookie` value for `name` and `value` (put it in a response's `headers`, `Set-Cookie`). With `maxAge`
15
+ * its expiry is signed with it: a copy read back later is refused (Opus's recheck R3); without, it holds until the
16
+ * secret changes.
17
+ */
18
+ export declare function cookie(name: string, value: string, options: CookieOptions): string;
19
+ /**
20
+ * The value of cookie `name` on `request` when its signature with `secret` holds and its signed expiry has not passed;
21
+ * `undefined` otherwise.
22
+ */
23
+ export declare function readCookie(request: HttpRequest, name: string, secret: string): string | undefined;
24
+ /**
25
+ * Cookie `name` on `request` as `readCookie` checks it, with its signed expiry (milliseconds since the epoch; none for
26
+ * a cookie without `maxAge`): what renewing a cookie before it expires needs.
27
+ */
28
+ export declare function readSignedCookie(request: HttpRequest, name: string, secret: string): {
29
+ readonly value: string;
30
+ readonly expires: number | undefined;
31
+ } | undefined;
32
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../../src/node/http/cookies.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAClD,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IACrC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAalF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACZ;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAuB9E"}
@@ -0,0 +1,70 @@
1
+ // Cookies (decision "The HTTP component's security baseline" (5)): `cookie` makes a signed `Set-Cookie` value with the
2
+ // safe defaults (`HttpOnly`, `Path=/`, `SameSite=Strict`, `Secure` on a remote origin), `readCookie` reads one back,
3
+ // its signature checked in constant time.
4
+ import { createHmac, timingSafeEqual } from "node:crypto";
5
+ /**
6
+ * A signed `Set-Cookie` value for `name` and `value` (put it in a response's `headers`, `Set-Cookie`). With `maxAge`
7
+ * its expiry is signed with it: a copy read back later is refused (Opus's recheck R3); without, it holds until the
8
+ * secret changes.
9
+ */
10
+ export function cookie(name, value, options) {
11
+ const encoded = encodeURIComponent(value);
12
+ const expires = options.maxAge === undefined ? "" : String(Math.floor(Date.now() / 1000 + options.maxAge));
13
+ const payload = `${encoded}.${expires}`;
14
+ const parts = [
15
+ `${name}=${payload}.${signature(name, payload, options.secret)}`,
16
+ "HttpOnly",
17
+ "Path=/",
18
+ `SameSite=${options.sameSite ?? "Strict"}`,
19
+ ];
20
+ if (options.request.provenance.kind !== "local")
21
+ parts.push("Secure");
22
+ if (options.maxAge !== undefined)
23
+ parts.push(`Max-Age=${Math.floor(options.maxAge)}`);
24
+ return parts.join("; ");
25
+ }
26
+ /**
27
+ * The value of cookie `name` on `request` when its signature with `secret` holds and its signed expiry has not passed;
28
+ * `undefined` otherwise.
29
+ */
30
+ export function readCookie(request, name, secret) {
31
+ return readSignedCookie(request, name, secret)?.value;
32
+ }
33
+ /**
34
+ * Cookie `name` on `request` as `readCookie` checks it, with its signed expiry (milliseconds since the epoch; none for
35
+ * a cookie without `maxAge`): what renewing a cookie before it expires needs.
36
+ */
37
+ export function readSignedCookie(request, name, secret) {
38
+ for (const pair of (request.headers.get("cookie") ?? "").split(";")) {
39
+ const equals = pair.indexOf("=");
40
+ if (equals < 0 || pair.slice(0, equals).trim() !== name)
41
+ continue;
42
+ const signed = pair.slice(equals + 1).trim();
43
+ // From the right: the value may hold dots, the expiry and the signature never do.
44
+ const dot = signed.lastIndexOf(".");
45
+ const payload = signed.slice(0, dot);
46
+ const expiresAt = payload.lastIndexOf(".");
47
+ if (dot < 0 || expiresAt < 0)
48
+ return undefined;
49
+ const given = Buffer.from(signed.slice(dot + 1));
50
+ const expected = Buffer.from(signature(name, payload, secret));
51
+ if (given.length !== expected.length || !timingSafeEqual(given, expected))
52
+ return undefined;
53
+ const stamp = payload.slice(expiresAt + 1);
54
+ const expires = stamp === "" ? undefined : Number(stamp) * 1000;
55
+ if (expires !== undefined && expires <= Date.now())
56
+ return undefined;
57
+ try {
58
+ return { value: decodeURIComponent(payload.slice(0, expiresAt)), expires };
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ }
64
+ return undefined;
65
+ }
66
+ /** The signature of a cookie's name and payload (its encoded value and expiry). */
67
+ function signature(name, payload, secret) {
68
+ return createHmac("sha256", secret).update(`${name}=${payload}`).digest("base64url");
69
+ }
70
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../../src/node/http/cookies.ts"],"names":[],"mappings":"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","sourcesContent":["// Cookies (decision \"The HTTP component's security baseline\" (5)): `cookie` makes a signed `Set-Cookie` value with the\n// safe defaults (`HttpOnly`, `Path=/`, `SameSite=Strict`, `Secure` on a remote origin), `readCookie` reads one back,\n// its signature checked in constant time.\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { HttpRequest } from \"./request.ts\";\n\n/** What `cookie` takes besides the name and the value. */\nexport type CookieOptions = {\n\t/** The key it is signed with (HMAC-SHA256). */\n\treadonly secret: string;\n\t/** The request it answers (its provenance): a remote one gets `Secure`. */\n\treadonly request: Pick<HttpRequest, \"provenance\">;\n\t/** `Strict` by default; `Lax` lets a top-level navigation from another site carry it. */\n\treadonly sameSite?: \"Strict\" | \"Lax\";\n\t/** Seconds until it expires; none: a session cookie. */\n\treadonly maxAge?: number;\n};\n\n/**\n * A signed `Set-Cookie` value for `name` and `value` (put it in a response's `headers`, `Set-Cookie`). With `maxAge`\n * its expiry is signed with it: a copy read back later is refused (Opus's recheck R3); without, it holds until the\n * secret changes.\n */\nexport function cookie(name: string, value: string, options: CookieOptions): string {\n\tconst encoded = encodeURIComponent(value);\n\tconst expires = options.maxAge === undefined ? \"\" : String(Math.floor(Date.now() / 1000 + options.maxAge));\n\tconst payload = `${encoded}.${expires}`;\n\tconst parts = [\n\t\t`${name}=${payload}.${signature(name, payload, options.secret)}`,\n\t\t\"HttpOnly\",\n\t\t\"Path=/\",\n\t\t`SameSite=${options.sameSite ?? \"Strict\"}`,\n\t];\n\tif (options.request.provenance.kind !== \"local\") parts.push(\"Secure\");\n\tif (options.maxAge !== undefined) parts.push(`Max-Age=${Math.floor(options.maxAge)}`);\n\treturn parts.join(\"; \");\n}\n\n/**\n * The value of cookie `name` on `request` when its signature with `secret` holds and its signed expiry has not passed;\n * `undefined` otherwise.\n */\nexport function readCookie(request: HttpRequest, name: string, secret: string): string | undefined {\n\treturn readSignedCookie(request, name, secret)?.value;\n}\n\n/**\n * Cookie `name` on `request` as `readCookie` checks it, with its signed expiry (milliseconds since the epoch; none for\n * a cookie without `maxAge`): what renewing a cookie before it expires needs.\n */\nexport function readSignedCookie(\n\trequest: HttpRequest,\n\tname: string,\n\tsecret: string,\n): { readonly value: string; readonly expires: number | undefined } | undefined {\n\tfor (const pair of (request.headers.get(\"cookie\") ?? \"\").split(\";\")) {\n\t\tconst equals = pair.indexOf(\"=\");\n\t\tif (equals < 0 || pair.slice(0, equals).trim() !== name) continue;\n\t\tconst signed = pair.slice(equals + 1).trim();\n\t\t// From the right: the value may hold dots, the expiry and the signature never do.\n\t\tconst dot = signed.lastIndexOf(\".\");\n\t\tconst payload = signed.slice(0, dot);\n\t\tconst expiresAt = payload.lastIndexOf(\".\");\n\t\tif (dot < 0 || expiresAt < 0) return undefined;\n\t\tconst given = Buffer.from(signed.slice(dot + 1));\n\t\tconst expected = Buffer.from(signature(name, payload, secret));\n\t\tif (given.length !== expected.length || !timingSafeEqual(given, expected)) return undefined;\n\t\tconst stamp = payload.slice(expiresAt + 1);\n\t\tconst expires = stamp === \"\" ? undefined : Number(stamp) * 1000;\n\t\tif (expires !== undefined && expires <= Date.now()) return undefined;\n\t\ttry {\n\t\t\treturn { value: decodeURIComponent(payload.slice(0, expiresAt)), expires };\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/** The signature of a cookie's name and payload (its encoded value and expiry). */\nfunction signature(name: string, payload: string, secret: string): string {\n\treturn createHmac(\"sha256\", secret).update(`${name}=${payload}`).digest(\"base64url\");\n}\n"]}