@dxos/echo-db 2.33.1-dev.83d113fe → 2.33.1-dev.eb88db79

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.
Files changed (75) hide show
  1. package/dist/src/database/data-mirror.js +2 -2
  2. package/dist/src/database/data-mirror.js.map +1 -1
  3. package/dist/src/database/item-demuxer.test.js +2 -2
  4. package/dist/src/database/item-demuxer.test.js.map +1 -1
  5. package/dist/src/echo.d.ts +19 -19
  6. package/dist/src/echo.d.ts.map +1 -1
  7. package/dist/src/echo.js +32 -19
  8. package/dist/src/echo.js.map +1 -1
  9. package/dist/src/echo.test.js +1 -1
  10. package/dist/src/echo.test.js.map +1 -1
  11. package/dist/src/invitations/greeting-initiator.d.ts +1 -4
  12. package/dist/src/invitations/greeting-initiator.d.ts.map +1 -1
  13. package/dist/src/invitations/greeting-initiator.js +1 -7
  14. package/dist/src/invitations/greeting-initiator.js.map +1 -1
  15. package/dist/src/invitations/halo-recovery-initiator.d.ts.map +1 -1
  16. package/dist/src/invitations/halo-recovery-initiator.js +2 -2
  17. package/dist/src/invitations/halo-recovery-initiator.js.map +1 -1
  18. package/dist/src/invitations/offline-invitation-claimer.d.ts.map +1 -1
  19. package/dist/src/invitations/offline-invitation-claimer.js +2 -2
  20. package/dist/src/invitations/offline-invitation-claimer.js.map +1 -1
  21. package/dist/src/parties/authenticator.d.ts +5 -0
  22. package/dist/src/parties/authenticator.d.ts.map +1 -0
  23. package/dist/src/parties/authenticator.js +27 -0
  24. package/dist/src/parties/authenticator.js.map +1 -0
  25. package/dist/src/parties/party-core.d.ts.map +1 -1
  26. package/dist/src/parties/party-core.js +7 -3
  27. package/dist/src/parties/party-core.js.map +1 -1
  28. package/dist/src/parties/party-core.test.js +136 -5
  29. package/dist/src/parties/party-core.test.js.map +1 -1
  30. package/dist/src/parties/party-factory.d.ts.map +1 -1
  31. package/dist/src/parties/party-factory.js +1 -5
  32. package/dist/src/parties/party-factory.js.map +1 -1
  33. package/dist/src/parties/party-internal.d.ts.map +1 -1
  34. package/dist/src/parties/party-internal.js +20 -13
  35. package/dist/src/parties/party-internal.js.map +1 -1
  36. package/dist/src/parties/party-manager.test.js +4 -4
  37. package/dist/src/parties/party-manager.test.js.map +1 -1
  38. package/dist/src/pipeline/party-processor.d.ts +3 -4
  39. package/dist/src/pipeline/party-processor.d.ts.map +1 -1
  40. package/dist/src/pipeline/party-processor.js +8 -14
  41. package/dist/src/pipeline/party-processor.js.map +1 -1
  42. package/dist/src/pipeline/party-processor.test.js +8 -8
  43. package/dist/src/pipeline/party-processor.test.js.map +1 -1
  44. package/dist/src/pipeline/party-protocol-factory.d.ts +11 -0
  45. package/dist/src/pipeline/party-protocol-factory.d.ts.map +1 -1
  46. package/dist/src/pipeline/party-protocol-factory.js +2 -1
  47. package/dist/src/pipeline/party-protocol-factory.js.map +1 -1
  48. package/dist/src/pipeline/pipeline.js +1 -1
  49. package/dist/src/pipeline/pipeline.js.map +1 -1
  50. package/dist/src/pipeline/pipeline.test.js +3 -3
  51. package/dist/src/pipeline/pipeline.test.js.map +1 -1
  52. package/dist/src/util/persistant-ram-storage.d.ts.map +1 -1
  53. package/dist/src/util/persistant-ram-storage.js +1 -1
  54. package/dist/src/util/persistant-ram-storage.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +17 -17
  57. package/src/database/data-mirror.ts +2 -2
  58. package/src/database/item-demuxer.test.ts +3 -3
  59. package/src/echo.test.ts +1 -1
  60. package/src/echo.ts +76 -73
  61. package/src/invitations/greeting-initiator.ts +1 -26
  62. package/src/invitations/halo-recovery-initiator.ts +4 -4
  63. package/src/invitations/offline-invitation-claimer.ts +4 -4
  64. package/src/parties/authenticator.ts +31 -0
  65. package/src/parties/party-core.test.ts +233 -10
  66. package/src/parties/party-core.ts +8 -3
  67. package/src/parties/party-factory.ts +1 -6
  68. package/src/parties/party-internal.ts +28 -14
  69. package/src/parties/party-manager.test.ts +5 -5
  70. package/src/pipeline/party-processor.test.ts +8 -8
  71. package/src/pipeline/party-processor.ts +8 -18
  72. package/src/pipeline/party-protocol-factory.ts +1 -1
  73. package/src/pipeline/pipeline.test.ts +4 -4
  74. package/src/pipeline/pipeline.ts +1 -1
  75. package/src/util/persistant-ram-storage.ts +3 -3
@@ -5,7 +5,7 @@
5
5
  import assert from 'assert';
6
6
 
7
7
  import { synchronized, Event } from '@dxos/async';
8
- import { KeyHint, createAuthMessage, Authenticator } from '@dxos/credentials';
8
+ import { KeyHint, createAuthMessage, createFeedAdmitMessage, codec } from '@dxos/credentials';
9
9
  import { PublicKey } from '@dxos/crypto';
10
10
  import { failUndefined, raise, timed } from '@dxos/debug';
11
11
  import { PartyKey, PartySnapshot, Timeframe, FeedKey } from '@dxos/echo-protocol';
@@ -19,6 +19,7 @@ import { ActivationOptions, PartyPreferences, IdentityProvider } from '../halo';
19
19
  import { InvitationManager } from '../invitations';
20
20
  import { CredentialsProvider, PartyFeedProvider, PartyProtocolFactory } from '../pipeline';
21
21
  import { SnapshotStore } from '../snapshots';
22
+ import { createAuthenticator } from './authenticator';
22
23
  import { PartyCore, PartyOptions } from './party-core';
23
24
  import { CONTACT_DEBOUNCE_INTERVAL } from './party-manager';
24
25
 
@@ -178,7 +179,7 @@ export class PartyInternal {
178
179
  this._identityProvider,
179
180
  this._createCredentialsProvider(this._partyCore.key, writeFeed.key),
180
181
  this._invitationManager,
181
- this._partyCore.processor.authenticator,
182
+ createAuthenticator(this._partyCore.processor, this._identityProvider),
182
183
  this._partyCore.processor.getActiveFeedSet()
183
184
  );
184
185
 
@@ -274,12 +275,20 @@ export class PartyInternal {
274
275
  return {
275
276
  get: () => {
276
277
  const identity = this._identityProvider();
277
- return Buffer.from(Authenticator.encodePayload(createAuthMessage(
278
+ const signingKey = identity.deviceKeyChain ?? identity.deviceKey ?? raise(new IdentityNotInitializedError());
279
+ return Buffer.from(codec.encode(createAuthMessage(
278
280
  identity.signer,
279
281
  partyKey,
280
282
  identity.identityKey ?? raise(new IdentityNotInitializedError()),
281
- identity.deviceKeyChain ?? identity.deviceKey ?? raise(new IdentityNotInitializedError()),
282
- identity.keyring.getKey(feedKey)
283
+ signingKey,
284
+ identity.keyring.getKey(feedKey),
285
+ undefined,
286
+ createFeedAdmitMessage(
287
+ identity.signer,
288
+ partyKey,
289
+ feedKey,
290
+ [identity.keyring.getKey(feedKey) ?? failUndefined(), signingKey]
291
+ )
283
292
  )));
284
293
  }
285
294
  };
@@ -292,15 +301,20 @@ export class PartyInternal {
292
301
  assert(this.isOpen, 'Party is not open.');
293
302
  return new ResultSet(
294
303
  this.processor.keyOrInfoAdded.debounce(CONTACT_DEBOUNCE_INTERVAL).discardParameter(),
295
- () => this.processor.memberKeys
296
- .filter(publicKey => !this.processor.partyKey.equals(publicKey))
297
- .map((publicKey: PublicKey): PartyMember => {
298
- const displayName = this.processor.getMemberInfo(publicKey)?.displayName;
299
- return {
300
- publicKey,
301
- displayName
302
- };
303
- })
304
+ () => {
305
+ if (!this.isOpen) {
306
+ return [];
307
+ }
308
+ return this.processor.memberKeys
309
+ .filter(publicKey => !this.processor.partyKey.equals(publicKey))
310
+ .map((publicKey: PublicKey): PartyMember => {
311
+ const displayName = this.processor.getMemberInfo(publicKey)?.displayName;
312
+ return {
313
+ publicKey,
314
+ displayName
315
+ };
316
+ });
317
+ }
304
318
  );
305
319
  }
306
320
  }
@@ -29,7 +29,7 @@ import { createWritableFeedStream, FeedStore } from '@dxos/feed-store';
29
29
  import { ModelFactory } from '@dxos/model-factory';
30
30
  import { NetworkManager } from '@dxos/network-manager';
31
31
  import { ObjectModel } from '@dxos/object-model';
32
- import { createStorage, STORAGE_RAM } from '@dxos/random-access-multi-storage';
32
+ import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
33
33
  import { afterTest } from '@dxos/testutils';
34
34
 
35
35
  import { Item } from '../api';
@@ -58,7 +58,7 @@ const log = debug('dxos:echo:parties:party-manager:test');
58
58
  const setup = async (open = true, createIdentity = true) => {
59
59
  const keyring = new Keyring();
60
60
  const metadataStore = new MetadataStore(createRamStorage());
61
- const feedStore = new FeedStore(createStorage('', STORAGE_RAM), { valueEncoding: codec });
61
+ const feedStore = new FeedStore(createStorage('', StorageType.RAM), { valueEncoding: codec });
62
62
 
63
63
  let seedPhrase;
64
64
  if (createIdentity) {
@@ -73,7 +73,7 @@ const setup = async (open = true, createIdentity = true) => {
73
73
  assert(keyring.keys.length === 1);
74
74
  }
75
75
 
76
- const snapshotStore = new SnapshotStore(createStorage('', STORAGE_RAM));
76
+ const snapshotStore = new SnapshotStore(createStorage('', StorageType.RAM));
77
77
  const modelFactory = new ModelFactory().registerModel(ObjectModel);
78
78
  const networkManager = new NetworkManager();
79
79
  const feedProviderFactory = (partyKey: PublicKey) => new PartyFeedProvider(metadataStore, keyring, feedStore, partyKey);
@@ -179,7 +179,7 @@ describe('Party manager', () => {
179
179
  });
180
180
 
181
181
  test('Create from cold start', async () => {
182
- const storage = createStorage('', STORAGE_RAM);
182
+ const storage = createStorage('', StorageType.RAM);
183
183
  const feedStore = new FeedStore(storage, { valueEncoding: codec });
184
184
 
185
185
  const keyring = new Keyring();
@@ -189,7 +189,7 @@ describe('Party manager', () => {
189
189
  await keyring.createKeyRecord({ type: KeyType.DEVICE });
190
190
 
191
191
  const modelFactory = new ModelFactory().registerModel(ObjectModel);
192
- const snapshotStore = new SnapshotStore(createStorage('', STORAGE_RAM));
192
+ const snapshotStore = new SnapshotStore(createStorage('', StorageType.RAM));
193
193
  const networkManager = new NetworkManager();
194
194
  const feedProviderFactory = (partyKey: PublicKey) => new PartyFeedProvider(metadataStore, keyring, feedStore, partyKey);
195
195
  const partyFactory: PartyFactory = new PartyFactory(() => identityManager.identity, networkManager, modelFactory, snapshotStore, feedProviderFactory);
@@ -36,7 +36,7 @@ describe('party-processor', () => {
36
36
 
37
37
  const message: IHaloStream = {
38
38
  meta: {
39
- feedKey: feedKey.publicKey.asUint8Array(),
39
+ feedKey: feedKey.publicKey,
40
40
  seq: 0
41
41
  // TODO(telackey): Should ownership data go here?
42
42
  },
@@ -67,7 +67,7 @@ describe('party-processor', () => {
67
67
 
68
68
  const genesisMessage: IHaloStream = {
69
69
  meta: {
70
- feedKey: feedKey.publicKey.asUint8Array(),
70
+ feedKey: feedKey.publicKey,
71
71
  seq: 0
72
72
  // TODO(telackey): Should ownership data go here?
73
73
  },
@@ -78,7 +78,7 @@ describe('party-processor', () => {
78
78
  const feedKey2 = await keyring.createKeyRecord({ type: KeyType.FEED });
79
79
  const feedAdmit: IHaloStream = {
80
80
  meta: {
81
- feedKey: feedKey.publicKey.asUint8Array(),
81
+ feedKey: feedKey.publicKey,
82
82
  seq: 0
83
83
  // TODO(telackey): Should ownership data go here?
84
84
  },
@@ -106,7 +106,7 @@ describe('party-processor', () => {
106
106
 
107
107
  const genesisMessage: IHaloStream = {
108
108
  meta: {
109
- feedKey: feedKey.publicKey.asUint8Array(),
109
+ feedKey: feedKey.publicKey,
110
110
  seq: 0
111
111
  // TODO(telackey): Should ownership data go here?
112
112
  },
@@ -115,7 +115,7 @@ describe('party-processor', () => {
115
115
  await partyProcessor.processMessage(genesisMessage);
116
116
  const feedAdmit: IHaloStream = {
117
117
  meta: {
118
- feedKey: feedKey.publicKey.asUint8Array(),
118
+ feedKey: feedKey.publicKey,
119
119
  seq: 0
120
120
  // TODO(telackey): Should ownership data go here?
121
121
  },
@@ -129,7 +129,7 @@ describe('party-processor', () => {
129
129
 
130
130
  const keyAdmit: IHaloStream = {
131
131
  meta: {
132
- feedKey: feedKey.publicKey.asUint8Array(),
132
+ feedKey: feedKey.publicKey,
133
133
  seq: 1
134
134
  },
135
135
  data: createEnvelopeMessage(keyring, partyKey.publicKey,
@@ -141,7 +141,7 @@ describe('party-processor', () => {
141
141
 
142
142
  const feedAdmit2: IHaloStream = {
143
143
  meta: {
144
- feedKey: feedKey.publicKey.asUint8Array(),
144
+ feedKey: feedKey.publicKey,
145
145
  seq: 1
146
146
  // TODO(telackey): Should ownership data go here?
147
147
  },
@@ -170,7 +170,7 @@ describe('party-processor', () => {
170
170
  const partyProcessor = new PartyProcessor(partyKey.publicKey);
171
171
  expect(partyProcessor.partyKey).toBeTruthy();
172
172
 
173
- const meta = (seq: number) => ({ feedKey: feedKey.publicKey.asUint8Array(), seq });
173
+ const meta = (seq: number) => ({ feedKey: feedKey.publicKey, seq });
174
174
 
175
175
  await partyProcessor.processMessage({
176
176
  meta: meta(0),
@@ -7,11 +7,9 @@ import debug from 'debug';
7
7
 
8
8
  import { Event } from '@dxos/async';
9
9
  import {
10
- Authenticator,
11
10
  KeyHint,
12
11
  KeyRecord,
13
12
  PartyState,
14
- PartyAuthenticator,
15
13
  Message as HaloMessage,
16
14
  IdentityEventType,
17
15
  PartyEventType
@@ -32,11 +30,10 @@ export interface FeedSetProvider {
32
30
  */
33
31
  export class PartyProcessor {
34
32
  private readonly _state: PartyState;
35
- private readonly _authenticator: Authenticator;
36
33
 
37
34
  private _outboundHaloStream: FeedWriter<HaloMessage> | undefined;
38
35
 
39
- protected readonly _feedAdded = new Event<FeedKey>()
36
+ readonly feedAdded = new Event<FeedKey>()
40
37
 
41
38
  public readonly keyOrInfoAdded = new Event<PublicKey>();
42
39
 
@@ -49,21 +46,14 @@ export class PartyProcessor {
49
46
  private readonly _partyKey: PartyKey
50
47
  ) {
51
48
  this._state = new PartyState(this._partyKey);
52
- this._authenticator = new PartyAuthenticator(this._state);
53
-
54
- /* TODO(telackey): `@dxos/credentials` was only half converted to TS. In its current state, the KeyRecord type
55
- * is not exported, and the PartyStateMachine being used is not properly understood as an EventEmitter by TS.
56
- * Casting to 'any' is a workaround for the compiler, but the fix is fully to convert @dxos/credentials to TS.
57
- */
58
- const state = this._state as any;
59
49
 
60
50
  // TODO(marik-d): Use `Event.wrap` here.
61
- state.on(PartyEventType.ADMIT_FEED, (keyRecord: any) => {
51
+ this._state.on(PartyEventType.ADMIT_FEED, (keyRecord: any) => {
62
52
  log(`Feed key admitted ${keyRecord.publicKey.toHex()}`);
63
- this._feedAdded.emit(keyRecord.publicKey);
53
+ this.feedAdded.emit(keyRecord.publicKey);
64
54
  });
65
- state.on(PartyEventType.ADMIT_KEY, (keyRecord: KeyRecord) => this.keyOrInfoAdded.emit(keyRecord.publicKey));
66
- state.on(IdentityEventType.UPDATE_IDENTITY, (publicKey: PublicKey) => this.keyOrInfoAdded.emit(publicKey));
55
+ this._state.on(PartyEventType.ADMIT_KEY, (keyRecord: KeyRecord) => this.keyOrInfoAdded.emit(keyRecord.publicKey));
56
+ this._state.on(IdentityEventType.UPDATE_IDENTITY, (publicKey: PublicKey) => this.keyOrInfoAdded.emit(publicKey));
67
57
  }
68
58
 
69
59
  get partyKey () {
@@ -90,8 +80,8 @@ export class PartyProcessor {
90
80
  return this._state.credentialMessages.size === 0;
91
81
  }
92
82
 
93
- get authenticator () {
94
- return this._authenticator;
83
+ get state () {
84
+ return this._state;
95
85
  }
96
86
 
97
87
  isFeedAdmitted (feedKey: FeedKey) {
@@ -122,7 +112,7 @@ export class PartyProcessor {
122
112
  getActiveFeedSet (): FeedSetProvider {
123
113
  return {
124
114
  get: () => this.feedKeys,
125
- added: this._feedAdded
115
+ added: this.feedAdded
126
116
  };
127
117
  }
128
118
 
@@ -144,7 +144,7 @@ export class PartyProtocolFactory {
144
144
  /**
145
145
  * Creates the protocol plugin for feed replication.
146
146
  */
147
- class ReplicatorProtocolPluginFactory {
147
+ export class ReplicatorProtocolPluginFactory {
148
148
  constructor (
149
149
  private readonly _feedProvider: PartyFeedProvider,
150
150
  private readonly _activeFeeds: FeedSetProvider
@@ -12,7 +12,7 @@ import { createId, createKeyPair, PublicKey } from '@dxos/crypto';
12
12
  import { codec, createFeedWriter, FeedSelector, FeedStoreIterator, IEchoStream, Timeframe } from '@dxos/echo-protocol';
13
13
  import { FeedStore, createWritableFeedStream, createWritable, WritableArray } from '@dxos/feed-store';
14
14
  import { createSetPropertyMutation } from '@dxos/model-factory';
15
- import { createStorage, STORAGE_RAM } from '@dxos/random-access-multi-storage';
15
+ import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
16
16
  import { jsonReplacer } from '@dxos/util';
17
17
 
18
18
  import { TimeframeClock } from '../database';
@@ -24,7 +24,7 @@ const log = debug('dxos:echo:pipeline:test');
24
24
  // TODO(burdon): Test read-only.
25
25
  describe('pipeline', () => {
26
26
  test('streams', async () => {
27
- const storage = createStorage('', STORAGE_RAM);
27
+ const storage = createStorage('', StorageType.RAM);
28
28
  const feedStore = new FeedStore(storage, { valueEncoding: codec });
29
29
  const feedKeys: Uint8Array[] = [];
30
30
  const feedSelector: FeedSelector = descriptor => !!feedKeys.find(key => descriptor.key.equals(key));
@@ -52,7 +52,7 @@ describe('pipeline', () => {
52
52
  await partyProcessor.processMessage({
53
53
  data: createPartyGenesisMessage(keyring, partyKey, feedKey.publicKey, identityKey),
54
54
  meta: {
55
- feedKey: feedKey.publicKey.asBuffer(),
55
+ feedKey: feedKey.publicKey,
56
56
  seq: 0
57
57
  }
58
58
  });
@@ -86,7 +86,7 @@ describe('pipeline', () => {
86
86
  });
87
87
 
88
88
  test('writing', async () => {
89
- const storage = createStorage('', STORAGE_RAM);
89
+ const storage = createStorage('', StorageType.RAM);
90
90
  const feedStore = new FeedStore(storage, { valueEncoding: codec });
91
91
  const feedReadStream = new FeedStoreIterator(() => true, () => 0, new Timeframe());
92
92
 
@@ -141,7 +141,7 @@ export class Pipeline {
141
141
  meta: {
142
142
  seq: block.seq,
143
143
  feedKey: block.key,
144
- memberKey: memberKey.asUint8Array(),
144
+ memberKey,
145
145
  timeframe: message.echo.timeframe ?? new Timeframe()
146
146
  },
147
147
  data: message.echo
@@ -2,7 +2,7 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import { createStorage, IFile, IStorage } from '@dxos/random-access-multi-storage';
5
+ import { StorageType, createStorage, File, IStorage } from '@dxos/random-access-multi-storage';
6
6
 
7
7
  /**
8
8
  * A wrapper around RAM storage that preserves file data when closing and re-opening files.
@@ -10,8 +10,8 @@ import { createStorage, IFile, IStorage } from '@dxos/random-access-multi-storag
10
10
  // TODO(burdon): Factor out?
11
11
  export function createRamStorage (): IStorage {
12
12
  const root = 'snapshots';
13
- const storage = createStorage(root, 'ram');
14
- const files = new Map<string, IFile>();
13
+ const storage = createStorage(root, StorageType.RAM);
14
+ const files = new Map<string, File>();
15
15
 
16
16
  const fn: any = {};
17
17