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
|
@@ -1,18 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
/**
|
|
2
|
+
* `tufa multisig ...` command implementation.
|
|
3
|
+
*
|
|
4
|
+
* The command surface follows KLI's group lifecycle model and calls the library's
|
|
5
|
+
* proposal API; a command only parses, resolves the user's choices, waits on the
|
|
6
|
+
* Counselor under runtime workers and returns what to print:
|
|
7
|
+
* - `incept`, `rotate`, and `interact` propose a group KEL event (`proposeGroup*`)
|
|
8
|
+
* and publish a `/multisig/*` EXN to the other members
|
|
9
|
+
* - `join` approves one stored proposal the user consents to
|
|
10
|
+
* (`approveGroupProposal`) and signs nothing else; see `group-join.ts`
|
|
11
|
+
*/
|
|
12
|
+
import { Ilks } from "cesr-ts";
|
|
13
|
+
import { action } from "effection";
|
|
14
|
+
import { registryEventRef, registryEventStatus, settleRegistryEvent } from "../../app/credentials/registry-settling.js";
|
|
15
|
+
import { telEventStatus, waitForIssuedCredential, waitForTelEvent, } from "../../app/credentials/tel-completion.js";
|
|
16
|
+
import { endpointRoleAccepted, isLocalGroupHab, localGroupMember, proposeGroupEndpointRole, } from "../../app/identity/endpoint-roleing.js";
|
|
17
|
+
import { MULTISIG_REV_ROUTE, MULTISIG_ROT_ROUTE, MULTISIG_VCP_ROUTE } from "../../app/multisig/grouping.js";
|
|
18
|
+
import { routeForKelEvent } from "../../app/multisig/multisig-workflows.js";
|
|
19
|
+
import { proposeGroupInception, proposeGroupInteraction, proposeGroupRotation, settleProposedRotation, } from "../../app/multisig/proposing.js";
|
|
20
|
+
import { observeUntil } from "../../app/runtime/workflow-contract.js";
|
|
9
21
|
import { ValidationError } from "../../core/errors.js";
|
|
22
|
+
import { isV2RegistryRoute } from "../../core/exchange/protocol-exchanging.js";
|
|
10
23
|
import { Roles } from "../../core/roles.js";
|
|
11
24
|
import { withAgentRuntime } from "../common/context.js";
|
|
12
25
|
import { loadOptionObject, loadRotateFileOptions, parseBooleanOption, parseCountOption, parseDataItems, parseFileData, parseKeriVersionOption, parseNumberOption, parseStringListOption, parseStringOption, parseThresholdOption, } from "../common/parsing.js";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
26
|
+
import { withRuntimeWorkers } from "../common/runtime-workers.js";
|
|
27
|
+
import { joinProposal } from "./group-join.js";
|
|
28
|
+
import { counselInputs, finishAcceptedEvent, supplyDelegationProxy, supplyWitnessAuths, waitForAcceptance, } from "./group-wait.js";
|
|
29
|
+
import { rootCopyLine } from "./root-copy-lines.js";
|
|
30
|
+
/**
|
|
31
|
+
* Re-seal held registry roots to members an accepted group rotation added or
|
|
32
|
+
* rekeyed, as KERIpy `kli multisig rotate|join`. Runs while the command's
|
|
33
|
+
* runtime worker delivers; every outcome is returned, none fails the rotation.
|
|
34
|
+
*/
|
|
35
|
+
function* resealAfterRotation(hby, runtime, group, rotation) {
|
|
36
|
+
const replicating = runtime.rootReplicator;
|
|
37
|
+
if (!hby.habs.get(group) || !replicating)
|
|
38
|
+
return [];
|
|
39
|
+
replicating.prompt(group);
|
|
40
|
+
return (yield* replicating.processOnce()).map(rootCopyLine);
|
|
41
|
+
}
|
|
16
42
|
function requireText(value, label) {
|
|
17
43
|
if (!value) {
|
|
18
44
|
throw new ValidationError(`${label} is required and cannot be empty`);
|
|
@@ -63,8 +89,9 @@ export function* multisigInceptCommand(args) {
|
|
|
63
89
|
throw new ValidationError("Multisig inception config must include non-empty aids.");
|
|
64
90
|
}
|
|
65
91
|
return yield* withMultisigRuntime(commandArgs, name, function* ({ hby, runtime }) {
|
|
66
|
-
const
|
|
67
|
-
|
|
92
|
+
const sent = yield* proposeGroupInception(proposeDeps(hby, runtime), requireHabByAlias(hby, alias), group, {
|
|
93
|
+
smids,
|
|
94
|
+
rmids,
|
|
68
95
|
isith: options.isith,
|
|
69
96
|
nsith: options.nsith,
|
|
70
97
|
toad: options.toad,
|
|
@@ -72,33 +99,13 @@ export function* multisigInceptCommand(args) {
|
|
|
72
99
|
delpre: options.delpre,
|
|
73
100
|
data: options.data ?? [],
|
|
74
101
|
version: commandArgs.version,
|
|
75
|
-
});
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}, created.message);
|
|
80
|
-
const accepted = yield* waitForGroupAcceptance(hby, runtime, created.serder, multisigApprovalOptions(hby, {
|
|
81
|
-
...commandArgs,
|
|
82
|
-
group,
|
|
83
|
-
auto: true,
|
|
84
|
-
}));
|
|
85
|
-
let delegationPhase = null;
|
|
86
|
-
if (accepted) {
|
|
87
|
-
yield* receiptAcceptedEvent(hby, created.hab.pre, commandArgs, runtime);
|
|
88
|
-
delegationPhase = yield* completeDelegationIfNeeded(hby, runtime, created.hab.pre, commandArgs.proxy);
|
|
89
|
-
}
|
|
90
|
-
return {
|
|
91
|
-
route: MULTISIG_ICP_ROUTE,
|
|
92
|
-
group: created.hab.pre,
|
|
93
|
-
accepted,
|
|
94
|
-
messages,
|
|
95
|
-
deliveries,
|
|
96
|
-
state: hby.db.getState(created.hab.pre),
|
|
97
|
-
delegationPhase: delegationPhase,
|
|
98
|
-
};
|
|
102
|
+
}, counselInputs(hby, commandArgs.proxy, options.delpre !== undefined, group));
|
|
103
|
+
const accepted = yield* waitForAcceptance(hby, runtime, sent.event, approvalDeadline(commandArgs));
|
|
104
|
+
const delegationPhase = accepted ? yield* finishAcceptedEvent(hby, runtime, sent.event, commandArgs) : null;
|
|
105
|
+
return { ...groupEventResult(hby, sent, accepted), delegationPhase };
|
|
99
106
|
});
|
|
100
107
|
}
|
|
101
|
-
/**
|
|
108
|
+
/** Approve one stored group multisig proposal the user consents to. */
|
|
102
109
|
export function* multisigJoinCommand(args) {
|
|
103
110
|
const commandArgs = {
|
|
104
111
|
name: parseStringOption(args.name, "name"),
|
|
@@ -120,43 +127,48 @@ export function* multisigJoinCommand(args) {
|
|
|
120
127
|
};
|
|
121
128
|
const name = requireText(commandArgs.name, "Name");
|
|
122
129
|
return yield* withMultisigRuntime(commandArgs, name, function* ({ hby, runtime }) {
|
|
123
|
-
const
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
130
|
+
const deadline = approvalDeadline(commandArgs);
|
|
131
|
+
const joined = yield* joinProposal(approvalDeps(hby, runtime), {
|
|
132
|
+
group: commandArgs.group,
|
|
133
|
+
said: commandArgs.said,
|
|
134
|
+
deadline,
|
|
135
|
+
confirm: proposal => approvePrompt(commandArgs, proposal),
|
|
136
|
+
groupAlias: proposal => chooseGroupAlias(hby, commandArgs, proposal.group),
|
|
137
|
+
registryName: proposal => chooseRegistryName(commandArgs, proposal.embedded),
|
|
138
|
+
inputs: () => ({ fallbackAfterMs: 0 }),
|
|
139
|
+
});
|
|
140
|
+
if (!joined) {
|
|
141
|
+
const local = yield* completeLocalGroupEvent(hby, runtime, commandArgs, deadline);
|
|
127
142
|
if (!local) {
|
|
128
143
|
throw new ValidationError("No matching stored multisig proposal was available to join.");
|
|
129
144
|
}
|
|
130
|
-
if (local.accepted) {
|
|
131
|
-
yield* receiptAcceptedEvent(hby, local.group, commandArgs, runtime);
|
|
132
|
-
if (local.route === MULTISIG_ICP_ROUTE || local.route === MULTISIG_ROT_ROUTE) {
|
|
133
|
-
yield* completeDelegationIfNeeded(hby, runtime, local.group, commandArgs.proxy);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
145
|
return local;
|
|
137
146
|
}
|
|
147
|
+
const { event, ...result } = joined.result;
|
|
138
148
|
if (result.tel) {
|
|
139
149
|
const { publication, reger } = runtime.vdr;
|
|
140
150
|
const tel = result.tel;
|
|
141
151
|
if (result.route === MULTISIG_VCP_ROUTE || result.route === MULTISIG_REV_ROUTE) {
|
|
142
|
-
yield*
|
|
152
|
+
yield* waitForTelEvent({ publication }, tel.pre, tel.sn, { deadline });
|
|
143
153
|
result.accepted = reger.tels.getOn(tel.pre, tel.sn)?.qb64 === result.embedded;
|
|
144
154
|
}
|
|
145
155
|
else {
|
|
146
|
-
yield* waitForIssuedCredential(publication, tel.pre,
|
|
156
|
+
yield* waitForIssuedCredential({ publication }, tel.pre, { deadline });
|
|
147
157
|
result.accepted = reger.saved.get(tel.pre) !== null;
|
|
148
158
|
}
|
|
149
|
-
tel.publicationComplete = publication
|
|
159
|
+
tel.publicationComplete = telEventStatus({ publication }, tel.pre, tel.sn).state === "complete";
|
|
150
160
|
return result;
|
|
151
161
|
}
|
|
152
|
-
if (result.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
yield* completeDelegationIfNeeded(hby, runtime, result.group, commandArgs.proxy);
|
|
157
|
-
}
|
|
162
|
+
if (isV2RegistryRoute(result.route)) {
|
|
163
|
+
supplyWitnessAuths(hby, runtime, event, commandArgs);
|
|
164
|
+
result.accepted = yield* settleRegistryApproval(hby, runtime, result, deadline);
|
|
165
|
+
return result;
|
|
158
166
|
}
|
|
159
|
-
|
|
167
|
+
if (!event)
|
|
168
|
+
return result;
|
|
169
|
+
// No scheduling point separates the approval from here, so the Counselor has not yet used its defaults.
|
|
170
|
+
supplyDelegationProxy(hby, runtime, event, commandArgs.proxy);
|
|
171
|
+
return yield* finishJoinedEvent(hby, runtime, result, event, commandArgs);
|
|
160
172
|
});
|
|
161
173
|
}
|
|
162
174
|
/** Create or begin one group interaction event. */
|
|
@@ -181,26 +193,11 @@ export function* multisigInteractCommand(args) {
|
|
|
181
193
|
const group = requireText(commandArgs.group ?? commandArgs.alias, "Group");
|
|
182
194
|
const data = parseDataItems(commandArgs.data);
|
|
183
195
|
return yield* withMultisigRuntime(commandArgs, name, function* ({ hby, runtime }) {
|
|
184
|
-
const
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
group,
|
|
190
|
-
auto: true,
|
|
191
|
-
}));
|
|
192
|
-
if (accepted) {
|
|
193
|
-
yield* receiptAcceptedEvent(hby, created.hab.pre, commandArgs, runtime);
|
|
194
|
-
}
|
|
195
|
-
return {
|
|
196
|
-
route: MULTISIG_IXN_ROUTE,
|
|
197
|
-
group: created.hab.pre,
|
|
198
|
-
accepted,
|
|
199
|
-
messages,
|
|
200
|
-
deliveries,
|
|
201
|
-
state: hby.db.getState(created.hab.pre),
|
|
202
|
-
delegationPhase: null,
|
|
203
|
-
};
|
|
196
|
+
const sent = yield* proposeGroupInteraction(proposeDeps(hby, runtime), requireGroupHab(hby, group), data, { fallbackAfterMs: 0 }, commandArgs.version);
|
|
197
|
+
const accepted = yield* waitForAcceptance(hby, runtime, sent.event, approvalDeadline(commandArgs));
|
|
198
|
+
if (accepted)
|
|
199
|
+
yield* finishAcceptedEvent(hby, runtime, sent.event, commandArgs);
|
|
200
|
+
return groupEventResult(hby, sent, accepted);
|
|
204
201
|
});
|
|
205
202
|
}
|
|
206
203
|
/** Rotate or begin rotation of one group identifier. */
|
|
@@ -235,7 +232,10 @@ export function* multisigRotateCommand(args) {
|
|
|
235
232
|
const group = requireText(commandArgs.group ?? commandArgs.alias, "Group");
|
|
236
233
|
const options = mergeRotateOptions(commandArgs);
|
|
237
234
|
return yield* withMultisigRuntime(commandArgs, name, function* ({ hby, runtime }) {
|
|
238
|
-
const
|
|
235
|
+
const groupHab = requireGroupHab(hby, group);
|
|
236
|
+
const sent = yield* proposeGroupRotation(proposeDeps(hby, runtime), groupHab, {
|
|
237
|
+
smids: commandArgs.smids,
|
|
238
|
+
rmids: commandArgs.rmids,
|
|
239
239
|
isith: options.isith,
|
|
240
240
|
nsith: options.nsith,
|
|
241
241
|
toad: options.toad,
|
|
@@ -243,31 +243,17 @@ export function* multisigRotateCommand(args) {
|
|
|
243
243
|
adds: options.witsAdd,
|
|
244
244
|
data: options.data ?? [],
|
|
245
245
|
version: commandArgs.version,
|
|
246
|
-
});
|
|
247
|
-
const
|
|
248
|
-
const rmids = commandArgs.rmids?.length ? commandArgs.rmids : smids;
|
|
249
|
-
const { deliveries, messages } = yield* publishProposal(hby, runtime.protocol, runtime.postman, localGroupMember(hby, rotated.hab.pre), uniqueMembers([...smids, ...rmids]), { route: MULTISIG_ROT_ROUTE, attrs: { gid: rotated.hab.pre, smids, rmids } }, rotated.message);
|
|
250
|
-
const accepted = yield* waitForGroupAcceptance(hby, runtime, rotated.serder, multisigApprovalOptions(hby, {
|
|
251
|
-
...commandArgs,
|
|
252
|
-
group,
|
|
253
|
-
auto: true,
|
|
254
|
-
}));
|
|
246
|
+
}, counselInputs(hby, commandArgs.proxy, !!hby.db.getKever(groupHab.pre)?.delpre, group));
|
|
247
|
+
const accepted = yield* waitForAcceptance(hby, runtime, sent.event, approvalDeadline(commandArgs));
|
|
255
248
|
let delegationPhase = null;
|
|
249
|
+
let rootCopies = [];
|
|
256
250
|
if (accepted) {
|
|
257
251
|
// The proposer's own acceptance must commit the rotated membership as a joiner's does.
|
|
258
|
-
|
|
259
|
-
yield*
|
|
260
|
-
|
|
252
|
+
settleProposedRotation({ hby }, sent);
|
|
253
|
+
delegationPhase = yield* finishAcceptedEvent(hby, runtime, sent.event, commandArgs);
|
|
254
|
+
rootCopies = yield* resealAfterRotation(hby, runtime, sent.group, sent.event.said);
|
|
261
255
|
}
|
|
262
|
-
return {
|
|
263
|
-
route: MULTISIG_ROT_ROUTE,
|
|
264
|
-
group: rotated.hab.pre,
|
|
265
|
-
accepted,
|
|
266
|
-
messages,
|
|
267
|
-
deliveries,
|
|
268
|
-
state: hby.db.getState(rotated.hab.pre),
|
|
269
|
-
delegationPhase: delegationPhase,
|
|
270
|
-
};
|
|
256
|
+
return { ...groupEventResult(hby, sent, accepted), delegationPhase, rootCopies };
|
|
271
257
|
});
|
|
272
258
|
}
|
|
273
259
|
/** Propose one group multisig reply such as `/end/role/add`. */
|
|
@@ -292,12 +278,12 @@ export function* multisigRpyCommand(args) {
|
|
|
292
278
|
return yield* withMultisigRuntime(commandArgs, name, function* ({ hby, runtime }) {
|
|
293
279
|
const groupHab = requireHabByAlias(hby, group);
|
|
294
280
|
const result = yield* proposeGroupEndpointRole(hby, runtime.protocol, runtime.postman, groupHab, { eid, role, allow: commandArgs.allow });
|
|
281
|
+
// The reply is accepted when the other members' contributions reach this runtime.
|
|
295
282
|
const accepted = commandArgs.approvalTimeoutSeconds > 0
|
|
296
|
-
? yield*
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}))
|
|
283
|
+
? yield* observeUntil(() => endpointRoleAccepted(hby, groupHab.pre, role, eid), {
|
|
284
|
+
timeoutMs: Math.max(0, approvalDeadline(commandArgs) - Date.now()),
|
|
285
|
+
pollMs: 250,
|
|
286
|
+
})
|
|
301
287
|
: result.accepted;
|
|
302
288
|
return { ...result, accepted };
|
|
303
289
|
});
|
|
@@ -314,13 +300,7 @@ function* withMultisigRuntime(args, name, use) {
|
|
|
314
300
|
const signer = selected && isLocalGroupHab(context.hby, selected)
|
|
315
301
|
? localGroupMember(context.hby, selected.pre)
|
|
316
302
|
: selected;
|
|
317
|
-
|
|
318
|
-
try {
|
|
319
|
-
return yield* use(context);
|
|
320
|
-
}
|
|
321
|
-
finally {
|
|
322
|
-
yield* worker.halt();
|
|
323
|
-
}
|
|
303
|
+
return yield* withRuntimeWorkers(context.runtime, { hab: signer }, () => use(context));
|
|
324
304
|
});
|
|
325
305
|
}
|
|
326
306
|
function requireHabByAlias(hby, alias) {
|
|
@@ -330,6 +310,12 @@ function requireHabByAlias(hby, alias) {
|
|
|
330
310
|
}
|
|
331
311
|
return hab;
|
|
332
312
|
}
|
|
313
|
+
function requireGroupHab(hby, group) {
|
|
314
|
+
const hab = hby.habByName(group);
|
|
315
|
+
if (!hab)
|
|
316
|
+
throw new ValidationError(`Group alias ${group} is invalid.`);
|
|
317
|
+
return hab;
|
|
318
|
+
}
|
|
333
319
|
function mergeRotateOptions(args) {
|
|
334
320
|
const options = args.file && args.file !== "" ? loadRotateFileOptions(args.file) : {};
|
|
335
321
|
if (args.isith !== undefined) {
|
|
@@ -358,22 +344,75 @@ function mergeRotateOptions(args) {
|
|
|
358
344
|
}
|
|
359
345
|
return options;
|
|
360
346
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
347
|
+
/** Deadline of this command's approval wait, measured from when the wait starts. */
|
|
348
|
+
function approvalDeadline(args) {
|
|
349
|
+
return Date.now() + args.approvalTimeoutSeconds * 1000;
|
|
350
|
+
}
|
|
351
|
+
function proposeDeps(hby, runtime) {
|
|
352
|
+
return { hby, protocol: runtime.protocol, postman: runtime.postman, counselor: runtime.counselor };
|
|
353
|
+
}
|
|
354
|
+
function approvalDeps(hby, runtime) {
|
|
364
355
|
return {
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
356
|
+
hby,
|
|
357
|
+
exc: runtime.exc,
|
|
358
|
+
reactor: runtime.reactor,
|
|
359
|
+
protocol: runtime.protocol,
|
|
360
|
+
postman: runtime.postman,
|
|
361
|
+
notifier: runtime.notifier,
|
|
362
|
+
registryStore: runtime.acdc?.store ?? null,
|
|
363
|
+
vdr: runtime.vdr,
|
|
364
|
+
counselor: runtime.counselor,
|
|
369
365
|
};
|
|
370
366
|
}
|
|
371
|
-
function
|
|
367
|
+
function groupEventResult(hby, sent, accepted) {
|
|
372
368
|
return {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
369
|
+
route: sent.route,
|
|
370
|
+
group: sent.group,
|
|
371
|
+
accepted,
|
|
372
|
+
messages: sent.messages,
|
|
373
|
+
deliveries: sent.deliveries,
|
|
374
|
+
state: hby.db.getState(sent.group),
|
|
375
|
+
delegationPhase: null,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* A joined event that this approval completed has nothing left to wait for from other
|
|
380
|
+
* members; finish its receipts and delegation. One that still needs other members
|
|
381
|
+
* returns at once and stays counseled in the store.
|
|
382
|
+
*/
|
|
383
|
+
function* finishJoinedEvent(hby, runtime, result, event, args) {
|
|
384
|
+
if (!result.accepted)
|
|
385
|
+
return result;
|
|
386
|
+
yield* finishAcceptedEvent(hby, runtime, event, args);
|
|
387
|
+
if (result.route !== MULTISIG_ROT_ROUTE)
|
|
388
|
+
return result;
|
|
389
|
+
return { ...result, rootCopies: yield* resealAfterRotation(hby, runtime, result.group, result.embedded) };
|
|
390
|
+
}
|
|
391
|
+
/** Resume a locally authored group event named by `--group` when no proposal was left to join. */
|
|
392
|
+
function* completeLocalGroupEvent(hby, runtime, args, deadline) {
|
|
393
|
+
if (!args.group || args.said)
|
|
394
|
+
return null;
|
|
395
|
+
const groupHab = hby.habByName(args.group) ?? hby.habs.get(args.group);
|
|
396
|
+
if (!groupHab?.pre || !isLocalGroupHab(hby, groupHab))
|
|
397
|
+
return null;
|
|
398
|
+
const serder = hby.db.getKever(groupHab.pre)?.serder ?? hby.db.getEvtSerder(groupHab.pre, groupHab.pre);
|
|
399
|
+
const route = serder && routeForKelEvent(serder);
|
|
400
|
+
if (!serder?.said || serder.sn === null || !route)
|
|
401
|
+
return null;
|
|
402
|
+
const event = { pre: groupHab.pre, sn: serder.sn, said: serder.said };
|
|
403
|
+
const delegated = serder.ilk === Ilks.dip || serder.ilk === Ilks.drt;
|
|
404
|
+
runtime.counselor.start(event, counselInputs(hby, args.proxy, delegated, groupHab.pre));
|
|
405
|
+
const accepted = yield* waitForAcceptance(hby, runtime, event, deadline);
|
|
406
|
+
const result = {
|
|
407
|
+
route,
|
|
408
|
+
said: "",
|
|
409
|
+
embedded: serder.said,
|
|
410
|
+
group: groupHab.pre,
|
|
411
|
+
accepted,
|
|
412
|
+
deliveries: [],
|
|
413
|
+
messages: [],
|
|
376
414
|
};
|
|
415
|
+
return yield* finishJoinedEvent(hby, runtime, result, event, args);
|
|
377
416
|
}
|
|
378
417
|
function chooseRegistryName(args, regk) {
|
|
379
418
|
if (args.registryName) {
|
|
@@ -413,42 +452,42 @@ function chooseGroupAlias(hby, args, groupPre) {
|
|
|
413
452
|
return group;
|
|
414
453
|
}
|
|
415
454
|
}
|
|
416
|
-
|
|
455
|
+
/** Ask whether to join a proposal; `--auto` answers yes without asking, only for the join command that set it. */
|
|
456
|
+
export function approvePrompt(args, proposal) {
|
|
417
457
|
if (args.auto) {
|
|
418
458
|
return true;
|
|
419
459
|
}
|
|
420
460
|
console.log(JSON.stringify({
|
|
421
|
-
route:
|
|
422
|
-
group:
|
|
423
|
-
embedded:
|
|
461
|
+
route: `/multisig/${proposal.kind}`,
|
|
462
|
+
group: proposal.group,
|
|
463
|
+
embedded: proposal.embedded,
|
|
424
464
|
}, null, 2));
|
|
425
465
|
const yn = prompt("\nJoin [Y|n]? ");
|
|
426
466
|
return yn === null || yn === "" || yn === "y" || yn === "Y";
|
|
427
467
|
}
|
|
428
468
|
/**
|
|
429
|
-
*
|
|
469
|
+
* Settle one approved v2 RIP/BUP as KERIpy's join Counselor does: wait for the group's KEL acceptance of
|
|
470
|
+
* the exact anchor and let the anchor escrow accept the TEL event. The Counselor, started by the approval,
|
|
471
|
+
* converges the anchor's witness receipts, which the TEL event needs.
|
|
430
472
|
*
|
|
431
|
-
* @
|
|
432
|
-
* @param pre Accepted group event subject.
|
|
433
|
-
* @param args Witness authentication and HTTP endpoint mode choices.
|
|
434
|
-
* @param runtime Borrowed composed runtime; caller owns its worker and store lifetime.
|
|
473
|
+
* @returns Whether the approved TEL event is accepted before the approval deadline.
|
|
435
474
|
*/
|
|
436
|
-
function*
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
const
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
yield*
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
yield*
|
|
475
|
+
function* settleRegistryApproval(hby, runtime, result, deadline) {
|
|
476
|
+
const store = runtime.acdc?.store, tel = store?.event(result.embedded);
|
|
477
|
+
const anc = hby.db.exns.get([result.said])?.sad?.a?.anc;
|
|
478
|
+
if (!store || !tel || typeof tel.sad?.n !== "string" || typeof anc !== "string")
|
|
479
|
+
return result.accepted;
|
|
480
|
+
const anchor = hby.db.getEvtSerder(result.group, anc);
|
|
481
|
+
const ref = registryEventRef(tel, { pre: result.group, sn: anchor?.sn ?? 0, said: anc });
|
|
482
|
+
const deps = { db: hby.db, store, protocol: runtime.protocol };
|
|
483
|
+
while (true) {
|
|
484
|
+
if (registryEventStatus(deps, ref).state === "accepted")
|
|
485
|
+
return true;
|
|
486
|
+
if ((yield* settleRegistryEvent(deps, ref)).state === "accepted")
|
|
487
|
+
return true;
|
|
488
|
+
if (Date.now() >= deadline)
|
|
489
|
+
return false;
|
|
490
|
+
yield* sleep(Math.min(250, deadline - Date.now()));
|
|
452
491
|
}
|
|
453
492
|
}
|
|
454
493
|
/** Approval waits allow fractional seconds and zero, but never coerce absence or overflow a deadline. */
|
|
@@ -459,108 +498,6 @@ function nonNegativeNumber(value, fallback, label) {
|
|
|
459
498
|
}
|
|
460
499
|
return parsed;
|
|
461
500
|
}
|
|
462
|
-
/** Approve stored proposals until the target event is accepted or the deadline expires. */
|
|
463
|
-
function* waitForGroupAcceptance(hby, runtime, serder, options) {
|
|
464
|
-
if (eventAccepted(hby, serder)) {
|
|
465
|
-
return true;
|
|
466
|
-
}
|
|
467
|
-
while (true) {
|
|
468
|
-
yield* approvePendingMultisigProposal(hby, runtime, options);
|
|
469
|
-
if (eventAccepted(hby, serder)) {
|
|
470
|
-
return true;
|
|
471
|
-
}
|
|
472
|
-
if (Date.now() >= options.deadline)
|
|
473
|
-
break;
|
|
474
|
-
yield* sleep(Math.min(250, options.deadline - Date.now()));
|
|
475
|
-
}
|
|
476
|
-
return eventAccepted(hby, serder);
|
|
477
|
-
}
|
|
478
|
-
/** Wait for one stored proposal while the command host owns background progress. */
|
|
479
|
-
function* waitForOneApproval(hby, runtime, options) {
|
|
480
|
-
while (true) {
|
|
481
|
-
const result = yield* approvePendingMultisigProposal(hby, runtime, options);
|
|
482
|
-
if (result) {
|
|
483
|
-
return result;
|
|
484
|
-
}
|
|
485
|
-
if (Date.now() >= options.deadline)
|
|
486
|
-
break;
|
|
487
|
-
yield* sleep(Math.min(250, options.deadline - Date.now()));
|
|
488
|
-
}
|
|
489
|
-
return null;
|
|
490
|
-
}
|
|
491
|
-
/** Wait for a locally authored group event to complete through stored approvals. */
|
|
492
|
-
function* waitForLocalGroupCompletion(hby, runtime, options) {
|
|
493
|
-
if (!options.group || options.said) {
|
|
494
|
-
return null;
|
|
495
|
-
}
|
|
496
|
-
const groupHab = groupHabByAliasOrPrefix(hby, options.group);
|
|
497
|
-
if (!groupHab?.pre) {
|
|
498
|
-
return null;
|
|
499
|
-
}
|
|
500
|
-
const serder = localGroupJoinSerder(hby, groupHab.pre);
|
|
501
|
-
if (!serder) {
|
|
502
|
-
return null;
|
|
503
|
-
}
|
|
504
|
-
const route = routeForKelEvent(serder);
|
|
505
|
-
if (!route) {
|
|
506
|
-
return null;
|
|
507
|
-
}
|
|
508
|
-
const accepted = yield* waitForGroupAcceptance(hby, runtime, serder, options);
|
|
509
|
-
return {
|
|
510
|
-
route,
|
|
511
|
-
said: "",
|
|
512
|
-
embedded: serder.said ?? "",
|
|
513
|
-
group: groupHab.pre,
|
|
514
|
-
accepted,
|
|
515
|
-
deliveries: [],
|
|
516
|
-
messages: [],
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
/** Approve stored proposals until the endpoint reply is accepted or the deadline expires. */
|
|
520
|
-
function* waitForReplyAcceptance(hby, runtime, groupPre, role, eid, options) {
|
|
521
|
-
if (endpointRoleAccepted(hby, groupPre, role, eid)) {
|
|
522
|
-
return true;
|
|
523
|
-
}
|
|
524
|
-
while (true) {
|
|
525
|
-
yield* approvePendingMultisigProposal(hby, runtime, options);
|
|
526
|
-
if (endpointRoleAccepted(hby, groupPre, role, eid)) {
|
|
527
|
-
return true;
|
|
528
|
-
}
|
|
529
|
-
if (Date.now() >= options.deadline)
|
|
530
|
-
break;
|
|
531
|
-
yield* sleep(Math.min(250, options.deadline - Date.now()));
|
|
532
|
-
}
|
|
533
|
-
return endpointRoleAccepted(hby, groupPre, role, eid);
|
|
534
|
-
}
|
|
535
|
-
/** Complete the delegation workflow for an accepted delegated group event. */
|
|
536
|
-
function* completeDelegationIfNeeded(hby, runtime, pre, proxy) {
|
|
537
|
-
const kever = hby.db.getKever(pre);
|
|
538
|
-
if (!kever?.delpre) {
|
|
539
|
-
return null;
|
|
540
|
-
}
|
|
541
|
-
const communicationHab = resolveDelegationCommunicationHab(hby, proxy);
|
|
542
|
-
if (!communicationHab) {
|
|
543
|
-
throw new ValidationError(`Delegated group event for ${pre} requires --proxy <alias>.`);
|
|
544
|
-
}
|
|
545
|
-
runtime.delegating.beginLatest(pre, kever.sn, { communicationHab });
|
|
546
|
-
const deadline = Date.now() + 120_000;
|
|
547
|
-
while (!runtime.delegating.complete(pre, kever.sn)) {
|
|
548
|
-
if (Date.now() >= deadline)
|
|
549
|
-
throw new Error("Runtime did not converge within 120000ms.");
|
|
550
|
-
yield* sleep(Math.min(250, deadline - Date.now()));
|
|
551
|
-
}
|
|
552
|
-
return runtime.delegating.workflowStatus(pre, kever.sner.numh).phase;
|
|
553
|
-
}
|
|
554
|
-
function groupHabByAliasOrPrefix(hby, group) {
|
|
555
|
-
return hby.habByName(group) ?? hby.habs.get(group) ?? null;
|
|
556
|
-
}
|
|
557
|
-
function localGroupJoinSerder(hby, groupPre) {
|
|
558
|
-
const kever = hby.db.getKever(groupPre);
|
|
559
|
-
if (kever?.serder) {
|
|
560
|
-
return kever.serder;
|
|
561
|
-
}
|
|
562
|
-
return hby.db.getEvtSerder(groupPre, groupPre);
|
|
563
|
-
}
|
|
564
501
|
function* sleep(ms) {
|
|
565
502
|
yield* action((resolve) => {
|
|
566
503
|
const id = setTimeout(resolve, ms);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** The operator command that resends a copy automatic replication did not send. */
|
|
2
|
+
export const RootCopyRecoveryCommand = "tufa vc registry root send";
|
|
3
|
+
function errorText(error) {
|
|
4
|
+
return error instanceof Error ? error.message : String(error);
|
|
5
|
+
}
|
|
6
|
+
/** Map one typed copy result to its `root_copy` line. */
|
|
7
|
+
export function rootCopyLine(result) {
|
|
8
|
+
const line = {
|
|
9
|
+
phase: "root_copy",
|
|
10
|
+
gid: result.group,
|
|
11
|
+
registry: result.registry,
|
|
12
|
+
sender: result.sender,
|
|
13
|
+
recipient: result.recipient,
|
|
14
|
+
transmitted: false,
|
|
15
|
+
};
|
|
16
|
+
if (result.exchange !== undefined)
|
|
17
|
+
line.exchange = result.exchange;
|
|
18
|
+
if (result.kin === "sent")
|
|
19
|
+
return { ...line, transmitted: true };
|
|
20
|
+
return { ...line, error: errorText(result.error), recovery: RootCopyRecoveryCommand };
|
|
21
|
+
}
|
|
22
|
+
/** Map an unexaminable rotation to its `root_copy` line. */
|
|
23
|
+
export function rootResealLine(examination) {
|
|
24
|
+
return {
|
|
25
|
+
phase: "root_copy",
|
|
26
|
+
gid: examination.group,
|
|
27
|
+
rotation: examination.rotation,
|
|
28
|
+
transmitted: false,
|
|
29
|
+
error: examination.error.message,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as dntShim from "../../_dnt.shims.js";
|
|
2
2
|
import { annotate } from "cesr-ts";
|
|
3
3
|
import { abortable } from "../../app/runtime/abortable.js";
|
|
4
|
-
import { collectBytes,
|
|
4
|
+
import { collectBytes, streamBytes } from "../../app/transport/byte-source.js";
|
|
5
|
+
import { fileBytes } from "../../app/transport/file-bytes.js";
|
|
5
6
|
import { parseBooleanOption, parseStringOption } from "../common/parsing.js";
|
|
6
7
|
import { writeStdout } from "../output.js";
|
|
7
8
|
import { colorizeAnnotatedOutput } from "./annotate-color.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as dntShim from "../../_dnt.shims.js";
|
|
2
2
|
import { benchmarkParser, } from "cesr-ts";
|
|
3
3
|
import { abortable } from "../../app/runtime/abortable.js";
|
|
4
|
-
import { collectBytes,
|
|
4
|
+
import { collectBytes, streamBytes } from "../../app/transport/byte-source.js";
|
|
5
|
+
import { fileBytes } from "../../app/transport/file-bytes.js";
|
|
5
6
|
import { ValidationError } from "../../core/errors.js";
|
|
6
7
|
import { parseBooleanOption, parseCountOption, parseStringOption } from "../common/parsing.js";
|
|
7
8
|
import { writeStdout } from "../output.js";
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { displayStr } from "../../core/bytes.js";
|
|
2
2
|
import { DatabaseOperationError, ValidationError } from "../../core/errors.js";
|
|
3
3
|
import { RawRecord } from "../../core/records.js";
|
|
4
|
-
import { createBaser } from "../../db/
|
|
5
|
-
import { createKeeper } from "../../db/keeping.js";
|
|
6
|
-
import { createMailboxer } from "../../db/mailbox/mailboxing.js";
|
|
7
|
-
import { createNoter } from "../../db/noting.js";
|
|
4
|
+
import { createBaser, createKeeper, createMailboxer, createNoter } from "../../db/lmdb-stores.js";
|
|
8
5
|
import { parseBooleanOption, parseIntegerOption, parseStringOption } from "../common/parsing.js";
|
|
9
6
|
const DOMAIN_FACTORIES = {
|
|
10
7
|
baser: {
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/** Unsigned bytewise order, shorter first on a shared prefix, as LMDB orders keys. */
|
|
2
|
+
export function compareBytes(left, right) {
|
|
3
|
+
const shared = Math.min(left.length, right.length);
|
|
4
|
+
for (let i = 0; i < shared; i++) {
|
|
5
|
+
if (left[i] !== right[i])
|
|
6
|
+
return left[i] - right[i];
|
|
7
|
+
}
|
|
8
|
+
return left.length - right.length;
|
|
9
|
+
}
|
|
1
10
|
/**
|
|
2
11
|
* Check if keyBytes starts with prefixBytes
|
|
3
12
|
*/
|