@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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator-side store interface for large-attachment ciphertext
|
|
3
|
+
* blobs per ATTACHMENTS.md §4.2 + §4.3.
|
|
4
|
+
*
|
|
5
|
+
* The store holds the encrypted blobs that envelopes reference by
|
|
6
|
+
* URL. Production deployments wrap S3, GCS, a CDN, etc.; this
|
|
7
|
+
* module ships an in-memory reference for tests + demos.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/** Reference in-memory store. Single-process only. */
|
|
12
|
+
export class InMemoryAttachmentStore {
|
|
13
|
+
blobs = new Map();
|
|
14
|
+
async put(id, ciphertext) {
|
|
15
|
+
if (id === "") {
|
|
16
|
+
throw new Error("largeattachment: empty id");
|
|
17
|
+
}
|
|
18
|
+
if (this.blobs.has(id)) {
|
|
19
|
+
throw new Error(`largeattachment: blob already stored for ${id}`);
|
|
20
|
+
}
|
|
21
|
+
this.blobs.set(id, ciphertext);
|
|
22
|
+
}
|
|
23
|
+
async get(id) {
|
|
24
|
+
return this.blobs.get(id) ?? null;
|
|
25
|
+
}
|
|
26
|
+
async stat(id) {
|
|
27
|
+
const blob = this.blobs.get(id);
|
|
28
|
+
if (blob === undefined) {
|
|
29
|
+
return { size: 0, present: false };
|
|
30
|
+
}
|
|
31
|
+
return { size: blob.length, present: true };
|
|
32
|
+
}
|
|
33
|
+
async del(id) {
|
|
34
|
+
this.blobs.delete(id);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/largeattachment/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,sDAAsD;AACtD,MAAM,OAAO,uBAAuB;IACjB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEvD,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,UAAsB;QAC1C,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAU;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the `semp.dev/large-attachment` extension
|
|
3
|
+
* per ATTACHMENTS.md.
|
|
4
|
+
*
|
|
5
|
+
* Large attachments live as encrypted blobs at HTTPS URLs outside
|
|
6
|
+
* the envelope; the envelope's enclosure carries metadata under
|
|
7
|
+
* the `semp.dev/large-attachment` extension key. Each attachment is
|
|
8
|
+
* encrypted under a key derived from K_enclosure via HKDF-Expand
|
|
9
|
+
* with info `"semp-attachment:" || attachment_id` so any recipient
|
|
10
|
+
* that can decrypt the enclosure can also decrypt every external
|
|
11
|
+
* attachment without additional key wrapping.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
/** Extension identifier per ATTACHMENTS.md §1.2. */
|
|
16
|
+
export declare const ExtensionKey = "semp.dev/large-attachment";
|
|
17
|
+
/**
|
|
18
|
+
* Byte-prefix mixed into HKDF-Expand to derive per-attachment keys
|
|
19
|
+
* per §3.1. The full info input is `HKDFInfoPrefix || attachment_id`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const HKDFInfoPrefix = "semp-attachment:";
|
|
22
|
+
/** AEAD algorithm identifier for the baseline suite per §3.2. */
|
|
23
|
+
export declare const AEADChaCha20Poly1305 = "chacha20-poly1305";
|
|
24
|
+
/** AEAD algorithm identifier for the PQ suite per §3.2. */
|
|
25
|
+
export declare const AEADXChaCha20Poly1305 = "xchacha20-poly1305";
|
|
26
|
+
/**
|
|
27
|
+
* Hash algorithm identifier for `ciphertext_hash`. The wire form is
|
|
28
|
+
* `algorithm:hex` per §2.3.
|
|
29
|
+
*/
|
|
30
|
+
export declare const HashAlgorithmSHA256 = "sha256";
|
|
31
|
+
/** One entry in the large-attachment extension's items array per §2.2. */
|
|
32
|
+
export interface Item {
|
|
33
|
+
/** Unique attachment id within the envelope. ULID RECOMMENDED. */
|
|
34
|
+
id: string;
|
|
35
|
+
/** Original filename. MUST NOT contain path separators per §2.3. */
|
|
36
|
+
filename: string;
|
|
37
|
+
/** Plaintext MIME type. */
|
|
38
|
+
mime_type: string;
|
|
39
|
+
/** Plaintext size in bytes. */
|
|
40
|
+
plaintext_size: number;
|
|
41
|
+
/** HTTPS URL the ciphertext is fetched from. */
|
|
42
|
+
url: string;
|
|
43
|
+
/** Digest of the ciphertext bytes, encoded `algorithm:hex`. */
|
|
44
|
+
ciphertext_hash: string;
|
|
45
|
+
/** AEAD algorithm identifier; consistent with the negotiated suite. */
|
|
46
|
+
aead_algorithm: string;
|
|
47
|
+
/** Base64-encoded AEAD nonce. */
|
|
48
|
+
aead_nonce: string;
|
|
49
|
+
/** Non-normative retrieval hints (bearer tokens, range support, …). */
|
|
50
|
+
extensions?: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
/** Inner `data` shape of the extension entry per §2.1. */
|
|
53
|
+
export interface ExtensionData {
|
|
54
|
+
items: Item[];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/largeattachment/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oDAAoD;AACpD,eAAO,MAAM,YAAY,8BAA8B,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,cAAc,qBAAqB,CAAC;AAEjD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,WAAW,IAAI;IACnB,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;CACf"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the `semp.dev/large-attachment` extension
|
|
3
|
+
* per ATTACHMENTS.md.
|
|
4
|
+
*
|
|
5
|
+
* Large attachments live as encrypted blobs at HTTPS URLs outside
|
|
6
|
+
* the envelope; the envelope's enclosure carries metadata under
|
|
7
|
+
* the `semp.dev/large-attachment` extension key. Each attachment is
|
|
8
|
+
* encrypted under a key derived from K_enclosure via HKDF-Expand
|
|
9
|
+
* with info `"semp-attachment:" || attachment_id` so any recipient
|
|
10
|
+
* that can decrypt the enclosure can also decrypt every external
|
|
11
|
+
* attachment without additional key wrapping.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
/** Extension identifier per ATTACHMENTS.md §1.2. */
|
|
16
|
+
export const ExtensionKey = "semp.dev/large-attachment";
|
|
17
|
+
/**
|
|
18
|
+
* Byte-prefix mixed into HKDF-Expand to derive per-attachment keys
|
|
19
|
+
* per §3.1. The full info input is `HKDFInfoPrefix || attachment_id`.
|
|
20
|
+
*/
|
|
21
|
+
export const HKDFInfoPrefix = "semp-attachment:";
|
|
22
|
+
/** AEAD algorithm identifier for the baseline suite per §3.2. */
|
|
23
|
+
export const AEADChaCha20Poly1305 = "chacha20-poly1305";
|
|
24
|
+
/** AEAD algorithm identifier for the PQ suite per §3.2. */
|
|
25
|
+
export const AEADXChaCha20Poly1305 = "xchacha20-poly1305";
|
|
26
|
+
/**
|
|
27
|
+
* Hash algorithm identifier for `ciphertext_hash`. The wire form is
|
|
28
|
+
* `algorithm:hex` per §2.3.
|
|
29
|
+
*/
|
|
30
|
+
export const HashAlgorithmSHA256 = "sha256";
|
|
31
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/largeattachment/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,oDAAoD;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEjD,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAExD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AAE1D;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sender-side encrypt + recipient-side decrypt per ATTACHMENTS.md
|
|
3
|
+
* §5 / §6.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { type Item } from "./types.js";
|
|
8
|
+
/** Suite identifier for which AEAD an item uses per §3.2. */
|
|
9
|
+
export type AttachmentSuite = "x25519-chacha20-poly1305" | "pq-kyber768-x25519";
|
|
10
|
+
/** Inputs to {@link encryptAttachment}. */
|
|
11
|
+
export interface EncryptAttachmentInput {
|
|
12
|
+
/** Negotiated session suite — selects the AEAD per §3.2. */
|
|
13
|
+
suite: AttachmentSuite;
|
|
14
|
+
/** 32-byte K_enclosure from the envelope this item belongs to. */
|
|
15
|
+
kEnclosure: Uint8Array;
|
|
16
|
+
/** Plaintext bytes to encrypt. */
|
|
17
|
+
plaintext: Uint8Array;
|
|
18
|
+
/** Original filename. MUST NOT contain path separators. */
|
|
19
|
+
filename: string;
|
|
20
|
+
/** Plaintext MIME type. */
|
|
21
|
+
mimeType: string;
|
|
22
|
+
/** HTTPS URL the ciphertext will be retrievable at. */
|
|
23
|
+
url: string;
|
|
24
|
+
/** Optional pre-assigned attachment id; when omitted, a fresh ULID is minted. */
|
|
25
|
+
id?: string;
|
|
26
|
+
/** Optional pre-assigned AEAD nonce; when omitted, fresh entropy is sourced. */
|
|
27
|
+
aeadNonce?: Uint8Array;
|
|
28
|
+
/** Optional non-normative retrieval hints. */
|
|
29
|
+
extensions?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
/** Result of a successful {@link encryptAttachment} call. */
|
|
32
|
+
export interface EncryptAttachmentResult {
|
|
33
|
+
/** Fully populated item ready to drop into the enclosure. */
|
|
34
|
+
item: Item;
|
|
35
|
+
/** AEAD ciphertext bytes — uploaded by the caller to `item.url`. */
|
|
36
|
+
ciphertext: Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* §5 sender-side flow: derive K_attachment, AEAD-seal the
|
|
40
|
+
* plaintext, populate the item with `ciphertext_hash` and return
|
|
41
|
+
* the bytes the caller uploads to `item.url`.
|
|
42
|
+
*
|
|
43
|
+
* Does NOT upload anything — the caller PUTs `ciphertext` to `url`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function encryptAttachment(input: EncryptAttachmentInput): EncryptAttachmentResult;
|
|
46
|
+
/**
|
|
47
|
+
* §6 recipient-side flow: verify ciphertext_hash, derive
|
|
48
|
+
* K_attachment, AEAD-open the ciphertext, return plaintext.
|
|
49
|
+
*
|
|
50
|
+
* Throws {@link CiphertextHashMismatchError} on §7.2 ciphertext-
|
|
51
|
+
* integrity failure (BEFORE attempting AEAD open). Throws on
|
|
52
|
+
* §7.3 decryption-integrity failure when AEAD open fails.
|
|
53
|
+
*/
|
|
54
|
+
export declare function decryptAttachment(suite: AttachmentSuite, kEnclosure: Uint8Array, item: Item, ciphertext: Uint8Array): Uint8Array;
|
|
55
|
+
/**
|
|
56
|
+
* Thrown by {@link decryptAttachment} when `item.ciphertext_hash`
|
|
57
|
+
* does not match the SHA-256 of the supplied ciphertext per §7.2.
|
|
58
|
+
*/
|
|
59
|
+
export declare class CiphertextHashMismatchError extends Error {
|
|
60
|
+
readonly name = "CiphertextHashMismatchError";
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/largeattachment/upload.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EACL,KAAK,IAAI,EAGV,MAAM,YAAY,CAAC;AAEpB,6DAA6D;AAC7D,MAAM,MAAM,eAAe,GACvB,0BAA0B,GAC1B,oBAAoB,CAAC;AAEzB,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,KAAK,EAAE,eAAe,CAAC;IACvB,kEAAkE;IAClE,UAAU,EAAE,UAAU,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,IAAI,EAAE,IAAI,CAAC;IACX,oEAAoE;IACpE,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,CA+CzB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,GACrB,UAAU,CA4BZ;AAED;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,SAAkB,IAAI,iCAAiC;CACxD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sender-side encrypt + recipient-side decrypt per ATTACHMENTS.md
|
|
3
|
+
* §5 / §6.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { aeadOpen, aeadSeal } from "../crypto/index.js";
|
|
8
|
+
import { additionalData, ciphertextHash, deriveAttachmentKey, validateItem, validateUrl, verifyCiphertextHash, } from "./crypto.js";
|
|
9
|
+
import { AEADChaCha20Poly1305, AEADXChaCha20Poly1305, } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* §5 sender-side flow: derive K_attachment, AEAD-seal the
|
|
12
|
+
* plaintext, populate the item with `ciphertext_hash` and return
|
|
13
|
+
* the bytes the caller uploads to `item.url`.
|
|
14
|
+
*
|
|
15
|
+
* Does NOT upload anything — the caller PUTs `ciphertext` to `url`.
|
|
16
|
+
*/
|
|
17
|
+
export function encryptAttachment(input) {
|
|
18
|
+
if (input.kEnclosure.length === 0) {
|
|
19
|
+
throw new Error("largeattachment: empty K_enclosure");
|
|
20
|
+
}
|
|
21
|
+
if (input.filename === "" || input.mimeType === "" || input.url === "") {
|
|
22
|
+
throw new Error("largeattachment: filename, mimeType, and url are required");
|
|
23
|
+
}
|
|
24
|
+
validateUrl(input.url);
|
|
25
|
+
const algo = aeadAlgorithmFor(input.suite);
|
|
26
|
+
const nonceLen = nonceLengthFor(algo);
|
|
27
|
+
const keyLen = 32; // Both AEAD algorithms use a 32-byte key.
|
|
28
|
+
const id = input.id ?? newULID();
|
|
29
|
+
let nonce = input.aeadNonce;
|
|
30
|
+
if (nonce === undefined) {
|
|
31
|
+
nonce = new Uint8Array(nonceLen);
|
|
32
|
+
globalThis.crypto.getRandomValues(nonce);
|
|
33
|
+
}
|
|
34
|
+
else if (nonce.length !== nonceLen) {
|
|
35
|
+
throw new Error(`largeattachment: nonce length ${nonce.length}, want ${nonceLen} for ${algo}`);
|
|
36
|
+
}
|
|
37
|
+
const kAttachment = deriveAttachmentKey(input.kEnclosure, id, keyLen);
|
|
38
|
+
// Build the partly-populated item for AAD. The AAD function
|
|
39
|
+
// strips ciphertext_hash + extensions internally so we leave them
|
|
40
|
+
// out of the input; aead_nonce is also stripped but we still set
|
|
41
|
+
// it on the item so the final result is complete.
|
|
42
|
+
const item = {
|
|
43
|
+
id,
|
|
44
|
+
filename: input.filename,
|
|
45
|
+
mime_type: input.mimeType,
|
|
46
|
+
plaintext_size: input.plaintext.length,
|
|
47
|
+
url: input.url,
|
|
48
|
+
aead_algorithm: algo,
|
|
49
|
+
aead_nonce: base64Encode(nonce),
|
|
50
|
+
ciphertext_hash: "",
|
|
51
|
+
};
|
|
52
|
+
const aad = additionalData(item);
|
|
53
|
+
const ciphertext = aeadSeal(algo, kAttachment, nonce, input.plaintext, aad);
|
|
54
|
+
item.ciphertext_hash = ciphertextHash(ciphertext);
|
|
55
|
+
if (input.extensions !== undefined) {
|
|
56
|
+
item.extensions = input.extensions;
|
|
57
|
+
}
|
|
58
|
+
return { item, ciphertext };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* §6 recipient-side flow: verify ciphertext_hash, derive
|
|
62
|
+
* K_attachment, AEAD-open the ciphertext, return plaintext.
|
|
63
|
+
*
|
|
64
|
+
* Throws {@link CiphertextHashMismatchError} on §7.2 ciphertext-
|
|
65
|
+
* integrity failure (BEFORE attempting AEAD open). Throws on
|
|
66
|
+
* §7.3 decryption-integrity failure when AEAD open fails.
|
|
67
|
+
*/
|
|
68
|
+
export function decryptAttachment(suite, kEnclosure, item, ciphertext) {
|
|
69
|
+
if (kEnclosure.length === 0) {
|
|
70
|
+
throw new Error("largeattachment: empty K_enclosure");
|
|
71
|
+
}
|
|
72
|
+
validateItem(item);
|
|
73
|
+
const expectedAlgo = aeadAlgorithmFor(suite);
|
|
74
|
+
if (item.aead_algorithm !== expectedAlgo) {
|
|
75
|
+
throw new Error(`largeattachment: item aead_algorithm ${JSON.stringify(item.aead_algorithm)} does not match suite ${JSON.stringify(suite)} (expected ${expectedAlgo})`);
|
|
76
|
+
}
|
|
77
|
+
if (!verifyCiphertextHash(item, ciphertext)) {
|
|
78
|
+
throw new CiphertextHashMismatchError("largeattachment: ciphertext hash mismatch");
|
|
79
|
+
}
|
|
80
|
+
const nonce = base64Decode(item.aead_nonce);
|
|
81
|
+
const nonceLen = nonceLengthFor(expectedAlgo);
|
|
82
|
+
if (nonce.length !== nonceLen) {
|
|
83
|
+
throw new Error(`largeattachment: aead_nonce length ${nonce.length}, want ${nonceLen} for ${expectedAlgo}`);
|
|
84
|
+
}
|
|
85
|
+
const kAttachment = deriveAttachmentKey(kEnclosure, item.id, 32);
|
|
86
|
+
const aad = additionalData(item);
|
|
87
|
+
return aeadOpen(expectedAlgo, kAttachment, nonce, ciphertext, aad);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Thrown by {@link decryptAttachment} when `item.ciphertext_hash`
|
|
91
|
+
* does not match the SHA-256 of the supplied ciphertext per §7.2.
|
|
92
|
+
*/
|
|
93
|
+
export class CiphertextHashMismatchError extends Error {
|
|
94
|
+
name = "CiphertextHashMismatchError";
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Suite → AEAD mapping per §3.2
|
|
98
|
+
function aeadAlgorithmFor(suite) {
|
|
99
|
+
switch (suite) {
|
|
100
|
+
case "x25519-chacha20-poly1305":
|
|
101
|
+
return AEADChaCha20Poly1305;
|
|
102
|
+
case "pq-kyber768-x25519":
|
|
103
|
+
return AEADXChaCha20Poly1305;
|
|
104
|
+
default:
|
|
105
|
+
throw new Error(`largeattachment: no attachment AEAD wired for suite ${JSON.stringify(suite)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function nonceLengthFor(algo) {
|
|
109
|
+
return algo === "chacha20-poly1305" ? 12 : 24;
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// ULID minting (inlined; matches semp-go's local helper)
|
|
113
|
+
const ULID_ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
|
114
|
+
function newULID() {
|
|
115
|
+
const bits = new Uint8Array(16);
|
|
116
|
+
const ms = BigInt(Date.now());
|
|
117
|
+
bits[0] = Number((ms >> 40n) & 0xffn);
|
|
118
|
+
bits[1] = Number((ms >> 32n) & 0xffn);
|
|
119
|
+
bits[2] = Number((ms >> 24n) & 0xffn);
|
|
120
|
+
bits[3] = Number((ms >> 16n) & 0xffn);
|
|
121
|
+
bits[4] = Number((ms >> 8n) & 0xffn);
|
|
122
|
+
bits[5] = Number(ms & 0xffn);
|
|
123
|
+
globalThis.crypto.getRandomValues(bits.subarray(6));
|
|
124
|
+
// Crockford base32 encoding of 16 bytes → 26 chars.
|
|
125
|
+
// Treat bits as two big-endian 64-bit words.
|
|
126
|
+
let u = 0n;
|
|
127
|
+
for (let i = 0; i < 8; i++) {
|
|
128
|
+
u = (u << 8n) | BigInt(bits[i] ?? 0);
|
|
129
|
+
}
|
|
130
|
+
let u2 = 0n;
|
|
131
|
+
for (let i = 8; i < 16; i++) {
|
|
132
|
+
u2 = (u2 << 8n) | BigInt(bits[i] ?? 0);
|
|
133
|
+
}
|
|
134
|
+
const out = new Array(26);
|
|
135
|
+
for (let i = 25; i >= 13; i--) {
|
|
136
|
+
out[i] = ULID_ALPHABET[Number(u2 & 31n)] ?? "0";
|
|
137
|
+
u2 >>= 5n;
|
|
138
|
+
}
|
|
139
|
+
for (let i = 12; i >= 0; i--) {
|
|
140
|
+
out[i] = ULID_ALPHABET[Number(u & 31n)] ?? "0";
|
|
141
|
+
u >>= 5n;
|
|
142
|
+
}
|
|
143
|
+
return out.join("");
|
|
144
|
+
}
|
|
145
|
+
function base64Encode(b) {
|
|
146
|
+
if (typeof Buffer !== "undefined") {
|
|
147
|
+
return Buffer.from(b).toString("base64");
|
|
148
|
+
}
|
|
149
|
+
let bin = "";
|
|
150
|
+
for (let i = 0; i < b.length; i++) {
|
|
151
|
+
bin += String.fromCharCode(b[i] ?? 0);
|
|
152
|
+
}
|
|
153
|
+
return btoa(bin);
|
|
154
|
+
}
|
|
155
|
+
function base64Decode(s) {
|
|
156
|
+
if (typeof Buffer !== "undefined") {
|
|
157
|
+
return new Uint8Array(Buffer.from(s, "base64"));
|
|
158
|
+
}
|
|
159
|
+
const bin = atob(s);
|
|
160
|
+
const out = new Uint8Array(bin.length);
|
|
161
|
+
for (let i = 0; i < bin.length; i++) {
|
|
162
|
+
out[i] = bin.charCodeAt(i);
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/largeattachment/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration layer per MIGRATION.md.
|
|
3
|
+
*
|
|
4
|
+
* Wire records (4-signature MIGRATION chain), signing primitives,
|
|
5
|
+
* full submission/acceptance flow, lockout registry, notice
|
|
6
|
+
* messages, third-party verification hooks, publication store.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
export { type MigrationMode, type MigrationNotice, type MigrationNoticeRejection, type MigrationRecord, type MigrationSignatureBlock, MaxForwardingWindowMs, MigrationNoticeType, MigrationPrefix, MigrationRecordType, MigrationRecordVersion, MinForwardingWindowMs, RecommendedForwardingWindowMs, SignatureAlgorithmEd25519, } from "./types.js";
|
|
11
|
+
export { checkMigratedAtBound, prepareSignatures, signNewDomain, signNewIdentity, signOldDomain, signOldIdentity, validateMigrationRecord, verifyMigrationPass, verifyMigrationRecord, } from "./sign.js";
|
|
12
|
+
export { type ComposeMigrationInput, composeMigrationRecord, } from "./migration.js";
|
|
13
|
+
export { type AcceptSubmissionInput, type BuildSubmissionInput, type ThirdPartyHook, type ThirdPartyPolicy, acceptSubmission, applyThirdPartyPolicy, buildSubmission, } from "./orchestrate.js";
|
|
14
|
+
export { type LockoutRegistry, type LockoutReservation, InMemoryLockoutRegistry, } from "./lockout.js";
|
|
15
|
+
export { type BuildMigrationNoticeInput, buildMigrationNotice, newMigrationNoticeRejection, } from "./notice.js";
|
|
16
|
+
export { type PublicationStore, InMemoryPublicationStore, } from "./publication_store.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migration/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,qBAAqB,EAC1B,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,KAAK,yBAAyB,EAC9B,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,gBAAgB,EACrB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration layer per MIGRATION.md.
|
|
3
|
+
*
|
|
4
|
+
* Wire records (4-signature MIGRATION chain), signing primitives,
|
|
5
|
+
* full submission/acceptance flow, lockout registry, notice
|
|
6
|
+
* messages, third-party verification hooks, publication store.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
export { MaxForwardingWindowMs, MigrationNoticeType, MigrationPrefix, MigrationRecordType, MigrationRecordVersion, MinForwardingWindowMs, RecommendedForwardingWindowMs, SignatureAlgorithmEd25519, } from "./types.js";
|
|
11
|
+
export { checkMigratedAtBound, prepareSignatures, signNewDomain, signNewIdentity, signOldDomain, signOldIdentity, validateMigrationRecord, verifyMigrationPass, verifyMigrationRecord, } from "./sign.js";
|
|
12
|
+
export { composeMigrationRecord, } from "./migration.js";
|
|
13
|
+
export { acceptSubmission, applyThirdPartyPolicy, buildSubmission, } from "./orchestrate.js";
|
|
14
|
+
export { InMemoryLockoutRegistry, } from "./lockout.js";
|
|
15
|
+
export { buildMigrationNotice, newMigrationNoticeRejection, } from "./notice.js";
|
|
16
|
+
export { InMemoryPublicationStore, } from "./publication_store.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migration/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAML,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAEL,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAKL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAEL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,wBAAwB,GACzB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-part lockout registry per MIGRATION.md §6.
|
|
3
|
+
*
|
|
4
|
+
* After a cooperative migration finalizes, the old provider MUST
|
|
5
|
+
* lock out the old local-part for the duration of the forwarding
|
|
6
|
+
* window so a different account cannot be reassigned the old
|
|
7
|
+
* address while forwarding is still expected to honor it.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/** Reservation record held by the registry. */
|
|
12
|
+
export interface LockoutReservation {
|
|
13
|
+
localpart: string;
|
|
14
|
+
/** ISO 8601 UTC. */
|
|
15
|
+
until: string;
|
|
16
|
+
/** record_id of the migration record that triggered the lockout. */
|
|
17
|
+
recordId: string;
|
|
18
|
+
}
|
|
19
|
+
/** Persistence interface for lockout state. */
|
|
20
|
+
export interface LockoutRegistry {
|
|
21
|
+
/**
|
|
22
|
+
* Reserve `localpart` until `until`, attributed to `recordId`.
|
|
23
|
+
* Throws when the local-part is already reserved.
|
|
24
|
+
*/
|
|
25
|
+
reserve(localpart: string, until: Date, recordId: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Report whether `localpart` is currently locked out at `now`.
|
|
28
|
+
* Returns the active reservation or null when none exists / has
|
|
29
|
+
* already expired.
|
|
30
|
+
*/
|
|
31
|
+
isLockedOut(localpart: string, now: Date): Promise<LockoutReservation | null>;
|
|
32
|
+
/** Clear the reservation for `localpart`. Idempotent. */
|
|
33
|
+
release(localpart: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Drop reservations whose `until` is at or before `now`.
|
|
36
|
+
* Returns the number pruned.
|
|
37
|
+
*/
|
|
38
|
+
pruneExpired(now: Date): Promise<number>;
|
|
39
|
+
}
|
|
40
|
+
/** Reference {@link LockoutRegistry}. Single-process only. */
|
|
41
|
+
export declare class InMemoryLockoutRegistry implements LockoutRegistry {
|
|
42
|
+
private readonly entries;
|
|
43
|
+
reserve(localpart: string, until: Date, recordId: string): Promise<void>;
|
|
44
|
+
isLockedOut(localpart: string, now: Date): Promise<LockoutReservation | null>;
|
|
45
|
+
release(localpart: string): Promise<void>;
|
|
46
|
+
pruneExpired(now: Date): Promise<number>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=lockout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockout.d.ts","sourceRoot":"","sources":["../../src/migration/lockout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAEtC,yDAAyD;IACzD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,8DAA8D;AAC9D,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IAE3D,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IAkBV,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAc/B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAW/C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-part lockout registry per MIGRATION.md §6.
|
|
3
|
+
*
|
|
4
|
+
* After a cooperative migration finalizes, the old provider MUST
|
|
5
|
+
* lock out the old local-part for the duration of the forwarding
|
|
6
|
+
* window so a different account cannot be reassigned the old
|
|
7
|
+
* address while forwarding is still expected to honor it.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/** Reference {@link LockoutRegistry}. Single-process only. */
|
|
12
|
+
export class InMemoryLockoutRegistry {
|
|
13
|
+
entries = new Map();
|
|
14
|
+
async reserve(localpart, until, recordId) {
|
|
15
|
+
if (localpart === "") {
|
|
16
|
+
throw new Error("migration: empty localpart");
|
|
17
|
+
}
|
|
18
|
+
const key = localpart.toLowerCase();
|
|
19
|
+
if (this.entries.has(key)) {
|
|
20
|
+
const existing = this.entries.get(key);
|
|
21
|
+
throw new Error(`migration: localpart ${JSON.stringify(localpart)} already locked out until ${existing.until} (record ${existing.recordId})`);
|
|
22
|
+
}
|
|
23
|
+
this.entries.set(key, {
|
|
24
|
+
localpart,
|
|
25
|
+
until: until.toISOString(),
|
|
26
|
+
recordId,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async isLockedOut(localpart, now) {
|
|
30
|
+
const key = localpart.toLowerCase();
|
|
31
|
+
const r = this.entries.get(key);
|
|
32
|
+
if (r === undefined) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const untilMs = Date.parse(r.until);
|
|
36
|
+
if (Number.isNaN(untilMs) || untilMs <= now.getTime()) {
|
|
37
|
+
this.entries.delete(key);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return { ...r };
|
|
41
|
+
}
|
|
42
|
+
async release(localpart) {
|
|
43
|
+
this.entries.delete(localpart.toLowerCase());
|
|
44
|
+
}
|
|
45
|
+
async pruneExpired(now) {
|
|
46
|
+
let pruned = 0;
|
|
47
|
+
for (const [key, r] of this.entries) {
|
|
48
|
+
const untilMs = Date.parse(r.until);
|
|
49
|
+
if (Number.isNaN(untilMs) || untilMs <= now.getTime()) {
|
|
50
|
+
this.entries.delete(key);
|
|
51
|
+
pruned++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return pruned;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lockout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockout.js","sourceRoot":"","sources":["../../src/migration/lockout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2CH,8DAA8D;AAC9D,MAAM,OAAO,uBAAuB;IACjB,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEjE,KAAK,CAAC,OAAO,CACX,SAAiB,EACjB,KAAW,EACX,QAAgB;QAEhB,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,6BAA6B,QAAQ,CAAC,KAAK,YAAY,QAAQ,CAAC,QAAQ,GAAG,CAC7H,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACpB,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;YAC1B,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CACf,SAAiB,EACjB,GAAS;QAET,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAS;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBACtD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience compose for the full migration record per MIGRATION.md §3.
|
|
3
|
+
*
|
|
4
|
+
* Wraps {@link prepareSignatures} + the four `sign*` passes into a
|
|
5
|
+
* single deterministic composer. Production callers that need the
|
|
6
|
+
* cooperative submit / accept flow use
|
|
7
|
+
* {@link "./orchestrate".buildSubmission} +
|
|
8
|
+
* {@link "./orchestrate".acceptSubmission} instead.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { type MigrationMode, type MigrationRecord, MigrationPrefix } from "./types.js";
|
|
13
|
+
/** Inputs to {@link composeMigrationRecord}. */
|
|
14
|
+
export interface ComposeMigrationInput {
|
|
15
|
+
mode: MigrationMode;
|
|
16
|
+
/** ULID for the migration record. */
|
|
17
|
+
recordId: string;
|
|
18
|
+
/** ISO 8601 UTC timestamp the migration was effected. */
|
|
19
|
+
migratedAt: string;
|
|
20
|
+
/**
|
|
21
|
+
* ISO 8601 UTC timestamp until which the old domain forwards.
|
|
22
|
+
* REQUIRED when `mode === "cooperative"`. Pass null/undefined in
|
|
23
|
+
* unilateral mode to omit.
|
|
24
|
+
*/
|
|
25
|
+
forwardingWindowUntil?: string | null;
|
|
26
|
+
oldAddress: string;
|
|
27
|
+
newAddress: string;
|
|
28
|
+
oldIdentityKeyId: string;
|
|
29
|
+
oldIdentitySeed: Uint8Array;
|
|
30
|
+
newIdentityKeyId: string;
|
|
31
|
+
/** Base64-encoded new identity public key. */
|
|
32
|
+
newIdentityPublicKey: string;
|
|
33
|
+
newIdentitySeed: Uint8Array;
|
|
34
|
+
newDomainKeyId: string;
|
|
35
|
+
newDomainSeed: Uint8Array;
|
|
36
|
+
/** Cooperative mode only. */
|
|
37
|
+
oldDomainKeyId?: string;
|
|
38
|
+
/** Cooperative mode only. */
|
|
39
|
+
oldDomainSeed?: Uint8Array;
|
|
40
|
+
extensions?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compose a fully-signed migration record. The four (or three, in
|
|
44
|
+
* unilateral mode) signatures are applied in §3.3 chain order.
|
|
45
|
+
*/
|
|
46
|
+
export declare function composeMigrationRecord(input: ComposeMigrationInput): MigrationRecord;
|
|
47
|
+
export { MigrationPrefix };
|
|
48
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/migration/migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,CAAC;IACpB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAEnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,UAAU,CAAC;IAE5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,UAAU,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,UAAU,CAAC;IAE1B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,UAAU,CAAC;IAE3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,eAAe,CAgDjB;AAGD,OAAO,EAAE,eAAe,EAAE,CAAC"}
|