@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.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/brief/address.d.ts +77 -0
- package/dist/brief/address.d.ts.map +1 -0
- package/dist/brief/address.js +217 -0
- package/dist/brief/address.js.map +1 -0
- package/dist/brief/brief.d.ts +75 -0
- package/dist/brief/brief.d.ts.map +1 -0
- package/dist/brief/brief.js +56 -0
- package/dist/brief/brief.js.map +1 -0
- package/dist/brief/index.d.ts +11 -0
- package/dist/brief/index.d.ts.map +1 -0
- package/dist/brief/index.js +11 -0
- package/dist/brief/index.js.map +1 -0
- package/dist/canonical/index.d.ts +8 -0
- package/dist/canonical/index.d.ts.map +1 -0
- package/dist/canonical/index.js +8 -0
- package/dist/canonical/index.js.map +1 -0
- package/dist/canonical/marshal.d.ts +35 -0
- package/dist/canonical/marshal.d.ts.map +1 -0
- package/dist/canonical/marshal.js +107 -0
- package/dist/canonical/marshal.js.map +1 -0
- package/dist/clockskew/index.d.ts +52 -0
- package/dist/clockskew/index.d.ts.map +1 -0
- package/dist/clockskew/index.js +62 -0
- package/dist/clockskew/index.js.map +1 -0
- package/dist/closure/closure.d.ts +106 -0
- package/dist/closure/closure.d.ts.map +1 -0
- package/dist/closure/closure.js +152 -0
- package/dist/closure/closure.js.map +1 -0
- package/dist/closure/driver.d.ts +103 -0
- package/dist/closure/driver.d.ts.map +1 -0
- package/dist/closure/driver.js +126 -0
- package/dist/closure/driver.js.map +1 -0
- package/dist/closure/index.d.ts +13 -0
- package/dist/closure/index.d.ts.map +1 -0
- package/dist/closure/index.js +13 -0
- package/dist/closure/index.js.map +1 -0
- package/dist/closure/store.d.ts +80 -0
- package/dist/closure/store.d.ts.map +1 -0
- package/dist/closure/store.js +89 -0
- package/dist/closure/store.js.map +1 -0
- package/dist/crypto/aead.d.ts +29 -0
- package/dist/crypto/aead.d.ts.map +1 -0
- package/dist/crypto/aead.js +48 -0
- package/dist/crypto/aead.js.map +1 -0
- package/dist/crypto/argon2.d.ts +20 -0
- package/dist/crypto/argon2.d.ts.map +1 -0
- package/dist/crypto/argon2.js +28 -0
- package/dist/crypto/argon2.js.map +1 -0
- package/dist/crypto/index.d.ts +14 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +14 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/kdf.d.ts +96 -0
- package/dist/crypto/kdf.d.ts.map +1 -0
- package/dist/crypto/kdf.js +122 -0
- package/dist/crypto/kdf.js.map +1 -0
- package/dist/crypto/kem.d.ts +85 -0
- package/dist/crypto/kem.d.ts.map +1 -0
- package/dist/crypto/kem.js +130 -0
- package/dist/crypto/kem.js.map +1 -0
- package/dist/crypto/mac.d.ts +19 -0
- package/dist/crypto/mac.d.ts.map +1 -0
- package/dist/crypto/mac.js +32 -0
- package/dist/crypto/mac.js.map +1 -0
- package/dist/delivery/ack.d.ts +125 -0
- package/dist/delivery/ack.d.ts.map +1 -0
- package/dist/delivery/ack.js +141 -0
- package/dist/delivery/ack.js.map +1 -0
- package/dist/delivery/blocklist.d.ts +87 -0
- package/dist/delivery/blocklist.d.ts.map +1 -0
- package/dist/delivery/blocklist.js +107 -0
- package/dist/delivery/blocklist.js.map +1 -0
- package/dist/delivery/cancel.d.ts +60 -0
- package/dist/delivery/cancel.d.ts.map +1 -0
- package/dist/delivery/cancel.js +43 -0
- package/dist/delivery/cancel.js.map +1 -0
- package/dist/delivery/disposition.d.ts +106 -0
- package/dist/delivery/disposition.d.ts.map +1 -0
- package/dist/delivery/disposition.js +105 -0
- package/dist/delivery/disposition.js.map +1 -0
- package/dist/delivery/fetch.d.ts +59 -0
- package/dist/delivery/fetch.d.ts.map +1 -0
- package/dist/delivery/fetch.js +47 -0
- package/dist/delivery/fetch.js.map +1 -0
- package/dist/delivery/forwarder.d.ts +106 -0
- package/dist/delivery/forwarder.d.ts.map +1 -0
- package/dist/delivery/forwarder.js +251 -0
- package/dist/delivery/forwarder.js.map +1 -0
- package/dist/delivery/inbox.d.ts +42 -0
- package/dist/delivery/inbox.d.ts.map +1 -0
- package/dist/delivery/inbox.js +68 -0
- package/dist/delivery/inbox.js.map +1 -0
- package/dist/delivery/index.d.ts +31 -0
- package/dist/delivery/index.d.ts.map +1 -0
- package/dist/delivery/index.js +31 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/internalroute.d.ts +50 -0
- package/dist/delivery/internalroute.d.ts.map +1 -0
- package/dist/delivery/internalroute.js +23 -0
- package/dist/delivery/internalroute.js.map +1 -0
- package/dist/delivery/pipeline.d.ts +153 -0
- package/dist/delivery/pipeline.d.ts.map +1 -0
- package/dist/delivery/pipeline.js +356 -0
- package/dist/delivery/pipeline.js.map +1 -0
- package/dist/delivery/policy_state.d.ts +105 -0
- package/dist/delivery/policy_state.d.ts.map +1 -0
- package/dist/delivery/policy_state.js +293 -0
- package/dist/delivery/policy_state.js.map +1 -0
- package/dist/delivery/queue.d.ts +47 -0
- package/dist/delivery/queue.d.ts.map +1 -0
- package/dist/delivery/queue.js +33 -0
- package/dist/delivery/queue.js.map +1 -0
- package/dist/delivery/receipt.d.ts +137 -0
- package/dist/delivery/receipt.d.ts.map +1 -0
- package/dist/delivery/receipt.js +181 -0
- package/dist/delivery/receipt.js.map +1 -0
- package/dist/delivery/receipt_store.d.ts +81 -0
- package/dist/delivery/receipt_store.d.ts.map +1 -0
- package/dist/delivery/receipt_store.js +74 -0
- package/dist/delivery/receipt_store.js.map +1 -0
- package/dist/delivery/retry.d.ts +78 -0
- package/dist/delivery/retry.d.ts.map +1 -0
- package/dist/delivery/retry.js +132 -0
- package/dist/delivery/retry.js.map +1 -0
- package/dist/delivery/scheduler.d.ts +156 -0
- package/dist/delivery/scheduler.d.ts.map +1 -0
- package/dist/delivery/scheduler.js +349 -0
- package/dist/delivery/scheduler.js.map +1 -0
- package/dist/delivery/stage_partition.d.ts +87 -0
- package/dist/delivery/stage_partition.d.ts.map +1 -0
- package/dist/delivery/stage_partition.js +122 -0
- package/dist/delivery/stage_partition.js.map +1 -0
- package/dist/delivery/staged_runner.d.ts +100 -0
- package/dist/delivery/staged_runner.d.ts.map +1 -0
- package/dist/delivery/staged_runner.js +277 -0
- package/dist/delivery/staged_runner.js.map +1 -0
- package/dist/delivery/submission.d.ts +72 -0
- package/dist/delivery/submission.d.ts.map +1 -0
- package/dist/delivery/submission.js +58 -0
- package/dist/delivery/submission.js.map +1 -0
- package/dist/delivery/sync.d.ts +68 -0
- package/dist/delivery/sync.d.ts.map +1 -0
- package/dist/delivery/sync.js +99 -0
- package/dist/delivery/sync.js.map +1 -0
- package/dist/delivery/user_policy.d.ts +74 -0
- package/dist/delivery/user_policy.d.ts.map +1 -0
- package/dist/delivery/user_policy.js +140 -0
- package/dist/delivery/user_policy.js.map +1 -0
- package/dist/discovery/cache.d.ts +37 -0
- package/dist/discovery/cache.d.ts.map +1 -0
- package/dist/discovery/cache.js +45 -0
- package/dist/discovery/cache.js.map +1 -0
- package/dist/discovery/configuration.d.ts +97 -0
- package/dist/discovery/configuration.d.ts.map +1 -0
- package/dist/discovery/configuration.js +146 -0
- package/dist/discovery/configuration.js.map +1 -0
- package/dist/discovery/dns.d.ts +56 -0
- package/dist/discovery/dns.d.ts.map +1 -0
- package/dist/discovery/dns.js +120 -0
- package/dist/discovery/dns.js.map +1 -0
- package/dist/discovery/domain_keys.d.ts +62 -0
- package/dist/discovery/domain_keys.d.ts.map +1 -0
- package/dist/discovery/domain_keys.js +89 -0
- package/dist/discovery/domain_keys.js.map +1 -0
- package/dist/discovery/index.d.ts +19 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +19 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/lookup.d.ts +72 -0
- package/dist/discovery/lookup.d.ts.map +1 -0
- package/dist/discovery/lookup.js +121 -0
- package/dist/discovery/lookup.js.map +1 -0
- package/dist/discovery/onion.d.ts +34 -0
- package/dist/discovery/onion.d.ts.map +1 -0
- package/dist/discovery/onion.js +61 -0
- package/dist/discovery/onion.js.map +1 -0
- package/dist/discovery/partition.d.ts +96 -0
- package/dist/discovery/partition.d.ts.map +1 -0
- package/dist/discovery/partition.js +247 -0
- package/dist/discovery/partition.js.map +1 -0
- package/dist/discovery/resolver.d.ts +113 -0
- package/dist/discovery/resolver.d.ts.map +1 -0
- package/dist/discovery/resolver.js +176 -0
- package/dist/discovery/resolver.js.map +1 -0
- package/dist/discovery/txt.d.ts +39 -0
- package/dist/discovery/txt.d.ts.map +1 -0
- package/dist/discovery/txt.js +71 -0
- package/dist/discovery/txt.js.map +1 -0
- package/dist/enclosure/forwarding.d.ts +128 -0
- package/dist/enclosure/forwarding.d.ts.map +1 -0
- package/dist/enclosure/forwarding.js +119 -0
- package/dist/enclosure/forwarding.js.map +1 -0
- package/dist/enclosure/index.d.ts +11 -0
- package/dist/enclosure/index.d.ts.map +1 -0
- package/dist/enclosure/index.js +11 -0
- package/dist/enclosure/index.js.map +1 -0
- package/dist/envelope/buckets.d.ts +38 -0
- package/dist/envelope/buckets.d.ts.map +1 -0
- package/dist/envelope/buckets.js +73 -0
- package/dist/envelope/buckets.js.map +1 -0
- package/dist/envelope/canonical.d.ts +28 -0
- package/dist/envelope/canonical.d.ts.map +1 -0
- package/dist/envelope/canonical.js +54 -0
- package/dist/envelope/canonical.js.map +1 -0
- package/dist/envelope/compose.d.ts +171 -0
- package/dist/envelope/compose.d.ts.map +1 -0
- package/dist/envelope/compose.js +237 -0
- package/dist/envelope/compose.js.map +1 -0
- package/dist/envelope/encode.d.ts +41 -0
- package/dist/envelope/encode.d.ts.map +1 -0
- package/dist/envelope/encode.js +69 -0
- package/dist/envelope/encode.js.map +1 -0
- package/dist/envelope/index.d.ts +20 -0
- package/dist/envelope/index.d.ts.map +1 -0
- package/dist/envelope/index.js +20 -0
- package/dist/envelope/index.js.map +1 -0
- package/dist/envelope/open_any.d.ts +48 -0
- package/dist/envelope/open_any.d.ts.map +1 -0
- package/dist/envelope/open_any.js +81 -0
- package/dist/envelope/open_any.js.map +1 -0
- package/dist/envelope/open_verified.d.ts +59 -0
- package/dist/envelope/open_verified.d.ts.map +1 -0
- package/dist/envelope/open_verified.js +67 -0
- package/dist/envelope/open_verified.js.map +1 -0
- package/dist/envelope/padding.d.ts +55 -0
- package/dist/envelope/padding.d.ts.map +1 -0
- package/dist/envelope/padding.js +162 -0
- package/dist/envelope/padding.js.map +1 -0
- package/dist/envelope/rejection.d.ts +22 -0
- package/dist/envelope/rejection.d.ts.map +1 -0
- package/dist/envelope/rejection.js +30 -0
- package/dist/envelope/rejection.js.map +1 -0
- package/dist/envelope/sendtime.d.ts +49 -0
- package/dist/envelope/sendtime.d.ts.map +1 -0
- package/dist/envelope/sendtime.js +87 -0
- package/dist/envelope/sendtime.js.map +1 -0
- package/dist/envelope/verify.d.ts +29 -0
- package/dist/envelope/verify.d.ts.map +1 -0
- package/dist/envelope/verify.js +90 -0
- package/dist/envelope/verify.js.map +1 -0
- package/dist/extensions/index.d.ts +7 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +7 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/limits.d.ts +101 -0
- package/dist/extensions/limits.d.ts.map +1 -0
- package/dist/extensions/limits.js +175 -0
- package/dist/extensions/limits.js.map +1 -0
- package/dist/handshake/abort.d.ts +49 -0
- package/dist/handshake/abort.d.ts.map +1 -0
- package/dist/handshake/abort.js +82 -0
- package/dist/handshake/abort.js.map +1 -0
- package/dist/handshake/capabilities.d.ts +46 -0
- package/dist/handshake/capabilities.d.ts.map +1 -0
- package/dist/handshake/capabilities.js +114 -0
- package/dist/handshake/capabilities.js.map +1 -0
- package/dist/handshake/client_state.d.ts +186 -0
- package/dist/handshake/client_state.d.ts.map +1 -0
- package/dist/handshake/client_state.js +520 -0
- package/dist/handshake/client_state.js.map +1 -0
- package/dist/handshake/confirm.d.ts +21 -0
- package/dist/handshake/confirm.d.ts.map +1 -0
- package/dist/handshake/confirm.js +27 -0
- package/dist/handshake/confirm.js.map +1 -0
- package/dist/handshake/driver.d.ts +126 -0
- package/dist/handshake/driver.d.ts.map +1 -0
- package/dist/handshake/driver.js +251 -0
- package/dist/handshake/driver.js.map +1 -0
- package/dist/handshake/federation.d.ts +365 -0
- package/dist/handshake/federation.d.ts.map +1 -0
- package/dist/handshake/federation.js +664 -0
- package/dist/handshake/federation.js.map +1 -0
- package/dist/handshake/first_contact.d.ts +57 -0
- package/dist/handshake/first_contact.d.ts.map +1 -0
- package/dist/handshake/first_contact.js +124 -0
- package/dist/handshake/first_contact.js.map +1 -0
- package/dist/handshake/identity.d.ts +101 -0
- package/dist/handshake/identity.d.ts.map +1 -0
- package/dist/handshake/identity.js +117 -0
- package/dist/handshake/identity.js.map +1 -0
- package/dist/handshake/index.d.ts +21 -0
- package/dist/handshake/index.d.ts.map +1 -0
- package/dist/handshake/index.js +21 -0
- package/dist/handshake/index.js.map +1 -0
- package/dist/handshake/messages.d.ts +176 -0
- package/dist/handshake/messages.d.ts.map +1 -0
- package/dist/handshake/messages.js +125 -0
- package/dist/handshake/messages.js.map +1 -0
- package/dist/handshake/pow.d.ts +53 -0
- package/dist/handshake/pow.d.ts.map +1 -0
- package/dist/handshake/pow.js +142 -0
- package/dist/handshake/pow.js.map +1 -0
- package/dist/handshake/resume_driver.d.ts +56 -0
- package/dist/handshake/resume_driver.d.ts.map +1 -0
- package/dist/handshake/resume_driver.js +75 -0
- package/dist/handshake/resume_driver.js.map +1 -0
- package/dist/handshake/server.d.ts +112 -0
- package/dist/handshake/server.d.ts.map +1 -0
- package/dist/handshake/server.js +247 -0
- package/dist/handshake/server.js.map +1 -0
- package/dist/handshake/server_state.d.ts +102 -0
- package/dist/handshake/server_state.d.ts.map +1 -0
- package/dist/handshake/server_state.js +278 -0
- package/dist/handshake/server_state.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/keys/compromise.d.ts +118 -0
- package/dist/keys/compromise.d.ts.map +1 -0
- package/dist/keys/compromise.js +218 -0
- package/dist/keys/compromise.js.map +1 -0
- package/dist/keys/device_certificate.d.ts +166 -0
- package/dist/keys/device_certificate.d.ts.map +1 -0
- package/dist/keys/device_certificate.js +328 -0
- package/dist/keys/device_certificate.js.map +1 -0
- package/dist/keys/device_records.d.ts +175 -0
- package/dist/keys/device_records.d.ts.map +1 -0
- package/dist/keys/device_records.js +418 -0
- package/dist/keys/device_records.js.map +1 -0
- package/dist/keys/directory_cache.d.ts +64 -0
- package/dist/keys/directory_cache.d.ts.map +1 -0
- package/dist/keys/directory_cache.js +98 -0
- package/dist/keys/directory_cache.js.map +1 -0
- package/dist/keys/directory_state.d.ts +79 -0
- package/dist/keys/directory_state.d.ts.map +1 -0
- package/dist/keys/directory_state.js +155 -0
- package/dist/keys/directory_state.js.map +1 -0
- package/dist/keys/index.d.ts +18 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +18 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/key_revocation.d.ts +61 -0
- package/dist/keys/key_revocation.d.ts.map +1 -0
- package/dist/keys/key_revocation.js +88 -0
- package/dist/keys/key_revocation.js.map +1 -0
- package/dist/keys/request.d.ts +124 -0
- package/dist/keys/request.d.ts.map +1 -0
- package/dist/keys/request.js +130 -0
- package/dist/keys/request.js.map +1 -0
- package/dist/keys/sign.d.ts +49 -0
- package/dist/keys/sign.d.ts.map +1 -0
- package/dist/keys/sign.js +80 -0
- package/dist/keys/sign.js.map +1 -0
- package/dist/keys/signed.d.ts +80 -0
- package/dist/keys/signed.d.ts.map +1 -0
- package/dist/keys/signed.js +138 -0
- package/dist/keys/signed.js.map +1 -0
- package/dist/keys/store.d.ts +138 -0
- package/dist/keys/store.d.ts.map +1 -0
- package/dist/keys/store.js +107 -0
- package/dist/keys/store.js.map +1 -0
- package/dist/largeattachment/crypto.d.ts +47 -0
- package/dist/largeattachment/crypto.d.ts.map +1 -0
- package/dist/largeattachment/crypto.js +235 -0
- package/dist/largeattachment/crypto.js.map +1 -0
- package/dist/largeattachment/enclosure.d.ts +48 -0
- package/dist/largeattachment/enclosure.d.ts.map +1 -0
- package/dist/largeattachment/enclosure.js +102 -0
- package/dist/largeattachment/enclosure.js.map +1 -0
- package/dist/largeattachment/index.d.ts +15 -0
- package/dist/largeattachment/index.d.ts.map +1 -0
- package/dist/largeattachment/index.js +15 -0
- package/dist/largeattachment/index.js.map +1 -0
- package/dist/largeattachment/store.d.ts +36 -0
- package/dist/largeattachment/store.d.ts.map +1 -0
- package/dist/largeattachment/store.js +37 -0
- package/dist/largeattachment/store.js.map +1 -0
- package/dist/largeattachment/types.d.ts +56 -0
- package/dist/largeattachment/types.d.ts.map +1 -0
- package/dist/largeattachment/types.js +31 -0
- package/dist/largeattachment/types.js.map +1 -0
- package/dist/largeattachment/upload.d.ts +62 -0
- package/dist/largeattachment/upload.d.ts.map +1 -0
- package/dist/largeattachment/upload.js +166 -0
- package/dist/largeattachment/upload.js.map +1 -0
- package/dist/migration/index.d.ts +17 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +17 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/lockout.d.ts +48 -0
- package/dist/migration/lockout.d.ts.map +1 -0
- package/dist/migration/lockout.js +57 -0
- package/dist/migration/lockout.js.map +1 -0
- package/dist/migration/migration.d.ts +48 -0
- package/dist/migration/migration.d.ts.map +1 -0
- package/dist/migration/migration.js +58 -0
- package/dist/migration/migration.js.map +1 -0
- package/dist/migration/notice.d.ts +33 -0
- package/dist/migration/notice.d.ts.map +1 -0
- package/dist/migration/notice.js +85 -0
- package/dist/migration/notice.js.map +1 -0
- package/dist/migration/orchestrate.d.ts +109 -0
- package/dist/migration/orchestrate.d.ts.map +1 -0
- package/dist/migration/orchestrate.js +212 -0
- package/dist/migration/orchestrate.js.map +1 -0
- package/dist/migration/publication_store.d.ts +34 -0
- package/dist/migration/publication_store.d.ts.map +1 -0
- package/dist/migration/publication_store.js +44 -0
- package/dist/migration/publication_store.js.map +1 -0
- package/dist/migration/sign.d.ts +65 -0
- package/dist/migration/sign.d.ts.map +1 -0
- package/dist/migration/sign.js +331 -0
- package/dist/migration/sign.js.map +1 -0
- package/dist/migration/types.d.ts +92 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +26 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/reasoncodes.d.ts +42 -0
- package/dist/reasoncodes.d.ts.map +1 -0
- package/dist/reasoncodes.js +80 -0
- package/dist/reasoncodes.js.map +1 -0
- package/dist/recovery/bundle.d.ts +34 -0
- package/dist/recovery/bundle.d.ts.map +1 -0
- package/dist/recovery/bundle.js +144 -0
- package/dist/recovery/bundle.js.map +1 -0
- package/dist/recovery/bundle_crypto.d.ts +60 -0
- package/dist/recovery/bundle_crypto.d.ts.map +1 -0
- package/dist/recovery/bundle_crypto.js +179 -0
- package/dist/recovery/bundle_crypto.js.map +1 -0
- package/dist/recovery/bundle_store.d.ts +57 -0
- package/dist/recovery/bundle_store.d.ts.map +1 -0
- package/dist/recovery/bundle_store.js +104 -0
- package/dist/recovery/bundle_store.js.map +1 -0
- package/dist/recovery/index.d.ts +19 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +19 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/manifest_crosscheck.d.ts +59 -0
- package/dist/recovery/manifest_crosscheck.d.ts.map +1 -0
- package/dist/recovery/manifest_crosscheck.js +59 -0
- package/dist/recovery/manifest_crosscheck.js.map +1 -0
- package/dist/recovery/shamir.d.ts +51 -0
- package/dist/recovery/shamir.d.ts.map +1 -0
- package/dist/recovery/shamir.js +181 -0
- package/dist/recovery/shamir.js.map +1 -0
- package/dist/recovery/sign.d.ts +61 -0
- package/dist/recovery/sign.d.ts.map +1 -0
- package/dist/recovery/sign.js +359 -0
- package/dist/recovery/sign.js.map +1 -0
- package/dist/recovery/types.d.ts +180 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/recovery/types.js +31 -0
- package/dist/recovery/types.js.map +1 -0
- package/dist/reputation/abuse_report.d.ts +62 -0
- package/dist/reputation/abuse_report.d.ts.map +1 -0
- package/dist/reputation/abuse_report.js +111 -0
- package/dist/reputation/abuse_report.js.map +1 -0
- package/dist/reputation/bucketize.d.ts +31 -0
- package/dist/reputation/bucketize.d.ts.map +1 -0
- package/dist/reputation/bucketize.js +77 -0
- package/dist/reputation/bucketize.js.map +1 -0
- package/dist/reputation/gossip.d.ts +24 -0
- package/dist/reputation/gossip.d.ts.map +1 -0
- package/dist/reputation/gossip.js +64 -0
- package/dist/reputation/gossip.js.map +1 -0
- package/dist/reputation/gossip_fetch.d.ts +64 -0
- package/dist/reputation/gossip_fetch.d.ts.map +1 -0
- package/dist/reputation/gossip_fetch.js +114 -0
- package/dist/reputation/gossip_fetch.js.map +1 -0
- package/dist/reputation/index.d.ts +20 -0
- package/dist/reputation/index.d.ts.map +1 -0
- package/dist/reputation/index.js +20 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/observation_store.d.ts +67 -0
- package/dist/reputation/observation_store.d.ts.map +1 -0
- package/dist/reputation/observation_store.js +171 -0
- package/dist/reputation/observation_store.js.map +1 -0
- package/dist/reputation/pow.d.ts +91 -0
- package/dist/reputation/pow.d.ts.map +1 -0
- package/dist/reputation/pow.js +209 -0
- package/dist/reputation/pow.js.map +1 -0
- package/dist/reputation/sign.d.ts +40 -0
- package/dist/reputation/sign.d.ts.map +1 -0
- package/dist/reputation/sign.js +202 -0
- package/dist/reputation/sign.js.map +1 -0
- package/dist/reputation/types.d.ts +133 -0
- package/dist/reputation/types.d.ts.map +1 -0
- package/dist/reputation/types.js +33 -0
- package/dist/reputation/types.js.map +1 -0
- package/dist/reputation/whois.d.ts +25 -0
- package/dist/reputation/whois.d.ts.map +1 -0
- package/dist/reputation/whois.js +20 -0
- package/dist/reputation/whois.js.map +1 -0
- package/dist/seal/index.d.ts +8 -0
- package/dist/seal/index.d.ts.map +1 -0
- package/dist/seal/index.js +8 -0
- package/dist/seal/index.js.map +1 -0
- package/dist/seal/wrap.d.ts +74 -0
- package/dist/seal/wrap.d.ts.map +1 -0
- package/dist/seal/wrap.js +213 -0
- package/dist/seal/wrap.js.map +1 -0
- package/dist/session/dispatcher.d.ts +65 -0
- package/dist/session/dispatcher.d.ts.map +1 -0
- package/dist/session/dispatcher.js +96 -0
- package/dist/session/dispatcher.js.map +1 -0
- package/dist/session/index.d.ts +15 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +15 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/rekey.d.ts +108 -0
- package/dist/session/rekey.d.ts.map +1 -0
- package/dist/session/rekey.js +207 -0
- package/dist/session/rekey.js.map +1 -0
- package/dist/session/rekey_seal.d.ts +66 -0
- package/dist/session/rekey_seal.d.ts.map +1 -0
- package/dist/session/rekey_seal.js +153 -0
- package/dist/session/rekey_seal.js.map +1 -0
- package/dist/session/resume.d.ts +125 -0
- package/dist/session/resume.d.ts.map +1 -0
- package/dist/session/resume.js +263 -0
- package/dist/session/resume.js.map +1 -0
- package/dist/session/session.d.ts +136 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +188 -0
- package/dist/session/session.js.map +1 -0
- package/dist/transparency/index.d.ts +13 -0
- package/dist/transparency/index.d.ts.map +1 -0
- package/dist/transparency/index.js +13 -0
- package/dist/transparency/index.js.map +1 -0
- package/dist/transparency/log.d.ts +61 -0
- package/dist/transparency/log.d.ts.map +1 -0
- package/dist/transparency/log.js +133 -0
- package/dist/transparency/log.js.map +1 -0
- package/dist/transparency/merkle.d.ts +59 -0
- package/dist/transparency/merkle.d.ts.map +1 -0
- package/dist/transparency/merkle.js +314 -0
- package/dist/transparency/merkle.js.map +1 -0
- package/dist/transparency/sign.d.ts +48 -0
- package/dist/transparency/sign.d.ts.map +1 -0
- package/dist/transparency/sign.js +140 -0
- package/dist/transparency/sign.js.map +1 -0
- package/dist/transparency/types.d.ts +97 -0
- package/dist/transparency/types.d.ts.map +1 -0
- package/dist/transparency/types.js +25 -0
- package/dist/transparency/types.js.map +1 -0
- package/dist/transport/h2.d.ts +163 -0
- package/dist/transport/h2.d.ts.map +1 -0
- package/dist/transport/h2.js +397 -0
- package/dist/transport/h2.js.map +1 -0
- package/dist/transport/index.d.ts +15 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +15 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/memory.d.ts +21 -0
- package/dist/transport/memory.d.ts.map +1 -0
- package/dist/transport/memory.js +112 -0
- package/dist/transport/memory.js.map +1 -0
- package/dist/transport/transport.d.ts +54 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +20 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/ws.d.ts +40 -0
- package/dist/transport/ws.d.ts.map +1 -0
- package/dist/transport/ws.js +204 -0
- package/dist/transport/ws.js.map +1 -0
- 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":"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"}
|