@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,107 @@
1
+ /**
2
+ * Canonical JSON serialization per ENVELOPE.md §4.3.
3
+ *
4
+ * The canonical form is the byte stream over which signatures and
5
+ * MACs are computed. Two implementations producing different
6
+ * canonical bytes for the same logical document do not interoperate
7
+ * at the seal layer.
8
+ *
9
+ * Rules:
10
+ * - Keys sorted lexicographically at every nesting level.
11
+ * - No insignificant whitespace.
12
+ * - UTF-8 encoding.
13
+ * - Strings escaped per RFC 8259 §7.
14
+ * - Numbers preserved exactly (no reformatting).
15
+ *
16
+ * Per-document elision rules (e.g. blanking `seal.signature`,
17
+ * omitting `postmark.hop_count` and `padding` for envelopes) are
18
+ * applied by callers via {@link marshalWithElision} before this
19
+ * generic marshal sees the value.
20
+ *
21
+ * @module
22
+ */
23
+ /** Canonicalize a JSON-serializable value to UTF-8 bytes. */
24
+ export function marshal(v) {
25
+ // Round-trip through JSON.parse so the input shape is normalized:
26
+ // any types the caller passed (Map, Date, etc.) become plain JSON
27
+ // values. This also catches non-JSON-serializable inputs early.
28
+ const raw = JSON.stringify(v);
29
+ if (raw === undefined) {
30
+ throw new Error("canonical: value is not JSON-serializable");
31
+ }
32
+ const generic = JSON.parse(raw);
33
+ return new TextEncoder().encode(serialize(generic));
34
+ }
35
+ /**
36
+ * Apply an in-place elision callback to a deep copy of `v`, then
37
+ * canonicalize. The elider can mutate `map[string]any` / `any[]`
38
+ * structures freely — the original is untouched.
39
+ *
40
+ * Use case: envelope canonicalization sets `seal.signature` and
41
+ * `seal.session_mac` to "", omits `postmark.hop_count`, omits
42
+ * `padding` — all by mutating the deep copy before serialization.
43
+ */
44
+ export function marshalWithElision(v, elide) {
45
+ const raw = JSON.stringify(v);
46
+ if (raw === undefined) {
47
+ throw new Error("canonical: value is not JSON-serializable");
48
+ }
49
+ const clone = JSON.parse(raw);
50
+ elide(clone);
51
+ return new TextEncoder().encode(serialize(clone));
52
+ }
53
+ function serialize(v) {
54
+ if (v === null) {
55
+ return "null";
56
+ }
57
+ if (typeof v === "boolean") {
58
+ return v ? "true" : "false";
59
+ }
60
+ if (typeof v === "number") {
61
+ if (!Number.isFinite(v)) {
62
+ throw new Error(`canonical: non-finite number ${v}`);
63
+ }
64
+ // JSON.stringify emits the shortest accurate decimal form.
65
+ // For SEMP this is fine: vectors do not pin numeric edge cases
66
+ // requiring a different formatter.
67
+ return JSON.stringify(v);
68
+ }
69
+ if (typeof v === "string") {
70
+ return JSON.stringify(v);
71
+ }
72
+ if (Array.isArray(v)) {
73
+ let out = "[";
74
+ for (let i = 0; i < v.length; i++) {
75
+ if (i > 0) {
76
+ out += ",";
77
+ }
78
+ out += serialize(v[i]);
79
+ }
80
+ out += "]";
81
+ return out;
82
+ }
83
+ if (typeof v === "object") {
84
+ const obj = v;
85
+ const keys = Object.keys(obj).sort();
86
+ let out = "{";
87
+ let first = true;
88
+ for (const k of keys) {
89
+ // JSON.parse never produces undefined values, but be defensive.
90
+ const val = obj[k];
91
+ if (val === undefined) {
92
+ continue;
93
+ }
94
+ if (!first) {
95
+ out += ",";
96
+ }
97
+ out += JSON.stringify(k);
98
+ out += ":";
99
+ out += serialize(val);
100
+ first = false;
101
+ }
102
+ out += "}";
103
+ return out;
104
+ }
105
+ throw new Error(`canonical: unsupported type ${typeof v}`);
106
+ }
107
+ //# sourceMappingURL=marshal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marshal.js","sourceRoot":"","sources":["../../src/canonical/marshal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Tiered clock-skew tolerance per CONFORMANCE.md §9.3.
3
+ *
4
+ * SEMP timestamps appear in many places: postmark.expires, PoW
5
+ * challenge expires, session expires_at, block list sync timestamps,
6
+ * queue state records, backup bundle created_at, migration
7
+ * migrated_at, forwarder attestations, and delegated certificate
8
+ * lifetimes. Every validator MUST enforce a consistent tolerance.
9
+ *
10
+ * Tiers:
11
+ * - Future-dated: MUST reject if T > now + 15 min; SHOULD reject
12
+ * if T > now + 5 min; MUST accept T within 0..5 min of now.
13
+ * - Expired: MUST reject when now > T + 15 min; SHOULD reject
14
+ * at now > T; MAY grace 5 min.
15
+ *
16
+ * Senders MUST NOT rely on grace windows. Senders MUST set expiry
17
+ * far enough in the future that a well-behaved verifier accepts
18
+ * them without grace.
19
+ *
20
+ * @module
21
+ */
22
+ /** Clock-skew tolerance, in milliseconds on each side. */
23
+ export interface Tolerance {
24
+ /** Maximum (T - now) accepted for a future-dated timestamp. */
25
+ forwardMs: number;
26
+ /** Maximum (now - T) accepted for an expired timestamp. */
27
+ graceMs: number;
28
+ }
29
+ /**
30
+ * MUST-level tolerance: 15 minutes on either side. Matches the
31
+ * boundary CONFORMANCE.md §9.3.1 sets as the hard reject threshold.
32
+ */
33
+ export declare function defaultTolerance(): Tolerance;
34
+ /**
35
+ * SHOULD-level tolerance: 5 minutes future, no grace on expiry.
36
+ * Verifiers that want the tighter SHOULD interpretation use this.
37
+ */
38
+ export declare function strictTolerance(): Tolerance;
39
+ /**
40
+ * Check that `t` is not too far in the future relative to `now`.
41
+ * Returns null on accept; an Error on reject. A timestamp at or
42
+ * before `now` is always accepted (past timestamps are the expiry
43
+ * path, not the future-dated path).
44
+ */
45
+ export declare function checkFutureTimestamp(t: Date, now: Date, tol: Tolerance): Error | null;
46
+ /**
47
+ * Check that `expiresAt` is not too far in the past relative to
48
+ * `now`. Returns null on accept; an Error on reject. A timestamp
49
+ * after `now` is always accepted.
50
+ */
51
+ export declare function checkExpiry(expiresAt: Date, now: Date, tol: Tolerance): Error | null;
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clockskew/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,SAAS,CAE5C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,IAAI,EACP,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,SAAS,GACb,KAAK,GAAG,IAAI,CAUd;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,IAAI,EACf,GAAG,EAAE,IAAI,EACT,GAAG,EAAE,SAAS,GACb,KAAK,GAAG,IAAI,CAOd"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Tiered clock-skew tolerance per CONFORMANCE.md §9.3.
3
+ *
4
+ * SEMP timestamps appear in many places: postmark.expires, PoW
5
+ * challenge expires, session expires_at, block list sync timestamps,
6
+ * queue state records, backup bundle created_at, migration
7
+ * migrated_at, forwarder attestations, and delegated certificate
8
+ * lifetimes. Every validator MUST enforce a consistent tolerance.
9
+ *
10
+ * Tiers:
11
+ * - Future-dated: MUST reject if T > now + 15 min; SHOULD reject
12
+ * if T > now + 5 min; MUST accept T within 0..5 min of now.
13
+ * - Expired: MUST reject when now > T + 15 min; SHOULD reject
14
+ * at now > T; MAY grace 5 min.
15
+ *
16
+ * Senders MUST NOT rely on grace windows. Senders MUST set expiry
17
+ * far enough in the future that a well-behaved verifier accepts
18
+ * them without grace.
19
+ *
20
+ * @module
21
+ */
22
+ /**
23
+ * MUST-level tolerance: 15 minutes on either side. Matches the
24
+ * boundary CONFORMANCE.md §9.3.1 sets as the hard reject threshold.
25
+ */
26
+ export function defaultTolerance() {
27
+ return { forwardMs: 15 * 60 * 1000, graceMs: 15 * 60 * 1000 };
28
+ }
29
+ /**
30
+ * SHOULD-level tolerance: 5 minutes future, no grace on expiry.
31
+ * Verifiers that want the tighter SHOULD interpretation use this.
32
+ */
33
+ export function strictTolerance() {
34
+ return { forwardMs: 5 * 60 * 1000, graceMs: 0 };
35
+ }
36
+ /**
37
+ * Check that `t` is not too far in the future relative to `now`.
38
+ * Returns null on accept; an Error on reject. A timestamp at or
39
+ * before `now` is always accepted (past timestamps are the expiry
40
+ * path, not the future-dated path).
41
+ */
42
+ export function checkFutureTimestamp(t, now, tol) {
43
+ if (t.getTime() <= now.getTime()) {
44
+ return null;
45
+ }
46
+ if (t.getTime() - now.getTime() > tol.forwardMs) {
47
+ return new Error(`clockskew: timestamp ${t.toISOString()} is more than ${tol.forwardMs}ms in the future of ${now.toISOString()}`);
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * Check that `expiresAt` is not too far in the past relative to
53
+ * `now`. Returns null on accept; an Error on reject. A timestamp
54
+ * after `now` is always accepted.
55
+ */
56
+ export function checkExpiry(expiresAt, now, tol) {
57
+ if (now.getTime() <= expiresAt.getTime() + tol.graceMs) {
58
+ return null;
59
+ }
60
+ return new Error(`clockskew: expiry ${expiresAt.toISOString()} is more than ${tol.graceMs}ms in the past of ${now.toISOString()}`);
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clockskew/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,CAAO,EACP,GAAS,EACT,GAAc;IAEd,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAChD,OAAO,IAAI,KAAK,CACd,wBAAwB,CAAC,CAAC,WAAW,EAAE,iBAAiB,GAAG,CAAC,SAAS,uBAAuB,GAAG,CAAC,WAAW,EAAE,EAAE,CAChH,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,SAAe,EACf,GAAS,EACT,GAAc;IAEd,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,KAAK,CACd,qBAAqB,SAAS,CAAC,WAAW,EAAE,iBAAiB,GAAG,CAAC,OAAO,qBAAqB,GAAG,CAAC,WAAW,EAAE,EAAE,CACjH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * SEMP_ACCOUNT_CLOSURE record types and signing primitives per
3
+ * CLOSURE.md.
4
+ *
5
+ * A closure is a two-step lifecycle: a full-access device submits
6
+ * a `request` with a grace period; during the grace period any
7
+ * full-access device may submit a `cancel` to abort. At
8
+ * `requested_at + grace_period_seconds` the home server finalizes
9
+ * per §4.
10
+ *
11
+ * This module covers the wire records and their signing /
12
+ * verifying primitives. Home-server orchestration (driver state,
13
+ * finalization side effects, ingress handling, local-part
14
+ * reassignment) lives in {@link "./driver"} + {@link "./store"}.
15
+ *
16
+ * @module
17
+ */
18
+ /** Wire-level constants per §2.1. */
19
+ export declare const RecordType = "SEMP_ACCOUNT_CLOSURE";
20
+ export declare const RecordVersion = "1.0.0";
21
+ /** Domain-separation prefix per ENVELOPE.md §4.3. */
22
+ export declare const AccountClosurePrefix = "SEMP-ACCOUNT-CLOSURE:";
23
+ /** Only signature algorithm currently defined. */
24
+ export declare const SignatureAlgorithmEd25519 = "ed25519";
25
+ /** Step discriminator per §2.2. */
26
+ export type Step = "request" | "cancel";
27
+ /** Grace-period bounds per §3.1, in seconds. */
28
+ export declare const MinGracePeriodSeconds: number;
29
+ export declare const MaxGracePeriodSeconds: number;
30
+ export declare const RecommendedGracePeriodSeconds: number;
31
+ /** Reusable signature block. */
32
+ export interface ClosureSignature {
33
+ algorithm: string;
34
+ key_id: string;
35
+ value: string;
36
+ }
37
+ /**
38
+ * SEMP_ACCOUNT_CLOSURE request or cancel record per §2.1. The same
39
+ * shape covers both steps; `step` disambiguates.
40
+ */
41
+ export interface ClosureRecord {
42
+ type: typeof RecordType;
43
+ step: Step;
44
+ version: string;
45
+ user_id: string;
46
+ /** ISO 8601 UTC timestamp. */
47
+ requested_at: string;
48
+ grace_period_seconds: number;
49
+ /** Issuing device's fingerprint. */
50
+ issued_by: string;
51
+ signature: ClosureSignature;
52
+ }
53
+ /** Inputs to {@link signClosureRecord}. */
54
+ export interface SignClosureRecordInput {
55
+ /** Pre-sign record; signature will be replaced. */
56
+ record: ClosureRecord;
57
+ /** 32-byte Ed25519 secret seed for the issuing full-access device. */
58
+ deviceSigningSeed: Uint8Array;
59
+ /** Lowercase-hex SHA-256 fingerprint of the device public key. */
60
+ deviceKeyId: string;
61
+ }
62
+ /** Result of a successful {@link signClosureRecord}. */
63
+ export interface SignClosureRecordResult {
64
+ record: ClosureRecord;
65
+ signatureB64: string;
66
+ }
67
+ /**
68
+ * Build and Ed25519-sign a closure record per §2.3. Pre-populates
69
+ * `signature.{algorithm,key_id}` so the canonical bytes cover them
70
+ * (defense against algorithm/issuer downgrade).
71
+ */
72
+ export declare function signClosureRecord(input: SignClosureRecordInput): SignClosureRecordResult;
73
+ /**
74
+ * Ed25519-verify a closure record under `devicePub`. Returns true
75
+ * on success. Does NOT enforce the §2.3 authority rule (the signing
76
+ * device MUST be a current full-access device of the account); the
77
+ * home server applies that check via the device directory.
78
+ */
79
+ export declare function verifyClosureRecord(record: ClosureRecord, devicePub: Uint8Array): boolean;
80
+ /** Options for {@link validateClosureRecord}. */
81
+ export interface ValidateClosureOptions {
82
+ /**
83
+ * When true, do not require `signature.value` to be a non-empty
84
+ * string. Used during the compose path before signing.
85
+ */
86
+ skipSignatureCheck?: boolean;
87
+ }
88
+ /**
89
+ * Structural validation per §2.2. Throws on the first violation.
90
+ * Cancel records skip the grace-period bound check (§3.2: the
91
+ * cancellation does not introduce a new grace period; the request
92
+ * being canceled already validated its bound).
93
+ */
94
+ export declare function validateClosureRecord(r: ClosureRecord, opts?: ValidateClosureOptions): void;
95
+ /**
96
+ * Wall-clock at which the home server MUST finalize per §4.1:
97
+ * `requested_at + grace_period_seconds`.
98
+ */
99
+ export declare function finalizationAt(record: ClosureRecord): Date;
100
+ /**
101
+ * Report whether `now` has reached or passed the finalization
102
+ * timestamp per §4.1. Returns false for cancel records (only
103
+ * requests finalize).
104
+ */
105
+ export declare function isFinalizable(record: ClosureRecord, now: Date): boolean;
106
+ //# sourceMappingURL=closure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closure.d.ts","sourceRoot":"","sources":["../../src/closure/closure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,qCAAqC;AACrC,eAAO,MAAM,UAAU,yBAAyB,CAAC;AACjD,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAE5D,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAEnD,mCAAmC;AACnC,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExC,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AACtD,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AACvD,eAAO,MAAM,6BAA6B,QAAoB,CAAC;AAE/D,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,UAAU,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,MAAM,EAAE,aAAa,CAAC;IACtB,sEAAsE;IACtE,iBAAiB,EAAE,UAAU,CAAC;IAC9B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,CAwBzB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,SAAS,EAAE,UAAU,GACpB,OAAO,CAYT;AAED,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,aAAa,EAChB,IAAI,GAAE,sBAA2B,GAChC,IAAI,CAiDN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAKvE"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * SEMP_ACCOUNT_CLOSURE record types and signing primitives per
3
+ * CLOSURE.md.
4
+ *
5
+ * A closure is a two-step lifecycle: a full-access device submits
6
+ * a `request` with a grace period; during the grace period any
7
+ * full-access device may submit a `cancel` to abort. At
8
+ * `requested_at + grace_period_seconds` the home server finalizes
9
+ * per §4.
10
+ *
11
+ * This module covers the wire records and their signing /
12
+ * verifying primitives. Home-server orchestration (driver state,
13
+ * finalization side effects, ingress handling, local-part
14
+ * reassignment) lives in {@link "./driver"} + {@link "./store"}.
15
+ *
16
+ * @module
17
+ */
18
+ import { signSignedDoc, verifySignedDoc } from "../keys/index.js";
19
+ /** Wire-level constants per §2.1. */
20
+ export const RecordType = "SEMP_ACCOUNT_CLOSURE";
21
+ export const RecordVersion = "1.0.0";
22
+ /** Domain-separation prefix per ENVELOPE.md §4.3. */
23
+ export const AccountClosurePrefix = "SEMP-ACCOUNT-CLOSURE:";
24
+ /** Only signature algorithm currently defined. */
25
+ export const SignatureAlgorithmEd25519 = "ed25519";
26
+ /** Grace-period bounds per §3.1, in seconds. */
27
+ export const MinGracePeriodSeconds = 7 * 24 * 60 * 60;
28
+ export const MaxGracePeriodSeconds = 90 * 24 * 60 * 60;
29
+ export const RecommendedGracePeriodSeconds = 30 * 24 * 60 * 60;
30
+ /**
31
+ * Build and Ed25519-sign a closure record per §2.3. Pre-populates
32
+ * `signature.{algorithm,key_id}` so the canonical bytes cover them
33
+ * (defense against algorithm/issuer downgrade).
34
+ */
35
+ export function signClosureRecord(input) {
36
+ if (input.deviceKeyId === "") {
37
+ throw new Error("closure: empty device key_id");
38
+ }
39
+ validateClosureRecord(input.record, { skipSignatureCheck: true });
40
+ const preSign = {
41
+ ...input.record,
42
+ signature: {
43
+ algorithm: SignatureAlgorithmEd25519,
44
+ key_id: input.deviceKeyId,
45
+ value: "",
46
+ },
47
+ };
48
+ const { signedJSON, signatureB64 } = signSignedDoc({
49
+ preSignJSON: preSign,
50
+ seed: input.deviceSigningSeed,
51
+ signaturePath: "signature.value",
52
+ prefix: AccountClosurePrefix,
53
+ });
54
+ return {
55
+ record: signedJSON,
56
+ signatureB64,
57
+ };
58
+ }
59
+ /**
60
+ * Ed25519-verify a closure record under `devicePub`. Returns true
61
+ * on success. Does NOT enforce the §2.3 authority rule (the signing
62
+ * device MUST be a current full-access device of the account); the
63
+ * home server applies that check via the device directory.
64
+ */
65
+ export function verifyClosureRecord(record, devicePub) {
66
+ validateClosureRecord(record);
67
+ if (record.signature.value === "") {
68
+ return false;
69
+ }
70
+ const { ok } = verifySignedDoc({
71
+ signedJSON: record,
72
+ publicKey: devicePub,
73
+ signaturePath: "signature.value",
74
+ prefix: AccountClosurePrefix,
75
+ });
76
+ return ok;
77
+ }
78
+ /**
79
+ * Structural validation per §2.2. Throws on the first violation.
80
+ * Cancel records skip the grace-period bound check (§3.2: the
81
+ * cancellation does not introduce a new grace period; the request
82
+ * being canceled already validated its bound).
83
+ */
84
+ export function validateClosureRecord(r, opts = {}) {
85
+ if (r.type !== RecordType) {
86
+ throw new Error(`closure: type ${JSON.stringify(r.type)}, want ${RecordType}`);
87
+ }
88
+ if (r.step !== "request" && r.step !== "cancel") {
89
+ throw new Error(`closure: step ${JSON.stringify(r.step)} is not request or cancel`);
90
+ }
91
+ if (typeof r.version !== "string" || r.version === "") {
92
+ throw new Error("closure: missing version");
93
+ }
94
+ if (typeof r.user_id !== "string" || r.user_id === "") {
95
+ throw new Error("closure: missing user_id");
96
+ }
97
+ if (typeof r.requested_at !== "string" || r.requested_at === "") {
98
+ throw new Error("closure: missing requested_at");
99
+ }
100
+ if (Number.isNaN(Date.parse(r.requested_at))) {
101
+ throw new Error("closure: requested_at is not ISO 8601");
102
+ }
103
+ if (typeof r.issued_by !== "string" || r.issued_by === "") {
104
+ throw new Error("closure: missing issued_by");
105
+ }
106
+ if (r.step === "request") {
107
+ if (!Number.isInteger(r.grace_period_seconds)) {
108
+ throw new Error("closure: grace_period_seconds must be an integer");
109
+ }
110
+ if (r.grace_period_seconds < MinGracePeriodSeconds) {
111
+ throw new Error(`closure: grace_period_seconds ${r.grace_period_seconds} below minimum ${MinGracePeriodSeconds} (7 days)`);
112
+ }
113
+ if (r.grace_period_seconds > MaxGracePeriodSeconds) {
114
+ throw new Error(`closure: grace_period_seconds ${r.grace_period_seconds} exceeds maximum ${MaxGracePeriodSeconds} (90 days)`);
115
+ }
116
+ }
117
+ if (typeof r.signature?.algorithm !== "string") {
118
+ throw new Error("closure: missing signature.algorithm");
119
+ }
120
+ if (typeof r.signature?.key_id !== "string") {
121
+ throw new Error("closure: missing signature.key_id");
122
+ }
123
+ if (typeof r.signature?.value !== "string") {
124
+ throw new Error("closure: signature.value must be a string");
125
+ }
126
+ if (!opts.skipSignatureCheck && r.signature.value === "") {
127
+ throw new Error("closure: record is unsigned");
128
+ }
129
+ }
130
+ /**
131
+ * Wall-clock at which the home server MUST finalize per §4.1:
132
+ * `requested_at + grace_period_seconds`.
133
+ */
134
+ export function finalizationAt(record) {
135
+ const ts = Date.parse(record.requested_at);
136
+ if (Number.isNaN(ts)) {
137
+ throw new Error("closure: requested_at is not ISO 8601");
138
+ }
139
+ return new Date(ts + record.grace_period_seconds * 1000);
140
+ }
141
+ /**
142
+ * Report whether `now` has reached or passed the finalization
143
+ * timestamp per §4.1. Returns false for cancel records (only
144
+ * requests finalize).
145
+ */
146
+ export function isFinalizable(record, now) {
147
+ if (record.step !== "request") {
148
+ return false;
149
+ }
150
+ return now.getTime() >= finalizationAt(record).getTime();
151
+ }
152
+ //# sourceMappingURL=closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closure.js","sourceRoot":"","sources":["../../src/closure/closure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Home-server closure driver per CLOSURE.md §3 + §4 + §5.
3
+ *
4
+ * Orchestrates closure lifecycle on a {@link ClosureStore}:
5
+ * - {@link Driver.submit}: accept a request or cancel
6
+ * - {@link Driver.tick}: drive due requests to finalization
7
+ * - {@link Driver.isAccountClosed}: §5 ingress enforcement
8
+ * - {@link Driver.recipientPolicy}: returns a delivery-policy
9
+ * adapter that rejects envelopes addressed to closed accounts
10
+ *
11
+ * @module
12
+ */
13
+ import type { Acknowledgment, RecipientStatus } from "../delivery/index.js";
14
+ import type { ReasonCode } from "../reasoncodes.js";
15
+ import { type ClosureRecord } from "./closure.js";
16
+ import { type ClosureStore } from "./store.js";
17
+ /** Inputs to the {@link Driver} constructor. */
18
+ export interface DriverConfig {
19
+ /** Persistence backend. Tests pass {@link InMemoryClosureStore}. */
20
+ store: ClosureStore;
21
+ /** Wall-clock provider. Defaults to `() => new Date()`. */
22
+ nowFn?: () => Date;
23
+ }
24
+ /**
25
+ * Outcome of a {@link Driver.submit} call.
26
+ *
27
+ * - `accepted`: the request was inserted (for `step=request`) or
28
+ * a pending request was canceled (for `step=cancel`).
29
+ * - `already_pending`: a request is already pending for this
30
+ * user_id; the §2.4 rule rejects double-requests.
31
+ * - `not_pending`: a cancel arrived for an account with no
32
+ * pending request — the spec treats this as a no-op success.
33
+ * - `invalid`: the record failed structural validation.
34
+ */
35
+ export type SubmitResult = {
36
+ kind: "accepted";
37
+ } | {
38
+ kind: "already_pending";
39
+ } | {
40
+ kind: "not_pending";
41
+ } | {
42
+ kind: "invalid";
43
+ reason: string;
44
+ };
45
+ /** Outcome entry returned by {@link Driver.tick}. */
46
+ export interface FinalizeResult {
47
+ user_id: string;
48
+ finalized_at: Date;
49
+ }
50
+ /** Closure driver. */
51
+ export declare class Driver {
52
+ private readonly store;
53
+ private readonly nowFn;
54
+ constructor(cfg: DriverConfig);
55
+ /**
56
+ * Apply `record` to the store. Caller MUST verify the record's
57
+ * signature and authority (§2.3 — the issuing device must be a
58
+ * full-access device of the account) BEFORE calling submit.
59
+ */
60
+ submit(record: ClosureRecord): Promise<SubmitResult>;
61
+ /**
62
+ * Drive any pending requests whose finalization timestamp has
63
+ * arrived to the finalized state. Returns the list of accounts
64
+ * finalized in this tick (deterministically ordered).
65
+ */
66
+ tick(): Promise<FinalizeResult[]>;
67
+ /**
68
+ * Report whether `userId`'s account is currently closed within
69
+ * the §6.1 retention window.
70
+ *
71
+ * Returns true when `getFinalized(userId)` yields a timestamp
72
+ * (the store enforces retention via its prune path; once an
73
+ * entry is pruned, this returns false and the local-part is
74
+ * eligible for §6.2 reassignment).
75
+ */
76
+ isAccountClosed(userId: string): Promise<boolean>;
77
+ /**
78
+ * Return a per-recipient delivery-policy adapter that rejects
79
+ * envelopes addressed to closed accounts per §5.1, preserving
80
+ * existence indistinguishability per DESIGN.md §2.7 (the
81
+ * `policy_forbidden` reason is the same one a non-existent
82
+ * address receives).
83
+ *
84
+ * Pass `useSilent: true` to return the `silent` acknowledgment
85
+ * instead. Both preserve indistinguishability; the choice is
86
+ * operator policy.
87
+ */
88
+ recipientPolicy(opts?: {
89
+ useSilent?: boolean;
90
+ }): RecipientPolicyFunc;
91
+ }
92
+ /**
93
+ * Per-recipient policy gate signature. Returns `null` to pass
94
+ * through to subsequent checks; returns a structured outcome to
95
+ * short-circuit delivery.
96
+ */
97
+ export type RecipientPolicyFunc = (recipientAddress: string) => Promise<null | {
98
+ acknowledgment: Acknowledgment;
99
+ reason_code?: ReasonCode;
100
+ reason?: string;
101
+ recipient_status?: RecipientStatus;
102
+ }>;
103
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/closure/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,KAAK,aAAa,EAGnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,YAAY,CAAC;AAEpE,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,KAAK,EAAE,YAAY,CAAC;IACpB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,sBAAsB;AACtB,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAEvB,GAAG,EAAE,YAAY;IAK7B;;;;OAIG;IACG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA8B1D;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAevC;;;;;;;;OAQG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD;;;;;;;;;;OAUG;IACH,eAAe,CAAC,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,mBAAmB;CAuBzE;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CACnE,IAAI,GACJ;IACE,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,eAAe,CAAC;CACpC,CACJ,CAAC"}