@dxos/echo-db 2.33.5-dev.1fc05a51 → 2.33.5-dev.39ec2a53
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 +5 -6
- 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.map +1 -1
- package/dist/src/echo.js +3 -3
- package/dist/src/echo.js.map +1 -1
- package/dist/src/echo.test.js +12 -4
- 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 +4 -4
- package/dist/src/halo/halo-factory.d.ts.map +1 -1
- package/dist/src/halo/halo-factory.js +7 -6
- package/dist/src/halo/halo-factory.js.map +1 -1
- package/dist/src/halo/halo-party.d.ts +7 -6
- package/dist/src/halo/halo-party.d.ts.map +1 -1
- package/dist/src/halo/halo-party.js +13 -9
- package/dist/src/halo/halo-party.js.map +1 -1
- package/dist/src/halo/halo.d.ts +2 -2
- package/dist/src/halo/halo.d.ts.map +1 -1
- package/dist/src/halo/index.js +5 -1
- package/dist/src/halo/index.js.map +1 -1
- package/dist/src/halo/party-opener.d.ts.map +1 -1
- package/dist/src/halo/party-opener.js +3 -1
- 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 +1 -1
- 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 +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/invitations/greeting-initiator.d.ts +4 -5
- package/dist/src/invitations/greeting-initiator.d.ts.map +1 -1
- package/dist/src/invitations/greeting-initiator.js +4 -4
- package/dist/src/invitations/greeting-initiator.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 +3 -2
- package/dist/src/invitations/greeting-responder.js.map +1 -1
- package/dist/src/invitations/halo-recovery-initiator.d.ts +1 -1
- package/dist/src/invitations/halo-recovery-initiator.d.ts.map +1 -1
- package/dist/src/invitations/halo-recovery-initiator.js +2 -2
- package/dist/src/invitations/halo-recovery-initiator.js.map +1 -1
- package/dist/src/invitations/index.js +5 -1
- package/dist/src/invitations/index.js.map +1 -1
- package/dist/src/invitations/invitation-descriptor.js +6 -2
- 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.js +2 -2
- 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 +2 -2
- 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 +4 -5
- package/dist/src/packlets/database/database-backend.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/database-backend.js +5 -6
- 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 +10 -1
- package/dist/src/packlets/database/index.js.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.d.ts +4 -3
- package/dist/src/packlets/database/item-demuxer.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.js +2 -3
- 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 +15 -11
- 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 +11 -10
- 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 +5 -1
- 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 +0 -0
- 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 +0 -0
- 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 +0 -0
- 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 +5 -6
- package/dist/src/packlets/database/testing.js.map +1 -0
- package/dist/src/{database → packlets/database}/timeframe-clock.d.ts +1 -0
- package/dist/src/packlets/database/timeframe-clock.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/timeframe-clock.js +3 -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 -9
- package/dist/src/parties/data-party.d.ts.map +1 -1
- package/dist/src/parties/data-party.js +31 -10
- package/dist/src/parties/data-party.js.map +1 -1
- package/dist/src/parties/data-party.test.js +33 -14
- package/dist/src/parties/data-party.test.js.map +1 -1
- package/dist/src/parties/index.js +5 -1
- package/dist/src/parties/index.js.map +1 -1
- package/dist/src/parties/party-factory.d.ts +5 -4
- package/dist/src/parties/party-factory.d.ts.map +1 -1
- package/dist/src/parties/party-factory.js +25 -21
- 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 +8 -7
- package/dist/src/parties/party-manager.js.map +1 -1
- package/dist/src/parties/party-manager.test.js +9 -9
- package/dist/src/parties/party-manager.test.js.map +1 -1
- package/dist/src/pipeline/{pipeline.d.ts → feed-muxer.d.ts} +8 -11
- package/dist/src/pipeline/feed-muxer.d.ts.map +1 -0
- package/dist/src/pipeline/{pipeline.js → feed-muxer.js} +34 -41
- package/dist/src/pipeline/feed-muxer.js.map +1 -0
- package/dist/src/pipeline/feed-muxer.test.d.ts +2 -0
- package/dist/src/pipeline/feed-muxer.test.d.ts.map +1 -0
- package/dist/src/pipeline/{pipeline.test.js → feed-muxer.test.js} +18 -16
- package/dist/src/pipeline/feed-muxer.test.js.map +1 -0
- package/dist/src/pipeline/index.d.ts +2 -2
- package/dist/src/pipeline/index.d.ts.map +1 -1
- package/dist/src/pipeline/index.js +7 -3
- package/dist/src/pipeline/index.js.map +1 -1
- package/dist/src/pipeline/message-selector.d.ts +1 -1
- package/dist/src/pipeline/message-selector.d.ts.map +1 -1
- package/dist/src/pipeline/message-selector.js +6 -5
- package/dist/src/pipeline/message-selector.js.map +1 -1
- package/dist/src/pipeline/metadata-store.d.ts +2 -1
- package/dist/src/pipeline/metadata-store.d.ts.map +1 -1
- package/dist/src/pipeline/metadata-store.js +7 -1
- package/dist/src/pipeline/metadata-store.js.map +1 -1
- package/dist/src/pipeline/party-feed-provider.d.ts +2 -3
- package/dist/src/pipeline/party-feed-provider.d.ts.map +1 -1
- package/dist/src/pipeline/party-feed-provider.js +2 -17
- package/dist/src/pipeline/party-feed-provider.js.map +1 -1
- package/dist/src/pipeline/{party-core.d.ts → party-pipeline.d.ts} +26 -12
- package/dist/src/pipeline/party-pipeline.d.ts.map +1 -0
- package/dist/src/pipeline/{party-core.js → party-pipeline.js} +32 -36
- package/dist/src/pipeline/party-pipeline.js.map +1 -0
- package/dist/src/pipeline/party-pipeline.test.d.ts +2 -0
- package/dist/src/pipeline/party-pipeline.test.d.ts.map +1 -0
- package/dist/src/pipeline/{party-core.test.js → party-pipeline.test.js} +56 -39
- package/dist/src/pipeline/party-pipeline.test.js.map +1 -0
- package/dist/src/pipeline/party-processor.d.ts +3 -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/protocol/authenticator.d.ts +3 -3
- package/dist/src/protocol/authenticator.d.ts.map +1 -1
- package/dist/src/protocol/authenticator.js +2 -2
- 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/index.js +5 -1
- package/dist/src/protocol/index.js.map +1 -1
- package/dist/src/snapshots/index.js +5 -1
- package/dist/src/snapshots/index.js.map +1 -1
- package/dist/src/snapshots/snapshot-generator.d.ts +3 -3
- package/dist/src/snapshots/snapshot-generator.d.ts.map +1 -1
- package/dist/src/snapshots/snapshot-generator.js.map +1 -1
- package/dist/src/snapshots/snapshot-store.js +1 -1
- package/dist/src/snapshots/snapshot-store.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/index.js +5 -1
- package/dist/src/testing/index.js.map +1 -1
- package/dist/src/testing/testing-factories.d.ts +1 -1
- package/dist/src/testing/testing-factories.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -19
- package/src/api/index.ts +0 -5
- package/src/api/schema.test.ts +1 -2
- package/src/echo.test.ts +16 -5
- package/src/echo.ts +3 -2
- package/src/halo/contact-manager.ts +3 -2
- package/src/halo/halo-factory.ts +10 -10
- package/src/halo/halo-party.ts +22 -15
- package/src/halo/halo.ts +2 -2
- package/src/halo/party-opener.ts +3 -1
- package/src/halo/preferences.ts +3 -2
- package/src/index.ts +3 -2
- package/src/invitations/greeting-initiator.ts +10 -9
- package/src/invitations/greeting-responder.ts +7 -5
- package/src/invitations/halo-recovery-initiator.ts +4 -4
- package/src/invitations/invitation-descriptor.ts +1 -1
- package/src/invitations/invitation-factory.ts +8 -5
- package/src/invitations/offline-invitation-claimer.ts +3 -3
- package/src/{database → packlets/database}/data-mirror.test.ts +3 -3
- 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 +7 -6
- 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 +21 -19
- package/src/{database → packlets/database}/item-demuxer.ts +8 -5
- package/src/{database → packlets/database}/item-manager.test.ts +0 -0
- package/src/{database → packlets/database}/item-manager.ts +3 -1
- 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 +0 -0
- package/src/{api → packlets/database}/selection/result.ts +0 -0
- package/src/{api → packlets/database}/selection/selection.test.ts +0 -0
- package/src/{api → packlets/database}/selection/selection.ts +0 -0
- package/src/{api → packlets/database}/selection/util.ts +0 -0
- package/src/{database → packlets/database}/testing.ts +4 -7
- package/src/{database → packlets/database}/timeframe-clock.ts +4 -0
- package/src/{errors.ts → packlets/errors/index.ts} +0 -0
- package/src/parties/data-party.test.ts +48 -17
- package/src/parties/data-party.ts +40 -16
- package/src/parties/party-factory.ts +29 -27
- package/src/parties/party-manager.test.ts +16 -10
- package/src/parties/party-manager.ts +9 -6
- package/src/pipeline/{pipeline.test.ts → feed-muxer.test.ts} +21 -17
- package/src/pipeline/{pipeline.ts → feed-muxer.ts} +39 -51
- package/src/pipeline/index.ts +2 -2
- package/src/pipeline/message-selector.ts +7 -6
- package/src/pipeline/metadata-store.ts +8 -2
- package/src/pipeline/party-feed-provider.ts +3 -16
- package/src/pipeline/{party-core.test.ts → party-pipeline.test.ts} +55 -33
- package/src/pipeline/{party-core.ts → party-pipeline.ts} +59 -36
- package/src/pipeline/party-processor.ts +2 -18
- package/src/protocol/authenticator.test.ts +1 -4
- package/src/protocol/authenticator.ts +8 -4
- package/src/snapshots/snapshot-generator.ts +3 -3
- package/src/snapshots/snapshot-store.ts +1 -1
- package/src/snapshots/snapshot.test.ts +1 -1
- package/src/testing/testing-factories.ts +1 -1
- 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/pipeline/party-core.d.ts.map +0 -1
- package/dist/src/pipeline/party-core.js.map +0 -1
- package/dist/src/pipeline/party-core.test.d.ts +0 -2
- package/dist/src/pipeline/party-core.test.d.ts.map +0 -1
- package/dist/src/pipeline/party-core.test.js.map +0 -1
- package/dist/src/pipeline/pipeline.d.ts.map +0 -1
- package/dist/src/pipeline/pipeline.js.map +0 -1
- package/dist/src/pipeline/pipeline.test.d.ts +0 -2
- package/dist/src/pipeline/pipeline.test.d.ts.map +0 -1
- package/dist/src/pipeline/pipeline.test.js.map +0 -1
package/src/api/schema.test.ts
CHANGED
|
@@ -9,8 +9,7 @@ import { ModelFactory } from '@dxos/model-factory';
|
|
|
9
9
|
import { ObjectModel } from '@dxos/object-model';
|
|
10
10
|
import { afterTest } from '@dxos/testutils';
|
|
11
11
|
|
|
12
|
-
import { createInMemoryDatabase } from '../database';
|
|
13
|
-
import { Database } from './database';
|
|
12
|
+
import { createInMemoryDatabase, Database } from '../packlets/database';
|
|
14
13
|
import { Schema, TYPE_SCHEMA } from './schema';
|
|
15
14
|
|
|
16
15
|
const SCHEMA = 'example:type/schema/organization';
|
package/src/echo.test.ts
CHANGED
|
@@ -13,10 +13,10 @@ import { generateSeedPhrase, keyPairFromSeedPhrase } from '@dxos/crypto';
|
|
|
13
13
|
import { ObjectModel } from '@dxos/object-model';
|
|
14
14
|
import { afterTest } from '@dxos/testutils';
|
|
15
15
|
|
|
16
|
-
import { Item } from './api';
|
|
17
16
|
import { ECHO } from './echo';
|
|
18
17
|
import { Contact } from './halo';
|
|
19
18
|
import { defaultInvitationAuthenticator } from './invitations';
|
|
19
|
+
import { Item } from './packlets/database';
|
|
20
20
|
import { inviteTestPeer } from './testing';
|
|
21
21
|
|
|
22
22
|
const log = debug('dxos:echo:test');
|
|
@@ -707,10 +707,6 @@ describe('ECHO', () => {
|
|
|
707
707
|
expect(partyA.isOpen).toBe(true);
|
|
708
708
|
expect(partyA.isActive).toBe(true);
|
|
709
709
|
|
|
710
|
-
await partyA.database
|
|
711
|
-
.select({ type: 'example:item/test' })
|
|
712
|
-
.exec()
|
|
713
|
-
.update.waitFor(result => result.entities.length > 0);
|
|
714
710
|
expect(partyA.database.select({ type: 'example:item/test' }).exec().entities.length).toEqual(1);
|
|
715
711
|
}).timeout(10_000);
|
|
716
712
|
|
|
@@ -834,6 +830,21 @@ describe('ECHO', () => {
|
|
|
834
830
|
expect(members[1].displayName).toBe('B');
|
|
835
831
|
});
|
|
836
832
|
|
|
833
|
+
test('optimistic mutations on ObjectModel', async () => {
|
|
834
|
+
const echo = await setup({ createProfile: true, displayName: 'A' });
|
|
835
|
+
const party = await echo.createParty();
|
|
836
|
+
const item = await party.database.createItem({ model: ObjectModel });
|
|
837
|
+
|
|
838
|
+
const committed = item.model
|
|
839
|
+
.builder()
|
|
840
|
+
.set('key', 'value')
|
|
841
|
+
.commit();
|
|
842
|
+
expect(item.model.get('key')).toEqual('value');
|
|
843
|
+
|
|
844
|
+
await committed;
|
|
845
|
+
expect(item.model.get('key')).toEqual('value');
|
|
846
|
+
});
|
|
847
|
+
|
|
837
848
|
// TODO(burdon): Fix.
|
|
838
849
|
// Note: The reason I wrote this test is because it does not seem to be working properly in Teamwork.
|
|
839
850
|
// I don't seem to be receiving an update after which `party.title` holds correct value.
|
package/src/echo.ts
CHANGED
|
@@ -19,11 +19,11 @@ import { Storage, createStorage, StorageType } from '@dxos/random-access-multi-s
|
|
|
19
19
|
import { SubscriptionGroup } from '@dxos/util';
|
|
20
20
|
|
|
21
21
|
import { ResultSet } from './api';
|
|
22
|
-
import { DataServiceRouter } from './database';
|
|
23
|
-
import { IdentityNotInitializedError, InvalidStorageVersionError } from './errors';
|
|
24
22
|
import { HALO } from './halo';
|
|
25
23
|
import { autoPartyOpener } from './halo/party-opener';
|
|
26
24
|
import { InvitationDescriptor, OfflineInvitationClaimer } from './invitations';
|
|
25
|
+
import { DataServiceRouter } from './packlets/database';
|
|
26
|
+
import { IdentityNotInitializedError, InvalidStorageVersionError } from './packlets/errors';
|
|
27
27
|
import { OpenProgress, PartyFactory, DataParty, PartyManager } from './parties';
|
|
28
28
|
import { MetadataStore, STORAGE_VERSION, PartyFeedProvider } from './pipeline';
|
|
29
29
|
import { SnapshotStore } from './snapshots';
|
|
@@ -143,6 +143,7 @@ export class ECHO {
|
|
|
143
143
|
this._modelFactory,
|
|
144
144
|
this._snapshotStore,
|
|
145
145
|
feedProviderFactory,
|
|
146
|
+
this._metadataStore,
|
|
146
147
|
options
|
|
147
148
|
);
|
|
148
149
|
|
|
@@ -7,8 +7,9 @@ import { PublicKey } from '@dxos/crypto';
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
8
|
import { ObjectModel } from '@dxos/object-model';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { ResultSet } from '../api';
|
|
11
|
+
import { Database, Item } from '../packlets/database';
|
|
12
|
+
import { IdentityNotInitializedError } from '../packlets/errors';
|
|
12
13
|
import { PartyMember } from '../parties';
|
|
13
14
|
import { HALO_PARTY_CONTACT_LIST_TYPE } from './halo-party';
|
|
14
15
|
|
package/src/halo/halo-factory.ts
CHANGED
|
@@ -13,8 +13,7 @@ import {
|
|
|
13
13
|
Keyring,
|
|
14
14
|
KeyType,
|
|
15
15
|
Filter,
|
|
16
|
-
SecretProvider
|
|
17
|
-
KeyHint
|
|
16
|
+
SecretProvider
|
|
18
17
|
} from '@dxos/credentials';
|
|
19
18
|
import { keyToString, PublicKey, keyPairFromSeedPhrase } from '@dxos/crypto';
|
|
20
19
|
import { ModelFactory } from '@dxos/model-factory';
|
|
@@ -23,7 +22,7 @@ import { ObjectModel } from '@dxos/object-model';
|
|
|
23
22
|
|
|
24
23
|
import { createHaloPartyAdmissionMessage, GreetingInitiator, HaloRecoveryInitiator, InvitationDescriptor, InvitationDescriptorType, OfflineInvitationClaimer } from '../invitations';
|
|
25
24
|
import { PARTY_ITEM_TYPE } from '../parties';
|
|
26
|
-
import { PartyFeedProvider,
|
|
25
|
+
import { PartyFeedProvider, PipelineOptions } from '../pipeline';
|
|
27
26
|
import { CredentialsSigner } from '../protocol/credentials-signer';
|
|
28
27
|
import { SnapshotStore } from '../snapshots';
|
|
29
28
|
import {
|
|
@@ -51,19 +50,20 @@ export class HaloFactory {
|
|
|
51
50
|
private readonly _snapshotStore: SnapshotStore,
|
|
52
51
|
private readonly _feedProviderFactory: (partyKey: PublicKey) => PartyFeedProvider,
|
|
53
52
|
private readonly _keyring: Keyring,
|
|
54
|
-
private readonly _options:
|
|
53
|
+
private readonly _options: PipelineOptions = {}
|
|
55
54
|
) {}
|
|
56
55
|
|
|
57
|
-
async constructParty (
|
|
56
|
+
async constructParty (feedHints: PublicKey[]): Promise<HaloParty> {
|
|
58
57
|
const credentialsSigner = CredentialsSigner.createDirectDeviceSigner(this._keyring);
|
|
59
58
|
const feedProvider = this._feedProviderFactory(credentialsSigner.getIdentityKey().publicKey);
|
|
59
|
+
const writableFeed = await feedProvider.createOrOpenWritableFeed();
|
|
60
60
|
const halo = new HaloParty(
|
|
61
61
|
this._modelFactory,
|
|
62
62
|
this._snapshotStore,
|
|
63
63
|
feedProvider,
|
|
64
64
|
credentialsSigner,
|
|
65
65
|
this._networkManager,
|
|
66
|
-
|
|
66
|
+
[...feedHints, writableFeed.key],
|
|
67
67
|
undefined,
|
|
68
68
|
this._options
|
|
69
69
|
);
|
|
@@ -93,21 +93,21 @@ export class HaloFactory {
|
|
|
93
93
|
* B. Device key (the first "member" of the Identity's HALO).
|
|
94
94
|
* C. Feed key (the feed owned by the Device).
|
|
95
95
|
*/
|
|
96
|
-
await halo.
|
|
96
|
+
await halo.credentialsWriter.write(createPartyGenesisMessage(this._keyring, identityKey, feedKeyPair.publicKey, deviceKey));
|
|
97
97
|
|
|
98
98
|
/* 3. Make a special self-signed KeyAdmit message which will serve as an "IdentityGenesis" message. This
|
|
99
99
|
* message will be copied into other Parties which we create or join.
|
|
100
100
|
*/
|
|
101
|
-
await halo.
|
|
101
|
+
await halo.credentialsWriter.write(createKeyAdmitMessage(this._keyring, identityKey.publicKey, identityKey));
|
|
102
102
|
|
|
103
103
|
if (options.identityDisplayName) {
|
|
104
104
|
// 4. Write the IdentityInfo message with descriptive details (eg, display name).
|
|
105
|
-
await halo.
|
|
105
|
+
await halo.credentialsWriter.write(createIdentityInfoMessage(this._keyring, options.identityDisplayName, identityKey));
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
if (options.deviceDisplayName) {
|
|
109
109
|
// 5. Write the DeviceInfo message with descriptive details (eg, display name).
|
|
110
|
-
await halo.
|
|
110
|
+
await halo.credentialsWriter.write(createDeviceInfoMessage(this._keyring, options.deviceDisplayName, deviceKey));
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
// Create special properties item.
|
package/src/halo/halo-party.ts
CHANGED
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
|
|
7
7
|
import { Event, synchronized } from '@dxos/async';
|
|
8
|
-
import { KeyHint
|
|
8
|
+
import { KeyHint } from '@dxos/credentials';
|
|
9
9
|
import { PublicKey } from '@dxos/crypto';
|
|
10
10
|
import { timed } from '@dxos/debug';
|
|
11
|
-
import { Timeframe
|
|
11
|
+
import { Timeframe } from '@dxos/echo-protocol';
|
|
12
12
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
13
|
import { NetworkManager } from '@dxos/network-manager';
|
|
14
14
|
|
|
15
15
|
import { InvitationAuthenticator, InvitationDescriptor, InvitationFactory, InvitationOptions } from '../invitations';
|
|
16
16
|
import { PARTY_ITEM_TYPE } from '../parties';
|
|
17
|
-
import { PartyFeedProvider, PartyProtocolFactory,
|
|
17
|
+
import { PartyFeedProvider, PartyProtocolFactory, PartyPipeline, PipelineOptions } from '../pipeline';
|
|
18
18
|
import { createAuthenticator, createAuthPlugin, createCredentialsProvider, createHaloRecoveryPlugin } from '../protocol';
|
|
19
19
|
import { CredentialsSigner } from '../protocol/credentials-signer';
|
|
20
20
|
import { createReplicatorPlugin } from '../protocol/replicator-plugin';
|
|
@@ -41,7 +41,7 @@ export interface JoinedParty {
|
|
|
41
41
|
export class HaloParty {
|
|
42
42
|
public readonly update = new Event<void>();
|
|
43
43
|
|
|
44
|
-
private readonly _partyCore:
|
|
44
|
+
private readonly _partyCore: PartyPipeline;
|
|
45
45
|
private _invitationManager?: InvitationFactory;
|
|
46
46
|
private _protocol?: PartyProtocolFactory;
|
|
47
47
|
|
|
@@ -54,17 +54,16 @@ export class HaloParty {
|
|
|
54
54
|
private readonly _feedProvider: PartyFeedProvider,
|
|
55
55
|
private readonly _credentialsSigner: CredentialsSigner,
|
|
56
56
|
private readonly _networkManager: NetworkManager,
|
|
57
|
-
private readonly
|
|
58
|
-
_initialTimeframe: Timeframe | undefined,
|
|
59
|
-
_options:
|
|
57
|
+
private readonly _feedHints: PublicKey[] = [],
|
|
58
|
+
private readonly _initialTimeframe: Timeframe | undefined,
|
|
59
|
+
_options: PipelineOptions
|
|
60
60
|
) {
|
|
61
|
-
this._partyCore = new
|
|
61
|
+
this._partyCore = new PartyPipeline(
|
|
62
62
|
_credentialsSigner.getIdentityKey().publicKey,
|
|
63
63
|
_feedProvider,
|
|
64
64
|
modelFactory,
|
|
65
65
|
snapshotStore,
|
|
66
66
|
_credentialsSigner.getIdentityKey().publicKey,
|
|
67
|
-
_initialTimeframe,
|
|
68
67
|
_options
|
|
69
68
|
);
|
|
70
69
|
|
|
@@ -122,6 +121,10 @@ export class HaloParty {
|
|
|
122
121
|
return this._partyCore.processor.feedKeys;
|
|
123
122
|
}
|
|
124
123
|
|
|
124
|
+
get credentialsWriter () {
|
|
125
|
+
return this._partyCore.credentialsWriter;
|
|
126
|
+
}
|
|
127
|
+
|
|
125
128
|
async getWriteFeedKey () {
|
|
126
129
|
const feed = await this._feedProvider.createOrOpenWritableFeed();
|
|
127
130
|
return feed.key;
|
|
@@ -141,11 +144,15 @@ export class HaloParty {
|
|
|
141
144
|
return this;
|
|
142
145
|
}
|
|
143
146
|
|
|
144
|
-
await this._partyCore.open(
|
|
147
|
+
await this._partyCore.open({
|
|
148
|
+
feedHints: this._feedHints,
|
|
149
|
+
initialTimeframe: this._initialTimeframe
|
|
150
|
+
});
|
|
145
151
|
|
|
146
152
|
this._invitationManager = new InvitationFactory(
|
|
147
153
|
this._partyCore.processor,
|
|
148
154
|
this._credentialsSigner,
|
|
155
|
+
this._partyCore.credentialsWriter,
|
|
149
156
|
this._networkManager
|
|
150
157
|
);
|
|
151
158
|
|
|
@@ -165,7 +172,11 @@ export class HaloParty {
|
|
|
165
172
|
// Replication.
|
|
166
173
|
await this._protocol.start([
|
|
167
174
|
createReplicatorPlugin(this._feedProvider),
|
|
168
|
-
createAuthPlugin(createAuthenticator(
|
|
175
|
+
createAuthPlugin(createAuthenticator(
|
|
176
|
+
this._partyCore.processor,
|
|
177
|
+
this._credentialsSigner,
|
|
178
|
+
this._partyCore.credentialsWriter
|
|
179
|
+
), peerId),
|
|
169
180
|
createHaloRecoveryPlugin(this._credentialsSigner.getIdentityKey().publicKey, this._invitationManager, peerId)
|
|
170
181
|
]);
|
|
171
182
|
|
|
@@ -196,10 +207,6 @@ export class HaloParty {
|
|
|
196
207
|
return this;
|
|
197
208
|
}
|
|
198
209
|
|
|
199
|
-
writeCredentialsMessage (message: HaloMessage): Promise<WriteReceipt> {
|
|
200
|
-
return this._partyCore.writeCredentialsMessage(message);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
210
|
async createInvitation (authenticationDetails: InvitationAuthenticator, options?: InvitationOptions): Promise<InvitationDescriptor> {
|
|
204
211
|
assert(this._invitationManager, 'HALO party not open.');
|
|
205
212
|
return this._invitationManager.createInvitation(authenticationDetails, options);
|
package/src/halo/halo.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { NetworkManager } from '@dxos/network-manager';
|
|
|
15
15
|
import { ResultSet } from '../api';
|
|
16
16
|
import { InvitationAuthenticator, InvitationDescriptor, InvitationOptions } from '../invitations';
|
|
17
17
|
import { OpenProgress } from '../parties';
|
|
18
|
-
import { MetadataStore,
|
|
18
|
+
import { MetadataStore, PipelineOptions, PartyFeedProvider } from '../pipeline';
|
|
19
19
|
import { SnapshotStore } from '../snapshots';
|
|
20
20
|
import { Contact } from './contact-manager';
|
|
21
21
|
import { HaloFactory } from './halo-factory';
|
|
@@ -36,7 +36,7 @@ export interface HaloConfiguration {
|
|
|
36
36
|
modelFactory: ModelFactory,
|
|
37
37
|
snapshotStore: SnapshotStore,
|
|
38
38
|
feedProviderFactory: (partyKey: PublicKey) => PartyFeedProvider,
|
|
39
|
-
options:
|
|
39
|
+
options: PipelineOptions
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
package/src/halo/party-opener.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import debug from 'debug';
|
|
6
6
|
|
|
7
|
+
import { KeyType } from '@dxos/credentials';
|
|
7
8
|
import { SubscriptionGroup, Unsubscribe } from '@dxos/util';
|
|
8
9
|
|
|
9
10
|
import { PartyManager } from '../parties';
|
|
@@ -25,7 +26,8 @@ export const autoPartyOpener = (preferences: Preferences, partyManager: PartyMan
|
|
|
25
26
|
for (const partyDesc of values) {
|
|
26
27
|
if (!partyManager.parties.some(x => x.key === partyDesc.partyKey)) {
|
|
27
28
|
log(`Auto-opening new Party from HALO: ${partyDesc.partyKey.toHex()} hints=${JSON.stringify(partyDesc.keyHints)}`);
|
|
28
|
-
|
|
29
|
+
const feedHints = partyDesc.keyHints.filter(hint => hint.type === KeyType.FEED).map(hint => hint.publicKey!);
|
|
30
|
+
await partyManager.addParty(partyDesc.partyKey, feedHints);
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
}));
|
package/src/halo/preferences.ts
CHANGED
|
@@ -12,8 +12,9 @@ import { PublicKey } from '@dxos/crypto';
|
|
|
12
12
|
import { raise } from '@dxos/debug';
|
|
13
13
|
import { ObjectModel } from '@dxos/object-model';
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { ResultSet } from '../api';
|
|
16
|
+
import { Database, Item } from '../packlets/database';
|
|
17
|
+
import { IdentityNotInitializedError } from '../packlets/errors';
|
|
17
18
|
import { DataParty } from '../parties';
|
|
18
19
|
import {
|
|
19
20
|
HALO_PARTY_DESCRIPTOR_TYPE, HALO_PARTY_DEVICE_PREFERENCES_TYPE, HALO_PARTY_PREFERENCES_TYPE, JoinedParty
|
package/src/index.ts
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
export { codec } from '@dxos/echo-protocol';
|
|
6
6
|
|
|
7
|
+
export * from './packlets/database';
|
|
8
|
+
export * from './packlets/errors';
|
|
9
|
+
|
|
7
10
|
export * from './api';
|
|
8
|
-
export * from './database';
|
|
9
11
|
export * from './echo';
|
|
10
|
-
export * from './errors';
|
|
11
12
|
export * from './halo';
|
|
12
13
|
export * from './invitations';
|
|
13
14
|
export * from './protocol';
|
|
@@ -7,6 +7,7 @@ import debug from 'debug';
|
|
|
7
7
|
|
|
8
8
|
import { waitForEvent } from '@dxos/async';
|
|
9
9
|
import {
|
|
10
|
+
ERR_GREET_CONNECTED_TO_SWARM_TIMEOUT,
|
|
10
11
|
createEnvelopeMessage,
|
|
11
12
|
createGreetingBeginMessage,
|
|
12
13
|
createGreetingFinishMessage,
|
|
@@ -19,8 +20,8 @@ import {
|
|
|
19
20
|
Message,
|
|
20
21
|
SecretProvider,
|
|
21
22
|
WithTypeUrl,
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
SignedMessage,
|
|
24
|
+
NotarizeResponse
|
|
24
25
|
} from '@dxos/credentials';
|
|
25
26
|
import { keyToString, PublicKey } from '@dxos/crypto';
|
|
26
27
|
import { FullyConnectedTopology, NetworkManager } from '@dxos/network-manager';
|
|
@@ -46,10 +47,9 @@ export class GreetingInitiator {
|
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
49
|
* @param _networkManager
|
|
49
|
-
* @param _identity
|
|
50
50
|
* @param _invitationDescriptor
|
|
51
|
-
* @param
|
|
52
|
-
*
|
|
51
|
+
* @param _getMessagesToNotarize
|
|
52
|
+
* Returns a list of credential messages that the inviter will be asked to write into the control feed.
|
|
53
53
|
*/
|
|
54
54
|
constructor (
|
|
55
55
|
private readonly _networkManager: NetworkManager,
|
|
@@ -93,7 +93,8 @@ export class GreetingInitiator {
|
|
|
93
93
|
log(keyToString(localPeerId), 'connecting to', keyToString(swarmKey));
|
|
94
94
|
|
|
95
95
|
const peerJoinedWaiter = waitForEvent(this._greeterPlugin, 'peer:joined',
|
|
96
|
-
(remotePeerId: any) => remotePeerId && Buffer.from(responderPeerId).equals(remotePeerId),
|
|
96
|
+
(remotePeerId: any) => remotePeerId && Buffer.from(responderPeerId).equals(remotePeerId),
|
|
97
|
+
timeout, ERR_GREET_CONNECTED_TO_SWARM_TIMEOUT);
|
|
97
98
|
|
|
98
99
|
await this._networkManager.joinProtocolSwarm({
|
|
99
100
|
topic: PublicKey.from(swarmKey),
|
|
@@ -111,7 +112,7 @@ export class GreetingInitiator {
|
|
|
111
112
|
/**
|
|
112
113
|
* Called after connecting to initiate greeting protocol exchange.
|
|
113
114
|
*/
|
|
114
|
-
async redeemInvitation (secretProvider: SecretProvider) {
|
|
115
|
+
async redeemInvitation (secretProvider: SecretProvider): Promise<{ partyKey: PublicKey, hints: PublicKey[] }> {
|
|
115
116
|
assert(this._state === GreetingState.CONNECTED);
|
|
116
117
|
const { swarmKey } = this._invitationDescriptor;
|
|
117
118
|
|
|
@@ -150,7 +151,7 @@ export class GreetingInitiator {
|
|
|
150
151
|
const credentialMessages = await this._getMessagesToNotarize(PublicKey.from(partyKey), nonce);
|
|
151
152
|
|
|
152
153
|
// Send the signed payload to the greeting responder.
|
|
153
|
-
const notarizeResponse = await this._greeterPlugin.send(responderPeerId,
|
|
154
|
+
const notarizeResponse: NotarizeResponse = await this._greeterPlugin.send(responderPeerId,
|
|
154
155
|
createGreetingNotarizeMessage(secret, credentialMessages as WithTypeUrl<Message>[]));
|
|
155
156
|
|
|
156
157
|
//
|
|
@@ -171,7 +172,7 @@ export class GreetingInitiator {
|
|
|
171
172
|
this._state = GreetingState.SUCCEEDED;
|
|
172
173
|
return {
|
|
173
174
|
partyKey,
|
|
174
|
-
hints: notarizeResponse.
|
|
175
|
+
hints: notarizeResponse.feedHints ?? []
|
|
175
176
|
};
|
|
176
177
|
}
|
|
177
178
|
|
|
@@ -14,12 +14,13 @@ import {
|
|
|
14
14
|
KeyType,
|
|
15
15
|
SecretProvider,
|
|
16
16
|
SecretValidator
|
|
17
|
+
, Message as HaloMessage
|
|
17
18
|
} from '@dxos/credentials';
|
|
18
19
|
import { keyToString, randomBytes, PublicKey } from '@dxos/crypto';
|
|
19
|
-
import { SwarmKey } from '@dxos/echo-protocol';
|
|
20
|
+
import { FeedWriter, SwarmKey } from '@dxos/echo-protocol';
|
|
20
21
|
import { FullyConnectedTopology, NetworkManager } from '@dxos/network-manager';
|
|
21
22
|
|
|
22
|
-
import {
|
|
23
|
+
import { PartyStateProvider } from '../pipeline';
|
|
23
24
|
import { CredentialsSigner } from '../protocol/credentials-signer';
|
|
24
25
|
import { InvitationOptions } from './common';
|
|
25
26
|
import { greetingProtocolProvider } from './greeting-protocol-provider';
|
|
@@ -57,8 +58,9 @@ export class GreetingResponder {
|
|
|
57
58
|
|
|
58
59
|
constructor (
|
|
59
60
|
private readonly _networkManager: NetworkManager,
|
|
60
|
-
private readonly _partyProcessor:
|
|
61
|
-
private readonly _credentialsSigner: CredentialsSigner
|
|
61
|
+
private readonly _partyProcessor: PartyStateProvider,
|
|
62
|
+
private readonly _credentialsSigner: CredentialsSigner,
|
|
63
|
+
private readonly _credentialsWriter: FeedWriter<HaloMessage>
|
|
62
64
|
) {
|
|
63
65
|
this._greeter = new Greeter(
|
|
64
66
|
this._partyProcessor.partyKey,
|
|
@@ -222,7 +224,7 @@ export class GreetingResponder {
|
|
|
222
224
|
[this._credentialsSigner.getDeviceSigningKeys()]
|
|
223
225
|
);
|
|
224
226
|
|
|
225
|
-
await this.
|
|
227
|
+
await this._credentialsWriter.write(envelope);
|
|
226
228
|
|
|
227
229
|
// Wait for keys to be admitted.
|
|
228
230
|
await waitForCondition(() => admittedKeys.every(hasKey));
|
|
@@ -22,8 +22,8 @@ import {
|
|
|
22
22
|
import { keyToBuffer, keyToString, PublicKey, randomBytes, verify } from '@dxos/crypto';
|
|
23
23
|
import { FullyConnectedTopology, NetworkManager } from '@dxos/network-manager';
|
|
24
24
|
|
|
25
|
-
import { InvalidInvitationError } from '../errors';
|
|
26
|
-
import { CredentialsSigner } from '../protocol
|
|
25
|
+
import { InvalidInvitationError } from '../packlets/errors';
|
|
26
|
+
import { CredentialsSigner } from '../protocol';
|
|
27
27
|
import { greetingProtocolProvider } from './greeting-protocol-provider';
|
|
28
28
|
import { GreetingState } from './greeting-responder';
|
|
29
29
|
import { InvitationDescriptor, InvitationDescriptorType } from './invitation-descriptor';
|
|
@@ -72,8 +72,8 @@ export class HaloRecoveryInitiator {
|
|
|
72
72
|
this._greeterPlugin = new GreetingCommandPlugin(this._peerId, async () => false);
|
|
73
73
|
|
|
74
74
|
log('Connecting');
|
|
75
|
-
const peerJoinedWaiter = waitForEvent(
|
|
76
|
-
() => this._greeterPlugin?.peers.length, timeout);
|
|
75
|
+
const peerJoinedWaiter = waitForEvent(
|
|
76
|
+
this._greeterPlugin, 'peer:joined', () => !!this._greeterPlugin?.peers.length, timeout);
|
|
77
77
|
|
|
78
78
|
await this._networkManager.joinProtocolSwarm({
|
|
79
79
|
topic: PublicKey.from(swarmKey),
|
|
@@ -10,7 +10,7 @@ import { keyToBuffer, keyToString, ripemd160, PublicKey } from '@dxos/crypto';
|
|
|
10
10
|
import { SwarmKey } from '@dxos/echo-protocol';
|
|
11
11
|
import * as proto from '@dxos/echo-protocol';
|
|
12
12
|
|
|
13
|
-
import { InvalidInvitationError } from '../errors';
|
|
13
|
+
import { InvalidInvitationError } from '../packlets/errors';
|
|
14
14
|
|
|
15
15
|
// Re-exporting type enum from protobuf definitions.
|
|
16
16
|
export import InvitationDescriptorType = proto.InvitationDescriptor.Type;
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
|
|
7
|
-
import { createPartyInvitationMessage } from '@dxos/credentials';
|
|
7
|
+
import { createPartyInvitationMessage, Message as HaloMessage } from '@dxos/credentials';
|
|
8
8
|
import { PublicKey } from '@dxos/crypto';
|
|
9
|
+
import { FeedWriter } from '@dxos/echo-protocol';
|
|
9
10
|
import { NetworkManager } from '@dxos/network-manager';
|
|
10
11
|
|
|
11
|
-
import {
|
|
12
|
+
import { PartyStateProvider } from '../pipeline';
|
|
12
13
|
import { CredentialsSigner } from '../protocol/credentials-signer';
|
|
13
14
|
import { defaultInvitationAuthenticator, InvitationAuthenticator, InvitationOptions } from './common';
|
|
14
15
|
import { GreetingResponder } from './greeting-responder';
|
|
@@ -19,10 +20,11 @@ import { InvitationDescriptor, InvitationDescriptorType } from './invitation-des
|
|
|
19
20
|
*/
|
|
20
21
|
export class InvitationFactory {
|
|
21
22
|
constructor (
|
|
22
|
-
private readonly _partyProcessor:
|
|
23
|
+
private readonly _partyProcessor: PartyStateProvider,
|
|
23
24
|
// This needs to be a provider in case this is a backend for the HALO party.
|
|
24
25
|
// Then the identity would be changed after this is instantiated.
|
|
25
26
|
private readonly _credentialsSigner: CredentialsSigner,
|
|
27
|
+
private readonly _credentialsWriter: FeedWriter<HaloMessage>,
|
|
26
28
|
private readonly _networkManager: NetworkManager
|
|
27
29
|
) {}
|
|
28
30
|
|
|
@@ -42,7 +44,7 @@ export class InvitationFactory {
|
|
|
42
44
|
this._credentialsSigner.getDeviceSigningKeys()
|
|
43
45
|
);
|
|
44
46
|
|
|
45
|
-
await this.
|
|
47
|
+
await this._credentialsWriter.write(invitationMessage);
|
|
46
48
|
|
|
47
49
|
return new InvitationDescriptor(
|
|
48
50
|
InvitationDescriptorType.OFFLINE,
|
|
@@ -60,7 +62,8 @@ export class InvitationFactory {
|
|
|
60
62
|
const responder = new GreetingResponder(
|
|
61
63
|
this._networkManager,
|
|
62
64
|
this._partyProcessor,
|
|
63
|
-
this._credentialsSigner
|
|
65
|
+
this._credentialsSigner,
|
|
66
|
+
this._credentialsWriter
|
|
64
67
|
);
|
|
65
68
|
|
|
66
69
|
const { secretValidator, secretProvider } = authenticationDetails;
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
import { keyToBuffer, keyToString, PublicKey, randomBytes } from '@dxos/crypto';
|
|
24
24
|
import { FullyConnectedTopology, NetworkManager } from '@dxos/network-manager';
|
|
25
25
|
|
|
26
|
-
import { InvalidInvitationError } from '../errors';
|
|
26
|
+
import { InvalidInvitationError } from '../packlets/errors';
|
|
27
27
|
import { CredentialsSigner } from '../protocol';
|
|
28
28
|
import { greetingProtocolProvider } from './greeting-protocol-provider';
|
|
29
29
|
import { GreetingState } from './greeting-responder';
|
|
@@ -70,8 +70,8 @@ export class OfflineInvitationClaimer {
|
|
|
70
70
|
this._greeterPlugin = new GreetingCommandPlugin(localPeerId, async () => false);
|
|
71
71
|
|
|
72
72
|
log('Connecting');
|
|
73
|
-
const peerJoinedWaiter = waitForEvent(
|
|
74
|
-
() => this._greeterPlugin?.peers.length, timeout);
|
|
73
|
+
const peerJoinedWaiter = waitForEvent(
|
|
74
|
+
this._greeterPlugin, 'peer:joined', () => !!this._greeterPlugin?.peers.length, timeout);
|
|
75
75
|
|
|
76
76
|
await this._networkManager.joinProtocolSwarm({
|
|
77
77
|
topic: PublicKey.from(swarmKey),
|
|
@@ -11,10 +11,10 @@ import { EchoEnvelope, MockFeedWriter, Timeframe } from '@dxos/echo-protocol';
|
|
|
11
11
|
import { ModelFactory } from '@dxos/model-factory';
|
|
12
12
|
import { ObjectModel } from '@dxos/object-model';
|
|
13
13
|
|
|
14
|
-
import { Item } from '../api';
|
|
15
14
|
import { DataMirror } from './data-mirror';
|
|
16
15
|
import { DataServiceHost } from './data-service-host';
|
|
17
16
|
import { DataServiceRouter } from './data-service-router';
|
|
17
|
+
import { Item } from './item';
|
|
18
18
|
import { ItemDemuxer } from './item-demuxer';
|
|
19
19
|
import { ItemManager } from './item-manager';
|
|
20
20
|
|
|
@@ -26,8 +26,8 @@ describe('DataMirror', () => {
|
|
|
26
26
|
const itemManager = new ItemManager(modelFactory, PublicKey.random(), feed);
|
|
27
27
|
const itemDemuxer = new ItemDemuxer(itemManager, modelFactory, { snapshots: true });
|
|
28
28
|
|
|
29
|
-
const
|
|
30
|
-
feed.written.on(([msg, meta]) =>
|
|
29
|
+
const process = itemDemuxer.open();
|
|
30
|
+
feed.written.on(([msg, meta]) => process({
|
|
31
31
|
data: msg,
|
|
32
32
|
meta: { ...meta, memberKey: PublicKey.random(), timeframe: new Timeframe() }
|
|
33
33
|
} as any));
|
|
@@ -10,7 +10,7 @@ import { failUndefined } from '@dxos/debug';
|
|
|
10
10
|
import { DataService } from '@dxos/echo-protocol';
|
|
11
11
|
import { Model } from '@dxos/model-factory';
|
|
12
12
|
|
|
13
|
-
import { Entity } from '
|
|
13
|
+
import { Entity } from './entity';
|
|
14
14
|
import { ItemManager } from './item-manager';
|
|
15
15
|
|
|
16
16
|
const log = debug('dxos:echo-db:data-mirror');
|
|
@@ -18,10 +18,11 @@ import {
|
|
|
18
18
|
SubscribeEntityStreamResponse
|
|
19
19
|
} from '@dxos/echo-protocol';
|
|
20
20
|
|
|
21
|
-
import { Item, Link } from '../api';
|
|
22
21
|
import { EntityNotFoundError } from '../errors';
|
|
22
|
+
import { Item } from './item';
|
|
23
23
|
import { ItemDemuxer } from './item-demuxer';
|
|
24
24
|
import { ItemManager } from './item-manager';
|
|
25
|
+
import { Link } from './link';
|
|
25
26
|
|
|
26
27
|
const log = debug('dxos:echo-db:data-service-host');
|
|
27
28
|
|
|
File without changes
|
|
@@ -10,7 +10,7 @@ import { ModelFactory } from '@dxos/model-factory';
|
|
|
10
10
|
|
|
11
11
|
import { DataMirror } from './data-mirror';
|
|
12
12
|
import { DataServiceHost } from './data-service-host';
|
|
13
|
-
import { ItemDemuxer, ItemDemuxerOptions } from './item-demuxer';
|
|
13
|
+
import { EchoProcessor, ItemDemuxer, ItemDemuxerOptions } from './item-demuxer';
|
|
14
14
|
import { ItemManager } from './item-manager';
|
|
15
15
|
|
|
16
16
|
const log = debug('dxos:echo-db:database-backend');
|
|
@@ -42,12 +42,11 @@ export interface DatabaseBackend {
|
|
|
42
42
|
* Write operations result in mutations being written to the outgoing stream.
|
|
43
43
|
*/
|
|
44
44
|
export class FeedDatabaseBackend implements DatabaseBackend {
|
|
45
|
-
private
|
|
45
|
+
private _echoProcessor!: EchoProcessor;
|
|
46
46
|
private _itemManager!: ItemManager;
|
|
47
47
|
private _itemDemuxer!: ItemDemuxer;
|
|
48
48
|
|
|
49
49
|
constructor (
|
|
50
|
-
private readonly _inboundStream: NodeJS.ReadableStream,
|
|
51
50
|
private readonly _outboundStream: FeedWriter<EchoEnvelope> | undefined,
|
|
52
51
|
private readonly _snapshot?: DatabaseSnapshot,
|
|
53
52
|
private readonly _options: ItemDemuxerOptions = {}
|
|
@@ -56,16 +55,18 @@ export class FeedDatabaseBackend implements DatabaseBackend {
|
|
|
56
55
|
async open (itemManager: ItemManager, modelFactory: ModelFactory) {
|
|
57
56
|
this._itemManager = itemManager;
|
|
58
57
|
this._itemDemuxer = new ItemDemuxer(itemManager, modelFactory, this._options);
|
|
59
|
-
this.
|
|
60
|
-
this._inboundStream.pipe(this._itemDemuxerInboundStream);
|
|
58
|
+
this._echoProcessor = this._itemDemuxer.open();
|
|
61
59
|
|
|
62
60
|
if (this._snapshot) {
|
|
63
61
|
await this._itemDemuxer.restoreFromSnapshot(this._snapshot);
|
|
64
62
|
}
|
|
65
63
|
}
|
|
66
64
|
|
|
65
|
+
get echoProcessor () {
|
|
66
|
+
return this._echoProcessor;
|
|
67
|
+
}
|
|
68
|
+
|
|
67
69
|
async close () {
|
|
68
|
-
this._inboundStream?.unpipe(this._itemDemuxerInboundStream);
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
get isReadOnly (): boolean {
|
|
@@ -10,9 +10,10 @@ import { ModelFactory, TestListModel } from '@dxos/model-factory';
|
|
|
10
10
|
import { ObjectModel } from '@dxos/object-model';
|
|
11
11
|
import { afterTest } from '@dxos/testutils';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { DataServiceHost } from './data-service-host';
|
|
14
14
|
import { Item } from './item';
|
|
15
15
|
import { ItemFilterDeleted } from './selection';
|
|
16
|
+
import { createInMemoryDatabase, createRemoteDatabaseFromDataServiceHost } from './testing';
|
|
16
17
|
|
|
17
18
|
const OBJECT_ORG = 'example:object/org';
|
|
18
19
|
const OBJECT_PERSON = 'example:object/person';
|