keri-ts 0.11.0 → 2.0.0
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/README.md +32 -2
- package/esm/keri/npm/src/_dnt.polyfills.js +36 -0
- package/esm/keri/npm/src/acdc/chaining.js +213 -0
- package/esm/keri/npm/src/acdc/dhking.js +716 -0
- package/esm/keri/npm/src/acdc/messaging.js +2 -0
- package/esm/keri/npm/src/acdc/observing.js +47 -40
- package/esm/keri/npm/src/acdc/regbasing.js +22 -22
- package/esm/keri/npm/src/acdc/regengine.js +88 -119
- package/esm/keri/npm/src/acdc/regeventing.js +163 -44
- package/esm/keri/npm/src/acdc/registering.js +99 -23
- package/esm/keri/npm/src/acdc/registraring.js +82 -46
- package/esm/keri/npm/src/acdc/relating.js +59 -0
- package/esm/keri/npm/src/acdc/salting.js +720 -0
- package/esm/keri/npm/src/acdc/scheming.js +103 -105
- package/esm/keri/npm/src/acdc/unblinding.js +1042 -0
- package/esm/keri/npm/src/app/{authenticating.js → bootstrap/authenticating.js} +40 -39
- package/esm/keri/npm/src/app/bootstrap/bootstrapping.js +109 -0
- package/esm/keri/npm/src/app/bootstrap/oobi-replies.js +113 -0
- package/esm/keri/npm/src/app/{oobiery.js → bootstrap/oobiery.js} +211 -267
- package/esm/keri/npm/src/app/credentials/credential-importing.js +201 -0
- package/esm/keri/npm/src/app/credentials/credential-proposals.js +120 -0
- package/esm/keri/npm/src/app/credentials/credential-revoking.js +165 -0
- package/esm/keri/npm/src/app/credentials/credential-workflows.js +365 -0
- package/esm/keri/npm/src/app/credentials/tel-publishing.js +27 -0
- package/esm/keri/npm/src/app/{verifying.js → credentials/verifying.js} +50 -45
- package/esm/keri/npm/src/app/delivery/forwarding.js +600 -0
- package/esm/keri/npm/src/app/delivery/introducing.js +68 -0
- package/esm/keri/npm/src/app/delivery/reply-streams.js +230 -0
- package/esm/keri/npm/src/app/delivery/respondant.js +159 -0
- package/esm/keri/npm/src/app/delivery/stored-replies.js +53 -0
- package/esm/keri/npm/src/app/exchanges/essr.js +111 -0
- package/esm/keri/npm/src/app/exchanges/exchange-messaging.js +66 -0
- package/esm/keri/npm/src/app/exchanges/exchanging.js +1354 -0
- package/esm/keri/npm/src/app/{challenging.js → identity/challenging.js} +13 -8
- package/esm/keri/npm/src/app/{configing.js → identity/configing.js} +4 -4
- package/esm/keri/npm/src/app/{delegating.js → identity/delegating.js} +118 -40
- package/esm/keri/npm/src/app/{endpoint-roleing.js → identity/endpoint-roleing.js} +43 -39
- package/esm/keri/npm/src/app/{habbing.js → identity/habbing.js} +258 -226
- package/esm/keri/npm/src/app/{keeping.js → identity/keeping.js} +60 -56
- package/esm/keri/npm/src/app/{organizing.js → identity/organizing.js} +47 -21
- package/esm/keri/npm/src/app/{ipex-building.js → ipex/ipex-building.js} +53 -55
- package/esm/keri/npm/src/app/ipex/ipex-credentialing.js +359 -0
- package/esm/keri/npm/src/app/{ipex-graph.js → ipex/ipex-graph.js} +70 -124
- package/esm/keri/npm/src/app/ipex/ipex-grouping.js +664 -0
- package/esm/keri/npm/src/app/ipex/ipex-node-authentication.js +185 -0
- package/esm/keri/npm/src/app/ipex/ipex-v2.js +692 -0
- package/esm/keri/npm/src/app/{ipexing.js → ipex/ipexing.js} +59 -10
- package/esm/keri/npm/src/app/mailbox/forward-handler.js +228 -0
- package/esm/keri/npm/src/app/{mailbox-director.js → mailbox/mailbox-director.js} +146 -139
- package/esm/keri/npm/src/app/mailbox/mailbox-poller.js +305 -0
- package/esm/keri/npm/src/app/mailbox/mailbox-sse.js +254 -0
- package/esm/keri/npm/src/app/{mailboxing.js → mailbox/mailboxing.js} +117 -70
- package/esm/keri/npm/src/app/mailbox/topic-routing.js +54 -0
- package/esm/keri/npm/src/app/multisig/group-members.js +173 -0
- package/esm/keri/npm/src/app/multisig/grouping.js +932 -0
- package/esm/keri/npm/src/app/multisig/multisig-messaging.js +164 -0
- package/esm/keri/npm/src/app/multisig/multisig-workflows.js +821 -0
- package/esm/keri/npm/src/app/{notifying.js → notifications/notifying.js} +23 -50
- package/esm/keri/npm/src/app/notifications/signaling.js +177 -0
- package/esm/keri/npm/src/app/{parsering.js → protocol/parsering.js} +123 -53
- package/esm/keri/npm/src/app/protocol/protocol-processing.js +245 -0
- package/esm/keri/npm/src/app/protocol/reactor.js +55 -0
- package/esm/keri/npm/src/app/queries/query-replies.js +151 -0
- package/esm/keri/npm/src/app/queries/querying.js +306 -0
- package/esm/keri/npm/src/app/queries/witness-inquisitor.js +415 -0
- package/esm/keri/npm/src/app/runtime/abortable.js +103 -0
- package/esm/keri/npm/src/app/runtime/agent-runtime.js +633 -0
- package/esm/keri/npm/src/app/runtime/cue-runtime.js +61 -0
- package/esm/keri/npm/src/app/runtime/runtime-clock.js +6 -0
- package/esm/keri/npm/src/app/{byte-source.js → transport/byte-source.js} +43 -21
- package/esm/keri/npm/src/app/transport/cesr-egress.js +317 -0
- package/esm/keri/npm/src/app/{cesr-http.js → transport/cesr-http.js} +28 -78
- package/esm/keri/npm/src/app/transport/http-client.js +172 -0
- package/esm/keri/npm/src/app/transport/http-messenger.js +52 -0
- package/esm/keri/npm/src/app/transport/http-stream-messenger.js +60 -0
- package/esm/keri/npm/src/app/transport/httping.js +57 -0
- package/esm/keri/npm/src/app/transport/message-source.js +77 -0
- package/esm/keri/npm/src/app/transport/messengering.js +68 -0
- package/esm/keri/npm/src/app/{socket-source.js → transport/socket-source.js} +41 -5
- package/esm/keri/npm/src/app/transport/tcp-egress.js +377 -0
- package/esm/keri/npm/src/app/transport/tcp-messenger.js +162 -0
- package/esm/keri/npm/src/app/transport/tcp-stream-messenger.js +40 -0
- package/esm/keri/npm/src/app/transport/transport-error.js +14 -0
- package/esm/keri/npm/src/app/witness/http-endpoints.js +185 -0
- package/esm/keri/npm/src/app/witness/ingress.js +148 -0
- package/esm/keri/npm/src/app/witness/receipt-client.js +248 -0
- package/esm/keri/npm/src/app/witness/receipt-messages.js +29 -0
- package/esm/keri/npm/src/app/witness/receipting.js +323 -0
- package/esm/keri/npm/src/app/witness/registration.js +50 -0
- package/esm/keri/npm/src/cli/common/bootstrap.js +12 -0
- package/esm/keri/npm/src/{app/cli → cli}/common/context.js +47 -9
- package/esm/keri/npm/src/{app/cli → cli}/common/existing.js +9 -29
- package/esm/keri/npm/src/cli/common/parsing.js +279 -0
- package/esm/keri/npm/src/cli/common/passcode.js +66 -0
- package/esm/keri/npm/src/cli/common/tel-completion.js +24 -0
- package/esm/keri/npm/src/{app/cli → cli}/common/witness-auth.js +2 -2
- package/esm/keri/npm/src/cli/credentials/ipex.js +702 -0
- package/esm/keri/npm/src/cli/credentials/vc.js +399 -0
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/did.js +71 -53
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/ends.js +34 -31
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/loc.js +22 -20
- package/esm/keri/npm/src/cli/endpoints/oobi-clean.js +134 -0
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/oobi.js +37 -36
- package/esm/keri/npm/src/{app/cli → cli/identity}/aid.js +8 -7
- package/esm/keri/npm/src/cli/identity/challenge.js +181 -0
- package/esm/keri/npm/src/{app/cli → cli/identity}/delegate.js +88 -73
- package/esm/keri/npm/src/{app/cli → cli/identity}/export.js +9 -8
- package/esm/keri/npm/src/cli/identity/incept.js +181 -0
- package/esm/keri/npm/src/cli/identity/init.js +153 -0
- package/esm/keri/npm/src/cli/identity/interact.js +84 -0
- package/esm/keri/npm/src/{app/cli → cli/identity}/list.js +7 -6
- package/esm/keri/npm/src/cli/identity/rotate.js +172 -0
- package/esm/keri/npm/src/cli/index.js +38 -0
- package/esm/keri/npm/src/{app/cli → cli/messaging}/exchange.js +24 -24
- package/esm/keri/npm/src/cli/messaging/multisig.js +569 -0
- package/esm/keri/npm/src/{app/cli → cli/messaging}/notifications.js +26 -22
- package/esm/keri/npm/src/{app/cli → cli}/output.js +1 -1
- package/esm/keri/npm/src/cli/tools/annotate.js +25 -0
- package/esm/keri/npm/src/{app/cli → cli/tools}/benchmark.js +18 -9
- package/esm/keri/npm/src/{app/cli → cli/tools}/db-dump.js +14 -27
- package/esm/keri/npm/src/{app/cli → cli/tools}/saidify.js +3 -2
- package/esm/keri/npm/src/{app/cli → cli/tools}/sign.js +16 -10
- package/esm/keri/npm/src/{app/cli → cli/tools}/verify.js +10 -10
- package/esm/keri/npm/src/core/attachment-countering.js +31 -1
- package/esm/keri/npm/src/core/deck.js +5 -44
- package/esm/keri/npm/src/core/dispatch.js +10 -2
- package/esm/keri/npm/src/core/errors.js +5 -10
- package/esm/keri/npm/src/core/{exchange-proofing.js → exchange/exchange-proofing.js} +32 -2
- package/esm/keri/npm/src/core/{protocol-exchanging.js → exchange/protocol-exchanging.js} +47 -4
- package/esm/keri/npm/src/core/genus-framing.js +44 -0
- package/esm/keri/npm/src/core/{eventing.js → kel/eventing.js} +209 -390
- package/esm/keri/npm/src/core/kel/kever-decisions.js +70 -0
- package/esm/keri/npm/src/core/{kever.js → kel/kever.js} +84 -167
- package/esm/keri/npm/src/core/logger.js +3 -3
- package/esm/keri/npm/src/core/{kram-policy.js → mailbox/kram-policy.js} +14 -4
- package/esm/keri/npm/src/core/{kram-pruning.js → mailbox/kram-pruning.js} +5 -15
- package/esm/keri/npm/src/core/{kram-signatures.js → mailbox/kram-signatures.js} +1 -1
- package/esm/keri/npm/src/core/mailbox/kram-staging.js +149 -0
- package/esm/keri/npm/src/core/{kram-time.js → mailbox/kram-time.js} +9 -15
- package/esm/keri/npm/src/core/mailbox/kraming.js +78 -0
- package/esm/keri/npm/src/core/protocol-eventing.js +6 -1
- package/esm/keri/npm/src/core/protocol-serialization.js +9 -34
- package/esm/keri/npm/src/core/protocol-vdr-eventing.js +10 -11
- package/esm/keri/npm/src/core/records.js +0 -19
- package/esm/keri/npm/src/core/routing.js +187 -199
- package/esm/keri/npm/src/db/baser-defaults.js +11 -0
- package/esm/keri/npm/src/db/basing.js +224 -401
- package/esm/keri/npm/src/db/core/keys.js +2 -2
- package/esm/keri/npm/src/db/core/lmdber.js +123 -149
- package/esm/keri/npm/src/db/core/path-manager.js +2 -4
- package/esm/keri/npm/src/db/escrowing.js +82 -200
- package/esm/keri/npm/src/db/exchange/exchange-nests.js +54 -0
- package/esm/keri/npm/src/db/exchange/exchange-records.js +7 -0
- package/esm/keri/npm/src/db/index.js +5 -6
- package/esm/keri/npm/src/db/keeping.js +123 -6
- package/esm/keri/npm/src/db/{kram-factors.js → mailbox/kram-factors.js} +17 -50
- package/esm/keri/npm/src/db/{mailboxing.js → mailbox/mailboxing.js} +5 -8
- package/esm/keri/npm/src/db/reger.js +48 -69
- package/esm/keri/npm/src/db/{kel-replay.js → replay/kel-replay.js} +12 -24
- package/esm/keri/npm/src/db/{tel-replay.js → replay/tel-replay.js} +38 -36
- package/esm/keri/npm/src/db/{witness-replay.js → replay/witness-replay.js} +8 -14
- package/esm/keri/npm/src/db/subing.js +2 -11
- package/esm/keri/npm/src/did/keri/resolving.js +4 -18
- package/esm/keri/npm/src/did/webs/artifacts.js +21 -24
- package/esm/keri/npm/src/did/webs/designated-aliases.js +18 -48
- package/esm/keri/npm/src/did/webs/documenting.js +8 -8
- package/esm/keri/npm/src/did/webs/resolving.js +73 -74
- package/esm/keri/npm/src/library/index.js +1 -1
- package/esm/keri/npm/src/npm/cli.js +1 -1
- package/esm/keri/npm/src/npm/index.js +1 -1
- package/esm/keri/npm/src/runtime/index.js +105 -74
- package/esm/keri/npm/src/vdr/backer-state.js +55 -0
- package/esm/keri/npm/src/vdr/credential-tsn-record.js +59 -0
- package/esm/keri/npm/src/vdr/credentialing.js +84 -109
- package/esm/keri/npm/src/vdr/eventing.js +633 -251
- package/esm/keri/npm/src/vdr/registry-tsn-record.js +55 -0
- package/esm/keri/npm/src/vdr/revoking.js +90 -0
- package/esm/keri/npm/src/vdr/tel-anchor.js +29 -0
- package/esm/keri/npm/src/vdr/tel-publication.js +178 -0
- package/esm/keri/npm/src/vdr/tsn-query.js +15 -10
- package/esm/keri/npm/src/{app/version.js → version.js} +2 -2
- package/package.json +7 -21
- package/types/_dnt.polyfills.d.ts +55 -0
- package/types/_dnt.polyfills.d.ts.map +1 -1
- package/types/acdc/chaining.d.ts +35 -0
- package/types/acdc/chaining.d.ts.map +1 -0
- package/types/acdc/dhking.d.ts +136 -0
- package/types/acdc/dhking.d.ts.map +1 -0
- package/types/acdc/messaging.d.ts.map +1 -1
- package/types/acdc/observing.d.ts +19 -15
- package/types/acdc/observing.d.ts.map +1 -1
- package/types/acdc/regbasing.d.ts +8 -9
- package/types/acdc/regbasing.d.ts.map +1 -1
- package/types/acdc/regengine.d.ts +14 -28
- package/types/acdc/regengine.d.ts.map +1 -1
- package/types/acdc/regeventing.d.ts +24 -7
- package/types/acdc/regeventing.d.ts.map +1 -1
- package/types/acdc/registering.d.ts +27 -11
- package/types/acdc/registering.d.ts.map +1 -1
- package/types/acdc/registraring.d.ts +22 -22
- package/types/acdc/registraring.d.ts.map +1 -1
- package/types/acdc/relating.d.ts +21 -0
- package/types/acdc/relating.d.ts.map +1 -0
- package/types/acdc/salting.d.ts +241 -0
- package/types/acdc/salting.d.ts.map +1 -0
- package/types/acdc/scheming.d.ts +3 -2
- package/types/acdc/scheming.d.ts.map +1 -1
- package/types/acdc/unblinding.d.ts +150 -0
- package/types/acdc/unblinding.d.ts.map +1 -0
- package/types/app/bootstrap/authenticating.d.ts +54 -0
- package/types/app/bootstrap/authenticating.d.ts.map +1 -0
- package/types/app/bootstrap/bootstrapping.d.ts +45 -0
- package/types/app/bootstrap/bootstrapping.d.ts.map +1 -0
- package/types/app/bootstrap/oobi-replies.d.ts +8 -0
- package/types/app/bootstrap/oobi-replies.d.ts.map +1 -0
- package/types/app/{oobiery.d.ts → bootstrap/oobiery.d.ts} +98 -27
- package/types/app/bootstrap/oobiery.d.ts.map +1 -0
- package/types/app/credentials/credential-importing.d.ts +29 -0
- package/types/app/credentials/credential-importing.d.ts.map +1 -0
- package/types/app/credentials/credential-proposals.d.ts +27 -0
- package/types/app/credentials/credential-proposals.d.ts.map +1 -0
- package/types/app/credentials/credential-revoking.d.ts +44 -0
- package/types/app/credentials/credential-revoking.d.ts.map +1 -0
- package/types/app/credentials/credential-workflows.d.ts +149 -0
- package/types/app/credentials/credential-workflows.d.ts.map +1 -0
- package/types/app/{schema-resolving.d.ts → credentials/schema-resolving.d.ts} +2 -2
- package/types/app/credentials/schema-resolving.d.ts.map +1 -0
- package/types/app/credentials/tel-publishing.d.ts +16 -0
- package/types/app/credentials/tel-publishing.d.ts.map +1 -0
- package/types/app/{verifying.d.ts → credentials/verifying.d.ts} +20 -9
- package/types/app/credentials/verifying.d.ts.map +1 -0
- package/types/app/delivery/forwarding.d.ts +227 -0
- package/types/app/delivery/forwarding.d.ts.map +1 -0
- package/types/app/delivery/introducing.d.ts +21 -0
- package/types/app/delivery/introducing.d.ts.map +1 -0
- package/types/app/delivery/reply-streams.d.ts +49 -0
- package/types/app/delivery/reply-streams.d.ts.map +1 -0
- package/types/app/delivery/respondant.d.ts +52 -0
- package/types/app/delivery/respondant.d.ts.map +1 -0
- package/types/app/delivery/stored-replies.d.ts +11 -0
- package/types/app/delivery/stored-replies.d.ts.map +1 -0
- package/types/app/exchanges/essr.d.ts +53 -0
- package/types/app/exchanges/essr.d.ts.map +1 -0
- package/types/app/exchanges/exchange-messaging.d.ts +73 -0
- package/types/app/exchanges/exchange-messaging.d.ts.map +1 -0
- package/types/app/exchanges/exchanging.d.ts +379 -0
- package/types/app/exchanges/exchanging.d.ts.map +1 -0
- package/types/app/{challenging.d.ts → identity/challenging.d.ts} +9 -3
- package/types/app/identity/challenging.d.ts.map +1 -0
- package/types/app/{configing.d.ts → identity/configing.d.ts} +1 -1
- package/types/app/identity/configing.d.ts.map +1 -0
- package/types/app/{delegating.d.ts → identity/delegating.d.ts} +59 -17
- package/types/app/identity/delegating.d.ts.map +1 -0
- package/types/app/identity/endpoint-roleing.d.ts +54 -0
- package/types/app/identity/endpoint-roleing.d.ts.map +1 -0
- package/types/app/{habbing.d.ts → identity/habbing.d.ts} +86 -54
- package/types/app/identity/habbing.d.ts.map +1 -0
- package/types/app/{keeping.d.ts → identity/keeping.d.ts} +19 -5
- package/types/app/identity/keeping.d.ts.map +1 -0
- package/types/app/{organizing.d.ts → identity/organizing.d.ts} +19 -4
- package/types/app/identity/organizing.d.ts.map +1 -0
- package/types/app/{ipex-building.d.ts → ipex/ipex-building.d.ts} +5 -5
- package/types/app/ipex/ipex-building.d.ts.map +1 -0
- package/types/app/{ipex-credentialing.d.ts → ipex/ipex-credentialing.d.ts} +42 -10
- package/types/app/ipex/ipex-credentialing.d.ts.map +1 -0
- package/types/app/ipex/ipex-graph.d.ts +28 -0
- package/types/app/ipex/ipex-graph.d.ts.map +1 -0
- package/types/app/ipex/ipex-grouping.d.ts +112 -0
- package/types/app/ipex/ipex-grouping.d.ts.map +1 -0
- package/types/app/ipex/ipex-node-authentication.d.ts +32 -0
- package/types/app/ipex/ipex-node-authentication.d.ts.map +1 -0
- package/types/app/ipex/ipex-v2.d.ts +71 -0
- package/types/app/ipex/ipex-v2.d.ts.map +1 -0
- package/types/app/{ipexing.d.ts → ipex/ipexing.d.ts} +21 -8
- package/types/app/ipex/ipexing.d.ts.map +1 -0
- package/types/app/mailbox/forward-handler.d.ts +68 -0
- package/types/app/mailbox/forward-handler.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-director.d.ts +252 -0
- package/types/app/mailbox/mailbox-director.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-poller.d.ts +149 -0
- package/types/app/mailbox/mailbox-poller.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-sse.d.ts +63 -0
- package/types/app/mailbox/mailbox-sse.d.ts.map +1 -0
- package/types/app/{mailboxing.d.ts → mailbox/mailboxing.d.ts} +92 -43
- package/types/app/mailbox/mailboxing.d.ts.map +1 -0
- package/types/app/mailbox/topic-routing.d.ts +18 -0
- package/types/app/mailbox/topic-routing.d.ts.map +1 -0
- package/types/app/multisig/group-members.d.ts +60 -0
- package/types/app/multisig/group-members.d.ts.map +1 -0
- package/types/app/multisig/grouping.d.ts +317 -0
- package/types/app/multisig/grouping.d.ts.map +1 -0
- package/types/app/multisig/multisig-messaging.d.ts +97 -0
- package/types/app/multisig/multisig-messaging.d.ts.map +1 -0
- package/types/app/multisig/multisig-workflows.d.ts +85 -0
- package/types/app/multisig/multisig-workflows.d.ts.map +1 -0
- package/types/app/{notifying.d.ts → notifications/notifying.d.ts} +5 -6
- package/types/app/notifications/notifying.d.ts.map +1 -0
- package/types/app/notifications/signaling.d.ts +68 -0
- package/types/app/notifications/signaling.d.ts.map +1 -0
- package/types/app/protocol/parsering.d.ts +128 -0
- package/types/app/protocol/parsering.d.ts.map +1 -0
- package/types/app/{protocol-host-policy.d.ts → protocol/protocol-host-policy.d.ts} +1 -10
- package/types/app/protocol/protocol-host-policy.d.ts.map +1 -0
- package/types/app/protocol/protocol-processing.d.ts +140 -0
- package/types/app/protocol/protocol-processing.d.ts.map +1 -0
- package/types/app/protocol/reactor.d.ts +43 -0
- package/types/app/protocol/reactor.d.ts.map +1 -0
- package/types/app/queries/query-replies.d.ts +78 -0
- package/types/app/queries/query-replies.d.ts.map +1 -0
- package/types/app/queries/querying.d.ts +155 -0
- package/types/app/queries/querying.d.ts.map +1 -0
- package/types/app/queries/witness-inquisitor.d.ts +150 -0
- package/types/app/queries/witness-inquisitor.d.ts.map +1 -0
- package/types/app/runtime/abortable.d.ts +39 -0
- package/types/app/runtime/abortable.d.ts.map +1 -0
- package/types/app/runtime/agent-runtime.d.ts +348 -0
- package/types/app/runtime/agent-runtime.d.ts.map +1 -0
- package/types/app/runtime/cue-runtime.d.ts +33 -0
- package/types/app/runtime/cue-runtime.d.ts.map +1 -0
- package/types/app/runtime/runtime-clock.d.ts +28 -0
- package/types/app/runtime/runtime-clock.d.ts.map +1 -0
- package/types/app/runtime/runtime-turn.d.ts.map +1 -0
- package/types/app/transport/byte-source.d.ts +41 -0
- package/types/app/transport/byte-source.d.ts.map +1 -0
- package/types/app/transport/cesr-egress.d.ts +117 -0
- package/types/app/transport/cesr-egress.d.ts.map +1 -0
- package/types/app/{cesr-http.d.ts → transport/cesr-http.d.ts} +9 -33
- package/types/app/transport/cesr-http.d.ts.map +1 -0
- package/types/app/transport/http-client.d.ts +99 -0
- package/types/app/transport/http-client.d.ts.map +1 -0
- package/types/app/transport/http-messenger.d.ts +37 -0
- package/types/app/transport/http-messenger.d.ts.map +1 -0
- package/types/app/transport/http-stream-messenger.d.ts +30 -0
- package/types/app/transport/http-stream-messenger.d.ts.map +1 -0
- package/types/app/transport/httping.d.ts +19 -0
- package/types/app/transport/httping.d.ts.map +1 -0
- package/types/app/transport/message-source.d.ts +22 -0
- package/types/app/transport/message-source.d.ts.map +1 -0
- package/types/app/transport/messengering.d.ts +41 -0
- package/types/app/transport/messengering.d.ts.map +1 -0
- package/types/app/{socket-source.d.ts → transport/socket-source.d.ts} +10 -3
- package/types/app/transport/socket-source.d.ts.map +1 -0
- package/types/app/transport/tcp-egress.d.ts +118 -0
- package/types/app/transport/tcp-egress.d.ts.map +1 -0
- package/types/app/transport/tcp-messenger.d.ts +69 -0
- package/types/app/transport/tcp-messenger.d.ts.map +1 -0
- package/types/app/transport/tcp-stream-messenger.d.ts +25 -0
- package/types/app/transport/tcp-stream-messenger.d.ts.map +1 -0
- package/types/app/transport/transport-error.d.ts +12 -0
- package/types/app/transport/transport-error.d.ts.map +1 -0
- package/types/app/witness/http-endpoints.d.ts +77 -0
- package/types/app/witness/http-endpoints.d.ts.map +1 -0
- package/types/app/witness/ingress.d.ts +65 -0
- package/types/app/witness/ingress.d.ts.map +1 -0
- package/types/app/witness/receipt-client.d.ts +82 -0
- package/types/app/witness/receipt-client.d.ts.map +1 -0
- package/types/app/witness/receipt-messages.d.ts +21 -0
- package/types/app/witness/receipt-messages.d.ts.map +1 -0
- package/types/app/witness/receipting.d.ts +117 -0
- package/types/app/witness/receipting.d.ts.map +1 -0
- package/types/app/witness/registration.d.ts +27 -0
- package/types/app/witness/registration.d.ts.map +1 -0
- package/types/cli/common/bootstrap.d.ts +5 -0
- package/types/cli/common/bootstrap.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/context.d.ts +10 -9
- package/types/cli/common/context.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/existing.d.ts +2 -8
- package/types/cli/common/existing.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/parsing.d.ts +26 -15
- package/types/cli/common/parsing.d.ts.map +1 -0
- package/types/cli/common/passcode.d.ts +9 -0
- package/types/cli/common/passcode.d.ts.map +1 -0
- package/types/cli/common/rendering.d.ts.map +1 -0
- package/types/cli/common/tel-completion.d.ts +8 -0
- package/types/cli/common/tel-completion.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/witness-auth.d.ts +1 -1
- package/types/cli/common/witness-auth.d.ts.map +1 -0
- package/types/cli/credentials/ipex.d.ts +110 -0
- package/types/cli/credentials/ipex.d.ts.map +1 -0
- package/types/cli/credentials/vc.d.ts +42 -0
- package/types/cli/credentials/vc.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/did.d.ts +5 -1
- package/types/cli/endpoints/did.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/ends.d.ts +9 -1
- package/types/cli/endpoints/ends.d.ts.map +1 -0
- package/types/cli/endpoints/loc.d.ts.map +1 -0
- package/types/cli/endpoints/oobi-clean.d.ts +8 -0
- package/types/cli/endpoints/oobi-clean.d.ts.map +1 -0
- package/types/{app/cli → cli/endpoints}/oobi.d.ts +3 -1
- package/types/cli/endpoints/oobi.d.ts.map +1 -0
- package/types/cli/identity/aid.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/challenge.d.ts +5 -1
- package/types/cli/identity/challenge.d.ts.map +1 -0
- package/types/cli/identity/delegate.d.ts +4 -0
- package/types/cli/identity/delegate.d.ts.map +1 -0
- package/types/cli/identity/export.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/incept.d.ts +2 -0
- package/types/cli/identity/incept.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/init.d.ts +2 -0
- package/types/cli/identity/init.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/interact.d.ts +2 -0
- package/types/cli/identity/interact.d.ts.map +1 -0
- package/types/cli/identity/list.d.ts.map +1 -0
- package/types/{app/cli → cli/identity}/rotate.d.ts +9 -2
- package/types/cli/identity/rotate.d.ts.map +1 -0
- package/types/cli/index.d.ts +39 -0
- package/types/cli/index.d.ts.map +1 -0
- package/types/{app/cli → cli/messaging}/exchange.d.ts +3 -1
- package/types/cli/messaging/exchange.d.ts.map +1 -0
- package/types/cli/messaging/multisig.d.ts +29 -0
- package/types/cli/messaging/multisig.d.ts.map +1 -0
- package/types/cli/messaging/notifications.d.ts.map +1 -0
- package/types/cli/output.d.ts.map +1 -0
- package/types/cli/tools/annotate-color.d.ts.map +1 -0
- package/types/cli/tools/annotate.d.ts.map +1 -0
- package/types/cli/tools/benchmark.d.ts.map +1 -0
- package/types/{app/cli → cli/tools}/db-dump.d.ts +0 -2
- package/types/cli/tools/db-dump.d.ts.map +1 -0
- package/types/cli/tools/saidify.d.ts.map +1 -0
- package/types/{app/cli → cli/tools}/sign.d.ts +2 -0
- package/types/cli/tools/sign.d.ts.map +1 -0
- package/types/cli/tools/verify.d.ts.map +1 -0
- package/types/core/attachment-countering.d.ts +10 -1
- package/types/core/attachment-countering.d.ts.map +1 -1
- package/types/core/cues.d.ts +146 -57
- package/types/core/cues.d.ts.map +1 -1
- package/types/core/deck.d.ts +2 -12
- package/types/core/deck.d.ts.map +1 -1
- package/types/core/dispatch.d.ts +7 -3
- package/types/core/dispatch.d.ts.map +1 -1
- package/types/core/errors.d.ts +4 -4
- package/types/core/errors.d.ts.map +1 -1
- package/types/core/{exchange-proofing.d.ts → exchange/exchange-proofing.d.ts} +9 -2
- package/types/core/exchange/exchange-proofing.d.ts.map +1 -0
- package/types/core/{protocol-exchanging.d.ts → exchange/protocol-exchanging.d.ts} +18 -2
- package/types/core/exchange/protocol-exchanging.d.ts.map +1 -0
- package/types/core/genus-framing.d.ts +12 -0
- package/types/core/genus-framing.d.ts.map +1 -0
- package/types/core/{eventing.d.ts → kel/eventing.d.ts} +37 -48
- package/types/core/kel/eventing.d.ts.map +1 -0
- package/types/core/{kever-decisions.d.ts → kel/kever-decisions.d.ts} +36 -22
- package/types/core/kel/kever-decisions.d.ts.map +1 -0
- package/types/core/{kever.d.ts → kel/kever.d.ts} +13 -47
- package/types/core/kel/kever.d.ts.map +1 -0
- package/types/core/kel/witnesses.d.ts.map +1 -0
- package/types/core/logger.d.ts +1 -1
- package/types/core/logger.d.ts.map +1 -1
- package/types/core/{kram-auth.d.ts → mailbox/kram-auth.d.ts} +2 -2
- package/types/core/mailbox/kram-auth.d.ts.map +1 -0
- package/types/core/{kram-policy.d.ts → mailbox/kram-policy.d.ts} +2 -2
- package/types/core/mailbox/kram-policy.d.ts.map +1 -0
- package/types/core/{kram-pruning.d.ts → mailbox/kram-pruning.d.ts} +3 -3
- package/types/core/{kram-pruning.d.ts.map → mailbox/kram-pruning.d.ts.map} +1 -1
- package/types/core/{kram-signatures.d.ts → mailbox/kram-signatures.d.ts} +3 -3
- package/types/core/mailbox/kram-signatures.d.ts.map +1 -0
- package/types/core/mailbox/kram-staging.d.ts +30 -0
- package/types/core/mailbox/kram-staging.d.ts.map +1 -0
- package/types/core/{kram-time.d.ts → mailbox/kram-time.d.ts} +5 -11
- package/types/core/mailbox/kram-time.d.ts.map +1 -0
- package/types/core/mailbox/kraming.d.ts +42 -0
- package/types/core/mailbox/kraming.d.ts.map +1 -0
- package/types/core/mailbox/mailbox-topics.d.ts.map +1 -0
- package/types/core/protocol-eventing.d.ts +5 -0
- package/types/core/protocol-eventing.d.ts.map +1 -1
- package/types/core/protocol-serialization.d.ts +1 -1
- package/types/core/protocol-serialization.d.ts.map +1 -1
- package/types/core/protocol-vdr-eventing.d.ts +7 -5
- package/types/core/protocol-vdr-eventing.d.ts.map +1 -1
- package/types/core/records.d.ts +15 -50
- package/types/core/records.d.ts.map +1 -1
- package/types/core/routing.d.ts +76 -46
- package/types/core/routing.d.ts.map +1 -1
- package/types/db/baser-defaults.d.ts +5 -0
- package/types/db/baser-defaults.d.ts.map +1 -0
- package/types/db/basing.d.ts +70 -75
- package/types/db/basing.d.ts.map +1 -1
- package/types/db/core/keys.d.ts.map +1 -1
- package/types/db/core/lmdber.d.ts +21 -23
- package/types/db/core/lmdber.d.ts.map +1 -1
- package/types/db/core/path-manager.d.ts.map +1 -1
- package/types/db/escrowing.d.ts +12 -49
- package/types/db/escrowing.d.ts.map +1 -1
- package/types/db/exchange/exchange-nests.d.ts +12 -0
- package/types/db/exchange/exchange-nests.d.ts.map +1 -0
- package/types/db/exchange/exchange-records.d.ts +38 -0
- package/types/db/exchange/exchange-records.d.ts.map +1 -0
- package/types/db/index.d.ts +5 -6
- package/types/db/index.d.ts.map +1 -1
- package/types/db/keeping.d.ts +19 -1
- package/types/db/keeping.d.ts.map +1 -1
- package/types/db/koming.d.ts +1 -1
- package/types/db/koming.d.ts.map +1 -1
- package/types/db/{kram-factors.d.ts → mailbox/kram-factors.d.ts} +3 -5
- package/types/db/mailbox/kram-factors.d.ts.map +1 -0
- package/types/db/{mailboxing.d.ts → mailbox/mailboxing.d.ts} +3 -4
- package/types/db/mailbox/mailboxing.d.ts.map +1 -0
- package/types/db/reger.d.ts +10 -12
- package/types/db/reger.d.ts.map +1 -1
- package/types/db/{kel-replay.d.ts → replay/kel-replay.d.ts} +2 -6
- package/types/db/replay/kel-replay.d.ts.map +1 -0
- package/types/db/{tel-replay.d.ts → replay/tel-replay.d.ts} +13 -8
- package/types/db/replay/tel-replay.d.ts.map +1 -0
- package/types/db/{witness-replay.d.ts → replay/witness-replay.d.ts} +2 -3
- package/types/db/replay/witness-replay.d.ts.map +1 -0
- package/types/db/subing.d.ts +1 -5
- package/types/db/subing.d.ts.map +1 -1
- package/types/did/keri/resolving.d.ts +5 -10
- package/types/did/keri/resolving.d.ts.map +1 -1
- package/types/did/webs/artifacts.d.ts +5 -5
- package/types/did/webs/artifacts.d.ts.map +1 -1
- package/types/did/webs/designated-aliases.d.ts +6 -5
- package/types/did/webs/designated-aliases.d.ts.map +1 -1
- package/types/did/webs/documenting.d.ts +6 -5
- package/types/did/webs/documenting.d.ts.map +1 -1
- package/types/did/webs/resolving.d.ts +13 -3
- package/types/did/webs/resolving.d.ts.map +1 -1
- package/types/library/index.d.ts +1 -1
- package/types/library/index.d.ts.map +1 -1
- package/types/npm/cli.d.ts +1 -1
- package/types/npm/cli.d.ts.map +1 -1
- package/types/npm/index.d.ts +1 -1
- package/types/npm/index.d.ts.map +1 -1
- package/types/runtime/index.d.ts +109 -76
- package/types/runtime/index.d.ts.map +1 -1
- package/types/vdr/backer-state.d.ts +22 -0
- package/types/vdr/backer-state.d.ts.map +1 -0
- package/types/vdr/credential-tsn-record.d.ts +13 -0
- package/types/vdr/credential-tsn-record.d.ts.map +1 -0
- package/types/vdr/credentialing.d.ts +16 -27
- package/types/vdr/credentialing.d.ts.map +1 -1
- package/types/vdr/eventing.d.ts +66 -23
- package/types/vdr/eventing.d.ts.map +1 -1
- package/types/vdr/registry-tsn-record.d.ts +6 -0
- package/types/vdr/registry-tsn-record.d.ts.map +1 -0
- package/types/vdr/revoking.d.ts +18 -0
- package/types/vdr/revoking.d.ts.map +1 -0
- package/types/vdr/tel-anchor.d.ts +10 -0
- package/types/vdr/tel-anchor.d.ts.map +1 -0
- package/types/vdr/tel-publication.d.ts +49 -0
- package/types/vdr/tel-publication.d.ts.map +1 -0
- package/types/vdr/tsn-query.d.ts +9 -4
- package/types/vdr/tsn-query.d.ts.map +1 -1
- package/types/{app/version.d.ts → version.d.ts} +2 -2
- package/types/version.d.ts.map +1 -0
- package/esm/keri/npm/src/app/abortable.js +0 -27
- package/esm/keri/npm/src/app/agent-runtime.js +0 -638
- package/esm/keri/npm/src/app/cesr-egress.js +0 -308
- package/esm/keri/npm/src/app/cesr-output.js +0 -12
- package/esm/keri/npm/src/app/cli/annotate.js +0 -24
- package/esm/keri/npm/src/app/cli/challenge.js +0 -168
- package/esm/keri/npm/src/app/cli/common/displaying.js +0 -43
- package/esm/keri/npm/src/app/cli/common/parsing.js +0 -215
- package/esm/keri/npm/src/app/cli/incept.js +0 -187
- package/esm/keri/npm/src/app/cli/index.js +0 -36
- package/esm/keri/npm/src/app/cli/init.js +0 -155
- package/esm/keri/npm/src/app/cli/interact.js +0 -72
- package/esm/keri/npm/src/app/cli/ipex.js +0 -453
- package/esm/keri/npm/src/app/cli/multisig.js +0 -474
- package/esm/keri/npm/src/app/cli/query.js +0 -143
- package/esm/keri/npm/src/app/cli/rotate.js +0 -171
- package/esm/keri/npm/src/app/cli/vc.js +0 -284
- package/esm/keri/npm/src/app/cli/verifier.js +0 -96
- package/esm/keri/npm/src/app/credential-workflows.js +0 -431
- package/esm/keri/npm/src/app/cue-delivery.js +0 -171
- package/esm/keri/npm/src/app/cue-preparation.js +0 -124
- package/esm/keri/npm/src/app/cue-route.js +0 -64
- package/esm/keri/npm/src/app/cue-runtime.js +0 -104
- package/esm/keri/npm/src/app/direct-reply-delivery.js +0 -282
- package/esm/keri/npm/src/app/essr.js +0 -235
- package/esm/keri/npm/src/app/exchanging.js +0 -1219
- package/esm/keri/npm/src/app/forwarding.js +0 -1346
- package/esm/keri/npm/src/app/group-members.js +0 -37
- package/esm/keri/npm/src/app/grouping.js +0 -534
- package/esm/keri/npm/src/app/httping.js +0 -130
- package/esm/keri/npm/src/app/ipex-credentialing.js +0 -245
- package/esm/keri/npm/src/app/ipex-grouping.js +0 -317
- package/esm/keri/npm/src/app/ipex-v2.js +0 -542
- package/esm/keri/npm/src/app/mailbox-sse.js +0 -257
- package/esm/keri/npm/src/app/multisig-workflows.js +0 -537
- package/esm/keri/npm/src/app/oobi-replies.js +0 -194
- package/esm/keri/npm/src/app/query-replies.js +0 -181
- package/esm/keri/npm/src/app/querying.js +0 -1040
- package/esm/keri/npm/src/app/reactor.js +0 -517
- package/esm/keri/npm/src/app/reply-streams.js +0 -304
- package/esm/keri/npm/src/app/respondant.js +0 -173
- package/esm/keri/npm/src/app/runtime-deliveries.js +0 -510
- package/esm/keri/npm/src/app/runtime-services.js +0 -25
- package/esm/keri/npm/src/app/signaling.js +0 -388
- package/esm/keri/npm/src/app/stored-replies.js +0 -85
- package/esm/keri/npm/src/app/tcp-egress.js +0 -334
- package/esm/keri/npm/src/app/verifier-agent.js +0 -461
- package/esm/keri/npm/src/app/witnessing.js +0 -956
- package/esm/keri/npm/src/core/cue-admission.js +0 -419
- package/esm/keri/npm/src/core/index.js +0 -23
- package/esm/keri/npm/src/core/kever-decisions.js +0 -63
- package/esm/keri/npm/src/core/kram-handoff.js +0 -148
- package/esm/keri/npm/src/core/kram-staging.js +0 -211
- package/esm/keri/npm/src/core/kraming.js +0 -99
- package/esm/keri/npm/src/db/exchange-nests.js +0 -175
- package/esm/keri/npm/src/db/exchange-records.js +0 -7
- package/esm/keri/npm/src/db/kram-snapshots.js +0 -216
- package/esm/keri/npm/src/db/mailbox-inbox.js +0 -206
- package/esm/keri/npm/src/db/outboxing.js +0 -371
- package/esm/keri/npm/src/db/payload-archive.js +0 -402
- package/esm/keri/npm/src/db/payload-store.js +0 -416
- package/esm/keri/npm/src/db/payload-view.js +0 -23
- package/esm/keri/npm/src/db/verifier-cueing.js +0 -132
- package/esm/keri/npm/src/vdr/credential-tsn.js +0 -218
- package/esm/keri/npm/src/vdr/registry-tsn.js +0 -218
- package/types/app/abortable.d.ts +0 -11
- package/types/app/abortable.d.ts.map +0 -1
- package/types/app/agent-runtime.d.ts +0 -284
- package/types/app/agent-runtime.d.ts.map +0 -1
- package/types/app/authenticating.d.ts +0 -36
- package/types/app/authenticating.d.ts.map +0 -1
- package/types/app/byte-source.d.ts +0 -16
- package/types/app/byte-source.d.ts.map +0 -1
- package/types/app/cesr-egress.d.ts +0 -48
- package/types/app/cesr-egress.d.ts.map +0 -1
- package/types/app/cesr-http.d.ts.map +0 -1
- package/types/app/cesr-output.d.ts +0 -5
- package/types/app/cesr-output.d.ts.map +0 -1
- package/types/app/challenging.d.ts.map +0 -1
- package/types/app/cli/aid.d.ts.map +0 -1
- package/types/app/cli/annotate-color.d.ts.map +0 -1
- package/types/app/cli/annotate.d.ts.map +0 -1
- package/types/app/cli/benchmark.d.ts.map +0 -1
- package/types/app/cli/challenge.d.ts.map +0 -1
- package/types/app/cli/common/context.d.ts.map +0 -1
- package/types/app/cli/common/displaying.d.ts +0 -12
- package/types/app/cli/common/displaying.d.ts.map +0 -1
- package/types/app/cli/common/existing.d.ts.map +0 -1
- package/types/app/cli/common/parsing.d.ts.map +0 -1
- package/types/app/cli/common/rendering.d.ts.map +0 -1
- package/types/app/cli/common/witness-auth.d.ts.map +0 -1
- package/types/app/cli/db-dump.d.ts.map +0 -1
- package/types/app/cli/delegate.d.ts +0 -26
- package/types/app/cli/delegate.d.ts.map +0 -1
- package/types/app/cli/did.d.ts.map +0 -1
- package/types/app/cli/ends.d.ts.map +0 -1
- package/types/app/cli/exchange.d.ts.map +0 -1
- package/types/app/cli/export.d.ts.map +0 -1
- package/types/app/cli/incept.d.ts.map +0 -1
- package/types/app/cli/index.d.ts +0 -37
- package/types/app/cli/index.d.ts.map +0 -1
- package/types/app/cli/init.d.ts.map +0 -1
- package/types/app/cli/interact.d.ts.map +0 -1
- package/types/app/cli/ipex.d.ts +0 -20
- package/types/app/cli/ipex.d.ts.map +0 -1
- package/types/app/cli/list.d.ts.map +0 -1
- package/types/app/cli/loc.d.ts.map +0 -1
- package/types/app/cli/multisig.d.ts +0 -12
- package/types/app/cli/multisig.d.ts.map +0 -1
- package/types/app/cli/notifications.d.ts.map +0 -1
- package/types/app/cli/oobi.d.ts.map +0 -1
- package/types/app/cli/output.d.ts.map +0 -1
- package/types/app/cli/query.d.ts +0 -12
- package/types/app/cli/query.d.ts.map +0 -1
- package/types/app/cli/rotate.d.ts.map +0 -1
- package/types/app/cli/saidify.d.ts.map +0 -1
- package/types/app/cli/sign.d.ts.map +0 -1
- package/types/app/cli/vc.d.ts +0 -20
- package/types/app/cli/vc.d.ts.map +0 -1
- package/types/app/cli/verifier.d.ts +0 -3
- package/types/app/cli/verifier.d.ts.map +0 -1
- package/types/app/cli/verify.d.ts.map +0 -1
- package/types/app/configing.d.ts.map +0 -1
- package/types/app/credential-workflows.d.ts +0 -118
- package/types/app/credential-workflows.d.ts.map +0 -1
- package/types/app/cue-delivery.d.ts +0 -30
- package/types/app/cue-delivery.d.ts.map +0 -1
- package/types/app/cue-preparation.d.ts +0 -25
- package/types/app/cue-preparation.d.ts.map +0 -1
- package/types/app/cue-route.d.ts +0 -19
- package/types/app/cue-route.d.ts.map +0 -1
- package/types/app/cue-runtime.d.ts +0 -46
- package/types/app/cue-runtime.d.ts.map +0 -1
- package/types/app/delegating.d.ts.map +0 -1
- package/types/app/direct-reply-delivery.d.ts +0 -38
- package/types/app/direct-reply-delivery.d.ts.map +0 -1
- package/types/app/endpoint-roleing.d.ts +0 -41
- package/types/app/endpoint-roleing.d.ts.map +0 -1
- package/types/app/essr.d.ts +0 -72
- package/types/app/essr.d.ts.map +0 -1
- package/types/app/exchanging.d.ts +0 -245
- package/types/app/exchanging.d.ts.map +0 -1
- package/types/app/forwarding.d.ts +0 -411
- package/types/app/forwarding.d.ts.map +0 -1
- package/types/app/group-members.d.ts +0 -12
- package/types/app/group-members.d.ts.map +0 -1
- package/types/app/grouping.d.ts +0 -150
- package/types/app/grouping.d.ts.map +0 -1
- package/types/app/habbing.d.ts.map +0 -1
- package/types/app/httping.d.ts +0 -42
- package/types/app/httping.d.ts.map +0 -1
- package/types/app/ipex-building.d.ts.map +0 -1
- package/types/app/ipex-credentialing.d.ts.map +0 -1
- package/types/app/ipex-graph.d.ts +0 -30
- package/types/app/ipex-graph.d.ts.map +0 -1
- package/types/app/ipex-grouping.d.ts +0 -51
- package/types/app/ipex-grouping.d.ts.map +0 -1
- package/types/app/ipex-v2.d.ts +0 -51
- package/types/app/ipex-v2.d.ts.map +0 -1
- package/types/app/ipexing.d.ts.map +0 -1
- package/types/app/keeping.d.ts.map +0 -1
- package/types/app/mailbox-director.d.ts +0 -159
- package/types/app/mailbox-director.d.ts.map +0 -1
- package/types/app/mailbox-sse.d.ts +0 -38
- package/types/app/mailbox-sse.d.ts.map +0 -1
- package/types/app/mailboxing.d.ts.map +0 -1
- package/types/app/multisig-workflows.d.ts +0 -59
- package/types/app/multisig-workflows.d.ts.map +0 -1
- package/types/app/notifying.d.ts.map +0 -1
- package/types/app/oobi-replies.d.ts +0 -18
- package/types/app/oobi-replies.d.ts.map +0 -1
- package/types/app/oobiery.d.ts.map +0 -1
- package/types/app/organizing.d.ts.map +0 -1
- package/types/app/parsering.d.ts +0 -106
- package/types/app/parsering.d.ts.map +0 -1
- package/types/app/protocol-host-policy.d.ts.map +0 -1
- package/types/app/query-replies.d.ts +0 -45
- package/types/app/query-replies.d.ts.map +0 -1
- package/types/app/querying.d.ts +0 -294
- package/types/app/querying.d.ts.map +0 -1
- package/types/app/reactor.d.ts +0 -171
- package/types/app/reactor.d.ts.map +0 -1
- package/types/app/reply-streams.d.ts +0 -51
- package/types/app/reply-streams.d.ts.map +0 -1
- package/types/app/respondant.d.ts +0 -48
- package/types/app/respondant.d.ts.map +0 -1
- package/types/app/runtime-deliveries.d.ts +0 -67
- package/types/app/runtime-deliveries.d.ts.map +0 -1
- package/types/app/runtime-services.d.ts +0 -29
- package/types/app/runtime-services.d.ts.map +0 -1
- package/types/app/runtime-turn.d.ts.map +0 -1
- package/types/app/schema-resolving.d.ts.map +0 -1
- package/types/app/signaling.d.ts +0 -96
- package/types/app/signaling.d.ts.map +0 -1
- package/types/app/socket-source.d.ts.map +0 -1
- package/types/app/stored-replies.d.ts +0 -18
- package/types/app/stored-replies.d.ts.map +0 -1
- package/types/app/tcp-egress.d.ts +0 -87
- package/types/app/tcp-egress.d.ts.map +0 -1
- package/types/app/verifier-agent.d.ts +0 -91
- package/types/app/verifier-agent.d.ts.map +0 -1
- package/types/app/verifying.d.ts.map +0 -1
- package/types/app/version.d.ts.map +0 -1
- package/types/app/witnessing.d.ts +0 -227
- package/types/app/witnessing.d.ts.map +0 -1
- package/types/core/cue-admission.d.ts +0 -74
- package/types/core/cue-admission.d.ts.map +0 -1
- package/types/core/eventing.d.ts.map +0 -1
- package/types/core/exchange-proofing.d.ts.map +0 -1
- package/types/core/index.d.ts +0 -24
- package/types/core/index.d.ts.map +0 -1
- package/types/core/kever-decisions.d.ts.map +0 -1
- package/types/core/kever.d.ts.map +0 -1
- package/types/core/kram-auth.d.ts.map +0 -1
- package/types/core/kram-handoff.d.ts +0 -45
- package/types/core/kram-handoff.d.ts.map +0 -1
- package/types/core/kram-policy.d.ts.map +0 -1
- package/types/core/kram-signatures.d.ts.map +0 -1
- package/types/core/kram-staging.d.ts +0 -36
- package/types/core/kram-staging.d.ts.map +0 -1
- package/types/core/kram-time.d.ts.map +0 -1
- package/types/core/kraming.d.ts +0 -46
- package/types/core/kraming.d.ts.map +0 -1
- package/types/core/mailbox-topics.d.ts.map +0 -1
- package/types/core/protocol-exchanging.d.ts.map +0 -1
- package/types/core/witnesses.d.ts.map +0 -1
- package/types/db/exchange-nests.d.ts +0 -39
- package/types/db/exchange-nests.d.ts.map +0 -1
- package/types/db/exchange-records.d.ts +0 -35
- package/types/db/exchange-records.d.ts.map +0 -1
- package/types/db/kel-replay.d.ts.map +0 -1
- package/types/db/kram-factors.d.ts.map +0 -1
- package/types/db/kram-snapshots.d.ts +0 -23
- package/types/db/kram-snapshots.d.ts.map +0 -1
- package/types/db/mailbox-inbox.d.ts +0 -72
- package/types/db/mailbox-inbox.d.ts.map +0 -1
- package/types/db/mailboxing.d.ts.map +0 -1
- package/types/db/outboxing.d.ts +0 -182
- package/types/db/outboxing.d.ts.map +0 -1
- package/types/db/payload-archive.d.ts +0 -70
- package/types/db/payload-archive.d.ts.map +0 -1
- package/types/db/payload-store.d.ts +0 -40
- package/types/db/payload-store.d.ts.map +0 -1
- package/types/db/payload-view.d.ts +0 -4
- package/types/db/payload-view.d.ts.map +0 -1
- package/types/db/tel-replay.d.ts.map +0 -1
- package/types/db/verifier-cueing.d.ts +0 -46
- package/types/db/verifier-cueing.d.ts.map +0 -1
- package/types/db/witness-replay.d.ts.map +0 -1
- package/types/vdr/credential-tsn.d.ts +0 -18
- package/types/vdr/credential-tsn.d.ts.map +0 -1
- package/types/vdr/registry-tsn.d.ts +0 -23
- package/types/vdr/registry-tsn.d.ts.map +0 -1
- /package/esm/keri/npm/src/app/{schema-resolving.js → credentials/schema-resolving.js} +0 -0
- /package/esm/keri/npm/src/app/{protocol-host-policy.js → protocol/protocol-host-policy.js} +0 -0
- /package/esm/keri/npm/src/app/{runtime-turn.js → runtime/runtime-turn.js} +0 -0
- /package/esm/keri/npm/src/{app/cli → cli}/common/rendering.js +0 -0
- /package/esm/keri/npm/src/{app/cli → cli/tools}/annotate-color.js +0 -0
- /package/esm/keri/npm/src/core/{witnesses.js → kel/witnesses.js} +0 -0
- /package/esm/keri/npm/src/core/{kram-auth.js → mailbox/kram-auth.js} +0 -0
- /package/esm/keri/npm/src/core/{mailbox-topics.js → mailbox/mailbox-topics.js} +0 -0
- /package/types/app/{runtime-turn.d.ts → runtime/runtime-turn.d.ts} +0 -0
- /package/types/{app/cli → cli}/common/rendering.d.ts +0 -0
- /package/types/{app/cli → cli/endpoints}/loc.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/aid.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/export.d.ts +0 -0
- /package/types/{app/cli → cli/identity}/list.d.ts +0 -0
- /package/types/{app/cli → cli/messaging}/notifications.d.ts +0 -0
- /package/types/{app/cli → cli}/output.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/annotate-color.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/annotate.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/benchmark.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/saidify.d.ts +0 -0
- /package/types/{app/cli → cli/tools}/verify.d.ts +0 -0
- /package/types/core/{witnesses.d.ts → kel/witnesses.d.ts} +0 -0
- /package/types/core/{mailbox-topics.d.ts → mailbox/mailbox-topics.d.ts} +0 -0
|
@@ -1,1219 +0,0 @@
|
|
|
1
|
-
import { b, Cigar, Dater, Diger, essrChunks, essrPayload, essrTexters, framePayload, NumberPrimitive, Prefixer, ResourceAdmissionError, ResourcePolicy, Saider, Seqner, } from "cesr-ts";
|
|
2
|
-
import { call, resource } from "effection";
|
|
3
|
-
import { resolveAttachmentGvrsn } from "../core/attachment-countering.js";
|
|
4
|
-
import { CueDeck } from "../core/cue-admission.js";
|
|
5
|
-
import { Deck } from "../core/deck.js";
|
|
6
|
-
import { PathedMaterialGroup, TransIdxSigGroup } from "../core/dispatch.js";
|
|
7
|
-
import { ValidationError } from "../core/errors.js";
|
|
8
|
-
import { verifyExchangeProofs, } from "../core/exchange-proofing.js";
|
|
9
|
-
import { Kever } from "../core/kever.js";
|
|
10
|
-
import { kramReceiptTime } from "../core/kraming.js";
|
|
11
|
-
import { exchange as exchangeMessage, nestedIpexRoute, nestedMultisigIlks } from "../core/protocol-exchanging.js";
|
|
12
|
-
import { messageAttachmentGroups, serializeMessage } from "../core/protocol-serialization.js";
|
|
13
|
-
import { Roles } from "../core/roles.js";
|
|
14
|
-
import { chargeNests, discardNests, hasNests, loadNests, NESTED_COPY_RESERVATION_BYTES, publishNests, stageNests, } from "../db/exchange-nests.js";
|
|
15
|
-
import { encodeDateTimeToDater, makeNowIso8601, timestampMicros } from "../time/mod.js";
|
|
16
|
-
import { abortable } from "./abortable.js";
|
|
17
|
-
import { chunkBytes } from "./byte-source.js";
|
|
18
|
-
import { postCesr } from "./cesr-egress.js";
|
|
19
|
-
const textDecoder = new TextDecoder();
|
|
20
|
-
const EXCHANGE_ESCROW_TIMEOUT_MS = 10_000;
|
|
21
|
-
/** Private persisted receipt corruption is an invariant failure, never a remote refusal. */
|
|
22
|
-
function storedReceiverTime(record) {
|
|
23
|
-
const time = record?.receiverTime;
|
|
24
|
-
if (time !== undefined && timestampMicros(time) === null)
|
|
25
|
-
throw new Error("Corrupt exchange receiver receipt");
|
|
26
|
-
return time;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Peer-to-peer `exn` processor for one `Habery`.
|
|
30
|
-
*
|
|
31
|
-
* Responsibilities:
|
|
32
|
-
* - verify exchange-message signatures against accepted sender state
|
|
33
|
-
* - persist accepted exchange artifacts in the dedicated exchange stores
|
|
34
|
-
* - escrow partially verifiable exchange traffic in `epse.` / `epsd.`
|
|
35
|
-
* - dispatch accepted messages to route-specific handlers such as challenge
|
|
36
|
-
*
|
|
37
|
-
* TypeScript design rule:
|
|
38
|
-
* - use typed `accept` / `escrow` / `reject` outcomes instead of KERIpy's
|
|
39
|
-
* exception-only control flow for ordinary branch results
|
|
40
|
-
*/
|
|
41
|
-
export class Exchanger {
|
|
42
|
-
/** Bind route handlers and explicit per-message resource budgets to one habitat database. */
|
|
43
|
-
constructor(hby, { handlers = [], cues, maxEssrBytes = 8 * 1024 ** 2, maxEssrItems = 16384, resources = new ResourcePolicy(), now = Date.now, } = {}) {
|
|
44
|
-
Object.defineProperty(this, "hby", {
|
|
45
|
-
enumerable: true,
|
|
46
|
-
configurable: true,
|
|
47
|
-
writable: true,
|
|
48
|
-
value: void 0
|
|
49
|
-
});
|
|
50
|
-
Object.defineProperty(this, "cues", {
|
|
51
|
-
enumerable: true,
|
|
52
|
-
configurable: true,
|
|
53
|
-
writable: true,
|
|
54
|
-
value: void 0
|
|
55
|
-
});
|
|
56
|
-
Object.defineProperty(this, "routes", {
|
|
57
|
-
enumerable: true,
|
|
58
|
-
configurable: true,
|
|
59
|
-
writable: true,
|
|
60
|
-
value: new Map()
|
|
61
|
-
});
|
|
62
|
-
Object.defineProperty(this, "versionedRoutes", {
|
|
63
|
-
enumerable: true,
|
|
64
|
-
configurable: true,
|
|
65
|
-
writable: true,
|
|
66
|
-
value: new Map()
|
|
67
|
-
});
|
|
68
|
-
/** At most one active admission; the runtime owns bounded waiting and backpressure. */
|
|
69
|
-
Object.defineProperty(this, "processing", {
|
|
70
|
-
enumerable: true,
|
|
71
|
-
configurable: true,
|
|
72
|
-
writable: true,
|
|
73
|
-
value: false
|
|
74
|
-
});
|
|
75
|
-
/** Borrow the runtime ledger; standalone defaults do not establish a process-wide bound. */
|
|
76
|
-
Object.defineProperty(this, "resources", {
|
|
77
|
-
enumerable: true,
|
|
78
|
-
configurable: true,
|
|
79
|
-
writable: true,
|
|
80
|
-
value: void 0
|
|
81
|
-
});
|
|
82
|
-
/** Finite decoded-byte limit, independent of total stream length. */
|
|
83
|
-
Object.defineProperty(this, "maxEssrBytes", {
|
|
84
|
-
enumerable: true,
|
|
85
|
-
configurable: true,
|
|
86
|
-
writable: true,
|
|
87
|
-
value: void 0
|
|
88
|
-
});
|
|
89
|
-
/** Finite token count, including empty Texters. */
|
|
90
|
-
Object.defineProperty(this, "maxEssrItems", {
|
|
91
|
-
enumerable: true,
|
|
92
|
-
configurable: true,
|
|
93
|
-
writable: true,
|
|
94
|
-
value: void 0
|
|
95
|
-
});
|
|
96
|
-
/** Borrow the runtime clock for escrow deadlines and retries. */
|
|
97
|
-
Object.defineProperty(this, "now", {
|
|
98
|
-
enumerable: true,
|
|
99
|
-
configurable: true,
|
|
100
|
-
writable: true,
|
|
101
|
-
value: void 0
|
|
102
|
-
});
|
|
103
|
-
for (const limit of [maxEssrBytes, maxEssrItems, 4 * Math.ceil(maxEssrBytes / 3) + 12 * maxEssrItems]) {
|
|
104
|
-
if (!Number.isSafeInteger(limit) || limit < 0)
|
|
105
|
-
throw new RangeError("Invalid exchange ESSR limit");
|
|
106
|
-
}
|
|
107
|
-
this.resources = resources;
|
|
108
|
-
this.maxEssrBytes = maxEssrBytes;
|
|
109
|
-
this.maxEssrItems = maxEssrItems;
|
|
110
|
-
this.now = now;
|
|
111
|
-
this.hby = hby;
|
|
112
|
-
this.cues = cues ?? new Deck();
|
|
113
|
-
for (const handler of handlers) {
|
|
114
|
-
this.addHandler(handler);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/** Register one route handler for accepted exchange messages. */
|
|
118
|
-
addHandler(handler) {
|
|
119
|
-
if (handler.protocolMajor !== undefined) {
|
|
120
|
-
if (!Number.isSafeInteger(handler.protocolMajor) || handler.protocolMajor < 1) {
|
|
121
|
-
throw new ValidationError("Exchange protocol major must be a positive integer.");
|
|
122
|
-
}
|
|
123
|
-
const versions = this.versionedRoutes.get(handler.resource) ?? new Map();
|
|
124
|
-
if (versions.has(handler.protocolMajor)) {
|
|
125
|
-
throw new ValidationError(`Exchange route ${handler.resource} v${handler.protocolMajor} is already registered.`);
|
|
126
|
-
}
|
|
127
|
-
versions.set(handler.protocolMajor, handler);
|
|
128
|
-
this.versionedRoutes.set(handler.resource, versions);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (this.routes.has(handler.resource)) {
|
|
132
|
-
throw new ValidationError(`Exchange route ${handler.resource} is already registered.`);
|
|
133
|
-
}
|
|
134
|
-
this.routes.set(handler.resource, handler);
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Verify, persist, and dispatch one inbound `exn`.
|
|
138
|
-
*
|
|
139
|
-
* Accepted messages are durably logged before any route-specific side
|
|
140
|
-
* effects run so later reopen and verification paths can reuse the same
|
|
141
|
-
* stored evidence.
|
|
142
|
-
*/
|
|
143
|
-
processEvent(args) {
|
|
144
|
-
return call(() => this.admit(args));
|
|
145
|
-
}
|
|
146
|
-
/** Hold one exchange mutation until its child I/O and payload cleanup have finished. */
|
|
147
|
-
admission() {
|
|
148
|
-
return resource(function* (provide) {
|
|
149
|
-
if (this.processing)
|
|
150
|
-
throw new ValidationError("Exchanger has an active admission.");
|
|
151
|
-
this.processing = true;
|
|
152
|
-
try {
|
|
153
|
-
yield* provide(undefined);
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
this.processing = false;
|
|
157
|
-
}
|
|
158
|
-
}.bind(this));
|
|
159
|
-
}
|
|
160
|
-
/** Isolate admission cleanup so cancelling it cannot resume the caller after delegation. */
|
|
161
|
-
*admit(args) {
|
|
162
|
-
const said = args.serder.said ?? "<unknown>";
|
|
163
|
-
/** Keep normal remote admission failures in the decision channel. */
|
|
164
|
-
const reject = (reason) => ({ kind: "reject", reason, said });
|
|
165
|
-
// A foreign or in-memory wire is snapshotted before verification and disposed on rejection.
|
|
166
|
-
let staged;
|
|
167
|
-
let evidenceStarted = false;
|
|
168
|
-
let nestStage;
|
|
169
|
-
let reopenedNests = [];
|
|
170
|
-
let copyCredit;
|
|
171
|
-
let pendingCues;
|
|
172
|
-
let nests = args.nests ?? [];
|
|
173
|
-
// Resources unwind in reverse order: I/O, payload cleanup, then admission release.
|
|
174
|
-
yield* this.admission();
|
|
175
|
-
// This owner predates payload cleanup and I/O, so cancellation releases it last.
|
|
176
|
-
yield* resource(function* (provide) {
|
|
177
|
-
try {
|
|
178
|
-
yield* provide(undefined);
|
|
179
|
-
}
|
|
180
|
-
finally {
|
|
181
|
-
pendingCues?.release();
|
|
182
|
-
copyCredit?.release();
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
yield* resource(function* (provide) {
|
|
186
|
-
try {
|
|
187
|
-
yield* provide(undefined);
|
|
188
|
-
}
|
|
189
|
-
finally {
|
|
190
|
-
if (evidenceStarted && !this.hby.db.exchangeMeta.get([said])?.essr)
|
|
191
|
-
this.hby.db.essrs.rem([said]);
|
|
192
|
-
if (nestStage)
|
|
193
|
-
this.hby.db.enstStaging.rem([nestStage]);
|
|
194
|
-
try {
|
|
195
|
-
yield* call(() => discardNests(reopenedNests));
|
|
196
|
-
}
|
|
197
|
-
finally {
|
|
198
|
-
if (staged)
|
|
199
|
-
yield* call(() => staged.discard());
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}.bind(this));
|
|
203
|
-
if (args.serder.ilk !== "exn")
|
|
204
|
-
return reject(`Unsupported exchange ilk ${args.serder.ilk}.`);
|
|
205
|
-
const sender = args.serder.pre;
|
|
206
|
-
if (!sender || !args.serder.said)
|
|
207
|
-
return reject("Exchange message is missing sender or SAID.");
|
|
208
|
-
const route = args.serder.route ?? "";
|
|
209
|
-
const handler = this.versionedRoutes.get(route)?.get(args.serder.pvrsn.major) ?? this.routes.get(route);
|
|
210
|
-
const resolved = this.resolveProofs(args);
|
|
211
|
-
const authentication = yield* this.authenticate(args.serder, resolved, handler);
|
|
212
|
-
if (authentication.kind === "reject")
|
|
213
|
-
return authentication;
|
|
214
|
-
let pending = authentication.kind === "escrow"
|
|
215
|
-
? { kind: authentication.kind, said, reason: authentication.reason }
|
|
216
|
-
: undefined;
|
|
217
|
-
const senderQuery = authentication.kind === "escrow" ? authentication.query : undefined;
|
|
218
|
-
let needsProof = false;
|
|
219
|
-
let missingSchema;
|
|
220
|
-
let newEscrow = false;
|
|
221
|
-
const approved = authentication.kind === "verified" ? authentication : undefined;
|
|
222
|
-
const retainedFactors = approved?.retained ?? resolved;
|
|
223
|
-
const previous = this.hby.db.exchangeMeta.get([said]);
|
|
224
|
-
const priorReceipt = storedReceiverTime(previous);
|
|
225
|
-
const incomingReceipt = args.receipt ? kramReceiptTime(args.receipt, args.serder) : undefined;
|
|
226
|
-
const receiverTime = priorReceipt ?? incomingReceipt;
|
|
227
|
-
const retained = yield* abortable((signal) => this.hby.db.getEssr(said, signal, { maxEssrBytes: this.maxEssrBytes, maxEssrItems: this.maxEssrItems }));
|
|
228
|
-
const existing = previous?.essr ? retained : null;
|
|
229
|
-
let essr = args.essr ?? retained ?? undefined;
|
|
230
|
-
if (essr) {
|
|
231
|
-
if (!Number.isSafeInteger(essr.count) || essr.count < 0 || essr.count > this.maxEssrItems
|
|
232
|
-
|| !Number.isSafeInteger(essr.raw.size) || essr.raw.size < 0 || essr.raw.size > this.maxEssrBytes
|
|
233
|
-
|| !Number.isSafeInteger(essr.wire.size) || essr.wire.size < 0
|
|
234
|
-
|| essr.wire.size > 4 * Math.ceil(essr.raw.size / 3) + 12 * essr.count) {
|
|
235
|
-
return reject("Exchange ESSR exceeds admission limits.");
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (args.essr || (retained && !existing)) {
|
|
239
|
-
// Keep the first retained representation; a duplicate may use different legal fragment boundaries.
|
|
240
|
-
const incoming = retained && !existing ? retained : args.essr;
|
|
241
|
-
essr = yield* abortable(async (signal) => {
|
|
242
|
-
const archive = await this.hby.db.openPayloads(signal);
|
|
243
|
-
let wire = incoming.wire;
|
|
244
|
-
if (!archive.files.owns(wire)) {
|
|
245
|
-
const sink = await archive.files.stage(wire.size, signal);
|
|
246
|
-
try {
|
|
247
|
-
let copied = 0;
|
|
248
|
-
for await (const chunk of wire.open(signal)) {
|
|
249
|
-
await sink.write(chunk);
|
|
250
|
-
copied += chunk.length;
|
|
251
|
-
}
|
|
252
|
-
if (copied !== wire.size)
|
|
253
|
-
throw new ValidationError("ESSR wire size changed during admission.");
|
|
254
|
-
staged = await sink.finish();
|
|
255
|
-
wire = staged;
|
|
256
|
-
}
|
|
257
|
-
finally {
|
|
258
|
-
await sink.abort();
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// Derive authenticated bytes from the immutable wire, never from a caller-supplied raw view.
|
|
262
|
-
return essrPayload({
|
|
263
|
-
size: wire.size,
|
|
264
|
-
/** Reopen the immutable snapshot without transferring mutation rights. */
|
|
265
|
-
open: (signal) => wire.open(signal),
|
|
266
|
-
/** Admission or archive ownership outlives this borrowed decoding view. */
|
|
267
|
-
discard: async () => { },
|
|
268
|
-
}, incoming.count, incoming.raw.size, incoming.gvrsn);
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
if (typeof args.serder.a === "string") {
|
|
272
|
-
try {
|
|
273
|
-
const diger = new Diger({ qb64: args.serder.a });
|
|
274
|
-
const raw = essr?.raw;
|
|
275
|
-
if (!raw || !(yield* abortable((signal) => diger.verifyStream(raw.open(signal))))) {
|
|
276
|
-
return reject("Exchange ESSR payload digest does not match its signed commitment.");
|
|
277
|
-
}
|
|
278
|
-
const supplied = args.essr;
|
|
279
|
-
if (retained && !existing && supplied) {
|
|
280
|
-
// Imported rows and the supplied duplicate must both match; never trust its caller-provided raw view.
|
|
281
|
-
const duplicate = essrPayload({
|
|
282
|
-
size: supplied.wire.size,
|
|
283
|
-
/** Read the candidate wire without adopting its request-owned payload. */
|
|
284
|
-
open: (signal) => supplied.wire.open(signal),
|
|
285
|
-
/** Verification leaves disposal with the caller. */
|
|
286
|
-
discard: async () => { },
|
|
287
|
-
}, supplied.count, supplied.raw.size, supplied.gvrsn);
|
|
288
|
-
if (!(yield* abortable((signal) => diger.verifyStream(duplicate.raw.open(signal))))) {
|
|
289
|
-
return reject("Duplicate ESSR payload digest does not match its signed commitment.");
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
catch (error) {
|
|
294
|
-
return reject(`Invalid exchange ESSR payload: ${error instanceof Error ? error.message : String(error)}`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
const attachments = normalizeAttachments(args.ptds ?? []);
|
|
298
|
-
let retainedNests = hasNests(this.hby.db, said);
|
|
299
|
-
if (args.nests?.length || retainedNests) {
|
|
300
|
-
copyCredit = this.reserveNestedCopies();
|
|
301
|
-
// Recover only nested work; ordinary flat exchanges need no file archive.
|
|
302
|
-
yield* abortable((signal) => this.hby.db.openPayloads(signal));
|
|
303
|
-
retainedNests = hasNests(this.hby.db, said);
|
|
304
|
-
}
|
|
305
|
-
if ((args.nests?.length || retainedNests)
|
|
306
|
-
&& (args.serder.pvrsn.major < 2 || !handler?.acceptsNests
|
|
307
|
-
|| (args.serder.route !== "/fwd" && !nestedMultisigIlks(args.serder.route ?? "")
|
|
308
|
-
&& !nestedIpexRoute(args.serder.route ?? "")))) {
|
|
309
|
-
return reject("Nested exchange route is not implemented.");
|
|
310
|
-
}
|
|
311
|
-
if (args.nests?.length) {
|
|
312
|
-
try {
|
|
313
|
-
chargeNests(args.nests, this.nestBudget({ ...args, ...resolved }, essr));
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
return reject(error instanceof Error ? error.message : String(error));
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
if (retainedNests && !args.nests?.length) {
|
|
320
|
-
// Signature-only retries reopen the durable evidence; fresh parsed children stay hydrated.
|
|
321
|
-
yield* abortable(async (signal) => {
|
|
322
|
-
reopenedNests = await loadNests(this.hby.db, said, this.nestBudget({ ...args, ...resolved }, essr), signal, this.resources);
|
|
323
|
-
});
|
|
324
|
-
nests = reopenedNests;
|
|
325
|
-
}
|
|
326
|
-
const mailboxAid = args.mailboxAid ?? previous?.mailboxAid ?? null;
|
|
327
|
-
if (approved && handler?.verify) {
|
|
328
|
-
const verification = handler.verify({
|
|
329
|
-
serder: args.serder,
|
|
330
|
-
attachments,
|
|
331
|
-
essr,
|
|
332
|
-
nests,
|
|
333
|
-
mailboxAid,
|
|
334
|
-
receiverTime,
|
|
335
|
-
...(handler.acceptsSscs && approved.sscs.length ? { sscs: approved.sscs } : {}),
|
|
336
|
-
...(handler.acceptsEvidence ? { evidence: approved.supplemental } : {}),
|
|
337
|
-
});
|
|
338
|
-
const verified = typeof verification === "object" && Symbol.iterator in verification
|
|
339
|
-
? yield* verification
|
|
340
|
-
: verification;
|
|
341
|
-
if (verified === false)
|
|
342
|
-
return reject(`Exchange route ${args.serder.route ?? ""} failed handler verification.`);
|
|
343
|
-
if (typeof verified === "object") {
|
|
344
|
-
pending = { ...verified, said };
|
|
345
|
-
missingSchema = verified.schema;
|
|
346
|
-
if (missingSchema !== undefined && new Diger({ qb64: missingSchema }).qb64 !== missingSchema) {
|
|
347
|
-
throw new ValidationError("Route missing-schema dependency must be a complete SAID.");
|
|
348
|
-
}
|
|
349
|
-
needsProof = missingSchema === undefined;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
// An already accepted exchange cannot be downgraded by an incomplete duplicate.
|
|
353
|
-
if (pending && this.complete(said))
|
|
354
|
-
return pending;
|
|
355
|
-
// This exact plan precedes private nested staging and durable evidence/archive publication.
|
|
356
|
-
const owned = pending && this.cues instanceof CueDeck;
|
|
357
|
-
const newPending = () => {
|
|
358
|
-
if (this.complete(said))
|
|
359
|
-
return false;
|
|
360
|
-
if (missingSchema === undefined)
|
|
361
|
-
return this.hby.db.epse.get([said]) === null;
|
|
362
|
-
if (!this.hby.db.emse || !this.hby.db.emsd) {
|
|
363
|
-
throw new ValidationError("Missing-schema storage is unavailable on this readonly layout.");
|
|
364
|
-
}
|
|
365
|
-
return this.hby.db.emse.get([said, missingSchema]) === null;
|
|
366
|
-
};
|
|
367
|
-
const plannedNew = owned ? newPending() : undefined;
|
|
368
|
-
if (plannedNew) {
|
|
369
|
-
const cues = [];
|
|
370
|
-
if (senderQuery) {
|
|
371
|
-
cues.push({
|
|
372
|
-
kin: "query",
|
|
373
|
-
pre: senderQuery.pre,
|
|
374
|
-
q: {
|
|
375
|
-
r: "logs",
|
|
376
|
-
pre: senderQuery.pre,
|
|
377
|
-
...(senderQuery.sn === null ? {} : { sn: senderQuery.sn.toString(16) }),
|
|
378
|
-
},
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
if (needsProof)
|
|
382
|
-
cues.push({ kin: "proof", said });
|
|
383
|
-
if (missingSchema)
|
|
384
|
-
cues.push({ kin: "query", q: { r: "schema", said: missingSchema } });
|
|
385
|
-
if (cues.length)
|
|
386
|
-
pendingCues = this.cues.prepare(cues);
|
|
387
|
-
}
|
|
388
|
-
/** A different Exchanger may share the store; never apply a stale async membership plan. */
|
|
389
|
-
const checkPending = () => {
|
|
390
|
-
if (plannedNew !== undefined && newPending() !== plannedNew) {
|
|
391
|
-
throw new Error("Exchange escrow membership changed during admission");
|
|
392
|
-
}
|
|
393
|
-
};
|
|
394
|
-
if (args.nests?.length) {
|
|
395
|
-
nestStage = crypto.randomUUID();
|
|
396
|
-
yield* abortable((signal) => stageNests(this.hby.db, nestStage, nests, signal));
|
|
397
|
-
}
|
|
398
|
-
/** Publish ordinary evidence and private provenance in the archive transaction. */
|
|
399
|
-
const commit = () => {
|
|
400
|
-
if (storedReceiverTime(this.hby.db.exchangeMeta.get([said])) !== priorReceipt) {
|
|
401
|
-
throw new Error("Exchange receiver receipt changed during admission");
|
|
402
|
-
}
|
|
403
|
-
checkPending();
|
|
404
|
-
if (nestStage)
|
|
405
|
-
publishNests(this.hby.db, said, nestStage);
|
|
406
|
-
if (!pending && approved) {
|
|
407
|
-
this.clearEscrow(said, true);
|
|
408
|
-
this.logAcceptedEvent({
|
|
409
|
-
serder: args.serder,
|
|
410
|
-
...approved.retained,
|
|
411
|
-
supplemental: approved.supplemental,
|
|
412
|
-
ptds: args.ptds ?? [],
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
newEscrow = missingSchema === undefined
|
|
417
|
-
? this.escrowPartialSigned(args.serder, retainedFactors, args.ptds ?? [])
|
|
418
|
-
: this.escrowMissingSchema(args.serder, missingSchema, retainedFactors, args.ptds ?? []);
|
|
419
|
-
if (plannedNew !== undefined && newEscrow !== plannedNew) {
|
|
420
|
-
throw new Error("Exchange escrow insertion did not match admission");
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
this.hby.db.exchangeMeta.pin([said], {
|
|
424
|
-
mailboxAid,
|
|
425
|
-
...(receiverTime !== undefined ? { receiverTime } : {}),
|
|
426
|
-
...((existing ?? essr)
|
|
427
|
-
? {
|
|
428
|
-
essr: {
|
|
429
|
-
count: (existing ?? essr).count,
|
|
430
|
-
size: (existing ?? essr).raw.size,
|
|
431
|
-
gvrsn: (existing ?? essr).gvrsn,
|
|
432
|
-
},
|
|
433
|
-
}
|
|
434
|
-
: {}),
|
|
435
|
-
});
|
|
436
|
-
};
|
|
437
|
-
let stored = existing ?? essr;
|
|
438
|
-
if (essr && !existing) {
|
|
439
|
-
checkPending();
|
|
440
|
-
const wire = essr;
|
|
441
|
-
// KERIpy-origin rows already have accepted/escrow ownership; failed import must preserve them.
|
|
442
|
-
if (!retained) {
|
|
443
|
-
this.hby.db.essrs.rem([said]);
|
|
444
|
-
evidenceStarted = true;
|
|
445
|
-
}
|
|
446
|
-
stored = yield* abortable(async (signal) => {
|
|
447
|
-
if (!retained) {
|
|
448
|
-
// Populate new KERIpy evidence one bounded Texter at a time.
|
|
449
|
-
for await (const texter of essrTexters(wire, this.maxEssrBytes, signal)) {
|
|
450
|
-
this.hby.db.essrs.add([said], texter);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
await (await this.hby.db.openPayloads(signal)).publish(`essr/${said}`, staged ?? args.essr?.wire ?? wire.wire, commit, signal);
|
|
454
|
-
return (await this.hby.db.getEssr(said, signal, {
|
|
455
|
-
maxEssrBytes: this.maxEssrBytes,
|
|
456
|
-
maxEssrItems: this.maxEssrItems,
|
|
457
|
-
}));
|
|
458
|
-
});
|
|
459
|
-
}
|
|
460
|
-
else {
|
|
461
|
-
yield* abortable(async (signal) => {
|
|
462
|
-
signal.throwIfAborted();
|
|
463
|
-
this.hby.db.env.transactionSync(commit);
|
|
464
|
-
await this.hby.db.env.flushed;
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
if (pending) {
|
|
468
|
-
if (newEscrow && pendingCues)
|
|
469
|
-
pendingCues.publish();
|
|
470
|
-
else if (newEscrow && !owned) {
|
|
471
|
-
if (senderQuery)
|
|
472
|
-
this.cueMissingStates([senderQuery]);
|
|
473
|
-
if (needsProof)
|
|
474
|
-
this.cues.push({ kin: "proof", said });
|
|
475
|
-
if (missingSchema)
|
|
476
|
-
this.cues.push({ kin: "query", q: { r: "schema", said: missingSchema } });
|
|
477
|
-
}
|
|
478
|
-
return pending;
|
|
479
|
-
}
|
|
480
|
-
if (handler) {
|
|
481
|
-
yield* call(() => handler.handle({
|
|
482
|
-
serder: args.serder,
|
|
483
|
-
attachments,
|
|
484
|
-
essr: stored ?? undefined,
|
|
485
|
-
nests,
|
|
486
|
-
mailboxAid,
|
|
487
|
-
receiverTime,
|
|
488
|
-
...(handler.acceptsSscs && approved?.sscs.length ? { sscs: approved.sscs } : {}),
|
|
489
|
-
}));
|
|
490
|
-
}
|
|
491
|
-
return { kind: "accept", said };
|
|
492
|
-
}
|
|
493
|
-
/** Retry escrows using their persisted payload references and mailbox provenance. */
|
|
494
|
-
processEscrows() {
|
|
495
|
-
return call(() => this.retryEscrows());
|
|
496
|
-
}
|
|
497
|
-
/** Retry each bounded escrow inside one structured child scope. */
|
|
498
|
-
*retryEscrows() {
|
|
499
|
-
if (this.processing)
|
|
500
|
-
throw new ValidationError("Exchanger has an active admission.");
|
|
501
|
-
yield* this.retryEscrowType(false);
|
|
502
|
-
if (this.hby.db.emse)
|
|
503
|
-
yield* this.retryEscrowType(true);
|
|
504
|
-
}
|
|
505
|
-
/** Close each bounded cursor before replay; newly discovered dependencies wait for the next finite pass. */
|
|
506
|
-
*retryEscrowType(schema) {
|
|
507
|
-
const table = schema ? this.hby.db.emse : this.hby.db.epse;
|
|
508
|
-
let end;
|
|
509
|
-
// Capture a finite key horizon without retaining bodies or holding a cursor across mutations.
|
|
510
|
-
for (const key of table.sdb.getKeys({ reverse: true, limit: 1 })) {
|
|
511
|
-
end = b(`${textDecoder.decode(key)}\0`);
|
|
512
|
-
}
|
|
513
|
-
if (!end)
|
|
514
|
-
return;
|
|
515
|
-
let start;
|
|
516
|
-
for (;;) {
|
|
517
|
-
let physical;
|
|
518
|
-
for (const key of table.sdb.getKeys({ start, end, limit: 1 })) {
|
|
519
|
-
physical = textDecoder.decode(key);
|
|
520
|
-
}
|
|
521
|
-
if (!physical)
|
|
522
|
-
break;
|
|
523
|
-
const keys = physical.split("."), said = keys[0];
|
|
524
|
-
// Skip every schema branch for this EXN, including dependencies inserted by the replay below.
|
|
525
|
-
start = b(schema ? `${said}/` : `${physical}\0`);
|
|
526
|
-
const serder = table.get(keys);
|
|
527
|
-
if (!serder || serder.said !== said || keys.length !== (schema ? 2 : 1)) {
|
|
528
|
-
throw new Error("Corrupt exchange escrow key or body.");
|
|
529
|
-
}
|
|
530
|
-
if (schema && new Diger({ qb64: keys[1] }).qb64 !== keys[1])
|
|
531
|
-
throw new Error("Corrupt schema escrow dependency.");
|
|
532
|
-
if (this.complete(said)) {
|
|
533
|
-
yield* call(() => this.dropEscrow(said));
|
|
534
|
-
continue;
|
|
535
|
-
}
|
|
536
|
-
const deadline = this.hby.db.emsd?.get([said]);
|
|
537
|
-
const absolute = deadline && timestampMicros(deadline.dts);
|
|
538
|
-
if (deadline && absolute === null)
|
|
539
|
-
throw new Error("Corrupt missing-schema deadline.");
|
|
540
|
-
const dater = schema ? deadline : this.hby.db.epsd.get([said]);
|
|
541
|
-
const date = dater && timestampMicros(dater.dts);
|
|
542
|
-
if (date === null || date === undefined) {
|
|
543
|
-
if (schema)
|
|
544
|
-
throw new Error("Corrupt missing-schema deadline.");
|
|
545
|
-
yield* call(() => this.dropEscrow(said));
|
|
546
|
-
continue;
|
|
547
|
-
}
|
|
548
|
-
const now = this.nowMicros();
|
|
549
|
-
if (now > date + (schema ? 0n : BigInt(EXCHANGE_ESCROW_TIMEOUT_MS) * 1000n)
|
|
550
|
-
|| absolute !== null && absolute !== undefined && now > absolute) {
|
|
551
|
-
yield* call(() => this.dropEscrow(said));
|
|
552
|
-
continue;
|
|
553
|
-
}
|
|
554
|
-
const decision = yield* this.processEvent({
|
|
555
|
-
serder,
|
|
556
|
-
tsgs: this.rebuildEscrowedGroups(said),
|
|
557
|
-
cigars: this.storedCigars(said),
|
|
558
|
-
sourceSeals: this.storedSeals(said),
|
|
559
|
-
ptds: this.hby.db.epath.get([said]).map((text) => PathedMaterialGroup.fromRaw(new TextEncoder().encode(text))),
|
|
560
|
-
mailboxAid: this.hby.db.exchangeMeta.get([said])?.mailboxAid,
|
|
561
|
-
});
|
|
562
|
-
if (decision.kind === "reject" && !decision.preserveEscrow)
|
|
563
|
-
yield* call(() => this.dropEscrow(said));
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
/** Share parent metadata and ESSR credit across all retained child rows. */
|
|
567
|
-
nestBudget(args, essr, prepared) {
|
|
568
|
-
const groups = prepared ?? messageAttachmentGroups({
|
|
569
|
-
tsgs: args.tsgs,
|
|
570
|
-
cigars: args.cigars,
|
|
571
|
-
sourceSeals: args.sourceSeals,
|
|
572
|
-
pathed: (args.ptds ?? []).map((group) => group.raw),
|
|
573
|
-
}, resolveAttachmentGvrsn(args.serder));
|
|
574
|
-
return {
|
|
575
|
-
bytes: 8 * 1024 ** 2 - args.serder.raw.length - groups.reduce((size, group) => size + group.raw.length, 0),
|
|
576
|
-
groups: 4096 - groups.length,
|
|
577
|
-
nodes: 255,
|
|
578
|
-
essrBytes: this.maxEssrBytes - (essr?.raw.size ?? 0),
|
|
579
|
-
essrItems: this.maxEssrItems - (essr?.count ?? 0),
|
|
580
|
-
};
|
|
581
|
-
}
|
|
582
|
-
/** Stream accepted evidence; reopened child ESSR stages survive until output cancellation or completion. */
|
|
583
|
-
async *replay(said, signal) {
|
|
584
|
-
signal?.throwIfAborted();
|
|
585
|
-
const serder = this.hby.db.exns.get([said]);
|
|
586
|
-
if (!serder)
|
|
587
|
-
throw new ValidationError("Cannot replay an unaccepted exchange.");
|
|
588
|
-
const essr = await this.hby.db.getEssr(said, signal, {
|
|
589
|
-
maxEssrBytes: this.maxEssrBytes,
|
|
590
|
-
maxEssrItems: this.maxEssrItems,
|
|
591
|
-
});
|
|
592
|
-
const gvrsn = resolveAttachmentGvrsn(serder, essr?.gvrsn);
|
|
593
|
-
const args = {
|
|
594
|
-
serder,
|
|
595
|
-
tsgs: this.rebuildEscrowedGroups(said),
|
|
596
|
-
cigars: this.storedCigars(said),
|
|
597
|
-
sourceSeals: this.storedSeals(said),
|
|
598
|
-
ptds: this.hby.db.epath.get([said]).map((text) => PathedMaterialGroup.fromRaw(new TextEncoder().encode(text))),
|
|
599
|
-
};
|
|
600
|
-
const verified = verifyExchangeProofs(this.hby.db, serder, args);
|
|
601
|
-
if (verified.invalid || verified.missing.length || !(verified.tsgs.some((group) => group.pre === serder.pre)
|
|
602
|
-
|| verified.cigars.some((cigar) => cigar.verfer?.qb64 === serder.pre)
|
|
603
|
-
|| verified.sourceSeals.some((seal) => seal.i.qb64 === serder.pre)))
|
|
604
|
-
throw new ValidationError("Invalid stored exchange authentication or evidence.");
|
|
605
|
-
const evidence = { ...verified, pathed: args.ptds.map((group) => group.raw) };
|
|
606
|
-
const nested = hasNests(this.hby.db, said);
|
|
607
|
-
const credit = nested ? this.reserveNestedCopies() : undefined;
|
|
608
|
-
let nests = [];
|
|
609
|
-
try {
|
|
610
|
-
const groups = nested ? messageAttachmentGroups(evidence, gvrsn) : [];
|
|
611
|
-
nests = nested
|
|
612
|
-
? await loadNests(this.hby.db, said, this.nestBudget(args, essr, groups), signal, this.resources)
|
|
613
|
-
: [];
|
|
614
|
-
if (nests.length) {
|
|
615
|
-
// Reuse the stored Serder and hydrated endorsements; the shared encoder builds real leaf groups.
|
|
616
|
-
const parent = {
|
|
617
|
-
body: serder,
|
|
618
|
-
attachments: groups,
|
|
619
|
-
gvrsn,
|
|
620
|
-
nests,
|
|
621
|
-
essr: essr ?? undefined,
|
|
622
|
-
};
|
|
623
|
-
yield* framePayload(parent).open(signal);
|
|
624
|
-
}
|
|
625
|
-
else {
|
|
626
|
-
yield serializeMessage(serder, { ...evidence, gvrsn, genusify: gvrsn.major >= 2 });
|
|
627
|
-
if (essr)
|
|
628
|
-
yield* essrChunks(essr, { gvrsn, signal });
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
finally {
|
|
632
|
-
try {
|
|
633
|
-
await discardNests(nests);
|
|
634
|
-
}
|
|
635
|
-
finally {
|
|
636
|
-
credit?.release();
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
/** Admit cooperating nested copies before materializing the first row or serializer. */
|
|
641
|
-
reserveNestedCopies() {
|
|
642
|
-
const decision = this.resources.reserve({ bytes: NESTED_COPY_RESERVATION_BYTES });
|
|
643
|
-
if (decision.kind === "refuse") {
|
|
644
|
-
throw new ResourceAdmissionError(`Nested storage admission refused: ${decision.reason}`, decision.reason);
|
|
645
|
-
}
|
|
646
|
-
return decision.reservation;
|
|
647
|
-
}
|
|
648
|
-
/** Return true once the named exchange SAID is durably stored as accepted. */
|
|
649
|
-
complete(said) {
|
|
650
|
-
return this.hby.db.exns.get([said])?.said === said;
|
|
651
|
-
}
|
|
652
|
-
/**
|
|
653
|
-
* Return true when this local habitat is elected to externally send an EXN.
|
|
654
|
-
*
|
|
655
|
-
* KERIpy uses the lowest collected group-signature index as the lead for a
|
|
656
|
-
* completed multisig business EXN. Single-sig habitats are always the lead.
|
|
657
|
-
*/
|
|
658
|
-
lead(hab, said) {
|
|
659
|
-
const record = this.hby.db.getHab(hab.pre);
|
|
660
|
-
if (!record?.mid) {
|
|
661
|
-
return true;
|
|
662
|
-
}
|
|
663
|
-
const groupKever = hab.kever;
|
|
664
|
-
const member = this.hby.habs.get(record.mid);
|
|
665
|
-
const memberKever = member?.kever ?? this.hby.db.getKever(record.mid);
|
|
666
|
-
const memberKey = memberKever?.verfers[0]?.qb64;
|
|
667
|
-
if (!groupKever || !memberKey) {
|
|
668
|
-
return false;
|
|
669
|
-
}
|
|
670
|
-
const indices = [];
|
|
671
|
-
for (const [keys, siger] of this.hby.db.esigs.getTopItemIter([said, ""])) {
|
|
672
|
-
if (keys[0] === said && keys[1] === hab.pre) {
|
|
673
|
-
indices.push(siger.index);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
if (indices.length === 0) {
|
|
677
|
-
return false;
|
|
678
|
-
}
|
|
679
|
-
const leadKey = groupKever.verfers[Math.min(...indices)]?.qb64;
|
|
680
|
-
return leadKey === memberKey;
|
|
681
|
-
}
|
|
682
|
-
/** Freeze last-establishment groups and expand sender-implied seals before durable admission. */
|
|
683
|
-
resolveProofs(args) {
|
|
684
|
-
const result = {
|
|
685
|
-
tsgs: [...(args.tsgs ?? [])],
|
|
686
|
-
cigars: [...(args.cigars ?? [])],
|
|
687
|
-
sourceSeals: [
|
|
688
|
-
...(args.sscs ?? []).map((seal) => ({ ...seal, i: new Prefixer({ qb64: args.serder.pre }) })),
|
|
689
|
-
...(args.sourceSeals ?? []),
|
|
690
|
-
],
|
|
691
|
-
missing: (args.unresolvedLast ?? []).map((prefix) => ({ pre: prefix.qb64, sn: null })),
|
|
692
|
-
};
|
|
693
|
-
for (const group of args.lsgs ?? []) {
|
|
694
|
-
const kever = this.hby.db.getKever(group.pre);
|
|
695
|
-
if (!kever) {
|
|
696
|
-
result.missing.push({ pre: group.pre, sn: null });
|
|
697
|
-
continue;
|
|
698
|
-
}
|
|
699
|
-
result.tsgs.push(new TransIdxSigGroup(group.prefixer, NumberPrimitive.fromNum(BigInt(kever.lastEst.s)), new Diger({ qb64: kever.lastEst.d }), group.sigers));
|
|
700
|
-
}
|
|
701
|
-
return result;
|
|
702
|
-
}
|
|
703
|
-
/** Match sender-factor precedence and let the registered route select supplemental evidence. */
|
|
704
|
-
*authenticate(serder, resolved, handler) {
|
|
705
|
-
const said = serder.said;
|
|
706
|
-
const sender = serder.pre;
|
|
707
|
-
const senderTsgs = aggregateTransIdxSigGroups(resolved.tsgs.filter((group) => group.pre === sender));
|
|
708
|
-
const extraTsgs = aggregateTransIdxSigGroups(resolved.tsgs.filter((group) => group.pre !== sender));
|
|
709
|
-
const cigars = senderTsgs.length && !handler?.verifyEvidence ? [] : resolved.cigars;
|
|
710
|
-
const senderCigars = cigars.filter((cigar) => cigar.verfer?.qb64 === sender);
|
|
711
|
-
const extraCigars = cigars.filter((cigar) => cigar.verfer?.qb64 !== sender);
|
|
712
|
-
this.cueMissingStates(resolved.missing);
|
|
713
|
-
if (resolved.missing.length && (!handler?.acceptsMissingEvidence || resolved.missing.some((m) => m.pre === sender))) {
|
|
714
|
-
// An unresolved last-establishment reference has no historical coordinate to persist.
|
|
715
|
-
// Sender intake recovery belongs to the consolidated processMsg/KRAM boundary.
|
|
716
|
-
return {
|
|
717
|
-
kind: "reject",
|
|
718
|
-
said,
|
|
719
|
-
preserveEscrow: true,
|
|
720
|
-
reason: "Unresolved last-establishment evidence requires key state and retransmission.",
|
|
721
|
-
};
|
|
722
|
-
}
|
|
723
|
-
const sealed = verifyExchangeProofs(this.hby.db, serder, {
|
|
724
|
-
sourceSeals: resolved.sourceSeals.filter((seal) => seal.i.qb64 === sender),
|
|
725
|
-
});
|
|
726
|
-
if (sealed.missing.length) {
|
|
727
|
-
this.cueMissingStates(sealed.missing);
|
|
728
|
-
return {
|
|
729
|
-
kind: handler?.acceptsSscs ? "escrow" : "reject",
|
|
730
|
-
...(!handler?.acceptsSscs ? { preserveEscrow: true } : {}),
|
|
731
|
-
said,
|
|
732
|
-
reason: "Missing sender source-seal KEL evidence.",
|
|
733
|
-
};
|
|
734
|
-
}
|
|
735
|
-
let tsgs;
|
|
736
|
-
let validCigars;
|
|
737
|
-
if (sealed.sourceSeals.length) {
|
|
738
|
-
// A valid sender seal wins; invalid optional sender signatures cannot undo its authentication.
|
|
739
|
-
tsgs = verifyExchangeProofs(this.hby.db, serder, { tsgs: senderTsgs }).tsgs;
|
|
740
|
-
validCigars = [];
|
|
741
|
-
}
|
|
742
|
-
else {
|
|
743
|
-
if (!handler?.verifyEvidence && !senderTsgs.length && !senderCigars.length
|
|
744
|
-
&& (extraTsgs.length || extraCigars.length)) {
|
|
745
|
-
return {
|
|
746
|
-
kind: "reject",
|
|
747
|
-
said,
|
|
748
|
-
preserveEscrow: true,
|
|
749
|
-
reason: "Exchange has foreign proofs without sender authentication.",
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
const signatures = this.verifySignatures({ serder, sender, tsgs: senderTsgs, cigars: senderCigars });
|
|
753
|
-
if (signatures.kind !== "verified") {
|
|
754
|
-
return signatures;
|
|
755
|
-
}
|
|
756
|
-
tsgs = signatures.tsgs;
|
|
757
|
-
validCigars = signatures.cigars;
|
|
758
|
-
}
|
|
759
|
-
if (!handler?.verifyEvidence && (extraTsgs.length || extraCigars.length)) {
|
|
760
|
-
return {
|
|
761
|
-
kind: "reject",
|
|
762
|
-
said,
|
|
763
|
-
preserveEscrow: true,
|
|
764
|
-
reason: "Exchange route does not accept supplemental endorsements.",
|
|
765
|
-
};
|
|
766
|
-
}
|
|
767
|
-
let supplemental = { tsgs: [], cigars: [], sourceSeals: [] };
|
|
768
|
-
if (handler?.verifyEvidence) {
|
|
769
|
-
const { invalid, missing, ...factors } = verifyExchangeProofs(this.hby.db, serder, {
|
|
770
|
-
tsgs: extraTsgs,
|
|
771
|
-
cigars: extraCigars,
|
|
772
|
-
sourceSeals: resolved.sourceSeals.filter((seal) => seal.i.qb64 !== sender),
|
|
773
|
-
});
|
|
774
|
-
// Each reference helper invocation deduplicates its own coordinate list. Do not
|
|
775
|
-
// re-query unresolved last groups when passing them on to the selection hook.
|
|
776
|
-
this.cueMissingStates(missing);
|
|
777
|
-
if (missing.length && !handler.acceptsMissingEvidence) {
|
|
778
|
-
return { kind: "reject", said, preserveEscrow: true, reason: "Missing supplemental proof key state." };
|
|
779
|
-
}
|
|
780
|
-
const selection = handler.verifyEvidence({
|
|
781
|
-
serder,
|
|
782
|
-
factors,
|
|
783
|
-
invalid,
|
|
784
|
-
...(handler.acceptsMissingEvidence ? { missing: [...resolved.missing, ...missing] } : {}),
|
|
785
|
-
});
|
|
786
|
-
const selected = selection && Symbol.iterator in selection ? yield* selection : selection;
|
|
787
|
-
if (!selected)
|
|
788
|
-
return { kind: "reject", said, reason: "Route rejected supplemental exchange proofs." };
|
|
789
|
-
supplemental = {
|
|
790
|
-
tsgs: selected.tsgs ?? [],
|
|
791
|
-
cigars: selected.cigars ?? [],
|
|
792
|
-
sourceSeals: selected.sourceSeals ?? [],
|
|
793
|
-
};
|
|
794
|
-
}
|
|
795
|
-
return {
|
|
796
|
-
kind: "verified",
|
|
797
|
-
supplemental,
|
|
798
|
-
sscs: sealed.sourceSeals.map(({ s, d }) => ({ s, d })),
|
|
799
|
-
retained: {
|
|
800
|
-
tsgs: [...tsgs, ...supplemental.tsgs],
|
|
801
|
-
cigars: [...validCigars, ...supplemental.cigars],
|
|
802
|
-
sourceSeals: [...sealed.sourceSeals, ...supplemental.sourceSeals],
|
|
803
|
-
},
|
|
804
|
-
};
|
|
805
|
-
}
|
|
806
|
-
/** Match _cueMissingKeyState's coordinate deduplication within this invocation. */
|
|
807
|
-
cueMissingStates(missing) {
|
|
808
|
-
if (this.cues instanceof CueDeck) {
|
|
809
|
-
if (!missing.length)
|
|
810
|
-
return;
|
|
811
|
-
// Canonical coordinates contain fixed qualified prefixes and safe ordinals. Account
|
|
812
|
-
// Map/key/query scratch before constructing it, separately from the retained batch.
|
|
813
|
-
let bytes = 16384;
|
|
814
|
-
for (const { pre } of missing)
|
|
815
|
-
bytes += 512 + 6 * pre.length;
|
|
816
|
-
const planning = this.resources.reserve({ bytes });
|
|
817
|
-
if (planning.kind === "refuse") {
|
|
818
|
-
throw new ResourceAdmissionError("Exchange query planning refused", planning.reason);
|
|
819
|
-
}
|
|
820
|
-
let batch;
|
|
821
|
-
try {
|
|
822
|
-
const unique = new Map();
|
|
823
|
-
for (const coordinate of missing) {
|
|
824
|
-
const key = `${coordinate.pre}:${coordinate.sn ?? ""}`;
|
|
825
|
-
if (!unique.has(key))
|
|
826
|
-
unique.set(key, coordinate);
|
|
827
|
-
}
|
|
828
|
-
this.cues.checkSpace(unique.size);
|
|
829
|
-
const cues = [];
|
|
830
|
-
for (const { pre, sn } of unique.values()) {
|
|
831
|
-
cues.push({ kin: "query", pre, q: { r: "logs", pre, ...(sn === null ? {} : { sn: sn.toString(16) }) } });
|
|
832
|
-
}
|
|
833
|
-
batch = this.cues.prepare(cues);
|
|
834
|
-
batch.publish();
|
|
835
|
-
}
|
|
836
|
-
finally {
|
|
837
|
-
try {
|
|
838
|
-
batch?.release();
|
|
839
|
-
}
|
|
840
|
-
finally {
|
|
841
|
-
planning.reservation.release();
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
return;
|
|
845
|
-
}
|
|
846
|
-
const seen = new Set();
|
|
847
|
-
for (const { pre, sn } of missing) {
|
|
848
|
-
const key = `${pre}:${sn ?? ""}`;
|
|
849
|
-
if (seen.has(key))
|
|
850
|
-
continue;
|
|
851
|
-
seen.add(key);
|
|
852
|
-
this.cues.push({ kin: "query", pre, q: { r: "logs", pre, ...(sn === null ? {} : { sn: sn.toString(16) }) } });
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
/** Reattach the persisted verifier to each nontransferable signature before replay or retry. */
|
|
856
|
-
storedCigars(said) {
|
|
857
|
-
return this.hby.db.ecigs.get([said]).map(([verfer, cigar]) => new Cigar(cigar, verfer));
|
|
858
|
-
}
|
|
859
|
-
/** Restore source triples without losing the anchoring AID or its historical ordinal. */
|
|
860
|
-
storedSeals(said) {
|
|
861
|
-
const seals = [];
|
|
862
|
-
for (const [keys, [s, d]] of this.hby.db.ests.getTopItemIter([said, ""])) {
|
|
863
|
-
seals.push({ i: new Prefixer({ qb64: keys[1] }), s, d });
|
|
864
|
-
}
|
|
865
|
-
return seals;
|
|
866
|
-
}
|
|
867
|
-
/** Classify sender endorsements without publishing exchange or payload ownership. */
|
|
868
|
-
verifySignatures(args) {
|
|
869
|
-
if (args.tsgs.length > 0) {
|
|
870
|
-
const verifiedGroups = [];
|
|
871
|
-
const grouped = args.tsgs;
|
|
872
|
-
for (const tsg of grouped) {
|
|
873
|
-
if (tsg.pre !== args.sender) {
|
|
874
|
-
return {
|
|
875
|
-
kind: "reject",
|
|
876
|
-
reason: `Exchange signer ${tsg.pre} does not match sender ${args.sender}.`,
|
|
877
|
-
said: args.serder.said ?? "<unknown>",
|
|
878
|
-
};
|
|
879
|
-
}
|
|
880
|
-
if (tsg.sn > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
881
|
-
return { kind: "reject", reason: "Sender ordinal exceeds runtime range.", said: args.serder.said };
|
|
882
|
-
}
|
|
883
|
-
const estSaid = this.hby.db.kels.getLast(tsg.pre, Number(tsg.sn));
|
|
884
|
-
const estEvent = estSaid ? this.hby.db.getEvtSerder(tsg.pre, estSaid) : null;
|
|
885
|
-
if (!estSaid || !estEvent) {
|
|
886
|
-
return {
|
|
887
|
-
kind: "escrow",
|
|
888
|
-
query: { pre: tsg.pre, sn: tsg.sn },
|
|
889
|
-
reason: `Missing accepted establishment state for ${tsg.pre}:${tsg.said}.`,
|
|
890
|
-
said: args.serder.said ?? "<unknown>",
|
|
891
|
-
};
|
|
892
|
-
}
|
|
893
|
-
if (estSaid !== tsg.said || !estEvent.estive || !tsg.prefixer.transferable) {
|
|
894
|
-
return { kind: "reject", reason: "Invalid sender establishment reference.", said: args.serder.said };
|
|
895
|
-
}
|
|
896
|
-
const tholder = estEvent.tholder;
|
|
897
|
-
if (!tholder || estEvent.verfers.length < tholder.size) {
|
|
898
|
-
return {
|
|
899
|
-
kind: "reject",
|
|
900
|
-
reason: `Invalid threshold material for exchange signer ${tsg.pre}.`,
|
|
901
|
-
said: args.serder.said ?? "<unknown>",
|
|
902
|
-
};
|
|
903
|
-
}
|
|
904
|
-
const verified = Kever.verifyIndexedSignatures(args.serder.raw, tsg.sigers, estEvent.verfers);
|
|
905
|
-
if (!tholder.satisfy(verified.indices)) {
|
|
906
|
-
return {
|
|
907
|
-
kind: "escrow",
|
|
908
|
-
query: { pre: tsg.pre, sn: tsg.sn },
|
|
909
|
-
reason: `Exchange ${args.serder.said ?? "<unknown>"} does not yet satisfy sender threshold.`,
|
|
910
|
-
said: args.serder.said ?? "<unknown>",
|
|
911
|
-
};
|
|
912
|
-
}
|
|
913
|
-
verifiedGroups.push(new TransIdxSigGroup(tsg.prefixer, tsg.seqner, tsg.diger, verified.sigers));
|
|
914
|
-
}
|
|
915
|
-
return { kind: "verified", tsgs: verifiedGroups, cigars: [] };
|
|
916
|
-
}
|
|
917
|
-
if (args.cigars.length > 0) {
|
|
918
|
-
const verifiedCigars = [];
|
|
919
|
-
for (const cigar of args.cigars) {
|
|
920
|
-
if (!cigar.verfer) {
|
|
921
|
-
return {
|
|
922
|
-
kind: "reject",
|
|
923
|
-
reason: "Exchange cigar is missing verifier context.",
|
|
924
|
-
said: args.serder.said ?? "<unknown>",
|
|
925
|
-
};
|
|
926
|
-
}
|
|
927
|
-
if (cigar.verfer.qb64 !== args.sender) {
|
|
928
|
-
return {
|
|
929
|
-
kind: "reject",
|
|
930
|
-
reason: `Exchange cigar signer ${cigar.verfer.qb64} does not match sender ${args.sender}.`,
|
|
931
|
-
said: args.serder.said ?? "<unknown>",
|
|
932
|
-
};
|
|
933
|
-
}
|
|
934
|
-
if (cigar.verfer.transferable || !cigar.verfer.verify(cigar.raw, args.serder.raw)) {
|
|
935
|
-
return {
|
|
936
|
-
kind: "reject",
|
|
937
|
-
preserveEscrow: true,
|
|
938
|
-
reason: `Exchange cigar failed verification for ${args.sender}.`,
|
|
939
|
-
said: args.serder.said ?? "<unknown>",
|
|
940
|
-
};
|
|
941
|
-
}
|
|
942
|
-
verifiedCigars.push(cigar);
|
|
943
|
-
}
|
|
944
|
-
return { kind: "verified", tsgs: [], cigars: verifiedCigars };
|
|
945
|
-
}
|
|
946
|
-
return {
|
|
947
|
-
kind: "escrow",
|
|
948
|
-
reason: "Exchange message has no signatures yet.",
|
|
949
|
-
said: args.serder.said ?? "<unknown>",
|
|
950
|
-
};
|
|
951
|
-
}
|
|
952
|
-
/** Retain incomplete endorsements and the original expiration clock for retry. */
|
|
953
|
-
escrowPartialSigned(serder, factors, ptds) {
|
|
954
|
-
const said = serder.said;
|
|
955
|
-
if (!said) {
|
|
956
|
-
throw new ValidationError("Cannot escrow an exchange without a SAID.");
|
|
957
|
-
}
|
|
958
|
-
if (this.complete(said))
|
|
959
|
-
return false;
|
|
960
|
-
this.storeEscrowEvidence(serder, factors, ptds);
|
|
961
|
-
this.hby.db.emse?.trim([said]);
|
|
962
|
-
// Preserve first admission time so repeated retries cannot keep stale wire alive forever.
|
|
963
|
-
this.hby.db.epsd.put([said], new Dater({ qb64: encodeDateTimeToDater(makeNowIso8601(new Date(this.now()))) }));
|
|
964
|
-
return this.hby.db.epse.put([said], serder);
|
|
965
|
-
}
|
|
966
|
-
/** Persist the same independently authenticated evidence for signature and schema dependencies. */
|
|
967
|
-
storeEscrowEvidence(serder, factors, ptds) {
|
|
968
|
-
const said = serder.said;
|
|
969
|
-
for (const tsg of factors.tsgs) {
|
|
970
|
-
const quadKey = [said, tsg.pre, tsg.sn.toString(16).padStart(32, "0"), tsg.said];
|
|
971
|
-
for (const siger of tsg.sigers) {
|
|
972
|
-
this.hby.db.esigs.add(quadKey, siger);
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
for (const cigar of factors.cigars) {
|
|
976
|
-
if (cigar.verfer)
|
|
977
|
-
this.hby.db.ecigs.add([said], [cigar.verfer, cigar]);
|
|
978
|
-
}
|
|
979
|
-
for (const seal of factors.sourceSeals)
|
|
980
|
-
this.hby.db.ests.add([said, seal.i.qb64], [seal.s, seal.d]);
|
|
981
|
-
this.hby.db.epath.pin([said], ptds.map((group) => textDecoder.decode(group.raw)));
|
|
982
|
-
}
|
|
983
|
-
/** One absolute deadline spans sequential schema dependencies; receiver receipt is not the TMSC opener. */
|
|
984
|
-
escrowMissingSchema(serder, schema, factors, ptds) {
|
|
985
|
-
const { emse, emsd } = this.hby.db, said = serder.said;
|
|
986
|
-
if (!emse || !emsd)
|
|
987
|
-
throw new ValidationError("Missing-schema storage is unavailable on this readonly layout.");
|
|
988
|
-
if (this.complete(said))
|
|
989
|
-
return false;
|
|
990
|
-
const prior = emsd.get([said]);
|
|
991
|
-
if (prior && timestampMicros(prior.dts) === null)
|
|
992
|
-
throw new Error("Corrupt missing-schema deadline.");
|
|
993
|
-
if (!prior) {
|
|
994
|
-
const xid = serder.sad.x;
|
|
995
|
-
const cache = typeof xid === "string" && xid ? this.hby.db.tmsc.get([serder.pre, xid, said]) : null;
|
|
996
|
-
const opener = cache && timestampMicros(cache.xdt);
|
|
997
|
-
if (cache && (opener === null || opener === undefined || !Number.isSafeInteger(cache.pxl) || cache.pxl < 0)) {
|
|
998
|
-
throw new Error("Corrupt missing-schema transaction lifetime.");
|
|
999
|
-
}
|
|
1000
|
-
const expiry = cache ? opener + BigInt(cache.pxl) * 1000n : this.nowMicros() + 20000000n;
|
|
1001
|
-
const remainder = (expiry % 1000n + 1000n) % 1000n;
|
|
1002
|
-
const text = makeNowIso8601(new Date(Number((expiry - remainder) / 1000n)))
|
|
1003
|
-
.replace(/\d{6}\+/, ((expiry % 1000000n + 1000000n) % 1000000n).toString().padStart(6, "0") + "+");
|
|
1004
|
-
if (timestampMicros(text) !== expiry)
|
|
1005
|
-
throw new Error("Missing-schema deadline exceeds supported date range.");
|
|
1006
|
-
emsd.put([said], new Dater({ qb64: encodeDateTimeToDater(text) }));
|
|
1007
|
-
}
|
|
1008
|
-
this.storeEscrowEvidence(serder, factors, ptds);
|
|
1009
|
-
this.hby.db.epse.rem([said]);
|
|
1010
|
-
this.hby.db.epsd.rem([said]);
|
|
1011
|
-
const stored = emse.get([said, schema]) === null;
|
|
1012
|
-
emse.trim([said]);
|
|
1013
|
-
emse.put([said, schema], serder);
|
|
1014
|
-
return stored;
|
|
1015
|
-
}
|
|
1016
|
-
/** Trusted clock failures remain infrastructure errors rather than expiring remote work. */
|
|
1017
|
-
nowMicros() {
|
|
1018
|
-
const now = new Date(this.now()).getTime();
|
|
1019
|
-
if (!Number.isFinite(now))
|
|
1020
|
-
throw new Error("Invalid exchange receiver clock.");
|
|
1021
|
-
return BigInt(now) * 1000n;
|
|
1022
|
-
}
|
|
1023
|
-
/** Persist protocol evidence inside the admission transaction before route handling. */
|
|
1024
|
-
logAcceptedEvent(args) {
|
|
1025
|
-
const said = args.serder.said;
|
|
1026
|
-
if (!said) {
|
|
1027
|
-
throw new ValidationError("Cannot log an exchange without a SAID.");
|
|
1028
|
-
}
|
|
1029
|
-
for (const tsg of args.tsgs) {
|
|
1030
|
-
const quadKey = [said, tsg.pre, tsg.sn.toString(16).padStart(32, "0"), tsg.said];
|
|
1031
|
-
for (const siger of tsg.sigers) {
|
|
1032
|
-
this.hby.db.esigs.add(quadKey, siger);
|
|
1033
|
-
}
|
|
1034
|
-
}
|
|
1035
|
-
for (const cigar of args.cigars) {
|
|
1036
|
-
if (!cigar.verfer) {
|
|
1037
|
-
throw new ValidationError("Cannot log a cigar without verifier context.");
|
|
1038
|
-
}
|
|
1039
|
-
this.hby.db.ecigs.add([said], [cigar.verfer, cigar]);
|
|
1040
|
-
}
|
|
1041
|
-
this.hby.db.epath.pin([said], args.ptds.map((group) => textDecoder.decode(group.raw)));
|
|
1042
|
-
for (const seal of args.sourceSeals)
|
|
1043
|
-
this.hby.db.ests.add([said, seal.i.qb64], [seal.s, seal.d]);
|
|
1044
|
-
const endorsers = new Set([
|
|
1045
|
-
...args.supplemental.tsgs.map((group) => group.pre),
|
|
1046
|
-
...args.supplemental.cigars.map((cigar) => cigar.verfer.qb64),
|
|
1047
|
-
...args.supplemental.sourceSeals.map((seal) => seal.i.qb64),
|
|
1048
|
-
]);
|
|
1049
|
-
for (const pre of endorsers)
|
|
1050
|
-
this.hby.db.eidx.add([pre], new Diger({ qb64: said }));
|
|
1051
|
-
const prior = args.serder.ked?.p;
|
|
1052
|
-
if (typeof prior === "string" && prior.length > 0) {
|
|
1053
|
-
this.hby.db.erpy.pin([prior], new Saider({ qb64: said }));
|
|
1054
|
-
}
|
|
1055
|
-
this.hby.db.exns.pin([said], args.serder);
|
|
1056
|
-
}
|
|
1057
|
-
rebuildEscrowedGroups(said) {
|
|
1058
|
-
const groups = [];
|
|
1059
|
-
let currentKey = null;
|
|
1060
|
-
let currentSigers = [];
|
|
1061
|
-
const flush = () => {
|
|
1062
|
-
if (!currentKey || currentSigers.length === 0) {
|
|
1063
|
-
return;
|
|
1064
|
-
}
|
|
1065
|
-
groups.push(new TransIdxSigGroup(new Prefixer({ qb64: currentKey[0] }), seqnerFromSnh(currentKey[1]), new Diger({ qb64: currentKey[2] }), currentSigers));
|
|
1066
|
-
currentSigers = [];
|
|
1067
|
-
};
|
|
1068
|
-
for (const [keys, siger] of this.hby.db.esigs.getTopItemIter([said, ""])) {
|
|
1069
|
-
const groupKey = keys.slice(1);
|
|
1070
|
-
if (!groupKey[0] || !groupKey[1] || !groupKey[2]) {
|
|
1071
|
-
continue;
|
|
1072
|
-
}
|
|
1073
|
-
if (currentKey
|
|
1074
|
-
&& (currentKey[0] !== groupKey[0]
|
|
1075
|
-
|| currentKey[1] !== groupKey[1]
|
|
1076
|
-
|| currentKey[2] !== groupKey[2])) {
|
|
1077
|
-
flush();
|
|
1078
|
-
}
|
|
1079
|
-
currentKey = [groupKey[0], groupKey[1], groupKey[2]];
|
|
1080
|
-
currentSigers.push(siger);
|
|
1081
|
-
}
|
|
1082
|
-
flush();
|
|
1083
|
-
return groups;
|
|
1084
|
-
}
|
|
1085
|
-
/** Clear pending metadata, preserving wire evidence during the acceptance transaction. */
|
|
1086
|
-
clearEscrow(said, keepEvidence = false) {
|
|
1087
|
-
this.hby.db.epse.rem([said]);
|
|
1088
|
-
this.hby.db.epsd.rem([said]);
|
|
1089
|
-
this.hby.db.emse?.trim([said]);
|
|
1090
|
-
this.hby.db.emsd?.rem([said]);
|
|
1091
|
-
this.hby.db.esigs.trim([said, ""], { topive: false });
|
|
1092
|
-
this.hby.db.ecigs.rem([said]);
|
|
1093
|
-
this.hby.db.ests.trim([said, ""], { topive: false });
|
|
1094
|
-
this.hby.db.epath.rem([said]);
|
|
1095
|
-
if (!keepEvidence) {
|
|
1096
|
-
this.hby.db.essrs.rem([said]);
|
|
1097
|
-
this.hby.db.enst.rem([said]);
|
|
1098
|
-
this.hby.db.exchangeMeta.rem([said]);
|
|
1099
|
-
}
|
|
1100
|
-
}
|
|
1101
|
-
/** Remove pending ownership only; accepted wire evidence always remains retained. */
|
|
1102
|
-
*dropEscrow(said) {
|
|
1103
|
-
yield* this.admission();
|
|
1104
|
-
if (this.complete(said)) {
|
|
1105
|
-
this.hby.db.epse.rem([said]);
|
|
1106
|
-
this.hby.db.epsd.rem([said]);
|
|
1107
|
-
this.hby.db.emse?.trim([said]);
|
|
1108
|
-
this.hby.db.emsd?.rem([said]);
|
|
1109
|
-
return;
|
|
1110
|
-
}
|
|
1111
|
-
if (this.hby.db.exchangeMeta.get([said])?.essr) {
|
|
1112
|
-
yield* abortable(async (signal) => {
|
|
1113
|
-
await (await this.hby.db.openPayloads(signal)).remove(`essr/${said}`, () => this.clearEscrow(said), signal);
|
|
1114
|
-
});
|
|
1115
|
-
}
|
|
1116
|
-
else
|
|
1117
|
-
this.hby.db.env.transactionSync(() => this.clearEscrow(said));
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
/**
|
|
1121
|
-
* Create and deliver one signed exchange message through the selected
|
|
1122
|
-
* controller-to-controller transport path.
|
|
1123
|
-
*/
|
|
1124
|
-
export function* sendSignedExchangeMessage(hab, args) {
|
|
1125
|
-
const url = resolveExchangeTransportUrl(hab, args.recipient, args.transport ?? "auto");
|
|
1126
|
-
if (!url) {
|
|
1127
|
-
throw new ValidationError(`No ${args.transport ?? "auto"} exchange endpoint is available for ${args.recipient}.`);
|
|
1128
|
-
}
|
|
1129
|
-
const [serder] = exchangeMessage(args.route, args.payload, {
|
|
1130
|
-
sender: hab.pre,
|
|
1131
|
-
recipient: args.recipient,
|
|
1132
|
-
modifiers: args.modifiers,
|
|
1133
|
-
stamp: args.date,
|
|
1134
|
-
dig: args.dig,
|
|
1135
|
-
});
|
|
1136
|
-
const message = hab.endorse(serder, { pipelined: false });
|
|
1137
|
-
yield* postCesr(url, (signal) => chunkBytes(message, { signal }), {
|
|
1138
|
-
bodyMode: "header",
|
|
1139
|
-
destination: args.recipient,
|
|
1140
|
-
});
|
|
1141
|
-
return { serder, url };
|
|
1142
|
-
}
|
|
1143
|
-
/**
|
|
1144
|
-
* Choose the remote URL that should receive one outbound exchange message.
|
|
1145
|
-
*
|
|
1146
|
-
* Current transport policy:
|
|
1147
|
-
* - `direct` sends to the recipient controller location
|
|
1148
|
-
* - `indirect` sends to an authorized mailbox endpoint, then falls back to
|
|
1149
|
-
* agent endpoints when no mailbox URL is available
|
|
1150
|
-
* - `auto` prefers direct delivery because this codebase has not yet landed
|
|
1151
|
-
* full witness-forwarding mailbox orchestration
|
|
1152
|
-
*/
|
|
1153
|
-
export function resolveExchangeTransportUrl(hab, recipient, transport) {
|
|
1154
|
-
const directUrl = preferredUrl(hab.fetchUrls(recipient));
|
|
1155
|
-
const ends = hab.endsFor(recipient);
|
|
1156
|
-
const mailboxUrl = preferredRoleUrl(ends[Roles.mailbox]);
|
|
1157
|
-
const agentUrl = preferredRoleUrl(ends[Roles.agent]);
|
|
1158
|
-
switch (transport) {
|
|
1159
|
-
case "direct":
|
|
1160
|
-
return directUrl;
|
|
1161
|
-
case "indirect":
|
|
1162
|
-
return mailboxUrl ?? agentUrl;
|
|
1163
|
-
case "auto":
|
|
1164
|
-
default:
|
|
1165
|
-
return directUrl ?? mailboxUrl ?? agentUrl;
|
|
1166
|
-
}
|
|
1167
|
-
}
|
|
1168
|
-
function preferredRoleUrl(roleUrls) {
|
|
1169
|
-
if (!roleUrls) {
|
|
1170
|
-
return null;
|
|
1171
|
-
}
|
|
1172
|
-
for (const urls of Object.values(roleUrls)) {
|
|
1173
|
-
const preferred = preferredUrl(urls);
|
|
1174
|
-
if (preferred) {
|
|
1175
|
-
return preferred;
|
|
1176
|
-
}
|
|
1177
|
-
}
|
|
1178
|
-
return null;
|
|
1179
|
-
}
|
|
1180
|
-
function preferredUrl(urls) {
|
|
1181
|
-
return urls.https ?? urls.http ?? Object.values(urls)[0] ?? null;
|
|
1182
|
-
}
|
|
1183
|
-
function normalizeAttachments(ptds) {
|
|
1184
|
-
return ptds.map((group) => ({
|
|
1185
|
-
raw: group.raw.slice(),
|
|
1186
|
-
text: textDecoder.decode(group.raw),
|
|
1187
|
-
}));
|
|
1188
|
-
}
|
|
1189
|
-
function hexToFixedBytes(hex, size) {
|
|
1190
|
-
const normalized = hex.length % 2 === 0 ? hex : `0${hex}`;
|
|
1191
|
-
if (!/^[0-9a-f]+$/i.test(normalized)) {
|
|
1192
|
-
throw new Error(`Invalid hex ordinal ${hex}`);
|
|
1193
|
-
}
|
|
1194
|
-
if (normalized.length > size * 2) {
|
|
1195
|
-
throw new Error(`Hex ordinal ${hex} exceeds ${size} bytes.`);
|
|
1196
|
-
}
|
|
1197
|
-
const raw = new Uint8Array(size);
|
|
1198
|
-
const padded = normalized.padStart(size * 2, "0");
|
|
1199
|
-
for (let i = 0; i < size; i++) {
|
|
1200
|
-
raw[i] = Number.parseInt(padded.slice(i * 2, (i * 2) + 2), 16);
|
|
1201
|
-
}
|
|
1202
|
-
return raw;
|
|
1203
|
-
}
|
|
1204
|
-
function seqnerFromSnh(snh) {
|
|
1205
|
-
return new Seqner({ code: "0A", raw: hexToFixedBytes(snh, 16) });
|
|
1206
|
-
}
|
|
1207
|
-
function aggregateTransIdxSigGroups(groups) {
|
|
1208
|
-
const aggregated = new Map();
|
|
1209
|
-
for (const group of groups) {
|
|
1210
|
-
const key = `${group.pre}\0${group.sn}\0${group.said}`;
|
|
1211
|
-
const existing = aggregated.get(key);
|
|
1212
|
-
if (!existing) {
|
|
1213
|
-
aggregated.set(key, group);
|
|
1214
|
-
continue;
|
|
1215
|
-
}
|
|
1216
|
-
aggregated.set(key, new TransIdxSigGroup(existing.prefixer, existing.seqner, existing.diger, [...existing.sigers, ...group.sigers]));
|
|
1217
|
-
}
|
|
1218
|
-
return [...aggregated.values()];
|
|
1219
|
-
}
|