@dxos/echo-db 2.33.5-dev.4dcc5349 → 2.33.5-dev.8e90a74f
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 +1 -0
- package/dist/src/echo.d.ts.map +1 -1
- package/dist/src/echo.js +9 -20
- 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 +2 -2
- package/dist/src/halo/halo-factory.d.ts.map +1 -1
- package/dist/src/halo/halo-factory.js +7 -13
- package/dist/src/halo/halo-factory.js.map +1 -1
- package/dist/src/halo/halo-party.d.ts +4 -3
- package/dist/src/halo/halo-party.d.ts.map +1 -1
- package/dist/src/halo/halo-party.js +16 -10
- package/dist/src/halo/halo-party.js.map +1 -1
- package/dist/src/halo/halo.test.js +4 -3
- 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 +5 -3
- 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 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/invitations/greeting-initiator.d.ts +2 -2
- package/dist/src/invitations/greeting-initiator.d.ts.map +1 -1
- package/dist/src/invitations/greeting-initiator.js +2 -1
- package/dist/src/invitations/greeting-initiator.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 +11 -8
- package/dist/src/parties/data-party.d.ts.map +1 -1
- package/dist/src/parties/data-party.js +21 -14
- package/dist/src/parties/data-party.js.map +1 -1
- package/dist/src/parties/data-party.test.js +23 -22
- package/dist/src/parties/data-party.test.js.map +1 -1
- package/dist/src/parties/party-factory.d.ts +2 -8
- package/dist/src/parties/party-factory.d.ts.map +1 -1
- package/dist/src/parties/party-factory.js +22 -50
- package/dist/src/parties/party-factory.js.map +1 -1
- package/dist/src/parties/party-manager.d.ts +3 -4
- package/dist/src/parties/party-manager.d.ts.map +1 -1
- package/dist/src/parties/party-manager.js +4 -5
- package/dist/src/parties/party-manager.js.map +1 -1
- package/dist/src/parties/party-manager.test.js +14 -13
- 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 -29
- 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 +8 -4
- package/dist/src/pipeline/metadata-store.test.js.map +1 -1
- package/dist/src/pipeline/party-core.d.ts +21 -6
- package/dist/src/pipeline/party-core.d.ts.map +1 -1
- package/dist/src/pipeline/party-core.js +14 -17
- package/dist/src/pipeline/party-core.js.map +1 -1
- package/dist/src/pipeline/party-core.test.js +34 -33
- 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 +1 -1
- 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/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -18
- 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 +10 -20
- package/src/halo/contact-manager.ts +3 -2
- package/src/halo/halo-factory.ts +8 -21
- package/src/halo/halo-party.ts +18 -10
- package/src/halo/halo.test.ts +4 -3
- package/src/halo/identity.ts +2 -2
- package/src/halo/party-opener.ts +5 -3
- package/src/halo/preferences.ts +10 -12
- package/src/index.ts +3 -2
- package/src/invitations/greeting-initiator.ts +5 -4
- 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 +26 -23
- package/src/parties/data-party.ts +23 -16
- package/src/parties/party-factory.ts +28 -75
- package/src/parties/party-manager.test.ts +21 -14
- package/src/parties/party-manager.ts +4 -5
- package/src/pipeline/message-selector.ts +32 -35
- package/src/pipeline/metadata-store.test.ts +8 -4
- package/src/pipeline/metadata-store.ts +5 -5
- package/src/pipeline/party-core.test.ts +37 -40
- package/src/pipeline/party-core.ts +34 -19
- 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 +1 -1
- 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/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
|
@@ -8,7 +8,8 @@ import { it as test } from 'mocha';
|
|
|
8
8
|
import { promiseTimeout } from '@dxos/async';
|
|
9
9
|
import { createFeedAdmitMessage, createPartyGenesisMessage, Keyring, KeyType } from '@dxos/credentials';
|
|
10
10
|
import { createId, PublicKey } from '@dxos/crypto';
|
|
11
|
-
import {
|
|
11
|
+
import { checkType } from '@dxos/debug';
|
|
12
|
+
import { codec, FeedMessage, Timeframe } from '@dxos/echo-protocol';
|
|
12
13
|
import { FeedStore } from '@dxos/feed-store';
|
|
13
14
|
import { createTestProtocolPair } from '@dxos/mesh-protocol';
|
|
14
15
|
import { ModelFactory } from '@dxos/model-factory';
|
|
@@ -16,22 +17,23 @@ import { ObjectModel } from '@dxos/object-model';
|
|
|
16
17
|
import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
17
18
|
import { afterTest } from '@dxos/testutils';
|
|
18
19
|
|
|
19
|
-
import { MetadataStore, PartyFeedProvider
|
|
20
|
+
import { MetadataStore, PartyFeedProvider } from '../pipeline';
|
|
21
|
+
import { createReplicatorPlugin } from '../protocol/replicator-plugin';
|
|
20
22
|
import { SnapshotStore } from '../snapshots';
|
|
21
23
|
import { PartyCore } from './party-core';
|
|
22
24
|
|
|
23
25
|
describe('PartyCore', () => {
|
|
24
26
|
const setup = async () => {
|
|
25
27
|
const storage = createStorage('', StorageType.RAM);
|
|
26
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
28
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
27
29
|
afterTest(async () => feedStore.close());
|
|
28
30
|
|
|
29
31
|
const keyring = new Keyring();
|
|
30
32
|
|
|
31
|
-
const metadataStore = new MetadataStore(
|
|
33
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
32
34
|
|
|
33
35
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
34
|
-
const snapshotStore = new SnapshotStore(
|
|
36
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
35
37
|
|
|
36
38
|
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
37
39
|
|
|
@@ -50,7 +52,7 @@ describe('PartyCore', () => {
|
|
|
50
52
|
afterTest(async () => party.close());
|
|
51
53
|
|
|
52
54
|
// PartyGenesis (self-signed by Party).
|
|
53
|
-
await party.
|
|
55
|
+
await party.credentialsWriter.write(createPartyGenesisMessage(
|
|
54
56
|
keyring,
|
|
55
57
|
partyKey,
|
|
56
58
|
feed.key,
|
|
@@ -58,7 +60,7 @@ describe('PartyCore', () => {
|
|
|
58
60
|
);
|
|
59
61
|
|
|
60
62
|
// FeedAdmit (signed by the Device KeyChain).
|
|
61
|
-
await party.
|
|
63
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
62
64
|
keyring,
|
|
63
65
|
partyKey.publicKey,
|
|
64
66
|
feed.key,
|
|
@@ -119,7 +121,7 @@ describe('PartyCore', () => {
|
|
|
119
121
|
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
120
122
|
|
|
121
123
|
const eventFired = feedStore.feedOpenedEvent.waitForCount(1);
|
|
122
|
-
await party.
|
|
124
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
123
125
|
keyring,
|
|
124
126
|
party.key,
|
|
125
127
|
feedKey.publicKey,
|
|
@@ -131,15 +133,15 @@ describe('PartyCore', () => {
|
|
|
131
133
|
|
|
132
134
|
test('opens feed from hints', async () => {
|
|
133
135
|
const storage = createStorage('', StorageType.RAM);
|
|
134
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
136
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
135
137
|
afterTest(async () => feedStore.close());
|
|
136
138
|
|
|
137
139
|
const keyring = new Keyring();
|
|
138
140
|
|
|
139
|
-
const metadataStore = new MetadataStore(
|
|
141
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
140
142
|
|
|
141
143
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
142
|
-
const snapshotStore = new SnapshotStore(
|
|
144
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
143
145
|
|
|
144
146
|
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
145
147
|
|
|
@@ -159,7 +161,7 @@ describe('PartyCore', () => {
|
|
|
159
161
|
|
|
160
162
|
const feedOpened = feedStore.feedOpenedEvent.waitForCount(1);
|
|
161
163
|
|
|
162
|
-
await party.open(
|
|
164
|
+
await party.open({ feedHints: [otherFeedKey] });
|
|
163
165
|
afterTest(async () => party.close());
|
|
164
166
|
|
|
165
167
|
await feedOpened;
|
|
@@ -174,16 +176,16 @@ describe('PartyCore', () => {
|
|
|
174
176
|
const feed = await partyFeedProvider.createOrOpenWritableFeed();
|
|
175
177
|
|
|
176
178
|
const itemId = createId();
|
|
177
|
-
await feed.feed.append({
|
|
179
|
+
await feed.feed.append(checkType<FeedMessage>({
|
|
180
|
+
timeframe: new Timeframe(),
|
|
178
181
|
echo: {
|
|
179
182
|
itemId,
|
|
180
183
|
genesis: {
|
|
181
184
|
itemType: 'dxos:example',
|
|
182
185
|
modelType: ObjectModel.meta.type
|
|
183
|
-
}
|
|
184
|
-
timeframe: new Timeframe()
|
|
186
|
+
}
|
|
185
187
|
}
|
|
186
|
-
});
|
|
188
|
+
}));
|
|
187
189
|
|
|
188
190
|
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
189
191
|
});
|
|
@@ -196,7 +198,7 @@ describe('PartyCore', () => {
|
|
|
196
198
|
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
197
199
|
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
198
200
|
|
|
199
|
-
await party.
|
|
201
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
200
202
|
keyring,
|
|
201
203
|
party.key,
|
|
202
204
|
feed2.key,
|
|
@@ -204,16 +206,16 @@ describe('PartyCore', () => {
|
|
|
204
206
|
));
|
|
205
207
|
|
|
206
208
|
const itemId = createId();
|
|
207
|
-
await feed2.append({
|
|
209
|
+
await feed2.append(checkType<FeedMessage>({
|
|
210
|
+
timeframe: new Timeframe(),
|
|
208
211
|
echo: {
|
|
209
212
|
itemId,
|
|
210
213
|
genesis: {
|
|
211
214
|
itemType: 'dxos:example',
|
|
212
215
|
modelType: ObjectModel.meta.type
|
|
213
|
-
}
|
|
214
|
-
timeframe: new Timeframe()
|
|
216
|
+
}
|
|
215
217
|
}
|
|
216
|
-
});
|
|
218
|
+
}));
|
|
217
219
|
|
|
218
220
|
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
219
221
|
});
|
|
@@ -225,7 +227,7 @@ describe('PartyCore', () => {
|
|
|
225
227
|
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
226
228
|
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
227
229
|
|
|
228
|
-
await party.
|
|
230
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
229
231
|
keyring,
|
|
230
232
|
party.key,
|
|
231
233
|
feedKey.publicKey,
|
|
@@ -234,16 +236,16 @@ describe('PartyCore', () => {
|
|
|
234
236
|
|
|
235
237
|
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
236
238
|
const itemId = createId();
|
|
237
|
-
await feed2.append({
|
|
239
|
+
await feed2.append(checkType<FeedMessage>({
|
|
240
|
+
timeframe: new Timeframe(),
|
|
238
241
|
echo: {
|
|
239
242
|
itemId,
|
|
240
243
|
genesis: {
|
|
241
244
|
itemType: 'dxos:example',
|
|
242
245
|
modelType: ObjectModel.meta.type
|
|
243
|
-
}
|
|
244
|
-
timeframe: new Timeframe()
|
|
246
|
+
}
|
|
245
247
|
}
|
|
246
|
-
});
|
|
248
|
+
}));
|
|
247
249
|
|
|
248
250
|
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
249
251
|
});
|
|
@@ -252,13 +254,13 @@ describe('PartyCore', () => {
|
|
|
252
254
|
const peer1 = await setup();
|
|
253
255
|
|
|
254
256
|
const storage = createStorage('', StorageType.RAM);
|
|
255
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
257
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
256
258
|
afterTest(async () => feedStore.close());
|
|
257
259
|
|
|
258
|
-
const metadataStore = new MetadataStore(
|
|
260
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
259
261
|
|
|
260
262
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
261
|
-
const snapshotStore = new SnapshotStore(
|
|
263
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
262
264
|
|
|
263
265
|
const partyFeedProvider = new PartyFeedProvider(metadataStore, peer1.keyring, feedStore, peer1.party.key);
|
|
264
266
|
|
|
@@ -272,26 +274,21 @@ describe('PartyCore', () => {
|
|
|
272
274
|
|
|
273
275
|
const feed2 = await partyFeedProvider.createOrOpenWritableFeed();
|
|
274
276
|
|
|
275
|
-
await peer1.party.
|
|
277
|
+
await peer1.party.credentialsWriter.write(createFeedAdmitMessage(
|
|
276
278
|
peer1.keyring,
|
|
277
279
|
peer1.party.key,
|
|
278
280
|
feed2.key,
|
|
279
281
|
[peer1.partyKey]
|
|
280
282
|
));
|
|
281
283
|
|
|
282
|
-
await party2.open(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
}]);
|
|
284
|
+
await party2.open({
|
|
285
|
+
feedHints: [peer1.feedKey]
|
|
286
|
+
});
|
|
286
287
|
afterTest(async () => party2.close());
|
|
287
288
|
|
|
288
289
|
createTestProtocolPair(
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
).createPlugins().map(r => r.createExtension()),
|
|
292
|
-
new ReplicatorProtocolPluginFactory(
|
|
293
|
-
partyFeedProvider
|
|
294
|
-
).createPlugins().map(r => r.createExtension())
|
|
290
|
+
[createReplicatorPlugin(peer1.partyFeedProvider).createExtension()],
|
|
291
|
+
[createReplicatorPlugin(partyFeedProvider).createExtension()]
|
|
295
292
|
);
|
|
296
293
|
|
|
297
294
|
const item1 = await peer1.party.database.createItem();
|
|
@@ -5,15 +5,14 @@
|
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
|
|
7
7
|
import { synchronized } from '@dxos/async';
|
|
8
|
-
import {
|
|
8
|
+
import { KeyType, Message as HaloMessage } from '@dxos/credentials';
|
|
9
9
|
import { PublicKey } from '@dxos/crypto';
|
|
10
10
|
import { timed } from '@dxos/debug';
|
|
11
|
-
import { createFeedWriter, DatabaseSnapshot, PartyKey, PartySnapshot, Timeframe } from '@dxos/echo-protocol';
|
|
11
|
+
import { createFeedWriter, DatabaseSnapshot, FeedWriter, PartyKey, PartySnapshot, Timeframe } from '@dxos/echo-protocol';
|
|
12
12
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
13
|
import { SubscriptionGroup } from '@dxos/util';
|
|
14
14
|
|
|
15
|
-
import { Database } from '../
|
|
16
|
-
import { FeedDatabaseBackend, TimeframeClock } from '../database';
|
|
15
|
+
import { Database, FeedDatabaseBackend, TimeframeClock } from '../packlets/database';
|
|
17
16
|
import { createMessageSelector, PartyProcessor, PartyFeedProvider, Pipeline } from '../pipeline';
|
|
18
17
|
import { createAutomaticSnapshots, SnapshotStore } from '../snapshots';
|
|
19
18
|
|
|
@@ -29,6 +28,22 @@ export interface PartyOptions {
|
|
|
29
28
|
snapshotInterval?: number;
|
|
30
29
|
}
|
|
31
30
|
|
|
31
|
+
export interface OpenOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Keys of initial feeds needed to bootstrap the party.
|
|
34
|
+
*/
|
|
35
|
+
feedHints?: PublicKey[]
|
|
36
|
+
/**
|
|
37
|
+
* Timeframe to start processing feed messages from.
|
|
38
|
+
*/
|
|
39
|
+
initialTimeframe?: Timeframe
|
|
40
|
+
/**
|
|
41
|
+
* Timeframe which must be reached until further processing.
|
|
42
|
+
* PartyCore.open will block until this timeframe is reached.
|
|
43
|
+
*/
|
|
44
|
+
targetTimeframe?: Timeframe
|
|
45
|
+
}
|
|
46
|
+
|
|
32
47
|
/**
|
|
33
48
|
* Encapsulates core components needed by a party:
|
|
34
49
|
* - ECHO database with item-manager & item-demuxer.
|
|
@@ -56,7 +71,6 @@ export class PartyCore {
|
|
|
56
71
|
private readonly _modelFactory: ModelFactory,
|
|
57
72
|
private readonly _snapshotStore: SnapshotStore,
|
|
58
73
|
private readonly _memberKey: PublicKey,
|
|
59
|
-
private readonly _initialTimeframe?: Timeframe,
|
|
60
74
|
private readonly _options: PartyOptions = {}
|
|
61
75
|
) { }
|
|
62
76
|
|
|
@@ -99,17 +113,27 @@ export class PartyCore {
|
|
|
99
113
|
return feed;
|
|
100
114
|
}
|
|
101
115
|
|
|
116
|
+
get credentialsWriter (): FeedWriter<HaloMessage> {
|
|
117
|
+
assert(this._pipeline?.outboundHaloStream, 'Party not open');
|
|
118
|
+
return this._pipeline?.outboundHaloStream;
|
|
119
|
+
}
|
|
120
|
+
|
|
102
121
|
/**
|
|
103
122
|
* Opens the pipeline and connects the streams.
|
|
104
123
|
*/
|
|
105
124
|
@synchronized
|
|
106
125
|
@timed(1_000)
|
|
107
|
-
async open (
|
|
126
|
+
async open (options: OpenOptions = {}) {
|
|
127
|
+
const {
|
|
128
|
+
feedHints = [],
|
|
129
|
+
initialTimeframe
|
|
130
|
+
} = options;
|
|
131
|
+
|
|
108
132
|
if (this.isOpen) {
|
|
109
133
|
return this;
|
|
110
134
|
}
|
|
111
135
|
|
|
112
|
-
this._timeframeClock = new TimeframeClock(
|
|
136
|
+
this._timeframeClock = new TimeframeClock(initialTimeframe);
|
|
113
137
|
|
|
114
138
|
// Open all feeds known from metadata and open or create a writable feed to the party.
|
|
115
139
|
await this._feedProvider.openKnownFeeds();
|
|
@@ -124,12 +148,8 @@ export class PartyCore {
|
|
|
124
148
|
void this._feedProvider.createOrOpenReadOnlyFeed(feed);
|
|
125
149
|
}));
|
|
126
150
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
await this._partyProcessor.takeHints([{ type: KeyType.FEED, publicKey: writableFeed.key }]);
|
|
130
|
-
|
|
131
|
-
if (keyHints.length > 0) {
|
|
132
|
-
await this._partyProcessor.takeHints(keyHints);
|
|
151
|
+
if (feedHints.length > 0) {
|
|
152
|
+
await this._partyProcessor.takeHints(feedHints.map(publicKey => ({ publicKey, type: KeyType.FEED })));
|
|
133
153
|
}
|
|
134
154
|
|
|
135
155
|
//
|
|
@@ -138,7 +158,7 @@ export class PartyCore {
|
|
|
138
158
|
|
|
139
159
|
const iterator = await this._feedProvider.createIterator(
|
|
140
160
|
createMessageSelector(this._partyProcessor, this._timeframeClock),
|
|
141
|
-
|
|
161
|
+
initialTimeframe
|
|
142
162
|
);
|
|
143
163
|
|
|
144
164
|
this._pipeline = new Pipeline(
|
|
@@ -147,11 +167,6 @@ export class PartyCore {
|
|
|
147
167
|
// TODO(burdon): Support read-only parties.
|
|
148
168
|
const [readStream, writeStream] = await this._pipeline.open();
|
|
149
169
|
|
|
150
|
-
// Must happen after open.
|
|
151
|
-
if (this._pipeline.outboundHaloStream) {
|
|
152
|
-
this._partyProcessor.setOutboundStream(this._pipeline.outboundHaloStream);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
170
|
//
|
|
156
171
|
// Database
|
|
157
172
|
//
|
|
@@ -12,22 +12,40 @@ import {
|
|
|
12
12
|
PartyState,
|
|
13
13
|
Message as HaloMessage,
|
|
14
14
|
IdentityEventType,
|
|
15
|
-
PartyEventType
|
|
15
|
+
PartyEventType,
|
|
16
|
+
SignedMessage
|
|
16
17
|
} from '@dxos/credentials';
|
|
17
18
|
import { PublicKey } from '@dxos/crypto';
|
|
18
|
-
import { FeedKey,
|
|
19
|
+
import { FeedKey, IHaloStream, PartyKey, HaloStateSnapshot } from '@dxos/echo-protocol';
|
|
19
20
|
import { jsonReplacer } from '@dxos/util';
|
|
20
21
|
|
|
21
22
|
const log = debug('dxos:echo-db:party-processor');
|
|
22
23
|
|
|
24
|
+
export interface CredentialProcessor {
|
|
25
|
+
processMessage (message: IHaloStream): Promise<void>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface PartyStateProvider {
|
|
29
|
+
partyKey: PublicKey
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Whether PartyGenesis was already processed.
|
|
33
|
+
*/
|
|
34
|
+
genesisRequired: boolean
|
|
35
|
+
memberKeys: PublicKey[]
|
|
36
|
+
feedKeys: PublicKey[]
|
|
37
|
+
getFeedOwningMember (feedKey: FeedKey): PublicKey | undefined
|
|
38
|
+
isFeedAdmitted (feedKey: FeedKey): boolean
|
|
39
|
+
|
|
40
|
+
getOfflineInvitation (invitationID: Buffer): SignedMessage | undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
23
43
|
/**
|
|
24
44
|
* TODO(burdon): Wrapper/Bridge between HALO APIs.
|
|
25
45
|
*/
|
|
26
|
-
export class PartyProcessor {
|
|
46
|
+
export class PartyProcessor implements CredentialProcessor, PartyStateProvider {
|
|
27
47
|
private readonly _state: PartyState;
|
|
28
48
|
|
|
29
|
-
private _outboundHaloStream: FeedWriter<HaloMessage> | undefined;
|
|
30
|
-
|
|
31
49
|
readonly feedAdded = new Event<FeedKey>()
|
|
32
50
|
|
|
33
51
|
public readonly keyOrInfoAdded = new Event<PublicKey>();
|
|
@@ -124,16 +142,6 @@ export class PartyProcessor {
|
|
|
124
142
|
await this._state.processMessages([data]);
|
|
125
143
|
}
|
|
126
144
|
|
|
127
|
-
setOutboundStream (stream: FeedWriter<HaloMessage>) {
|
|
128
|
-
this._outboundHaloStream = stream;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async writeHaloMessage (message: HaloMessage): Promise<WriteReceipt> {
|
|
132
|
-
assert(this._outboundHaloStream, 'Party is closed or read-only');
|
|
133
|
-
// TODO(marik-d): Wait for the message to be processed?
|
|
134
|
-
return this._outboundHaloStream.write(message);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
145
|
makeSnapshot (): HaloStateSnapshot {
|
|
138
146
|
return {
|
|
139
147
|
messages: this._haloMessages
|
|
@@ -15,7 +15,7 @@ import { createSetPropertyMutation } from '@dxos/model-factory';
|
|
|
15
15
|
import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
16
16
|
import { jsonReplacer } from '@dxos/util';
|
|
17
17
|
|
|
18
|
-
import { TimeframeClock } from '../database';
|
|
18
|
+
import { TimeframeClock } from '../packlets/database';
|
|
19
19
|
import { PartyProcessor } from './party-processor';
|
|
20
20
|
import { Pipeline } from './pipeline';
|
|
21
21
|
|
|
@@ -25,7 +25,7 @@ const log = debug('dxos:echo:pipeline:test');
|
|
|
25
25
|
describe('pipeline', () => {
|
|
26
26
|
test('streams', async () => {
|
|
27
27
|
const storage = createStorage('', StorageType.RAM);
|
|
28
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
28
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
29
29
|
const feedKeys: Uint8Array[] = [];
|
|
30
30
|
const feedSelector: FeedSelector = descriptor => !!feedKeys.find(key => descriptor.key.equals(key));
|
|
31
31
|
const feedReadStream = new FeedStoreIterator(feedSelector, () => 0, new Timeframe());
|
|
@@ -87,7 +87,7 @@ describe('pipeline', () => {
|
|
|
87
87
|
|
|
88
88
|
test('writing', async () => {
|
|
89
89
|
const storage = createStorage('', StorageType.RAM);
|
|
90
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
90
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
91
91
|
const feedReadStream = new FeedStoreIterator(() => true, () => 0, new Timeframe());
|
|
92
92
|
|
|
93
93
|
const { publicKey, secretKey } = createKeyPair();
|
|
@@ -133,8 +133,7 @@ describe('pipeline', () => {
|
|
|
133
133
|
itemId: '123',
|
|
134
134
|
genesis: {
|
|
135
135
|
itemType: 'foo'
|
|
136
|
-
}
|
|
137
|
-
timeframe: expect.any(Timeframe)
|
|
136
|
+
}
|
|
138
137
|
});
|
|
139
138
|
});
|
|
140
139
|
});
|
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
|
+
};
|