@sempdev/semp 0.4.3

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 (559) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/brief/address.d.ts +77 -0
  4. package/dist/brief/address.d.ts.map +1 -0
  5. package/dist/brief/address.js +217 -0
  6. package/dist/brief/address.js.map +1 -0
  7. package/dist/brief/brief.d.ts +75 -0
  8. package/dist/brief/brief.d.ts.map +1 -0
  9. package/dist/brief/brief.js +56 -0
  10. package/dist/brief/brief.js.map +1 -0
  11. package/dist/brief/index.d.ts +11 -0
  12. package/dist/brief/index.d.ts.map +1 -0
  13. package/dist/brief/index.js +11 -0
  14. package/dist/brief/index.js.map +1 -0
  15. package/dist/canonical/index.d.ts +8 -0
  16. package/dist/canonical/index.d.ts.map +1 -0
  17. package/dist/canonical/index.js +8 -0
  18. package/dist/canonical/index.js.map +1 -0
  19. package/dist/canonical/marshal.d.ts +35 -0
  20. package/dist/canonical/marshal.d.ts.map +1 -0
  21. package/dist/canonical/marshal.js +107 -0
  22. package/dist/canonical/marshal.js.map +1 -0
  23. package/dist/clockskew/index.d.ts +52 -0
  24. package/dist/clockskew/index.d.ts.map +1 -0
  25. package/dist/clockskew/index.js +62 -0
  26. package/dist/clockskew/index.js.map +1 -0
  27. package/dist/closure/closure.d.ts +106 -0
  28. package/dist/closure/closure.d.ts.map +1 -0
  29. package/dist/closure/closure.js +152 -0
  30. package/dist/closure/closure.js.map +1 -0
  31. package/dist/closure/driver.d.ts +103 -0
  32. package/dist/closure/driver.d.ts.map +1 -0
  33. package/dist/closure/driver.js +126 -0
  34. package/dist/closure/driver.js.map +1 -0
  35. package/dist/closure/index.d.ts +13 -0
  36. package/dist/closure/index.d.ts.map +1 -0
  37. package/dist/closure/index.js +13 -0
  38. package/dist/closure/index.js.map +1 -0
  39. package/dist/closure/store.d.ts +80 -0
  40. package/dist/closure/store.d.ts.map +1 -0
  41. package/dist/closure/store.js +89 -0
  42. package/dist/closure/store.js.map +1 -0
  43. package/dist/crypto/aead.d.ts +29 -0
  44. package/dist/crypto/aead.d.ts.map +1 -0
  45. package/dist/crypto/aead.js +48 -0
  46. package/dist/crypto/aead.js.map +1 -0
  47. package/dist/crypto/argon2.d.ts +20 -0
  48. package/dist/crypto/argon2.d.ts.map +1 -0
  49. package/dist/crypto/argon2.js +28 -0
  50. package/dist/crypto/argon2.js.map +1 -0
  51. package/dist/crypto/index.d.ts +14 -0
  52. package/dist/crypto/index.d.ts.map +1 -0
  53. package/dist/crypto/index.js +14 -0
  54. package/dist/crypto/index.js.map +1 -0
  55. package/dist/crypto/kdf.d.ts +96 -0
  56. package/dist/crypto/kdf.d.ts.map +1 -0
  57. package/dist/crypto/kdf.js +122 -0
  58. package/dist/crypto/kdf.js.map +1 -0
  59. package/dist/crypto/kem.d.ts +85 -0
  60. package/dist/crypto/kem.d.ts.map +1 -0
  61. package/dist/crypto/kem.js +130 -0
  62. package/dist/crypto/kem.js.map +1 -0
  63. package/dist/crypto/mac.d.ts +19 -0
  64. package/dist/crypto/mac.d.ts.map +1 -0
  65. package/dist/crypto/mac.js +32 -0
  66. package/dist/crypto/mac.js.map +1 -0
  67. package/dist/delivery/ack.d.ts +125 -0
  68. package/dist/delivery/ack.d.ts.map +1 -0
  69. package/dist/delivery/ack.js +141 -0
  70. package/dist/delivery/ack.js.map +1 -0
  71. package/dist/delivery/blocklist.d.ts +87 -0
  72. package/dist/delivery/blocklist.d.ts.map +1 -0
  73. package/dist/delivery/blocklist.js +107 -0
  74. package/dist/delivery/blocklist.js.map +1 -0
  75. package/dist/delivery/cancel.d.ts +60 -0
  76. package/dist/delivery/cancel.d.ts.map +1 -0
  77. package/dist/delivery/cancel.js +43 -0
  78. package/dist/delivery/cancel.js.map +1 -0
  79. package/dist/delivery/disposition.d.ts +106 -0
  80. package/dist/delivery/disposition.d.ts.map +1 -0
  81. package/dist/delivery/disposition.js +105 -0
  82. package/dist/delivery/disposition.js.map +1 -0
  83. package/dist/delivery/fetch.d.ts +59 -0
  84. package/dist/delivery/fetch.d.ts.map +1 -0
  85. package/dist/delivery/fetch.js +47 -0
  86. package/dist/delivery/fetch.js.map +1 -0
  87. package/dist/delivery/forwarder.d.ts +106 -0
  88. package/dist/delivery/forwarder.d.ts.map +1 -0
  89. package/dist/delivery/forwarder.js +251 -0
  90. package/dist/delivery/forwarder.js.map +1 -0
  91. package/dist/delivery/inbox.d.ts +42 -0
  92. package/dist/delivery/inbox.d.ts.map +1 -0
  93. package/dist/delivery/inbox.js +68 -0
  94. package/dist/delivery/inbox.js.map +1 -0
  95. package/dist/delivery/index.d.ts +31 -0
  96. package/dist/delivery/index.d.ts.map +1 -0
  97. package/dist/delivery/index.js +31 -0
  98. package/dist/delivery/index.js.map +1 -0
  99. package/dist/delivery/internalroute.d.ts +50 -0
  100. package/dist/delivery/internalroute.d.ts.map +1 -0
  101. package/dist/delivery/internalroute.js +23 -0
  102. package/dist/delivery/internalroute.js.map +1 -0
  103. package/dist/delivery/pipeline.d.ts +153 -0
  104. package/dist/delivery/pipeline.d.ts.map +1 -0
  105. package/dist/delivery/pipeline.js +356 -0
  106. package/dist/delivery/pipeline.js.map +1 -0
  107. package/dist/delivery/policy_state.d.ts +105 -0
  108. package/dist/delivery/policy_state.d.ts.map +1 -0
  109. package/dist/delivery/policy_state.js +293 -0
  110. package/dist/delivery/policy_state.js.map +1 -0
  111. package/dist/delivery/queue.d.ts +47 -0
  112. package/dist/delivery/queue.d.ts.map +1 -0
  113. package/dist/delivery/queue.js +33 -0
  114. package/dist/delivery/queue.js.map +1 -0
  115. package/dist/delivery/receipt.d.ts +137 -0
  116. package/dist/delivery/receipt.d.ts.map +1 -0
  117. package/dist/delivery/receipt.js +181 -0
  118. package/dist/delivery/receipt.js.map +1 -0
  119. package/dist/delivery/receipt_store.d.ts +81 -0
  120. package/dist/delivery/receipt_store.d.ts.map +1 -0
  121. package/dist/delivery/receipt_store.js +74 -0
  122. package/dist/delivery/receipt_store.js.map +1 -0
  123. package/dist/delivery/retry.d.ts +78 -0
  124. package/dist/delivery/retry.d.ts.map +1 -0
  125. package/dist/delivery/retry.js +132 -0
  126. package/dist/delivery/retry.js.map +1 -0
  127. package/dist/delivery/scheduler.d.ts +156 -0
  128. package/dist/delivery/scheduler.d.ts.map +1 -0
  129. package/dist/delivery/scheduler.js +349 -0
  130. package/dist/delivery/scheduler.js.map +1 -0
  131. package/dist/delivery/stage_partition.d.ts +87 -0
  132. package/dist/delivery/stage_partition.d.ts.map +1 -0
  133. package/dist/delivery/stage_partition.js +122 -0
  134. package/dist/delivery/stage_partition.js.map +1 -0
  135. package/dist/delivery/staged_runner.d.ts +100 -0
  136. package/dist/delivery/staged_runner.d.ts.map +1 -0
  137. package/dist/delivery/staged_runner.js +277 -0
  138. package/dist/delivery/staged_runner.js.map +1 -0
  139. package/dist/delivery/submission.d.ts +72 -0
  140. package/dist/delivery/submission.d.ts.map +1 -0
  141. package/dist/delivery/submission.js +58 -0
  142. package/dist/delivery/submission.js.map +1 -0
  143. package/dist/delivery/sync.d.ts +68 -0
  144. package/dist/delivery/sync.d.ts.map +1 -0
  145. package/dist/delivery/sync.js +99 -0
  146. package/dist/delivery/sync.js.map +1 -0
  147. package/dist/delivery/user_policy.d.ts +74 -0
  148. package/dist/delivery/user_policy.d.ts.map +1 -0
  149. package/dist/delivery/user_policy.js +140 -0
  150. package/dist/delivery/user_policy.js.map +1 -0
  151. package/dist/discovery/cache.d.ts +37 -0
  152. package/dist/discovery/cache.d.ts.map +1 -0
  153. package/dist/discovery/cache.js +45 -0
  154. package/dist/discovery/cache.js.map +1 -0
  155. package/dist/discovery/configuration.d.ts +97 -0
  156. package/dist/discovery/configuration.d.ts.map +1 -0
  157. package/dist/discovery/configuration.js +146 -0
  158. package/dist/discovery/configuration.js.map +1 -0
  159. package/dist/discovery/dns.d.ts +56 -0
  160. package/dist/discovery/dns.d.ts.map +1 -0
  161. package/dist/discovery/dns.js +120 -0
  162. package/dist/discovery/dns.js.map +1 -0
  163. package/dist/discovery/domain_keys.d.ts +62 -0
  164. package/dist/discovery/domain_keys.d.ts.map +1 -0
  165. package/dist/discovery/domain_keys.js +89 -0
  166. package/dist/discovery/domain_keys.js.map +1 -0
  167. package/dist/discovery/index.d.ts +19 -0
  168. package/dist/discovery/index.d.ts.map +1 -0
  169. package/dist/discovery/index.js +19 -0
  170. package/dist/discovery/index.js.map +1 -0
  171. package/dist/discovery/lookup.d.ts +72 -0
  172. package/dist/discovery/lookup.d.ts.map +1 -0
  173. package/dist/discovery/lookup.js +121 -0
  174. package/dist/discovery/lookup.js.map +1 -0
  175. package/dist/discovery/onion.d.ts +34 -0
  176. package/dist/discovery/onion.d.ts.map +1 -0
  177. package/dist/discovery/onion.js +61 -0
  178. package/dist/discovery/onion.js.map +1 -0
  179. package/dist/discovery/partition.d.ts +96 -0
  180. package/dist/discovery/partition.d.ts.map +1 -0
  181. package/dist/discovery/partition.js +247 -0
  182. package/dist/discovery/partition.js.map +1 -0
  183. package/dist/discovery/resolver.d.ts +113 -0
  184. package/dist/discovery/resolver.d.ts.map +1 -0
  185. package/dist/discovery/resolver.js +176 -0
  186. package/dist/discovery/resolver.js.map +1 -0
  187. package/dist/discovery/txt.d.ts +39 -0
  188. package/dist/discovery/txt.d.ts.map +1 -0
  189. package/dist/discovery/txt.js +71 -0
  190. package/dist/discovery/txt.js.map +1 -0
  191. package/dist/enclosure/forwarding.d.ts +128 -0
  192. package/dist/enclosure/forwarding.d.ts.map +1 -0
  193. package/dist/enclosure/forwarding.js +119 -0
  194. package/dist/enclosure/forwarding.js.map +1 -0
  195. package/dist/enclosure/index.d.ts +11 -0
  196. package/dist/enclosure/index.d.ts.map +1 -0
  197. package/dist/enclosure/index.js +11 -0
  198. package/dist/enclosure/index.js.map +1 -0
  199. package/dist/envelope/buckets.d.ts +38 -0
  200. package/dist/envelope/buckets.d.ts.map +1 -0
  201. package/dist/envelope/buckets.js +73 -0
  202. package/dist/envelope/buckets.js.map +1 -0
  203. package/dist/envelope/canonical.d.ts +28 -0
  204. package/dist/envelope/canonical.d.ts.map +1 -0
  205. package/dist/envelope/canonical.js +54 -0
  206. package/dist/envelope/canonical.js.map +1 -0
  207. package/dist/envelope/compose.d.ts +171 -0
  208. package/dist/envelope/compose.d.ts.map +1 -0
  209. package/dist/envelope/compose.js +237 -0
  210. package/dist/envelope/compose.js.map +1 -0
  211. package/dist/envelope/encode.d.ts +41 -0
  212. package/dist/envelope/encode.d.ts.map +1 -0
  213. package/dist/envelope/encode.js +69 -0
  214. package/dist/envelope/encode.js.map +1 -0
  215. package/dist/envelope/index.d.ts +20 -0
  216. package/dist/envelope/index.d.ts.map +1 -0
  217. package/dist/envelope/index.js +20 -0
  218. package/dist/envelope/index.js.map +1 -0
  219. package/dist/envelope/open_any.d.ts +48 -0
  220. package/dist/envelope/open_any.d.ts.map +1 -0
  221. package/dist/envelope/open_any.js +81 -0
  222. package/dist/envelope/open_any.js.map +1 -0
  223. package/dist/envelope/open_verified.d.ts +59 -0
  224. package/dist/envelope/open_verified.d.ts.map +1 -0
  225. package/dist/envelope/open_verified.js +67 -0
  226. package/dist/envelope/open_verified.js.map +1 -0
  227. package/dist/envelope/padding.d.ts +55 -0
  228. package/dist/envelope/padding.d.ts.map +1 -0
  229. package/dist/envelope/padding.js +162 -0
  230. package/dist/envelope/padding.js.map +1 -0
  231. package/dist/envelope/rejection.d.ts +22 -0
  232. package/dist/envelope/rejection.d.ts.map +1 -0
  233. package/dist/envelope/rejection.js +30 -0
  234. package/dist/envelope/rejection.js.map +1 -0
  235. package/dist/envelope/sendtime.d.ts +49 -0
  236. package/dist/envelope/sendtime.d.ts.map +1 -0
  237. package/dist/envelope/sendtime.js +87 -0
  238. package/dist/envelope/sendtime.js.map +1 -0
  239. package/dist/envelope/verify.d.ts +29 -0
  240. package/dist/envelope/verify.d.ts.map +1 -0
  241. package/dist/envelope/verify.js +90 -0
  242. package/dist/envelope/verify.js.map +1 -0
  243. package/dist/extensions/index.d.ts +7 -0
  244. package/dist/extensions/index.d.ts.map +1 -0
  245. package/dist/extensions/index.js +7 -0
  246. package/dist/extensions/index.js.map +1 -0
  247. package/dist/extensions/limits.d.ts +101 -0
  248. package/dist/extensions/limits.d.ts.map +1 -0
  249. package/dist/extensions/limits.js +175 -0
  250. package/dist/extensions/limits.js.map +1 -0
  251. package/dist/handshake/abort.d.ts +49 -0
  252. package/dist/handshake/abort.d.ts.map +1 -0
  253. package/dist/handshake/abort.js +82 -0
  254. package/dist/handshake/abort.js.map +1 -0
  255. package/dist/handshake/capabilities.d.ts +46 -0
  256. package/dist/handshake/capabilities.d.ts.map +1 -0
  257. package/dist/handshake/capabilities.js +114 -0
  258. package/dist/handshake/capabilities.js.map +1 -0
  259. package/dist/handshake/client_state.d.ts +186 -0
  260. package/dist/handshake/client_state.d.ts.map +1 -0
  261. package/dist/handshake/client_state.js +520 -0
  262. package/dist/handshake/client_state.js.map +1 -0
  263. package/dist/handshake/confirm.d.ts +21 -0
  264. package/dist/handshake/confirm.d.ts.map +1 -0
  265. package/dist/handshake/confirm.js +27 -0
  266. package/dist/handshake/confirm.js.map +1 -0
  267. package/dist/handshake/driver.d.ts +126 -0
  268. package/dist/handshake/driver.d.ts.map +1 -0
  269. package/dist/handshake/driver.js +251 -0
  270. package/dist/handshake/driver.js.map +1 -0
  271. package/dist/handshake/federation.d.ts +365 -0
  272. package/dist/handshake/federation.d.ts.map +1 -0
  273. package/dist/handshake/federation.js +664 -0
  274. package/dist/handshake/federation.js.map +1 -0
  275. package/dist/handshake/first_contact.d.ts +57 -0
  276. package/dist/handshake/first_contact.d.ts.map +1 -0
  277. package/dist/handshake/first_contact.js +124 -0
  278. package/dist/handshake/first_contact.js.map +1 -0
  279. package/dist/handshake/identity.d.ts +101 -0
  280. package/dist/handshake/identity.d.ts.map +1 -0
  281. package/dist/handshake/identity.js +117 -0
  282. package/dist/handshake/identity.js.map +1 -0
  283. package/dist/handshake/index.d.ts +21 -0
  284. package/dist/handshake/index.d.ts.map +1 -0
  285. package/dist/handshake/index.js +21 -0
  286. package/dist/handshake/index.js.map +1 -0
  287. package/dist/handshake/messages.d.ts +176 -0
  288. package/dist/handshake/messages.d.ts.map +1 -0
  289. package/dist/handshake/messages.js +125 -0
  290. package/dist/handshake/messages.js.map +1 -0
  291. package/dist/handshake/pow.d.ts +53 -0
  292. package/dist/handshake/pow.d.ts.map +1 -0
  293. package/dist/handshake/pow.js +142 -0
  294. package/dist/handshake/pow.js.map +1 -0
  295. package/dist/handshake/resume_driver.d.ts +56 -0
  296. package/dist/handshake/resume_driver.d.ts.map +1 -0
  297. package/dist/handshake/resume_driver.js +75 -0
  298. package/dist/handshake/resume_driver.js.map +1 -0
  299. package/dist/handshake/server.d.ts +112 -0
  300. package/dist/handshake/server.d.ts.map +1 -0
  301. package/dist/handshake/server.js +247 -0
  302. package/dist/handshake/server.js.map +1 -0
  303. package/dist/handshake/server_state.d.ts +102 -0
  304. package/dist/handshake/server_state.d.ts.map +1 -0
  305. package/dist/handshake/server_state.js +278 -0
  306. package/dist/handshake/server_state.js.map +1 -0
  307. package/dist/index.d.ts +33 -0
  308. package/dist/index.d.ts.map +1 -0
  309. package/dist/index.js +33 -0
  310. package/dist/index.js.map +1 -0
  311. package/dist/keys/compromise.d.ts +118 -0
  312. package/dist/keys/compromise.d.ts.map +1 -0
  313. package/dist/keys/compromise.js +218 -0
  314. package/dist/keys/compromise.js.map +1 -0
  315. package/dist/keys/device_certificate.d.ts +166 -0
  316. package/dist/keys/device_certificate.d.ts.map +1 -0
  317. package/dist/keys/device_certificate.js +328 -0
  318. package/dist/keys/device_certificate.js.map +1 -0
  319. package/dist/keys/device_records.d.ts +175 -0
  320. package/dist/keys/device_records.d.ts.map +1 -0
  321. package/dist/keys/device_records.js +418 -0
  322. package/dist/keys/device_records.js.map +1 -0
  323. package/dist/keys/directory_cache.d.ts +64 -0
  324. package/dist/keys/directory_cache.d.ts.map +1 -0
  325. package/dist/keys/directory_cache.js +98 -0
  326. package/dist/keys/directory_cache.js.map +1 -0
  327. package/dist/keys/directory_state.d.ts +79 -0
  328. package/dist/keys/directory_state.d.ts.map +1 -0
  329. package/dist/keys/directory_state.js +155 -0
  330. package/dist/keys/directory_state.js.map +1 -0
  331. package/dist/keys/index.d.ts +18 -0
  332. package/dist/keys/index.d.ts.map +1 -0
  333. package/dist/keys/index.js +18 -0
  334. package/dist/keys/index.js.map +1 -0
  335. package/dist/keys/key_revocation.d.ts +61 -0
  336. package/dist/keys/key_revocation.d.ts.map +1 -0
  337. package/dist/keys/key_revocation.js +88 -0
  338. package/dist/keys/key_revocation.js.map +1 -0
  339. package/dist/keys/request.d.ts +124 -0
  340. package/dist/keys/request.d.ts.map +1 -0
  341. package/dist/keys/request.js +130 -0
  342. package/dist/keys/request.js.map +1 -0
  343. package/dist/keys/sign.d.ts +49 -0
  344. package/dist/keys/sign.d.ts.map +1 -0
  345. package/dist/keys/sign.js +80 -0
  346. package/dist/keys/sign.js.map +1 -0
  347. package/dist/keys/signed.d.ts +80 -0
  348. package/dist/keys/signed.d.ts.map +1 -0
  349. package/dist/keys/signed.js +138 -0
  350. package/dist/keys/signed.js.map +1 -0
  351. package/dist/keys/store.d.ts +138 -0
  352. package/dist/keys/store.d.ts.map +1 -0
  353. package/dist/keys/store.js +107 -0
  354. package/dist/keys/store.js.map +1 -0
  355. package/dist/largeattachment/crypto.d.ts +47 -0
  356. package/dist/largeattachment/crypto.d.ts.map +1 -0
  357. package/dist/largeattachment/crypto.js +235 -0
  358. package/dist/largeattachment/crypto.js.map +1 -0
  359. package/dist/largeattachment/enclosure.d.ts +48 -0
  360. package/dist/largeattachment/enclosure.d.ts.map +1 -0
  361. package/dist/largeattachment/enclosure.js +102 -0
  362. package/dist/largeattachment/enclosure.js.map +1 -0
  363. package/dist/largeattachment/index.d.ts +15 -0
  364. package/dist/largeattachment/index.d.ts.map +1 -0
  365. package/dist/largeattachment/index.js +15 -0
  366. package/dist/largeattachment/index.js.map +1 -0
  367. package/dist/largeattachment/store.d.ts +36 -0
  368. package/dist/largeattachment/store.d.ts.map +1 -0
  369. package/dist/largeattachment/store.js +37 -0
  370. package/dist/largeattachment/store.js.map +1 -0
  371. package/dist/largeattachment/types.d.ts +56 -0
  372. package/dist/largeattachment/types.d.ts.map +1 -0
  373. package/dist/largeattachment/types.js +31 -0
  374. package/dist/largeattachment/types.js.map +1 -0
  375. package/dist/largeattachment/upload.d.ts +62 -0
  376. package/dist/largeattachment/upload.d.ts.map +1 -0
  377. package/dist/largeattachment/upload.js +166 -0
  378. package/dist/largeattachment/upload.js.map +1 -0
  379. package/dist/migration/index.d.ts +17 -0
  380. package/dist/migration/index.d.ts.map +1 -0
  381. package/dist/migration/index.js +17 -0
  382. package/dist/migration/index.js.map +1 -0
  383. package/dist/migration/lockout.d.ts +48 -0
  384. package/dist/migration/lockout.d.ts.map +1 -0
  385. package/dist/migration/lockout.js +57 -0
  386. package/dist/migration/lockout.js.map +1 -0
  387. package/dist/migration/migration.d.ts +48 -0
  388. package/dist/migration/migration.d.ts.map +1 -0
  389. package/dist/migration/migration.js +58 -0
  390. package/dist/migration/migration.js.map +1 -0
  391. package/dist/migration/notice.d.ts +33 -0
  392. package/dist/migration/notice.d.ts.map +1 -0
  393. package/dist/migration/notice.js +85 -0
  394. package/dist/migration/notice.js.map +1 -0
  395. package/dist/migration/orchestrate.d.ts +109 -0
  396. package/dist/migration/orchestrate.d.ts.map +1 -0
  397. package/dist/migration/orchestrate.js +212 -0
  398. package/dist/migration/orchestrate.js.map +1 -0
  399. package/dist/migration/publication_store.d.ts +34 -0
  400. package/dist/migration/publication_store.d.ts.map +1 -0
  401. package/dist/migration/publication_store.js +44 -0
  402. package/dist/migration/publication_store.js.map +1 -0
  403. package/dist/migration/sign.d.ts +65 -0
  404. package/dist/migration/sign.d.ts.map +1 -0
  405. package/dist/migration/sign.js +331 -0
  406. package/dist/migration/sign.js.map +1 -0
  407. package/dist/migration/types.d.ts +92 -0
  408. package/dist/migration/types.d.ts.map +1 -0
  409. package/dist/migration/types.js +26 -0
  410. package/dist/migration/types.js.map +1 -0
  411. package/dist/reasoncodes.d.ts +42 -0
  412. package/dist/reasoncodes.d.ts.map +1 -0
  413. package/dist/reasoncodes.js +80 -0
  414. package/dist/reasoncodes.js.map +1 -0
  415. package/dist/recovery/bundle.d.ts +34 -0
  416. package/dist/recovery/bundle.d.ts.map +1 -0
  417. package/dist/recovery/bundle.js +144 -0
  418. package/dist/recovery/bundle.js.map +1 -0
  419. package/dist/recovery/bundle_crypto.d.ts +60 -0
  420. package/dist/recovery/bundle_crypto.d.ts.map +1 -0
  421. package/dist/recovery/bundle_crypto.js +179 -0
  422. package/dist/recovery/bundle_crypto.js.map +1 -0
  423. package/dist/recovery/bundle_store.d.ts +57 -0
  424. package/dist/recovery/bundle_store.d.ts.map +1 -0
  425. package/dist/recovery/bundle_store.js +104 -0
  426. package/dist/recovery/bundle_store.js.map +1 -0
  427. package/dist/recovery/index.d.ts +19 -0
  428. package/dist/recovery/index.d.ts.map +1 -0
  429. package/dist/recovery/index.js +19 -0
  430. package/dist/recovery/index.js.map +1 -0
  431. package/dist/recovery/manifest_crosscheck.d.ts +59 -0
  432. package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
  433. package/dist/recovery/manifest_crosscheck.js +59 -0
  434. package/dist/recovery/manifest_crosscheck.js.map +1 -0
  435. package/dist/recovery/shamir.d.ts +51 -0
  436. package/dist/recovery/shamir.d.ts.map +1 -0
  437. package/dist/recovery/shamir.js +181 -0
  438. package/dist/recovery/shamir.js.map +1 -0
  439. package/dist/recovery/sign.d.ts +61 -0
  440. package/dist/recovery/sign.d.ts.map +1 -0
  441. package/dist/recovery/sign.js +359 -0
  442. package/dist/recovery/sign.js.map +1 -0
  443. package/dist/recovery/types.d.ts +180 -0
  444. package/dist/recovery/types.d.ts.map +1 -0
  445. package/dist/recovery/types.js +31 -0
  446. package/dist/recovery/types.js.map +1 -0
  447. package/dist/reputation/abuse_report.d.ts +62 -0
  448. package/dist/reputation/abuse_report.d.ts.map +1 -0
  449. package/dist/reputation/abuse_report.js +111 -0
  450. package/dist/reputation/abuse_report.js.map +1 -0
  451. package/dist/reputation/bucketize.d.ts +31 -0
  452. package/dist/reputation/bucketize.d.ts.map +1 -0
  453. package/dist/reputation/bucketize.js +77 -0
  454. package/dist/reputation/bucketize.js.map +1 -0
  455. package/dist/reputation/gossip.d.ts +24 -0
  456. package/dist/reputation/gossip.d.ts.map +1 -0
  457. package/dist/reputation/gossip.js +64 -0
  458. package/dist/reputation/gossip.js.map +1 -0
  459. package/dist/reputation/gossip_fetch.d.ts +64 -0
  460. package/dist/reputation/gossip_fetch.d.ts.map +1 -0
  461. package/dist/reputation/gossip_fetch.js +114 -0
  462. package/dist/reputation/gossip_fetch.js.map +1 -0
  463. package/dist/reputation/index.d.ts +20 -0
  464. package/dist/reputation/index.d.ts.map +1 -0
  465. package/dist/reputation/index.js +20 -0
  466. package/dist/reputation/index.js.map +1 -0
  467. package/dist/reputation/observation_store.d.ts +67 -0
  468. package/dist/reputation/observation_store.d.ts.map +1 -0
  469. package/dist/reputation/observation_store.js +171 -0
  470. package/dist/reputation/observation_store.js.map +1 -0
  471. package/dist/reputation/pow.d.ts +91 -0
  472. package/dist/reputation/pow.d.ts.map +1 -0
  473. package/dist/reputation/pow.js +209 -0
  474. package/dist/reputation/pow.js.map +1 -0
  475. package/dist/reputation/sign.d.ts +40 -0
  476. package/dist/reputation/sign.d.ts.map +1 -0
  477. package/dist/reputation/sign.js +202 -0
  478. package/dist/reputation/sign.js.map +1 -0
  479. package/dist/reputation/types.d.ts +133 -0
  480. package/dist/reputation/types.d.ts.map +1 -0
  481. package/dist/reputation/types.js +33 -0
  482. package/dist/reputation/types.js.map +1 -0
  483. package/dist/reputation/whois.d.ts +25 -0
  484. package/dist/reputation/whois.d.ts.map +1 -0
  485. package/dist/reputation/whois.js +20 -0
  486. package/dist/reputation/whois.js.map +1 -0
  487. package/dist/seal/index.d.ts +8 -0
  488. package/dist/seal/index.d.ts.map +1 -0
  489. package/dist/seal/index.js +8 -0
  490. package/dist/seal/index.js.map +1 -0
  491. package/dist/seal/wrap.d.ts +74 -0
  492. package/dist/seal/wrap.d.ts.map +1 -0
  493. package/dist/seal/wrap.js +213 -0
  494. package/dist/seal/wrap.js.map +1 -0
  495. package/dist/session/dispatcher.d.ts +65 -0
  496. package/dist/session/dispatcher.d.ts.map +1 -0
  497. package/dist/session/dispatcher.js +96 -0
  498. package/dist/session/dispatcher.js.map +1 -0
  499. package/dist/session/index.d.ts +15 -0
  500. package/dist/session/index.d.ts.map +1 -0
  501. package/dist/session/index.js +15 -0
  502. package/dist/session/index.js.map +1 -0
  503. package/dist/session/rekey.d.ts +108 -0
  504. package/dist/session/rekey.d.ts.map +1 -0
  505. package/dist/session/rekey.js +207 -0
  506. package/dist/session/rekey.js.map +1 -0
  507. package/dist/session/rekey_seal.d.ts +66 -0
  508. package/dist/session/rekey_seal.d.ts.map +1 -0
  509. package/dist/session/rekey_seal.js +153 -0
  510. package/dist/session/rekey_seal.js.map +1 -0
  511. package/dist/session/resume.d.ts +125 -0
  512. package/dist/session/resume.d.ts.map +1 -0
  513. package/dist/session/resume.js +263 -0
  514. package/dist/session/resume.js.map +1 -0
  515. package/dist/session/session.d.ts +136 -0
  516. package/dist/session/session.d.ts.map +1 -0
  517. package/dist/session/session.js +188 -0
  518. package/dist/session/session.js.map +1 -0
  519. package/dist/transparency/index.d.ts +13 -0
  520. package/dist/transparency/index.d.ts.map +1 -0
  521. package/dist/transparency/index.js +13 -0
  522. package/dist/transparency/index.js.map +1 -0
  523. package/dist/transparency/log.d.ts +61 -0
  524. package/dist/transparency/log.d.ts.map +1 -0
  525. package/dist/transparency/log.js +133 -0
  526. package/dist/transparency/log.js.map +1 -0
  527. package/dist/transparency/merkle.d.ts +59 -0
  528. package/dist/transparency/merkle.d.ts.map +1 -0
  529. package/dist/transparency/merkle.js +314 -0
  530. package/dist/transparency/merkle.js.map +1 -0
  531. package/dist/transparency/sign.d.ts +48 -0
  532. package/dist/transparency/sign.d.ts.map +1 -0
  533. package/dist/transparency/sign.js +140 -0
  534. package/dist/transparency/sign.js.map +1 -0
  535. package/dist/transparency/types.d.ts +97 -0
  536. package/dist/transparency/types.d.ts.map +1 -0
  537. package/dist/transparency/types.js +25 -0
  538. package/dist/transparency/types.js.map +1 -0
  539. package/dist/transport/h2.d.ts +163 -0
  540. package/dist/transport/h2.d.ts.map +1 -0
  541. package/dist/transport/h2.js +397 -0
  542. package/dist/transport/h2.js.map +1 -0
  543. package/dist/transport/index.d.ts +15 -0
  544. package/dist/transport/index.d.ts.map +1 -0
  545. package/dist/transport/index.js +15 -0
  546. package/dist/transport/index.js.map +1 -0
  547. package/dist/transport/memory.d.ts +21 -0
  548. package/dist/transport/memory.d.ts.map +1 -0
  549. package/dist/transport/memory.js +112 -0
  550. package/dist/transport/memory.js.map +1 -0
  551. package/dist/transport/transport.d.ts +54 -0
  552. package/dist/transport/transport.d.ts.map +1 -0
  553. package/dist/transport/transport.js +20 -0
  554. package/dist/transport/transport.js.map +1 -0
  555. package/dist/transport/ws.d.ts +40 -0
  556. package/dist/transport/ws.d.ts.map +1 -0
  557. package/dist/transport/ws.js +204 -0
  558. package/dist/transport/ws.js.map +1 -0
  559. package/package.json +147 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Sending-side delivery scheduler per DELIVERY.md §2.3 + §2.5 + §2.7.
3
+ *
4
+ * Drives the §4.5 delivery queue by consuming the §2.3 retry helpers
5
+ * and the §2.5 queue-state record against an injectable
6
+ * {@link DeliverFunc}. Operators call {@link Scheduler.tick} on a
7
+ * timer (every few seconds). Each tick:
8
+ *
9
+ * - Pulls due records from the {@link SchedulerStore}.
10
+ * - Runs {@link DeliverFunc} against each.
11
+ * - Updates state per the per-attempt outcome:
12
+ * - `delivered` → state = `delivered`, emit event.
13
+ * - `rejected` (non-recoverable) → state = `rejected`, emit event.
14
+ * - `rejected` (recoverable) / `silent` / transport failure →
15
+ * schedule next attempt via `nextAttemptAt`.
16
+ * - Effective deadline reached → state = `expired`, emit event.
17
+ *
18
+ * @module
19
+ */
20
+ import { type RetryConfig } from "./retry.js";
21
+ import { type QueueState } from "./queue.js";
22
+ import type { CancelResult } from "./cancel.js";
23
+ import { type SubmissionEvent } from "./submission.js";
24
+ /** Outcome of a single delivery attempt. */
25
+ export interface AttemptResult {
26
+ status: "delivered" | "rejected" | "silent";
27
+ reasonCode?: string;
28
+ reason?: string;
29
+ }
30
+ /** Performs a single delivery attempt against `(envelopeId, recipient)`. */
31
+ export type DeliverFunc = (envelopeId: string, recipient: string) => Promise<AttemptResult>;
32
+ /** Consumes terminal-state delivery events per §6.5. */
33
+ export type EventSink = (ev: SubmissionEvent) => void;
34
+ /** Persistence interface for queue records. */
35
+ export interface SchedulerStore {
36
+ /** Insert or update a record. */
37
+ put(q: QueueState): Promise<void>;
38
+ /** Fetch a record by `(envelope_id, recipient)`, or `null`. */
39
+ get(envelopeId: string, recipient: string): Promise<QueueState | null>;
40
+ /**
41
+ * Every non-terminal record whose `next_attempt_at` is at or
42
+ * before `now`, ordered ascending by `next_attempt_at` with ties
43
+ * broken by `envelope_id`.
44
+ */
45
+ dueRecords(now: Date): Promise<QueueState[]>;
46
+ /**
47
+ * Terminal records whose `terminal_at` is at or before `cutoff`.
48
+ * Used by the retention prune.
49
+ */
50
+ listTerminalOlderThan(cutoff: Date): Promise<QueueState[]>;
51
+ /** Remove a record. */
52
+ delete(envelopeId: string, recipient: string): Promise<void>;
53
+ }
54
+ /** Inputs to {@link Scheduler}. */
55
+ export interface SchedulerConfig {
56
+ store: SchedulerStore;
57
+ deliver: DeliverFunc;
58
+ /** Backoff policy. Defaults applied via {@link sanitizeRetry}. */
59
+ retry?: RetryConfig;
60
+ /**
61
+ * Operator-configured retry horizon per §2.4. Defaults to
62
+ * 72 hours; values above 7 days are clamped down.
63
+ */
64
+ maxRetryHorizonMs?: number;
65
+ /** Optional terminal-event sink. */
66
+ eventSink?: EventSink;
67
+ /** Wall-clock hook. Defaults to `() => new Date()`. */
68
+ now?: () => Date;
69
+ }
70
+ /** Sentinel error: a tick is already in progress. */
71
+ export declare class TickInProgressError extends Error {
72
+ readonly name = "TickInProgressError";
73
+ constructor();
74
+ }
75
+ /** Sentinel error: no queue record for the requested key. */
76
+ export declare class UnknownRecordError extends Error {
77
+ readonly name = "UnknownRecordError";
78
+ constructor(envelopeId: string, recipient: string);
79
+ }
80
+ /**
81
+ * Sending-side delivery scheduler. Single-process; the JS
82
+ * run-to-completion model gives effectively-atomic Tick semantics.
83
+ * `tickInFlight` is enforced by a software latch so concurrent
84
+ * calls return {@link TickInProgressError}.
85
+ */
86
+ export declare class Scheduler {
87
+ private readonly store;
88
+ private readonly deliver;
89
+ private readonly retry;
90
+ private readonly horizonMs;
91
+ private readonly eventSink;
92
+ private readonly nowFn;
93
+ private tickInFlight;
94
+ constructor(cfg: SchedulerConfig);
95
+ /**
96
+ * Insert a new queue record for `(envelopeId, recipient)`. State
97
+ * starts at `queued`; `next_attempt_at = now` (deliver on next
98
+ * tick); `deadline = effectiveDeadline(postmarkExpires, now,
99
+ * horizon)`.
100
+ *
101
+ * Throws when a record for the same `(envelopeId, recipient)`
102
+ * already exists.
103
+ */
104
+ enqueue(envelopeId: string, recipient: string, postmarkExpires: Date): Promise<void>;
105
+ /**
106
+ * Pull every record whose `next_attempt_at` has passed and
107
+ * process it. Returns the number of records advanced (terminal
108
+ * or otherwise) and, on partial failure, the first error
109
+ * encountered (per-record errors do not abort the tick).
110
+ *
111
+ * Throws {@link TickInProgressError} if a concurrent tick is
112
+ * already running.
113
+ */
114
+ tick(): Promise<{
115
+ advanced: number;
116
+ firstError?: Error;
117
+ }>;
118
+ /**
119
+ * Transition `(envelopeId, recipient)` to the `canceled` terminal
120
+ * state per §2.7. Returns the resulting {@link CancelResult}.
121
+ * Idempotent: cancellation of a record already in a terminal
122
+ * state is a no-op that returns the prior state.
123
+ */
124
+ cancel(envelopeId: string, recipient: string): Promise<CancelResult>;
125
+ /**
126
+ * Cancel every still-non-terminal record for `envelopeId` across
127
+ * all recipients. Returns one {@link CancelResult} per record
128
+ * observed.
129
+ */
130
+ cancelEnvelope(envelopeId: string): Promise<CancelResult[]>;
131
+ /**
132
+ * Evict terminal records whose `terminal_at` is at or before
133
+ * `now - retentionMs` per §2.5 retention. Returns the count
134
+ * pruned.
135
+ */
136
+ pruneTerminal(retentionMs: number): Promise<number>;
137
+ private runAttempt;
138
+ private transitionTerminal;
139
+ private transitionExpired;
140
+ private emit;
141
+ }
142
+ /**
143
+ * Reference in-memory {@link SchedulerStore}. Tests / single-process
144
+ * demos only — production deployments back the queue with durable
145
+ * storage per DELIVERY.md §2.1.
146
+ */
147
+ export declare class InMemorySchedulerStore implements SchedulerStore {
148
+ private readonly records;
149
+ private static keyOf;
150
+ put(q: QueueState): Promise<void>;
151
+ get(envelopeId: string, recipient: string): Promise<QueueState | null>;
152
+ dueRecords(now: Date): Promise<QueueState[]>;
153
+ listTerminalOlderThan(cutoff: Date): Promise<QueueState[]>;
154
+ delete(envelopeId: string, recipient: string): Promise<void>;
155
+ }
156
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/delivery/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Sending-side delivery scheduler per DELIVERY.md §2.3 + §2.5 + §2.7.
3
+ *
4
+ * Drives the §4.5 delivery queue by consuming the §2.3 retry helpers
5
+ * and the §2.5 queue-state record against an injectable
6
+ * {@link DeliverFunc}. Operators call {@link Scheduler.tick} on a
7
+ * timer (every few seconds). Each tick:
8
+ *
9
+ * - Pulls due records from the {@link SchedulerStore}.
10
+ * - Runs {@link DeliverFunc} against each.
11
+ * - Updates state per the per-attempt outcome:
12
+ * - `delivered` → state = `delivered`, emit event.
13
+ * - `rejected` (non-recoverable) → state = `rejected`, emit event.
14
+ * - `rejected` (recoverable) / `silent` / transport failure →
15
+ * schedule next attempt via `nextAttemptAt`.
16
+ * - Effective deadline reached → state = `expired`, emit event.
17
+ *
18
+ * @module
19
+ */
20
+ import { effectiveDeadline, isRecoverableReason, nextAttemptAt, sanitizeRetry, } from "./retry.js";
21
+ import { isTerminalState, setTerminal, } from "./queue.js";
22
+ import { newSubmissionEvent, } from "./submission.js";
23
+ /** Sentinel error: a tick is already in progress. */
24
+ export class TickInProgressError extends Error {
25
+ name = "TickInProgressError";
26
+ constructor() {
27
+ super("delivery: scheduler tick already in progress");
28
+ }
29
+ }
30
+ /** Sentinel error: no queue record for the requested key. */
31
+ export class UnknownRecordError extends Error {
32
+ name = "UnknownRecordError";
33
+ constructor(envelopeId, recipient) {
34
+ super(`delivery: no queue record for envelope_id=${JSON.stringify(envelopeId)} recipient=${JSON.stringify(recipient)}`);
35
+ }
36
+ }
37
+ /**
38
+ * Sending-side delivery scheduler. Single-process; the JS
39
+ * run-to-completion model gives effectively-atomic Tick semantics.
40
+ * `tickInFlight` is enforced by a software latch so concurrent
41
+ * calls return {@link TickInProgressError}.
42
+ */
43
+ export class Scheduler {
44
+ store;
45
+ deliver;
46
+ retry;
47
+ horizonMs;
48
+ eventSink;
49
+ nowFn;
50
+ tickInFlight = false;
51
+ constructor(cfg) {
52
+ if (cfg.store === undefined) {
53
+ throw new Error("delivery: scheduler requires a store");
54
+ }
55
+ if (cfg.deliver === undefined) {
56
+ throw new Error("delivery: scheduler requires a deliver");
57
+ }
58
+ this.store = cfg.store;
59
+ this.deliver = cfg.deliver;
60
+ this.retry = sanitizeRetry(cfg.retry ?? {});
61
+ this.horizonMs = cfg.maxRetryHorizonMs ?? 72 * 3_600_000;
62
+ this.eventSink = cfg.eventSink ?? null;
63
+ this.nowFn = cfg.now ?? (() => new Date());
64
+ }
65
+ /**
66
+ * Insert a new queue record for `(envelopeId, recipient)`. State
67
+ * starts at `queued`; `next_attempt_at = now` (deliver on next
68
+ * tick); `deadline = effectiveDeadline(postmarkExpires, now,
69
+ * horizon)`.
70
+ *
71
+ * Throws when a record for the same `(envelopeId, recipient)`
72
+ * already exists.
73
+ */
74
+ async enqueue(envelopeId, recipient, postmarkExpires) {
75
+ if (envelopeId === "") {
76
+ throw new Error("delivery: enqueue empty envelope_id");
77
+ }
78
+ if (recipient === "") {
79
+ throw new Error("delivery: enqueue empty recipient");
80
+ }
81
+ const now = this.nowFn();
82
+ const existing = await this.store.get(envelopeId, recipient);
83
+ if (existing !== null) {
84
+ throw new Error(`delivery: queue record already exists for (${envelopeId}, ${recipient})`);
85
+ }
86
+ const deadline = effectiveDeadline(postmarkExpires, now, this.horizonMs);
87
+ const q = {
88
+ envelope_id: envelopeId,
89
+ recipient,
90
+ state: "queued",
91
+ attempts: 0,
92
+ last_attempt_at: null,
93
+ last_outcome: null,
94
+ last_reason_code: null,
95
+ next_attempt_at: isoSecond(now),
96
+ deadline: isoSecond(deadline),
97
+ };
98
+ await this.store.put(q);
99
+ }
100
+ /**
101
+ * Pull every record whose `next_attempt_at` has passed and
102
+ * process it. Returns the number of records advanced (terminal
103
+ * or otherwise) and, on partial failure, the first error
104
+ * encountered (per-record errors do not abort the tick).
105
+ *
106
+ * Throws {@link TickInProgressError} if a concurrent tick is
107
+ * already running.
108
+ */
109
+ async tick() {
110
+ if (this.tickInFlight) {
111
+ throw new TickInProgressError();
112
+ }
113
+ this.tickInFlight = true;
114
+ try {
115
+ const now = this.nowFn();
116
+ const due = await this.store.dueRecords(now);
117
+ let advanced = 0;
118
+ let firstError;
119
+ for (const q of due) {
120
+ try {
121
+ if (isTerminalState(q.state)) {
122
+ continue;
123
+ }
124
+ if (now.getTime() >= Date.parse(q.deadline)) {
125
+ this.transitionExpired(q, now);
126
+ await this.store.put(q);
127
+ advanced += 1;
128
+ continue;
129
+ }
130
+ await this.runAttempt(q, now);
131
+ await this.store.put(q);
132
+ advanced += 1;
133
+ }
134
+ catch (err) {
135
+ if (firstError === undefined) {
136
+ firstError =
137
+ err instanceof Error
138
+ ? err
139
+ : new Error(`tick error: ${String(err)}`);
140
+ }
141
+ }
142
+ }
143
+ return firstError === undefined
144
+ ? { advanced }
145
+ : { advanced, firstError };
146
+ }
147
+ finally {
148
+ this.tickInFlight = false;
149
+ }
150
+ }
151
+ /**
152
+ * Transition `(envelopeId, recipient)` to the `canceled` terminal
153
+ * state per §2.7. Returns the resulting {@link CancelResult}.
154
+ * Idempotent: cancellation of a record already in a terminal
155
+ * state is a no-op that returns the prior state.
156
+ */
157
+ async cancel(envelopeId, recipient) {
158
+ const now = this.nowFn();
159
+ const q = await this.store.get(envelopeId, recipient);
160
+ if (q === null) {
161
+ throw new UnknownRecordError(envelopeId, recipient);
162
+ }
163
+ if (isTerminalState(q.state)) {
164
+ return {
165
+ recipient,
166
+ state: q.state,
167
+ reason: `already ${q.state}; cancellation is a no-op per §2.7.4`,
168
+ };
169
+ }
170
+ setTerminal(q, "canceled", now);
171
+ await this.store.put(q);
172
+ this.emit(q, "client-initiated cancellation");
173
+ return { recipient, state: "canceled" };
174
+ }
175
+ /**
176
+ * Cancel every still-non-terminal record for `envelopeId` across
177
+ * all recipients. Returns one {@link CancelResult} per record
178
+ * observed.
179
+ */
180
+ async cancelEnvelope(envelopeId) {
181
+ if (envelopeId === "") {
182
+ throw new Error("delivery: cancelEnvelope empty envelope_id");
183
+ }
184
+ const now = this.nowFn();
185
+ // dueRecords returns non-terminal records ordered by NextAttempt;
186
+ // pulling with a far-future cap is the simplest way to enumerate.
187
+ const all = await this.store.dueRecords(new Date(now.getTime() + this.horizonMs * 2));
188
+ const matches = all.filter((q) => q.envelope_id === envelopeId);
189
+ const out = [];
190
+ for (const q of matches) {
191
+ if (isTerminalState(q.state)) {
192
+ out.push({
193
+ recipient: q.recipient,
194
+ state: q.state,
195
+ reason: `already ${q.state}; cancellation is a no-op per §2.7.4`,
196
+ });
197
+ continue;
198
+ }
199
+ setTerminal(q, "canceled", now);
200
+ await this.store.put(q);
201
+ this.emit(q, "client-initiated whole-envelope cancellation");
202
+ out.push({ recipient: q.recipient, state: "canceled" });
203
+ }
204
+ return out;
205
+ }
206
+ /**
207
+ * Evict terminal records whose `terminal_at` is at or before
208
+ * `now - retentionMs` per §2.5 retention. Returns the count
209
+ * pruned.
210
+ */
211
+ async pruneTerminal(retentionMs) {
212
+ const cutoff = new Date(this.nowFn().getTime() - retentionMs);
213
+ const stale = await this.store.listTerminalOlderThan(cutoff);
214
+ let n = 0;
215
+ for (const q of stale) {
216
+ await this.store.delete(q.envelope_id, q.recipient);
217
+ n += 1;
218
+ }
219
+ return n;
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ async runAttempt(q, now) {
223
+ const res = await this.deliver(q.envelope_id, q.recipient);
224
+ q.attempts += 1;
225
+ q.last_attempt_at = isoSecond(now);
226
+ q.last_outcome = res.status;
227
+ q.last_reason_code =
228
+ res.reasonCode !== undefined && res.reasonCode !== ""
229
+ ? res.reasonCode
230
+ : null;
231
+ if (res.status === "delivered") {
232
+ this.transitionTerminal(q, "delivered", now, res.reason);
233
+ return;
234
+ }
235
+ if (res.status === "rejected" &&
236
+ !isRecoverableReason(res.reasonCode ?? "")) {
237
+ this.transitionTerminal(q, "rejected", now, res.reason);
238
+ return;
239
+ }
240
+ // Recoverable rejection or silent → schedule next attempt.
241
+ let next;
242
+ try {
243
+ next = nextAttemptAt(this.retry, now, q.attempts - 1);
244
+ }
245
+ catch {
246
+ // Pathological: schedule a conservative fallback.
247
+ next = new Date(now.getTime() + 1_000);
248
+ }
249
+ if (next.getTime() > Date.parse(q.deadline)) {
250
+ // Next attempt would land past deadline → expire instead.
251
+ this.transitionExpired(q, now);
252
+ return;
253
+ }
254
+ q.next_attempt_at = isoSecond(next);
255
+ }
256
+ transitionTerminal(q, state, now, reason) {
257
+ if (isTerminalState(q.state)) {
258
+ return;
259
+ }
260
+ setTerminal(q, state, now);
261
+ this.emit(q, reason);
262
+ }
263
+ transitionExpired(q, now) {
264
+ if (isTerminalState(q.state)) {
265
+ return;
266
+ }
267
+ setTerminal(q, "expired", now);
268
+ this.emit(q, undefined);
269
+ }
270
+ emit(q, reason) {
271
+ if (this.eventSink === null) {
272
+ return;
273
+ }
274
+ const status = q.state === "delivered" ? "delivered" : "rejected";
275
+ const opts = {};
276
+ if (q.last_reason_code !== null) {
277
+ opts.reasonCode = q.last_reason_code;
278
+ }
279
+ if (reason !== undefined && reason !== "") {
280
+ opts.reason = reason;
281
+ }
282
+ if (q.terminal_at !== undefined && q.terminal_at !== "") {
283
+ opts.nowFn = () => new Date(q.terminal_at);
284
+ }
285
+ const ev = newSubmissionEvent(q.envelope_id, q.recipient, status, opts);
286
+ this.eventSink(ev);
287
+ }
288
+ }
289
+ /**
290
+ * Reference in-memory {@link SchedulerStore}. Tests / single-process
291
+ * demos only — production deployments back the queue with durable
292
+ * storage per DELIVERY.md §2.1.
293
+ */
294
+ export class InMemorySchedulerStore {
295
+ records = new Map();
296
+ static keyOf(envelopeId, recipient) {
297
+ return `${envelopeId}\x00${recipient}`;
298
+ }
299
+ async put(q) {
300
+ this.records.set(InMemorySchedulerStore.keyOf(q.envelope_id, q.recipient), {
301
+ ...q,
302
+ });
303
+ }
304
+ async get(envelopeId, recipient) {
305
+ const r = this.records.get(InMemorySchedulerStore.keyOf(envelopeId, recipient));
306
+ return r === undefined ? null : { ...r };
307
+ }
308
+ async dueRecords(now) {
309
+ const out = [];
310
+ for (const q of this.records.values()) {
311
+ if (isTerminalState(q.state)) {
312
+ continue;
313
+ }
314
+ if (q.next_attempt_at === null) {
315
+ continue;
316
+ }
317
+ if (Date.parse(q.next_attempt_at) <= now.getTime()) {
318
+ out.push({ ...q });
319
+ }
320
+ }
321
+ out.sort((a, b) => {
322
+ const at = a.next_attempt_at !== null ? Date.parse(a.next_attempt_at) : 0;
323
+ const bt = b.next_attempt_at !== null ? Date.parse(b.next_attempt_at) : 0;
324
+ if (at !== bt) {
325
+ return at - bt;
326
+ }
327
+ return a.envelope_id < b.envelope_id ? -1 : 1;
328
+ });
329
+ return out;
330
+ }
331
+ async listTerminalOlderThan(cutoff) {
332
+ const out = [];
333
+ for (const q of this.records.values()) {
334
+ if (isTerminalState(q.state) &&
335
+ q.terminal_at !== undefined &&
336
+ Date.parse(q.terminal_at) <= cutoff.getTime()) {
337
+ out.push({ ...q });
338
+ }
339
+ }
340
+ return out;
341
+ }
342
+ async delete(envelopeId, recipient) {
343
+ this.records.delete(InMemorySchedulerStore.keyOf(envelopeId, recipient));
344
+ }
345
+ }
346
+ function isoSecond(d) {
347
+ return d.toISOString().replace(/\.\d{3}Z$/, "Z");
348
+ }
349
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/delivery/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Staged-delivery partition computation per DELIVERY.md §3.2.1.
3
+ *
4
+ * Given a user's device directory, the per-device scoped
5
+ * certificates, the set of device public keys for which an inbound
6
+ * envelope's seal carries an enclosure-recipient wrap, and the
7
+ * sender address, returns the slice of {@link StagedHeldStage}
8
+ * values the staging runner feeds into the held-envelope queue.
9
+ *
10
+ * @module
11
+ */
12
+ import type { AddressIdentity } from "../keys/device_certificate.js";
13
+ import type { DeviceCertificate } from "../keys/device_certificate.js";
14
+ import type { DeviceDirectory } from "../keys/device_records.js";
15
+ import type { StagedHeldStage } from "./disposition.js";
16
+ /**
17
+ * Lookup hook the partition routine calls for each delegated
18
+ * device's scoped certificate. Returning `null` is treated as "no
19
+ * current cert"; the device is excluded from the partition (the
20
+ * spec's effect of certificate revocation per §10.3.7.3 step 3:
21
+ * "stop delivering inbound envelopes to device_id").
22
+ */
23
+ export type CertificateProvider = (deviceId: string) => DeviceCertificate | null;
24
+ /** Inputs to {@link partitionStages}. */
25
+ export interface PartitionInput {
26
+ /**
27
+ * The user's current device directory. {@link partitionStages}
28
+ * iterates `directory.devices` to enumerate the account's
29
+ * devices.
30
+ */
31
+ directory: DeviceDirectory;
32
+ /**
33
+ * Supplies the scoped certificate for each delegated device.
34
+ * Called for every device whose role is `delegated`; full-access
35
+ * devices have no certificate.
36
+ */
37
+ certificateProvider: CertificateProvider;
38
+ /**
39
+ * Set of device public keys for which the envelope's seal carries
40
+ * an enclosure-recipient wrap. Only devices whose `device_public_key`
41
+ * is in this set are eligible for delivery. Pubkeys are compared
42
+ * verbatim against `DeviceDirectoryEntry.device_public_key` (the
43
+ * same base64 form the directory uses).
44
+ */
45
+ enclosureRecipients: Set<string>;
46
+ /**
47
+ * The `brief.from` address the receive matcher evaluates against
48
+ * per §10.3.4 "for receive, a peer is the sender address of an
49
+ * inbound envelope after the home server has decrypted the brief".
50
+ */
51
+ senderAddress: AddressIdentity;
52
+ }
53
+ /**
54
+ * Compute the §3.2.1 stage partition for an inbound envelope.
55
+ *
56
+ * Algorithm:
57
+ *
58
+ * 1. Walk the directory; for each device whose pubkey is in
59
+ * `enclosureRecipients`:
60
+ * - Full-access devices are deferred (their stage is computed
61
+ * implicitly per §10.3.3.1: `max(delegated_stages) + 1`).
62
+ * - Delegated devices are evaluated against their scoped cert:
63
+ * fetch the cert, run `scope.receive` against `senderAddress`.
64
+ * Devices whose receive matcher rejects the envelope (mode,
65
+ * allow/deny, or rate limit at the matcher level) are
66
+ * excluded from the partition entirely.
67
+ * 2. Compute the implicit full-access stage as
68
+ * `max(delegated_stages_with_mode_not_none) + 1`, taken across
69
+ * ALL delegates with `receive.mode !== "none"` — not just those
70
+ * that allowed THIS envelope. Matches §10.3.3.1's "the maximum
71
+ * is taken over all delegated devices of the account that have
72
+ * a receive matcher whose mode is not none". When no such
73
+ * delegate exists, full-access devices are at stage 1 and
74
+ * staging is a no-op.
75
+ * 3. Group eligible devices by stage and emit a sorted, monotonic
76
+ * `StagedHeldStage[]`. Stages with no devices are pruned.
77
+ *
78
+ * Does NOT consult §10.3.3.3 rate-limit counters; rate-limit gating
79
+ * is the caller's concern. The matcher mode and allow/deny ARE
80
+ * checked.
81
+ *
82
+ * Returns an empty array when no eligible devices remain (the
83
+ * envelope is undeliverable to any device of the account; the
84
+ * caller surfaces this as silent or rejected per its own policy).
85
+ */
86
+ export declare function partitionStages(input: PartitionInput): StagedHeldStage[];
87
+ //# sourceMappingURL=stage_partition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage_partition.d.ts","sourceRoot":"","sources":["../../src/delivery/stage_partition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;AAEjF,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,SAAS,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;;;;OAMG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,aAAa,EAAE,eAAe,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,EAAE,CAiFxE"}