@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,181 @@
1
+ /**
2
+ * Signed delivery receipts per DELIVERY.md §1.1.1.
3
+ *
4
+ * Every `delivered` acknowledgment a recipient server returns to a
5
+ * sending server MUST carry a signed receipt. The receipt binds
6
+ * `(envelope_hash, recipient_domain, accepted_at)` under the recipient
7
+ * domain's Ed25519 signing key with the `SEMP-DELIVERY-RECEIPT:`
8
+ * domain-separation prefix. It is a portable, non-repudiable artifact
9
+ * the sending user can later export to a `.semp-receipt` file.
10
+ *
11
+ * This module provides:
12
+ *
13
+ * - {@link computeEnvelopeHash}: SHA-256 over canonical envelope bytes
14
+ * (the same canonical form `seal.signature` is computed over —
15
+ * `signature` and `session_mac` blanked, `hop_count` and `padding`
16
+ * omitted).
17
+ * - {@link signDeliveryReceipt}: build + sign a receipt from
18
+ * pre-sign inputs.
19
+ * - {@link verifyDeliveryReceipt}: Ed25519-verify a receipt against
20
+ * a recipient domain public key.
21
+ * - {@link verifyEnvelopeBinding}: cross-check the receipt's
22
+ * `envelope_hash.value` against a fresh canonical envelope hash.
23
+ * - {@link validateReceipt}: structural checks per §1.1.1.2.
24
+ *
25
+ * The companion {@link "./receipt_store"} module holds receipts the
26
+ * sending server has issued to its sending users until at least one
27
+ * client device acknowledges the delivery event carrying it.
28
+ *
29
+ * @module
30
+ */
31
+ import { sha256 } from "@noble/hashes/sha2.js";
32
+ import { signSignedDoc, verifySignedDoc, } from "../keys/index.js";
33
+ /** Domain-separation prefix for the receipt signature, per ENVELOPE.md §4.3. */
34
+ export const DeliveryReceiptPrefix = "SEMP-DELIVERY-RECEIPT:";
35
+ /** `type` discriminator for the receipt JSON. */
36
+ export const DeliveryReceiptType = "SEMP_DELIVERY_RECEIPT";
37
+ /** Receipt schema version per §1.1.1.1. */
38
+ export const DeliveryReceiptVersion = "1.0.0";
39
+ /** Only digest algorithm defined for v1.0.0 receipts per §1.1.1.3. */
40
+ export const EnvelopeHashAlgorithmSHA256 = "sha-256";
41
+ /** Receipt signature algorithm. */
42
+ export const ReceiptSignatureAlgorithmEd25519 = "ed25519";
43
+ /**
44
+ * Receiver-side tolerance window per §1.1.1.5: "Verifiers MUST NOT
45
+ * reject a receipt solely because `accepted_at` is within 120 seconds
46
+ * of their own current time in either direction."
47
+ */
48
+ export const ReceiptClockSkewToleranceSeconds = 120;
49
+ /**
50
+ * SHA-256 of canonical envelope bytes, base64-encoded, per
51
+ * §1.1.1.3. The caller is responsible for producing the canonical
52
+ * bytes — typically via `envelope.canonicalEnvelopeFor(env)` which
53
+ * applies §4.3 elision (signature, session_mac, hop_count, padding).
54
+ */
55
+ export function computeEnvelopeHash(canonicalEnvelopeBytes) {
56
+ const sum = sha256(canonicalEnvelopeBytes);
57
+ return base64Encode(sum);
58
+ }
59
+ /**
60
+ * Build and Ed25519-sign a SEMP_DELIVERY_RECEIPT under the recipient
61
+ * domain's signing key, following §1.1.1.4.
62
+ */
63
+ export function signDeliveryReceipt(input) {
64
+ if (input.envelopeHashB64 === "") {
65
+ throw new Error("delivery receipt: empty envelope_hash.value");
66
+ }
67
+ if (input.recipientDomain === "") {
68
+ throw new Error("delivery receipt: empty recipient_domain");
69
+ }
70
+ if (input.acceptedAt === "") {
71
+ throw new Error("delivery receipt: empty accepted_at");
72
+ }
73
+ if (input.domainKeyId === "") {
74
+ throw new Error("delivery receipt: empty domain key_id");
75
+ }
76
+ const preSign = {
77
+ type: DeliveryReceiptType,
78
+ version: DeliveryReceiptVersion,
79
+ envelope_hash: {
80
+ algorithm: EnvelopeHashAlgorithmSHA256,
81
+ value: input.envelopeHashB64,
82
+ },
83
+ recipient_domain: input.recipientDomain,
84
+ accepted_at: input.acceptedAt,
85
+ signature: {
86
+ algorithm: ReceiptSignatureAlgorithmEd25519,
87
+ key_id: input.domainKeyId,
88
+ value: "",
89
+ },
90
+ };
91
+ const { signedJSON, signatureB64 } = signSignedDoc({
92
+ preSignJSON: preSign,
93
+ seed: input.domainSigningSeed,
94
+ signaturePath: "signature.value",
95
+ prefix: DeliveryReceiptPrefix,
96
+ });
97
+ return {
98
+ receipt: signedJSON,
99
+ signatureB64,
100
+ };
101
+ }
102
+ /**
103
+ * Ed25519-verify a delivery receipt's signature against the
104
+ * recipient domain public key. Returns true on success. Throws on
105
+ * structural validation failure (use {@link validateReceipt} ahead
106
+ * of time to surface those as boolean false instead).
107
+ *
108
+ * Does NOT cross-check `accepted_at` against the verifier's clock —
109
+ * that is a §1.1.1.5 caller-side decision and MUST be applied with
110
+ * the {@link ReceiptClockSkewToleranceSeconds} tolerance.
111
+ */
112
+ export function verifyDeliveryReceipt(input) {
113
+ validateReceipt(input.receipt);
114
+ if (input.receipt.signature.value === "") {
115
+ return false;
116
+ }
117
+ const { ok } = verifySignedDoc({
118
+ signedJSON: input.receipt,
119
+ publicKey: input.domainPub,
120
+ signaturePath: "signature.value",
121
+ prefix: DeliveryReceiptPrefix,
122
+ });
123
+ return ok;
124
+ }
125
+ /**
126
+ * Cross-check that the receipt's `envelope_hash.value` matches the
127
+ * fresh hash of the supplied canonical envelope bytes per §1.1.1.7
128
+ * step 4. Returns true when the binding holds.
129
+ */
130
+ export function verifyEnvelopeBinding(receipt, canonicalEnvelopeBytes) {
131
+ if (receipt.envelope_hash.algorithm !== EnvelopeHashAlgorithmSHA256) {
132
+ return false;
133
+ }
134
+ const want = computeEnvelopeHash(canonicalEnvelopeBytes);
135
+ return receipt.envelope_hash.value === want;
136
+ }
137
+ /**
138
+ * Structural validation per §1.1.1.2. Throws on the first missing or
139
+ * malformed field. Callers that want a boolean outcome can wrap in
140
+ * try/catch.
141
+ */
142
+ export function validateReceipt(r) {
143
+ if (r.type !== DeliveryReceiptType) {
144
+ throw new Error(`delivery receipt: type ${JSON.stringify(r.type)}, want ${DeliveryReceiptType}`);
145
+ }
146
+ if (typeof r.version !== "string" || r.version === "") {
147
+ throw new Error("delivery receipt: missing version");
148
+ }
149
+ if (typeof r.envelope_hash?.algorithm !== "string" || r.envelope_hash.algorithm === "") {
150
+ throw new Error("delivery receipt: missing envelope_hash.algorithm");
151
+ }
152
+ if (typeof r.envelope_hash?.value !== "string" || r.envelope_hash.value === "") {
153
+ throw new Error("delivery receipt: missing envelope_hash.value");
154
+ }
155
+ if (typeof r.recipient_domain !== "string" || r.recipient_domain === "") {
156
+ throw new Error("delivery receipt: missing recipient_domain");
157
+ }
158
+ if (typeof r.accepted_at !== "string" || r.accepted_at === "") {
159
+ throw new Error("delivery receipt: missing accepted_at");
160
+ }
161
+ if (typeof r.signature?.algorithm !== "string" || r.signature.algorithm === "") {
162
+ throw new Error("delivery receipt: missing signature.algorithm");
163
+ }
164
+ if (typeof r.signature?.key_id !== "string" || r.signature.key_id === "") {
165
+ throw new Error("delivery receipt: missing signature.key_id");
166
+ }
167
+ if (typeof r.signature?.value !== "string") {
168
+ throw new Error("delivery receipt: missing signature.value");
169
+ }
170
+ }
171
+ function base64Encode(b) {
172
+ if (typeof Buffer !== "undefined") {
173
+ return Buffer.from(b).toString("base64");
174
+ }
175
+ let bin = "";
176
+ for (let i = 0; i < b.length; i++) {
177
+ bin += String.fromCharCode(b[i] ?? 0);
178
+ }
179
+ return btoa(bin);
180
+ }
181
+ //# sourceMappingURL=receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../src/delivery/receipt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Sending-server transient holding area for delivery receipts per
3
+ * DELIVERY.md §1.1.1.6.
4
+ *
5
+ * The sending server retains a receipt only until at least one
6
+ * authenticated client device of the sending user has acknowledged
7
+ * the delivery event carrying it; after that acknowledgment the
8
+ * server SHOULD drop the receipt so it does not accumulate a
9
+ * long-term receipts archive (which would conflict with the §2.5
10
+ * correspondent-graph privacy posture).
11
+ *
12
+ * Production deployments plug in a durable backend (a Redis cache, a
13
+ * relational table) by implementing {@link ReceiptStore} directly.
14
+ * Tests and demos use {@link InMemoryReceiptStore}.
15
+ *
16
+ * @module
17
+ */
18
+ import type { DeliveryReceipt } from "./receipt.js";
19
+ /**
20
+ * The transient holding area. Implementations MUST be safe for
21
+ * concurrent use; the in-memory reference uses a mutex.
22
+ */
23
+ export interface ReceiptStore {
24
+ /**
25
+ * Insert a receipt issued by a recipient server, keyed by
26
+ * `(envelopeId, recipient)`. `storedAt` is the wall-clock time the
27
+ * receipt entered the store; the prune path uses it to enforce the
28
+ * push-notification retention window for receipts that no client
29
+ * ever acknowledged.
30
+ */
31
+ put(envelopeId: string, recipient: string, receipt: DeliveryReceipt, storedAt: Date): Promise<void>;
32
+ /**
33
+ * Fetch the receipt for `(envelopeId, recipient)`. Returns `null`
34
+ * for unknown records.
35
+ */
36
+ get(envelopeId: string, recipient: string): Promise<DeliveryReceipt | null>;
37
+ /**
38
+ * Mark the receipt for `(envelopeId, recipient)` as having been
39
+ * delivered to a client device per §1.1.1.6. The implementation MAY
40
+ * drop the receipt immediately on acknowledge (the spec's "MAY drop"
41
+ * allowance), or retain it briefly for cross-device propagation. The
42
+ * reference in-memory implementation drops on acknowledge.
43
+ *
44
+ * A no-op on unknown records: the §1.1.1.6 retention rule does not
45
+ * require acknowledgment to be exact-once, only that the server
46
+ * eventually drop the receipt.
47
+ */
48
+ acknowledge(envelopeId: string, recipient: string): Promise<void>;
49
+ /**
50
+ * Remove receipts whose `storedAt` is older than `cutoff` and that
51
+ * have not been acknowledged. Returns the number of receipts pruned.
52
+ * The §1.1.1.6 retention rule says receipts MAY be dropped on the
53
+ * same schedule as undelivered notifications; this method
54
+ * implements that pruning.
55
+ */
56
+ pruneUnacknowledged(cutoff: Date): Promise<number>;
57
+ }
58
+ /**
59
+ * Default push-notification window the §1.1.1.6 prune path uses when
60
+ * the operator has not configured a tighter value. Three days matches
61
+ * the 72h `server_max_retry_horizon` default per §2.4: any envelope
62
+ * that hits the queue's hard deadline cannot have a delivered
63
+ * acknowledgment past that point, so retaining receipts longer offers
64
+ * no value.
65
+ */
66
+ export declare const DefaultReceiptRetentionMs: number;
67
+ /**
68
+ * Reference {@link ReceiptStore} backed by a Map. Acknowledge drops
69
+ * the receipt immediately so no plaintext archive accumulates.
70
+ *
71
+ * Single-process only — production deployments replace this with a
72
+ * durable backend.
73
+ */
74
+ export declare class InMemoryReceiptStore implements ReceiptStore {
75
+ private readonly records;
76
+ put(envelopeId: string, recipient: string, receipt: DeliveryReceipt, storedAt: Date): Promise<void>;
77
+ get(envelopeId: string, recipient: string): Promise<DeliveryReceipt | null>;
78
+ acknowledge(envelopeId: string, recipient: string): Promise<void>;
79
+ pruneUnacknowledged(cutoff: Date): Promise<number>;
80
+ }
81
+ //# sourceMappingURL=receipt_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt_store.d.ts","sourceRoot":"","sources":["../../src/delivery/receipt_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,IAAI,GACb,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;OAGG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAE5E;;;;;;;;;;OAUG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE;;;;;;OAMG;IACH,mBAAmB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,QAAsB,CAAC;AAO7D;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAEtD,GAAG,CACP,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,IAAI,GACb,OAAO,CAAC,IAAI,CAAC;IAgBV,GAAG,CACP,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAK5B,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,mBAAmB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAczD"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Sending-server transient holding area for delivery receipts per
3
+ * DELIVERY.md §1.1.1.6.
4
+ *
5
+ * The sending server retains a receipt only until at least one
6
+ * authenticated client device of the sending user has acknowledged
7
+ * the delivery event carrying it; after that acknowledgment the
8
+ * server SHOULD drop the receipt so it does not accumulate a
9
+ * long-term receipts archive (which would conflict with the §2.5
10
+ * correspondent-graph privacy posture).
11
+ *
12
+ * Production deployments plug in a durable backend (a Redis cache, a
13
+ * relational table) by implementing {@link ReceiptStore} directly.
14
+ * Tests and demos use {@link InMemoryReceiptStore}.
15
+ *
16
+ * @module
17
+ */
18
+ /**
19
+ * Default push-notification window the §1.1.1.6 prune path uses when
20
+ * the operator has not configured a tighter value. Three days matches
21
+ * the 72h `server_max_retry_horizon` default per §2.4: any envelope
22
+ * that hits the queue's hard deadline cannot have a delivered
23
+ * acknowledgment past that point, so retaining receipts longer offers
24
+ * no value.
25
+ */
26
+ export const DefaultReceiptRetentionMs = 72 * 60 * 60 * 1000;
27
+ /**
28
+ * Reference {@link ReceiptStore} backed by a Map. Acknowledge drops
29
+ * the receipt immediately so no plaintext archive accumulates.
30
+ *
31
+ * Single-process only — production deployments replace this with a
32
+ * durable backend.
33
+ */
34
+ export class InMemoryReceiptStore {
35
+ records = new Map();
36
+ async put(envelopeId, recipient, receipt, storedAt) {
37
+ if (envelopeId === "") {
38
+ throw new Error("ReceiptStore.put: empty envelopeId");
39
+ }
40
+ if (recipient === "") {
41
+ throw new Error("ReceiptStore.put: empty recipient");
42
+ }
43
+ const k = recordKey(envelopeId, recipient);
44
+ if (this.records.has(k)) {
45
+ throw new Error(`ReceiptStore.put: receipt already stored for (${envelopeId}, ${recipient})`);
46
+ }
47
+ this.records.set(k, { receipt, storedAt });
48
+ }
49
+ async get(envelopeId, recipient) {
50
+ const rec = this.records.get(recordKey(envelopeId, recipient));
51
+ return rec === undefined ? null : rec.receipt;
52
+ }
53
+ async acknowledge(envelopeId, recipient) {
54
+ this.records.delete(recordKey(envelopeId, recipient));
55
+ }
56
+ async pruneUnacknowledged(cutoff) {
57
+ const cutoffMs = cutoff.getTime();
58
+ const stale = [];
59
+ for (const [k, rec] of this.records) {
60
+ if (rec.storedAt.getTime() <= cutoffMs) {
61
+ stale.push(k);
62
+ }
63
+ }
64
+ stale.sort();
65
+ for (const k of stale) {
66
+ this.records.delete(k);
67
+ }
68
+ return stale.length;
69
+ }
70
+ }
71
+ function recordKey(envelopeId, recipient) {
72
+ return `${envelopeId}\x00${recipient}`;
73
+ }
74
+ //# sourceMappingURL=receipt_store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt_store.js","sourceRoot":"","sources":["../../src/delivery/receipt_store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoDH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAO7D;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACd,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5D,KAAK,CAAC,GAAG,CACP,UAAkB,EAClB,SAAiB,EACjB,OAAwB,EACxB,QAAc;QAEd,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,GAAG,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,iDAAiD,UAAU,KAAK,SAAS,GAAG,CAC7E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG,CACP,UAAkB,EAClB,SAAiB;QAEjB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/D,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,SAAiB;QACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAY;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,UAAkB,EAAE,SAAiB;IACtD,OAAO,GAAG,UAAU,OAAO,SAAS,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Retry-schedule primitives per DELIVERY.md §2.2 + §2.3 + §2.4.
3
+ *
4
+ * Exposes the bounds the spec sets on retry timing (initial
5
+ * interval, multiplier, max interval, jitter, attempt floor),
6
+ * computes the base + jittered interval for a given attempt, and
7
+ * enforces the §2.3 recoverable-reason classification.
8
+ *
9
+ * @module
10
+ */
11
+ /** Minimum first base interval per §2.3 (60 seconds). */
12
+ export declare const MinRetryInitialIntervalMs = 60000;
13
+ /** Minimum exponential backoff multiplier per §2.3. */
14
+ export declare const MinRetryMultiplier = 2;
15
+ /** Cap on individual inter-attempt intervals per §2.3 (6 hours). */
16
+ export declare const MaxRetryIntervalMs: number;
17
+ /** Minimum jitter half-width per §2.3 (10% — RECOMMENDED 25%). */
18
+ export declare const MinRetryJitterFraction = 0.1;
19
+ /**
20
+ * Lower bound on the realized jittered interval per §2.3:
21
+ * jitter MUST NOT reduce below 50% of the first base interval.
22
+ */
23
+ export declare const MinJitterFloorMs: number;
24
+ /** Minimum number of retry attempts per §2.3. */
25
+ export declare const MinRetryAttempts = 5;
26
+ /** Default `server_max_retry_horizon` per §2.4 (72 hours). */
27
+ export declare const DefaultMaxRetryHorizonMs: number;
28
+ /** Hard ceiling on `server_max_retry_horizon` per §2.4 (7 days). */
29
+ export declare const MaxRetryHorizonCapMs: number;
30
+ /** Operator-tunable retry policy. Zero / out-of-bounds values clamp to spec minima. */
31
+ export interface RetryConfig {
32
+ /** First base interval. Defaults to {@link MinRetryInitialIntervalMs}. */
33
+ initialIntervalMs?: number;
34
+ /** Exponential backoff factor. Defaults to {@link MinRetryMultiplier}. */
35
+ multiplier?: number;
36
+ /** Cap on individual base intervals. Defaults to {@link MaxRetryIntervalMs}. */
37
+ maxIntervalMs?: number;
38
+ /** Symmetric jitter half-width. Defaults to {@link MinRetryJitterFraction}. */
39
+ jitterFraction?: number;
40
+ }
41
+ /** Effective {@link RetryConfig} after applying spec minima/maxima. */
42
+ export interface EffectiveRetryConfig {
43
+ initialIntervalMs: number;
44
+ multiplier: number;
45
+ maxIntervalMs: number;
46
+ jitterFraction: number;
47
+ }
48
+ /** Apply spec minima/maxima to `cfg` and return the effective values. */
49
+ export declare function sanitizeRetry(cfg: RetryConfig): EffectiveRetryConfig;
50
+ /**
51
+ * Unjittered base interval for the zero-indexed `attempt`. Computes
52
+ * `initialInterval * multiplier^attempt`, clamped to `maxIntervalMs`.
53
+ */
54
+ export declare function baseIntervalMs(cfg: RetryConfig, attempt: number): number;
55
+ /**
56
+ * Apply symmetric jitter to `baseMs` using a random multiplier in
57
+ * `[1-j, 1+j]`, floored at {@link MinJitterFloorMs}. Uses
58
+ * `globalThis.crypto.getRandomValues` for entropy by default.
59
+ */
60
+ export declare function jitterIntervalMs(cfg: RetryConfig, baseMs: number, rand?: () => number): number;
61
+ /**
62
+ * Compute the wall-clock time of the next attempt:
63
+ * `previous + jitter(base(cfg, attempt))`.
64
+ */
65
+ export declare function nextAttemptAt(cfg: RetryConfig, previous: Date, attempt: number, rand?: () => number): Date;
66
+ /**
67
+ * Report whether `reasonCode` permits retry per §2.3 / ERRORS.md
68
+ * §3. Unknown reason codes default to non-recoverable.
69
+ */
70
+ export declare function isRecoverableReason(reasonCode: string): boolean;
71
+ /**
72
+ * Effective delivery deadline per §2.4 — the earlier of
73
+ * `postmark.expires` and `queuedAt + horizon`. `horizon <= 0`
74
+ * defaults to {@link DefaultMaxRetryHorizonMs}; values larger than
75
+ * {@link MaxRetryHorizonCapMs} clamp down.
76
+ */
77
+ export declare function effectiveDeadline(postmarkExpires: Date | null, queuedAt: Date, horizonMs?: number): Date;
78
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/delivery/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,yDAAyD;AACzD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,uDAAuD;AACvD,eAAO,MAAM,kBAAkB,IAAM,CAAC;AAEtC,oEAAoE;AACpE,eAAO,MAAM,kBAAkB,QAAqB,CAAC;AAErD,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,MAAO,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,8DAA8D;AAC9D,eAAO,MAAM,wBAAwB,QAAsB,CAAC;AAE5D,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,QAA0B,CAAC;AAE5D,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,oBAAoB,CAepE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAYR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAM,MAAyB,GACpC,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,MAAyB,GACpC,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAY/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,EAC5B,QAAQ,EAAE,IAAI,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAeN"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Retry-schedule primitives per DELIVERY.md §2.2 + §2.3 + §2.4.
3
+ *
4
+ * Exposes the bounds the spec sets on retry timing (initial
5
+ * interval, multiplier, max interval, jitter, attempt floor),
6
+ * computes the base + jittered interval for a given attempt, and
7
+ * enforces the §2.3 recoverable-reason classification.
8
+ *
9
+ * @module
10
+ */
11
+ /** Minimum first base interval per §2.3 (60 seconds). */
12
+ export const MinRetryInitialIntervalMs = 60_000;
13
+ /** Minimum exponential backoff multiplier per §2.3. */
14
+ export const MinRetryMultiplier = 2.0;
15
+ /** Cap on individual inter-attempt intervals per §2.3 (6 hours). */
16
+ export const MaxRetryIntervalMs = 6 * 60 * 60 * 1000;
17
+ /** Minimum jitter half-width per §2.3 (10% — RECOMMENDED 25%). */
18
+ export const MinRetryJitterFraction = 0.10;
19
+ /**
20
+ * Lower bound on the realized jittered interval per §2.3:
21
+ * jitter MUST NOT reduce below 50% of the first base interval.
22
+ */
23
+ export const MinJitterFloorMs = MinRetryInitialIntervalMs / 2;
24
+ /** Minimum number of retry attempts per §2.3. */
25
+ export const MinRetryAttempts = 5;
26
+ /** Default `server_max_retry_horizon` per §2.4 (72 hours). */
27
+ export const DefaultMaxRetryHorizonMs = 72 * 60 * 60 * 1000;
28
+ /** Hard ceiling on `server_max_retry_horizon` per §2.4 (7 days). */
29
+ export const MaxRetryHorizonCapMs = 7 * 24 * 60 * 60 * 1000;
30
+ /** Apply spec minima/maxima to `cfg` and return the effective values. */
31
+ export function sanitizeRetry(cfg) {
32
+ const initialIntervalMs = Math.max(cfg.initialIntervalMs ?? 0, MinRetryInitialIntervalMs);
33
+ const multiplier = Math.max(cfg.multiplier ?? 0, MinRetryMultiplier);
34
+ let maxIntervalMs = cfg.maxIntervalMs ?? 0;
35
+ if (maxIntervalMs <= 0 || maxIntervalMs > MaxRetryIntervalMs) {
36
+ maxIntervalMs = MaxRetryIntervalMs;
37
+ }
38
+ const jitterFraction = Math.max(cfg.jitterFraction ?? 0, MinRetryJitterFraction);
39
+ return { initialIntervalMs, multiplier, maxIntervalMs, jitterFraction };
40
+ }
41
+ /**
42
+ * Unjittered base interval for the zero-indexed `attempt`. Computes
43
+ * `initialInterval * multiplier^attempt`, clamped to `maxIntervalMs`.
44
+ */
45
+ export function baseIntervalMs(cfg, attempt) {
46
+ const eff = sanitizeRetry(cfg);
47
+ const a = Math.max(0, Math.floor(attempt));
48
+ let d = eff.initialIntervalMs;
49
+ for (let i = 0; i < a; i++) {
50
+ d *= eff.multiplier;
51
+ if (d > eff.maxIntervalMs) {
52
+ d = eff.maxIntervalMs;
53
+ break;
54
+ }
55
+ }
56
+ return Math.min(d, eff.maxIntervalMs);
57
+ }
58
+ /**
59
+ * Apply symmetric jitter to `baseMs` using a random multiplier in
60
+ * `[1-j, 1+j]`, floored at {@link MinJitterFloorMs}. Uses
61
+ * `globalThis.crypto.getRandomValues` for entropy by default.
62
+ */
63
+ export function jitterIntervalMs(cfg, baseMs, rand = defaultRandFloat) {
64
+ const eff = sanitizeRetry(cfg);
65
+ if (baseMs <= 0) {
66
+ throw new Error("delivery: non-positive base interval");
67
+ }
68
+ const r = rand();
69
+ if (r < 0 || r >= 1) {
70
+ throw new Error("delivery: jitter random source returned out-of-range value");
71
+ }
72
+ const m = 1 - eff.jitterFraction + 2 * eff.jitterFraction * r;
73
+ const jittered = Math.floor(baseMs * m);
74
+ return Math.max(jittered, MinJitterFloorMs);
75
+ }
76
+ /**
77
+ * Compute the wall-clock time of the next attempt:
78
+ * `previous + jitter(base(cfg, attempt))`.
79
+ */
80
+ export function nextAttemptAt(cfg, previous, attempt, rand = defaultRandFloat) {
81
+ if (Number.isNaN(previous.getTime())) {
82
+ throw new Error("delivery: previous attempt time is invalid");
83
+ }
84
+ const base = baseIntervalMs(cfg, attempt);
85
+ const jittered = jitterIntervalMs(cfg, base, rand);
86
+ return new Date(previous.getTime() + jittered);
87
+ }
88
+ /**
89
+ * Report whether `reasonCode` permits retry per §2.3 / ERRORS.md
90
+ * §3. Unknown reason codes default to non-recoverable.
91
+ */
92
+ export function isRecoverableReason(reasonCode) {
93
+ switch (reasonCode) {
94
+ case "handshake_invalid":
95
+ case "handshake_expired":
96
+ case "no_session":
97
+ case "server_unavailable":
98
+ case "rate_limited":
99
+ case "server_at_capacity":
100
+ return true;
101
+ default:
102
+ return false;
103
+ }
104
+ }
105
+ /**
106
+ * Effective delivery deadline per §2.4 — the earlier of
107
+ * `postmark.expires` and `queuedAt + horizon`. `horizon <= 0`
108
+ * defaults to {@link DefaultMaxRetryHorizonMs}; values larger than
109
+ * {@link MaxRetryHorizonCapMs} clamp down.
110
+ */
111
+ export function effectiveDeadline(postmarkExpires, queuedAt, horizonMs) {
112
+ let h = horizonMs ?? 0;
113
+ if (h <= 0) {
114
+ h = DefaultMaxRetryHorizonMs;
115
+ }
116
+ if (h > MaxRetryHorizonCapMs) {
117
+ h = MaxRetryHorizonCapMs;
118
+ }
119
+ const horizonDeadline = new Date(queuedAt.getTime() + h);
120
+ if (postmarkExpires === null) {
121
+ return horizonDeadline;
122
+ }
123
+ return postmarkExpires.getTime() < horizonDeadline.getTime()
124
+ ? postmarkExpires
125
+ : horizonDeadline;
126
+ }
127
+ function defaultRandFloat() {
128
+ const buf = new Uint32Array(1);
129
+ globalThis.crypto.getRandomValues(buf);
130
+ return (buf[0] ?? 0) / 0x1_0000_0000;
131
+ }
132
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/delivery/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,yDAAyD;AACzD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,uDAAuD;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAEtC,oEAAoE;AACpE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAErD,kEAAkE;AAClE,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,GAAG,CAAC,CAAC;AAE9D,iDAAiD;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5D,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAsB5D,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAC1B,yBAAyB,CAC1B,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACrE,IAAI,aAAa,GAAG,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC;IAC3C,IAAI,aAAa,IAAI,CAAC,IAAI,aAAa,GAAG,kBAAkB,EAAE,CAAC;QAC7D,aAAa,GAAG,kBAAkB,CAAC;IACrC,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,GAAG,CAAC,cAAc,IAAI,CAAC,EACvB,sBAAsB,CACvB,CAAC;IACF,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAgB,EAChB,OAAe;IAEf,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YAC1B,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC;YACtB,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAgB,EAChB,MAAc,EACd,OAAqB,gBAAgB;IAErC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAgB,EAChB,QAAc,EACd,OAAe,EACf,OAAqB,gBAAgB;IAErC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,QAAQ,UAAiC,EAAE,CAAC;QAC1C,KAAK,mBAAmB,CAAC;QACzB,KAAK,mBAAmB,CAAC;QACzB,KAAK,YAAY,CAAC;QAClB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,cAAc,CAAC;QACpB,KAAK,oBAAoB;YACvB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAA4B,EAC5B,QAAc,EACd,SAAkB;IAElB,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,CAAC,GAAG,wBAAwB,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,GAAG,oBAAoB,EAAE,CAAC;QAC7B,CAAC,GAAG,oBAAoB,CAAC;IAC3B,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE;QAC1D,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,eAAe,CAAC;AACtB,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/B,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,aAAa,CAAC;AACvC,CAAC"}