@enbox/dwn-sdk-js 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -301
- package/dist/bundles/dwn.js +19 -21
- package/dist/esm/generated/precompiled-validators.js +2764 -1773
- package/dist/esm/generated/precompiled-validators.js.map +1 -1
- package/dist/esm/src/core/dwn-error.js +27 -3
- package/dist/esm/src/core/dwn-error.js.map +1 -1
- package/dist/esm/src/core/message.js.map +1 -1
- package/dist/esm/src/core/messages-grant-authorization.js +17 -6
- package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
- package/dist/esm/src/core/protocol-authorization.js +245 -69
- package/dist/esm/src/core/protocol-authorization.js.map +1 -1
- package/dist/esm/src/core/resumable-task-manager.js +4 -4
- package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
- package/dist/esm/src/dwn.js +10 -8
- package/dist/esm/src/dwn.js.map +1 -1
- package/dist/esm/src/enums/dwn-interface-method.js +4 -2
- package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
- package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -0
- package/dist/esm/src/handlers/messages-subscribe.js +1 -1
- package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
- package/dist/esm/src/handlers/messages-sync.js +116 -0
- package/dist/esm/src/handlers/messages-sync.js.map +1 -0
- package/dist/esm/src/handlers/protocols-configure.js +149 -16
- package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
- package/dist/esm/src/handlers/protocols-query.js +2 -2
- package/dist/esm/src/handlers/protocols-query.js.map +1 -1
- package/dist/esm/src/handlers/records-count.js +143 -0
- package/dist/esm/src/handlers/records-count.js.map +1 -0
- package/dist/esm/src/handlers/records-query.js +4 -0
- package/dist/esm/src/handlers/records-query.js.map +1 -1
- package/dist/esm/src/handlers/records-read.js +4 -6
- package/dist/esm/src/handlers/records-read.js.map +1 -1
- package/dist/esm/src/handlers/records-write.js +17 -18
- package/dist/esm/src/handlers/records-write.js.map +1 -1
- package/dist/esm/src/index.js +9 -5
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/interfaces/messages-read.js +2 -7
- package/dist/esm/src/interfaces/messages-read.js.map +1 -1
- package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
- package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
- package/dist/esm/src/interfaces/{messages-query.js → messages-sync.js} +11 -12
- package/dist/esm/src/interfaces/messages-sync.js.map +1 -0
- package/dist/esm/src/interfaces/protocols-configure.js +153 -30
- package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
- package/dist/esm/src/interfaces/protocols-query.js +1 -0
- package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
- package/dist/esm/src/interfaces/records-count.js +91 -0
- package/dist/esm/src/interfaces/records-count.js.map +1 -0
- package/dist/esm/src/interfaces/records-read.js +15 -1
- package/dist/esm/src/interfaces/records-read.js.map +1 -1
- package/dist/esm/src/interfaces/records-write.js +64 -15
- package/dist/esm/src/interfaces/records-write.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
- package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -1
- package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
- package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
- package/dist/esm/src/protocols/permission-grant.js +30 -0
- package/dist/esm/src/protocols/permission-grant.js.map +1 -1
- package/dist/esm/src/protocols/permission-request.js +24 -0
- package/dist/esm/src/protocols/permission-request.js.map +1 -1
- package/dist/esm/src/protocols/permissions.js +1 -1
- package/dist/esm/src/protocols/permissions.js.map +1 -1
- package/dist/esm/src/schema-validator.js +0 -1
- package/dist/esm/src/schema-validator.js.map +1 -1
- package/dist/esm/src/smt/smt-store-level.js +125 -0
- package/dist/esm/src/smt/smt-store-level.js.map +1 -0
- package/dist/esm/src/smt/smt-store-memory.js +67 -0
- package/dist/esm/src/smt/smt-store-memory.js.map +1 -0
- package/dist/esm/src/smt/smt-utils.js +146 -0
- package/dist/esm/src/smt/smt-utils.js.map +1 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js +622 -0
- package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -0
- package/dist/esm/src/state-index/state-index-level.js +228 -0
- package/dist/esm/src/state-index/state-index-level.js.map +1 -0
- package/dist/esm/src/store/data-store-level.js +6 -6
- package/dist/esm/src/store/data-store-level.js.map +1 -1
- package/dist/esm/src/store/index-level.js +375 -17
- package/dist/esm/src/store/index-level.js.map +1 -1
- package/dist/esm/src/store/message-store-level.js +56 -0
- package/dist/esm/src/store/message-store-level.js.map +1 -1
- package/dist/esm/src/store/storage-controller.js +19 -16
- package/dist/esm/src/store/storage-controller.js.map +1 -1
- package/dist/esm/src/types/encryption-types.js +2 -0
- package/dist/esm/src/types/encryption-types.js.map +1 -0
- package/dist/esm/src/types/message-types.js.map +1 -1
- package/dist/esm/src/types/protocols-types.js +0 -2
- package/dist/esm/src/types/protocols-types.js.map +1 -1
- package/dist/esm/src/types/records-types.js +2 -0
- package/dist/esm/src/types/records-types.js.map +1 -1
- package/dist/esm/src/types/smt-types.js +5 -0
- package/dist/esm/src/types/smt-types.js.map +1 -0
- package/dist/esm/src/types/state-index.js +2 -0
- package/dist/esm/src/types/state-index.js.map +1 -0
- package/dist/esm/src/utils/cid.js +2 -1
- package/dist/esm/src/utils/cid.js.map +1 -1
- package/dist/esm/src/utils/data-stream.js +84 -29
- package/dist/esm/src/utils/data-stream.js.map +1 -1
- package/dist/esm/src/utils/encryption.js +22 -31
- package/dist/esm/src/utils/encryption.js.map +1 -1
- package/dist/esm/src/utils/hd-key.js +3 -3
- package/dist/esm/src/utils/hd-key.js.map +1 -1
- package/dist/esm/src/utils/jws.js +4 -4
- package/dist/esm/src/utils/jws.js.map +1 -1
- package/dist/esm/src/utils/private-key-signer.js +4 -3
- package/dist/esm/src/utils/private-key-signer.js.map +1 -1
- package/dist/esm/src/utils/protocols.js +82 -9
- package/dist/esm/src/utils/protocols.js.map +1 -1
- package/dist/esm/src/utils/records.js +82 -26
- package/dist/esm/src/utils/records.js.map +1 -1
- package/dist/esm/src/utils/secp256k1.js +4 -3
- package/dist/esm/src/utils/secp256k1.js.map +1 -1
- package/dist/esm/src/utils/secp256r1.js +3 -2
- package/dist/esm/src/utils/secp256r1.js.map +1 -1
- package/dist/esm/src/utils/time.js +1 -1
- package/dist/esm/src/utils/url.js +1 -1
- package/dist/esm/src/utils/url.js.map +1 -1
- package/dist/esm/tests/core/auth.spec.js +2 -2
- package/dist/esm/tests/core/auth.spec.js.map +1 -1
- package/dist/esm/tests/core/message-reply.spec.js +3 -3
- package/dist/esm/tests/core/message-reply.spec.js.map +1 -1
- package/dist/esm/tests/core/message.spec.js +13 -13
- package/dist/esm/tests/core/message.spec.js.map +1 -1
- package/dist/esm/tests/core/protocol-authorization.spec.js +3 -3
- package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
- package/dist/esm/tests/dwn.spec.js +27 -37
- package/dist/esm/tests/dwn.spec.js.map +1 -1
- package/dist/esm/tests/{event-log → event-stream}/event-emitter-stream.spec.js +14 -15
- package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -0
- package/dist/esm/tests/{event-log → event-stream}/event-stream.spec.js +13 -15
- package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -0
- package/dist/esm/tests/features/author-delegated-grant.spec.js +281 -135
- package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-delegated-grant.spec.js +57 -59
- package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
- package/dist/esm/tests/features/owner-signature.spec.js +32 -34
- package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
- package/dist/esm/tests/features/permissions.spec.js +73 -95
- package/dist/esm/tests/features/permissions.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-composition.spec.js +1645 -0
- package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -0
- package/dist/esm/tests/features/protocol-create-action.spec.js +25 -27
- package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-delete-action.spec.js +42 -44
- package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
- package/dist/esm/tests/features/protocol-update-action.spec.js +53 -55
- package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
- package/dist/esm/tests/features/records-prune.spec.js +126 -100
- package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
- package/dist/esm/tests/features/records-tags.spec.js +272 -272
- package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
- package/dist/esm/tests/features/resumable-tasks.spec.js +35 -37
- package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-read.spec.js +112 -112
- package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-subscribe.spec.js +78 -76
- package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/messages-sync.spec.js +528 -0
- package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -0
- package/dist/esm/tests/handlers/protocols-configure.spec.js +545 -152
- package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/handlers/protocols-query.spec.js +70 -72
- package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-count.spec.js +313 -0
- package/dist/esm/tests/handlers/records-count.spec.js.map +1 -0
- package/dist/esm/tests/handlers/records-delete.spec.js +106 -109
- package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-query.spec.js +863 -463
- package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-read.spec.js +439 -209
- package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-subscribe.spec.js +292 -97
- package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/handlers/records-write.spec.js +481 -483
- package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-get.spec.js +31 -11
- package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js +5 -5
- package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-configure.spec.js +64 -134
- package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/protocols-query.spec.js +4 -6
- package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-delete.spec.js +3 -5
- package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-query.spec.js +9 -11
- package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-read.spec.js +76 -7
- package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-subscribe.spec.js +7 -9
- package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
- package/dist/esm/tests/interfaces/records-write.spec.js +244 -48
- package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
- package/dist/esm/tests/jose/jws/general.spec.js +15 -18
- package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permission-grant.spec.js +114 -0
- package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -0
- package/dist/esm/tests/protocols/permission-request.spec.js +43 -7
- package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
- package/dist/esm/tests/protocols/permissions.spec.js +9 -11
- package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/aggregator.spec.js +90 -92
- package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/deleted-record.spec.js +17 -19
- package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +27 -29
- package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/nested-roles.spec.js +37 -39
- package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
- package/dist/esm/tests/scenarios/subscriptions.spec.js +163 -163
- package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
- package/dist/esm/tests/smt/smt-store-level.spec.js +143 -0
- package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +741 -0
- package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js +254 -0
- package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-level.spec.js +136 -0
- package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -0
- package/dist/esm/tests/store/blockstore-mock.spec.js +29 -28
- package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
- package/dist/esm/tests/store/data-store-level.spec.js +23 -25
- package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/index-level.spec.js +544 -194
- package/dist/esm/tests/store/index-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store-level.spec.js +4 -4
- package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
- package/dist/esm/tests/store/message-store.spec.js +147 -73
- package/dist/esm/tests/store/message-store.spec.js.map +1 -1
- package/dist/esm/tests/store-dependent-tests.spec.js +1 -0
- package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -1
- package/dist/esm/tests/test-stores.js +5 -5
- package/dist/esm/tests/test-stores.js.map +1 -1
- package/dist/esm/tests/test-suite.js +9 -8
- package/dist/esm/tests/test-suite.js.map +1 -1
- package/dist/esm/tests/utils/cid.spec.js +8 -11
- package/dist/esm/tests/utils/cid.spec.js.map +1 -1
- package/dist/esm/tests/utils/data-stream.spec.js +167 -13
- package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
- package/dist/esm/tests/utils/encryption-callbacks.spec.js +233 -0
- package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -0
- package/dist/esm/tests/utils/encryption.spec.js +34 -85
- package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
- package/dist/esm/tests/utils/filters.spec.js +67 -69
- package/dist/esm/tests/utils/filters.spec.js.map +1 -1
- package/dist/esm/tests/utils/hd-key.spec.js +3 -3
- package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
- package/dist/esm/tests/utils/jws.spec.js +54 -3
- package/dist/esm/tests/utils/jws.spec.js.map +1 -1
- package/dist/esm/tests/utils/memory-cache.spec.js +6 -9
- package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
- package/dist/esm/tests/utils/messages.spec.js +63 -29
- package/dist/esm/tests/utils/messages.spec.js.map +1 -1
- package/dist/esm/tests/utils/object.spec.js +3 -3
- package/dist/esm/tests/utils/object.spec.js.map +1 -1
- package/dist/esm/tests/utils/poller.js +1 -1
- package/dist/esm/tests/utils/poller.js.map +1 -1
- package/dist/esm/tests/utils/private-key-signer.spec.js +6 -6
- package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
- package/dist/esm/tests/utils/records.spec.js +37 -5
- package/dist/esm/tests/utils/records.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256k1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
- package/dist/esm/tests/utils/secp256r1.spec.js +7 -7
- package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
- package/dist/esm/tests/utils/test-data-generator.js +47 -28
- package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
- package/dist/esm/tests/utils/time.spec.js +7 -7
- package/dist/esm/tests/utils/time.spec.js.map +1 -1
- package/dist/esm/tests/utils/url.spec.js +25 -27
- package/dist/esm/tests/utils/url.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js +4 -4
- package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +15 -3
- package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -8
- package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +8 -18
- package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +3 -3
- package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +9 -9
- package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +106 -0
- package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -0
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +18 -18
- package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/email.json +1 -1
- package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +2 -4
- package/dist/esm/tests/vectors/protocol-definitions/slack.json +2 -6
- package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +2 -6
- package/dist/types/generated/precompiled-validators.d.ts +82 -64
- package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
- package/dist/types/src/core/dwn-error.d.ts +27 -3
- package/dist/types/src/core/dwn-error.d.ts.map +1 -1
- package/dist/types/src/core/message-reply.d.ts +1 -1
- package/dist/types/src/core/message.d.ts +3 -3
- package/dist/types/src/core/message.d.ts.map +1 -1
- package/dist/types/src/core/messages-grant-authorization.d.ts +4 -4
- package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/protocol-authorization.d.ts +43 -2
- package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
- package/dist/types/src/core/records-grant-authorization.d.ts +2 -2
- package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
- package/dist/types/src/core/resumable-task-manager.d.ts +1 -0
- package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
- package/dist/types/src/dwn.d.ts +8 -8
- package/dist/types/src/dwn.d.ts.map +1 -1
- package/dist/types/src/enums/dwn-interface-method.d.ts +5 -3
- package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
- package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +1 -0
- package/dist/types/src/handlers/messages-sync.d.ts +21 -0
- package/dist/types/src/handlers/messages-sync.d.ts.map +1 -0
- package/dist/types/src/handlers/protocols-configure.d.ts +24 -4
- package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-count.d.ts +43 -0
- package/dist/types/src/handlers/records-count.d.ts.map +1 -0
- package/dist/types/src/handlers/records-query.d.ts.map +1 -1
- package/dist/types/src/handlers/records-read.d.ts.map +1 -1
- package/dist/types/src/handlers/records-write.d.ts +5 -5
- package/dist/types/src/handlers/records-write.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +72 -37
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-read.d.ts +2 -2
- package/dist/types/src/interfaces/messages-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/messages-sync.d.ts +16 -0
- package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -0
- package/dist/types/src/interfaces/protocols-configure.d.ts +22 -2
- package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
- package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
- package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-count.d.ts +27 -0
- package/dist/types/src/interfaces/records-count.d.ts.map +1 -0
- package/dist/types/src/interfaces/records-delete.d.ts +2 -2
- package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-query.d.ts +2 -2
- package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-read.d.ts +4 -2
- package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-subscribe.d.ts +2 -2
- package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
- package/dist/types/src/interfaces/records-write.d.ts +37 -15
- package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
- package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +5 -1
- package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -1
- package/dist/types/src/jose/jws/general/builder.d.ts +3 -3
- package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-grant.d.ts +11 -0
- package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
- package/dist/types/src/protocols/permission-request.d.ts +11 -0
- package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
- package/dist/types/src/protocols/permissions.d.ts +4 -4
- package/dist/types/src/protocols/permissions.d.ts.map +1 -1
- package/dist/types/src/schema-validator.d.ts +1 -1
- package/dist/types/src/schema-validator.d.ts.map +1 -1
- package/dist/types/src/smt/smt-store-level.d.ts +32 -0
- package/dist/types/src/smt/smt-store-level.d.ts.map +1 -0
- package/dist/types/src/smt/smt-store-memory.d.ts +22 -0
- package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -0
- package/dist/types/src/smt/smt-utils.d.ts +58 -0
- package/dist/types/src/smt/smt-utils.d.ts.map +1 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts +124 -0
- package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -0
- package/dist/types/src/state-index/state-index-level.d.ts +83 -0
- package/dist/types/src/state-index/state-index-level.d.ts.map +1 -0
- package/dist/types/src/store/data-store-level.d.ts +1 -2
- package/dist/types/src/store/data-store-level.d.ts.map +1 -1
- package/dist/types/src/store/index-level.d.ts +98 -2
- package/dist/types/src/store/index-level.d.ts.map +1 -1
- package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
- package/dist/types/src/store/message-store-level.d.ts +5 -0
- package/dist/types/src/store/message-store-level.d.ts.map +1 -1
- package/dist/types/src/store/storage-controller.d.ts +7 -7
- package/dist/types/src/store/storage-controller.d.ts.map +1 -1
- package/dist/types/src/types/data-store.d.ts +2 -3
- package/dist/types/src/types/data-store.d.ts.map +1 -1
- package/dist/types/src/types/encryption-types.d.ts +48 -0
- package/dist/types/src/types/encryption-types.d.ts.map +1 -0
- package/dist/types/src/types/jose-types.d.ts +9 -40
- package/dist/types/src/types/jose-types.d.ts.map +1 -1
- package/dist/types/src/types/message-store.d.ts +5 -0
- package/dist/types/src/types/message-store.d.ts.map +1 -1
- package/dist/types/src/types/message-types.d.ts +19 -0
- package/dist/types/src/types/message-types.d.ts.map +1 -1
- package/dist/types/src/types/messages-types.d.ts +16 -11
- package/dist/types/src/types/messages-types.d.ts.map +1 -1
- package/dist/types/src/types/method-handler.d.ts +1 -2
- package/dist/types/src/types/method-handler.d.ts.map +1 -1
- package/dist/types/src/types/permission-types.d.ts +2 -2
- package/dist/types/src/types/permission-types.d.ts.map +1 -1
- package/dist/types/src/types/protocols-types.d.ts +49 -5
- package/dist/types/src/types/protocols-types.d.ts.map +1 -1
- package/dist/types/src/types/records-types.d.ts +23 -7
- package/dist/types/src/types/records-types.d.ts.map +1 -1
- package/dist/types/src/types/signer.d.ts +1 -1
- package/dist/types/src/types/signer.d.ts.map +1 -1
- package/dist/types/src/types/smt-types.d.ts +81 -0
- package/dist/types/src/types/smt-types.d.ts.map +1 -0
- package/dist/types/src/types/state-index.d.ts +90 -0
- package/dist/types/src/types/state-index.d.ts.map +1 -0
- package/dist/types/src/utils/cid.d.ts +1 -2
- package/dist/types/src/utils/cid.d.ts.map +1 -1
- package/dist/types/src/utils/data-stream.d.ts +14 -7
- package/dist/types/src/utils/data-stream.d.ts.map +1 -1
- package/dist/types/src/utils/encryption.d.ts +2 -3
- package/dist/types/src/utils/encryption.d.ts.map +1 -1
- package/dist/types/src/utils/hd-key.d.ts +4 -4
- package/dist/types/src/utils/hd-key.d.ts.map +1 -1
- package/dist/types/src/utils/jws.d.ts +7 -7
- package/dist/types/src/utils/jws.d.ts.map +1 -1
- package/dist/types/src/utils/private-key-signer.d.ts +4 -4
- package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
- package/dist/types/src/utils/protocols.d.ts +46 -3
- package/dist/types/src/utils/protocols.d.ts.map +1 -1
- package/dist/types/src/utils/records.d.ts +33 -6
- package/dist/types/src/utils/records.d.ts.map +1 -1
- package/dist/types/src/utils/secp256k1.d.ts +11 -11
- package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
- package/dist/types/src/utils/secp256r1.d.ts +8 -8
- package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
- package/dist/types/src/utils/time.d.ts +1 -1
- package/dist/types/tests/dwn.spec.d.ts.map +1 -1
- package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +1 -0
- package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
- package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
- package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-composition.spec.d.ts +5 -0
- package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -0
- package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
- package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
- package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/messages-sync.spec.d.ts +2 -0
- package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-count.spec.d.ts +2 -0
- package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -0
- package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
- package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
- package/dist/types/tests/protocols/permission-grant.spec.d.ts +2 -0
- package/dist/types/tests/protocols/permission-grant.spec.d.ts.map +1 -0
- package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
- package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
- package/dist/types/tests/smt/smt-store-level.spec.d.ts +2 -0
- package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +1 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +2 -0
- package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +1 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts +2 -0
- package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts +2 -0
- package/dist/types/tests/store/blockstore-level.spec.d.ts.map +1 -0
- package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
- package/dist/types/tests/test-stores.d.ts +4 -4
- package/dist/types/tests/test-stores.d.ts.map +1 -1
- package/dist/types/tests/test-suite.d.ts +2 -2
- package/dist/types/tests/test-suite.d.ts.map +1 -1
- package/dist/types/tests/utils/encryption-callbacks.spec.d.ts +2 -0
- package/dist/types/tests/utils/encryption-callbacks.spec.d.ts.map +1 -0
- package/dist/types/tests/utils/test-data-generator.d.ts +31 -28
- package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts +2 -0
- package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts.map +1 -0
- package/package.json +26 -45
- package/src/core/dwn-error.ts +27 -3
- package/src/core/message-reply.ts +1 -1
- package/src/core/message.ts +5 -5
- package/src/core/messages-grant-authorization.ts +22 -8
- package/src/core/protocol-authorization.ts +345 -68
- package/src/core/records-grant-authorization.ts +2 -2
- package/src/core/resumable-task-manager.ts +4 -5
- package/src/dwn.ts +25 -20
- package/src/enums/dwn-interface-method.ts +5 -3
- package/src/handlers/messages-subscribe.ts +1 -1
- package/src/handlers/messages-sync.ts +129 -0
- package/src/handlers/protocols-configure.ts +195 -17
- package/src/handlers/protocols-query.ts +7 -5
- package/src/handlers/records-count.ts +184 -0
- package/src/handlers/records-query.ts +4 -0
- package/src/handlers/records-read.ts +4 -8
- package/src/handlers/records-write.ts +20 -21
- package/src/index.ts +74 -37
- package/src/interfaces/messages-read.ts +6 -5
- package/src/interfaces/messages-subscribe.ts +7 -6
- package/src/interfaces/messages-sync.ts +59 -0
- package/src/interfaces/protocols-configure.ts +211 -33
- package/src/interfaces/protocols-query.ts +7 -6
- package/src/interfaces/records-count.ts +106 -0
- package/src/interfaces/records-delete.ts +2 -2
- package/src/interfaces/records-query.ts +2 -2
- package/src/interfaces/records-read.ts +26 -3
- package/src/interfaces/records-subscribe.ts +2 -2
- package/src/interfaces/records-write.ts +115 -46
- package/src/jose/algorithms/signing/ed25519.ts +13 -12
- package/src/jose/algorithms/signing/signature-algorithms.ts +6 -1
- package/src/jose/jws/general/builder.ts +3 -3
- package/src/jose/jws/general/verifier.ts +3 -3
- package/src/protocols/permission-grant.ts +51 -0
- package/src/protocols/permission-request.ts +37 -0
- package/src/protocols/permissions.ts +5 -5
- package/src/schema-validator.ts +11 -3
- package/src/smt/smt-store-level.ts +143 -0
- package/src/smt/smt-store-memory.ts +53 -0
- package/src/smt/smt-utils.ts +149 -0
- package/src/smt/sparse-merkle-tree.ts +698 -0
- package/src/state-index/state-index-level.ts +241 -0
- package/src/store/data-store-level.ts +8 -7
- package/src/store/index-level.ts +415 -19
- package/src/store/level-wrapper.ts +1 -1
- package/src/store/message-store-level.ts +62 -0
- package/src/store/storage-controller.ts +21 -19
- package/src/types/data-store.ts +2 -4
- package/src/types/encryption-types.ts +52 -0
- package/src/types/jose-types.ts +10 -42
- package/src/types/message-store.ts +11 -0
- package/src/types/message-types.ts +21 -0
- package/src/types/messages-types.ts +21 -15
- package/src/types/method-handler.ts +1 -2
- package/src/types/permission-types.ts +2 -2
- package/src/types/protocols-types.ts +55 -6
- package/src/types/records-types.ts +26 -7
- package/src/types/signer.ts +1 -1
- package/src/types/smt-types.ts +95 -0
- package/src/types/state-index.ts +100 -0
- package/src/utils/cid.ts +3 -4
- package/src/utils/data-stream.ts +75 -38
- package/src/utils/encryption.ts +24 -39
- package/src/utils/hd-key.ts +6 -6
- package/src/utils/jws.ts +9 -9
- package/src/utils/private-key-signer.ts +9 -8
- package/src/utils/protocols.ts +132 -6
- package/src/utils/records.ts +118 -29
- package/src/utils/secp256k1.ts +23 -21
- package/src/utils/secp256r1.ts +17 -15
- package/src/utils/time.ts +1 -1
- package/src/utils/url.ts +1 -1
- package/dist/cjs/index.js +0 -36749
- package/dist/cjs/package.json +0 -1
- package/dist/esm/src/event-log/event-emitter-stream.js.map +0 -1
- package/dist/esm/src/event-log/event-log-level.js +0 -63
- package/dist/esm/src/event-log/event-log-level.js.map +0 -1
- package/dist/esm/src/handlers/messages-query.js +0 -71
- package/dist/esm/src/handlers/messages-query.js.map +0 -1
- package/dist/esm/src/interfaces/messages-query.js.map +0 -1
- package/dist/esm/src/types/event-log.js +0 -2
- package/dist/esm/src/types/event-log.js.map +0 -1
- package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log-level.spec.js +0 -44
- package/dist/esm/tests/event-log/event-log-level.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-log.spec.js +0 -236
- package/dist/esm/tests/event-log/event-log.spec.js.map +0 -1
- package/dist/esm/tests/event-log/event-stream.spec.js.map +0 -1
- package/dist/esm/tests/handlers/messages-query.spec.js +0 -349
- package/dist/esm/tests/handlers/messages-query.spec.js.map +0 -1
- package/dist/esm/tests/interfaces/messagess-query.spec.js +0 -127
- package/dist/esm/tests/interfaces/messagess-query.spec.js.map +0 -1
- package/dist/esm/tests/scenarios/messages-query.spec.js +0 -395
- package/dist/esm/tests/scenarios/messages-query.spec.js.map +0 -1
- package/dist/types/src/event-log/event-emitter-stream.d.ts.map +0 -1
- package/dist/types/src/event-log/event-log-level.d.ts +0 -35
- package/dist/types/src/event-log/event-log-level.d.ts.map +0 -1
- package/dist/types/src/handlers/messages-query.d.ts +0 -17
- package/dist/types/src/handlers/messages-query.d.ts.map +0 -1
- package/dist/types/src/interfaces/messages-query.d.ts +0 -16
- package/dist/types/src/interfaces/messages-query.d.ts.map +0 -1
- package/dist/types/src/types/event-log.d.ts +0 -52
- package/dist/types/src/types/event-log.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log-level.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-log.spec.d.ts +0 -2
- package/dist/types/tests/event-log/event-log.spec.d.ts.map +0 -1
- package/dist/types/tests/event-log/event-stream.spec.d.ts.map +0 -1
- package/dist/types/tests/handlers/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/handlers/messages-query.spec.d.ts.map +0 -1
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts +0 -2
- package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +0 -1
- package/dist/types/tests/scenarios/messages-query.spec.d.ts +0 -2
- package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +0 -1
- package/src/event-log/event-log-level.ts +0 -72
- package/src/handlers/messages-query.ts +0 -67
- package/src/interfaces/messages-query.ts +0 -60
- package/src/types/event-log.ts +0 -52
- /package/dist/esm/src/{event-log → event-stream}/event-emitter-stream.js +0 -0
- /package/dist/types/src/{event-log → event-stream}/event-emitter-stream.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-emitter-stream.spec.d.ts +0 -0
- /package/dist/types/tests/{event-log → event-stream}/event-stream.spec.d.ts +0 -0
- /package/src/{event-log → event-stream}/event-emitter-stream.ts +0 -0
|
@@ -0,0 +1,622 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sparse Merkle Tree (SMT) implementation.
|
|
3
|
+
*
|
|
4
|
+
* A 256-level binary trie where:
|
|
5
|
+
* - Keys are SHA-256 hashes of messageCids (uniformly distributed across 2^256 key space)
|
|
6
|
+
* - Leaves store the messageCid value
|
|
7
|
+
* - Internal nodes store H(leftChild || rightChild)
|
|
8
|
+
* - Empty subtrees are represented implicitly via precomputed default hashes
|
|
9
|
+
*
|
|
10
|
+
* Key properties:
|
|
11
|
+
* - Deterministic: the same set of key-value pairs always produces the same root hash
|
|
12
|
+
* - O(log n) insert, delete, and proof operations (practically O(256) worst case)
|
|
13
|
+
* - Supports inclusion and non-inclusion proofs
|
|
14
|
+
* - Root hash provides a fingerprint of the entire set for O(1) comparison
|
|
15
|
+
*/
|
|
16
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
19
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
20
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
21
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
22
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
import { getBit, hashChildren, hashEquals, hashKey, hashLeaf, initDefaultHashes, SMT_DEPTH } from './smt-utils.js';
|
|
26
|
+
export class SparseMerkleTree {
|
|
27
|
+
constructor(store) {
|
|
28
|
+
this.store = store;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize the SMT. Must be called before any operations.
|
|
32
|
+
* Opens the store and precomputes default hashes.
|
|
33
|
+
*/
|
|
34
|
+
initialize() {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
yield this.store.open();
|
|
37
|
+
this.defaultHashes = yield initDefaultHashes();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Close the underlying store.
|
|
42
|
+
*/
|
|
43
|
+
close() {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
yield this.store.close();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Clear all data from the tree.
|
|
50
|
+
*/
|
|
51
|
+
clear() {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
yield this.store.clear();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the current root hash. Returns the default empty root if no root is set.
|
|
58
|
+
*/
|
|
59
|
+
getRoot() {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
const root = yield this.store.getRoot();
|
|
62
|
+
if (root === undefined) {
|
|
63
|
+
return this.defaultHashes[0];
|
|
64
|
+
}
|
|
65
|
+
return root;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Insert a messageCid into the tree.
|
|
70
|
+
* The key is SHA-256(messageCid), the value is the messageCid string.
|
|
71
|
+
*
|
|
72
|
+
* @returns the new root hash after insertion
|
|
73
|
+
*/
|
|
74
|
+
insert(messageCid) {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
const keyHash = yield hashKey(messageCid);
|
|
77
|
+
const leafHash = yield hashLeaf(keyHash, messageCid);
|
|
78
|
+
const leafNode = {
|
|
79
|
+
type: 'leaf',
|
|
80
|
+
keyHash: keyHash,
|
|
81
|
+
valueCid: messageCid,
|
|
82
|
+
};
|
|
83
|
+
// Store the leaf node
|
|
84
|
+
yield this.store.putNode(leafHash, leafNode);
|
|
85
|
+
// Walk down the tree from root to leaf position, collecting the path
|
|
86
|
+
const currentRoot = yield this.getRoot();
|
|
87
|
+
const newRoot = yield this.insertAtNode(currentRoot, keyHash, leafHash, leafNode, 0);
|
|
88
|
+
yield this.store.setRoot(newRoot);
|
|
89
|
+
return newRoot;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Delete a messageCid from the tree.
|
|
94
|
+
*
|
|
95
|
+
* @returns the new root hash after deletion
|
|
96
|
+
*/
|
|
97
|
+
delete(messageCid) {
|
|
98
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const keyHash = yield hashKey(messageCid);
|
|
100
|
+
const currentRoot = yield this.getRoot();
|
|
101
|
+
const newRoot = yield this.deleteAtNode(currentRoot, keyHash, 0);
|
|
102
|
+
yield this.store.setRoot(newRoot);
|
|
103
|
+
return newRoot;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if a messageCid exists in the tree.
|
|
108
|
+
*/
|
|
109
|
+
has(messageCid) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
const keyHash = yield hashKey(messageCid);
|
|
112
|
+
const currentRoot = yield this.getRoot();
|
|
113
|
+
return this.existsAtNode(currentRoot, keyHash, 0);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generate a membership proof (inclusion or non-inclusion) for a messageCid.
|
|
118
|
+
*/
|
|
119
|
+
getProof(messageCid) {
|
|
120
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
const keyHash = yield hashKey(messageCid);
|
|
122
|
+
const currentRoot = yield this.getRoot();
|
|
123
|
+
return this.generateProof(currentRoot, keyHash, 0);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the hash of a subtree at a given bit prefix.
|
|
128
|
+
* Used by the sync protocol for tree walking.
|
|
129
|
+
*
|
|
130
|
+
* @param prefix - array of booleans representing the path (false=left, true=right)
|
|
131
|
+
* @returns the hash of the subtree at that prefix
|
|
132
|
+
*/
|
|
133
|
+
getSubtreeHash(prefix) {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
let currentHash = yield this.getRoot();
|
|
136
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
137
|
+
if (hashEquals(currentHash, this.defaultHashes[i])) {
|
|
138
|
+
// Empty subtree — return the default hash at the target depth
|
|
139
|
+
return this.defaultHashes[prefix.length];
|
|
140
|
+
}
|
|
141
|
+
const node = yield this.store.getNode(currentHash);
|
|
142
|
+
if (node === undefined || node.type === 'leaf') {
|
|
143
|
+
// Leaf reached before prefix exhausted — need to compute what the
|
|
144
|
+
// subtree hash would be if this leaf were pushed down to the prefix depth.
|
|
145
|
+
// For simplicity, if we've hit a leaf, the subtree at this prefix
|
|
146
|
+
// either contains this leaf or is empty.
|
|
147
|
+
if (node !== undefined && node.type === 'leaf') {
|
|
148
|
+
return this.computeSubtreeHashForLeaf(node, i, prefix);
|
|
149
|
+
}
|
|
150
|
+
return this.defaultHashes[prefix.length];
|
|
151
|
+
}
|
|
152
|
+
const internalNode = node;
|
|
153
|
+
if (prefix[i]) {
|
|
154
|
+
currentHash = internalNode.rightHash;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
currentHash = internalNode.leftHash;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return currentHash;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get all leaf messageCids under a given prefix.
|
|
165
|
+
* Used by the sync protocol for tree walking.
|
|
166
|
+
*/
|
|
167
|
+
getLeaves(prefix) {
|
|
168
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
+
let currentHash = yield this.getRoot();
|
|
170
|
+
// Navigate to the subtree at the prefix
|
|
171
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
172
|
+
if (hashEquals(currentHash, this.defaultHashes[i])) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
const node = yield this.store.getNode(currentHash);
|
|
176
|
+
if (node === undefined) {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
if (node.type === 'leaf') {
|
|
180
|
+
// Check if this leaf's key hash matches the prefix
|
|
181
|
+
const leafMatchesPrefix = this.leafMatchesPrefix(node.keyHash, prefix);
|
|
182
|
+
if (leafMatchesPrefix) {
|
|
183
|
+
return [node.valueCid];
|
|
184
|
+
}
|
|
185
|
+
return [];
|
|
186
|
+
}
|
|
187
|
+
const internalNode = node;
|
|
188
|
+
if (prefix[i]) {
|
|
189
|
+
currentHash = internalNode.rightHash;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
currentHash = internalNode.leftHash;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Collect all leaves in this subtree
|
|
196
|
+
return this.collectLeaves(currentHash, prefix.length);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Compute a local diff between this tree and another tree's state,
|
|
201
|
+
* given access to the other tree instance.
|
|
202
|
+
*
|
|
203
|
+
* This is used for same-process diffing (e.g., in tests or local operations).
|
|
204
|
+
* For remote diffing, the sync protocol exchanges subtree hashes via messages.
|
|
205
|
+
*/
|
|
206
|
+
diff(other) {
|
|
207
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
208
|
+
const localRoot = yield this.getRoot();
|
|
209
|
+
const remoteRoot = yield other.getRoot();
|
|
210
|
+
if (hashEquals(localRoot, remoteRoot)) {
|
|
211
|
+
return { onlyLocal: [], onlyRemote: [] };
|
|
212
|
+
}
|
|
213
|
+
const onlyLocal = [];
|
|
214
|
+
const onlyRemote = [];
|
|
215
|
+
yield this.diffAtNode(localRoot, remoteRoot, 0, this, other, onlyLocal, onlyRemote);
|
|
216
|
+
return { onlyLocal, onlyRemote };
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// ─── Private methods ──────────────────────────────────────────────────────
|
|
220
|
+
/**
|
|
221
|
+
* Recursively insert a leaf into the tree, returning the new hash for the subtree at `depth`.
|
|
222
|
+
*/
|
|
223
|
+
insertAtNode(currentHash, keyHash, leafHash, leafNode, depth) {
|
|
224
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
225
|
+
// Base case: reached the maximum depth
|
|
226
|
+
if (depth >= SMT_DEPTH) {
|
|
227
|
+
return leafHash;
|
|
228
|
+
}
|
|
229
|
+
// If the current subtree is empty (default hash at this depth), just return the leaf hash.
|
|
230
|
+
// But we need to handle the case where the leaf might need to be pushed down further
|
|
231
|
+
// because we're at an intermediate depth.
|
|
232
|
+
if (hashEquals(currentHash, this.defaultHashes[depth])) {
|
|
233
|
+
// Place the leaf here — the leaf implicitly represents its position via keyHash
|
|
234
|
+
return leafHash;
|
|
235
|
+
}
|
|
236
|
+
// Load the node at currentHash
|
|
237
|
+
const node = yield this.store.getNode(currentHash);
|
|
238
|
+
if (node === undefined) {
|
|
239
|
+
// Shouldn't happen for a well-formed tree, but handle gracefully
|
|
240
|
+
return leafHash;
|
|
241
|
+
}
|
|
242
|
+
if (node.type === 'leaf') {
|
|
243
|
+
// There's an existing leaf at this position
|
|
244
|
+
if (hashEquals(node.keyHash, keyHash)) {
|
|
245
|
+
// Same key — replace the value. Delete old leaf node.
|
|
246
|
+
yield this.store.deleteNode(currentHash);
|
|
247
|
+
return leafHash;
|
|
248
|
+
}
|
|
249
|
+
// Different key — need to push both leaves down until their paths diverge
|
|
250
|
+
return this.splitLeaves(node, currentHash, leafNode, leafHash, depth);
|
|
251
|
+
}
|
|
252
|
+
// Internal node — recurse into the appropriate child
|
|
253
|
+
const internalNode = node;
|
|
254
|
+
const goRight = getBit(keyHash, depth);
|
|
255
|
+
let newLeftHash;
|
|
256
|
+
let newRightHash;
|
|
257
|
+
if (goRight) {
|
|
258
|
+
newLeftHash = internalNode.leftHash;
|
|
259
|
+
newRightHash = yield this.insertAtNode(internalNode.rightHash, keyHash, leafHash, leafNode, depth + 1);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
newLeftHash = yield this.insertAtNode(internalNode.leftHash, keyHash, leafHash, leafNode, depth + 1);
|
|
263
|
+
newRightHash = internalNode.rightHash;
|
|
264
|
+
}
|
|
265
|
+
// Compute the new internal node hash
|
|
266
|
+
const newHash = yield hashChildren(newLeftHash, newRightHash);
|
|
267
|
+
// Store the new internal node (if it differs from the old one)
|
|
268
|
+
if (!hashEquals(newHash, currentHash)) {
|
|
269
|
+
const newNode = {
|
|
270
|
+
type: 'internal',
|
|
271
|
+
leftHash: newLeftHash,
|
|
272
|
+
rightHash: newRightHash,
|
|
273
|
+
};
|
|
274
|
+
yield this.store.putNode(newHash, newNode);
|
|
275
|
+
// Clean up old internal node
|
|
276
|
+
yield this.store.deleteNode(currentHash);
|
|
277
|
+
}
|
|
278
|
+
return newHash;
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* When two leaves collide at the same position in the tree, push them down
|
|
283
|
+
* until their key paths diverge, creating internal nodes along the way.
|
|
284
|
+
*
|
|
285
|
+
* For example, if two leaves share the first 3 bits but diverge at bit 3,
|
|
286
|
+
* and we're currently at depth 0, we need to create internal nodes at depths
|
|
287
|
+
* 0, 1, and 2 (where one child is the chain and the other is a default hash),
|
|
288
|
+
* plus the divergence node at depth 3 where the two leaves split.
|
|
289
|
+
*/
|
|
290
|
+
splitLeaves(existingLeaf, existingLeafHash, newLeaf, newLeafHash, startDepth) {
|
|
291
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
292
|
+
// Find the depth where the two keys diverge
|
|
293
|
+
let divergeDepth = startDepth;
|
|
294
|
+
while (divergeDepth < SMT_DEPTH && getBit(existingLeaf.keyHash, divergeDepth) === getBit(newLeaf.keyHash, divergeDepth)) {
|
|
295
|
+
divergeDepth++;
|
|
296
|
+
}
|
|
297
|
+
if (divergeDepth >= SMT_DEPTH) {
|
|
298
|
+
// Keys are identical (shouldn't happen with SHA-256 on different inputs)
|
|
299
|
+
return newLeafHash;
|
|
300
|
+
}
|
|
301
|
+
// At the divergence depth, the bits differ — one goes left, the other goes right
|
|
302
|
+
const existingGoesRight = getBit(existingLeaf.keyHash, divergeDepth);
|
|
303
|
+
let leftHash;
|
|
304
|
+
let rightHash;
|
|
305
|
+
if (existingGoesRight) {
|
|
306
|
+
leftHash = newLeafHash;
|
|
307
|
+
rightHash = existingLeafHash;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
leftHash = existingLeafHash;
|
|
311
|
+
rightHash = newLeafHash;
|
|
312
|
+
}
|
|
313
|
+
// Create the divergence node
|
|
314
|
+
let currentHash = yield hashChildren(leftHash, rightHash);
|
|
315
|
+
yield this.store.putNode(currentHash, {
|
|
316
|
+
type: 'internal',
|
|
317
|
+
leftHash: leftHash,
|
|
318
|
+
rightHash: rightHash,
|
|
319
|
+
});
|
|
320
|
+
// Build internal nodes back up from (divergeDepth - 1) to startDepth.
|
|
321
|
+
// At each intermediate depth, one child is the chain (currentHash) and
|
|
322
|
+
// the other is the default empty hash for that depth + 1.
|
|
323
|
+
for (let d = divergeDepth - 1; d >= startDepth; d--) {
|
|
324
|
+
const bit = getBit(existingLeaf.keyHash, d); // both keys share this bit
|
|
325
|
+
const defaultChild = this.defaultHashes[d + 1];
|
|
326
|
+
let newLeft;
|
|
327
|
+
let newRight;
|
|
328
|
+
if (bit) {
|
|
329
|
+
newLeft = defaultChild;
|
|
330
|
+
newRight = currentHash;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
newLeft = currentHash;
|
|
334
|
+
newRight = defaultChild;
|
|
335
|
+
}
|
|
336
|
+
currentHash = yield hashChildren(newLeft, newRight);
|
|
337
|
+
yield this.store.putNode(currentHash, {
|
|
338
|
+
type: 'internal',
|
|
339
|
+
leftHash: newLeft,
|
|
340
|
+
rightHash: newRight,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return currentHash;
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Recursively delete a key from the tree, returning the new hash for the subtree at `depth`.
|
|
348
|
+
*/
|
|
349
|
+
deleteAtNode(currentHash, keyHash, depth) {
|
|
350
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
351
|
+
if (depth >= SMT_DEPTH) {
|
|
352
|
+
return this.defaultHashes[SMT_DEPTH];
|
|
353
|
+
}
|
|
354
|
+
// Empty subtree — nothing to delete
|
|
355
|
+
if (hashEquals(currentHash, this.defaultHashes[depth])) {
|
|
356
|
+
return currentHash;
|
|
357
|
+
}
|
|
358
|
+
const node = yield this.store.getNode(currentHash);
|
|
359
|
+
if (node === undefined) {
|
|
360
|
+
return this.defaultHashes[depth];
|
|
361
|
+
}
|
|
362
|
+
if (node.type === 'leaf') {
|
|
363
|
+
if (hashEquals(node.keyHash, keyHash)) {
|
|
364
|
+
// Found the leaf to delete
|
|
365
|
+
yield this.store.deleteNode(currentHash);
|
|
366
|
+
return this.defaultHashes[depth];
|
|
367
|
+
}
|
|
368
|
+
// Wrong leaf — key not in tree
|
|
369
|
+
return currentHash;
|
|
370
|
+
}
|
|
371
|
+
// Internal node — recurse into the appropriate child
|
|
372
|
+
const internalNode = node;
|
|
373
|
+
const goRight = getBit(keyHash, depth);
|
|
374
|
+
let newLeftHash;
|
|
375
|
+
let newRightHash;
|
|
376
|
+
if (goRight) {
|
|
377
|
+
newLeftHash = internalNode.leftHash;
|
|
378
|
+
newRightHash = yield this.deleteAtNode(internalNode.rightHash, keyHash, depth + 1);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
newLeftHash = yield this.deleteAtNode(internalNode.leftHash, keyHash, depth + 1);
|
|
382
|
+
newRightHash = internalNode.rightHash;
|
|
383
|
+
}
|
|
384
|
+
// If both children are now default (empty), this node becomes empty too
|
|
385
|
+
if (hashEquals(newLeftHash, this.defaultHashes[depth + 1]) && hashEquals(newRightHash, this.defaultHashes[depth + 1])) {
|
|
386
|
+
yield this.store.deleteNode(currentHash);
|
|
387
|
+
return this.defaultHashes[depth];
|
|
388
|
+
}
|
|
389
|
+
// If one child is default and the other is a leaf, collapse upward
|
|
390
|
+
// (the internal node is unnecessary — just return the leaf hash directly)
|
|
391
|
+
const leftIsDefault = hashEquals(newLeftHash, this.defaultHashes[depth + 1]);
|
|
392
|
+
const rightIsDefault = hashEquals(newRightHash, this.defaultHashes[depth + 1]);
|
|
393
|
+
if (leftIsDefault || rightIsDefault) {
|
|
394
|
+
const survivingHash = leftIsDefault ? newRightHash : newLeftHash;
|
|
395
|
+
const survivingNode = yield this.store.getNode(survivingHash);
|
|
396
|
+
if (survivingNode !== undefined && survivingNode.type === 'leaf') {
|
|
397
|
+
// Collapse: remove the internal node, return the leaf hash directly
|
|
398
|
+
yield this.store.deleteNode(currentHash);
|
|
399
|
+
return survivingHash;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// Recompute internal node hash
|
|
403
|
+
const newHash = yield hashChildren(newLeftHash, newRightHash);
|
|
404
|
+
if (!hashEquals(newHash, currentHash)) {
|
|
405
|
+
const newNode = {
|
|
406
|
+
type: 'internal',
|
|
407
|
+
leftHash: newLeftHash,
|
|
408
|
+
rightHash: newRightHash,
|
|
409
|
+
};
|
|
410
|
+
yield this.store.putNode(newHash, newNode);
|
|
411
|
+
yield this.store.deleteNode(currentHash);
|
|
412
|
+
}
|
|
413
|
+
return newHash;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Check if a key exists at the given node.
|
|
418
|
+
*/
|
|
419
|
+
existsAtNode(currentHash, keyHash, depth) {
|
|
420
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
421
|
+
if (depth >= SMT_DEPTH) {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
if (hashEquals(currentHash, this.defaultHashes[depth])) {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
const node = yield this.store.getNode(currentHash);
|
|
428
|
+
if (node === undefined) {
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
if (node.type === 'leaf') {
|
|
432
|
+
return hashEquals(node.keyHash, keyHash);
|
|
433
|
+
}
|
|
434
|
+
const internalNode = node;
|
|
435
|
+
const goRight = getBit(keyHash, depth);
|
|
436
|
+
if (goRight) {
|
|
437
|
+
return this.existsAtNode(internalNode.rightHash, keyHash, depth + 1);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
return this.existsAtNode(internalNode.leftHash, keyHash, depth + 1);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Generate a proof for the given key at the given node.
|
|
446
|
+
*/
|
|
447
|
+
generateProof(currentHash, keyHash, depth) {
|
|
448
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
449
|
+
if (depth >= SMT_DEPTH) {
|
|
450
|
+
return { siblings: [], leafNode: undefined, depth };
|
|
451
|
+
}
|
|
452
|
+
if (hashEquals(currentHash, this.defaultHashes[depth])) {
|
|
453
|
+
return { siblings: [], leafNode: undefined, depth };
|
|
454
|
+
}
|
|
455
|
+
const node = yield this.store.getNode(currentHash);
|
|
456
|
+
if (node === undefined) {
|
|
457
|
+
return { siblings: [], leafNode: undefined, depth };
|
|
458
|
+
}
|
|
459
|
+
if (node.type === 'leaf') {
|
|
460
|
+
return { siblings: [], leafNode: node, depth };
|
|
461
|
+
}
|
|
462
|
+
const internalNode = node;
|
|
463
|
+
const goRight = getBit(keyHash, depth);
|
|
464
|
+
let childHash;
|
|
465
|
+
let siblingHash;
|
|
466
|
+
if (goRight) {
|
|
467
|
+
childHash = internalNode.rightHash;
|
|
468
|
+
siblingHash = internalNode.leftHash;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
childHash = internalNode.leftHash;
|
|
472
|
+
siblingHash = internalNode.rightHash;
|
|
473
|
+
}
|
|
474
|
+
const childProof = yield this.generateProof(childHash, keyHash, depth + 1);
|
|
475
|
+
childProof.siblings.unshift(siblingHash);
|
|
476
|
+
return childProof;
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Compute the subtree hash for a leaf that exists above the target prefix depth.
|
|
481
|
+
* The leaf's effective position is determined by its keyHash bits.
|
|
482
|
+
*/
|
|
483
|
+
computeSubtreeHashForLeaf(leaf, currentDepth, prefix) {
|
|
484
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
485
|
+
// Check if the leaf's key matches the remaining prefix bits
|
|
486
|
+
for (let i = currentDepth; i < prefix.length; i++) {
|
|
487
|
+
if (getBit(leaf.keyHash, i) !== prefix[i]) {
|
|
488
|
+
// Leaf is not under this prefix
|
|
489
|
+
return this.defaultHashes[prefix.length];
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
// Leaf is under this prefix — recompute its hash
|
|
493
|
+
return yield hashLeaf(leaf.keyHash, leaf.valueCid);
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Check if a leaf's keyHash matches a given prefix.
|
|
498
|
+
*/
|
|
499
|
+
leafMatchesPrefix(keyHash, prefix) {
|
|
500
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
501
|
+
if (getBit(keyHash, i) !== prefix[i]) {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return true;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Collect all leaf messageCids in the subtree rooted at the given hash.
|
|
509
|
+
*/
|
|
510
|
+
collectLeaves(nodeHash, depth) {
|
|
511
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
512
|
+
if (depth >= SMT_DEPTH || hashEquals(nodeHash, this.defaultHashes[depth])) {
|
|
513
|
+
return [];
|
|
514
|
+
}
|
|
515
|
+
const node = yield this.store.getNode(nodeHash);
|
|
516
|
+
if (node === undefined) {
|
|
517
|
+
return [];
|
|
518
|
+
}
|
|
519
|
+
if (node.type === 'leaf') {
|
|
520
|
+
return [node.valueCid];
|
|
521
|
+
}
|
|
522
|
+
const internalNode = node;
|
|
523
|
+
const leftLeaves = yield this.collectLeaves(internalNode.leftHash, depth + 1);
|
|
524
|
+
const rightLeaves = yield this.collectLeaves(internalNode.rightHash, depth + 1);
|
|
525
|
+
return [...leftLeaves, ...rightLeaves];
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Recursively diff two subtrees, collecting leaves that exist only in one or the other.
|
|
530
|
+
*/
|
|
531
|
+
diffAtNode(localHash, remoteHash, depth, localTree, remoteTree, onlyLocal, onlyRemote) {
|
|
532
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
533
|
+
// If hashes match, subtrees are identical — skip
|
|
534
|
+
if (hashEquals(localHash, remoteHash)) {
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
// If we've reached max depth, something is wrong — bail out
|
|
538
|
+
if (depth >= SMT_DEPTH) {
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
const localIsDefault = hashEquals(localHash, this.defaultHashes[depth]);
|
|
542
|
+
const remoteIsDefault = hashEquals(remoteHash, this.defaultHashes[depth]);
|
|
543
|
+
// If local is empty but remote is not, all remote leaves are "onlyRemote"
|
|
544
|
+
if (localIsDefault && !remoteIsDefault) {
|
|
545
|
+
const remoteLeaves = yield remoteTree.collectLeaves(remoteHash, depth);
|
|
546
|
+
onlyRemote.push(...remoteLeaves);
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
// If remote is empty but local is not, all local leaves are "onlyLocal"
|
|
550
|
+
if (!localIsDefault && remoteIsDefault) {
|
|
551
|
+
const localLeaves = yield localTree.collectLeaves(localHash, depth);
|
|
552
|
+
onlyLocal.push(...localLeaves);
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
// Both are non-default and non-equal — load nodes and recurse
|
|
556
|
+
const localNode = yield localTree.store.getNode(localHash);
|
|
557
|
+
const remoteNode = yield remoteTree.store.getNode(remoteHash);
|
|
558
|
+
// Handle cases where one or both are leaves
|
|
559
|
+
if ((localNode === null || localNode === void 0 ? void 0 : localNode.type) === 'leaf' && (remoteNode === null || remoteNode === void 0 ? void 0 : remoteNode.type) === 'leaf') {
|
|
560
|
+
if (!hashEquals(localNode.keyHash, remoteNode.keyHash)) {
|
|
561
|
+
// Different keys — both are unique to their respective trees
|
|
562
|
+
onlyLocal.push(localNode.valueCid);
|
|
563
|
+
onlyRemote.push(remoteNode.valueCid);
|
|
564
|
+
}
|
|
565
|
+
else if (localNode.valueCid !== remoteNode.valueCid) {
|
|
566
|
+
// Same key, different value — treat as update
|
|
567
|
+
onlyLocal.push(localNode.valueCid);
|
|
568
|
+
onlyRemote.push(remoteNode.valueCid);
|
|
569
|
+
}
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
// One is a leaf and the other is internal — expand the leaf side
|
|
573
|
+
if ((localNode === null || localNode === void 0 ? void 0 : localNode.type) === 'leaf') {
|
|
574
|
+
// Local is a single leaf; remote is a subtree
|
|
575
|
+
// All remote leaves are potentially onlyRemote; check if the local leaf exists in remote
|
|
576
|
+
const remoteLeaves = yield remoteTree.collectLeaves(remoteHash, depth);
|
|
577
|
+
const localCid = localNode.valueCid;
|
|
578
|
+
const remoteSet = new Set(remoteLeaves);
|
|
579
|
+
if (!remoteSet.has(localCid)) {
|
|
580
|
+
onlyLocal.push(localCid);
|
|
581
|
+
}
|
|
582
|
+
for (const cid of remoteLeaves) {
|
|
583
|
+
if (cid !== localCid) {
|
|
584
|
+
onlyRemote.push(cid);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
if ((remoteNode === null || remoteNode === void 0 ? void 0 : remoteNode.type) === 'leaf') {
|
|
590
|
+
// Remote is a single leaf; local is a subtree
|
|
591
|
+
const localLeaves = yield localTree.collectLeaves(localHash, depth);
|
|
592
|
+
const remoteCid = remoteNode.valueCid;
|
|
593
|
+
const localSet = new Set(localLeaves);
|
|
594
|
+
if (!localSet.has(remoteCid)) {
|
|
595
|
+
onlyRemote.push(remoteCid);
|
|
596
|
+
}
|
|
597
|
+
for (const cid of localLeaves) {
|
|
598
|
+
if (cid !== remoteCid) {
|
|
599
|
+
onlyLocal.push(cid);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
// Both are internal nodes — recurse into children
|
|
605
|
+
if ((localNode === null || localNode === void 0 ? void 0 : localNode.type) === 'internal' && (remoteNode === null || remoteNode === void 0 ? void 0 : remoteNode.type) === 'internal') {
|
|
606
|
+
yield this.diffAtNode(localNode.leftHash, remoteNode.leftHash, depth + 1, localTree, remoteTree, onlyLocal, onlyRemote);
|
|
607
|
+
yield this.diffAtNode(localNode.rightHash, remoteNode.rightHash, depth + 1, localTree, remoteTree, onlyLocal, onlyRemote);
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
// Fallback: if a node is missing, collect all from the other side
|
|
611
|
+
if (localNode === undefined) {
|
|
612
|
+
const remoteLeaves = yield remoteTree.collectLeaves(remoteHash, depth);
|
|
613
|
+
onlyRemote.push(...remoteLeaves);
|
|
614
|
+
}
|
|
615
|
+
if (remoteNode === undefined) {
|
|
616
|
+
const localLeaves = yield localTree.collectLeaves(localHash, depth);
|
|
617
|
+
onlyLocal.push(...localLeaves);
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
//# sourceMappingURL=sparse-merkle-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparse-merkle-tree.js","sourceRoot":"","sources":["../../../../src/smt/sparse-merkle-tree.ts"],"names":[],"mappings":"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"}
|