@dxos/echo-db 2.33.5-dev.97a81dd0 → 2.33.5-dev.9e11cb97
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.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.js +4 -4
- package/dist/src/halo/halo-factory.js.map +1 -1
- package/dist/src/halo/halo-party.d.ts +3 -3
- package/dist/src/halo/halo-party.d.ts.map +1 -1
- package/dist/src/halo/halo-party.js +5 -5
- 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/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 +2 -2
- package/dist/src/index.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.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.js +1 -1
- 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 +2 -1
- package/dist/src/packlets/database/item-demuxer.d.ts.map +1 -0
- package/dist/src/{database → packlets/database}/item-demuxer.js +0 -0
- 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 +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 +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 +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 +3 -3
- 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 +6 -5
- package/dist/src/parties/data-party.d.ts.map +1 -1
- package/dist/src/parties/data-party.js +5 -5
- package/dist/src/parties/data-party.js.map +1 -1
- package/dist/src/parties/data-party.test.js +13 -12
- package/dist/src/parties/data-party.test.js.map +1 -1
- package/dist/src/parties/party-factory.d.ts.map +1 -1
- package/dist/src/parties/party-factory.js +10 -10
- package/dist/src/parties/party-factory.js.map +1 -1
- package/dist/src/parties/party-manager.test.js +7 -6
- package/dist/src/parties/party-manager.test.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/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 +3 -3
- package/dist/src/pipeline/party-core.d.ts.map +1 -1
- package/dist/src/pipeline/party-core.js +7 -12
- package/dist/src/pipeline/party-core.js.map +1 -1
- package/dist/src/pipeline/party-core.test.js +15 -15
- package/dist/src/pipeline/party-core.test.js.map +1 -1
- 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/pipeline/pipeline.d.ts +1 -1
- package/dist/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/src/pipeline/pipeline.test.js +3 -3
- package/dist/src/pipeline/pipeline.test.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/snapshots/snapshot-generator.d.ts +1 -1
- package/dist/src/snapshots/snapshot-generator.d.ts.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/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 +18 -18
- package/src/api/index.ts +0 -5
- package/src/api/schema.test.ts +1 -2
- package/src/echo.test.ts +1 -1
- package/src/echo.ts +10 -20
- package/src/halo/contact-manager.ts +3 -2
- package/src/halo/halo-factory.ts +4 -4
- package/src/halo/halo-party.ts +12 -7
- package/src/halo/halo.test.ts +4 -3
- package/src/halo/preferences.ts +3 -2
- package/src/index.ts +3 -2
- package/src/invitations/greeting-responder.ts +7 -5
- 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 +1 -1
- 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 +3 -1
- 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 +1 -1
- 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 +14 -12
- package/src/parties/data-party.ts +10 -8
- package/src/parties/party-factory.ts +10 -10
- package/src/parties/party-manager.test.ts +10 -7
- package/src/pipeline/message-selector.ts +1 -1
- package/src/pipeline/metadata-store.test.ts +8 -4
- package/src/pipeline/metadata-store.ts +5 -5
- package/src/pipeline/party-core.test.ts +15 -15
- package/src/pipeline/party-core.ts +7 -13
- package/src/pipeline/party-processor.ts +2 -18
- package/src/pipeline/pipeline.test.ts +3 -3
- package/src/pipeline/pipeline.ts +1 -1
- package/src/protocol/authenticator.test.ts +1 -4
- package/src/protocol/authenticator.ts +8 -4
- package/src/snapshots/snapshot-generator.ts +1 -1
- 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/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
|
@@ -5,18 +5,19 @@
|
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
|
|
7
7
|
import { synchronized, Event } 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 { PartyKey, PartySnapshot, Timeframe
|
|
11
|
+
import { PartyKey, PartySnapshot, Timeframe } from '@dxos/echo-protocol';
|
|
12
12
|
import { FeedDescriptor } from '@dxos/feed-store';
|
|
13
13
|
import { ModelFactory } from '@dxos/model-factory';
|
|
14
14
|
import { NetworkManager } from '@dxos/network-manager';
|
|
15
15
|
import { ObjectModel } from '@dxos/object-model';
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { ResultSet } from '../api';
|
|
18
18
|
import { ActivationOptions, PartyPreferences, Preferences } from '../halo';
|
|
19
19
|
import { InvitationFactory } from '../invitations';
|
|
20
|
+
import { Database, Item } from '../packlets/database';
|
|
20
21
|
import { PartyFeedProvider, PartyProtocolFactory, PartyCore, PartyOptions } from '../pipeline';
|
|
21
22
|
import { createAuthPlugin, createOfflineInvitationPlugin, createAuthenticator, createCredentialsProvider } from '../protocol';
|
|
22
23
|
import { CredentialsSigner } from '../protocol/credentials-signer';
|
|
@@ -127,6 +128,10 @@ export class DataParty {
|
|
|
127
128
|
return this._invitationManager;
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
get credentialsWriter () {
|
|
132
|
+
return this._partyCore.credentialsWriter;
|
|
133
|
+
}
|
|
134
|
+
|
|
130
135
|
get title () {
|
|
131
136
|
return this._preferences?.getLastKnownTitle();
|
|
132
137
|
}
|
|
@@ -152,6 +157,7 @@ export class DataParty {
|
|
|
152
157
|
this._invitationManager = new InvitationFactory(
|
|
153
158
|
this._partyCore.processor,
|
|
154
159
|
this._credentialsSigner,
|
|
160
|
+
this._partyCore.credentialsWriter,
|
|
155
161
|
this._networkManager
|
|
156
162
|
);
|
|
157
163
|
|
|
@@ -171,7 +177,7 @@ export class DataParty {
|
|
|
171
177
|
|
|
172
178
|
await this._protocol.start([
|
|
173
179
|
createReplicatorPlugin(this._feedProvider),
|
|
174
|
-
createAuthPlugin(createAuthenticator(this._partyCore.processor, this._credentialsSigner), deviceKey.publicKey),
|
|
180
|
+
createAuthPlugin(createAuthenticator(this._partyCore.processor, this._credentialsSigner, this.credentialsWriter), deviceKey.publicKey),
|
|
175
181
|
createOfflineInvitationPlugin(this._invitationManager, deviceKey.publicKey)
|
|
176
182
|
]);
|
|
177
183
|
|
|
@@ -210,10 +216,6 @@ export class DataParty {
|
|
|
210
216
|
return this._feedProvider.getFeeds();
|
|
211
217
|
}
|
|
212
218
|
|
|
213
|
-
writeCredentialsMessage (message: HaloMessage): Promise<WriteReceipt> {
|
|
214
|
-
return this._partyCore.writeCredentialsMessage(message);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
219
|
get isActive (): boolean {
|
|
218
220
|
assert(this._preferences, 'PartyActivator required');
|
|
219
221
|
return this._preferences.isActive;
|
|
@@ -21,11 +21,11 @@ import { ModelFactory } from '@dxos/model-factory';
|
|
|
21
21
|
import { NetworkManager } from '@dxos/network-manager';
|
|
22
22
|
import { ObjectModel } from '@dxos/object-model';
|
|
23
23
|
|
|
24
|
-
import { IdentityNotInitializedError } from '../errors';
|
|
25
24
|
import {
|
|
26
25
|
createDataPartyAdmissionMessages,
|
|
27
26
|
GreetingInitiator, InvitationDescriptor, InvitationDescriptorType, OfflineInvitationClaimer
|
|
28
27
|
} from '../invitations';
|
|
28
|
+
import { IdentityNotInitializedError } from '../packlets/errors';
|
|
29
29
|
import { PartyFeedProvider, PartyOptions } from '../pipeline';
|
|
30
30
|
import { IdentityCredentialsProvider } from '../protocol/identity-credentials';
|
|
31
31
|
import { SnapshotStore } from '../snapshots';
|
|
@@ -63,7 +63,7 @@ export class PartyFactory {
|
|
|
63
63
|
const writableFeed = await party.getWriteFeed();
|
|
64
64
|
|
|
65
65
|
// PartyGenesis (self-signed by Party).
|
|
66
|
-
await party.
|
|
66
|
+
await party.credentialsWriter.write(createPartyGenesisMessage(
|
|
67
67
|
identity.keyring,
|
|
68
68
|
partyKey,
|
|
69
69
|
writableFeed.key,
|
|
@@ -71,7 +71,7 @@ export class PartyFactory {
|
|
|
71
71
|
);
|
|
72
72
|
|
|
73
73
|
// KeyAdmit (IdentityGenesis in an Envelope signed by Party).
|
|
74
|
-
await party.
|
|
74
|
+
await party.credentialsWriter.write(createEnvelopeMessage(
|
|
75
75
|
identity.keyring,
|
|
76
76
|
partyKey.publicKey,
|
|
77
77
|
wrapMessage(identity.identityGenesis),
|
|
@@ -80,7 +80,7 @@ export class PartyFactory {
|
|
|
80
80
|
|
|
81
81
|
// FeedAdmit (signed by the Device KeyChain).
|
|
82
82
|
// TODO(dmaretskyi): Is this really needed since a feed is already admitted by party genesis message.
|
|
83
|
-
await party.
|
|
83
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
84
84
|
identity.keyring,
|
|
85
85
|
partyKey.publicKey,
|
|
86
86
|
writableFeed.key,
|
|
@@ -89,7 +89,7 @@ export class PartyFactory {
|
|
|
89
89
|
|
|
90
90
|
// IdentityInfo in an Envelope signed by the Device KeyChain.
|
|
91
91
|
if (identity.identityInfo) {
|
|
92
|
-
await party.
|
|
92
|
+
await party.credentialsWriter.write(createEnvelopeMessage(
|
|
93
93
|
identity.keyring,
|
|
94
94
|
partyKey.publicKey,
|
|
95
95
|
wrapMessage(identity.identityInfo),
|
|
@@ -179,7 +179,7 @@ export class PartyFactory {
|
|
|
179
179
|
|
|
180
180
|
// Copy our signed IdentityInfo into the new Party.
|
|
181
181
|
if (identity.identityInfo) {
|
|
182
|
-
await party.
|
|
182
|
+
await party.credentialsWriter.write(createEnvelopeMessage(
|
|
183
183
|
identity.keyring,
|
|
184
184
|
partyKey,
|
|
185
185
|
wrapMessage(identity.identityInfo),
|
|
@@ -204,7 +204,7 @@ export class PartyFactory {
|
|
|
204
204
|
const writableFeed = await party.getWriteFeed();
|
|
205
205
|
|
|
206
206
|
// PartyGenesis (self-signed by Party).
|
|
207
|
-
await party.
|
|
207
|
+
await party.credentialsWriter.write(createPartyGenesisMessage(
|
|
208
208
|
identity.keyring,
|
|
209
209
|
partyKey,
|
|
210
210
|
writableFeed.key,
|
|
@@ -212,7 +212,7 @@ export class PartyFactory {
|
|
|
212
212
|
);
|
|
213
213
|
|
|
214
214
|
// KeyAdmit (IdentityGenesis in an Envelope signed by Party).
|
|
215
|
-
await party.
|
|
215
|
+
await party.credentialsWriter.write(createEnvelopeMessage(
|
|
216
216
|
identity.keyring,
|
|
217
217
|
partyKey.publicKey,
|
|
218
218
|
wrapMessage(identity.identityGenesis),
|
|
@@ -220,7 +220,7 @@ export class PartyFactory {
|
|
|
220
220
|
));
|
|
221
221
|
|
|
222
222
|
// FeedAdmit (signed by the Device KeyChain).
|
|
223
|
-
await party.
|
|
223
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
224
224
|
identity.keyring,
|
|
225
225
|
partyKey.publicKey,
|
|
226
226
|
writableFeed.key,
|
|
@@ -229,7 +229,7 @@ export class PartyFactory {
|
|
|
229
229
|
|
|
230
230
|
// IdentityInfo in an Envelope signed by the Device KeyChain.
|
|
231
231
|
if (identity.identityInfo) {
|
|
232
|
-
await party.
|
|
232
|
+
await party.credentialsWriter.write(createEnvelopeMessage(
|
|
233
233
|
identity.keyring,
|
|
234
234
|
partyKey.publicKey,
|
|
235
235
|
wrapMessage(identity.identityInfo),
|
|
@@ -32,8 +32,8 @@ import { ObjectModel } from '@dxos/object-model';
|
|
|
32
32
|
import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
33
33
|
import { afterTest, testTimeout } from '@dxos/testutils';
|
|
34
34
|
|
|
35
|
-
import { Item } from '../api';
|
|
36
35
|
import { defaultInvitationAuthenticator, OfflineInvitationClaimer } from '../invitations';
|
|
36
|
+
import { Item } from '../packlets/database';
|
|
37
37
|
import { MetadataStore, PartyFeedProvider } from '../pipeline';
|
|
38
38
|
import { createTestIdentityCredentials } from '../protocol/identity-credentials';
|
|
39
39
|
import { SnapshotStore } from '../snapshots';
|
|
@@ -55,9 +55,11 @@ const log = debug('dxos:echo:parties:party-manager:test');
|
|
|
55
55
|
*/
|
|
56
56
|
const setup = async () => {
|
|
57
57
|
const keyring = new Keyring();
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
const snapshotStore = new SnapshotStore(
|
|
58
|
+
|
|
59
|
+
const storage = createStorage('', StorageType.RAM);
|
|
60
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
61
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
62
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
61
63
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
62
64
|
const networkManager = new NetworkManager();
|
|
63
65
|
const feedProviderFactory = (partyKey: PublicKey) => new PartyFeedProvider(metadataStore, keyring, feedStore, partyKey);
|
|
@@ -147,12 +149,13 @@ describe('Party manager', () => {
|
|
|
147
149
|
});
|
|
148
150
|
|
|
149
151
|
test('Create from cold start', async () => {
|
|
152
|
+
|
|
150
153
|
const storage = createStorage('', StorageType.RAM);
|
|
151
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
154
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
152
155
|
const keyring = new Keyring();
|
|
153
|
-
const
|
|
156
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
157
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
154
158
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
155
|
-
const snapshotStore = new SnapshotStore(createStorage('snapshots', StorageType.RAM));
|
|
156
159
|
const networkManager = new NetworkManager();
|
|
157
160
|
const feedProviderFactory = (partyKey: PublicKey) => new PartyFeedProvider(metadataStore, keyring, feedStore, partyKey);
|
|
158
161
|
|
|
@@ -9,7 +9,7 @@ import { getPartyCredentialMessageType, PartyCredential } from '@dxos/credential
|
|
|
9
9
|
import { PublicKey } from '@dxos/crypto';
|
|
10
10
|
import { MessageSelector } from '@dxos/echo-protocol';
|
|
11
11
|
|
|
12
|
-
import { TimeframeClock } from '../database';
|
|
12
|
+
import { TimeframeClock } from '../packlets/database';
|
|
13
13
|
import { PartyStateProvider } from './party-processor';
|
|
14
14
|
|
|
15
15
|
const log = debug('dxos:echo-db:message-selector');
|
|
@@ -11,7 +11,8 @@ import { MetadataStore } from './metadata-store';
|
|
|
11
11
|
|
|
12
12
|
describe('MetadataStore in-memory', () => {
|
|
13
13
|
it('Creates party and adds feeds to it', async () => {
|
|
14
|
-
const
|
|
14
|
+
const storage = createStorage('', StorageType.RAM);
|
|
15
|
+
const store = new MetadataStore(storage.directory('metadata'));
|
|
15
16
|
await store.load();
|
|
16
17
|
expect(store.parties?.length).toBe(0);
|
|
17
18
|
|
|
@@ -33,7 +34,8 @@ describe('MetadataStore in-memory', () => {
|
|
|
33
34
|
});
|
|
34
35
|
|
|
35
36
|
it('Creates party when adding feed', async () => {
|
|
36
|
-
const
|
|
37
|
+
const storage = createStorage('', StorageType.RAM);
|
|
38
|
+
const store = new MetadataStore(storage.directory('metadata'));
|
|
37
39
|
await store.load();
|
|
38
40
|
|
|
39
41
|
const partyKey = PublicKey.random();
|
|
@@ -45,7 +47,8 @@ describe('MetadataStore in-memory', () => {
|
|
|
45
47
|
});
|
|
46
48
|
|
|
47
49
|
it('Doesn\'t add same feed twice', async () => {
|
|
48
|
-
const
|
|
50
|
+
const storage = createStorage('', StorageType.RAM);
|
|
51
|
+
const store = new MetadataStore(storage.directory('metadata'));
|
|
49
52
|
await store.load();
|
|
50
53
|
|
|
51
54
|
const partyKey = PublicKey.random();
|
|
@@ -60,7 +63,8 @@ describe('MetadataStore in-memory', () => {
|
|
|
60
63
|
|
|
61
64
|
// TODO(yivlad): Doesn't work for now.
|
|
62
65
|
it.skip('Resets storage', async () => {
|
|
63
|
-
const
|
|
66
|
+
const storage = createStorage('snapshots', StorageType.RAM);
|
|
67
|
+
const store = new MetadataStore(storage.directory(''));
|
|
64
68
|
|
|
65
69
|
const partyKey = PublicKey.random();
|
|
66
70
|
const feedKey = PublicKey.random();
|
|
@@ -8,7 +8,7 @@ import debug from 'debug';
|
|
|
8
8
|
import { PublicKey } from '@dxos/crypto';
|
|
9
9
|
import { failUndefined } from '@dxos/debug';
|
|
10
10
|
import { EchoMetadata, PartyMetadata, schema } from '@dxos/echo-protocol';
|
|
11
|
-
import {
|
|
11
|
+
import { Directory } from '@dxos/random-access-multi-storage';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Version for the schema of the stored data as defined in dxos.echo.metadata.EchoMetadata.
|
|
@@ -28,7 +28,7 @@ export class MetadataStore {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
constructor (
|
|
31
|
-
private readonly
|
|
31
|
+
private readonly _directory: Directory
|
|
32
32
|
) {}
|
|
33
33
|
|
|
34
34
|
get version (): number {
|
|
@@ -47,7 +47,7 @@ export class MetadataStore {
|
|
|
47
47
|
* Loads metadata from persistent storage.
|
|
48
48
|
*/
|
|
49
49
|
async load (): Promise<void> {
|
|
50
|
-
const file = this.
|
|
50
|
+
const file = this._directory.createOrOpen('EchoMetadata');
|
|
51
51
|
try {
|
|
52
52
|
const { size } = await file.stat();
|
|
53
53
|
if (size === 0) {
|
|
@@ -75,7 +75,7 @@ export class MetadataStore {
|
|
|
75
75
|
updated: new Date()
|
|
76
76
|
};
|
|
77
77
|
|
|
78
|
-
const file = this.
|
|
78
|
+
const file = this._directory.createOrOpen('EchoMetadata');
|
|
79
79
|
|
|
80
80
|
try {
|
|
81
81
|
const encoded = Buffer.from(schema.getCodecForType('dxos.echo.metadata.EchoMetadata').encode(data));
|
|
@@ -90,7 +90,7 @@ export class MetadataStore {
|
|
|
90
90
|
*/
|
|
91
91
|
async clear (): Promise<void> {
|
|
92
92
|
log('Clearing all echo metadata...');
|
|
93
|
-
await this.
|
|
93
|
+
await this._directory.destroy();
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
/**
|
|
@@ -24,15 +24,15 @@ import { PartyCore } from './party-core';
|
|
|
24
24
|
describe('PartyCore', () => {
|
|
25
25
|
const setup = async () => {
|
|
26
26
|
const storage = createStorage('', StorageType.RAM);
|
|
27
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
27
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
28
28
|
afterTest(async () => feedStore.close());
|
|
29
29
|
|
|
30
30
|
const keyring = new Keyring();
|
|
31
31
|
|
|
32
|
-
const metadataStore = new MetadataStore(
|
|
32
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
33
33
|
|
|
34
34
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
35
|
-
const snapshotStore = new SnapshotStore(
|
|
35
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
36
36
|
|
|
37
37
|
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
38
38
|
|
|
@@ -51,7 +51,7 @@ describe('PartyCore', () => {
|
|
|
51
51
|
afterTest(async () => party.close());
|
|
52
52
|
|
|
53
53
|
// PartyGenesis (self-signed by Party).
|
|
54
|
-
await party.
|
|
54
|
+
await party.credentialsWriter.write(createPartyGenesisMessage(
|
|
55
55
|
keyring,
|
|
56
56
|
partyKey,
|
|
57
57
|
feed.key,
|
|
@@ -59,7 +59,7 @@ describe('PartyCore', () => {
|
|
|
59
59
|
);
|
|
60
60
|
|
|
61
61
|
// FeedAdmit (signed by the Device KeyChain).
|
|
62
|
-
await party.
|
|
62
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
63
63
|
keyring,
|
|
64
64
|
partyKey.publicKey,
|
|
65
65
|
feed.key,
|
|
@@ -120,7 +120,7 @@ describe('PartyCore', () => {
|
|
|
120
120
|
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
121
121
|
|
|
122
122
|
const eventFired = feedStore.feedOpenedEvent.waitForCount(1);
|
|
123
|
-
await party.
|
|
123
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
124
124
|
keyring,
|
|
125
125
|
party.key,
|
|
126
126
|
feedKey.publicKey,
|
|
@@ -132,15 +132,15 @@ describe('PartyCore', () => {
|
|
|
132
132
|
|
|
133
133
|
test('opens feed from hints', async () => {
|
|
134
134
|
const storage = createStorage('', StorageType.RAM);
|
|
135
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
135
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
136
136
|
afterTest(async () => feedStore.close());
|
|
137
137
|
|
|
138
138
|
const keyring = new Keyring();
|
|
139
139
|
|
|
140
|
-
const metadataStore = new MetadataStore(
|
|
140
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
141
141
|
|
|
142
142
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
143
|
-
const snapshotStore = new SnapshotStore(
|
|
143
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
144
144
|
|
|
145
145
|
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
146
146
|
|
|
@@ -197,7 +197,7 @@ describe('PartyCore', () => {
|
|
|
197
197
|
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
198
198
|
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
199
199
|
|
|
200
|
-
await party.
|
|
200
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
201
201
|
keyring,
|
|
202
202
|
party.key,
|
|
203
203
|
feed2.key,
|
|
@@ -226,7 +226,7 @@ describe('PartyCore', () => {
|
|
|
226
226
|
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
227
227
|
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
228
228
|
|
|
229
|
-
await party.
|
|
229
|
+
await party.credentialsWriter.write(createFeedAdmitMessage(
|
|
230
230
|
keyring,
|
|
231
231
|
party.key,
|
|
232
232
|
feedKey.publicKey,
|
|
@@ -253,13 +253,13 @@ describe('PartyCore', () => {
|
|
|
253
253
|
const peer1 = await setup();
|
|
254
254
|
|
|
255
255
|
const storage = createStorage('', StorageType.RAM);
|
|
256
|
-
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
256
|
+
const feedStore = new FeedStore(storage.directory('feed'), { valueEncoding: codec });
|
|
257
257
|
afterTest(async () => feedStore.close());
|
|
258
258
|
|
|
259
|
-
const metadataStore = new MetadataStore(
|
|
259
|
+
const metadataStore = new MetadataStore(storage.directory('metadata'));
|
|
260
260
|
|
|
261
261
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
262
|
-
const snapshotStore = new SnapshotStore(
|
|
262
|
+
const snapshotStore = new SnapshotStore(storage.directory('snapshots'));
|
|
263
263
|
|
|
264
264
|
const partyFeedProvider = new PartyFeedProvider(metadataStore, peer1.keyring, feedStore, peer1.party.key);
|
|
265
265
|
|
|
@@ -273,7 +273,7 @@ describe('PartyCore', () => {
|
|
|
273
273
|
|
|
274
274
|
const feed2 = await partyFeedProvider.createOrOpenWritableFeed();
|
|
275
275
|
|
|
276
|
-
await peer1.party.
|
|
276
|
+
await peer1.party.credentialsWriter.write(createFeedAdmitMessage(
|
|
277
277
|
peer1.keyring,
|
|
278
278
|
peer1.party.key,
|
|
279
279
|
feed2.key,
|
|
@@ -8,12 +8,11 @@ import { synchronized } from '@dxos/async';
|
|
|
8
8
|
import { KeyHint, 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
|
|
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
|
|
|
@@ -99,6 +98,11 @@ export class PartyCore {
|
|
|
99
98
|
return feed;
|
|
100
99
|
}
|
|
101
100
|
|
|
101
|
+
get credentialsWriter (): FeedWriter<HaloMessage> {
|
|
102
|
+
assert(this._pipeline?.outboundHaloStream, 'Party not open');
|
|
103
|
+
return this._pipeline?.outboundHaloStream;
|
|
104
|
+
}
|
|
105
|
+
|
|
102
106
|
/**
|
|
103
107
|
* Opens the pipeline and connects the streams.
|
|
104
108
|
*/
|
|
@@ -147,11 +151,6 @@ export class PartyCore {
|
|
|
147
151
|
// TODO(burdon): Support read-only parties.
|
|
148
152
|
const [readStream, writeStream] = await this._pipeline.open();
|
|
149
153
|
|
|
150
|
-
// Must happen after open.
|
|
151
|
-
if (this._pipeline.outboundHaloStream) {
|
|
152
|
-
this._partyProcessor.setOutboundStream(this._pipeline.outboundHaloStream);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
154
|
//
|
|
156
155
|
// Database
|
|
157
156
|
//
|
|
@@ -202,11 +201,6 @@ export class PartyCore {
|
|
|
202
201
|
return this;
|
|
203
202
|
}
|
|
204
203
|
|
|
205
|
-
writeCredentialsMessage (message: HaloMessage): Promise<WriteReceipt> {
|
|
206
|
-
assert(this._partyProcessor, 'Party not open');
|
|
207
|
-
return this._partyProcessor?.writeHaloMessage(message);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
204
|
/**
|
|
211
205
|
* Create a snapshot of the current state.
|
|
212
206
|
*/
|
|
@@ -16,15 +16,11 @@ import {
|
|
|
16
16
|
SignedMessage
|
|
17
17
|
} from '@dxos/credentials';
|
|
18
18
|
import { PublicKey } from '@dxos/crypto';
|
|
19
|
-
import { FeedKey,
|
|
19
|
+
import { FeedKey, IHaloStream, PartyKey, HaloStateSnapshot } from '@dxos/echo-protocol';
|
|
20
20
|
import { jsonReplacer } from '@dxos/util';
|
|
21
21
|
|
|
22
22
|
const log = debug('dxos:echo-db:party-processor');
|
|
23
23
|
|
|
24
|
-
export interface CredentialWriter {
|
|
25
|
-
writeHaloMessage (message: HaloMessage): Promise<WriteReceipt>
|
|
26
|
-
}
|
|
27
|
-
|
|
28
24
|
export interface CredentialProcessor {
|
|
29
25
|
processMessage (message: IHaloStream): Promise<void>
|
|
30
26
|
}
|
|
@@ -47,11 +43,9 @@ export interface PartyStateProvider {
|
|
|
47
43
|
/**
|
|
48
44
|
* TODO(burdon): Wrapper/Bridge between HALO APIs.
|
|
49
45
|
*/
|
|
50
|
-
export class PartyProcessor implements
|
|
46
|
+
export class PartyProcessor implements CredentialProcessor, PartyStateProvider {
|
|
51
47
|
private readonly _state: PartyState;
|
|
52
48
|
|
|
53
|
-
private _outboundHaloStream: FeedWriter<HaloMessage> | undefined;
|
|
54
|
-
|
|
55
49
|
readonly feedAdded = new Event<FeedKey>()
|
|
56
50
|
|
|
57
51
|
public readonly keyOrInfoAdded = new Event<PublicKey>();
|
|
@@ -148,16 +142,6 @@ export class PartyProcessor implements CredentialWriter, CredentialProcessor, Pa
|
|
|
148
142
|
await this._state.processMessages([data]);
|
|
149
143
|
}
|
|
150
144
|
|
|
151
|
-
setOutboundStream (stream: FeedWriter<HaloMessage>) {
|
|
152
|
-
this._outboundHaloStream = stream;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async writeHaloMessage (message: HaloMessage): Promise<WriteReceipt> {
|
|
156
|
-
assert(this._outboundHaloStream, 'Party is closed or read-only');
|
|
157
|
-
// TODO(marik-d): Wait for the message to be processed?
|
|
158
|
-
return this._outboundHaloStream.write(message);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
145
|
makeSnapshot (): HaloStateSnapshot {
|
|
162
146
|
return {
|
|
163
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();
|
package/src/pipeline/pipeline.ts
CHANGED
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import { createReadable } from '@dxos/feed-store';
|
|
17
17
|
import { jsonReplacer } from '@dxos/util';
|
|
18
18
|
|
|
19
|
-
import { TimeframeClock } from '../database';
|
|
19
|
+
import { TimeframeClock } from '../packlets/database';
|
|
20
20
|
import { CredentialProcessor, PartyStateProvider } from './party-processor';
|
|
21
21
|
|
|
22
22
|
interface Options {
|
|
@@ -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,18 +4,22 @@
|
|
|
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 const createAuthenticator = (
|
|
15
|
+
export const createAuthenticator = (
|
|
16
|
+
partyProcessor: PartyProcessor,
|
|
17
|
+
credentialsSigner: CredentialsSigner,
|
|
18
|
+
credentialsWriter: FeedWriter<HaloMessage>
|
|
19
|
+
): Authenticator => new PartyAuthenticator(partyProcessor.state, async auth => {
|
|
16
20
|
if (auth.feedAdmit && auth.feedKey && !partyProcessor.isFeedAdmitted(auth.feedKey)) {
|
|
17
21
|
log(`Admitting feed of authenticated member: ${auth.feedKey}`);
|
|
18
|
-
await
|
|
22
|
+
await credentialsWriter.write(createEnvelopeMessage(
|
|
19
23
|
credentialsSigner.signer,
|
|
20
24
|
partyProcessor.partyKey,
|
|
21
25
|
auth.feedAdmit,
|
|
@@ -15,7 +15,7 @@ const createPublicKey = () => PublicKey.from(createKeyPair().publicKey);
|
|
|
15
15
|
|
|
16
16
|
describe('SnapshotStore', () => {
|
|
17
17
|
test('in-memory', async () => {
|
|
18
|
-
const store = new SnapshotStore(createStorage('
|
|
18
|
+
const store = new SnapshotStore(createStorage('', StorageType.RAM).directory('snapshots'));
|
|
19
19
|
|
|
20
20
|
const key1 = createPublicKey();
|
|
21
21
|
const key2 = createPublicKey();
|
|
@@ -7,10 +7,9 @@ import debug from 'debug';
|
|
|
7
7
|
|
|
8
8
|
import { keyToString } from '@dxos/crypto';
|
|
9
9
|
import { schema, PartyKey, PartySnapshot } from '@dxos/echo-protocol';
|
|
10
|
-
import {
|
|
10
|
+
import { Directory } from '@dxos/random-access-multi-storage';
|
|
11
11
|
|
|
12
12
|
const log = debug('dxos:snapshot-store');
|
|
13
|
-
|
|
14
13
|
/**
|
|
15
14
|
* Stores party snapshots. Takes any `random-access-storage` compatible backend.
|
|
16
15
|
*
|
|
@@ -18,11 +17,11 @@ const log = debug('dxos:snapshot-store');
|
|
|
18
17
|
*/
|
|
19
18
|
export class SnapshotStore {
|
|
20
19
|
constructor (
|
|
21
|
-
private readonly
|
|
20
|
+
private readonly _directory: Directory
|
|
22
21
|
) {}
|
|
23
22
|
|
|
24
23
|
async load (partyKey: PartyKey): Promise<PartySnapshot | undefined> {
|
|
25
|
-
const file = this.
|
|
24
|
+
const file = this._directory.createOrOpen(partyKey.toHex());
|
|
26
25
|
|
|
27
26
|
try {
|
|
28
27
|
const { size } = await file.stat();
|
|
@@ -45,7 +44,7 @@ export class SnapshotStore {
|
|
|
45
44
|
|
|
46
45
|
async save (snapshot: PartySnapshot) {
|
|
47
46
|
assert(snapshot.partyKey);
|
|
48
|
-
const file = this.
|
|
47
|
+
const file = this._directory.createOrOpen(keyToString(snapshot.partyKey), { truncate: true, size: 0 });
|
|
49
48
|
|
|
50
49
|
try {
|
|
51
50
|
const data = schema.getCodecForType('dxos.echo.snapshot.PartySnapshot').encode(snapshot);
|
|
@@ -60,6 +59,6 @@ export class SnapshotStore {
|
|
|
60
59
|
*/
|
|
61
60
|
async clear () {
|
|
62
61
|
log('Clearing all snapshots..');
|
|
63
|
-
await this.
|
|
62
|
+
await this._directory.destroy();
|
|
64
63
|
}
|
|
65
64
|
}
|
|
@@ -12,7 +12,7 @@ import { schema, ItemID, MockFeedWriter, PartyKey } from '@dxos/echo-protocol';
|
|
|
12
12
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
13
|
import { ObjectModel, ValueUtil } from '@dxos/object-model';
|
|
14
14
|
|
|
15
|
-
import { ItemDemuxer, ItemManager } from '../database';
|
|
15
|
+
import { ItemDemuxer, ItemManager } from '../packlets/database';
|
|
16
16
|
import { createTestInstance } from '../testing';
|
|
17
17
|
|
|
18
18
|
const log = debug('dxos:snapshot:test');
|