@dxos/client-services 0.4.9-main.a108ade → 0.4.9-main.a3cfaa7
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/lib/browser/{chunk-565CLS7S.mjs → chunk-2YG3XNTV.mjs} +207 -279
- package/dist/lib/browser/chunk-2YG3XNTV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -3
- package/dist/lib/browser/index.mjs.map +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/packlets/testing/index.mjs +6 -15
- package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
- package/dist/lib/node/{chunk-WKOJPBHT.cjs → chunk-WBOCFJUB.cjs} +223 -296
- package/dist/lib/node/chunk-WBOCFJUB.cjs.map +7 -0
- package/dist/lib/node/index.cjs +37 -39
- package/dist/lib/node/index.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/packlets/testing/index.cjs +8 -17
- package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
- package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
- package/dist/types/src/packlets/services/diagnostics.d.ts +1 -1
- package/dist/types/src/packlets/services/diagnostics.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +3 -6
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +1 -5
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +3 -0
- package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +2 -3
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +5 -3
- package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.d.ts +2 -3
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +2 -6
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +1 -1
- package/package.json +34 -37
- package/src/packlets/identity/identity-manager.test.ts +0 -2
- package/src/packlets/identity/identity.test.ts +0 -4
- package/src/packlets/indexing/util.ts +2 -2
- package/src/packlets/invitations/space-invitation-protocol.test.ts +3 -12
- package/src/packlets/invitations/space-invitation-protocol.ts +0 -1
- package/src/packlets/services/automerge-host.test.ts +2 -5
- package/src/packlets/services/diagnostics.ts +5 -44
- package/src/packlets/services/service-context.test.ts +3 -76
- package/src/packlets/services/service-context.ts +5 -18
- package/src/packlets/services/service-host.ts +6 -23
- package/src/packlets/spaces/automerge-space-state.ts +9 -0
- package/src/packlets/spaces/data-space-manager.test.ts +3 -145
- package/src/packlets/spaces/data-space-manager.ts +3 -18
- package/src/packlets/spaces/data-space.ts +11 -43
- package/src/packlets/spaces/spaces-service.test.ts +4 -9
- package/src/packlets/spaces/spaces-service.ts +11 -15
- package/src/packlets/testing/test-builder.ts +4 -26
- package/src/version.ts +1 -1
- package/dist/lib/browser/chunk-565CLS7S.mjs.map +0 -7
- package/dist/lib/node/chunk-WKOJPBHT.cjs.map +0 -7
|
@@ -3,24 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { expect } from 'chai';
|
|
6
|
-
import path from 'node:path';
|
|
7
6
|
|
|
8
7
|
import { asyncTimeout, latch } from '@dxos/async';
|
|
9
|
-
import {
|
|
8
|
+
import { createAdmissionCredentials } from '@dxos/credentials';
|
|
10
9
|
import { AuthStatus } from '@dxos/echo-pipeline';
|
|
11
|
-
import { testLocalDatabase } from '@dxos/echo-pipeline/testing';
|
|
12
10
|
import { writeMessages } from '@dxos/feed-store';
|
|
13
|
-
import { type PublicKey } from '@dxos/keys';
|
|
14
11
|
import { log } from '@dxos/log';
|
|
15
12
|
import { SpaceState } from '@dxos/protocols/proto/dxos/client/services';
|
|
16
|
-
import {
|
|
17
|
-
import { type Epoch } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
18
|
-
import { StorageType } from '@dxos/random-access-storage';
|
|
19
|
-
import { afterTest, describe, openAndClose, test } from '@dxos/test';
|
|
20
|
-
import { Timeframe } from '@dxos/timeframe';
|
|
21
|
-
import { range } from '@dxos/util';
|
|
13
|
+
import { describe, openAndClose, test } from '@dxos/test';
|
|
22
14
|
|
|
23
|
-
import { TestBuilder
|
|
15
|
+
import { TestBuilder } from '../testing';
|
|
24
16
|
|
|
25
17
|
describe('DataSpaceManager', () => {
|
|
26
18
|
test('create space', async () => {
|
|
@@ -103,8 +95,6 @@ describe('DataSpaceManager', () => {
|
|
|
103
95
|
});
|
|
104
96
|
log.break();
|
|
105
97
|
|
|
106
|
-
await syncItemsLocal(space1.dataPipeline, space2.dataPipeline);
|
|
107
|
-
|
|
108
98
|
expect(space1.inner.protocol.sessions.get(peer2.identity.deviceKey)).to.exist;
|
|
109
99
|
expect(space1.inner.protocol.sessions.get(peer2.identity.deviceKey)?.authStatus).to.equal(AuthStatus.SUCCESS);
|
|
110
100
|
expect(space2.inner.protocol.sessions.get(peer1.identity.deviceKey)).to.exist;
|
|
@@ -157,137 +147,6 @@ describe('DataSpaceManager', () => {
|
|
|
157
147
|
await receivedMessage();
|
|
158
148
|
});
|
|
159
149
|
|
|
160
|
-
describe('Epochs', () => {
|
|
161
|
-
test
|
|
162
|
-
.skip('Epoch truncates feeds', async () => {
|
|
163
|
-
const builder = new TestBuilder();
|
|
164
|
-
afterTest(async () => builder.destroy());
|
|
165
|
-
|
|
166
|
-
const peer = builder.createPeer({
|
|
167
|
-
dataStore: typeof window === 'undefined' ? StorageType.NODE : StorageType.WEBFS,
|
|
168
|
-
});
|
|
169
|
-
await peer.createIdentity();
|
|
170
|
-
await openAndClose(peer.dataSpaceManager);
|
|
171
|
-
const space = await peer.dataSpaceManager.createSpace();
|
|
172
|
-
await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
|
|
173
|
-
|
|
174
|
-
const feedDataPath = path.join(space.inner.dataPipeline.pipelineState!.feeds[0].key.toHex(), 'data');
|
|
175
|
-
const directory = peer.storage.createDirectory('feeds');
|
|
176
|
-
const file = directory.getOrCreateFile(feedDataPath);
|
|
177
|
-
afterTest(() => file.close());
|
|
178
|
-
|
|
179
|
-
expect((await file.stat()).size === 0).to.be.true;
|
|
180
|
-
|
|
181
|
-
for (const _ in range(10)) {
|
|
182
|
-
await testLocalDatabase(space.dataPipeline);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
expect((await file.stat()).size !== 0).to.be.true;
|
|
186
|
-
await space.createEpoch();
|
|
187
|
-
expect((await file.stat()).size === 0).to.be.true;
|
|
188
|
-
})
|
|
189
|
-
.onlyEnvironments('nodejs', 'chromium', 'firefox')
|
|
190
|
-
.tag('flaky');
|
|
191
|
-
|
|
192
|
-
test('Loads only last epoch', async () => {
|
|
193
|
-
const builder = new TestBuilder();
|
|
194
|
-
afterTest(async () => builder.destroy());
|
|
195
|
-
|
|
196
|
-
const peer = builder.createPeer();
|
|
197
|
-
await peer.createIdentity();
|
|
198
|
-
const epochsNumber = 10;
|
|
199
|
-
let spaceKey: PublicKey;
|
|
200
|
-
{
|
|
201
|
-
// Create space and create epochs in it.s
|
|
202
|
-
await openAndClose(peer.dataSpaceManager);
|
|
203
|
-
|
|
204
|
-
const space = await peer.dataSpaceManager.createSpace();
|
|
205
|
-
spaceKey = space.key;
|
|
206
|
-
await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
|
|
207
|
-
|
|
208
|
-
for (const _ of range(epochsNumber)) {
|
|
209
|
-
await testLocalDatabase(space.dataPipeline);
|
|
210
|
-
await space.createEpoch();
|
|
211
|
-
}
|
|
212
|
-
await space.close();
|
|
213
|
-
await peer.dataSpaceManager.close();
|
|
214
|
-
peer.props.dataSpaceManager = undefined;
|
|
215
|
-
}
|
|
216
|
-
{
|
|
217
|
-
// Load same space and check if it loads only last epoch.s
|
|
218
|
-
await openAndClose(peer.dataSpaceManager);
|
|
219
|
-
|
|
220
|
-
const space = peer.dataSpaceManager.spaces.get(spaceKey)!;
|
|
221
|
-
|
|
222
|
-
const epochs: number[] = [];
|
|
223
|
-
space.dataPipeline.onNewEpoch.on((epoch: SpecificCredential<Epoch>) => {
|
|
224
|
-
epochs.push(epoch.subject.assertion.number);
|
|
225
|
-
});
|
|
226
|
-
const processedFirstEpoch = space.dataPipeline.onNewEpoch.waitFor(() => true);
|
|
227
|
-
|
|
228
|
-
await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
|
|
229
|
-
|
|
230
|
-
await processedFirstEpoch;
|
|
231
|
-
expect(epochs).to.deep.equal([epochsNumber]);
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
test('Items are cleared before epoch applied', async () => {
|
|
236
|
-
const builder = new TestBuilder();
|
|
237
|
-
afterTest(async () => builder.destroy());
|
|
238
|
-
const peer = builder.createPeer();
|
|
239
|
-
await peer.createIdentity();
|
|
240
|
-
await openAndClose(peer.dataSpaceManager);
|
|
241
|
-
|
|
242
|
-
// Create space and fill it with Items.
|
|
243
|
-
const space = await peer.dataSpaceManager.createSpace();
|
|
244
|
-
await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
|
|
245
|
-
const itemsNumber = 2;
|
|
246
|
-
for (const _ of range(itemsNumber)) {
|
|
247
|
-
await testLocalDatabase(space.dataPipeline);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Create empty Epoch and check if it clears items.
|
|
251
|
-
{
|
|
252
|
-
const processedFirstEpoch = space.dataPipeline.onNewEpoch.waitFor(
|
|
253
|
-
(epoch) => epoch.subject.assertion.number === 1,
|
|
254
|
-
);
|
|
255
|
-
|
|
256
|
-
// Empty snapshot.
|
|
257
|
-
const snapshot: SpaceSnapshot = {
|
|
258
|
-
spaceKey: space.key.asUint8Array(),
|
|
259
|
-
timeframe: space.inner.dataPipeline.pipelineState!.timeframe,
|
|
260
|
-
database: {},
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
const snapshotCid = await peer.snapshotStore.saveSnapshot(snapshot);
|
|
264
|
-
|
|
265
|
-
const epoch: Epoch = {
|
|
266
|
-
previousId: space.dataPipeline.currentEpoch?.id,
|
|
267
|
-
timeframe: space.inner.dataPipeline.pipelineState!.timeframe,
|
|
268
|
-
number: (space.dataPipeline.currentEpoch?.subject.assertion as Epoch).number + 1,
|
|
269
|
-
snapshotCid,
|
|
270
|
-
};
|
|
271
|
-
|
|
272
|
-
const receipt = await space.inner.controlPipeline.writer.write({
|
|
273
|
-
credential: {
|
|
274
|
-
credential: await peer.props.signingContext!.credentialSigner.createCredential({
|
|
275
|
-
subject: space.key,
|
|
276
|
-
assertion: {
|
|
277
|
-
'@type': 'dxos.halo.credentials.Epoch',
|
|
278
|
-
...epoch,
|
|
279
|
-
},
|
|
280
|
-
}),
|
|
281
|
-
},
|
|
282
|
-
});
|
|
283
|
-
await space.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe([[receipt.feedKey, receipt.seq]]));
|
|
284
|
-
await processedFirstEpoch;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
expect(Array.from(space.dataPipeline.itemManager.entities.keys()).length).to.equal(0);
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
|
|
291
150
|
describe('activation', () => {
|
|
292
151
|
test('can activate and deactivate a space', async () => {
|
|
293
152
|
const builder = new TestBuilder();
|
|
@@ -308,7 +167,6 @@ describe('DataSpaceManager', () => {
|
|
|
308
167
|
space.stateUpdate.waitForCondition(() => space.state === SpaceState.READY),
|
|
309
168
|
500,
|
|
310
169
|
);
|
|
311
|
-
await testLocalDatabase(space.dataPipeline);
|
|
312
170
|
});
|
|
313
171
|
});
|
|
314
172
|
});
|
|
@@ -3,15 +3,9 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Event, synchronized, trackLeaks } from '@dxos/async';
|
|
6
|
-
import {
|
|
7
|
-
import { type CredentialSigner
|
|
8
|
-
import {
|
|
9
|
-
type AutomergeHost,
|
|
10
|
-
type DataServiceSubscriptions,
|
|
11
|
-
type MetadataStore,
|
|
12
|
-
type Space,
|
|
13
|
-
type SpaceManager,
|
|
14
|
-
} from '@dxos/echo-pipeline';
|
|
6
|
+
import { Context, cancelWithContext } from '@dxos/context';
|
|
7
|
+
import { getCredentialAssertion, type CredentialSigner } from '@dxos/credentials';
|
|
8
|
+
import { type AutomergeHost, type MetadataStore, type Space, type SpaceManager } from '@dxos/echo-pipeline';
|
|
15
9
|
import { type FeedStore } from '@dxos/feed-store';
|
|
16
10
|
import { invariant } from '@dxos/invariant';
|
|
17
11
|
import { type Keyring } from '@dxos/keyring';
|
|
@@ -80,7 +74,6 @@ export class DataSpaceManager {
|
|
|
80
74
|
constructor(
|
|
81
75
|
private readonly _spaceManager: SpaceManager,
|
|
82
76
|
private readonly _metadataStore: MetadataStore,
|
|
83
|
-
private readonly _dataServiceSubscriptions: DataServiceSubscriptions,
|
|
84
77
|
private readonly _keyring: Keyring,
|
|
85
78
|
private readonly _signingContext: SigningContext,
|
|
86
79
|
private readonly _feedStore: FeedStore<FeedMessage>,
|
|
@@ -270,10 +263,6 @@ export class DataSpaceManager {
|
|
|
270
263
|
callbacks: {
|
|
271
264
|
beforeReady: async () => {
|
|
272
265
|
log('before space ready', { space: space.key });
|
|
273
|
-
await this._dataServiceSubscriptions.registerSpace(
|
|
274
|
-
space.key,
|
|
275
|
-
dataSpace.dataPipeline.databaseHost!.createDataServiceHost(),
|
|
276
|
-
);
|
|
277
266
|
},
|
|
278
267
|
afterReady: async () => {
|
|
279
268
|
log('after space ready', { space: space.key, open: this._isOpen });
|
|
@@ -283,7 +272,6 @@ export class DataSpaceManager {
|
|
|
283
272
|
},
|
|
284
273
|
beforeClose: async () => {
|
|
285
274
|
log('before space close', { space: space.key });
|
|
286
|
-
await this._dataServiceSubscriptions.unregisterSpace(space.key);
|
|
287
275
|
},
|
|
288
276
|
},
|
|
289
277
|
cache: metadata.cache,
|
|
@@ -297,9 +285,6 @@ export class DataSpaceManager {
|
|
|
297
285
|
if (metadata.controlTimeframe) {
|
|
298
286
|
dataSpace.inner.controlPipeline.state.setTargetTimeframe(metadata.controlTimeframe);
|
|
299
287
|
}
|
|
300
|
-
if (metadata.dataTimeframe) {
|
|
301
|
-
dataSpace.dataPipeline.setTargetTimeframe(metadata.dataTimeframe);
|
|
302
|
-
}
|
|
303
288
|
|
|
304
289
|
this._spaces.set(metadata.key, dataSpace);
|
|
305
290
|
return dataSpace;
|
|
@@ -6,14 +6,7 @@ import { Event, asyncTimeout, scheduleTask, sleep, synchronized, trackLeaks } fr
|
|
|
6
6
|
import { AUTH_TIMEOUT } from '@dxos/client-protocol';
|
|
7
7
|
import { cancelWithContext, Context, ContextDisposedError } from '@dxos/context';
|
|
8
8
|
import { timed, warnAfterTimeout } from '@dxos/debug';
|
|
9
|
-
import {
|
|
10
|
-
type MetadataStore,
|
|
11
|
-
type Space,
|
|
12
|
-
createMappedFeedWriter,
|
|
13
|
-
type DataPipeline,
|
|
14
|
-
type CreateEpochOptions,
|
|
15
|
-
type AutomergeHost,
|
|
16
|
-
} from '@dxos/echo-pipeline';
|
|
9
|
+
import { type MetadataStore, type Space, createMappedFeedWriter, type AutomergeHost } from '@dxos/echo-pipeline';
|
|
17
10
|
import { type FeedStore } from '@dxos/feed-store';
|
|
18
11
|
import { failedInvariant, invariant } from '@dxos/invariant';
|
|
19
12
|
import { type Keyring } from '@dxos/keyring';
|
|
@@ -71,11 +64,9 @@ export type DataSpaceParams = {
|
|
|
71
64
|
automergeHost: AutomergeHost;
|
|
72
65
|
};
|
|
73
66
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// TODO(dmaretskyi): Disabled till better times https://github.com/dxos/dxos/issues/3949.
|
|
78
|
-
const ENABLE_FEED_PURGE = false;
|
|
67
|
+
export type CreateEpochOptions = {
|
|
68
|
+
migration?: CreateEpochRequest.Migration;
|
|
69
|
+
};
|
|
79
70
|
|
|
80
71
|
@trackLeaks('open', 'close')
|
|
81
72
|
@trace.resource()
|
|
@@ -160,10 +151,6 @@ export class DataSpace {
|
|
|
160
151
|
return this._inner;
|
|
161
152
|
}
|
|
162
153
|
|
|
163
|
-
get dataPipeline(): DataPipeline {
|
|
164
|
-
return this._inner.dataPipeline;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
154
|
get presence() {
|
|
168
155
|
return this._presence;
|
|
169
156
|
}
|
|
@@ -278,20 +265,8 @@ export class DataSpace {
|
|
|
278
265
|
|
|
279
266
|
this._automergeSpaceState.startProcessingRootDocs();
|
|
280
267
|
|
|
281
|
-
await this._inner.initializeDataPipeline();
|
|
282
|
-
|
|
283
|
-
this.metrics.dataPipelineOpen = new Date();
|
|
284
|
-
|
|
285
268
|
// Wait for the first epoch.
|
|
286
|
-
await cancelWithContext(this._ctx, this.
|
|
287
|
-
|
|
288
|
-
log('waiting for data pipeline to reach target timeframe');
|
|
289
|
-
// Wait for the data pipeline to catch up to its desired timeframe.
|
|
290
|
-
await this._inner.dataPipeline.pipelineState!.waitUntilReachedTargetTimeframe({
|
|
291
|
-
ctx: this._ctx,
|
|
292
|
-
breakOnStall: false,
|
|
293
|
-
});
|
|
294
|
-
this.metrics.dataPipelineReady = new Date();
|
|
269
|
+
await cancelWithContext(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
|
|
295
270
|
|
|
296
271
|
log('data pipeline ready');
|
|
297
272
|
await this._callbacks.beforeReady?.();
|
|
@@ -426,7 +401,12 @@ export class DataSpace {
|
|
|
426
401
|
case CreateEpochRequest.Migration.NONE:
|
|
427
402
|
{
|
|
428
403
|
// TODO(dmaretskyi): Unify epoch construction.
|
|
429
|
-
epoch =
|
|
404
|
+
epoch = {
|
|
405
|
+
previousId: this._automergeSpaceState.lastEpoch?.id,
|
|
406
|
+
number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
|
|
407
|
+
timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe(),
|
|
408
|
+
automergeRoot: this._automergeSpaceState.lastEpoch?.subject.assertion?.automergeRoot,
|
|
409
|
+
};
|
|
430
410
|
}
|
|
431
411
|
break;
|
|
432
412
|
case CreateEpochRequest.Migration.INIT_AUTOMERGE:
|
|
@@ -476,18 +456,6 @@ export class DataSpace {
|
|
|
476
456
|
});
|
|
477
457
|
|
|
478
458
|
await this.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe([[receipt.feedKey, receipt.seq]]));
|
|
479
|
-
|
|
480
|
-
// Clear feed blocks before epoch.
|
|
481
|
-
if (ENABLE_FEED_PURGE) {
|
|
482
|
-
for (const feed of this.inner.dataPipeline.pipelineState?.feeds ?? []) {
|
|
483
|
-
const indexBeforeEpoch = epoch.timeframe.get(feed.key);
|
|
484
|
-
if (indexBeforeEpoch === undefined) {
|
|
485
|
-
continue;
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
await feed.safeClear(0, indexBeforeEpoch + 1);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
459
|
}
|
|
492
460
|
|
|
493
461
|
@synchronized
|
|
@@ -24,15 +24,10 @@ describe('SpacesService', () => {
|
|
|
24
24
|
beforeEach(async () => {
|
|
25
25
|
serviceContext = createServiceContext();
|
|
26
26
|
await serviceContext.open(new Context());
|
|
27
|
-
spacesService = new SpacesServiceImpl(
|
|
28
|
-
serviceContext.
|
|
29
|
-
serviceContext.
|
|
30
|
-
|
|
31
|
-
async () => {
|
|
32
|
-
await serviceContext.initialized.wait();
|
|
33
|
-
return serviceContext.dataSpaceManager!;
|
|
34
|
-
},
|
|
35
|
-
);
|
|
27
|
+
spacesService = new SpacesServiceImpl(serviceContext.identityManager, serviceContext.spaceManager, async () => {
|
|
28
|
+
await serviceContext.initialized.wait();
|
|
29
|
+
return serviceContext.dataSpaceManager!;
|
|
30
|
+
});
|
|
36
31
|
});
|
|
37
32
|
|
|
38
33
|
afterEach(async () => {
|
|
@@ -6,18 +6,18 @@ import { EventSubscriptions, UpdateScheduler, scheduleTask } from '@dxos/async';
|
|
|
6
6
|
import { Stream } from '@dxos/codec-protobuf';
|
|
7
7
|
import { type CredentialProcessor } from '@dxos/credentials';
|
|
8
8
|
import { raise } from '@dxos/debug';
|
|
9
|
-
import { type
|
|
9
|
+
import { type SpaceManager } from '@dxos/echo-pipeline';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { log } from '@dxos/log';
|
|
12
12
|
import { ApiError, SpaceNotFoundError, encodeError } from '@dxos/protocols';
|
|
13
13
|
import {
|
|
14
|
+
SpaceMember,
|
|
15
|
+
SpaceState,
|
|
14
16
|
type CreateEpochRequest,
|
|
15
17
|
type PostMessageRequest,
|
|
16
18
|
type QueryCredentialsRequest,
|
|
17
19
|
type QuerySpacesResponse,
|
|
18
20
|
type Space,
|
|
19
|
-
SpaceMember,
|
|
20
|
-
SpaceState,
|
|
21
21
|
type SpacesService,
|
|
22
22
|
type SubscribeMessagesRequest,
|
|
23
23
|
type UpdateSpaceRequest,
|
|
@@ -35,7 +35,6 @@ export class SpacesServiceImpl implements SpacesService {
|
|
|
35
35
|
constructor(
|
|
36
36
|
private readonly _identityManager: IdentityManager,
|
|
37
37
|
private readonly _spaceManager: SpaceManager,
|
|
38
|
-
private readonly _dataServiceSubscriptions: DataServiceSubscriptions,
|
|
39
38
|
private readonly _getDataSpaceManager: Provider<Promise<DataSpaceManager>>,
|
|
40
39
|
) {}
|
|
41
40
|
|
|
@@ -96,13 +95,10 @@ export class SpacesServiceImpl implements SpacesService {
|
|
|
96
95
|
subscriptions.add(space.stateUpdate.on(ctx, () => scheduler.forceTrigger()));
|
|
97
96
|
|
|
98
97
|
subscriptions.add(space.presence.updated.on(ctx, () => scheduler.trigger()));
|
|
99
|
-
subscriptions.add(space.
|
|
98
|
+
subscriptions.add(space.automergeSpaceState.onNewEpoch.on(ctx, () => scheduler.trigger()));
|
|
100
99
|
|
|
101
100
|
// Pipeline progress.
|
|
102
101
|
subscriptions.add(space.inner.controlPipeline.state.timeframeUpdate.on(ctx, () => scheduler.trigger()));
|
|
103
|
-
if (space.dataPipeline.pipelineState) {
|
|
104
|
-
subscriptions.add(space.dataPipeline.pipelineState.timeframeUpdate.on(ctx, () => scheduler.trigger()));
|
|
105
|
-
}
|
|
106
102
|
}
|
|
107
103
|
};
|
|
108
104
|
|
|
@@ -190,19 +186,19 @@ export class SpacesServiceImpl implements SpacesService {
|
|
|
190
186
|
state: space.state,
|
|
191
187
|
error: space.error ? encodeError(space.error) : undefined,
|
|
192
188
|
pipeline: {
|
|
193
|
-
currentEpoch: space.
|
|
194
|
-
appliedEpoch: space.
|
|
189
|
+
currentEpoch: space.automergeSpaceState.lastEpoch,
|
|
190
|
+
appliedEpoch: space.automergeSpaceState.lastEpoch,
|
|
195
191
|
|
|
196
192
|
controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),
|
|
197
193
|
currentControlTimeframe: space.inner.controlPipeline.state.timeframe,
|
|
198
194
|
targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,
|
|
199
195
|
totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe,
|
|
200
196
|
|
|
201
|
-
dataFeeds:
|
|
202
|
-
startDataTimeframe:
|
|
203
|
-
currentDataTimeframe:
|
|
204
|
-
targetDataTimeframe:
|
|
205
|
-
totalDataTimeframe:
|
|
197
|
+
dataFeeds: undefined,
|
|
198
|
+
startDataTimeframe: undefined,
|
|
199
|
+
currentDataTimeframe: undefined,
|
|
200
|
+
targetDataTimeframe: undefined,
|
|
201
|
+
totalDataTimeframe: undefined,
|
|
206
202
|
},
|
|
207
203
|
members: Array.from(space.inner.spaceState.members.values()).map((member) => {
|
|
208
204
|
const peers = space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key));
|
|
@@ -6,24 +6,15 @@ import { type Config } from '@dxos/config';
|
|
|
6
6
|
import { Context } from '@dxos/context';
|
|
7
7
|
import { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';
|
|
8
8
|
import { failUndefined } from '@dxos/debug';
|
|
9
|
-
import {
|
|
10
|
-
SnapshotStore,
|
|
11
|
-
type DataPipeline,
|
|
12
|
-
MetadataStore,
|
|
13
|
-
SpaceManager,
|
|
14
|
-
valueEncoding,
|
|
15
|
-
DataServiceSubscriptions,
|
|
16
|
-
AutomergeHost,
|
|
17
|
-
} from '@dxos/echo-pipeline';
|
|
18
|
-
import { testLocalDatabase } from '@dxos/echo-pipeline/testing';
|
|
9
|
+
import { AutomergeHost, MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from '@dxos/echo-pipeline';
|
|
19
10
|
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
20
11
|
import { Keyring } from '@dxos/keyring';
|
|
21
12
|
import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
|
|
22
13
|
import { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';
|
|
23
|
-
import { createStorage, type Storage
|
|
14
|
+
import { createStorage, StorageType, type Storage } from '@dxos/random-access-storage';
|
|
24
15
|
import { BlobStore } from '@dxos/teleport-extension-object-sync';
|
|
25
16
|
|
|
26
|
-
import { ClientServicesHost,
|
|
17
|
+
import { ClientServicesHost, ServiceContext } from '../services';
|
|
27
18
|
import { DataSpaceManager, type SigningContext } from '../spaces';
|
|
28
19
|
|
|
29
20
|
//
|
|
@@ -51,8 +42,7 @@ export const createServiceContext = ({
|
|
|
51
42
|
transportFactory: MemoryTransportFactory,
|
|
52
43
|
});
|
|
53
44
|
|
|
54
|
-
|
|
55
|
-
return new ServiceContext(storage, networkManager, signalManager, modelFactory);
|
|
45
|
+
return new ServiceContext(storage, networkManager, signalManager);
|
|
56
46
|
};
|
|
57
47
|
|
|
58
48
|
export const createPeers = async (numPeers: number) => {
|
|
@@ -72,16 +62,6 @@ export const createIdentity = async (peer: ServiceContext) => {
|
|
|
72
62
|
return peer;
|
|
73
63
|
};
|
|
74
64
|
|
|
75
|
-
// TODO(burdon): Remove @dxos/client-testing.
|
|
76
|
-
// TODO(burdon): Create builder and make configurable.
|
|
77
|
-
/**
|
|
78
|
-
* @deprecated
|
|
79
|
-
*/
|
|
80
|
-
export const syncItemsLocal = async (db1: DataPipeline, db2: DataPipeline) => {
|
|
81
|
-
await testLocalDatabase(db1, db2);
|
|
82
|
-
await testLocalDatabase(db2, db1);
|
|
83
|
-
};
|
|
84
|
-
|
|
85
65
|
export class TestBuilder {
|
|
86
66
|
public readonly signalContext = new MemorySignalManagerContext();
|
|
87
67
|
private readonly _ctx = new Context();
|
|
@@ -171,7 +151,6 @@ export class TestPeer {
|
|
|
171
151
|
feedStore: this.feedStore,
|
|
172
152
|
networkManager: this.networkManager,
|
|
173
153
|
metadataStore: this.metadataStore,
|
|
174
|
-
modelFactory: createDefaultModelFactory(),
|
|
175
154
|
snapshotStore: this.snapshotStore,
|
|
176
155
|
blobStore: this.blobStore,
|
|
177
156
|
}));
|
|
@@ -189,7 +168,6 @@ export class TestPeer {
|
|
|
189
168
|
return (this._props.dataSpaceManager ??= new DataSpaceManager(
|
|
190
169
|
this.spaceManager,
|
|
191
170
|
this.metadataStore,
|
|
192
|
-
new DataServiceSubscriptions(),
|
|
193
171
|
this.keyring,
|
|
194
172
|
this.identity,
|
|
195
173
|
this.feedStore,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const DXOS_VERSION = "0.4.9-main.
|
|
1
|
+
export const DXOS_VERSION = "0.4.9-main.a3cfaa7";
|