@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,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sending-side delivery scheduler per DELIVERY.md §2.3 + §2.5 + §2.7.
|
|
3
|
+
*
|
|
4
|
+
* Drives the §4.5 delivery queue by consuming the §2.3 retry helpers
|
|
5
|
+
* and the §2.5 queue-state record against an injectable
|
|
6
|
+
* {@link DeliverFunc}. Operators call {@link Scheduler.tick} on a
|
|
7
|
+
* timer (every few seconds). Each tick:
|
|
8
|
+
*
|
|
9
|
+
* - Pulls due records from the {@link SchedulerStore}.
|
|
10
|
+
* - Runs {@link DeliverFunc} against each.
|
|
11
|
+
* - Updates state per the per-attempt outcome:
|
|
12
|
+
* - `delivered` → state = `delivered`, emit event.
|
|
13
|
+
* - `rejected` (non-recoverable) → state = `rejected`, emit event.
|
|
14
|
+
* - `rejected` (recoverable) / `silent` / transport failure →
|
|
15
|
+
* schedule next attempt via `nextAttemptAt`.
|
|
16
|
+
* - Effective deadline reached → state = `expired`, emit event.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { type RetryConfig } from "./retry.js";
|
|
21
|
+
import { type QueueState } from "./queue.js";
|
|
22
|
+
import type { CancelResult } from "./cancel.js";
|
|
23
|
+
import { type SubmissionEvent } from "./submission.js";
|
|
24
|
+
/** Outcome of a single delivery attempt. */
|
|
25
|
+
export interface AttemptResult {
|
|
26
|
+
status: "delivered" | "rejected" | "silent";
|
|
27
|
+
reasonCode?: string;
|
|
28
|
+
reason?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Performs a single delivery attempt against `(envelopeId, recipient)`. */
|
|
31
|
+
export type DeliverFunc = (envelopeId: string, recipient: string) => Promise<AttemptResult>;
|
|
32
|
+
/** Consumes terminal-state delivery events per §6.5. */
|
|
33
|
+
export type EventSink = (ev: SubmissionEvent) => void;
|
|
34
|
+
/** Persistence interface for queue records. */
|
|
35
|
+
export interface SchedulerStore {
|
|
36
|
+
/** Insert or update a record. */
|
|
37
|
+
put(q: QueueState): Promise<void>;
|
|
38
|
+
/** Fetch a record by `(envelope_id, recipient)`, or `null`. */
|
|
39
|
+
get(envelopeId: string, recipient: string): Promise<QueueState | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Every non-terminal record whose `next_attempt_at` is at or
|
|
42
|
+
* before `now`, ordered ascending by `next_attempt_at` with ties
|
|
43
|
+
* broken by `envelope_id`.
|
|
44
|
+
*/
|
|
45
|
+
dueRecords(now: Date): Promise<QueueState[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Terminal records whose `terminal_at` is at or before `cutoff`.
|
|
48
|
+
* Used by the retention prune.
|
|
49
|
+
*/
|
|
50
|
+
listTerminalOlderThan(cutoff: Date): Promise<QueueState[]>;
|
|
51
|
+
/** Remove a record. */
|
|
52
|
+
delete(envelopeId: string, recipient: string): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/** Inputs to {@link Scheduler}. */
|
|
55
|
+
export interface SchedulerConfig {
|
|
56
|
+
store: SchedulerStore;
|
|
57
|
+
deliver: DeliverFunc;
|
|
58
|
+
/** Backoff policy. Defaults applied via {@link sanitizeRetry}. */
|
|
59
|
+
retry?: RetryConfig;
|
|
60
|
+
/**
|
|
61
|
+
* Operator-configured retry horizon per §2.4. Defaults to
|
|
62
|
+
* 72 hours; values above 7 days are clamped down.
|
|
63
|
+
*/
|
|
64
|
+
maxRetryHorizonMs?: number;
|
|
65
|
+
/** Optional terminal-event sink. */
|
|
66
|
+
eventSink?: EventSink;
|
|
67
|
+
/** Wall-clock hook. Defaults to `() => new Date()`. */
|
|
68
|
+
now?: () => Date;
|
|
69
|
+
}
|
|
70
|
+
/** Sentinel error: a tick is already in progress. */
|
|
71
|
+
export declare class TickInProgressError extends Error {
|
|
72
|
+
readonly name = "TickInProgressError";
|
|
73
|
+
constructor();
|
|
74
|
+
}
|
|
75
|
+
/** Sentinel error: no queue record for the requested key. */
|
|
76
|
+
export declare class UnknownRecordError extends Error {
|
|
77
|
+
readonly name = "UnknownRecordError";
|
|
78
|
+
constructor(envelopeId: string, recipient: string);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Sending-side delivery scheduler. Single-process; the JS
|
|
82
|
+
* run-to-completion model gives effectively-atomic Tick semantics.
|
|
83
|
+
* `tickInFlight` is enforced by a software latch so concurrent
|
|
84
|
+
* calls return {@link TickInProgressError}.
|
|
85
|
+
*/
|
|
86
|
+
export declare class Scheduler {
|
|
87
|
+
private readonly store;
|
|
88
|
+
private readonly deliver;
|
|
89
|
+
private readonly retry;
|
|
90
|
+
private readonly horizonMs;
|
|
91
|
+
private readonly eventSink;
|
|
92
|
+
private readonly nowFn;
|
|
93
|
+
private tickInFlight;
|
|
94
|
+
constructor(cfg: SchedulerConfig);
|
|
95
|
+
/**
|
|
96
|
+
* Insert a new queue record for `(envelopeId, recipient)`. State
|
|
97
|
+
* starts at `queued`; `next_attempt_at = now` (deliver on next
|
|
98
|
+
* tick); `deadline = effectiveDeadline(postmarkExpires, now,
|
|
99
|
+
* horizon)`.
|
|
100
|
+
*
|
|
101
|
+
* Throws when a record for the same `(envelopeId, recipient)`
|
|
102
|
+
* already exists.
|
|
103
|
+
*/
|
|
104
|
+
enqueue(envelopeId: string, recipient: string, postmarkExpires: Date): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Pull every record whose `next_attempt_at` has passed and
|
|
107
|
+
* process it. Returns the number of records advanced (terminal
|
|
108
|
+
* or otherwise) and, on partial failure, the first error
|
|
109
|
+
* encountered (per-record errors do not abort the tick).
|
|
110
|
+
*
|
|
111
|
+
* Throws {@link TickInProgressError} if a concurrent tick is
|
|
112
|
+
* already running.
|
|
113
|
+
*/
|
|
114
|
+
tick(): Promise<{
|
|
115
|
+
advanced: number;
|
|
116
|
+
firstError?: Error;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* Transition `(envelopeId, recipient)` to the `canceled` terminal
|
|
120
|
+
* state per §2.7. Returns the resulting {@link CancelResult}.
|
|
121
|
+
* Idempotent: cancellation of a record already in a terminal
|
|
122
|
+
* state is a no-op that returns the prior state.
|
|
123
|
+
*/
|
|
124
|
+
cancel(envelopeId: string, recipient: string): Promise<CancelResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Cancel every still-non-terminal record for `envelopeId` across
|
|
127
|
+
* all recipients. Returns one {@link CancelResult} per record
|
|
128
|
+
* observed.
|
|
129
|
+
*/
|
|
130
|
+
cancelEnvelope(envelopeId: string): Promise<CancelResult[]>;
|
|
131
|
+
/**
|
|
132
|
+
* Evict terminal records whose `terminal_at` is at or before
|
|
133
|
+
* `now - retentionMs` per §2.5 retention. Returns the count
|
|
134
|
+
* pruned.
|
|
135
|
+
*/
|
|
136
|
+
pruneTerminal(retentionMs: number): Promise<number>;
|
|
137
|
+
private runAttempt;
|
|
138
|
+
private transitionTerminal;
|
|
139
|
+
private transitionExpired;
|
|
140
|
+
private emit;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Reference in-memory {@link SchedulerStore}. Tests / single-process
|
|
144
|
+
* demos only — production deployments back the queue with durable
|
|
145
|
+
* storage per DELIVERY.md §2.1.
|
|
146
|
+
*/
|
|
147
|
+
export declare class InMemorySchedulerStore implements SchedulerStore {
|
|
148
|
+
private readonly records;
|
|
149
|
+
private static keyOf;
|
|
150
|
+
put(q: QueueState): Promise<void>;
|
|
151
|
+
get(envelopeId: string, recipient: string): Promise<QueueState | null>;
|
|
152
|
+
dueRecords(now: Date): Promise<QueueState[]>;
|
|
153
|
+
listTerminalOlderThan(cutoff: Date): Promise<QueueState[]>;
|
|
154
|
+
delete(envelopeId: string, recipient: string): Promise<void>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/delivery/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sending-side delivery scheduler per DELIVERY.md §2.3 + §2.5 + §2.7.
|
|
3
|
+
*
|
|
4
|
+
* Drives the §4.5 delivery queue by consuming the §2.3 retry helpers
|
|
5
|
+
* and the §2.5 queue-state record against an injectable
|
|
6
|
+
* {@link DeliverFunc}. Operators call {@link Scheduler.tick} on a
|
|
7
|
+
* timer (every few seconds). Each tick:
|
|
8
|
+
*
|
|
9
|
+
* - Pulls due records from the {@link SchedulerStore}.
|
|
10
|
+
* - Runs {@link DeliverFunc} against each.
|
|
11
|
+
* - Updates state per the per-attempt outcome:
|
|
12
|
+
* - `delivered` → state = `delivered`, emit event.
|
|
13
|
+
* - `rejected` (non-recoverable) → state = `rejected`, emit event.
|
|
14
|
+
* - `rejected` (recoverable) / `silent` / transport failure →
|
|
15
|
+
* schedule next attempt via `nextAttemptAt`.
|
|
16
|
+
* - Effective deadline reached → state = `expired`, emit event.
|
|
17
|
+
*
|
|
18
|
+
* @module
|
|
19
|
+
*/
|
|
20
|
+
import { effectiveDeadline, isRecoverableReason, nextAttemptAt, sanitizeRetry, } from "./retry.js";
|
|
21
|
+
import { isTerminalState, setTerminal, } from "./queue.js";
|
|
22
|
+
import { newSubmissionEvent, } from "./submission.js";
|
|
23
|
+
/** Sentinel error: a tick is already in progress. */
|
|
24
|
+
export class TickInProgressError extends Error {
|
|
25
|
+
name = "TickInProgressError";
|
|
26
|
+
constructor() {
|
|
27
|
+
super("delivery: scheduler tick already in progress");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Sentinel error: no queue record for the requested key. */
|
|
31
|
+
export class UnknownRecordError extends Error {
|
|
32
|
+
name = "UnknownRecordError";
|
|
33
|
+
constructor(envelopeId, recipient) {
|
|
34
|
+
super(`delivery: no queue record for envelope_id=${JSON.stringify(envelopeId)} recipient=${JSON.stringify(recipient)}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Sending-side delivery scheduler. Single-process; the JS
|
|
39
|
+
* run-to-completion model gives effectively-atomic Tick semantics.
|
|
40
|
+
* `tickInFlight` is enforced by a software latch so concurrent
|
|
41
|
+
* calls return {@link TickInProgressError}.
|
|
42
|
+
*/
|
|
43
|
+
export class Scheduler {
|
|
44
|
+
store;
|
|
45
|
+
deliver;
|
|
46
|
+
retry;
|
|
47
|
+
horizonMs;
|
|
48
|
+
eventSink;
|
|
49
|
+
nowFn;
|
|
50
|
+
tickInFlight = false;
|
|
51
|
+
constructor(cfg) {
|
|
52
|
+
if (cfg.store === undefined) {
|
|
53
|
+
throw new Error("delivery: scheduler requires a store");
|
|
54
|
+
}
|
|
55
|
+
if (cfg.deliver === undefined) {
|
|
56
|
+
throw new Error("delivery: scheduler requires a deliver");
|
|
57
|
+
}
|
|
58
|
+
this.store = cfg.store;
|
|
59
|
+
this.deliver = cfg.deliver;
|
|
60
|
+
this.retry = sanitizeRetry(cfg.retry ?? {});
|
|
61
|
+
this.horizonMs = cfg.maxRetryHorizonMs ?? 72 * 3_600_000;
|
|
62
|
+
this.eventSink = cfg.eventSink ?? null;
|
|
63
|
+
this.nowFn = cfg.now ?? (() => new Date());
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Insert a new queue record for `(envelopeId, recipient)`. State
|
|
67
|
+
* starts at `queued`; `next_attempt_at = now` (deliver on next
|
|
68
|
+
* tick); `deadline = effectiveDeadline(postmarkExpires, now,
|
|
69
|
+
* horizon)`.
|
|
70
|
+
*
|
|
71
|
+
* Throws when a record for the same `(envelopeId, recipient)`
|
|
72
|
+
* already exists.
|
|
73
|
+
*/
|
|
74
|
+
async enqueue(envelopeId, recipient, postmarkExpires) {
|
|
75
|
+
if (envelopeId === "") {
|
|
76
|
+
throw new Error("delivery: enqueue empty envelope_id");
|
|
77
|
+
}
|
|
78
|
+
if (recipient === "") {
|
|
79
|
+
throw new Error("delivery: enqueue empty recipient");
|
|
80
|
+
}
|
|
81
|
+
const now = this.nowFn();
|
|
82
|
+
const existing = await this.store.get(envelopeId, recipient);
|
|
83
|
+
if (existing !== null) {
|
|
84
|
+
throw new Error(`delivery: queue record already exists for (${envelopeId}, ${recipient})`);
|
|
85
|
+
}
|
|
86
|
+
const deadline = effectiveDeadline(postmarkExpires, now, this.horizonMs);
|
|
87
|
+
const q = {
|
|
88
|
+
envelope_id: envelopeId,
|
|
89
|
+
recipient,
|
|
90
|
+
state: "queued",
|
|
91
|
+
attempts: 0,
|
|
92
|
+
last_attempt_at: null,
|
|
93
|
+
last_outcome: null,
|
|
94
|
+
last_reason_code: null,
|
|
95
|
+
next_attempt_at: isoSecond(now),
|
|
96
|
+
deadline: isoSecond(deadline),
|
|
97
|
+
};
|
|
98
|
+
await this.store.put(q);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Pull every record whose `next_attempt_at` has passed and
|
|
102
|
+
* process it. Returns the number of records advanced (terminal
|
|
103
|
+
* or otherwise) and, on partial failure, the first error
|
|
104
|
+
* encountered (per-record errors do not abort the tick).
|
|
105
|
+
*
|
|
106
|
+
* Throws {@link TickInProgressError} if a concurrent tick is
|
|
107
|
+
* already running.
|
|
108
|
+
*/
|
|
109
|
+
async tick() {
|
|
110
|
+
if (this.tickInFlight) {
|
|
111
|
+
throw new TickInProgressError();
|
|
112
|
+
}
|
|
113
|
+
this.tickInFlight = true;
|
|
114
|
+
try {
|
|
115
|
+
const now = this.nowFn();
|
|
116
|
+
const due = await this.store.dueRecords(now);
|
|
117
|
+
let advanced = 0;
|
|
118
|
+
let firstError;
|
|
119
|
+
for (const q of due) {
|
|
120
|
+
try {
|
|
121
|
+
if (isTerminalState(q.state)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (now.getTime() >= Date.parse(q.deadline)) {
|
|
125
|
+
this.transitionExpired(q, now);
|
|
126
|
+
await this.store.put(q);
|
|
127
|
+
advanced += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
await this.runAttempt(q, now);
|
|
131
|
+
await this.store.put(q);
|
|
132
|
+
advanced += 1;
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (firstError === undefined) {
|
|
136
|
+
firstError =
|
|
137
|
+
err instanceof Error
|
|
138
|
+
? err
|
|
139
|
+
: new Error(`tick error: ${String(err)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return firstError === undefined
|
|
144
|
+
? { advanced }
|
|
145
|
+
: { advanced, firstError };
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
this.tickInFlight = false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Transition `(envelopeId, recipient)` to the `canceled` terminal
|
|
153
|
+
* state per §2.7. Returns the resulting {@link CancelResult}.
|
|
154
|
+
* Idempotent: cancellation of a record already in a terminal
|
|
155
|
+
* state is a no-op that returns the prior state.
|
|
156
|
+
*/
|
|
157
|
+
async cancel(envelopeId, recipient) {
|
|
158
|
+
const now = this.nowFn();
|
|
159
|
+
const q = await this.store.get(envelopeId, recipient);
|
|
160
|
+
if (q === null) {
|
|
161
|
+
throw new UnknownRecordError(envelopeId, recipient);
|
|
162
|
+
}
|
|
163
|
+
if (isTerminalState(q.state)) {
|
|
164
|
+
return {
|
|
165
|
+
recipient,
|
|
166
|
+
state: q.state,
|
|
167
|
+
reason: `already ${q.state}; cancellation is a no-op per §2.7.4`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
setTerminal(q, "canceled", now);
|
|
171
|
+
await this.store.put(q);
|
|
172
|
+
this.emit(q, "client-initiated cancellation");
|
|
173
|
+
return { recipient, state: "canceled" };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Cancel every still-non-terminal record for `envelopeId` across
|
|
177
|
+
* all recipients. Returns one {@link CancelResult} per record
|
|
178
|
+
* observed.
|
|
179
|
+
*/
|
|
180
|
+
async cancelEnvelope(envelopeId) {
|
|
181
|
+
if (envelopeId === "") {
|
|
182
|
+
throw new Error("delivery: cancelEnvelope empty envelope_id");
|
|
183
|
+
}
|
|
184
|
+
const now = this.nowFn();
|
|
185
|
+
// dueRecords returns non-terminal records ordered by NextAttempt;
|
|
186
|
+
// pulling with a far-future cap is the simplest way to enumerate.
|
|
187
|
+
const all = await this.store.dueRecords(new Date(now.getTime() + this.horizonMs * 2));
|
|
188
|
+
const matches = all.filter((q) => q.envelope_id === envelopeId);
|
|
189
|
+
const out = [];
|
|
190
|
+
for (const q of matches) {
|
|
191
|
+
if (isTerminalState(q.state)) {
|
|
192
|
+
out.push({
|
|
193
|
+
recipient: q.recipient,
|
|
194
|
+
state: q.state,
|
|
195
|
+
reason: `already ${q.state}; cancellation is a no-op per §2.7.4`,
|
|
196
|
+
});
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
setTerminal(q, "canceled", now);
|
|
200
|
+
await this.store.put(q);
|
|
201
|
+
this.emit(q, "client-initiated whole-envelope cancellation");
|
|
202
|
+
out.push({ recipient: q.recipient, state: "canceled" });
|
|
203
|
+
}
|
|
204
|
+
return out;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Evict terminal records whose `terminal_at` is at or before
|
|
208
|
+
* `now - retentionMs` per §2.5 retention. Returns the count
|
|
209
|
+
* pruned.
|
|
210
|
+
*/
|
|
211
|
+
async pruneTerminal(retentionMs) {
|
|
212
|
+
const cutoff = new Date(this.nowFn().getTime() - retentionMs);
|
|
213
|
+
const stale = await this.store.listTerminalOlderThan(cutoff);
|
|
214
|
+
let n = 0;
|
|
215
|
+
for (const q of stale) {
|
|
216
|
+
await this.store.delete(q.envelope_id, q.recipient);
|
|
217
|
+
n += 1;
|
|
218
|
+
}
|
|
219
|
+
return n;
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
async runAttempt(q, now) {
|
|
223
|
+
const res = await this.deliver(q.envelope_id, q.recipient);
|
|
224
|
+
q.attempts += 1;
|
|
225
|
+
q.last_attempt_at = isoSecond(now);
|
|
226
|
+
q.last_outcome = res.status;
|
|
227
|
+
q.last_reason_code =
|
|
228
|
+
res.reasonCode !== undefined && res.reasonCode !== ""
|
|
229
|
+
? res.reasonCode
|
|
230
|
+
: null;
|
|
231
|
+
if (res.status === "delivered") {
|
|
232
|
+
this.transitionTerminal(q, "delivered", now, res.reason);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (res.status === "rejected" &&
|
|
236
|
+
!isRecoverableReason(res.reasonCode ?? "")) {
|
|
237
|
+
this.transitionTerminal(q, "rejected", now, res.reason);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
// Recoverable rejection or silent → schedule next attempt.
|
|
241
|
+
let next;
|
|
242
|
+
try {
|
|
243
|
+
next = nextAttemptAt(this.retry, now, q.attempts - 1);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Pathological: schedule a conservative fallback.
|
|
247
|
+
next = new Date(now.getTime() + 1_000);
|
|
248
|
+
}
|
|
249
|
+
if (next.getTime() > Date.parse(q.deadline)) {
|
|
250
|
+
// Next attempt would land past deadline → expire instead.
|
|
251
|
+
this.transitionExpired(q, now);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
q.next_attempt_at = isoSecond(next);
|
|
255
|
+
}
|
|
256
|
+
transitionTerminal(q, state, now, reason) {
|
|
257
|
+
if (isTerminalState(q.state)) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
setTerminal(q, state, now);
|
|
261
|
+
this.emit(q, reason);
|
|
262
|
+
}
|
|
263
|
+
transitionExpired(q, now) {
|
|
264
|
+
if (isTerminalState(q.state)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
setTerminal(q, "expired", now);
|
|
268
|
+
this.emit(q, undefined);
|
|
269
|
+
}
|
|
270
|
+
emit(q, reason) {
|
|
271
|
+
if (this.eventSink === null) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const status = q.state === "delivered" ? "delivered" : "rejected";
|
|
275
|
+
const opts = {};
|
|
276
|
+
if (q.last_reason_code !== null) {
|
|
277
|
+
opts.reasonCode = q.last_reason_code;
|
|
278
|
+
}
|
|
279
|
+
if (reason !== undefined && reason !== "") {
|
|
280
|
+
opts.reason = reason;
|
|
281
|
+
}
|
|
282
|
+
if (q.terminal_at !== undefined && q.terminal_at !== "") {
|
|
283
|
+
opts.nowFn = () => new Date(q.terminal_at);
|
|
284
|
+
}
|
|
285
|
+
const ev = newSubmissionEvent(q.envelope_id, q.recipient, status, opts);
|
|
286
|
+
this.eventSink(ev);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Reference in-memory {@link SchedulerStore}. Tests / single-process
|
|
291
|
+
* demos only — production deployments back the queue with durable
|
|
292
|
+
* storage per DELIVERY.md §2.1.
|
|
293
|
+
*/
|
|
294
|
+
export class InMemorySchedulerStore {
|
|
295
|
+
records = new Map();
|
|
296
|
+
static keyOf(envelopeId, recipient) {
|
|
297
|
+
return `${envelopeId}\x00${recipient}`;
|
|
298
|
+
}
|
|
299
|
+
async put(q) {
|
|
300
|
+
this.records.set(InMemorySchedulerStore.keyOf(q.envelope_id, q.recipient), {
|
|
301
|
+
...q,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
async get(envelopeId, recipient) {
|
|
305
|
+
const r = this.records.get(InMemorySchedulerStore.keyOf(envelopeId, recipient));
|
|
306
|
+
return r === undefined ? null : { ...r };
|
|
307
|
+
}
|
|
308
|
+
async dueRecords(now) {
|
|
309
|
+
const out = [];
|
|
310
|
+
for (const q of this.records.values()) {
|
|
311
|
+
if (isTerminalState(q.state)) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (q.next_attempt_at === null) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (Date.parse(q.next_attempt_at) <= now.getTime()) {
|
|
318
|
+
out.push({ ...q });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
out.sort((a, b) => {
|
|
322
|
+
const at = a.next_attempt_at !== null ? Date.parse(a.next_attempt_at) : 0;
|
|
323
|
+
const bt = b.next_attempt_at !== null ? Date.parse(b.next_attempt_at) : 0;
|
|
324
|
+
if (at !== bt) {
|
|
325
|
+
return at - bt;
|
|
326
|
+
}
|
|
327
|
+
return a.envelope_id < b.envelope_id ? -1 : 1;
|
|
328
|
+
});
|
|
329
|
+
return out;
|
|
330
|
+
}
|
|
331
|
+
async listTerminalOlderThan(cutoff) {
|
|
332
|
+
const out = [];
|
|
333
|
+
for (const q of this.records.values()) {
|
|
334
|
+
if (isTerminalState(q.state) &&
|
|
335
|
+
q.terminal_at !== undefined &&
|
|
336
|
+
Date.parse(q.terminal_at) <= cutoff.getTime()) {
|
|
337
|
+
out.push({ ...q });
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return out;
|
|
341
|
+
}
|
|
342
|
+
async delete(envelopeId, recipient) {
|
|
343
|
+
this.records.delete(InMemorySchedulerStore.keyOf(envelopeId, recipient));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
function isoSecond(d) {
|
|
347
|
+
return d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/delivery/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Staged-delivery partition computation per DELIVERY.md §3.2.1.
|
|
3
|
+
*
|
|
4
|
+
* Given a user's device directory, the per-device scoped
|
|
5
|
+
* certificates, the set of device public keys for which an inbound
|
|
6
|
+
* envelope's seal carries an enclosure-recipient wrap, and the
|
|
7
|
+
* sender address, returns the slice of {@link StagedHeldStage}
|
|
8
|
+
* values the staging runner feeds into the held-envelope queue.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { AddressIdentity } from "../keys/device_certificate.js";
|
|
13
|
+
import type { DeviceCertificate } from "../keys/device_certificate.js";
|
|
14
|
+
import type { DeviceDirectory } from "../keys/device_records.js";
|
|
15
|
+
import type { StagedHeldStage } from "./disposition.js";
|
|
16
|
+
/**
|
|
17
|
+
* Lookup hook the partition routine calls for each delegated
|
|
18
|
+
* device's scoped certificate. Returning `null` is treated as "no
|
|
19
|
+
* current cert"; the device is excluded from the partition (the
|
|
20
|
+
* spec's effect of certificate revocation per §10.3.7.3 step 3:
|
|
21
|
+
* "stop delivering inbound envelopes to device_id").
|
|
22
|
+
*/
|
|
23
|
+
export type CertificateProvider = (deviceId: string) => DeviceCertificate | null;
|
|
24
|
+
/** Inputs to {@link partitionStages}. */
|
|
25
|
+
export interface PartitionInput {
|
|
26
|
+
/**
|
|
27
|
+
* The user's current device directory. {@link partitionStages}
|
|
28
|
+
* iterates `directory.devices` to enumerate the account's
|
|
29
|
+
* devices.
|
|
30
|
+
*/
|
|
31
|
+
directory: DeviceDirectory;
|
|
32
|
+
/**
|
|
33
|
+
* Supplies the scoped certificate for each delegated device.
|
|
34
|
+
* Called for every device whose role is `delegated`; full-access
|
|
35
|
+
* devices have no certificate.
|
|
36
|
+
*/
|
|
37
|
+
certificateProvider: CertificateProvider;
|
|
38
|
+
/**
|
|
39
|
+
* Set of device public keys for which the envelope's seal carries
|
|
40
|
+
* an enclosure-recipient wrap. Only devices whose `device_public_key`
|
|
41
|
+
* is in this set are eligible for delivery. Pubkeys are compared
|
|
42
|
+
* verbatim against `DeviceDirectoryEntry.device_public_key` (the
|
|
43
|
+
* same base64 form the directory uses).
|
|
44
|
+
*/
|
|
45
|
+
enclosureRecipients: Set<string>;
|
|
46
|
+
/**
|
|
47
|
+
* The `brief.from` address the receive matcher evaluates against
|
|
48
|
+
* per §10.3.4 "for receive, a peer is the sender address of an
|
|
49
|
+
* inbound envelope after the home server has decrypted the brief".
|
|
50
|
+
*/
|
|
51
|
+
senderAddress: AddressIdentity;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Compute the §3.2.1 stage partition for an inbound envelope.
|
|
55
|
+
*
|
|
56
|
+
* Algorithm:
|
|
57
|
+
*
|
|
58
|
+
* 1. Walk the directory; for each device whose pubkey is in
|
|
59
|
+
* `enclosureRecipients`:
|
|
60
|
+
* - Full-access devices are deferred (their stage is computed
|
|
61
|
+
* implicitly per §10.3.3.1: `max(delegated_stages) + 1`).
|
|
62
|
+
* - Delegated devices are evaluated against their scoped cert:
|
|
63
|
+
* fetch the cert, run `scope.receive` against `senderAddress`.
|
|
64
|
+
* Devices whose receive matcher rejects the envelope (mode,
|
|
65
|
+
* allow/deny, or rate limit at the matcher level) are
|
|
66
|
+
* excluded from the partition entirely.
|
|
67
|
+
* 2. Compute the implicit full-access stage as
|
|
68
|
+
* `max(delegated_stages_with_mode_not_none) + 1`, taken across
|
|
69
|
+
* ALL delegates with `receive.mode !== "none"` — not just those
|
|
70
|
+
* that allowed THIS envelope. Matches §10.3.3.1's "the maximum
|
|
71
|
+
* is taken over all delegated devices of the account that have
|
|
72
|
+
* a receive matcher whose mode is not none". When no such
|
|
73
|
+
* delegate exists, full-access devices are at stage 1 and
|
|
74
|
+
* staging is a no-op.
|
|
75
|
+
* 3. Group eligible devices by stage and emit a sorted, monotonic
|
|
76
|
+
* `StagedHeldStage[]`. Stages with no devices are pruned.
|
|
77
|
+
*
|
|
78
|
+
* Does NOT consult §10.3.3.3 rate-limit counters; rate-limit gating
|
|
79
|
+
* is the caller's concern. The matcher mode and allow/deny ARE
|
|
80
|
+
* checked.
|
|
81
|
+
*
|
|
82
|
+
* Returns an empty array when no eligible devices remain (the
|
|
83
|
+
* envelope is undeliverable to any device of the account; the
|
|
84
|
+
* caller surfaces this as silent or rejected per its own policy).
|
|
85
|
+
*/
|
|
86
|
+
export declare function partitionStages(input: PartitionInput): StagedHeldStage[];
|
|
87
|
+
//# sourceMappingURL=stage_partition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage_partition.d.ts","sourceRoot":"","sources":["../../src/delivery/stage_partition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;AAEjF,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,SAAS,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,mBAAmB,EAAE,mBAAmB,CAAC;IACzC;;;;;;OAMG;IACH,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,aAAa,EAAE,eAAe,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,EAAE,CAiFxE"}
|