keri-ts 1.0.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 +23 -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 +40 -7
- package/esm/keri/npm/src/acdc/regbasing.js +13 -2
- package/esm/keri/npm/src/acdc/regengine.js +71 -23
- package/esm/keri/npm/src/acdc/regeventing.js +163 -44
- package/esm/keri/npm/src/acdc/registering.js +93 -14
- 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 +94 -39
- package/esm/keri/npm/src/acdc/unblinding.js +1042 -0
- package/esm/keri/npm/src/app/{authenticating.js → bootstrap/authenticating.js} +39 -18
- package/esm/keri/npm/src/app/bootstrap/bootstrapping.js +109 -0
- package/esm/keri/npm/src/app/{oobi-replies.js → bootstrap/oobi-replies.js} +8 -6
- package/esm/keri/npm/src/app/{oobiery.js → bootstrap/oobiery.js} +161 -75
- 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} +41 -6
- 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/{reply-streams.js → delivery/reply-streams.js} +52 -7
- package/esm/keri/npm/src/app/delivery/respondant.js +159 -0
- package/esm/keri/npm/src/app/{stored-replies.js → delivery/stored-replies.js} +4 -4
- 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/{configing.js → identity/configing.js} +4 -4
- package/esm/keri/npm/src/app/{delegating.js → identity/delegating.js} +99 -29
- package/esm/keri/npm/src/app/{endpoint-roleing.js → identity/endpoint-roleing.js} +36 -36
- package/esm/keri/npm/src/app/{habbing.js → identity/habbing.js} +232 -150
- 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/ipex-building.js +162 -0
- package/esm/keri/npm/src/app/{ipex-credentialing.js → ipex/ipex-credentialing.js} +142 -31
- package/esm/keri/npm/src/app/ipex/ipex-graph.js +243 -0
- package/esm/keri/npm/src/app/ipex/ipex-grouping.js +664 -0
- package/esm/keri/npm/src/app/{ipex-node-authentication.js → ipex/ipex-node-authentication.js} +83 -6
- package/esm/keri/npm/src/app/ipex/ipex-v2.js +692 -0
- package/esm/keri/npm/src/app/{ipexing.js → ipex/ipexing.js} +58 -1
- 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} +120 -15
- 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} +118 -67
- 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/{grouping.js → multisig/grouping.js} +384 -70
- 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} +8 -14
- package/esm/keri/npm/src/app/{signaling.js → notifications/signaling.js} +1 -1
- package/esm/keri/npm/src/app/{parsering.js → protocol/parsering.js} +86 -18
- 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/{query-replies.js → queries/query-replies.js} +57 -6
- 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/{abortable.js → runtime/abortable.js} +43 -4
- 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} +36 -6
- 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} +20 -55
- 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} +39 -2
- 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 -6
- package/esm/keri/npm/src/{app/cli → cli}/common/existing.js +9 -11
- 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 +63 -36
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/ends.js +33 -28
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/loc.js +16 -11
- package/esm/keri/npm/src/cli/endpoints/oobi-clean.js +134 -0
- package/esm/keri/npm/src/{app/cli → cli/endpoints}/oobi.js +35 -32
- package/esm/keri/npm/src/{app/cli → cli/identity}/aid.js +8 -7
- package/esm/keri/npm/src/{app/cli → cli/identity}/challenge.js +60 -49
- package/esm/keri/npm/src/{app/cli → cli/identity}/delegate.js +61 -26
- 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/{app/cli → cli/identity}/rotate.js +60 -57
- package/esm/keri/npm/src/cli/index.js +38 -0
- package/esm/keri/npm/src/{app/cli → cli/messaging}/exchange.js +24 -22
- package/esm/keri/npm/src/{app/cli → cli/messaging}/multisig.js +165 -156
- 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/{app/cli → cli/tools}/annotate.js +10 -4
- package/esm/keri/npm/src/{app/cli → cli/tools}/benchmark.js +15 -4
- package/esm/keri/npm/src/{app/cli → cli/tools}/db-dump.js +11 -10
- 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/{exchange-proofing.js → exchange/exchange-proofing.js} +32 -2
- package/esm/keri/npm/src/core/{protocol-exchanging.js → exchange/protocol-exchanging.js} +26 -4
- package/esm/keri/npm/src/core/genus-framing.js +44 -0
- package/esm/keri/npm/src/core/{eventing.js → kel/eventing.js} +57 -25
- package/esm/keri/npm/src/core/{kever-decisions.js → kel/kever-decisions.js} +24 -12
- package/esm/keri/npm/src/core/{kever.js → kel/kever.js} +4 -4
- 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} +3 -3
- package/esm/keri/npm/src/core/{kram-signatures.js → mailbox/kram-signatures.js} +1 -1
- package/esm/keri/npm/src/core/{kram-staging.js → mailbox/kram-staging.js} +6 -6
- package/esm/keri/npm/src/core/{kram-time.js → mailbox/kram-time.js} +4 -3
- package/esm/keri/npm/src/core/{kraming.js → mailbox/kraming.js} +2 -2
- package/esm/keri/npm/src/core/protocol-eventing.js +1 -1
- package/esm/keri/npm/src/core/protocol-serialization.js +9 -34
- package/esm/keri/npm/src/core/routing.js +52 -17
- package/esm/keri/npm/src/db/baser-defaults.js +11 -0
- package/esm/keri/npm/src/db/basing.js +89 -232
- package/esm/keri/npm/src/db/core/lmdber.js +102 -63
- package/esm/keri/npm/src/db/escrowing.js +73 -49
- 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 -4
- package/esm/keri/npm/src/db/keeping.js +122 -3
- package/esm/keri/npm/src/db/{kram-factors.js → mailbox/kram-factors.js} +1 -1
- package/esm/keri/npm/src/db/{mailboxing.js → mailbox/mailboxing.js} +3 -3
- package/esm/keri/npm/src/db/reger.js +38 -29
- package/esm/keri/npm/src/db/{kel-replay.js → replay/kel-replay.js} +11 -4
- package/esm/keri/npm/src/db/{tel-replay.js → replay/tel-replay.js} +34 -0
- package/esm/keri/npm/src/db/{witness-replay.js → replay/witness-replay.js} +2 -2
- package/esm/keri/npm/src/db/subing.js +2 -3
- package/esm/keri/npm/src/did/webs/artifacts.js +15 -18
- package/esm/keri/npm/src/did/webs/designated-aliases.js +5 -7
- package/esm/keri/npm/src/did/webs/resolving.js +73 -56
- 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 +79 -47
- 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 -82
- package/esm/keri/npm/src/vdr/eventing.js +592 -204
- 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/{app/version.js → version.js} +2 -2
- package/package.json +5 -3
- package/types/_dnt.polyfills.d.ts +6 -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 +18 -7
- package/types/acdc/observing.d.ts.map +1 -1
- package/types/acdc/regbasing.d.ts +3 -1
- package/types/acdc/regbasing.d.ts.map +1 -1
- package/types/acdc/regengine.d.ts +9 -4
- 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 +22 -6
- package/types/acdc/registering.d.ts.map +1 -1
- package/types/acdc/registraring.d.ts +1 -1
- 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 +1 -1
- 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/{oobi-replies.d.ts → bootstrap/oobi-replies.d.ts} +1 -1
- package/types/app/bootstrap/oobi-replies.d.ts.map +1 -0
- package/types/app/{oobiery.d.ts → bootstrap/oobiery.d.ts} +98 -25
- 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} +19 -7
- 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/{stored-replies.d.ts → delivery/stored-replies.d.ts} +1 -1
- 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} +3 -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} +52 -15
- package/types/app/identity/delegating.d.ts.map +1 -0
- package/types/app/{endpoint-roleing.d.ts → identity/endpoint-roleing.d.ts} +24 -13
- package/types/app/identity/endpoint-roleing.d.ts.map +1 -0
- package/types/app/{habbing.d.ts → identity/habbing.d.ts} +73 -32
- 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/ipex-building.d.ts +30 -0
- package/types/app/ipex/ipex-building.d.ts.map +1 -0
- package/types/app/{ipex-credentialing.d.ts → ipex/ipex-credentialing.d.ts} +33 -6
- 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-node-authentication.d.ts → ipex/ipex-node-authentication.d.ts} +10 -5
- 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 -6
- 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 -40
- 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/{grouping.d.ts → multisig/grouping.d.ts} +142 -19
- 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} +4 -5
- package/types/app/notifications/notifying.d.ts.map +1 -0
- package/types/app/notifications/signaling.d.ts.map +1 -0
- package/types/app/{parsering.d.ts → protocol/parsering.d.ts} +40 -11
- 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} +4 -27
- 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} +8 -0
- 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 -5
- package/types/cli/common/context.d.ts.map +1 -0
- package/types/{app/cli → cli}/common/existing.d.ts +2 -4
- 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 +2 -0
- 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.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/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 +78 -21
- package/types/core/cues.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} +10 -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} +22 -10
- package/types/core/kel/eventing.d.ts.map +1 -0
- package/types/core/{kever-decisions.d.ts → kel/kever-decisions.d.ts} +21 -8
- package/types/core/kel/kever-decisions.d.ts.map +1 -0
- package/types/core/{kever.d.ts → kel/kever.d.ts} +2 -2
- 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} +1 -1
- package/types/core/mailbox/kram-pruning.d.ts.map +1 -0
- 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/{kram-staging.d.ts → mailbox/kram-staging.d.ts} +2 -2
- package/types/core/mailbox/kram-staging.d.ts.map +1 -0
- package/types/core/{kram-time.d.ts → mailbox/kram-time.d.ts} +2 -2
- package/types/core/mailbox/kram-time.d.ts.map +1 -0
- package/types/core/{kraming.d.ts → mailbox/kraming.d.ts} +5 -5
- 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.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/records.d.ts +1 -1
- package/types/core/records.d.ts.map +1 -1
- package/types/core/routing.d.ts +24 -4
- 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 +32 -44
- package/types/db/basing.d.ts.map +1 -1
- package/types/db/core/lmdber.d.ts +18 -13
- package/types/db/core/lmdber.d.ts.map +1 -1
- package/types/db/escrowing.d.ts +3 -1
- 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 -4
- 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/{kram-factors.d.ts → mailbox/kram-factors.d.ts} +2 -2
- package/types/db/mailbox/kram-factors.d.ts.map +1 -0
- package/types/db/{mailboxing.d.ts → mailbox/mailboxing.d.ts} +2 -2
- package/types/db/mailbox/mailboxing.d.ts.map +1 -0
- package/types/db/reger.d.ts +7 -6
- package/types/db/reger.d.ts.map +1 -1
- package/types/db/{kel-replay.d.ts → replay/kel-replay.d.ts} +1 -2
- package/types/db/replay/kel-replay.d.ts.map +1 -0
- package/types/db/{tel-replay.d.ts → replay/tel-replay.d.ts} +11 -1
- package/types/db/replay/tel-replay.d.ts.map +1 -0
- package/types/db/{witness-replay.d.ts → replay/witness-replay.d.ts} +1 -1
- package/types/db/replay/witness-replay.d.ts.map +1 -0
- package/types/db/subing.d.ts.map +1 -1
- package/types/did/keri/resolving.d.ts +1 -1
- 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 +1 -2
- package/types/did/webs/designated-aliases.d.ts.map +1 -1
- package/types/did/webs/documenting.d.ts +1 -1
- package/types/did/webs/documenting.d.ts.map +1 -1
- package/types/did/webs/resolving.d.ts +13 -9
- 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 +86 -51
- 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 -17
- package/types/vdr/credentialing.d.ts.map +1 -1
- package/types/vdr/eventing.d.ts +60 -18
- 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 +1 -1
- 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/agent-runtime.js +0 -544
- package/esm/keri/npm/src/app/cesr-egress.js +0 -294
- 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 -185
- package/esm/keri/npm/src/app/cli/index.js +0 -36
- package/esm/keri/npm/src/app/cli/init.js +0 -149
- package/esm/keri/npm/src/app/cli/interact.js +0 -72
- package/esm/keri/npm/src/app/cli/ipex.js +0 -519
- package/esm/keri/npm/src/app/cli/query.js +0 -142
- package/esm/keri/npm/src/app/cli/vc.js +0 -283
- package/esm/keri/npm/src/app/cli/verifier.js +0 -92
- package/esm/keri/npm/src/app/credential-workflows.js +0 -409
- package/esm/keri/npm/src/app/cue-runtime.js +0 -38
- package/esm/keri/npm/src/app/essr.js +0 -170
- package/esm/keri/npm/src/app/exchanging.js +0 -1001
- package/esm/keri/npm/src/app/forwarding.js +0 -936
- package/esm/keri/npm/src/app/group-members.js +0 -37
- package/esm/keri/npm/src/app/httping.js +0 -162
- package/esm/keri/npm/src/app/ipex-graph.js +0 -407
- package/esm/keri/npm/src/app/ipex-grouping.js +0 -276
- package/esm/keri/npm/src/app/ipex-v2.js +0 -438
- package/esm/keri/npm/src/app/mailbox-sse.js +0 -240
- package/esm/keri/npm/src/app/multisig-workflows.js +0 -457
- package/esm/keri/npm/src/app/querying.js +0 -775
- package/esm/keri/npm/src/app/reactor.js +0 -394
- package/esm/keri/npm/src/app/respondant.js +0 -358
- package/esm/keri/npm/src/app/runtime-services.js +0 -22
- package/esm/keri/npm/src/app/tcp-conversation.js +0 -85
- package/esm/keri/npm/src/app/tcp-egress.js +0 -251
- package/esm/keri/npm/src/app/verifier-agent.js +0 -443
- package/esm/keri/npm/src/app/witnessing.js +0 -914
- package/esm/keri/npm/src/core/index.js +0 -23
- package/esm/keri/npm/src/db/exchange-nests.js +0 -80
- package/esm/keri/npm/src/db/exchange-records.js +0 -7
- package/esm/keri/npm/src/db/payload-archive.js +0 -402
- package/esm/keri/npm/src/db/payload-store.js +0 -406
- 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 -230
- package/esm/keri/npm/src/vdr/registry-tsn.js +0 -217
- package/types/app/abortable.d.ts +0 -13
- package/types/app/abortable.d.ts.map +0 -1
- package/types/app/agent-runtime.d.ts +0 -221
- 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 -45
- package/types/app/cesr-egress.d.ts.map +0 -1
- package/types/app/cesr-http.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.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 -113
- package/types/app/credential-workflows.d.ts.map +0 -1
- package/types/app/cue-runtime.d.ts +0 -12
- package/types/app/cue-runtime.d.ts.map +0 -1
- package/types/app/delegating.d.ts.map +0 -1
- package/types/app/endpoint-roleing.d.ts.map +0 -1
- package/types/app/essr.d.ts +0 -58
- package/types/app/essr.d.ts.map +0 -1
- package/types/app/exchanging.d.ts +0 -233
- package/types/app/exchanging.d.ts.map +0 -1
- package/types/app/forwarding.d.ts +0 -352
- 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.map +0 -1
- package/types/app/habbing.d.ts.map +0 -1
- package/types/app/httping.d.ts +0 -49
- package/types/app/httping.d.ts.map +0 -1
- package/types/app/ipex-credentialing.d.ts.map +0 -1
- package/types/app/ipex-graph.d.ts +0 -49
- package/types/app/ipex-graph.d.ts.map +0 -1
- package/types/app/ipex-grouping.d.ts +0 -43
- package/types/app/ipex-grouping.d.ts.map +0 -1
- package/types/app/ipex-node-authentication.d.ts.map +0 -1
- package/types/app/ipex-v2.d.ts +0 -46
- 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 -140
- package/types/app/mailbox-director.d.ts.map +0 -1
- package/types/app/mailbox-sse.d.ts +0 -32
- 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 -47
- 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.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.map +0 -1
- package/types/app/protocol-host-policy.d.ts.map +0 -1
- package/types/app/query-replies.d.ts +0 -40
- package/types/app/query-replies.d.ts.map +0 -1
- package/types/app/querying.d.ts +0 -221
- package/types/app/querying.d.ts.map +0 -1
- package/types/app/reactor.d.ts +0 -138
- package/types/app/reactor.d.ts.map +0 -1
- package/types/app/reply-streams.d.ts +0 -20
- package/types/app/reply-streams.d.ts.map +0 -1
- package/types/app/respondant.d.ts +0 -63
- package/types/app/respondant.d.ts.map +0 -1
- package/types/app/runtime-services.d.ts +0 -26
- 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.map +0 -1
- package/types/app/socket-source.d.ts.map +0 -1
- package/types/app/stored-replies.d.ts.map +0 -1
- package/types/app/tcp-conversation.d.ts +0 -27
- package/types/app/tcp-conversation.d.ts.map +0 -1
- package/types/app/tcp-egress.d.ts +0 -49
- package/types/app/tcp-egress.d.ts.map +0 -1
- package/types/app/verifier-agent.d.ts +0 -92
- 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 -223
- package/types/app/witnessing.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-policy.d.ts.map +0 -1
- package/types/core/kram-pruning.d.ts.map +0 -1
- package/types/core/kram-signatures.d.ts.map +0 -1
- 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.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 -15
- package/types/db/exchange-nests.d.ts.map +0 -1
- package/types/db/exchange-records.d.ts +0 -33
- 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/mailboxing.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 -23
- package/types/vdr/credential-tsn.d.ts.map +0 -1
- package/types/vdr/registry-tsn.d.ts +0 -28
- 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/{challenging.js → identity/challenging.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/{signaling.d.ts → notifications/signaling.d.ts} +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}/delegate.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}/db-dump.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
|
@@ -0,0 +1,1042 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Explicitly approved IPEX Unblind, following Python's local query/reply profile.
|
|
3
|
+
* Only event openings cross this boundary. Roots, application state vocabulary,
|
|
4
|
+
* transport and final Admit remain with their existing owners.
|
|
5
|
+
*/
|
|
6
|
+
import { bytesEqual, concatBytes, Counter, Diger, Kinds, makeBlindUuid, NumberPrimitive, parseAttachmentGroup, parseBytes, SealSource, SerderACDC, unblindBlindState, Vrsn_2_0, } from "cesr-ts";
|
|
7
|
+
import { Hab } from "../app/identity/habbing.js";
|
|
8
|
+
import { IpexV2Handler } from "../app/ipex/ipex-v2.js";
|
|
9
|
+
import { isLocalGroupHab, latestGroupContribution, localGroupMember } from "../app/multisig/group-members.js";
|
|
10
|
+
import { copyAuxiliaryQuery, envelopeFromFrame, } from "../app/protocol/parsering.js";
|
|
11
|
+
import { abortable } from "../app/runtime/abortable.js";
|
|
12
|
+
import { Deck } from "../core/deck.js";
|
|
13
|
+
import { TransIdxSigGroup } from "../core/dispatch.js";
|
|
14
|
+
import { ValidationError } from "../core/errors.js";
|
|
15
|
+
import { verifyExchangeProofs, verifyQueryAttachments } from "../core/exchange/exchange-proofing.js";
|
|
16
|
+
import { Kever } from "../core/kel/kever.js";
|
|
17
|
+
import { query, reply } from "../core/protocol-eventing.js";
|
|
18
|
+
import { messagize } from "../core/protocol-serialization.js";
|
|
19
|
+
import { fetchStoredTsgs, unverifiedReplyDecision } from "../core/routing.js";
|
|
20
|
+
import { prepareNests, publishNests } from "../db/exchange/exchange-nests.js";
|
|
21
|
+
import { timestampMicros } from "../time/mod.js";
|
|
22
|
+
import { validateUpdate, verifyRegistryAnchor, vet, vetBlind, vetBound, } from "./regeventing.js";
|
|
23
|
+
import { publicOpeningAttachment } from "./registering.js";
|
|
24
|
+
/** Compare registry selections without treating JSON dictionary order as authority. */
|
|
25
|
+
function sameSelection(left, right) {
|
|
26
|
+
return Object.keys(left).length === Object.keys(right).length
|
|
27
|
+
&& Object.entries(left).every(([key, values]) => right[key]?.length === values.length && values.every((value, index) => right[key][index] === value));
|
|
28
|
+
}
|
|
29
|
+
/** Decode exactly one complete wire message, without dispatch or database effects. */
|
|
30
|
+
function parsed(raw) {
|
|
31
|
+
const frames = parseBytes(concatBytes(Counter.makeGVC(Vrsn_2_0), raw));
|
|
32
|
+
if (frames.length !== 1)
|
|
33
|
+
throw new ValidationError("Expected exactly one Unblind message");
|
|
34
|
+
return envelopeFromFrame(frames[0]);
|
|
35
|
+
}
|
|
36
|
+
/** Source evidence is accepted only from the public chain, never raw escrow bodies. */
|
|
37
|
+
function ordinal(event) {
|
|
38
|
+
const sn = BigInt(`0x${event.sad.n}`);
|
|
39
|
+
if (sn > BigInt(Number.MAX_SAFE_INTEGER))
|
|
40
|
+
throw new ValidationError("Registry ordinal exceeds storage range");
|
|
41
|
+
return Number(sn);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* One presentation's explicit proof-release consent. Inject as qvy
|
|
45
|
+
* and register Route on the habitat's existing Revery Router. Wire intake cannot
|
|
46
|
+
* approve work; a fresh owner cannot resume an unfinished operation. Group members
|
|
47
|
+
* sign exact proposals under that approval. Ordinary thresholds elect delivery
|
|
48
|
+
* from the completed aggregate; neither contribution nor delivery requires a root.
|
|
49
|
+
*/
|
|
50
|
+
export class Unblind {
|
|
51
|
+
/** Bind the exact Grant verifier's store and an explicit ordinary-state vocabulary. */
|
|
52
|
+
constructor({ hab, exc, registry, states, rvy = hab.rvy, now = Date.now }) {
|
|
53
|
+
Object.defineProperty(this, "resource", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: Unblind.Route
|
|
58
|
+
});
|
|
59
|
+
Object.defineProperty(this, "outgoing", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: new Deck()
|
|
64
|
+
});
|
|
65
|
+
Object.defineProperty(this, "pendingQueries", {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
configurable: true,
|
|
68
|
+
writable: true,
|
|
69
|
+
value: new Map()
|
|
70
|
+
});
|
|
71
|
+
Object.defineProperty(this, "now", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: void 0
|
|
76
|
+
});
|
|
77
|
+
Object.defineProperty(this, "operations", {
|
|
78
|
+
enumerable: true,
|
|
79
|
+
configurable: true,
|
|
80
|
+
writable: true,
|
|
81
|
+
value: new Map()
|
|
82
|
+
});
|
|
83
|
+
Object.defineProperty(this, "hab", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
configurable: true,
|
|
86
|
+
writable: true,
|
|
87
|
+
value: void 0
|
|
88
|
+
});
|
|
89
|
+
Object.defineProperty(this, "exc", {
|
|
90
|
+
enumerable: true,
|
|
91
|
+
configurable: true,
|
|
92
|
+
writable: true,
|
|
93
|
+
value: void 0
|
|
94
|
+
});
|
|
95
|
+
Object.defineProperty(this, "rvy", {
|
|
96
|
+
enumerable: true,
|
|
97
|
+
configurable: true,
|
|
98
|
+
writable: true,
|
|
99
|
+
value: void 0
|
|
100
|
+
});
|
|
101
|
+
Object.defineProperty(this, "registry", {
|
|
102
|
+
enumerable: true,
|
|
103
|
+
configurable: true,
|
|
104
|
+
writable: true,
|
|
105
|
+
value: void 0
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(this, "states", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
writable: true,
|
|
111
|
+
value: void 0
|
|
112
|
+
});
|
|
113
|
+
Object.defineProperty(this, "group", {
|
|
114
|
+
enumerable: true,
|
|
115
|
+
configurable: true,
|
|
116
|
+
writable: true,
|
|
117
|
+
value: void 0
|
|
118
|
+
});
|
|
119
|
+
if (!(hab instanceof Hab) || hab.db !== exc.hby.db || registry.db !== hab.db || rvy.db !== hab.db
|
|
120
|
+
|| exc.hby.habs.get(hab.pre) !== hab) {
|
|
121
|
+
throw new ValidationError("Unblind requires a local signing habitat");
|
|
122
|
+
}
|
|
123
|
+
this.group = isLocalGroupHab(exc.hby, hab);
|
|
124
|
+
if (this.group)
|
|
125
|
+
localGroupMember(exc.hby, hab.pre);
|
|
126
|
+
if (!Array.isArray(states) || states.some((state) => typeof state !== "string")) {
|
|
127
|
+
throw new ValidationError("Unblind requires an explicit sequence of state strings");
|
|
128
|
+
}
|
|
129
|
+
this.now = now;
|
|
130
|
+
this.hab = hab;
|
|
131
|
+
this.exc = exc;
|
|
132
|
+
this.rvy = rvy;
|
|
133
|
+
this.registry = registry;
|
|
134
|
+
this.states = [...states];
|
|
135
|
+
}
|
|
136
|
+
/** Freeze one authenticated live Grant's exact bodies, parties and authorized registry scope. */
|
|
137
|
+
approve(grant) {
|
|
138
|
+
this.pruneQueries();
|
|
139
|
+
const input = this.exc.retainedInput(grant);
|
|
140
|
+
if (!input)
|
|
141
|
+
throw new ValidationError("Unblind requires an authenticated retained Grant");
|
|
142
|
+
const message = input.serder, sender = message.pre, recipient = message.sad.ri;
|
|
143
|
+
const xid = message.ilk === "xip" ? message.said : message.sad.x;
|
|
144
|
+
if (typeof xid !== "string" || !sender || typeof recipient !== "string" || sender === recipient
|
|
145
|
+
|| ![sender, recipient].includes(this.hab.pre))
|
|
146
|
+
throw new ValidationError("Local habitat is not a presentation party");
|
|
147
|
+
const handler = this.exc.handlerFor(message);
|
|
148
|
+
if (!(handler instanceof IpexV2Handler) || handler.registry !== this.registry.store) {
|
|
149
|
+
throw new ValidationError("Unblind must use the selected Grant verifier's registry store");
|
|
150
|
+
}
|
|
151
|
+
const existing = this.operations.get(xid);
|
|
152
|
+
if (existing) {
|
|
153
|
+
if (existing.grant !== grant)
|
|
154
|
+
throw new ValidationError("Another Grant is selected for this transaction");
|
|
155
|
+
this.live(existing);
|
|
156
|
+
return xid;
|
|
157
|
+
}
|
|
158
|
+
const context = this.exc.presentationContext(grant, { xid, sender, recipient });
|
|
159
|
+
if (!context)
|
|
160
|
+
throw new ValidationError("Presentation is unavailable, terminated or expired");
|
|
161
|
+
this.operations.set(xid, {
|
|
162
|
+
xid,
|
|
163
|
+
grant,
|
|
164
|
+
sender,
|
|
165
|
+
recipient,
|
|
166
|
+
raw: message.raw.slice(),
|
|
167
|
+
bodies: context.nests.map((nest) => nest.body.raw.slice()),
|
|
168
|
+
scope: new Map([...context.registries].map(([regid, nodes]) => [regid, [...nodes]])),
|
|
169
|
+
query: null,
|
|
170
|
+
reply: null,
|
|
171
|
+
requested: null,
|
|
172
|
+
selected: null,
|
|
173
|
+
openings: new Map(),
|
|
174
|
+
requestedByPeer: false,
|
|
175
|
+
received: false,
|
|
176
|
+
abandoned: false,
|
|
177
|
+
proposal: null,
|
|
178
|
+
contribution: null,
|
|
179
|
+
});
|
|
180
|
+
this.replayQuery(xid);
|
|
181
|
+
return xid;
|
|
182
|
+
}
|
|
183
|
+
/** Freeze a signed disclosee query over the missing accepted public suffix. */
|
|
184
|
+
start(grant) {
|
|
185
|
+
const op = this.operation(this.approve(grant));
|
|
186
|
+
if (this.hab.pre !== op.recipient)
|
|
187
|
+
throw new ValidationError("Only the disclosee starts Unblind");
|
|
188
|
+
if (!op.query && !op.contribution) {
|
|
189
|
+
const { requested, children } = this.request(op);
|
|
190
|
+
const message = query(Unblind.Route, { x: op.xid, re: requested }, {
|
|
191
|
+
pre: this.hab.pre,
|
|
192
|
+
replyRoute: Unblind.Route,
|
|
193
|
+
pvrsn: Vrsn_2_0,
|
|
194
|
+
kind: Kinds.json,
|
|
195
|
+
});
|
|
196
|
+
const signed = this.signed(message, children);
|
|
197
|
+
op.requested = requested;
|
|
198
|
+
if (this.group) {
|
|
199
|
+
op.proposal = message.raw.slice();
|
|
200
|
+
op.contribution = signed;
|
|
201
|
+
this.outgoing.push({ kin: "sign", dest: this.hab.pre, msg: signed.slice() });
|
|
202
|
+
}
|
|
203
|
+
else
|
|
204
|
+
op.query = signed;
|
|
205
|
+
}
|
|
206
|
+
this.current(op);
|
|
207
|
+
return (op.query ?? op.contribution).slice();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Re-sign this disclosee's started individual query for delivery now.
|
|
211
|
+
*
|
|
212
|
+
* KERIpy `Unblind.requery` (kentbull/keripy#159): a queued query can age past
|
|
213
|
+
* the discloser's KRAM timeliness window before transport begins. The renewal
|
|
214
|
+
* keeps the approved Grant, the frozen requested events and their nested
|
|
215
|
+
* public evidence; only the query's own `dt`, SAID and signatures change, and
|
|
216
|
+
* it becomes the outstanding query. A newer registry head still needs a new
|
|
217
|
+
* operation, and the Grant's deadline is never extended. Groups cannot renew here.
|
|
218
|
+
*/
|
|
219
|
+
requery(xid) {
|
|
220
|
+
const op = this.operation(xid);
|
|
221
|
+
if (this.group)
|
|
222
|
+
throw new ValidationError("one group member cannot renew a threshold unblind query");
|
|
223
|
+
if (this.hab.pre !== op.recipient || !op.query)
|
|
224
|
+
throw new ValidationError("unblind has no started disclosee query");
|
|
225
|
+
if (op.received)
|
|
226
|
+
throw new ValidationError("unblind already received its authenticated reply");
|
|
227
|
+
this.current(op);
|
|
228
|
+
const { requested, children } = this.request(op);
|
|
229
|
+
if (!op.requested || !sameSelection(requested, op.requested)) {
|
|
230
|
+
throw new ValidationError("unblind request differs from the approved query");
|
|
231
|
+
}
|
|
232
|
+
const message = query(Unblind.Route, { x: op.xid, re: requested }, {
|
|
233
|
+
pre: this.hab.pre,
|
|
234
|
+
replyRoute: Unblind.Route,
|
|
235
|
+
pvrsn: Vrsn_2_0,
|
|
236
|
+
kind: Kinds.json,
|
|
237
|
+
});
|
|
238
|
+
op.query = this.signed(message, children);
|
|
239
|
+
return op.query.slice();
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Contribute to one exact group proposal under the existing local approval.
|
|
243
|
+
* Validate every member signature and the public suffix/minimum openings before
|
|
244
|
+
* signing. A rootless member signs the supplied proof, never derives a root.
|
|
245
|
+
*/
|
|
246
|
+
contribute(xid, proposal) {
|
|
247
|
+
if (!this.group)
|
|
248
|
+
throw new ValidationError("Unblind contribution requires a local group member");
|
|
249
|
+
const envelope = parsed(proposal), message = envelope.serder, querying = message.ilk === "qry";
|
|
250
|
+
if (!querying && message.ilk !== "rpy")
|
|
251
|
+
throw new ValidationError("Expected a signed Unblind query or reply");
|
|
252
|
+
this.attachments(envelope, querying ? "query" : "reply");
|
|
253
|
+
if (envelope.sigers.length || envelope.cigars.length) {
|
|
254
|
+
throw new ValidationError("Group proposal requires named group signing factors");
|
|
255
|
+
}
|
|
256
|
+
const { op, selected, nests } = this.preflight(message, querying ? "q" : "a", querying ? "recipient" : "sender", true);
|
|
257
|
+
if (op.xid !== xid || querying && message.sad.rr !== Unblind.Route) {
|
|
258
|
+
throw new ValidationError("Proposal differs from the approved Unblind transaction");
|
|
259
|
+
}
|
|
260
|
+
if (!querying && !op.requestedByPeer) {
|
|
261
|
+
throw new ValidationError("Group reply requires its authenticated peer query");
|
|
262
|
+
}
|
|
263
|
+
this.current(op);
|
|
264
|
+
if (op.proposal && !bytesEqual(op.proposal, message.raw)) {
|
|
265
|
+
throw new ValidationError("Unblind proposal body is frozen");
|
|
266
|
+
}
|
|
267
|
+
const kever = this.hab.kever;
|
|
268
|
+
const groups = [
|
|
269
|
+
...envelope.tsgs,
|
|
270
|
+
...envelope.ssgs.map(group => new TransIdxSigGroup(group.prefixer, NumberPrimitive.fromNum(BigInt(kever.lastEst.s)), new Diger({ qb64: kever.lastEst.d }), group.sigers)),
|
|
271
|
+
];
|
|
272
|
+
if (!groups.length)
|
|
273
|
+
throw new ValidationError("Proposal lacks a group member signature");
|
|
274
|
+
for (const group of groups) {
|
|
275
|
+
if (group.pre !== this.hab.pre || group.sn !== BigInt(kever.lastEst.s) || group.said !== kever.lastEst.d) {
|
|
276
|
+
throw new ValidationError("Proposal names different group establishment keys");
|
|
277
|
+
}
|
|
278
|
+
const verified = Kever.verifyIndexedSignatures(message.raw, group.sigers, kever.verfers);
|
|
279
|
+
if (!verified.sigers.length || verified.sigers.length !== group.sigers.length) {
|
|
280
|
+
throw new ValidationError("Proposal lacks valid member contributions");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const extra = querying
|
|
284
|
+
? this.queryEvidence(op, selected, envelope.nests)
|
|
285
|
+
: envelope.attachmentGroups.filter(group => ["BlindedStateQuadruples", "BoundStateSextuples"]
|
|
286
|
+
.includes(group.name.replace(/^Big/, ""))).map(group => group.raw);
|
|
287
|
+
if (!querying) {
|
|
288
|
+
const openings = this.replyOpenings(op, selected, nests, [...envelope.bsqs, ...envelope.bsss]);
|
|
289
|
+
const minimum = this.minimum(op, nests, event => this.opening(openings, event));
|
|
290
|
+
if (!sameSelection(selected, minimum.selected)) {
|
|
291
|
+
throw new ValidationError("Reply is not the minimum current suffix");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (op.contribution) {
|
|
295
|
+
const previous = parsed(op.contribution);
|
|
296
|
+
const old = querying
|
|
297
|
+
? this.publicEvents(previous.nests)
|
|
298
|
+
: previous.attachmentGroups.filter(group => ["BlindedStateQuadruples", "BoundStateSextuples"]
|
|
299
|
+
.includes(group.name.replace(/^Big/, ""))).map(group => group.raw);
|
|
300
|
+
if (old.length !== extra.length || old.some((wire, index) => !bytesEqual(wire, extra[index]))) {
|
|
301
|
+
throw new ValidationError("Unblind proposal evidence is frozen");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
const signed = this.signed(message, extra);
|
|
306
|
+
op.proposal = message.raw.slice();
|
|
307
|
+
op.contribution = signed;
|
|
308
|
+
if (querying)
|
|
309
|
+
op.requested = selected;
|
|
310
|
+
}
|
|
311
|
+
return op.contribution.slice();
|
|
312
|
+
}
|
|
313
|
+
/** Authenticate the full peer threshold before public evidence intake or proof release. */
|
|
314
|
+
processQuery(envelope) {
|
|
315
|
+
this.pruneQueries();
|
|
316
|
+
try {
|
|
317
|
+
const { serder } = envelope;
|
|
318
|
+
if (serder.ilk !== "qry" || serder.sad.rr !== Unblind.Route)
|
|
319
|
+
throw new ValidationError("Invalid Unblind query");
|
|
320
|
+
this.attachments(envelope, "query");
|
|
321
|
+
const own = this.group && serder.pre === this.hab.pre;
|
|
322
|
+
const xid = serder.sad?.q?.x;
|
|
323
|
+
if (!own && typeof xid === "string" && !this.operations.has(xid)) {
|
|
324
|
+
this.retainQuery(envelope);
|
|
325
|
+
return { kind: "accept" };
|
|
326
|
+
}
|
|
327
|
+
const { op, selected } = this.preflight(serder, "q", own ? "recipient" : "sender", own);
|
|
328
|
+
if (own && (!op.proposal || !bytesEqual(op.proposal, serder.raw))) {
|
|
329
|
+
throw new ValidationError("Own Unblind query lacks its exact locally approved proposal");
|
|
330
|
+
}
|
|
331
|
+
if (!verifyQueryAttachments(this.hab.db, envelope))
|
|
332
|
+
return { kind: "drop", reason: "missingAuthentication" };
|
|
333
|
+
if (op.requested && !sameSelection(op.requested, selected)) {
|
|
334
|
+
throw new ValidationError("Conflicting Unblind request");
|
|
335
|
+
}
|
|
336
|
+
if (own) {
|
|
337
|
+
const extra = this.queryEvidence(op, selected, envelope.nests);
|
|
338
|
+
this.current(op);
|
|
339
|
+
const kever = this.hab.kever;
|
|
340
|
+
let groups = envelope.tsgs.filter(group => group.pre === this.hab.pre);
|
|
341
|
+
if (!groups.length) {
|
|
342
|
+
const sigers = [
|
|
343
|
+
...envelope.sigers,
|
|
344
|
+
...envelope.ssgs.filter(group => group.pre === this.hab.pre).flatMap(group => group.sigers),
|
|
345
|
+
];
|
|
346
|
+
groups = [
|
|
347
|
+
new TransIdxSigGroup(kever.prefixer, NumberPrimitive.fromNum(BigInt(kever.lastEst.s)), new Diger({ qb64: kever.lastEst.d }), sigers),
|
|
348
|
+
];
|
|
349
|
+
}
|
|
350
|
+
this.groupMessage(op, "query", serder, groups, extra);
|
|
351
|
+
return { kind: "accept" };
|
|
352
|
+
}
|
|
353
|
+
this.receiveEvents(selected, envelope.nests);
|
|
354
|
+
this.live(op);
|
|
355
|
+
op.requested = selected;
|
|
356
|
+
op.requestedByPeer = true;
|
|
357
|
+
if (!this.group)
|
|
358
|
+
this.respond(op.xid);
|
|
359
|
+
return { kind: "accept" };
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
if (error instanceof ValidationError)
|
|
363
|
+
return { kind: "drop", reason: "invalidQuery" };
|
|
364
|
+
throw error;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/** Schedule responder work only after the selected live operation authenticates its peer query. */
|
|
368
|
+
hasPeerQuery(xid) {
|
|
369
|
+
const op = this.operation(xid);
|
|
370
|
+
this.live(op);
|
|
371
|
+
this.current(op);
|
|
372
|
+
if (this.hab.pre !== op.sender)
|
|
373
|
+
throw new ValidationError("Peer query readiness requires the selected discloser");
|
|
374
|
+
return op.requestedByPeer;
|
|
375
|
+
}
|
|
376
|
+
/** Retry a previously authenticated request locally when held proofs become available. */
|
|
377
|
+
respond(xid) {
|
|
378
|
+
const op = this.operation(xid), { nests } = this.live(op);
|
|
379
|
+
if (this.hab.pre !== op.sender || !op.requestedByPeer)
|
|
380
|
+
throw new ValidationError("No authenticated peer request");
|
|
381
|
+
this.current(op);
|
|
382
|
+
if (this.group && op.contribution)
|
|
383
|
+
return (op.reply ?? op.contribution).slice();
|
|
384
|
+
if (!op.reply) {
|
|
385
|
+
const { selected, openings } = this.minimum(op, nests, (event) => this.held(op, event, nests));
|
|
386
|
+
const message = reply(Unblind.Route, { x: op.xid, re: selected }, {
|
|
387
|
+
pre: this.hab.pre,
|
|
388
|
+
pvrsn: Vrsn_2_0,
|
|
389
|
+
kind: Kinds.json,
|
|
390
|
+
});
|
|
391
|
+
const signed = this.signed(message, openings.map(publicOpeningAttachment));
|
|
392
|
+
if (this.group) {
|
|
393
|
+
op.proposal = message.raw.slice();
|
|
394
|
+
op.contribution = signed;
|
|
395
|
+
this.outgoing.push({ kin: "sign", dest: this.hab.pre, msg: signed.slice() });
|
|
396
|
+
return signed.slice();
|
|
397
|
+
}
|
|
398
|
+
op.reply = signed;
|
|
399
|
+
}
|
|
400
|
+
this.outgoing.push({ kin: "reply", dest: op.recipient, msg: op.reply.slice() });
|
|
401
|
+
return op.reply.slice();
|
|
402
|
+
}
|
|
403
|
+
/** Independently vet openings before caching them; Revery owns signature threshold and BADA. */
|
|
404
|
+
processReply({ serder, diger, route, cigars = [], tsgs = [], attachments }) {
|
|
405
|
+
try {
|
|
406
|
+
if (serder.ilk !== "rpy" || route !== Unblind.Route)
|
|
407
|
+
throw new ValidationError("Invalid Unblind reply");
|
|
408
|
+
// Revery's proof escrow can retry without attachments after independently
|
|
409
|
+
// checked openings entered this process-local operation on initial intake.
|
|
410
|
+
if (attachments) {
|
|
411
|
+
if (!bytesEqual(attachments.serder.raw, serder.raw)) {
|
|
412
|
+
throw new ValidationError("Reply attachment body mismatch");
|
|
413
|
+
}
|
|
414
|
+
this.attachments(attachments, "reply");
|
|
415
|
+
}
|
|
416
|
+
const own = this.group && serder.pre === this.hab.pre;
|
|
417
|
+
const { op, selected, nests } = this.preflight(serder, "a", own ? "sender" : "recipient", own);
|
|
418
|
+
if (own && (!op.proposal || !bytesEqual(op.proposal, serder.raw) || !op.requestedByPeer)) {
|
|
419
|
+
throw new ValidationError("Own Unblind reply lacks its exact locally approved proposal");
|
|
420
|
+
}
|
|
421
|
+
if (!own && !op.query)
|
|
422
|
+
throw new ValidationError("Reply has no outstanding Unblind query");
|
|
423
|
+
this.current(op);
|
|
424
|
+
const verified = this.replyOpenings(op, selected, nests, [
|
|
425
|
+
...attachments?.bsqs ?? [],
|
|
426
|
+
...attachments?.bsss ?? [],
|
|
427
|
+
]);
|
|
428
|
+
for (const [said, opening] of verified)
|
|
429
|
+
op.openings.set(said, opening);
|
|
430
|
+
const minimum = this.minimum(op, nests, (event) => this.opening(op.openings, event));
|
|
431
|
+
if (own) {
|
|
432
|
+
if (!sameSelection(selected, minimum.selected)) {
|
|
433
|
+
throw new ValidationError("Reply is not the minimum current suffix");
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
if (Object.entries(minimum.selected).some(([regid, saids]) => saids.some(said => !selected[regid]?.includes(said))))
|
|
438
|
+
throw new ValidationError("Reply does not cover the required current suffix");
|
|
439
|
+
for (const said of Object.values(selected).flat())
|
|
440
|
+
this.opening(op.openings, this.registry.store.event(said));
|
|
441
|
+
}
|
|
442
|
+
const decision = this.rvy.acceptReply({ serder, saider: diger, route, aid: op.sender, cigars, tsgs });
|
|
443
|
+
if (decision.kind !== "accept")
|
|
444
|
+
return decision;
|
|
445
|
+
op.selected = selected;
|
|
446
|
+
if (own) {
|
|
447
|
+
this.groupMessage(op, "reply", serder, fetchStoredTsgs(this.hab.db, diger.qb64).filter(group => group.pre === this.hab.pre), minimum.openings.map(publicOpeningAttachment));
|
|
448
|
+
return decision;
|
|
449
|
+
}
|
|
450
|
+
op.received = true;
|
|
451
|
+
return decision;
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
if (error instanceof ValidationError)
|
|
455
|
+
return unverifiedReplyDecision(error.message);
|
|
456
|
+
throw error;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/** Authenticated reply readiness only: neither credential-state acceptance nor Admit. */
|
|
460
|
+
complete(xid) {
|
|
461
|
+
const op = this.operation(xid);
|
|
462
|
+
this.live(op);
|
|
463
|
+
this.current(op);
|
|
464
|
+
return this.group && this.hab.pre === op.sender ? op.reply !== null : op.received;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Return the verified openings an authenticated reply selected.
|
|
468
|
+
*
|
|
469
|
+
* KERIpy `Unblind.openings` (kentbull/keripy#156): a read-only accessor for a
|
|
470
|
+
* group member forwarding the completed reply, with its proofs, to the other
|
|
471
|
+
* members. It requires the same readiness as `complete` (local approval, live
|
|
472
|
+
* original Grant, an authenticated reply or frozen own group reply). Each
|
|
473
|
+
* opening was checked against its accepted event and the approved disclosure
|
|
474
|
+
* when the reply arrived. It is not a credential-state verdict and authorizes
|
|
475
|
+
* neither Admit nor retention; `finish` owns that.
|
|
476
|
+
*
|
|
477
|
+
* @returns registry event SAID to opening, in the reply's selected order; a copy.
|
|
478
|
+
*/
|
|
479
|
+
openings(xid) {
|
|
480
|
+
if (!this.complete(xid))
|
|
481
|
+
throw new ValidationError("unblind reply has not been authenticated and verified");
|
|
482
|
+
const op = this.operation(xid);
|
|
483
|
+
const openings = new Map();
|
|
484
|
+
for (const said of Object.values(op.selected ?? {}).flat()) {
|
|
485
|
+
const opening = op.openings.get(said);
|
|
486
|
+
if (!opening)
|
|
487
|
+
throw new ValidationError("unblind reply has not been authenticated and verified");
|
|
488
|
+
openings.set(said, opening);
|
|
489
|
+
}
|
|
490
|
+
return openings;
|
|
491
|
+
}
|
|
492
|
+
/** Retry this exact Grant, or atomically update only its live accepted proof view. */
|
|
493
|
+
*finish(xid) {
|
|
494
|
+
const op = this.operation(xid), { nests } = this.live(op), db = this.hab.db;
|
|
495
|
+
this.current(op);
|
|
496
|
+
if (this.hab.pre === op.sender) {
|
|
497
|
+
if (!op.requestedByPeer || !op.reply)
|
|
498
|
+
throw new ValidationError("Responder requires its completed signed reply");
|
|
499
|
+
const frame = parsed(op.reply);
|
|
500
|
+
this.attachments(frame, "reply");
|
|
501
|
+
const { selected } = this.preflight(frame.serder, "a", "sender", true);
|
|
502
|
+
const proof = verifyExchangeProofs(db, frame.serder, { tsgs: frame.tsgs, cigars: frame.cigars });
|
|
503
|
+
if (proof.invalid || proof.missing.length || !(proof.tsgs.some((group) => group.pre === op.sender)
|
|
504
|
+
|| proof.cigars.some((cigar) => cigar.verfer?.qb64 === op.sender))) {
|
|
505
|
+
throw new ValidationError("Responder reply lacks its full signature threshold");
|
|
506
|
+
}
|
|
507
|
+
const openings = this.replyOpenings(op, selected, nests, [...frame.bsqs, ...frame.bsss]);
|
|
508
|
+
if (!op.selected || !sameSelection(op.selected, selected)) {
|
|
509
|
+
const minimum = this.minimum(op, nests, (event) => this.opening(openings, event));
|
|
510
|
+
if (!sameSelection(selected, minimum.selected)) {
|
|
511
|
+
throw new ValidationError("Reply is not the minimum current suffix");
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
op.selected = selected;
|
|
515
|
+
op.openings = openings;
|
|
516
|
+
}
|
|
517
|
+
else if (!op.received)
|
|
518
|
+
throw new ValidationError("Unblind reply has not been authenticated and verified");
|
|
519
|
+
const accepted = this.exc.complete(op.grant), snapshot = db.enst.get([op.grant]);
|
|
520
|
+
for (const nest of nests) {
|
|
521
|
+
const evidence = envelopeFromFrame(nest), present = new Set([...evidence.bsqs, ...evidence.bsss].map((v) => v.d.nonce));
|
|
522
|
+
for (const said of Object.values(op.selected).flat()) {
|
|
523
|
+
const event = this.registry.store.event(said), opening = this.opening(op.openings, event);
|
|
524
|
+
if (event.sad.rd === nest.body.ked?.rd && (!opening.td.nonce || opening.td.nonce === nest.body.said)
|
|
525
|
+
&& !present.has(opening.d.nonce)) {
|
|
526
|
+
nest.attachments.push(parseAttachmentGroup(publicOpeningAttachment(opening), Vrsn_2_0, "txt").group);
|
|
527
|
+
present.add(opening.d.nonce);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
if (!accepted) {
|
|
532
|
+
const input = this.exc.retainedInput(op.grant, { pending: true });
|
|
533
|
+
if (!input)
|
|
534
|
+
throw new ValidationError("Selected pending Grant is no longer live");
|
|
535
|
+
return yield* this.exc.acceptPendingGrantProof({ ...input, nests });
|
|
536
|
+
}
|
|
537
|
+
// Serialization may suspend; repeat all authority and snapshot checks inside
|
|
538
|
+
// the single writer. This does not rewrite another Grant or any Admit.
|
|
539
|
+
const wires = yield* abortable((signal) => prepareNests(nests, signal));
|
|
540
|
+
const result = db.env.transactionSync(() => {
|
|
541
|
+
this.live(op);
|
|
542
|
+
this.current(op);
|
|
543
|
+
const retained = db.enst.get([op.grant]);
|
|
544
|
+
if (retained.length !== snapshot.length || retained.some((raw, index) => raw !== snapshot[index])) {
|
|
545
|
+
throw new ValidationError("Approved presentation evidence changed");
|
|
546
|
+
}
|
|
547
|
+
const verified = this.exc.verifyGrantProofs(op.grant, nests);
|
|
548
|
+
if (typeof verified !== "object" || verified.kind !== "accept") {
|
|
549
|
+
return { kind: "reject", said: op.grant, reason: "Updated presentation proofs did not verify" };
|
|
550
|
+
}
|
|
551
|
+
publishNests(db, op.grant, wires);
|
|
552
|
+
for (const [node, record] of verified.registryStates)
|
|
553
|
+
db.exrs.pin([op.grant, node], record);
|
|
554
|
+
return { kind: "accept", said: op.grant };
|
|
555
|
+
});
|
|
556
|
+
yield* abortable(async () => {
|
|
557
|
+
await db.env.flushed;
|
|
558
|
+
});
|
|
559
|
+
return result;
|
|
560
|
+
}
|
|
561
|
+
/** Discard approved work and unsent replies; delivered bytes remain caller-owned. */
|
|
562
|
+
abandon(xid) {
|
|
563
|
+
const retained = this.pendingQueries.delete(xid);
|
|
564
|
+
if (retained && !this.operations.has(xid))
|
|
565
|
+
return;
|
|
566
|
+
const op = this.operation(xid);
|
|
567
|
+
const keep = [...this.outgoing].filter(item => ![op.query, op.reply, op.contribution]
|
|
568
|
+
.some(wire => wire && bytesEqual(item.msg, wire)));
|
|
569
|
+
this.outgoing.clear();
|
|
570
|
+
this.outgoing.extend(keep);
|
|
571
|
+
op.query = null;
|
|
572
|
+
op.reply = null;
|
|
573
|
+
op.proposal = null;
|
|
574
|
+
op.contribution = null;
|
|
575
|
+
op.openings.clear();
|
|
576
|
+
op.abandoned = true;
|
|
577
|
+
}
|
|
578
|
+
/** Select the exact missing public suffix without signing or changing registry state. */
|
|
579
|
+
request(op) {
|
|
580
|
+
const nests = this.live(op).nests, carried = this.carried(op, nests);
|
|
581
|
+
const requested = {}, children = [];
|
|
582
|
+
for (const regid of op.scope.keys()) {
|
|
583
|
+
const events = this.events(regid);
|
|
584
|
+
let missing = false, start = 0;
|
|
585
|
+
for (let index = events.length - 1; index >= 0; index--) {
|
|
586
|
+
const opening = carried.get(events[index].said);
|
|
587
|
+
if (!opening)
|
|
588
|
+
missing = true;
|
|
589
|
+
else if (this.checkOpening(op, events[index], opening, nests)) {
|
|
590
|
+
start = index + 1;
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
if (!missing)
|
|
595
|
+
continue;
|
|
596
|
+
requested[regid] = [];
|
|
597
|
+
for (const event of events.slice(start)) {
|
|
598
|
+
const anchor = this.registry.store.anchor(event.said);
|
|
599
|
+
if (!anchor)
|
|
600
|
+
throw new ValidationError("Requested event lacks accepted source evidence");
|
|
601
|
+
requested[regid].push(event.said);
|
|
602
|
+
children.push(messagize(event, Counter.enclose({
|
|
603
|
+
code: "SealSourceCouples",
|
|
604
|
+
version: Vrsn_2_0,
|
|
605
|
+
qb64: SealSource.qb64b({ s: NumberPrimitive.fromNum(anchor[0].num), d: anchor[1] }),
|
|
606
|
+
}), { nested: true, gvrsn: Vrsn_2_0 }));
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
if (!Object.keys(requested).length)
|
|
610
|
+
throw new ValidationError("Grant already carries the current openings");
|
|
611
|
+
return { requested, children };
|
|
612
|
+
}
|
|
613
|
+
/** Release all process-local approvals, opening references and retry bytes without changing stores. */
|
|
614
|
+
close() {
|
|
615
|
+
for (const xid of this.operations.keys())
|
|
616
|
+
this.abandon(xid);
|
|
617
|
+
this.operations.clear();
|
|
618
|
+
this.pendingQueries.clear();
|
|
619
|
+
this.outgoing.clear();
|
|
620
|
+
}
|
|
621
|
+
/** Hold one authenticated public suffix for explicit release consent; never import events here. */
|
|
622
|
+
retainQuery(envelope) {
|
|
623
|
+
const query = envelope.serder, data = this.parameters(query, "q");
|
|
624
|
+
if (!verifyQueryAttachments(this.hab.db, envelope))
|
|
625
|
+
throw new ValidationError("Unauthenticated Unblind query");
|
|
626
|
+
const candidates = [...this.hab.db.tmsc.getTopItemIter([this.hab.pre, data.x])]
|
|
627
|
+
.map(([key]) => this.hab.db.exns.get([key[2]]) ?? this.hab.db.epse.get([key[2]]))
|
|
628
|
+
.filter(grant => grant && grant.pre === this.hab.pre && grant.sad.ri === query.pre
|
|
629
|
+
&& this.exc.presentationContext(grant.said, { xid: data.x, sender: this.hab.pre, recipient: query.pre }));
|
|
630
|
+
if (candidates.length !== 1)
|
|
631
|
+
throw new ValidationError("Unblind query has no unique authenticated Grant");
|
|
632
|
+
const grant = candidates[0];
|
|
633
|
+
const context = this.exc.presentationContext(grant.said, {
|
|
634
|
+
xid: data.x,
|
|
635
|
+
sender: this.hab.pre,
|
|
636
|
+
recipient: query.pre,
|
|
637
|
+
});
|
|
638
|
+
const selected = this.selection(data.re, context.registries, "q");
|
|
639
|
+
this.validateEvents(selected, envelope.nests);
|
|
640
|
+
const expires = this.retainUntil(envelope, grant);
|
|
641
|
+
const prior = this.pendingQueries.get(data.x);
|
|
642
|
+
if (prior && !bytesEqual(prior.envelope.serder.raw, query.raw)) {
|
|
643
|
+
throw new ValidationError("Conflicting Unblind query");
|
|
644
|
+
}
|
|
645
|
+
if (!prior) {
|
|
646
|
+
this.pendingQueries.set(data.x, { envelope: copyAuxiliaryQuery(envelope), expires, grant: grant.said });
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
/** Expired evidence cannot survive another owner interaction. */
|
|
650
|
+
pruneQueries() {
|
|
651
|
+
const now = BigInt(this.now()) * 1000n;
|
|
652
|
+
for (const [xid, query] of this.pendingQueries)
|
|
653
|
+
if (now >= query.expires)
|
|
654
|
+
this.pendingQueries.delete(xid);
|
|
655
|
+
return now;
|
|
656
|
+
}
|
|
657
|
+
/** Consume the first authenticated request only after explicit approval; never renew either clock. */
|
|
658
|
+
replayQuery(xid) {
|
|
659
|
+
const pending = this.pendingQueries.get(xid);
|
|
660
|
+
this.pendingQueries.delete(xid);
|
|
661
|
+
if (pending && pending.grant === this.operations.get(xid)?.grant
|
|
662
|
+
&& BigInt(this.now()) * 1000n < pending.expires)
|
|
663
|
+
this.processQuery(pending.envelope);
|
|
664
|
+
}
|
|
665
|
+
/** Bound process-local public evidence by the original query and accepted Grant lifetimes. */
|
|
666
|
+
retainUntil(envelope, grant) {
|
|
667
|
+
const now = this.pruneQueries();
|
|
668
|
+
const cache = this.hab.db.msgc.get([envelope.serder.pre, envelope.serder.said]);
|
|
669
|
+
const messageTime = cache && timestampMicros(cache.mdt);
|
|
670
|
+
const grantTime = timestampMicros(this.exc.exchangeDeadline(grant) ?? undefined);
|
|
671
|
+
if (!cache || this.hab.db.pmkm.get([envelope.serder.pre, envelope.serder.said]) || messageTime === null
|
|
672
|
+
|| messageTime === undefined || grantTime === null
|
|
673
|
+
|| !Number.isSafeInteger(cache.d) || !Number.isSafeInteger(cache.ml)
|
|
674
|
+
|| cache.d < 0 || cache.ml < 0 || !Number.isSafeInteger(cache.d + cache.ml)) {
|
|
675
|
+
throw new ValidationError("Query has no accepted original lifetime");
|
|
676
|
+
}
|
|
677
|
+
const queryTime = messageTime + BigInt(cache.d + cache.ml) * 1000n;
|
|
678
|
+
const expires = queryTime < grantTime ? queryTime : grantTime;
|
|
679
|
+
if (now >= expires)
|
|
680
|
+
throw new ValidationError("Query or Grant has expired");
|
|
681
|
+
return expires;
|
|
682
|
+
}
|
|
683
|
+
operation(xid) {
|
|
684
|
+
const op = this.operations.get(xid);
|
|
685
|
+
if (!op)
|
|
686
|
+
throw new ValidationError("Unblind transaction has no local approval");
|
|
687
|
+
return op;
|
|
688
|
+
}
|
|
689
|
+
live(op) {
|
|
690
|
+
const context = this.exc.presentationContext(op.grant, op);
|
|
691
|
+
if (op.abandoned || !context || !bytesEqual(context.serder.raw, op.raw)) {
|
|
692
|
+
throw new ValidationError("Presentation is unavailable, terminated or expired");
|
|
693
|
+
}
|
|
694
|
+
if (context.nests.length !== op.bodies.length
|
|
695
|
+
|| context.nests.some((nest, i) => !bytesEqual(nest.body.raw, op.bodies[i]))
|
|
696
|
+
|| context.registries.size !== op.scope.size || [...op.scope].some(([regid, nodes]) => {
|
|
697
|
+
const selected = context.registries.get(regid);
|
|
698
|
+
return !selected || selected.length !== nodes.length || nodes.some((node, i) => selected[i] !== node);
|
|
699
|
+
}))
|
|
700
|
+
throw new ValidationError("Presentation differs from the approved Grant");
|
|
701
|
+
return context;
|
|
702
|
+
}
|
|
703
|
+
current(op) {
|
|
704
|
+
for (const [regid, saids] of Object.entries(op.requested ?? {})) {
|
|
705
|
+
if (this.registry.store.headEvent(regid)?.said !== saids.at(-1)) {
|
|
706
|
+
throw new ValidationError("Registry head changed after the Unblind request");
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
/** Decode the exact query/reply body before applying consent and event scope. */
|
|
711
|
+
parameters(serder, field) {
|
|
712
|
+
const data = serder.sad?.[field];
|
|
713
|
+
if (!serder.verify() || serder.pvrsn.major !== 2 || serder.pvrsn.minor !== 0 || serder.route !== Unblind.Route
|
|
714
|
+
|| !data || typeof data !== "object" || Array.isArray(data) || Object.keys(data).sort().join() !== "re,x"
|
|
715
|
+
|| !("x" in data) || typeof data.x !== "string" || !("re" in data) || !data.re
|
|
716
|
+
|| typeof data.re !== "object" || Array.isArray(data.re))
|
|
717
|
+
throw new ValidationError("Invalid Unblind message shape");
|
|
718
|
+
return data;
|
|
719
|
+
}
|
|
720
|
+
/** Keep selected event identities distinct and inside the authenticated Grant's registry scope. */
|
|
721
|
+
selection(re, scope, field) {
|
|
722
|
+
const selected = {};
|
|
723
|
+
for (const [regid, values] of Object.entries(re)) {
|
|
724
|
+
if (!scope.has(regid) || !Array.isArray(values) || !values.length
|
|
725
|
+
|| values.some((value) => typeof value !== "string" || !value) || new Set(values).size !== values.length) {
|
|
726
|
+
throw new ValidationError("Unblind events must be distinct lists within the approved scope");
|
|
727
|
+
}
|
|
728
|
+
selected[regid] = [...values];
|
|
729
|
+
}
|
|
730
|
+
if (field === "q" && !Object.keys(selected).length)
|
|
731
|
+
throw new ValidationError("Unblind query scope is empty");
|
|
732
|
+
return selected;
|
|
733
|
+
}
|
|
734
|
+
preflight(serder, field, role, own = false) {
|
|
735
|
+
const data = this.parameters(serder, field);
|
|
736
|
+
const op = this.operation(data.x), { nests } = this.live(op);
|
|
737
|
+
if (this.hab.pre !== op[role] || serder.pre !== op[own ? role : role === "sender" ? "recipient" : "sender"]) {
|
|
738
|
+
throw new ValidationError("Wrong Unblind sender or local recipient");
|
|
739
|
+
}
|
|
740
|
+
const selected = this.selection(data.re, op.scope, field);
|
|
741
|
+
return { op, selected, nests };
|
|
742
|
+
}
|
|
743
|
+
/** Encode the endorsed finite body and explicit counted evidence in one attachment enclosure. */
|
|
744
|
+
signed(message, extra, groups) {
|
|
745
|
+
const auth = parsed(groups
|
|
746
|
+
? messagize(message, { tsgs: groups, gvrsn: Vrsn_2_0 })
|
|
747
|
+
: this.hab.endorse(message, { gvrsn: Vrsn_2_0 }));
|
|
748
|
+
const attachments = concatBytes(...auth.attachmentGroups.map((group) => group.raw), ...extra);
|
|
749
|
+
return concatBytes(Counter.makeGVC(Vrsn_2_0), message.raw, Counter.enclose({ code: "AttachmentGroup", qb64: attachments, version: Vrsn_2_0 }));
|
|
750
|
+
}
|
|
751
|
+
/** Reconstruct only allowed finite public event children; credentials never pass this encoder. */
|
|
752
|
+
publicEvents(nests) {
|
|
753
|
+
return nests.map(nest => {
|
|
754
|
+
if (!(nest.body instanceof SerderACDC) || nest.body.ilk !== "bup") {
|
|
755
|
+
throw new ValidationError("Unblind query must carry public BUP evidence");
|
|
756
|
+
}
|
|
757
|
+
this.attachments(envelopeFromFrame(nest), "event");
|
|
758
|
+
return messagize(nest.body, concatBytes(...nest.attachments.map(group => group.raw)), {
|
|
759
|
+
nested: true,
|
|
760
|
+
gvrsn: Vrsn_2_0,
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
/** Local group signatures cover exactly the suffix selected from this member's accepted state. */
|
|
765
|
+
queryEvidence(op, selected, nests) {
|
|
766
|
+
const expected = this.request(op), supplied = this.publicEvents(nests);
|
|
767
|
+
if (!sameSelection(selected, expected.requested) || supplied.length !== expected.children.length
|
|
768
|
+
|| supplied.some((wire, index) => !bytesEqual(wire, expected.children[index]))) {
|
|
769
|
+
throw new ValidationError("Group query differs from the selected public events and sources");
|
|
770
|
+
}
|
|
771
|
+
return supplied;
|
|
772
|
+
}
|
|
773
|
+
/** Freeze a complete aggregate, then elect delivery from its own historical signing indices. */
|
|
774
|
+
groupMessage(op, field, message, groups, extra) {
|
|
775
|
+
if (field === "query" && op.query)
|
|
776
|
+
return;
|
|
777
|
+
if (!op[field]) {
|
|
778
|
+
const verified = verifyExchangeProofs(this.hab.db, message, {
|
|
779
|
+
tsgs: groups.filter(group => group.pre === this.hab.pre),
|
|
780
|
+
});
|
|
781
|
+
if (!verified.tsgs.length || verified.invalid || verified.missing.length) {
|
|
782
|
+
throw new ValidationError("Own Unblind message lacks a verified group signature threshold");
|
|
783
|
+
}
|
|
784
|
+
op[field] = this.signed(message, extra, verified.tsgs);
|
|
785
|
+
}
|
|
786
|
+
// Later contributions cannot change which member is elected by these frozen bytes.
|
|
787
|
+
const proof = parsed(op[field]).tsgs[0];
|
|
788
|
+
const establishment = this.hab.db.getEvtSerder(proof.pre, proof.said);
|
|
789
|
+
if (!establishment?.estive)
|
|
790
|
+
throw new ValidationError("Group aggregate establishment is unavailable");
|
|
791
|
+
const member = localGroupMember(this.exc.hby, this.hab.pre);
|
|
792
|
+
const contribution = latestGroupContribution(this.hab.db, member.pre, establishment.verfers);
|
|
793
|
+
if (contribution?.index === Math.min(...proof.sigers.map(siger => siger.index))) {
|
|
794
|
+
this.outgoing.push({ kin: field, dest: field === "query" ? op.sender : op.recipient, msg: op[field].slice() });
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
/** Reject foreign evidence families, including unknown raw attachment groups. */
|
|
798
|
+
attachments(envelope, kind) {
|
|
799
|
+
const common = [
|
|
800
|
+
envelope.wigers,
|
|
801
|
+
envelope.trqs,
|
|
802
|
+
envelope.frcs,
|
|
803
|
+
envelope.tdcs,
|
|
804
|
+
envelope.ptds,
|
|
805
|
+
envelope.tmqs,
|
|
806
|
+
envelope.essrs ?? [],
|
|
807
|
+
envelope.unresolvedLast,
|
|
808
|
+
];
|
|
809
|
+
const forbidden = kind === "event"
|
|
810
|
+
? [
|
|
811
|
+
...common,
|
|
812
|
+
envelope.sigers,
|
|
813
|
+
envelope.cigars,
|
|
814
|
+
envelope.tsgs,
|
|
815
|
+
envelope.ssgs,
|
|
816
|
+
envelope.nests,
|
|
817
|
+
envelope.bsqs,
|
|
818
|
+
envelope.bsss,
|
|
819
|
+
]
|
|
820
|
+
: [
|
|
821
|
+
...common,
|
|
822
|
+
envelope.sscs,
|
|
823
|
+
envelope.ssts,
|
|
824
|
+
...(kind === "query" ? [envelope.bsqs, envelope.bsss] : [envelope.nests, envelope.ssgs]),
|
|
825
|
+
];
|
|
826
|
+
const allowed = kind === "event"
|
|
827
|
+
? ["SealSourceCouples", "SealSourceTriples"]
|
|
828
|
+
: [
|
|
829
|
+
"ControllerIdxSigs",
|
|
830
|
+
"NonTransReceiptCouples",
|
|
831
|
+
"TransIdxSigGroups",
|
|
832
|
+
...(kind === "query" ? ["TransLastIdxSigGroups"] : ["BlindedStateQuadruples", "BoundStateSextuples"]),
|
|
833
|
+
];
|
|
834
|
+
if (forbidden.some((values) => values.length)
|
|
835
|
+
|| envelope.attachmentGroups.some((group) => !allowed.includes(group.name.replace(/^Big/, ""))))
|
|
836
|
+
throw new ValidationError("Unsupported Unblind attachments");
|
|
837
|
+
}
|
|
838
|
+
events(regid) {
|
|
839
|
+
const head = this.registry.store.headEvent(regid);
|
|
840
|
+
if (!head || head.ilk !== "bup")
|
|
841
|
+
throw new ValidationError("Accepted registry updates are unavailable");
|
|
842
|
+
const events = [];
|
|
843
|
+
for (let sn = 1; sn <= ordinal(head); sn++) {
|
|
844
|
+
const event = this.registry.store.seqEvent(regid, sn);
|
|
845
|
+
if (!event)
|
|
846
|
+
throw new ValidationError("Accepted registry chain is incomplete");
|
|
847
|
+
events.push(event);
|
|
848
|
+
}
|
|
849
|
+
return events;
|
|
850
|
+
}
|
|
851
|
+
/** Vet every supplied suffix before any ordinary TEL intake changes the accepted prefix. */
|
|
852
|
+
validateEvents(requested, nests) {
|
|
853
|
+
const saids = Object.values(requested).flat();
|
|
854
|
+
if (nests.length !== saids.length || nests.some((nest, i) => nest.body.said !== saids[i])) {
|
|
855
|
+
throw new ValidationError("Nested events differ from the exact Unblind request");
|
|
856
|
+
}
|
|
857
|
+
let offset = 0;
|
|
858
|
+
for (const [regid, selected] of Object.entries(requested)) {
|
|
859
|
+
const rip = this.registry.store.seqEvent(regid, 0), head = this.registry.store.headEvent(regid);
|
|
860
|
+
if (!rip || !head)
|
|
861
|
+
throw new ValidationError("Query registry has no accepted inception");
|
|
862
|
+
const children = nests.slice(offset, offset + selected.length);
|
|
863
|
+
offset += selected.length;
|
|
864
|
+
if (!(children[0].body instanceof SerderACDC))
|
|
865
|
+
throw new ValidationError("Expected public BUP evidence");
|
|
866
|
+
if (validateUpdate(children[0].body, regid).kind !== "valid") {
|
|
867
|
+
throw new ValidationError("Query must carry public BUP evidence");
|
|
868
|
+
}
|
|
869
|
+
const first = ordinal(children[0].body), prefix = [];
|
|
870
|
+
if (first < 1 || first > ordinal(head) + 1)
|
|
871
|
+
throw new ValidationError("Query has no accepted preceding prefix");
|
|
872
|
+
for (let sn = 1; sn < first; sn++) {
|
|
873
|
+
const event = this.registry.store.seqEvent(regid, sn);
|
|
874
|
+
if (!event)
|
|
875
|
+
throw new ValidationError("Query has no accepted preceding prefix");
|
|
876
|
+
prefix.push(event);
|
|
877
|
+
}
|
|
878
|
+
for (let i = 0; i < children.length; i++) {
|
|
879
|
+
const frame = children[i], event = frame.body;
|
|
880
|
+
if (!(event instanceof SerderACDC))
|
|
881
|
+
throw new ValidationError("Expected public BUP evidence");
|
|
882
|
+
const checked = validateUpdate(event, regid), envelope = envelopeFromFrame(frame);
|
|
883
|
+
this.attachments(envelope, "event");
|
|
884
|
+
if (checked.kind !== "valid" || ordinal(event) !== first + i) {
|
|
885
|
+
throw new ValidationError("Query BUP suffix is not contiguous");
|
|
886
|
+
}
|
|
887
|
+
const sources = [
|
|
888
|
+
...envelope.sscs.map((seal) => ({ issuer: rip.issuer, number: seal.s, diger: seal.d })),
|
|
889
|
+
...envelope.ssts.map((seal) => ({ issuer: seal.i.qb64, number: seal.s, diger: seal.d })),
|
|
890
|
+
];
|
|
891
|
+
for (const source of sources) {
|
|
892
|
+
if (source.issuer !== rip.issuer || !verifyRegistryAnchor(checked.event, { db: this.hab.db, ...source })) {
|
|
893
|
+
throw new ValidationError("Query event has an unverified source");
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
const accepted = this.registry.store.seqEvent(regid, first + i);
|
|
897
|
+
if (accepted && !bytesEqual(accepted.raw, event.raw)) {
|
|
898
|
+
throw new ValidationError("Query conflicts with accepted history");
|
|
899
|
+
}
|
|
900
|
+
prefix.push(event);
|
|
901
|
+
}
|
|
902
|
+
if (vet({ rip, updates: prefix, db: this.hab.db }).kind !== "verified"
|
|
903
|
+
|| ordinal(head) > first + selected.length - 1)
|
|
904
|
+
throw new ValidationError("Query has unverified or superseded history");
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
receiveEvents(requested, nests) {
|
|
908
|
+
this.validateEvents(requested, nests);
|
|
909
|
+
for (const frame of nests) {
|
|
910
|
+
const envelope = envelopeFromFrame(frame);
|
|
911
|
+
const decision = this.registry.processEvent(frame.body, {
|
|
912
|
+
sscs: envelope.sscs,
|
|
913
|
+
ssts: envelope.ssts,
|
|
914
|
+
});
|
|
915
|
+
if (decision.kind !== "accept" && decision.kind !== "duplicate") {
|
|
916
|
+
throw new ValidationError("Public BUP has not reached acceptance");
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
checkOpening(op, event, opening, nests) {
|
|
921
|
+
if (!vetBlind(opening, String(event.sad.b))) {
|
|
922
|
+
throw new ValidationError("Opening does not match the exact event BLID");
|
|
923
|
+
}
|
|
924
|
+
const target = opening.td.nonce, binding = !!(target || opening.ts.text);
|
|
925
|
+
if (binding && !op.scope.get(String(event.sad.rd))?.includes(target)) {
|
|
926
|
+
throw new ValidationError("Opening targets an unrelated credential");
|
|
927
|
+
}
|
|
928
|
+
const credential = nests.find((nest) => nest.body.said === target)?.body;
|
|
929
|
+
if (vetBound(opening, credential instanceof SerderACDC ? credential : undefined, this.hab.db)) {
|
|
930
|
+
throw new ValidationError("Bound opening lacks its exact accepted Issuee event");
|
|
931
|
+
}
|
|
932
|
+
return binding;
|
|
933
|
+
}
|
|
934
|
+
carried(op, nests) {
|
|
935
|
+
const carried = new Map();
|
|
936
|
+
for (const nest of nests) {
|
|
937
|
+
const regid = nest.body.ked?.rd;
|
|
938
|
+
if (typeof regid !== "string" || !op.scope.has(regid))
|
|
939
|
+
continue;
|
|
940
|
+
const envelope = envelopeFromFrame(nest);
|
|
941
|
+
for (const opening of [...envelope.bsqs, ...envelope.bsss]) {
|
|
942
|
+
for (const event of this.events(regid)) {
|
|
943
|
+
if (opening.d.nonce === event.sad.b) {
|
|
944
|
+
this.checkOpening(op, event, opening, nests);
|
|
945
|
+
carried.set(event.said, opening);
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
return carried;
|
|
951
|
+
}
|
|
952
|
+
held(op, event, nests) {
|
|
953
|
+
let opening = this.registry.store.publicOpening(event.said);
|
|
954
|
+
if (!opening) {
|
|
955
|
+
for (const nest of nests) {
|
|
956
|
+
const envelope = envelopeFromFrame(nest);
|
|
957
|
+
opening = [...envelope.bsqs, ...envelope.bsss].find((candidate) => candidate.d.nonce === event.sad.b) ?? null;
|
|
958
|
+
if (opening)
|
|
959
|
+
break;
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
if (!opening) {
|
|
963
|
+
const root = this.hab.mgr.getRegistryRoot(this.hab.pre, String(event.sad.rd));
|
|
964
|
+
if (root) {
|
|
965
|
+
for (const target of op.scope.get(String(event.sad.rd))) {
|
|
966
|
+
opening = unblindBlindState({
|
|
967
|
+
said: String(event.sad.b),
|
|
968
|
+
uuid: makeBlindUuid({ salt: root.qb64, sn: BigInt(ordinal(event)) }),
|
|
969
|
+
acdc: target,
|
|
970
|
+
states: this.states,
|
|
971
|
+
});
|
|
972
|
+
if (opening)
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
if (!opening)
|
|
978
|
+
throw new ValidationError("Required exact event opening is unavailable");
|
|
979
|
+
this.checkOpening(op, event, opening, nests);
|
|
980
|
+
return opening;
|
|
981
|
+
}
|
|
982
|
+
minimum(op, nests, resolve) {
|
|
983
|
+
const carried = this.carried(op, nests), selected = {}, openings = new Map();
|
|
984
|
+
for (const [regid, saids] of Object.entries(op.requested)) {
|
|
985
|
+
const suffix = [];
|
|
986
|
+
let bound = false;
|
|
987
|
+
for (const event of this.events(regid).reverse()) {
|
|
988
|
+
let opening = carried.get(event.said);
|
|
989
|
+
if (!opening) {
|
|
990
|
+
if (!saids.includes(event.said)) {
|
|
991
|
+
throw new ValidationError("Required older opening was neither carried nor requested");
|
|
992
|
+
}
|
|
993
|
+
opening = resolve(event);
|
|
994
|
+
suffix.push(event.said);
|
|
995
|
+
openings.set(opening.d.nonce, opening);
|
|
996
|
+
}
|
|
997
|
+
if (this.checkOpening(op, event, opening, nests)) {
|
|
998
|
+
bound = true;
|
|
999
|
+
break;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
if (!bound)
|
|
1003
|
+
throw new ValidationError("Registry suffix contains no credential state");
|
|
1004
|
+
if (suffix.length)
|
|
1005
|
+
selected[regid] = suffix.reverse();
|
|
1006
|
+
}
|
|
1007
|
+
return { selected, openings: [...openings.values()] };
|
|
1008
|
+
}
|
|
1009
|
+
opening(openings, event) {
|
|
1010
|
+
const opening = openings.get(event.said);
|
|
1011
|
+
if (!opening)
|
|
1012
|
+
throw new ValidationError("Reply lacks a required opening");
|
|
1013
|
+
return opening;
|
|
1014
|
+
}
|
|
1015
|
+
replyOpenings(op, selected, nests, proofs) {
|
|
1016
|
+
if (!op.requested
|
|
1017
|
+
|| Object.entries(selected).some(([regid, saids]) => !op.requested[regid] || saids.some((said) => !op.requested[regid].includes(said)))) {
|
|
1018
|
+
throw new ValidationError("Reply names an event outside the outstanding request");
|
|
1019
|
+
}
|
|
1020
|
+
const seen = new Set(), verified = new Map();
|
|
1021
|
+
for (const opening of proofs) {
|
|
1022
|
+
if (seen.has(opening.d.nonce))
|
|
1023
|
+
throw new ValidationError("Duplicate Unblind opening");
|
|
1024
|
+
seen.add(opening.d.nonce);
|
|
1025
|
+
const events = Object.values(selected).flat().map((said) => this.registry.store.event(said));
|
|
1026
|
+
const matches = events.filter((event) => event.sad.b === opening.d.nonce);
|
|
1027
|
+
if (!matches.length)
|
|
1028
|
+
throw new ValidationError("Reply carries an excess opening");
|
|
1029
|
+
for (const event of matches) {
|
|
1030
|
+
this.checkOpening(op, event, opening, nests);
|
|
1031
|
+
verified.set(event.said, opening);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
return verified;
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
Object.defineProperty(Unblind, "Route", {
|
|
1038
|
+
enumerable: true,
|
|
1039
|
+
configurable: true,
|
|
1040
|
+
writable: true,
|
|
1041
|
+
value: "/ipex/unblind"
|
|
1042
|
+
});
|