@dxos/echo-db 2.33.1-dev.5378ccd5 → 2.33.1-dev.7958a3d0
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/echo.test.js +1 -1
- package/dist/src/echo.test.js.map +1 -1
- package/dist/src/parties/party-core.d.ts.map +1 -1
- package/dist/src/parties/party-core.js +7 -3
- package/dist/src/parties/party-core.js.map +1 -1
- package/dist/src/parties/party-core.test.js +136 -5
- package/dist/src/parties/party-core.test.js.map +1 -1
- package/dist/src/parties/party-manager.test.js +4 -4
- package/dist/src/parties/party-manager.test.js.map +1 -1
- package/dist/src/pipeline/party-processor.d.ts +1 -1
- package/dist/src/pipeline/party-processor.d.ts.map +1 -1
- package/dist/src/pipeline/party-processor.js +3 -3
- package/dist/src/pipeline/party-processor.js.map +1 -1
- package/dist/src/pipeline/party-protocol-factory.d.ts +11 -0
- package/dist/src/pipeline/party-protocol-factory.d.ts.map +1 -1
- package/dist/src/pipeline/party-protocol-factory.js +2 -1
- package/dist/src/pipeline/party-protocol-factory.js.map +1 -1
- package/dist/src/pipeline/pipeline.test.js +2 -2
- package/dist/src/pipeline/pipeline.test.js.map +1 -1
- package/dist/src/util/persistant-ram-storage.d.ts.map +1 -1
- package/dist/src/util/persistant-ram-storage.js +1 -1
- package/dist/src/util/persistant-ram-storage.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/src/echo.test.ts +1 -1
- package/src/parties/party-core.test.ts +233 -10
- package/src/parties/party-core.ts +8 -3
- package/src/parties/party-manager.test.ts +5 -5
- package/src/pipeline/party-processor.ts +3 -3
- package/src/pipeline/party-protocol-factory.ts +1 -1
- package/src/pipeline/pipeline.test.ts +3 -3
- package/src/util/persistant-ram-storage.ts +3 -3
|
@@ -5,24 +5,26 @@
|
|
|
5
5
|
import expect from 'expect';
|
|
6
6
|
import { it as test } from 'mocha';
|
|
7
7
|
|
|
8
|
+
import { promiseTimeout } from '@dxos/async';
|
|
8
9
|
import { createFeedAdmitMessage, createPartyGenesisMessage, Keyring, KeyType } from '@dxos/credentials';
|
|
9
|
-
import { PublicKey } from '@dxos/crypto';
|
|
10
|
-
import { codec } from '@dxos/echo-protocol';
|
|
10
|
+
import { createId, PublicKey } from '@dxos/crypto';
|
|
11
|
+
import { codec, Timeframe } from '@dxos/echo-protocol';
|
|
11
12
|
import { FeedStore } from '@dxos/feed-store';
|
|
13
|
+
import { createTestProtocolPair } from '@dxos/mesh-protocol';
|
|
12
14
|
import { ModelFactory } from '@dxos/model-factory';
|
|
13
15
|
import { ObjectModel } from '@dxos/object-model';
|
|
14
|
-
import { createStorage,
|
|
16
|
+
import { createStorage, StorageType } from '@dxos/random-access-multi-storage';
|
|
15
17
|
import { afterTest } from '@dxos/testutils';
|
|
16
18
|
|
|
17
19
|
import { MetadataStore } from '../metadata';
|
|
18
|
-
import { PartyFeedProvider } from '../pipeline';
|
|
20
|
+
import { PartyFeedProvider, ReplicatorProtocolPluginFactory } from '../pipeline';
|
|
19
21
|
import { SnapshotStore } from '../snapshots';
|
|
20
22
|
import { createRamStorage } from '../util';
|
|
21
23
|
import { PartyCore } from './party-core';
|
|
22
24
|
|
|
23
25
|
describe('PartyCore', () => {
|
|
24
26
|
const setup = async () => {
|
|
25
|
-
const storage = createStorage('',
|
|
27
|
+
const storage = createStorage('', StorageType.RAM);
|
|
26
28
|
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
27
29
|
afterTest(async () => feedStore.close());
|
|
28
30
|
|
|
@@ -31,7 +33,7 @@ describe('PartyCore', () => {
|
|
|
31
33
|
const metadataStore = new MetadataStore(createRamStorage());
|
|
32
34
|
|
|
33
35
|
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
34
|
-
const snapshotStore = new SnapshotStore(createStorage('',
|
|
36
|
+
const snapshotStore = new SnapshotStore(createStorage('', StorageType.RAM));
|
|
35
37
|
|
|
36
38
|
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
37
39
|
|
|
@@ -65,10 +67,7 @@ describe('PartyCore', () => {
|
|
|
65
67
|
[partyKey]
|
|
66
68
|
));
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
await keyring.deleteSecretKey(partyKey);
|
|
70
|
-
|
|
71
|
-
return { party, feedKey: feed.key, feed, feedStore };
|
|
70
|
+
return { party, feedKey: feed.key, feed, feedStore, partyKey, keyring, partyFeedProvider };
|
|
72
71
|
};
|
|
73
72
|
|
|
74
73
|
test('create & have the feed key admitted', async () => {
|
|
@@ -115,4 +114,228 @@ describe('PartyCore', () => {
|
|
|
115
114
|
expect(parent.children).toContain(child);
|
|
116
115
|
}
|
|
117
116
|
});
|
|
117
|
+
|
|
118
|
+
test('feed admit message triggers new feed to be opened', async () => {
|
|
119
|
+
const { party, partyKey, keyring, partyFeedProvider, feedStore } = await setup();
|
|
120
|
+
|
|
121
|
+
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
122
|
+
|
|
123
|
+
const eventFired = feedStore.feedOpenedEvent.waitForCount(1);
|
|
124
|
+
await party.processor.writeHaloMessage(createFeedAdmitMessage(
|
|
125
|
+
keyring,
|
|
126
|
+
party.key,
|
|
127
|
+
feedKey.publicKey,
|
|
128
|
+
[partyKey]
|
|
129
|
+
));
|
|
130
|
+
await promiseTimeout(eventFired, 1000, new Error('timeout'));
|
|
131
|
+
expect(partyFeedProvider.getFeeds().find(k => k.key.equals(feedKey.publicKey))).toBeTruthy();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('opens feed from hints', async () => {
|
|
135
|
+
const storage = createStorage('', StorageType.RAM);
|
|
136
|
+
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
137
|
+
afterTest(async () => feedStore.close());
|
|
138
|
+
|
|
139
|
+
const keyring = new Keyring();
|
|
140
|
+
|
|
141
|
+
const metadataStore = new MetadataStore(createRamStorage());
|
|
142
|
+
|
|
143
|
+
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
144
|
+
const snapshotStore = new SnapshotStore(createStorage('', StorageType.RAM));
|
|
145
|
+
|
|
146
|
+
const partyKey = await keyring.createKeyRecord({ type: KeyType.PARTY });
|
|
147
|
+
|
|
148
|
+
const partyFeedProvider = new PartyFeedProvider(metadataStore, keyring, feedStore, partyKey.publicKey);
|
|
149
|
+
|
|
150
|
+
const otherFeedKey = PublicKey.random();
|
|
151
|
+
|
|
152
|
+
const party = new PartyCore(
|
|
153
|
+
partyKey.publicKey,
|
|
154
|
+
partyFeedProvider,
|
|
155
|
+
modelFactory,
|
|
156
|
+
snapshotStore,
|
|
157
|
+
PublicKey.random()
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
await partyFeedProvider.createOrOpenWritableFeed();
|
|
161
|
+
|
|
162
|
+
const feedOpened = feedStore.feedOpenedEvent.waitForCount(1);
|
|
163
|
+
|
|
164
|
+
await party.open([{ type: KeyType.FEED, publicKey: otherFeedKey }]);
|
|
165
|
+
afterTest(async () => party.close());
|
|
166
|
+
|
|
167
|
+
await feedOpened;
|
|
168
|
+
|
|
169
|
+
expect(partyFeedProvider.getFeeds().some(k => k.key.equals(otherFeedKey))).toEqual(true);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('manually create item', async () => {
|
|
173
|
+
const { party, partyFeedProvider } = await setup();
|
|
174
|
+
await party.open();
|
|
175
|
+
|
|
176
|
+
const feed = await partyFeedProvider.createOrOpenWritableFeed();
|
|
177
|
+
|
|
178
|
+
const itemId = createId();
|
|
179
|
+
await feed.feed.append({
|
|
180
|
+
echo: {
|
|
181
|
+
itemId,
|
|
182
|
+
genesis: {
|
|
183
|
+
itemType: 'dxos:example',
|
|
184
|
+
modelType: ObjectModel.meta.type
|
|
185
|
+
},
|
|
186
|
+
timeframe: new Timeframe()
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test('admit a second feed to the party', async () => {
|
|
194
|
+
const { party, keyring, partyKey, feedStore } = await setup();
|
|
195
|
+
await party.open();
|
|
196
|
+
|
|
197
|
+
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
198
|
+
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
199
|
+
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
200
|
+
|
|
201
|
+
await party.processor.writeHaloMessage(createFeedAdmitMessage(
|
|
202
|
+
keyring,
|
|
203
|
+
party.key,
|
|
204
|
+
feed2.key,
|
|
205
|
+
[partyKey]
|
|
206
|
+
));
|
|
207
|
+
|
|
208
|
+
const itemId = createId();
|
|
209
|
+
await feed2.append({
|
|
210
|
+
echo: {
|
|
211
|
+
itemId,
|
|
212
|
+
genesis: {
|
|
213
|
+
itemType: 'dxos:example',
|
|
214
|
+
modelType: ObjectModel.meta.type
|
|
215
|
+
},
|
|
216
|
+
timeframe: new Timeframe()
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
test('admit feed and then open it', async () => {
|
|
224
|
+
const { party, keyring, partyKey, feedStore } = await setup();
|
|
225
|
+
await party.open();
|
|
226
|
+
|
|
227
|
+
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
228
|
+
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
229
|
+
|
|
230
|
+
await party.processor.writeHaloMessage(createFeedAdmitMessage(
|
|
231
|
+
keyring,
|
|
232
|
+
party.key,
|
|
233
|
+
feedKey.publicKey,
|
|
234
|
+
[partyKey]
|
|
235
|
+
));
|
|
236
|
+
|
|
237
|
+
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
238
|
+
const itemId = createId();
|
|
239
|
+
await feed2.append({
|
|
240
|
+
echo: {
|
|
241
|
+
itemId,
|
|
242
|
+
genesis: {
|
|
243
|
+
itemType: 'dxos:example',
|
|
244
|
+
modelType: ObjectModel.meta.type
|
|
245
|
+
},
|
|
246
|
+
timeframe: new Timeframe()
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test('self-admitting feed with a hint', async () => {
|
|
254
|
+
const { party, keyring, partyKey, feedStore } = await setup();
|
|
255
|
+
await party.open();
|
|
256
|
+
|
|
257
|
+
const feedKey = await keyring.createKeyRecord({ type: KeyType.FEED });
|
|
258
|
+
const fullKey = keyring.getFullKey(feedKey.publicKey);
|
|
259
|
+
const feed2 = await feedStore.openReadWriteFeed(fullKey!.publicKey, fullKey!.secretKey!);
|
|
260
|
+
|
|
261
|
+
await party.processor.takeHints([{
|
|
262
|
+
type: KeyType.FEED,
|
|
263
|
+
publicKey: feedKey.publicKey
|
|
264
|
+
}]);
|
|
265
|
+
|
|
266
|
+
await feed2.append({
|
|
267
|
+
halo: createFeedAdmitMessage(
|
|
268
|
+
keyring,
|
|
269
|
+
party.key,
|
|
270
|
+
feedKey.publicKey,
|
|
271
|
+
[partyKey]
|
|
272
|
+
)
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
const itemId = createId();
|
|
276
|
+
await feed2.append({
|
|
277
|
+
echo: {
|
|
278
|
+
itemId,
|
|
279
|
+
genesis: {
|
|
280
|
+
itemType: 'dxos:example',
|
|
281
|
+
modelType: ObjectModel.meta.type
|
|
282
|
+
},
|
|
283
|
+
timeframe: new Timeframe()
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
await promiseTimeout(party.database.waitForItem({ id: itemId }), 1000, new Error('timeout'));
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
test('two instances replicating', async () => {
|
|
291
|
+
const peer1 = await setup();
|
|
292
|
+
|
|
293
|
+
const storage = createStorage('', StorageType.RAM);
|
|
294
|
+
const feedStore = new FeedStore(storage, { valueEncoding: codec });
|
|
295
|
+
afterTest(async () => feedStore.close());
|
|
296
|
+
|
|
297
|
+
const metadataStore = new MetadataStore(createRamStorage());
|
|
298
|
+
|
|
299
|
+
const modelFactory = new ModelFactory().registerModel(ObjectModel);
|
|
300
|
+
const snapshotStore = new SnapshotStore(createStorage('', StorageType.RAM));
|
|
301
|
+
|
|
302
|
+
const partyFeedProvider = new PartyFeedProvider(metadataStore, peer1.keyring, feedStore, peer1.party.key);
|
|
303
|
+
|
|
304
|
+
const party2 = new PartyCore(
|
|
305
|
+
peer1.party.key,
|
|
306
|
+
partyFeedProvider,
|
|
307
|
+
modelFactory,
|
|
308
|
+
snapshotStore,
|
|
309
|
+
PublicKey.random()
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
const feed2 = await partyFeedProvider.createOrOpenWritableFeed();
|
|
313
|
+
|
|
314
|
+
await peer1.party.processor.writeHaloMessage(createFeedAdmitMessage(
|
|
315
|
+
peer1.keyring,
|
|
316
|
+
peer1.party.key,
|
|
317
|
+
feed2.key,
|
|
318
|
+
[peer1.partyKey]
|
|
319
|
+
));
|
|
320
|
+
|
|
321
|
+
await party2.open([{
|
|
322
|
+
publicKey: peer1.feedKey,
|
|
323
|
+
type: KeyType.FEED
|
|
324
|
+
}]);
|
|
325
|
+
afterTest(async () => party2.close());
|
|
326
|
+
|
|
327
|
+
createTestProtocolPair(
|
|
328
|
+
new ReplicatorProtocolPluginFactory(
|
|
329
|
+
peer1.partyFeedProvider,
|
|
330
|
+
peer1.party.processor.getActiveFeedSet()
|
|
331
|
+
).createPlugins().map(r => r.createExtension()),
|
|
332
|
+
new ReplicatorProtocolPluginFactory(
|
|
333
|
+
partyFeedProvider,
|
|
334
|
+
peer1.party.processor.getActiveFeedSet()
|
|
335
|
+
).createPlugins().map(r => r.createExtension())
|
|
336
|
+
);
|
|
337
|
+
|
|
338
|
+
const item1 = await peer1.party.database.createItem();
|
|
339
|
+
await promiseTimeout(party2.database.waitForItem({ id: item1.id }), 1000, new Error('timeout'));
|
|
340
|
+
});
|
|
118
341
|
});
|
|
@@ -113,9 +113,14 @@ export class PartyCore {
|
|
|
113
113
|
|
|
114
114
|
if (!this._partyProcessor) {
|
|
115
115
|
this._partyProcessor = new PartyProcessor(this._partyKey);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
}
|
|
117
|
+
// Automatically open new admitted feeds.
|
|
118
|
+
this._subscriptions.push(this._partyProcessor.feedAdded.on(feed => {
|
|
119
|
+
void this._feedProvider.createOrOpenReadOnlyFeed(feed);
|
|
120
|
+
}));
|
|
121
|
+
|
|
122
|
+
if (keyHints.length > 0) {
|
|
123
|
+
await this._partyProcessor.takeHints(keyHints);
|
|
119
124
|
}
|
|
120
125
|
|
|
121
126
|
//
|
|
@@ -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,
|
|
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('',
|
|
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('',
|
|
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('',
|
|
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('',
|
|
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);
|
|
@@ -33,7 +33,7 @@ export class PartyProcessor {
|
|
|
33
33
|
|
|
34
34
|
private _outboundHaloStream: FeedWriter<HaloMessage> | undefined;
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
readonly feedAdded = new Event<FeedKey>()
|
|
37
37
|
|
|
38
38
|
public readonly keyOrInfoAdded = new Event<PublicKey>();
|
|
39
39
|
|
|
@@ -50,7 +50,7 @@ export class PartyProcessor {
|
|
|
50
50
|
// TODO(marik-d): Use `Event.wrap` here.
|
|
51
51
|
this._state.on(PartyEventType.ADMIT_FEED, (keyRecord: any) => {
|
|
52
52
|
log(`Feed key admitted ${keyRecord.publicKey.toHex()}`);
|
|
53
|
-
this.
|
|
53
|
+
this.feedAdded.emit(keyRecord.publicKey);
|
|
54
54
|
});
|
|
55
55
|
this._state.on(PartyEventType.ADMIT_KEY, (keyRecord: KeyRecord) => this.keyOrInfoAdded.emit(keyRecord.publicKey));
|
|
56
56
|
this._state.on(IdentityEventType.UPDATE_IDENTITY, (publicKey: PublicKey) => this.keyOrInfoAdded.emit(publicKey));
|
|
@@ -112,7 +112,7 @@ export class PartyProcessor {
|
|
|
112
112
|
getActiveFeedSet (): FeedSetProvider {
|
|
113
113
|
return {
|
|
114
114
|
get: () => this.feedKeys,
|
|
115
|
-
added: this.
|
|
115
|
+
added: this.feedAdded
|
|
116
116
|
};
|
|
117
117
|
}
|
|
118
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,
|
|
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('',
|
|
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));
|
|
@@ -86,7 +86,7 @@ describe('pipeline', () => {
|
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
test('writing', async () => {
|
|
89
|
-
const storage = createStorage('',
|
|
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
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { createStorage,
|
|
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,
|
|
14
|
-
const files = new Map<string,
|
|
13
|
+
const storage = createStorage(root, StorageType.RAM);
|
|
14
|
+
const files = new Map<string, File>();
|
|
15
15
|
|
|
16
16
|
const fn: any = {};
|
|
17
17
|
|