@dxos/echo-db 2.33.4-dev.faf06c70 → 2.33.5-dev.0d84e06f
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/dist/src/api/index.d.ts +0 -5
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +0 -5
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schema.test.js +1 -1
- package/dist/src/api/schema.test.js.map +1 -1
- package/dist/src/echo.d.ts +5 -12
- package/dist/src/echo.d.ts.map +1 -1
- package/dist/src/echo.js +11 -22
- package/dist/src/echo.js.map +1 -1
- package/dist/src/echo.test.js +12 -0
- package/dist/src/echo.test.js.map +1 -1
- package/dist/src/halo/contact-manager.d.ts +2 -1
- package/dist/src/halo/contact-manager.d.ts.map +1 -1
- package/dist/src/halo/contact-manager.js +1 -1
- package/dist/src/halo/contact-manager.js.map +1 -1
- package/dist/src/halo/halo-factory.d.ts.map +1 -1
- package/dist/src/halo/halo-factory.js +5 -11
- package/dist/src/halo/halo-factory.js.map +1 -1
- package/dist/src/halo/halo-party.d.ts +1 -1
- package/dist/src/halo/halo-party.d.ts.map +1 -1
- package/dist/src/halo/halo-party.js +8 -6
- package/dist/src/halo/halo-party.js.map +1 -1
- package/dist/src/halo/halo.test.js +5 -4
- package/dist/src/halo/halo.test.js.map +1 -1
- package/dist/src/halo/identity.js +2 -2
- package/dist/src/halo/identity.js.map +1 -1
- package/dist/src/halo/party-opener.d.ts +1 -1
- package/dist/src/halo/party-opener.d.ts.map +1 -1
- package/dist/src/halo/party-opener.js +2 -2
- package/dist/src/halo/party-opener.js.map +1 -1
- package/dist/src/halo/preferences.d.ts +1 -1
- package/dist/src/halo/preferences.d.ts.map +1 -1
- package/dist/src/halo/preferences.js +8 -11
- package/dist/src/halo/preferences.js.map +1 -1
- package/dist/src/index.d.ts +2 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/invitations/greeting-protocol-provider.d.ts.map +1 -1
- package/dist/src/invitations/greeting-protocol-provider.js +5 -9
- package/dist/src/invitations/greeting-protocol-provider.js.map +1 -1
- package/dist/src/invitations/greeting-responder.d.ts +6 -4
- package/dist/src/invitations/greeting-responder.d.ts.map +1 -1
- package/dist/src/invitations/greeting-responder.js +11 -14
- package/dist/src/invitations/greeting-responder.js.map +1 -1
- package/dist/src/invitations/halo-recovery-initiator.js +1 -1
- package/dist/src/invitations/halo-recovery-initiator.js.map +1 -1
- package/dist/src/invitations/invitation-descriptor.js +1 -1
- package/dist/src/invitations/invitation-descriptor.js.map +1 -1
- package/dist/src/invitations/invitation-factory.d.ts +5 -2
- package/dist/src/invitations/invitation-factory.d.ts.map +1 -1
- package/dist/src/invitations/invitation-factory.js +4 -3
- package/dist/src/invitations/invitation-factory.js.map +1 -1
- package/dist/src/invitations/offline-invitation-claimer.d.ts.map +1 -1
- package/dist/src/invitations/offline-invitation-claimer.js +6 -8
- package/dist/src/invitations/offline-invitation-claimer.js.map +1 -1
- package/dist/src/{database → packlets/database}/data-mirror.d.ts +0 -0
- package/dist/src/packlets/database/data-mirror.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/data-mirror.js +0 -0
- package/dist/src/packlets/database/data-mirror.js.map +1 -0
- package/dist/src/{database → packlets/database}/data-mirror.test.d.ts +0 -0
- package/dist/src/packlets/database/data-mirror.test.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/data-mirror.test.js +0 -0
- package/dist/src/packlets/database/data-mirror.test.js.map +1 -0
- package/dist/src/{database → packlets/database}/data-service-host.d.ts +0 -0
- package/dist/src/packlets/database/data-service-host.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/data-service-host.js +4 -3
- package/dist/src/packlets/database/data-service-host.js.map +1 -0
- package/dist/src/{database → packlets/database}/data-service-router.d.ts +0 -0
- package/dist/src/packlets/database/data-service-router.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/data-service-router.js +0 -0
- package/dist/src/packlets/database/data-service-router.js.map +1 -0
- package/dist/src/{database → packlets/database}/database-backend.d.ts +0 -0
- package/dist/src/packlets/database/database-backend.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/database-backend.js +0 -0
- package/dist/src/packlets/database/database-backend.js.map +1 -0
- package/dist/src/{api → packlets/database}/database.d.ts +2 -1
- package/dist/src/packlets/database/database.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/database.js +2 -2
- package/dist/src/packlets/database/database.js.map +1 -0
- package/dist/src/{api → packlets/database}/database.test.d.ts +0 -0
- package/dist/src/packlets/database/database.test.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/database.test.js +3 -3
- package/dist/src/packlets/database/database.test.js.map +1 -0
- package/dist/src/{api → packlets/database}/entity.d.ts +1 -1
- package/dist/src/packlets/database/entity.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/entity.js +0 -0
- package/dist/src/packlets/database/entity.js.map +1 -0
- package/dist/src/{database → packlets/database}/index.d.ts +5 -0
- package/dist/src/packlets/database/index.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/index.js +5 -0
- package/dist/src/packlets/database/index.js.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.d.ts +3 -2
- package/dist/src/packlets/database/item-demuxer.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.js +3 -5
- package/dist/src/packlets/database/item-demuxer.js.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.test.d.ts +0 -0
- package/dist/src/packlets/database/item-demuxer.test.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.test.js +2 -2
- package/dist/src/packlets/database/item-demuxer.test.js.map +1 -0
- package/dist/src/{database → packlets/database}/item-manager.d.ts +3 -1
- package/dist/src/packlets/database/item-manager.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-manager.js +13 -12
- package/dist/src/packlets/database/item-manager.js.map +1 -0
- package/dist/src/{database → packlets/database}/item-manager.test.d.ts +0 -0
- package/dist/src/packlets/database/item-manager.test.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-manager.test.js +0 -0
- package/dist/src/packlets/database/item-manager.test.js.map +1 -0
- package/dist/src/{api → packlets/database}/item.d.ts +1 -1
- package/dist/src/packlets/database/item.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/item.js +0 -0
- package/dist/src/packlets/database/item.js.map +1 -0
- package/dist/src/{api → packlets/database}/link.d.ts +1 -1
- package/dist/src/packlets/database/link.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/link.js +0 -0
- package/dist/src/packlets/database/link.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/index.d.ts +0 -0
- package/dist/src/packlets/database/selection/index.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/index.js +0 -0
- package/dist/src/packlets/database/selection/index.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/queries.d.ts +0 -0
- package/dist/src/packlets/database/selection/queries.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/queries.js +13 -17
- package/dist/src/packlets/database/selection/queries.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/result.d.ts +0 -0
- package/dist/src/packlets/database/selection/result.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/result.js +0 -0
- package/dist/src/packlets/database/selection/result.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/selection.d.ts +0 -0
- package/dist/src/packlets/database/selection/selection.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/selection.js +1 -3
- package/dist/src/packlets/database/selection/selection.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/selection.test.d.ts +0 -0
- package/dist/src/packlets/database/selection/selection.test.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/selection.test.js +4 -12
- package/dist/src/packlets/database/selection/selection.test.js.map +1 -0
- package/dist/src/{api → packlets/database}/selection/util.d.ts +0 -0
- package/dist/src/packlets/database/selection/util.d.ts.map +1 -0
- package/dist/src/{api → packlets/database}/selection/util.js +0 -0
- package/dist/src/packlets/database/selection/util.js.map +1 -0
- package/dist/src/{database → packlets/database}/testing.d.ts +1 -1
- package/dist/src/packlets/database/testing.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/testing.js +4 -4
- package/dist/src/packlets/database/testing.js.map +1 -0
- package/dist/src/{database → packlets/database}/timeframe-clock.d.ts +0 -0
- package/dist/src/packlets/database/timeframe-clock.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/timeframe-clock.js +0 -0
- package/dist/src/packlets/database/timeframe-clock.js.map +1 -0
- package/dist/src/{errors.d.ts → packlets/errors/index.d.ts} +1 -1
- package/dist/src/packlets/errors/index.d.ts.map +1 -0
- package/dist/src/{errors.js → packlets/errors/index.js} +1 -1
- package/dist/src/packlets/errors/index.js.map +1 -0
- package/dist/src/parties/data-party.d.ts +8 -5
- package/dist/src/parties/data-party.d.ts.map +1 -1
- package/dist/src/parties/data-party.js +13 -10
- package/dist/src/parties/data-party.js.map +1 -1
- package/dist/src/parties/data-party.test.js +18 -18
- package/dist/src/parties/data-party.test.js.map +1 -1
- package/dist/src/parties/party-factory.d.ts +0 -6
- package/dist/src/parties/party-factory.d.ts.map +1 -1
- package/dist/src/parties/party-factory.js +20 -48
- package/dist/src/parties/party-factory.js.map +1 -1
- package/dist/src/parties/party-manager.d.ts.map +1 -1
- package/dist/src/parties/party-manager.js +2 -1
- package/dist/src/parties/party-manager.js.map +1 -1
- package/dist/src/parties/party-manager.test.js +13 -10
- package/dist/src/parties/party-manager.test.js.map +1 -1
- package/dist/src/pipeline/message-selector.d.ts +3 -3
- package/dist/src/pipeline/message-selector.d.ts.map +1 -1
- package/dist/src/pipeline/message-selector.js +30 -39
- package/dist/src/pipeline/message-selector.js.map +1 -1
- package/dist/src/pipeline/metadata-store.d.ts +3 -3
- package/dist/src/pipeline/metadata-store.d.ts.map +1 -1
- package/dist/src/pipeline/metadata-store.js +5 -5
- package/dist/src/pipeline/metadata-store.js.map +1 -1
- package/dist/src/pipeline/metadata-store.test.js +9 -5
- package/dist/src/pipeline/metadata-store.test.js.map +1 -1
- package/dist/src/pipeline/party-core.d.ts +4 -3
- package/dist/src/pipeline/party-core.d.ts.map +1 -1
- package/dist/src/pipeline/party-core.js +7 -7
- package/dist/src/pipeline/party-core.js.map +1 -1
- package/dist/src/pipeline/party-core.test.js +30 -55
- package/dist/src/pipeline/party-core.test.js.map +1 -1
- package/dist/src/pipeline/party-processor.d.ts +21 -9
- package/dist/src/pipeline/party-processor.d.ts.map +1 -1
- package/dist/src/pipeline/party-processor.js +0 -8
- package/dist/src/pipeline/party-processor.js.map +1 -1
- package/dist/src/pipeline/pipeline.d.ts +3 -5
- package/dist/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/src/pipeline/pipeline.js +8 -11
- package/dist/src/pipeline/pipeline.js.map +1 -1
- package/dist/src/pipeline/pipeline.test.js +4 -5
- package/dist/src/pipeline/pipeline.test.js.map +1 -1
- package/dist/src/protocol/auth-plugin.d.ts +1 -1
- package/dist/src/protocol/auth-plugin.d.ts.map +1 -1
- package/dist/src/protocol/auth-plugin.js +1 -3
- package/dist/src/protocol/auth-plugin.js.map +1 -1
- package/dist/src/protocol/authenticator.d.ts +4 -4
- package/dist/src/protocol/authenticator.d.ts.map +1 -1
- package/dist/src/protocol/authenticator.js +12 -16
- package/dist/src/protocol/authenticator.js.map +1 -1
- package/dist/src/protocol/authenticator.test.js +1 -4
- package/dist/src/protocol/authenticator.test.js.map +1 -1
- package/dist/src/protocol/halo-recovery-plugin.d.ts +1 -1
- package/dist/src/protocol/halo-recovery-plugin.d.ts.map +1 -1
- package/dist/src/protocol/halo-recovery-plugin.js +1 -3
- package/dist/src/protocol/halo-recovery-plugin.js.map +1 -1
- package/dist/src/protocol/identity-credentials.d.ts +2 -2
- package/dist/src/protocol/identity-credentials.d.ts.map +1 -1
- package/dist/src/protocol/identity-credentials.js +4 -4
- package/dist/src/protocol/identity-credentials.js.map +1 -1
- package/dist/src/protocol/offline-invitation-plugin.d.ts +1 -1
- package/dist/src/protocol/offline-invitation-plugin.d.ts.map +1 -1
- package/dist/src/protocol/offline-invitation-plugin.js +1 -3
- package/dist/src/protocol/offline-invitation-plugin.js.map +1 -1
- package/dist/src/protocol/party-protocol-factory.d.ts +1 -14
- package/dist/src/protocol/party-protocol-factory.d.ts.map +1 -1
- package/dist/src/protocol/party-protocol-factory.js +2 -55
- package/dist/src/protocol/party-protocol-factory.js.map +1 -1
- package/dist/src/protocol/replicator-plugin.d.ts +7 -0
- package/dist/src/protocol/replicator-plugin.d.ts.map +1 -0
- package/dist/src/protocol/replicator-plugin.js +36 -0
- package/dist/src/protocol/replicator-plugin.js.map +1 -0
- package/dist/src/snapshots/snapshot-generator.d.ts +2 -2
- package/dist/src/snapshots/snapshot-generator.d.ts.map +1 -1
- package/dist/src/snapshots/snapshot-generator.js +13 -15
- package/dist/src/snapshots/snapshot-generator.js.map +1 -1
- package/dist/src/snapshots/snapshot-store.d.ts +3 -3
- package/dist/src/snapshots/snapshot-store.d.ts.map +1 -1
- package/dist/src/snapshots/snapshot-store.js +5 -5
- package/dist/src/snapshots/snapshot-store.js.map +1 -1
- package/dist/src/snapshots/snapshot-store.test.js +2 -2
- package/dist/src/snapshots/snapshot-store.test.js.map +1 -1
- package/dist/src/snapshots/snapshot.test.js +1 -1
- package/dist/src/snapshots/snapshot.test.js.map +1 -1
- package/dist/src/testing/benchmark.test.d.ts +2 -0
- package/dist/src/testing/benchmark.test.d.ts.map +1 -0
- package/dist/src/testing/benchmark.test.js +25 -0
- package/dist/src/testing/benchmark.test.js.map +1 -0
- package/dist/src/testing/testing-factories.d.ts +1 -1
- package/dist/src/testing/testing-factories.d.ts.map +1 -1
- package/dist/src/testing/testing-factories.js +2 -2
- package/dist/src/testing/testing-factories.js.map +1 -1
- package/dist/src/testing/testing.d.ts +3 -4
- package/dist/src/testing/testing.d.ts.map +1 -1
- package/dist/src/testing/testing.js +3 -4
- package/dist/src/testing/testing.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +21 -21
- package/src/api/index.ts +0 -5
- package/src/api/schema.test.ts +1 -2
- package/src/echo.test.ts +16 -1
- package/src/echo.ts +15 -37
- package/src/halo/contact-manager.ts +3 -2
- package/src/halo/halo-factory.ts +6 -18
- package/src/halo/halo-party.ts +12 -6
- package/src/halo/halo.test.ts +5 -4
- package/src/halo/identity.ts +2 -2
- package/src/halo/party-opener.ts +2 -2
- package/src/halo/preferences.ts +10 -12
- package/src/index.ts +3 -3
- package/src/invitations/greeting-protocol-provider.ts +5 -9
- package/src/invitations/greeting-responder.ts +15 -17
- package/src/invitations/halo-recovery-initiator.ts +1 -1
- package/src/invitations/invitation-descriptor.ts +1 -1
- package/src/invitations/invitation-factory.ts +8 -5
- package/src/invitations/offline-invitation-claimer.ts +6 -8
- package/src/{database → packlets/database}/data-mirror.test.ts +1 -1
- package/src/{database → packlets/database}/data-mirror.ts +1 -1
- package/src/{database → packlets/database}/data-service-host.ts +2 -1
- package/src/{database → packlets/database}/data-service-router.ts +0 -0
- package/src/{database → packlets/database}/database-backend.ts +0 -0
- package/src/{api → packlets/database}/database.test.ts +2 -1
- package/src/{api → packlets/database}/database.ts +3 -1
- package/src/{api → packlets/database}/entity.ts +1 -1
- package/src/{database → packlets/database}/index.ts +5 -0
- package/src/{database → packlets/database}/item-demuxer.test.ts +1 -1
- package/src/{database → packlets/database}/item-demuxer.ts +5 -5
- package/src/{database → packlets/database}/item-manager.test.ts +0 -0
- package/src/{database → packlets/database}/item-manager.ts +5 -3
- package/src/{api → packlets/database}/item.ts +2 -2
- package/src/{api → packlets/database}/link.ts +1 -1
- package/src/{api → packlets/database}/selection/index.ts +0 -0
- package/src/{api → packlets/database}/selection/queries.ts +14 -18
- package/src/{api → packlets/database}/selection/result.ts +0 -0
- package/src/{api → packlets/database}/selection/selection.test.ts +4 -12
- package/src/{api → packlets/database}/selection/selection.ts +1 -7
- package/src/{api → packlets/database}/selection/util.ts +0 -0
- package/src/{database → packlets/database}/testing.ts +2 -2
- package/src/{database → packlets/database}/timeframe-clock.ts +0 -0
- package/src/{errors.ts → packlets/errors/index.ts} +0 -0
- package/src/parties/data-party.test.ts +19 -18
- package/src/parties/data-party.ts +17 -11
- package/src/parties/party-factory.ts +26 -72
- package/src/parties/party-manager.test.ts +20 -11
- package/src/parties/party-manager.ts +2 -1
- package/src/pipeline/message-selector.ts +33 -45
- package/src/pipeline/metadata-store.test.ts +9 -5
- package/src/pipeline/metadata-store.ts +5 -5
- package/src/pipeline/party-core.test.ts +33 -73
- package/src/pipeline/party-core.ts +8 -9
- package/src/pipeline/party-processor.ts +23 -15
- package/src/pipeline/pipeline.test.ts +4 -5
- package/src/pipeline/pipeline.ts +12 -15
- package/src/protocol/auth-plugin.ts +1 -3
- package/src/protocol/authenticator.test.ts +1 -4
- package/src/protocol/authenticator.ts +33 -33
- package/src/protocol/halo-recovery-plugin.ts +4 -6
- package/src/protocol/identity-credentials.ts +4 -4
- package/src/protocol/offline-invitation-plugin.ts +4 -6
- package/src/protocol/party-protocol-factory.ts +3 -56
- package/src/protocol/replicator-plugin.ts +37 -0
- package/src/snapshots/snapshot-generator.ts +13 -17
- package/src/snapshots/snapshot-store.test.ts +2 -2
- package/src/snapshots/snapshot-store.ts +5 -6
- package/src/snapshots/snapshot.test.ts +1 -1
- package/src/testing/benchmark.test.ts +30 -0
- package/src/testing/testing-factories.ts +3 -3
- package/src/testing/testing.ts +4 -8
- package/dist/src/api/database.d.ts.map +0 -1
- package/dist/src/api/database.js.map +0 -1
- package/dist/src/api/database.test.d.ts.map +0 -1
- package/dist/src/api/database.test.js.map +0 -1
- package/dist/src/api/entity.d.ts.map +0 -1
- package/dist/src/api/entity.js.map +0 -1
- package/dist/src/api/item.d.ts.map +0 -1
- package/dist/src/api/item.js.map +0 -1
- package/dist/src/api/link.d.ts.map +0 -1
- package/dist/src/api/link.js.map +0 -1
- package/dist/src/api/selection/index.d.ts.map +0 -1
- package/dist/src/api/selection/index.js.map +0 -1
- package/dist/src/api/selection/queries.d.ts.map +0 -1
- package/dist/src/api/selection/queries.js.map +0 -1
- package/dist/src/api/selection/result.d.ts.map +0 -1
- package/dist/src/api/selection/result.js.map +0 -1
- package/dist/src/api/selection/selection.d.ts.map +0 -1
- package/dist/src/api/selection/selection.js.map +0 -1
- package/dist/src/api/selection/selection.test.d.ts.map +0 -1
- package/dist/src/api/selection/selection.test.js.map +0 -1
- package/dist/src/api/selection/util.d.ts.map +0 -1
- package/dist/src/api/selection/util.js.map +0 -1
- package/dist/src/database/data-mirror.d.ts.map +0 -1
- package/dist/src/database/data-mirror.js.map +0 -1
- package/dist/src/database/data-mirror.test.d.ts.map +0 -1
- package/dist/src/database/data-mirror.test.js.map +0 -1
- package/dist/src/database/data-service-host.d.ts.map +0 -1
- package/dist/src/database/data-service-host.js.map +0 -1
- package/dist/src/database/data-service-router.d.ts.map +0 -1
- package/dist/src/database/data-service-router.js.map +0 -1
- package/dist/src/database/database-backend.d.ts.map +0 -1
- package/dist/src/database/database-backend.js.map +0 -1
- package/dist/src/database/index.d.ts.map +0 -1
- package/dist/src/database/index.js.map +0 -1
- package/dist/src/database/item-demuxer.d.ts.map +0 -1
- package/dist/src/database/item-demuxer.js.map +0 -1
- package/dist/src/database/item-demuxer.test.d.ts.map +0 -1
- package/dist/src/database/item-demuxer.test.js.map +0 -1
- package/dist/src/database/item-manager.d.ts.map +0 -1
- package/dist/src/database/item-manager.js.map +0 -1
- package/dist/src/database/item-manager.test.d.ts.map +0 -1
- package/dist/src/database/item-manager.test.js.map +0 -1
- package/dist/src/database/testing.d.ts.map +0 -1
- package/dist/src/database/testing.js.map +0 -1
- package/dist/src/database/timeframe-clock.d.ts.map +0 -1
- package/dist/src/database/timeframe-clock.js.map +0 -1
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js.map +0 -1
- package/dist/src/util/index.d.ts +0 -2
- package/dist/src/util/index.d.ts.map +0 -1
- package/dist/src/util/index.js +0 -17
- package/dist/src/util/index.js.map +0 -1
- package/dist/src/util/persistant-ram-storage.d.ts +0 -6
- package/dist/src/util/persistant-ram-storage.d.ts.map +0 -1
- package/dist/src/util/persistant-ram-storage.js +0 -32
- package/dist/src/util/persistant-ram-storage.js.map +0 -1
- package/src/util/index.ts +0 -5
- package/src/util/persistant-ram-storage.ts +0 -33
package/src/pipeline/pipeline.ts
CHANGED
|
@@ -16,8 +16,8 @@ import {
|
|
|
16
16
|
import { createReadable } from '@dxos/feed-store';
|
|
17
17
|
import { jsonReplacer } from '@dxos/util';
|
|
18
18
|
|
|
19
|
-
import { TimeframeClock } from '../database';
|
|
20
|
-
import {
|
|
19
|
+
import { TimeframeClock } from '../packlets/database';
|
|
20
|
+
import { CredentialProcessor, PartyStateProvider } from './party-processor';
|
|
21
21
|
|
|
22
22
|
interface Options {
|
|
23
23
|
readLogger?: (msg: any) => void
|
|
@@ -55,17 +55,13 @@ export class Pipeline {
|
|
|
55
55
|
* @param _options
|
|
56
56
|
*/
|
|
57
57
|
constructor (
|
|
58
|
-
private readonly _partyProcessor:
|
|
58
|
+
private readonly _partyProcessor: CredentialProcessor & PartyStateProvider,
|
|
59
59
|
private readonly _feedStorIterator: FeedStoreIterator,
|
|
60
60
|
private readonly _timeframeClock: TimeframeClock,
|
|
61
61
|
private readonly _feedWriter?: FeedWriter<FeedMessage>,
|
|
62
62
|
private readonly _options: Options = {}
|
|
63
63
|
) {}
|
|
64
64
|
|
|
65
|
-
get partyKey () {
|
|
66
|
-
return this._partyProcessor.partyKey;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
65
|
get isOpen () {
|
|
70
66
|
return this._inboundEchoStream !== undefined;
|
|
71
67
|
}
|
|
@@ -113,6 +109,8 @@ export class Pipeline {
|
|
|
113
109
|
try {
|
|
114
110
|
const { data: message } = block;
|
|
115
111
|
|
|
112
|
+
this._timeframeClock.updateTimeframe(PublicKey.from(block.key), block.seq);
|
|
113
|
+
|
|
116
114
|
//
|
|
117
115
|
// HALO
|
|
118
116
|
//
|
|
@@ -129,7 +127,6 @@ export class Pipeline {
|
|
|
129
127
|
//
|
|
130
128
|
|
|
131
129
|
if (message.echo) {
|
|
132
|
-
this._timeframeClock.updateTimeframe(PublicKey.from(block.key), block.seq);
|
|
133
130
|
const memberKey = this._partyProcessor.getFeedOwningMember(PublicKey.from(block.key));
|
|
134
131
|
assert(memberKey, `Ownership of feed ${keyToString(block.key)} could not be determined.`);
|
|
135
132
|
|
|
@@ -142,7 +139,7 @@ export class Pipeline {
|
|
|
142
139
|
seq: block.seq,
|
|
143
140
|
feedKey: block.key,
|
|
144
141
|
memberKey,
|
|
145
|
-
timeframe: message.
|
|
142
|
+
timeframe: message.timeframe ?? new Timeframe()
|
|
146
143
|
},
|
|
147
144
|
data: message.echo
|
|
148
145
|
}));
|
|
@@ -171,13 +168,13 @@ export class Pipeline {
|
|
|
171
168
|
}, this._feedWriter);
|
|
172
169
|
|
|
173
170
|
this._outboundEchoStream = mapFeedWriter<EchoEnvelope, FeedMessage>(async message => ({
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
timeframe: this._timeframeClock.timeframe,
|
|
172
|
+
echo: message
|
|
173
|
+
}), loggingWriter);
|
|
174
|
+
this._outboundHaloStream = mapFeedWriter<HaloMessage, FeedMessage>(async message => ({
|
|
175
|
+
timeframe: this._timeframeClock.timeframe,
|
|
176
|
+
halo: message
|
|
178
177
|
}), loggingWriter);
|
|
179
|
-
this._outboundHaloStream =
|
|
180
|
-
mapFeedWriter<HaloMessage, FeedMessage>(async message => ({ halo: message }), loggingWriter);
|
|
181
178
|
}
|
|
182
179
|
|
|
183
180
|
return [
|
|
@@ -9,6 +9,4 @@ import { Replicator } from '@dxos/protocol-plugin-replicator';
|
|
|
9
9
|
/**
|
|
10
10
|
* Creates authenticator network-protocol plugin that guards access to the replicator.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
13
|
-
return new AuthPlugin(peerId.asBuffer(), authenticator, [Replicator.extension]);
|
|
14
|
-
}
|
|
12
|
+
export const createAuthPlugin = (authenticator: Authenticator, peerId: PublicKey) => new AuthPlugin(peerId.asBuffer(), authenticator, [Replicator.extension]);
|
|
@@ -6,7 +6,6 @@ import expect from 'expect';
|
|
|
6
6
|
import { it as test } from 'mocha';
|
|
7
7
|
|
|
8
8
|
import { createAuthMessage, createKeyAdmitMessage, createPartyGenesisMessage, Keyring, KeyType } from '@dxos/credentials';
|
|
9
|
-
import { MockFeedWriter } from '@dxos/echo-protocol';
|
|
10
9
|
|
|
11
10
|
import { PartyProcessor } from '../pipeline';
|
|
12
11
|
import { createAuthenticator } from './authenticator';
|
|
@@ -23,8 +22,6 @@ describe('authenticator', () => {
|
|
|
23
22
|
const signer = CredentialsSigner.createDirectDeviceSigner(keyring);
|
|
24
23
|
|
|
25
24
|
const partyProcessor = new PartyProcessor(partyKey.publicKey);
|
|
26
|
-
const feed = new MockFeedWriter();
|
|
27
|
-
partyProcessor.setOutboundStream(feed);
|
|
28
25
|
await partyProcessor.processMessage({
|
|
29
26
|
data: createPartyGenesisMessage(
|
|
30
27
|
keyring,
|
|
@@ -53,7 +50,7 @@ describe('authenticator', () => {
|
|
|
53
50
|
meta: {} as any
|
|
54
51
|
});
|
|
55
52
|
|
|
56
|
-
const authenticator = createAuthenticator(partyProcessor, signer);
|
|
53
|
+
const authenticator = createAuthenticator(partyProcessor, signer, null as any);
|
|
57
54
|
const credential = createAuthMessage(
|
|
58
55
|
keyring,
|
|
59
56
|
partyKey.publicKey,
|
|
@@ -4,27 +4,29 @@
|
|
|
4
4
|
|
|
5
5
|
import debug from 'debug';
|
|
6
6
|
|
|
7
|
-
import { Authenticator, codec, createAuthMessage, createEnvelopeMessage, createFeedAdmitMessage, PartyAuthenticator } from '@dxos/credentials';
|
|
8
|
-
import { FeedKey, PartyKey } from '@dxos/echo-protocol';
|
|
7
|
+
import { Message as HaloMessage, Authenticator, codec, createAuthMessage, createEnvelopeMessage, createFeedAdmitMessage, PartyAuthenticator } from '@dxos/credentials';
|
|
8
|
+
import { FeedKey, FeedWriter, PartyKey } from '@dxos/echo-protocol';
|
|
9
9
|
|
|
10
10
|
import { PartyProcessor } from '../pipeline';
|
|
11
11
|
import { CredentialsSigner } from './credentials-signer';
|
|
12
12
|
|
|
13
13
|
const log = debug('dxos:echo-db:authenticator');
|
|
14
14
|
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
15
|
+
export const createAuthenticator = (
|
|
16
|
+
partyProcessor: PartyProcessor,
|
|
17
|
+
credentialsSigner: CredentialsSigner,
|
|
18
|
+
credentialsWriter: FeedWriter<HaloMessage>
|
|
19
|
+
): Authenticator => new PartyAuthenticator(partyProcessor.state, async auth => {
|
|
20
|
+
if (auth.feedAdmit && auth.feedKey && !partyProcessor.isFeedAdmitted(auth.feedKey)) {
|
|
21
|
+
log(`Admitting feed of authenticated member: ${auth.feedKey}`);
|
|
22
|
+
await credentialsWriter.write(createEnvelopeMessage(
|
|
23
|
+
credentialsSigner.signer,
|
|
24
|
+
partyProcessor.partyKey,
|
|
25
|
+
auth.feedAdmit,
|
|
26
|
+
[credentialsSigner.getDeviceSigningKeys()]
|
|
27
|
+
));
|
|
28
|
+
}
|
|
29
|
+
});
|
|
28
30
|
|
|
29
31
|
export interface CredentialsProvider {
|
|
30
32
|
/**
|
|
@@ -33,24 +35,22 @@ export interface CredentialsProvider {
|
|
|
33
35
|
get (): Buffer
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
export
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
export const createCredentialsProvider = (credentialsSigner: CredentialsSigner, partyKey: PartyKey, feedKey: FeedKey): CredentialsProvider => ({
|
|
39
|
+
get: () => {
|
|
40
|
+
const authMessage = createAuthMessage(
|
|
41
|
+
credentialsSigner.signer,
|
|
42
|
+
partyKey,
|
|
43
|
+
credentialsSigner.getIdentityKey(),
|
|
44
|
+
credentialsSigner.getDeviceSigningKeys(),
|
|
45
|
+
feedKey,
|
|
46
|
+
undefined,
|
|
47
|
+
createFeedAdmitMessage(
|
|
40
48
|
credentialsSigner.signer,
|
|
41
49
|
partyKey,
|
|
42
|
-
credentialsSigner.getIdentityKey(),
|
|
43
|
-
credentialsSigner.getDeviceSigningKeys(),
|
|
44
50
|
feedKey,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
)
|
|
52
|
-
);
|
|
53
|
-
return Buffer.from(codec.encode(authMessage));
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
51
|
+
[feedKey, credentialsSigner.getDeviceSigningKeys()]
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
return Buffer.from(codec.encode(authMessage));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
@@ -12,9 +12,7 @@ import { HaloRecoveryInitiator, InvitationFactory } from '../invitations';
|
|
|
12
12
|
* Plugin is intended to be used in HALO party swarm.
|
|
13
13
|
*
|
|
14
14
|
*/
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
);
|
|
20
|
-
}
|
|
15
|
+
export const createHaloRecoveryPlugin = (identityKey: PublicKey, invitationFactory: InvitationFactory, peerId: PublicKey) => new GreetingCommandPlugin(
|
|
16
|
+
peerId.asBuffer(),
|
|
17
|
+
HaloRecoveryInitiator.createHaloInvitationClaimHandler(identityKey, invitationFactory)
|
|
18
|
+
);
|
|
@@ -25,7 +25,7 @@ export interface IdentityCredentials {
|
|
|
25
25
|
|
|
26
26
|
export type IdentityCredentialsProvider = () => IdentityCredentials | undefined
|
|
27
27
|
|
|
28
|
-
export
|
|
28
|
+
export const createTestIdentityCredentials = async (keyring: Keyring): Promise<IdentityCredentials> => {
|
|
29
29
|
const identityKey = await keyring.createKeyRecord({ type: KeyType.IDENTITY });
|
|
30
30
|
const deviceKey = await keyring.createKeyRecord({ type: KeyType.DEVICE });
|
|
31
31
|
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
@@ -53,9 +53,9 @@ export async function createTestIdentityCredentials (keyring: Keyring): Promise<
|
|
|
53
53
|
preferences: undefined,
|
|
54
54
|
contacts: undefined
|
|
55
55
|
};
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
|
|
58
|
-
export
|
|
58
|
+
export const deriveTestDeviceCredentials = async (identity: IdentityCredentials): Promise<IdentityCredentials> => {
|
|
59
59
|
const deviceKey = await identity.keyring.createKeyRecord({ type: KeyType.DEVICE });
|
|
60
60
|
const keyAdmit = createKeyAdmitMessage(identity.keyring, identity.identityKey.publicKey, deviceKey, [identity.identityKey]);
|
|
61
61
|
|
|
@@ -75,4 +75,4 @@ export async function deriveTestDeviceCredentials (identity: IdentityCredentials
|
|
|
75
75
|
deviceKeyChain
|
|
76
76
|
)
|
|
77
77
|
};
|
|
78
|
-
}
|
|
78
|
+
};
|
|
@@ -11,9 +11,7 @@ import { InvitationFactory, OfflineInvitationClaimer } from '../invitations';
|
|
|
11
11
|
* Creates network protocol plugin that allows peers to claim offline invitations.
|
|
12
12
|
* Plugin is intended to be used in data-party swarms.
|
|
13
13
|
*/
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
);
|
|
19
|
-
}
|
|
14
|
+
export const createOfflineInvitationPlugin = (invitationFactory: InvitationFactory, peerId: PublicKey) => new GreetingCommandPlugin(
|
|
15
|
+
peerId.asBuffer(),
|
|
16
|
+
OfflineInvitationClaimer.createOfflineInvitationClaimHandler(invitationFactory)
|
|
17
|
+
);
|
|
@@ -4,17 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
import debug from 'debug';
|
|
6
6
|
|
|
7
|
-
import { synchronized } from '@dxos/async';
|
|
8
7
|
import { discoveryKey, keyToString, PublicKey } from '@dxos/crypto';
|
|
9
|
-
import {
|
|
10
|
-
import type { HypercoreFeed } from '@dxos/feed-store';
|
|
8
|
+
import { PartyKey } from '@dxos/echo-protocol';
|
|
11
9
|
import { Protocol } from '@dxos/mesh-protocol';
|
|
12
10
|
import { MMSTTopology, NetworkManager, Plugin } from '@dxos/network-manager';
|
|
13
11
|
import { PresencePlugin } from '@dxos/protocol-plugin-presence';
|
|
14
|
-
import { Replicator } from '@dxos/protocol-plugin-replicator';
|
|
15
12
|
|
|
16
13
|
import { CredentialsProvider } from '.';
|
|
17
|
-
import { PartyFeedProvider } from '../pipeline/party-feed-provider';
|
|
18
14
|
|
|
19
15
|
const log = debug('dxos:echo-db:party-protocol-factory');
|
|
20
16
|
|
|
@@ -23,21 +19,15 @@ const log = debug('dxos:echo-db:party-protocol-factory');
|
|
|
23
19
|
*/
|
|
24
20
|
export class PartyProtocolFactory {
|
|
25
21
|
private readonly _presencePlugin = new PresencePlugin(this._peerId.asBuffer());
|
|
26
|
-
private readonly _replicatorProtocolPluginFactory: ReplicatorProtocolPluginFactory;
|
|
27
22
|
|
|
28
23
|
private _started = false;
|
|
29
24
|
|
|
30
25
|
constructor (
|
|
31
26
|
private readonly _partyKey: PartyKey,
|
|
32
27
|
private readonly _networkManager: NetworkManager,
|
|
33
|
-
private readonly _feedProvider: PartyFeedProvider,
|
|
34
28
|
private readonly _peerId: PublicKey,
|
|
35
29
|
private readonly _credentials: CredentialsProvider
|
|
36
|
-
) {
|
|
37
|
-
// Replication.
|
|
38
|
-
this._replicatorProtocolPluginFactory =
|
|
39
|
-
new ReplicatorProtocolPluginFactory(this._feedProvider);
|
|
40
|
-
}
|
|
30
|
+
) {}
|
|
41
31
|
|
|
42
32
|
async start (plugins: Plugin[]) {
|
|
43
33
|
if (this._started) {
|
|
@@ -73,9 +63,8 @@ export class PartyProtocolFactory {
|
|
|
73
63
|
await this._networkManager.leaveProtocolSwarm(this._partyKey);
|
|
74
64
|
}
|
|
75
65
|
|
|
76
|
-
private _createProtocol (channel: any, opts: {initiator: boolean}, extraPlugins: Plugin[]) {
|
|
66
|
+
private _createProtocol (channel: any, opts: { initiator: boolean }, extraPlugins: Plugin[]) {
|
|
77
67
|
const plugins: Plugin[] = [
|
|
78
|
-
...this._replicatorProtocolPluginFactory.createPlugins(),
|
|
79
68
|
...extraPlugins,
|
|
80
69
|
this._presencePlugin
|
|
81
70
|
];
|
|
@@ -118,45 +107,3 @@ export class PartyProtocolFactory {
|
|
|
118
107
|
return protocol;
|
|
119
108
|
}
|
|
120
109
|
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Creates the protocol plugin for feed replication.
|
|
124
|
-
*/
|
|
125
|
-
export class ReplicatorProtocolPluginFactory {
|
|
126
|
-
constructor (
|
|
127
|
-
private readonly _feedProvider: PartyFeedProvider
|
|
128
|
-
) {}
|
|
129
|
-
|
|
130
|
-
createPlugins () {
|
|
131
|
-
return [
|
|
132
|
-
new Replicator({
|
|
133
|
-
load: async () => {
|
|
134
|
-
const feeds = this._feedProvider.getFeeds();
|
|
135
|
-
log(`Loading feeds: ${feeds.map(feed => keyToString(feed.key))}`);
|
|
136
|
-
return feeds.map((feed) => ({ discoveryKey: feed.feed.discoveryKey }));
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
subscribe: (addFeedToReplicatedSet: (feed: any) => void) => {
|
|
140
|
-
return this._feedProvider.feedOpened.on(async (feed) => {
|
|
141
|
-
log(`Adding feed: ${feed.key.toHex()}`);
|
|
142
|
-
addFeedToReplicatedSet({ discoveryKey: feed.feed.discoveryKey });
|
|
143
|
-
});
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
replicate: async (remoteFeeds, info) => {
|
|
147
|
-
// We can ignore remoteFeeds entirely, since the set of feeds we want to replicate is dictated by the Party.
|
|
148
|
-
// TODO(telackey): Why are we opening feeds? Necessary or belt/braces thinking, or because open party does it?
|
|
149
|
-
const feeds = this._feedProvider.getFeeds();
|
|
150
|
-
log(`Replicating: peerId=${info.session}; feeds=${feeds.map(feed => feed.key.toHex())}`);
|
|
151
|
-
return feeds.map(feed => feed.feed);
|
|
152
|
-
}
|
|
153
|
-
})
|
|
154
|
-
];
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
@synchronized
|
|
158
|
-
private async _openFeed (key: FeedKey): Promise<HypercoreFeed> {
|
|
159
|
-
const descriptor = await this._feedProvider.createOrOpenReadOnlyFeed(key);
|
|
160
|
-
return descriptor.feed;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import debug from 'debug';
|
|
6
|
+
|
|
7
|
+
import { keyToString } from '@dxos/crypto';
|
|
8
|
+
import { Replicator } from '@dxos/protocol-plugin-replicator';
|
|
9
|
+
|
|
10
|
+
import { PartyFeedProvider } from '../pipeline';
|
|
11
|
+
|
|
12
|
+
const log = debug('dxos:echo-db:protocol:replicator');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Creates the protocol plugin for feed replication.
|
|
16
|
+
*/
|
|
17
|
+
export const createReplicatorPlugin = (feedProvider: PartyFeedProvider) =>
|
|
18
|
+
new Replicator({
|
|
19
|
+
load: async () => {
|
|
20
|
+
const feeds = feedProvider.getFeeds();
|
|
21
|
+
log(`Loading feeds: ${feeds.map(feed => keyToString(feed.key))}`);
|
|
22
|
+
return feeds.map((feed) => ({ discoveryKey: feed.feed.discoveryKey }));
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
subscribe: (addFeedToReplicatedSet: (feed: any) => void) => feedProvider.feedOpened.on(async (feed) => {
|
|
26
|
+
log(`Adding feed: ${feed.key.toHex()}`);
|
|
27
|
+
addFeedToReplicatedSet({ discoveryKey: feed.feed.discoveryKey });
|
|
28
|
+
}),
|
|
29
|
+
|
|
30
|
+
replicate: async (remoteFeeds, info) => {
|
|
31
|
+
// We can ignore remoteFeeds entirely, since the set of feeds we want to replicate is dictated by the Party.
|
|
32
|
+
// TODO(telackey): Why are we opening feeds? Necessary or belt/braces thinking, or because open party does it?
|
|
33
|
+
const feeds = feedProvider.getFeeds();
|
|
34
|
+
log(`Replicating: peerId=${info.session}; feeds=${feeds.map(feed => feed.key.toHex())}`);
|
|
35
|
+
return feeds.map(feed => feed.feed);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
@@ -4,26 +4,22 @@
|
|
|
4
4
|
|
|
5
5
|
import debug from 'debug';
|
|
6
6
|
|
|
7
|
-
import { TimeframeClock } from '../database';
|
|
7
|
+
import { TimeframeClock } from '../packlets/database';
|
|
8
8
|
import { PartyCore } from '../pipeline';
|
|
9
9
|
import { SnapshotStore } from './snapshot-store';
|
|
10
10
|
|
|
11
11
|
const log = debug('dxos:snapshot-generator');
|
|
12
12
|
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} catch (err: any) {
|
|
24
|
-
console.error('Failed to save snapshot');
|
|
25
|
-
console.error(err);
|
|
26
|
-
}
|
|
13
|
+
export const createAutomaticSnapshots = (party: PartyCore, clock: TimeframeClock, store: SnapshotStore, interval: number) => clock.update.on(async timeframe => {
|
|
14
|
+
const totalMessages = timeframe.totalMessages();
|
|
15
|
+
if (totalMessages > 0 && totalMessages % interval === 0) {
|
|
16
|
+
log(`Saving snapshot of ${party.key.humanize()}...`);
|
|
17
|
+
try {
|
|
18
|
+
const snapshot = party.createSnapshot();
|
|
19
|
+
await store.save(snapshot);
|
|
20
|
+
} catch (err: any) {
|
|
21
|
+
console.error('Failed to save snapshot');
|
|
22
|
+
console.error(err);
|
|
27
23
|
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
24
|
+
}
|
|
25
|
+
});
|
|
@@ -7,15 +7,15 @@ import { it as test } from 'mocha';
|
|
|
7
7
|
|
|
8
8
|
import { createId, createKeyPair, PublicKey } from '@dxos/crypto';
|
|
9
9
|
import { PartySnapshot } from '@dxos/echo-protocol';
|
|
10
|
+
import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
10
11
|
|
|
11
|
-
import { createRamStorage } from '../util';
|
|
12
12
|
import { SnapshotStore } from './snapshot-store';
|
|
13
13
|
|
|
14
14
|
const createPublicKey = () => PublicKey.from(createKeyPair().publicKey);
|
|
15
15
|
|
|
16
16
|
describe('SnapshotStore', () => {
|
|
17
17
|
test('in-memory', async () => {
|
|
18
|
-
const store = new SnapshotStore(
|
|
18
|
+
const store = new SnapshotStore(createStorage('', StorageType.RAM).directory('snapshots'));
|
|
19
19
|
|
|
20
20
|
const key1 = createPublicKey();
|
|
21
21
|
const key2 = createPublicKey();
|
|
@@ -7,10 +7,9 @@ import debug from 'debug';
|
|
|
7
7
|
|
|
8
8
|
import { keyToString } from '@dxos/crypto';
|
|
9
9
|
import { schema, PartyKey, PartySnapshot } from '@dxos/echo-protocol';
|
|
10
|
-
import {
|
|
10
|
+
import { Directory } from '@dxos/random-access-multi-storage';
|
|
11
11
|
|
|
12
12
|
const log = debug('dxos:snapshot-store');
|
|
13
|
-
|
|
14
13
|
/**
|
|
15
14
|
* Stores party snapshots. Takes any `random-access-storage` compatible backend.
|
|
16
15
|
*
|
|
@@ -18,11 +17,11 @@ const log = debug('dxos:snapshot-store');
|
|
|
18
17
|
*/
|
|
19
18
|
export class SnapshotStore {
|
|
20
19
|
constructor (
|
|
21
|
-
private readonly
|
|
20
|
+
private readonly _directory: Directory
|
|
22
21
|
) {}
|
|
23
22
|
|
|
24
23
|
async load (partyKey: PartyKey): Promise<PartySnapshot | undefined> {
|
|
25
|
-
const file = this.
|
|
24
|
+
const file = this._directory.createOrOpen(partyKey.toHex());
|
|
26
25
|
|
|
27
26
|
try {
|
|
28
27
|
const { size } = await file.stat();
|
|
@@ -45,7 +44,7 @@ export class SnapshotStore {
|
|
|
45
44
|
|
|
46
45
|
async save (snapshot: PartySnapshot) {
|
|
47
46
|
assert(snapshot.partyKey);
|
|
48
|
-
const file = this.
|
|
47
|
+
const file = this._directory.createOrOpen(keyToString(snapshot.partyKey), { truncate: true, size: 0 });
|
|
49
48
|
|
|
50
49
|
try {
|
|
51
50
|
const data = schema.getCodecForType('dxos.echo.snapshot.PartySnapshot').encode(snapshot);
|
|
@@ -60,6 +59,6 @@ export class SnapshotStore {
|
|
|
60
59
|
*/
|
|
61
60
|
async clear () {
|
|
62
61
|
log('Clearing all snapshots..');
|
|
63
|
-
await this.
|
|
62
|
+
await this._directory.destroy();
|
|
64
63
|
}
|
|
65
64
|
}
|
|
@@ -12,7 +12,7 @@ import { schema, ItemID, MockFeedWriter, PartyKey } from '@dxos/echo-protocol';
|
|
|
12
12
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
13
|
import { ObjectModel, ValueUtil } from '@dxos/object-model';
|
|
14
14
|
|
|
15
|
-
import { ItemDemuxer, ItemManager } from '../database';
|
|
15
|
+
import { ItemDemuxer, ItemManager } from '../packlets/database';
|
|
16
16
|
import { createTestInstance } from '../testing';
|
|
17
17
|
|
|
18
18
|
const log = debug('dxos:snapshot:test');
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { ObjectModel } from '@dxos/object-model';
|
|
6
|
+
|
|
7
|
+
import { ECHO } from '../echo';
|
|
8
|
+
|
|
9
|
+
const ITEMS = 100;
|
|
10
|
+
const MUTATIONS = 1000;
|
|
11
|
+
|
|
12
|
+
it.skip('Database benchmark', async () => {
|
|
13
|
+
const echo = new ECHO({ snapshots: false });
|
|
14
|
+
await echo.open();
|
|
15
|
+
await echo.halo.createProfile();
|
|
16
|
+
const party = await echo.createParty();
|
|
17
|
+
|
|
18
|
+
const start = Date.now();
|
|
19
|
+
for (let i = 0; i < ITEMS; i++) {
|
|
20
|
+
const item = await party.database.createItem({ model: ObjectModel, type: 'test:item' });
|
|
21
|
+
|
|
22
|
+
for (let j = 0; j < MUTATIONS; j++) {
|
|
23
|
+
await item.model.set(`key${j % 100}`, `value-${j}`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log(`${i * MUTATIONS}/${ITEMS * MUTATIONS} ${((Date.now() - start) / ((i + 1) * MUTATIONS / 1000)).toFixed(1)} µs/mut ${((i + 1) * MUTATIONS / (Date.now() - start) * 1000).toFixed(1)} mut/s`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
await echo.close();
|
|
30
|
+
});
|
|
@@ -8,8 +8,8 @@ import { Model } from '@dxos/model-factory';
|
|
|
8
8
|
import { ObjectModel } from '@dxos/object-model';
|
|
9
9
|
import { range } from '@dxos/util';
|
|
10
10
|
|
|
11
|
-
import { Item, CreateItemOption } from '../api';
|
|
12
11
|
import { ECHO } from '../echo';
|
|
12
|
+
import { CreateItemOption, Item } from '../packlets/database';
|
|
13
13
|
import { DataParty } from '../parties';
|
|
14
14
|
import { createTestInstance, inviteTestPeer } from './testing';
|
|
15
15
|
|
|
@@ -22,10 +22,10 @@ export type TestPeer = Awaited<ReturnType<typeof createTestInstance>>;
|
|
|
22
22
|
|
|
23
23
|
export type WithTestMeta<T> = T & { testMeta: TestPeer }
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
const addTestMeta = <T>(obj: T, meta: TestPeer): WithTestMeta<T> => {
|
|
26
26
|
(obj as any).testMeta = meta;
|
|
27
27
|
return obj as any;
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Creates a number of test ECHO instances and a party that's shared between all of them.
|
package/src/testing/testing.ts
CHANGED
|
@@ -5,12 +5,11 @@
|
|
|
5
5
|
import debug from 'debug';
|
|
6
6
|
|
|
7
7
|
import { NetworkManagerOptions } from '@dxos/network-manager';
|
|
8
|
-
import {
|
|
8
|
+
import { Storage, createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
9
9
|
import { jsonReplacer } from '@dxos/util';
|
|
10
10
|
|
|
11
11
|
import { ECHO } from '../echo';
|
|
12
12
|
import { DataParty } from '../parties';
|
|
13
|
-
import { createRamStorage } from '../util';
|
|
14
13
|
|
|
15
14
|
export const log = debug('dxos:echo-db:testing');
|
|
16
15
|
|
|
@@ -21,13 +20,12 @@ export const messageLogger = (tag: string) => (message: any) => {
|
|
|
21
20
|
export interface TestOptions {
|
|
22
21
|
verboseLogging?: boolean
|
|
23
22
|
initialize?: boolean
|
|
24
|
-
storage?:
|
|
23
|
+
storage?: Storage
|
|
25
24
|
keyStorage?: any
|
|
26
25
|
networkManagerOptions?: NetworkManagerOptions
|
|
27
26
|
// TODO(burdon): Group properties by hierarchical object.
|
|
28
27
|
snapshots?: boolean
|
|
29
28
|
snapshotInterval?: number
|
|
30
|
-
snapshotStorage?: IStorage
|
|
31
29
|
}
|
|
32
30
|
|
|
33
31
|
/**
|
|
@@ -36,17 +34,15 @@ export interface TestOptions {
|
|
|
36
34
|
export const createTestInstance = async ({
|
|
37
35
|
verboseLogging = false,
|
|
38
36
|
initialize = false,
|
|
39
|
-
storage =
|
|
37
|
+
storage = createStorage('', StorageType.RAM),
|
|
40
38
|
keyStorage = undefined,
|
|
41
39
|
networkManagerOptions,
|
|
42
|
-
snapshotStorage = createRamStorage(),
|
|
43
40
|
snapshots = true,
|
|
44
41
|
snapshotInterval
|
|
45
42
|
}: TestOptions = {}) => {
|
|
46
43
|
const echo = new ECHO({
|
|
47
|
-
|
|
44
|
+
storage,
|
|
48
45
|
keyStorage,
|
|
49
|
-
snapshotStorage,
|
|
50
46
|
snapshotInterval,
|
|
51
47
|
snapshots,
|
|
52
48
|
networkManagerOptions,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/api/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/api/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database.test.d.ts","sourceRoot":"","sources":["../../../src/api/database.test.ts"],"names":[],"mappings":""}
|