keri-ts 2.0.1 → 2.2.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 +30 -2
- package/esm/keri/npm/src/acdc/authoring.js +195 -0
- package/esm/keri/npm/src/acdc/chaining.js +223 -89
- package/esm/keri/npm/src/acdc/custody.js +164 -0
- package/esm/keri/npm/src/acdc/dhking.js +244 -32
- package/esm/keri/npm/src/acdc/observing.js +2 -2
- package/esm/keri/npm/src/acdc/regbasing.js +30 -29
- package/esm/keri/npm/src/acdc/regengine.js +4 -6
- package/esm/keri/npm/src/acdc/registering.js +13 -10
- package/esm/keri/npm/src/acdc/registraring.js +4 -9
- package/esm/keri/npm/src/acdc/salting.js +143 -26
- package/esm/keri/npm/src/acdc/scheming.js +93 -54
- package/esm/keri/npm/src/acdc/unblinding.js +120 -99
- package/esm/keri/npm/src/app/bootstrap/authenticating.js +4 -6
- package/esm/keri/npm/src/app/bootstrap/oobi-resolving.js +41 -0
- package/esm/keri/npm/src/app/bootstrap/oobiery.js +5 -7
- package/esm/keri/npm/src/app/credentials/credential-revoking.js +1 -0
- package/esm/keri/npm/src/app/credentials/credential-workflows.js +2 -0
- package/esm/keri/npm/src/app/credentials/registry-settling.js +44 -0
- package/esm/keri/npm/src/app/credentials/root-replicating.js +131 -0
- package/esm/keri/npm/src/app/credentials/root-replicator.js +198 -0
- package/esm/keri/npm/src/app/credentials/tel-completion.js +36 -0
- package/esm/keri/npm/src/app/credentials/verifying.js +12 -3
- package/esm/keri/npm/src/app/delivery/forwarding.js +64 -9
- package/esm/keri/npm/src/app/exchanges/exchanging.js +24 -15
- package/esm/keri/npm/src/app/identity/challenging.js +50 -0
- package/esm/keri/npm/src/app/identity/configing.js +17 -43
- package/esm/keri/npm/src/app/identity/delegating.js +77 -77
- package/esm/keri/npm/src/app/identity/delegation-approval.js +333 -0
- package/esm/keri/npm/src/app/identity/event-completion.js +154 -0
- package/esm/keri/npm/src/app/identity/habbing.js +183 -41
- package/esm/keri/npm/src/app/identity/keeping.js +78 -5
- package/esm/keri/npm/src/app/identity/lmdb-habery.js +12 -0
- package/esm/keri/npm/src/app/ipex/group-ipex.js +327 -0
- package/esm/keri/npm/src/app/ipex/group-issuance.js +902 -0
- package/esm/keri/npm/src/app/ipex/ipex-admitting.js +120 -0
- package/esm/keri/npm/src/app/ipex/ipex-conversation.js +197 -0
- package/esm/keri/npm/src/app/ipex/ipex-discloser.js +591 -0
- package/esm/keri/npm/src/app/ipex/ipex-granting.js +93 -0
- package/esm/keri/npm/src/app/ipex/ipex-graph.js +7 -70
- package/esm/keri/npm/src/app/ipex/ipex-grouping.js +42 -16
- package/esm/keri/npm/src/app/ipex/ipex-v2.js +21 -5
- package/esm/keri/npm/src/app/ipex/ipexing.js +1 -1
- package/esm/keri/npm/src/app/ipex/issuance.js +888 -0
- package/esm/keri/npm/src/app/ipex/pending-presentations.js +46 -0
- package/esm/keri/npm/src/app/ipex/presentation-files.js +200 -0
- package/esm/keri/npm/src/app/ipex/presenting.js +401 -0
- package/esm/keri/npm/src/app/ipex/receive-issuance.js +86 -0
- package/esm/keri/npm/src/app/ipex/unblinding-workflow.js +660 -0
- package/esm/keri/npm/src/app/mailbox/ipex-arrival.js +103 -0
- package/esm/keri/npm/src/app/mailbox/kel-publisher.js +322 -0
- package/esm/keri/npm/src/app/mailbox/kel-publishing.js +65 -0
- package/esm/keri/npm/src/app/mailbox/kel-submission.js +24 -0
- package/esm/keri/npm/src/app/mailbox/mailbox-admin.js +208 -0
- package/esm/keri/npm/src/app/mailbox/mailbox-poller.js +212 -47
- package/esm/keri/npm/src/app/mailbox/mailboxing.js +15 -14
- package/esm/keri/npm/src/app/multisig/counseling.js +482 -0
- package/esm/keri/npm/src/app/multisig/group-members.js +32 -0
- package/esm/keri/npm/src/app/multisig/grouping.js +4 -3
- package/esm/keri/npm/src/app/multisig/multisig-workflows.js +101 -141
- package/esm/keri/npm/src/app/multisig/proposals.js +281 -0
- package/esm/keri/npm/src/app/multisig/proposing.js +122 -0
- package/esm/keri/npm/src/app/notifications/notifying.js +5 -9
- package/esm/keri/npm/src/app/notifications/signaling.js +5 -5
- package/esm/keri/npm/src/app/protocol/parsering.js +26 -1
- package/esm/keri/npm/src/app/protocol/protocol-processing.js +44 -6
- package/esm/keri/npm/src/app/queries/query-workflows.js +98 -0
- package/esm/keri/npm/src/app/queries/witness-inquisitor.js +2 -2
- package/esm/keri/npm/src/app/runtime/agent-runtime.js +113 -65
- package/esm/keri/npm/src/app/runtime/cue-runtime.js +3 -6
- package/esm/keri/npm/src/app/runtime/delivery-outbox.js +87 -0
- package/esm/keri/npm/src/app/runtime/doing.js +17 -0
- package/esm/keri/npm/src/app/runtime/ipex-auxiliaries.js +207 -0
- package/esm/keri/npm/src/app/runtime/operation-owners.js +151 -0
- package/esm/keri/npm/src/app/runtime/retry-backoff.js +93 -0
- package/esm/keri/npm/src/app/runtime/workflow-contract.js +80 -0
- package/esm/keri/npm/src/app/transport/byte-source.js +6 -42
- package/esm/keri/npm/src/app/transport/cesr-egress.js +77 -13
- package/esm/keri/npm/src/app/transport/file-bytes.js +41 -0
- package/esm/keri/npm/src/app/transport/http-client.js +25 -6
- package/esm/keri/npm/src/app/transport/http-messenger.js +14 -9
- package/esm/keri/npm/src/app/transport/message-source.js +1 -1
- package/esm/keri/npm/src/app/transport/messengering.js +3 -4
- package/esm/keri/npm/src/app/transport/node-http-client.js +21 -0
- package/esm/keri/npm/src/app/transport/tcp-dialer.js +14 -0
- package/esm/keri/npm/src/app/witness/http-endpoints.js +4 -4
- package/esm/keri/npm/src/app/witness/receipt-client.js +2 -2
- package/esm/keri/npm/src/cli/common/context.js +2 -2
- package/esm/keri/npm/src/cli/common/event-completion.js +49 -0
- package/esm/keri/npm/src/cli/common/existing.js +3 -5
- package/esm/keri/npm/src/cli/common/runtime-workers.js +23 -0
- package/esm/keri/npm/src/cli/credentials/ipex.js +159 -191
- package/esm/keri/npm/src/cli/credentials/vc.js +53 -72
- package/esm/keri/npm/src/cli/endpoints/did.js +12 -3
- package/esm/keri/npm/src/cli/endpoints/oobi-clean.js +4 -3
- package/esm/keri/npm/src/cli/endpoints/oobi.js +12 -15
- package/esm/keri/npm/src/cli/identity/challenge.js +9 -35
- package/esm/keri/npm/src/cli/identity/delegate.js +81 -258
- package/esm/keri/npm/src/cli/identity/incept.js +17 -34
- package/esm/keri/npm/src/cli/identity/init.js +4 -3
- package/esm/keri/npm/src/cli/identity/interact.js +7 -19
- package/esm/keri/npm/src/cli/identity/rotate.js +10 -38
- package/esm/keri/npm/src/cli/index.js +3 -1
- package/esm/keri/npm/src/cli/messaging/exchange.js +2 -2
- package/esm/keri/npm/src/cli/messaging/group-join.js +79 -0
- package/esm/keri/npm/src/cli/messaging/group-wait.js +88 -0
- package/esm/keri/npm/src/cli/messaging/multisig.js +187 -250
- package/esm/keri/npm/src/cli/messaging/root-copy-lines.js +31 -0
- package/esm/keri/npm/src/cli/tools/annotate.js +2 -1
- package/esm/keri/npm/src/cli/tools/benchmark.js +2 -1
- package/esm/keri/npm/src/cli/tools/db-dump.js +1 -4
- package/esm/keri/npm/src/core/bytes.js +9 -0
- package/esm/keri/npm/src/core/kel/delegation-ancestry.js +92 -0
- package/esm/keri/npm/src/core/kel/eventing.js +67 -12
- package/esm/keri/npm/src/core/kel/kever.js +11 -9
- package/esm/keri/npm/src/core/mailbox/kram-policy.js +41 -9
- package/esm/keri/npm/src/core/mailbox/kram-pruning.js +15 -22
- package/esm/keri/npm/src/core/mailbox/kram-staging.js +2 -2
- package/esm/keri/npm/src/core/mailbox/kraming.js +2 -0
- package/esm/keri/npm/src/core/records.js +23 -0
- package/esm/keri/npm/src/core/routing.js +15 -2
- package/esm/keri/npm/src/db/basing.js +183 -205
- package/esm/keri/npm/src/db/core/dber.js +1062 -0
- package/esm/keri/npm/src/db/core/index.js +4 -2
- package/esm/keri/npm/src/db/core/indexeddb-persistence.js +221 -0
- package/esm/keri/npm/src/db/core/lmdb-opener.js +30 -0
- package/esm/keri/npm/src/db/core/lmdber.js +199 -1067
- package/esm/keri/npm/src/db/core/memstore.js +532 -0
- package/esm/keri/npm/src/db/core/path-manager.js +109 -223
- package/esm/keri/npm/src/db/core/store-owner.js +104 -0
- package/esm/keri/npm/src/db/core/webdber.js +252 -0
- package/esm/keri/npm/src/db/escrowing.js +2 -2
- package/esm/keri/npm/src/db/exchange/exchange-nests.js +3 -2
- package/esm/keri/npm/src/db/indexeddb.js +98 -0
- package/esm/keri/npm/src/db/keeping.js +38 -123
- package/esm/keri/npm/src/db/koming.js +1 -1
- package/esm/keri/npm/src/db/lmdb-stores.js +68 -0
- package/esm/keri/npm/src/db/lmdb.js +6 -0
- package/esm/keri/npm/src/db/mailbox/mailboxing.js +12 -65
- package/esm/keri/npm/src/db/noting.js +11 -55
- package/esm/keri/npm/src/db/reger.js +43 -105
- package/esm/keri/npm/src/db/replay/witness-replay.js +2 -20
- package/esm/keri/npm/src/db/store-lock.js +150 -0
- package/esm/keri/npm/src/db/subing.js +1 -1
- package/esm/keri/npm/src/npm/db-indexeddb.browser.js +2 -0
- package/esm/keri/npm/src/npm/db-indexeddb.js +3 -0
- package/esm/keri/npm/src/npm/db-lmdb.js +3 -0
- package/esm/keri/npm/src/npm/db.browser.js +2 -0
- package/esm/keri/npm/src/npm/index.browser.js +9 -0
- package/esm/keri/npm/src/npm/runtime-node.js +3 -0
- package/esm/keri/npm/src/npm/runtime-web.browser.js +2 -0
- package/esm/keri/npm/src/npm/runtime-web.js +3 -0
- package/esm/keri/npm/src/npm/runtime.browser.js +2 -0
- package/esm/keri/npm/src/runtime/index.js +58 -12
- package/esm/keri/npm/src/runtime/node.js +14 -0
- package/esm/keri/npm/src/runtime/web/output-barrier.js +47 -0
- package/esm/keri/npm/src/runtime/web/persistent-storage.js +37 -0
- package/esm/keri/npm/src/runtime/web.js +10 -0
- package/esm/keri/npm/src/vdr/eventing.js +1 -1
- package/esm/keri/npm/src/vdr/tel-publication.js +19 -3
- package/esm/keri/npm/src/version.js +2 -2
- package/package.json +24 -4
- package/types/acdc/authoring.d.ts +54 -0
- package/types/acdc/authoring.d.ts.map +1 -0
- package/types/acdc/chaining.d.ts +56 -6
- package/types/acdc/chaining.d.ts.map +1 -1
- package/types/acdc/custody.d.ts +77 -0
- package/types/acdc/custody.d.ts.map +1 -0
- package/types/acdc/dhking.d.ts +94 -3
- package/types/acdc/dhking.d.ts.map +1 -1
- package/types/acdc/regbasing.d.ts +11 -6
- package/types/acdc/regbasing.d.ts.map +1 -1
- package/types/acdc/regengine.d.ts.map +1 -1
- package/types/acdc/registering.d.ts +8 -4
- package/types/acdc/registering.d.ts.map +1 -1
- package/types/acdc/registraring.d.ts.map +1 -1
- package/types/acdc/salting.d.ts +59 -7
- package/types/acdc/salting.d.ts.map +1 -1
- package/types/acdc/scheming.d.ts +2 -0
- package/types/acdc/scheming.d.ts.map +1 -1
- package/types/acdc/unblinding.d.ts +58 -19
- package/types/acdc/unblinding.d.ts.map +1 -1
- package/types/app/bootstrap/authenticating.d.ts +3 -1
- package/types/app/bootstrap/authenticating.d.ts.map +1 -1
- package/types/app/bootstrap/oobi-resolving.d.ts +92 -0
- package/types/app/bootstrap/oobi-resolving.d.ts.map +1 -0
- package/types/app/bootstrap/oobiery.d.ts +3 -1
- package/types/app/bootstrap/oobiery.d.ts.map +1 -1
- package/types/app/credentials/credential-revoking.d.ts +3 -0
- package/types/app/credentials/credential-revoking.d.ts.map +1 -1
- package/types/app/credentials/credential-workflows.d.ts +5 -0
- package/types/app/credentials/credential-workflows.d.ts.map +1 -1
- package/types/app/credentials/registry-settling.d.ts +85 -0
- package/types/app/credentials/registry-settling.d.ts.map +1 -0
- package/types/app/credentials/root-replicating.d.ts +97 -0
- package/types/app/credentials/root-replicating.d.ts.map +1 -0
- package/types/app/credentials/root-replicator.d.ts +105 -0
- package/types/app/credentials/root-replicator.d.ts.map +1 -0
- package/types/app/credentials/tel-completion.d.ts +55 -0
- package/types/app/credentials/tel-completion.d.ts.map +1 -0
- package/types/app/credentials/verifying.d.ts +2 -1
- package/types/app/credentials/verifying.d.ts.map +1 -1
- package/types/app/delivery/forwarding.d.ts +16 -0
- package/types/app/delivery/forwarding.d.ts.map +1 -1
- package/types/app/exchanges/exchanging.d.ts +2 -0
- package/types/app/exchanges/exchanging.d.ts.map +1 -1
- package/types/app/identity/challenging.d.ts +54 -0
- package/types/app/identity/challenging.d.ts.map +1 -1
- package/types/app/identity/configing.d.ts +7 -5
- package/types/app/identity/configing.d.ts.map +1 -1
- package/types/app/identity/delegating.d.ts +21 -4
- package/types/app/identity/delegating.d.ts.map +1 -1
- package/types/app/identity/delegation-approval.d.ts +228 -0
- package/types/app/identity/delegation-approval.d.ts.map +1 -0
- package/types/app/identity/event-completion.d.ts +151 -0
- package/types/app/identity/event-completion.d.ts.map +1 -0
- package/types/app/identity/habbing.d.ts +90 -7
- package/types/app/identity/habbing.d.ts.map +1 -1
- package/types/app/identity/keeping.d.ts +50 -4
- package/types/app/identity/keeping.d.ts.map +1 -1
- package/types/app/identity/lmdb-habery.d.ts +6 -0
- package/types/app/identity/lmdb-habery.d.ts.map +1 -0
- package/types/app/ipex/group-ipex.d.ts +247 -0
- package/types/app/ipex/group-ipex.d.ts.map +1 -0
- package/types/app/ipex/group-issuance.d.ts +281 -0
- package/types/app/ipex/group-issuance.d.ts.map +1 -0
- package/types/app/ipex/ipex-admitting.d.ts +47 -0
- package/types/app/ipex/ipex-admitting.d.ts.map +1 -0
- package/types/app/ipex/ipex-conversation.d.ts +195 -0
- package/types/app/ipex/ipex-conversation.d.ts.map +1 -0
- package/types/app/ipex/ipex-discloser.d.ts +156 -0
- package/types/app/ipex/ipex-discloser.d.ts.map +1 -0
- package/types/app/ipex/ipex-granting.d.ts +145 -0
- package/types/app/ipex/ipex-granting.d.ts.map +1 -0
- package/types/app/ipex/ipex-graph.d.ts +4 -4
- package/types/app/ipex/ipex-graph.d.ts.map +1 -1
- package/types/app/ipex/ipex-grouping.d.ts +18 -0
- package/types/app/ipex/ipex-grouping.d.ts.map +1 -1
- package/types/app/ipex/ipex-v2.d.ts +11 -2
- package/types/app/ipex/ipex-v2.d.ts.map +1 -1
- package/types/app/ipex/ipexing.d.ts +3 -0
- package/types/app/ipex/ipexing.d.ts.map +1 -1
- package/types/app/ipex/issuance.d.ts +443 -0
- package/types/app/ipex/issuance.d.ts.map +1 -0
- package/types/app/ipex/pending-presentations.d.ts +25 -0
- package/types/app/ipex/pending-presentations.d.ts.map +1 -0
- package/types/app/ipex/presentation-files.d.ts +47 -0
- package/types/app/ipex/presentation-files.d.ts.map +1 -0
- package/types/app/ipex/presenting.d.ts +298 -0
- package/types/app/ipex/presenting.d.ts.map +1 -0
- package/types/app/ipex/receive-issuance.d.ts +99 -0
- package/types/app/ipex/receive-issuance.d.ts.map +1 -0
- package/types/app/ipex/unblinding-workflow.d.ts +255 -0
- package/types/app/ipex/unblinding-workflow.d.ts.map +1 -0
- package/types/app/mailbox/ipex-arrival.d.ts +104 -0
- package/types/app/mailbox/ipex-arrival.d.ts.map +1 -0
- package/types/app/mailbox/kel-publisher.d.ts +141 -0
- package/types/app/mailbox/kel-publisher.d.ts.map +1 -0
- package/types/app/mailbox/kel-publishing.d.ts +70 -0
- package/types/app/mailbox/kel-publishing.d.ts.map +1 -0
- package/types/app/mailbox/kel-submission.d.ts +18 -0
- package/types/app/mailbox/kel-submission.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-admin.d.ts +113 -0
- package/types/app/mailbox/mailbox-admin.d.ts.map +1 -0
- package/types/app/mailbox/mailbox-poller.d.ts +92 -3
- package/types/app/mailbox/mailbox-poller.d.ts.map +1 -1
- package/types/app/mailbox/mailboxing.d.ts +4 -1
- package/types/app/mailbox/mailboxing.d.ts.map +1 -1
- package/types/app/multisig/counseling.d.ts +196 -0
- package/types/app/multisig/counseling.d.ts.map +1 -0
- package/types/app/multisig/group-members.d.ts +20 -0
- package/types/app/multisig/group-members.d.ts.map +1 -1
- package/types/app/multisig/grouping.d.ts +39 -20
- package/types/app/multisig/grouping.d.ts.map +1 -1
- package/types/app/multisig/multisig-workflows.d.ts +93 -23
- package/types/app/multisig/multisig-workflows.d.ts.map +1 -1
- package/types/app/multisig/proposals.d.ts +129 -0
- package/types/app/multisig/proposals.d.ts.map +1 -0
- package/types/app/multisig/proposing.d.ts +125 -0
- package/types/app/multisig/proposing.d.ts.map +1 -0
- package/types/app/notifications/notifying.d.ts +1 -1
- package/types/app/notifications/notifying.d.ts.map +1 -1
- package/types/app/notifications/signaling.d.ts +3 -1
- package/types/app/notifications/signaling.d.ts.map +1 -1
- package/types/app/protocol/parsering.d.ts +16 -1
- package/types/app/protocol/parsering.d.ts.map +1 -1
- package/types/app/protocol/protocol-processing.d.ts +9 -1
- package/types/app/protocol/protocol-processing.d.ts.map +1 -1
- package/types/app/queries/query-workflows.d.ts +98 -0
- package/types/app/queries/query-workflows.d.ts.map +1 -0
- package/types/app/runtime/agent-runtime.d.ts +79 -25
- package/types/app/runtime/agent-runtime.d.ts.map +1 -1
- package/types/app/runtime/cue-runtime.d.ts +2 -1
- package/types/app/runtime/cue-runtime.d.ts.map +1 -1
- package/types/app/runtime/delivery-outbox.d.ts +68 -0
- package/types/app/runtime/delivery-outbox.d.ts.map +1 -0
- package/types/app/runtime/doing.d.ts +27 -0
- package/types/app/runtime/doing.d.ts.map +1 -0
- package/types/app/runtime/ipex-auxiliaries.d.ts +74 -0
- package/types/app/runtime/ipex-auxiliaries.d.ts.map +1 -0
- package/types/app/runtime/operation-owners.d.ts +137 -0
- package/types/app/runtime/operation-owners.d.ts.map +1 -0
- package/types/app/runtime/retry-backoff.d.ts +49 -0
- package/types/app/runtime/retry-backoff.d.ts.map +1 -0
- package/types/app/runtime/workflow-contract.d.ts +79 -0
- package/types/app/runtime/workflow-contract.d.ts.map +1 -0
- package/types/app/transport/byte-source.d.ts +13 -10
- package/types/app/transport/byte-source.d.ts.map +1 -1
- package/types/app/transport/cesr-egress.d.ts +21 -7
- package/types/app/transport/cesr-egress.d.ts.map +1 -1
- package/types/app/transport/file-bytes.d.ts +11 -0
- package/types/app/transport/file-bytes.d.ts.map +1 -0
- package/types/app/transport/http-client.d.ts +3 -0
- package/types/app/transport/http-client.d.ts.map +1 -1
- package/types/app/transport/http-messenger.d.ts +15 -10
- package/types/app/transport/http-messenger.d.ts.map +1 -1
- package/types/app/transport/message-source.d.ts +1 -1
- package/types/app/transport/messengering.d.ts +2 -2
- package/types/app/transport/messengering.d.ts.map +1 -1
- package/types/app/transport/node-http-client.d.ts +10 -0
- package/types/app/transport/node-http-client.d.ts.map +1 -0
- package/types/app/transport/tcp-dialer.d.ts +21 -0
- package/types/app/transport/tcp-dialer.d.ts.map +1 -0
- package/types/cli/common/event-completion.d.ts +26 -0
- package/types/cli/common/event-completion.d.ts.map +1 -0
- package/types/cli/common/existing.d.ts.map +1 -1
- package/types/cli/common/runtime-workers.d.ts +23 -0
- package/types/cli/common/runtime-workers.d.ts.map +1 -0
- package/types/cli/credentials/ipex.d.ts.map +1 -1
- package/types/cli/credentials/vc.d.ts +1 -1
- package/types/cli/credentials/vc.d.ts.map +1 -1
- package/types/cli/endpoints/did.d.ts.map +1 -1
- package/types/cli/endpoints/oobi-clean.d.ts.map +1 -1
- package/types/cli/endpoints/oobi.d.ts +3 -1
- package/types/cli/endpoints/oobi.d.ts.map +1 -1
- package/types/cli/identity/challenge.d.ts +1 -1
- package/types/cli/identity/challenge.d.ts.map +1 -1
- package/types/cli/identity/delegate.d.ts +14 -1
- package/types/cli/identity/delegate.d.ts.map +1 -1
- package/types/cli/identity/incept.d.ts.map +1 -1
- package/types/cli/identity/init.d.ts.map +1 -1
- package/types/cli/identity/interact.d.ts.map +1 -1
- package/types/cli/identity/rotate.d.ts.map +1 -1
- package/types/cli/index.d.ts +4 -2
- package/types/cli/index.d.ts.map +1 -1
- package/types/cli/messaging/group-join.d.ts +53 -0
- package/types/cli/messaging/group-join.d.ts.map +1 -0
- package/types/cli/messaging/group-wait.d.ts +34 -0
- package/types/cli/messaging/group-wait.d.ts.map +1 -0
- package/types/cli/messaging/multisig.d.ts +36 -4
- package/types/cli/messaging/multisig.d.ts.map +1 -1
- package/types/cli/messaging/root-copy-lines.d.ts +39 -0
- package/types/cli/messaging/root-copy-lines.d.ts.map +1 -0
- package/types/cli/tools/annotate.d.ts.map +1 -1
- package/types/cli/tools/benchmark.d.ts.map +1 -1
- package/types/cli/tools/db-dump.d.ts.map +1 -1
- package/types/core/bytes.d.ts +2 -0
- package/types/core/bytes.d.ts.map +1 -1
- package/types/core/cues.d.ts +11 -0
- package/types/core/cues.d.ts.map +1 -1
- package/types/core/kel/delegation-ancestry.d.ts +41 -0
- package/types/core/kel/delegation-ancestry.d.ts.map +1 -0
- package/types/core/kel/eventing.d.ts.map +1 -1
- package/types/core/kel/kever.d.ts +5 -4
- package/types/core/kel/kever.d.ts.map +1 -1
- package/types/core/mailbox/kram-policy.d.ts +14 -0
- package/types/core/mailbox/kram-policy.d.ts.map +1 -1
- package/types/core/mailbox/kram-pruning.d.ts +1 -3
- package/types/core/mailbox/kram-pruning.d.ts.map +1 -1
- package/types/core/mailbox/kraming.d.ts +1 -1
- package/types/core/mailbox/kraming.d.ts.map +1 -1
- package/types/core/records.d.ts +61 -0
- package/types/core/records.d.ts.map +1 -1
- package/types/core/routing.d.ts +6 -0
- package/types/core/routing.d.ts.map +1 -1
- package/types/db/basing.d.ts +22 -25
- package/types/db/basing.d.ts.map +1 -1
- package/types/db/core/dber.d.ts +505 -0
- package/types/db/core/dber.d.ts.map +1 -0
- package/types/db/core/index.d.ts +4 -2
- package/types/db/core/index.d.ts.map +1 -1
- package/types/db/core/indexeddb-persistence.d.ts +59 -0
- package/types/db/core/indexeddb-persistence.d.ts.map +1 -0
- package/types/db/core/lmdb-opener.d.ts +17 -0
- package/types/db/core/lmdb-opener.d.ts.map +1 -0
- package/types/db/core/lmdber.d.ts +60 -383
- package/types/db/core/lmdber.d.ts.map +1 -1
- package/types/db/core/memstore.d.ts +129 -0
- package/types/db/core/memstore.d.ts.map +1 -0
- package/types/db/core/path-manager.d.ts +22 -45
- package/types/db/core/path-manager.d.ts.map +1 -1
- package/types/db/core/store-owner.d.ts +59 -0
- package/types/db/core/store-owner.d.ts.map +1 -0
- package/types/db/core/webdber.d.ts +127 -0
- package/types/db/core/webdber.d.ts.map +1 -0
- package/types/db/escrowing.d.ts +3 -3
- package/types/db/escrowing.d.ts.map +1 -1
- package/types/db/exchange/exchange-nests.d.ts.map +1 -1
- package/types/db/indexeddb.d.ts +37 -0
- package/types/db/indexeddb.d.ts.map +1 -0
- package/types/db/keeping.d.ts +14 -25
- package/types/db/keeping.d.ts.map +1 -1
- package/types/db/koming.d.ts +7 -8
- package/types/db/koming.d.ts.map +1 -1
- package/types/db/lmdb-stores.d.ts +45 -0
- package/types/db/lmdb-stores.d.ts.map +1 -0
- package/types/db/lmdb.d.ts +7 -0
- package/types/db/lmdb.d.ts.map +1 -0
- package/types/db/mailbox/mailboxing.d.ts +7 -21
- package/types/db/mailbox/mailboxing.d.ts.map +1 -1
- package/types/db/noting.d.ts +7 -12
- package/types/db/noting.d.ts.map +1 -1
- package/types/db/reger.d.ts +7 -11
- package/types/db/reger.d.ts.map +1 -1
- package/types/db/replay/witness-replay.d.ts +0 -2
- package/types/db/replay/witness-replay.d.ts.map +1 -1
- package/types/db/store-lock.d.ts +72 -0
- package/types/db/store-lock.d.ts.map +1 -0
- package/types/db/subing.d.ts +24 -25
- package/types/db/subing.d.ts.map +1 -1
- package/types/npm/db-indexeddb.d.ts +4 -0
- package/types/npm/db-indexeddb.d.ts.map +1 -0
- package/types/npm/db-lmdb.d.ts +4 -0
- package/types/npm/db-lmdb.d.ts.map +1 -0
- package/types/npm/runtime-node.d.ts +4 -0
- package/types/npm/runtime-node.d.ts.map +1 -0
- package/types/npm/runtime-web.d.ts +4 -0
- package/types/npm/runtime-web.d.ts.map +1 -0
- package/types/runtime/index.d.ts +48 -14
- package/types/runtime/index.d.ts.map +1 -1
- package/types/runtime/node.d.ts +15 -0
- package/types/runtime/node.d.ts.map +1 -0
- package/types/runtime/web/output-barrier.d.ts +30 -0
- package/types/runtime/web/output-barrier.d.ts.map +1 -0
- package/types/runtime/web/persistent-storage.d.ts +36 -0
- package/types/runtime/web/persistent-storage.d.ts.map +1 -0
- package/types/runtime/web.d.ts +11 -0
- package/types/runtime/web.d.ts.map +1 -0
- package/types/vdr/tel-publication.d.ts +6 -0
- package/types/vdr/tel-publication.d.ts.map +1 -1
- package/types/version.d.ts +2 -2
- package/esm/keri/npm/src/acdc/relating.js +0 -59
- package/esm/keri/npm/src/cli/common/tel-completion.js +0 -24
- package/esm/keri/npm/src/db/baser-defaults.js +0 -11
- package/types/acdc/relating.d.ts +0 -21
- package/types/acdc/relating.d.ts.map +0 -1
- package/types/cli/common/tel-completion.d.ts +0 -8
- package/types/cli/common/tel-completion.d.ts.map +0 -1
- package/types/db/baser-defaults.d.ts +0 -5
- package/types/db/baser-defaults.d.ts.map +0 -1
|
@@ -2,33 +2,35 @@ import { Organizer } from "../identity/organizing.js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Multisig proposal and approval workflows.
|
|
4
4
|
*
|
|
5
|
-
* CLI orchestration owns timed waits, worker lifetimes, prompts and output.
|
|
6
5
|
* This module publishes proposals and approves stored KEL/RPY/VDR proposals
|
|
7
|
-
* without starting or driving background workers.
|
|
6
|
+
* without starting or driving background workers. `approveGroupProposal` is the
|
|
7
|
+
* only caller that approves; it never asks, because calling it is the consent.
|
|
8
8
|
*/
|
|
9
|
-
import { attachmentPayload, collectPayload, concatBytes, Counter, Diger, Ilks, NumberPrimitive, NumDex, parseBytes, Prefixer, SerderACDC, SerderKERI, TraitDex, Vrsn_2_0, } from "cesr-ts";
|
|
9
|
+
import { attachmentPayload, collectPayload, concatBytes, Counter, Diger, Ilks, NumberPrimitive, NumDex, parseBytes, Prefixer, SerderACDC, SerderKERI, TraitDex, Verfer, Vrsn_2_0, } from "cesr-ts";
|
|
10
10
|
import { verifyRegistryAnchor, vetBlind, } from "../../acdc/regeventing.js";
|
|
11
11
|
import { publicOpeningAttachment } from "../../acdc/registering.js";
|
|
12
12
|
import { ValidationError } from "../../core/errors.js";
|
|
13
|
-
import { isV2RegistryRoute } from "../../core/exchange/protocol-exchanging.js";
|
|
14
13
|
import { Kever } from "../../core/kel/kever.js";
|
|
15
14
|
import { messagize } from "../../core/protocol-serialization.js";
|
|
16
15
|
import { RegistryRecord } from "../../core/records.js";
|
|
16
|
+
import { dgKey } from "../../db/core/keys.js";
|
|
17
17
|
import { loadNests } from "../../db/exchange/exchange-nests.js";
|
|
18
18
|
import { Credentialer, Registry, serializeCredential } from "../../vdr/credentialing.js";
|
|
19
19
|
import { envelopeFromFrame } from "../protocol/parsering.js";
|
|
20
20
|
import { groupCredentialAnchorReady, validateCredentialIssueProposal, validateCredentialRevocationProposal, validateCredentialSource, validateRegistryName, validateRegistryProposal, } from "../credentials/credential-proposals.js";
|
|
21
|
+
import { telEventStatus } from "../credentials/tel-completion.js";
|
|
21
22
|
import { endpointRoleAccepted, groupEndorseReply, groupEventKeys, groupSigningMembers, localGroupMember, signLocalGroupEvent, } from "../identity/endpoint-roleing.js";
|
|
22
23
|
import { Reactor } from "../protocol/reactor.js";
|
|
23
24
|
import { abortable } from "../runtime/abortable.js";
|
|
24
25
|
import { collectBytes } from "../transport/byte-source.js";
|
|
25
26
|
import { findLocalGroupMember as findLocalMember, groupMemberHasKey, uniqueMembers } from "./group-members.js";
|
|
26
27
|
import { acdcV2RegistryProposal, MULTISIG_ICP_ROUTE, MULTISIG_ISS_ROUTE, MULTISIG_IXN_ROUTE, MULTISIG_REV_ROUTE, MULTISIG_ROT_ROUTE, MULTISIG_RPY_ROUTE, MULTISIG_VCP_ROUTE, multisigChild, multisigChildEvidence, multisigChildGenusAttrs, prepareAcdcV2RegistryExn, prepareMultisigEventExn, prepareMultisigVdrExn, registryProposalEvent, } from "./grouping.js";
|
|
27
|
-
import { admitAndSendGroupMessage, groupSendResult,
|
|
28
|
+
import { admitAndSendGroupMessage, groupSendResult, prepareGroupMessage, remoteGroupMembers, signGroupMessage, storedGroupMessage, } from "./multisig-messaging.js";
|
|
28
29
|
/** Approve one exact ACDC v2 TEL/anchor through existing member signing and ordinary processors.
|
|
29
30
|
* A returned wrapper records consent, not quorum/witness/TEL completion; retry the accepted-state owners.
|
|
31
|
+
* `resume` reuses this member's recorded anchor signatures after a crash instead of signing again.
|
|
30
32
|
*/
|
|
31
|
-
export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, opening } = {}) {
|
|
33
|
+
export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, opening, resume } = {}) {
|
|
32
34
|
const registry = protocol.registry, member = localGroupMember(hby, group.pre);
|
|
33
35
|
if (!registry || group.db !== hby.db || registry.db !== hby.db) {
|
|
34
36
|
throw new ValidationError("ACDC v2 group registry owner is unavailable.");
|
|
@@ -105,7 +107,10 @@ export function* approveAcdcV2Registry(hby, protocol, group, event, { anchor, op
|
|
|
105
107
|
throw new ValidationError("Registry anchor does not extend the current group event.");
|
|
106
108
|
}
|
|
107
109
|
const keys = groupEventKeys(hby, group.pre, anchor);
|
|
108
|
-
const
|
|
110
|
+
const members = groupSigningMembers(hby, group.pre);
|
|
111
|
+
// A resuming caller reuses the signatures the first attempt recorded in `sigs.` instead of signing the anchor again.
|
|
112
|
+
const sigers = (resume ? recordedLocalSignatures(hby, anchor, group.pre, members) : null)
|
|
113
|
+
?? signLocalGroupEvent(hby, anchor, members, keys);
|
|
109
114
|
const own = messagize(anchor, { sigers, gvrsn: Vrsn_2_0 });
|
|
110
115
|
const tel = concatBytes(event.raw, Counter.enclose({
|
|
111
116
|
code: "AttachmentGroup",
|
|
@@ -152,9 +157,10 @@ export function* publishAcdcV2Registry(hby, postman, group, approval) {
|
|
|
152
157
|
* @param proposal Route-correlated group proposal with its named business fields.
|
|
153
158
|
* @param embeddedMessage Signed child wire to include under the route-derived label.
|
|
154
159
|
* @param childGvrsn Optional explicit attachment genus for the child.
|
|
160
|
+
* @param wrapperVersion Optional wrapper protocol version; an approval mirrors its proposal's.
|
|
155
161
|
* @returns Stable proposal/wrapper identities and completed deliveries, independent of group acceptance.
|
|
156
162
|
*/
|
|
157
|
-
export function* publishProposal(hby, protocol, postman, member, recipients, proposal, embeddedMessage, childGvrsn) {
|
|
163
|
+
export function* publishProposal(hby, protocol, postman, member, recipients, proposal, embeddedMessage, childGvrsn, wrapperVersion) {
|
|
158
164
|
const input = new Reactor(protocol);
|
|
159
165
|
const outcomes = [];
|
|
160
166
|
for (const recipient of remoteGroupMembers(hby, member, recipients)) {
|
|
@@ -162,6 +168,7 @@ export function* publishProposal(hby, protocol, postman, member, recipients, pro
|
|
|
162
168
|
const prepared = yield* prepareMultisigEventExn(member.pre, proposal, embeddedMessage, {
|
|
163
169
|
recipient: destination,
|
|
164
170
|
childGvrsn,
|
|
171
|
+
...(wrapperVersion ? { pvrsn: wrapperVersion } : {}),
|
|
165
172
|
});
|
|
166
173
|
const signed = yield* prepareGroupMessage(protocol.exc, member, destination, prepared);
|
|
167
174
|
outcomes.push(yield* admitAndSendGroupMessage(input, postman, signed));
|
|
@@ -220,109 +227,34 @@ export function routeForKelEvent(serder) {
|
|
|
220
227
|
}
|
|
221
228
|
}
|
|
222
229
|
/**
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
* Notices discover candidates; their attributes do not authorize a route or group.
|
|
226
|
-
* An explicit accepted wrapper missing its handler index is replayed by the caller.
|
|
230
|
+
* Approve and publish this member's contribution to one `rip` or `bup` proposal.
|
|
231
|
+
* Null when the proposal is not a well-formed one for a joined group; it then stays inert.
|
|
227
232
|
*/
|
|
228
|
-
function*
|
|
229
|
-
const
|
|
230
|
-
const
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
if (group && group !== proposalGroup) {
|
|
254
|
-
if (options.said) {
|
|
255
|
-
throw new ValidationError(`Multisig exchange ${said} belongs to group ${proposalGroup}, not ${group}.`);
|
|
256
|
-
}
|
|
257
|
-
continue;
|
|
258
|
-
}
|
|
259
|
-
selected.push({ exn, route, indexed });
|
|
260
|
-
}
|
|
261
|
-
return selected;
|
|
262
|
-
}
|
|
263
|
-
/** Approve matching stored evidence; host progress and deadlines belong to the caller. */
|
|
264
|
-
export function* approvePendingMultisigProposal(hby, runtime, options) {
|
|
265
|
-
const notifier = runtime.notifier;
|
|
266
|
-
if (!notifier && !options.said) {
|
|
267
|
-
throw new ValidationError("Multisig join requires notification storage or an explicit exchange SAID.");
|
|
268
|
-
}
|
|
269
|
-
const notices = (notifier?.list(0, 100) ?? []);
|
|
270
|
-
for (const { exn, route, indexed } of yield* pendingMultisigProposals(hby, runtime, notices, options)) {
|
|
271
|
-
if (!indexed) {
|
|
272
|
-
// Acceptance commits before the asynchronous handler. Resume that ordinary
|
|
273
|
-
// authenticated intake after interruption; never synthesize approval indexes.
|
|
274
|
-
const message = yield* abortable(signal => collectBytes(runtime.exc.replay(exn.said, signal)));
|
|
275
|
-
yield* runtime.reactor.processBytes(message, { local: true });
|
|
276
|
-
const payloadSaid = multisigPayloadSaid(exn);
|
|
277
|
-
if (!hby.db.meids.get([payloadSaid]).some(index => index.qb64 === exn.said))
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
const rgy = isVdrRoute(route) ? runtime.vdr : null;
|
|
281
|
-
let result;
|
|
282
|
-
if (isKelRoute(route)) {
|
|
283
|
-
result = yield* approveKelProposal(hby, runtime, exn, route, options);
|
|
284
|
-
}
|
|
285
|
-
else if (isVdrRoute(route)) {
|
|
286
|
-
result = yield* approveVdrProposal(hby, rgy, runtime, exn, route, options);
|
|
287
|
-
}
|
|
288
|
-
else if (isV2RegistryRoute(route)) {
|
|
289
|
-
const nests = loadNests(hby.db, exn.said);
|
|
290
|
-
const proposal = acdcV2RegistryProposal(exn, nests, runtime.acdc?.store ?? null);
|
|
291
|
-
const group = proposal?.anchor.pre ? hby.habs.get(proposal.anchor.pre) : null;
|
|
292
|
-
if (!proposal || !group)
|
|
293
|
-
continue;
|
|
294
|
-
const head = group.kever?.serder.said;
|
|
295
|
-
if (!head)
|
|
296
|
-
throw new ValidationError("Registry approval requires an accepted local group.");
|
|
297
|
-
if (!options.callbacks.approveProposal({ route, group: group.pre, embedded: proposal.tel.said }))
|
|
298
|
-
continue;
|
|
299
|
-
if (group.kever?.serder.said !== head || !acdcV2RegistryProposal(exn, nests, runtime.acdc?.store ?? null)) {
|
|
300
|
-
throw new ValidationError("Group or registry changed while approval was pending.");
|
|
301
|
-
}
|
|
302
|
-
const envelope = envelopeFromFrame(nests[0]), opening = [...envelope.bsqs, ...envelope.bsss];
|
|
303
|
-
if (opening.length > 1)
|
|
304
|
-
throw new ValidationError("Registry proposal carries multiple openings.");
|
|
305
|
-
const approval = yield* approveAcdcV2Registry(hby, runtime.protocol, group, proposal.tel, {
|
|
306
|
-
anchor: proposal.anchor,
|
|
307
|
-
opening: opening[0],
|
|
308
|
-
});
|
|
309
|
-
const published = yield* publishAcdcV2Registry(hby, runtime.postman, group, approval);
|
|
310
|
-
const regid = proposal.tel.ilk === "rip" ? proposal.tel.said : proposal.tel.regid;
|
|
311
|
-
const accepted = runtime.acdc.store.seqEvent(regid, Number(BigInt(`0x${proposal.tel.sad.n}`)))?.said === proposal.tel.said;
|
|
312
|
-
result = { route, said: exn.said, embedded: proposal.tel.said, group: group.pre, accepted, ...published };
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
result = yield* approveRpyProposal(hby, runtime, exn, route, options);
|
|
316
|
-
}
|
|
317
|
-
if (result) {
|
|
318
|
-
for (const note of notices) {
|
|
319
|
-
if (note.attrs.d === exn.said)
|
|
320
|
-
notifier?.remove(note.rid);
|
|
321
|
-
}
|
|
322
|
-
return result;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return null;
|
|
233
|
+
export function* approveRegistryV2Proposal(hby, runtime, exn, route, options) {
|
|
234
|
+
const nests = loadNests(hby.db, exn.said);
|
|
235
|
+
const proposal = acdcV2RegistryProposal(exn, nests, runtime.registryStore);
|
|
236
|
+
const group = proposal?.anchor.pre ? hby.habs.get(proposal.anchor.pre) : null;
|
|
237
|
+
if (!proposal || !group)
|
|
238
|
+
return null;
|
|
239
|
+
const head = group.kever?.serder.said;
|
|
240
|
+
if (!head)
|
|
241
|
+
throw new ValidationError("Registry approval requires an accepted local group.");
|
|
242
|
+
if (group.kever?.serder.said !== head || !acdcV2RegistryProposal(exn, nests, runtime.registryStore)) {
|
|
243
|
+
throw new ValidationError("Group or registry changed while approval was pending.");
|
|
244
|
+
}
|
|
245
|
+
const envelope = envelopeFromFrame(nests[0]), opening = [...envelope.bsqs, ...envelope.bsss];
|
|
246
|
+
if (opening.length > 1)
|
|
247
|
+
throw new ValidationError("Registry proposal carries multiple openings.");
|
|
248
|
+
const approval = yield* approveAcdcV2Registry(hby, runtime.protocol, group, proposal.tel, {
|
|
249
|
+
anchor: proposal.anchor,
|
|
250
|
+
opening: opening[0],
|
|
251
|
+
resume: options.resume,
|
|
252
|
+
});
|
|
253
|
+
const published = yield* publishAcdcV2Registry(hby, runtime.postman, group, approval);
|
|
254
|
+
const regid = proposal.tel.ilk === "rip" ? proposal.tel.said : proposal.tel.regid;
|
|
255
|
+
const accepted = runtime.registryStore?.seqEvent(regid, Number(BigInt(`0x${proposal.tel.sad.n}`)))?.said
|
|
256
|
+
=== proposal.tel.said;
|
|
257
|
+
return { route, said: exn.said, embedded: proposal.tel.said, group: group.pre, accepted, ...published };
|
|
326
258
|
}
|
|
327
259
|
/**
|
|
328
260
|
* Approve and publish a local contribution to one endpoint-role reply proposal.
|
|
@@ -333,10 +265,10 @@ export function* approvePendingMultisigProposal(hby, runtime, options) {
|
|
|
333
265
|
* @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
|
|
334
266
|
* @param exn Stored multisig exchange wrapper.
|
|
335
267
|
* @param route Selected multisig route identifying the proposal kind.
|
|
336
|
-
* @param options
|
|
268
|
+
* @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
|
|
337
269
|
* @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
|
|
338
270
|
*/
|
|
339
|
-
function* approveRpyProposal(hby, runtime, exn, route, options) {
|
|
271
|
+
export function* approveRpyProposal(hby, runtime, exn, route, options) {
|
|
340
272
|
const wrapperSaid = exn.said;
|
|
341
273
|
if (!wrapperSaid) {
|
|
342
274
|
return null;
|
|
@@ -354,9 +286,6 @@ function* approveRpyProposal(hby, runtime, exn, route, options) {
|
|
|
354
286
|
const { event: rpySerder, attachment, genus } = child;
|
|
355
287
|
const embeddedSaid = rpySerder.said ?? "";
|
|
356
288
|
const prior = storedGroupMessage(hby.db, member.pre, exn);
|
|
357
|
-
if (!prior && !options.callbacks.approveProposal({ route, group: groupPre, embedded: embeddedSaid || "<unknown>" })) {
|
|
358
|
-
return null;
|
|
359
|
-
}
|
|
360
289
|
yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), rpySerder.raw, attachment), { local: true });
|
|
361
290
|
let localRpy;
|
|
362
291
|
if (prior) {
|
|
@@ -384,10 +313,10 @@ function* approveRpyProposal(hby, runtime, exn, route, options) {
|
|
|
384
313
|
* @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
|
|
385
314
|
* @param exn Stored multisig exchange wrapper.
|
|
386
315
|
* @param route Selected multisig route identifying the proposal kind.
|
|
387
|
-
* @param options
|
|
316
|
+
* @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
|
|
388
317
|
* @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
|
|
389
318
|
*/
|
|
390
|
-
function* approveKelProposal(hby, runtime, exn, route, options) {
|
|
319
|
+
export function* approveKelProposal(hby, runtime, exn, route, options) {
|
|
391
320
|
const wrapperSaid = exn.said;
|
|
392
321
|
if (!wrapperSaid) {
|
|
393
322
|
return null;
|
|
@@ -427,24 +356,36 @@ function* approveKelProposal(hby, runtime, exn, route, options) {
|
|
|
427
356
|
if (eventAccepted(hby, serder) && !smids.some(mid => hby.habs.has(mid))) {
|
|
428
357
|
return null;
|
|
429
358
|
}
|
|
430
|
-
|
|
431
|
-
|
|
359
|
+
// Signing writes the member's signatures to `sigs.` when the event is first
|
|
360
|
+
// processed, before any wrapper exists. A resuming caller (explicit consent
|
|
361
|
+
// already given) finds them and reuses them: no second signature and no
|
|
362
|
+
// second join.
|
|
363
|
+
const signed = options.resume ? recordedLocalSignatures(hby, serder, groupPre, smids) : null;
|
|
364
|
+
if (signed) {
|
|
365
|
+
localMessage = messagize(serder, { sigers: signed, pipelined: false, gvrsn: approval.genus });
|
|
432
366
|
}
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
367
|
+
else {
|
|
368
|
+
if (proposal.route === MULTISIG_ICP_ROUTE || (proposal.route === MULTISIG_ROT_ROUTE && !hby.habs.has(groupPre))) {
|
|
369
|
+
const rmids = proposal.attrs.rmids;
|
|
370
|
+
const alias = options.groupAlias;
|
|
371
|
+
if (!alias)
|
|
372
|
+
throw new ValidationError(`A group alias is required to join ${groupPre}.`);
|
|
373
|
+
hby.joinGroupHab(groupPre, alias, member, smids, rmids.length > 0 ? rmids : smids);
|
|
374
|
+
}
|
|
375
|
+
const keys = groupEventKeys(hby, groupPre, serder);
|
|
376
|
+
const sigers = signLocalGroupEvent(hby, serder, smids, keys);
|
|
377
|
+
localMessage = messagize(serder, { sigers, pipelined: false, gvrsn: approval.genus });
|
|
437
378
|
}
|
|
438
|
-
const keys = groupEventKeys(hby, groupPre, serder);
|
|
439
|
-
const sigers = signLocalGroupEvent(hby, serder, smids, keys);
|
|
440
|
-
localMessage = messagize(serder, { sigers, pipelined: false, gvrsn: approval.genus });
|
|
441
379
|
}
|
|
442
380
|
// Each contribution may already own a counted attachment enclosure. Admit
|
|
443
381
|
// complete messages separately and let the ordinary KEL owner union proofs.
|
|
444
382
|
yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(approval.genus), localMessage), { local: true });
|
|
445
383
|
yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(approval.genus), serder.raw, approval.attachment), { local: true });
|
|
446
384
|
yield* runtime.protocol.processEscrowsOnce();
|
|
447
|
-
const publication = yield* publishProposal(hby, runtime.protocol, runtime.postman, member, members, proposal, localMessage, approval.genus
|
|
385
|
+
const publication = yield* publishProposal(hby, runtime.protocol, runtime.postman, member, members, proposal, localMessage, approval.genus,
|
|
386
|
+
// KERIpy indexes contributions by wrapper form (v1 `e` SAID, v2 child SAID), so an
|
|
387
|
+
// approval must reuse its proposal's wrapper version for the proposer to merge it.
|
|
388
|
+
exn.pvrsn);
|
|
448
389
|
const accepted = eventAccepted(hby, serder);
|
|
449
390
|
if (proposal.route !== MULTISIG_IXN_ROUTE) {
|
|
450
391
|
commitAcceptedGroupMembers(hby, serder, smids, proposal.attrs.rmids);
|
|
@@ -461,10 +402,10 @@ function* approveKelProposal(hby, runtime, exn, route, options) {
|
|
|
461
402
|
* @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
|
|
462
403
|
* @param exn Stored multisig exchange wrapper.
|
|
463
404
|
* @param route Selected multisig route identifying the proposal kind.
|
|
464
|
-
* @param options
|
|
405
|
+
* @param options Alias and name choices plus `resume`; a proposal that is not well formed is left inert.
|
|
465
406
|
* @returns Approval result with protocol acceptance and deliveries, or null for declined/incomplete input.
|
|
466
407
|
*/
|
|
467
|
-
function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
|
|
408
|
+
export function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
|
|
468
409
|
const wrapperSaid = exn.said;
|
|
469
410
|
if (!wrapperSaid) {
|
|
470
411
|
return null;
|
|
@@ -522,15 +463,14 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
|
|
|
522
463
|
const prior = storedGroupMessage(hby.db, member.pre, exn);
|
|
523
464
|
if (!prior && !groupCredentialAnchorReady(hby, groupPre, anchorSerder))
|
|
524
465
|
return null;
|
|
525
|
-
|
|
526
|
-
return null;
|
|
527
|
-
}
|
|
528
|
-
// Declined or malformed proposals remain inert; require VDR before signing or intake.
|
|
466
|
+
// Malformed proposals remain inert; require VDR before signing or intake.
|
|
529
467
|
if (!rgy)
|
|
530
468
|
throw new ValidationError("Legacy credential registry is unavailable in this runtime.");
|
|
531
469
|
let registryName;
|
|
532
470
|
if (proposal.route === MULTISIG_VCP_ROUTE && !prior) {
|
|
533
|
-
registryName = options.
|
|
471
|
+
registryName = options.registryName;
|
|
472
|
+
if (!registryName)
|
|
473
|
+
throw new ValidationError(`A registry name is required for ${embeddedSerder.pre}.`);
|
|
534
474
|
validateRegistryName(rgy.reger, registryName, embeddedSerder.pre);
|
|
535
475
|
}
|
|
536
476
|
const smids = groupSigningMembers(hby, groupPre);
|
|
@@ -540,7 +480,8 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
|
|
|
540
480
|
}
|
|
541
481
|
else {
|
|
542
482
|
const keys = groupEventKeys(hby, groupPre, anchorSerder);
|
|
543
|
-
const sigers =
|
|
483
|
+
const sigers = (options.resume ? recordedLocalSignatures(hby, anchorSerder, groupPre, smids) : null)
|
|
484
|
+
?? signLocalGroupEvent(hby, anchorSerder, smids, keys);
|
|
544
485
|
localAnchor = messagize(anchorSerder, { sigers, pipelined: false, gvrsn: genus });
|
|
545
486
|
}
|
|
546
487
|
yield* runtime.reactor.processBytes(concatBytes(Counter.makeGVC(genus), localAnchor), { local: true });
|
|
@@ -595,13 +536,32 @@ function* approveVdrProposal(hby, rgy, runtime, exn, route, options) {
|
|
|
595
536
|
tel: {
|
|
596
537
|
pre: embeddedSerder.pre,
|
|
597
538
|
sn: embeddedSerder.sn,
|
|
598
|
-
publicationComplete: rgy.publication
|
|
539
|
+
publicationComplete: telEventStatus({ publication: rgy.publication }, embeddedSerder.pre, embeddedSerder.sn).state === "complete",
|
|
599
540
|
},
|
|
600
541
|
...published,
|
|
601
542
|
};
|
|
602
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* This process's verified signatures for a group event, one per local signing
|
|
546
|
+
* member, read from `sigs.`; null unless every local member's key index has one.
|
|
547
|
+
* Remote members' signatures in the same row never count.
|
|
548
|
+
*/
|
|
549
|
+
function recordedLocalSignatures(hby, serder, groupPre, smids) {
|
|
550
|
+
if (!hby.habs.has(groupPre) || !serder.pre || !serder.said)
|
|
551
|
+
return null;
|
|
552
|
+
const local = smids.flatMap((mid, index) => hby.habs.has(mid) ? [index] : []);
|
|
553
|
+
const stored = hby.db.sigs.get(dgKey(serder.pre, serder.said));
|
|
554
|
+
if (local.length === 0 || stored.length === 0)
|
|
555
|
+
return null;
|
|
556
|
+
const verfers = groupEventKeys(hby, groupPre, serder).map(qb64 => new Verfer({ qb64 }));
|
|
557
|
+
const { sigers } = Kever.verifyIndexedSignatures(serder.raw, stored, verfers);
|
|
558
|
+
const own = sigers.filter(siger => local.includes(siger.index));
|
|
559
|
+
return local.every(index => own.some(siger => siger.index === index))
|
|
560
|
+
? own.sort((left, right) => left.index - right.index)
|
|
561
|
+
: null;
|
|
562
|
+
}
|
|
603
563
|
/** Preserve the recorded signing/rotation participant order during approval and resume. */
|
|
604
|
-
function kelApprovalMembers({ proposal }) {
|
|
564
|
+
export function kelApprovalMembers({ proposal }) {
|
|
605
565
|
if (proposal.route === MULTISIG_IXN_ROUTE)
|
|
606
566
|
return [...proposal.attrs.smids];
|
|
607
567
|
return uniqueMembers([...proposal.attrs.smids, ...proposal.attrs.rmids]);
|
|
@@ -657,7 +617,7 @@ function kelProposalLabel(route) {
|
|
|
657
617
|
}
|
|
658
618
|
}
|
|
659
619
|
/** Decode the fields used by approval, preserving existing missing-embed and member-list behavior. */
|
|
660
|
-
function kelApproval(exn, route, child) {
|
|
620
|
+
export function kelApproval(exn, route, child) {
|
|
661
621
|
if (!child)
|
|
662
622
|
return null;
|
|
663
623
|
const { event } = child;
|
|
@@ -786,7 +746,7 @@ function rpyAttrs(serder) {
|
|
|
786
746
|
}
|
|
787
747
|
return { cid: attrs.cid, role: attrs.role, eid: attrs.eid };
|
|
788
748
|
}
|
|
789
|
-
function payloadSection(ked) {
|
|
749
|
+
export function payloadSection(ked) {
|
|
790
750
|
return isRecord(ked.a) ? ked.a : {};
|
|
791
751
|
}
|
|
792
752
|
function embeddedSection(ked) {
|
|
@@ -807,10 +767,10 @@ function stringField(record, field) {
|
|
|
807
767
|
function isRecord(value) {
|
|
808
768
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
809
769
|
}
|
|
810
|
-
function isKelRoute(route) {
|
|
770
|
+
export function isKelRoute(route) {
|
|
811
771
|
return route === MULTISIG_ICP_ROUTE || route === MULTISIG_ROT_ROUTE || route === MULTISIG_IXN_ROUTE;
|
|
812
772
|
}
|
|
813
|
-
function isVdrRoute(route) {
|
|
773
|
+
export function isVdrRoute(route) {
|
|
814
774
|
return route === MULTISIG_VCP_ROUTE || route === MULTISIG_ISS_ROUTE || route === MULTISIG_REV_ROUTE;
|
|
815
775
|
}
|
|
816
776
|
function requireText(value, label) {
|