@dxos/echo-pipeline 0.5.0 → 0.5.1-main.0ba1ecb
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-KMWJLYEQ.mjs → chunk-VQQD32DM.mjs} +18 -18
- package/dist/lib/browser/{chunk-KMWJLYEQ.mjs.map → chunk-VQQD32DM.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +471 -189
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +2 -8
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/{chunk-YZA42CKA.cjs → chunk-P7L7ICAH.cjs} +21 -21
- package/dist/lib/node/{chunk-YZA42CKA.cjs.map → chunk-P7L7ICAH.cjs.map} +3 -3
- package/dist/lib/node/index.cjs +482 -207
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +13 -18
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/automerge/automerge-doc-loader.d.ts +3 -3
- package/dist/types/src/automerge/automerge-doc-loader.d.ts.map +1 -1
- package/dist/types/src/automerge/automerge-host.d.ts +15 -6
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts +26 -0
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -0
- package/dist/types/src/automerge/echo-replicator.d.ts +43 -0
- package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -0
- package/dist/types/src/automerge/index.d.ts +1 -2
- package/dist/types/src/automerge/index.d.ts.map +1 -1
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +3 -2
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/migrations.d.ts +1 -1
- package/dist/types/src/automerge/migrations.d.ts.map +1 -1
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/space/control-pipeline.d.ts +1 -1
- package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +0 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/package.json +33 -30
- package/src/automerge/automerge-doc-loader.test.ts +1 -1
- package/src/automerge/automerge-doc-loader.ts +26 -16
- package/src/automerge/automerge-host.test.ts +33 -16
- package/src/automerge/automerge-host.ts +105 -21
- package/src/automerge/automerge-repo.test.ts +38 -6
- package/src/automerge/echo-network-adapter.ts +155 -0
- package/src/automerge/echo-replicator.ts +56 -0
- package/src/automerge/index.ts +1 -2
- package/src/automerge/leveldb-storage-adapter.ts +2 -2
- package/src/automerge/migrations.ts +1 -1
- package/src/automerge/storage-adapter.test.ts +1 -1
- package/src/pipeline/pipeline.ts +1 -0
- package/src/space/control-pipeline.ts +2 -2
- package/src/testing/index.ts +0 -1
- package/dist/types/src/automerge/level.test.d.ts +0 -2
- package/dist/types/src/automerge/level.test.d.ts.map +0 -1
- package/dist/types/src/automerge/reference.d.ts +0 -15
- package/dist/types/src/automerge/reference.d.ts.map +0 -1
- package/dist/types/src/automerge/types.d.ts +0 -73
- package/dist/types/src/automerge/types.d.ts.map +0 -1
- package/dist/types/src/testing/level.d.ts +0 -3
- package/dist/types/src/testing/level.d.ts.map +0 -1
- package/src/automerge/level.test.ts +0 -82
- package/src/automerge/reference.ts +0 -31
- package/src/automerge/types.ts +0 -86
- package/src/testing/level.ts +0 -11
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Message } from '@dxos/automerge/automerge-repo';
|
|
6
|
+
|
|
7
|
+
export interface EchoReplicator {
|
|
8
|
+
/**
|
|
9
|
+
* Called on when replicator is added to EchoHost.
|
|
10
|
+
*/
|
|
11
|
+
connect(context: EchoReplicatorContext): Promise<void>;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Called on when replicator is removed from EchoHost.
|
|
15
|
+
*/
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface EchoReplicatorContext {
|
|
20
|
+
/**
|
|
21
|
+
* Our own peer id.
|
|
22
|
+
*/
|
|
23
|
+
get peerId(): string;
|
|
24
|
+
|
|
25
|
+
onConnectionOpen(connection: ReplicatorConnection): void;
|
|
26
|
+
|
|
27
|
+
onConnectionClosed(connection: ReplicatorConnection): void;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ReplicatorConnection {
|
|
31
|
+
/**
|
|
32
|
+
* Remove peer id.
|
|
33
|
+
*/
|
|
34
|
+
get peerId(): string;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Stream to read messages coming from the remote peer.
|
|
38
|
+
*/
|
|
39
|
+
readable: ReadableStream<Message>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Stream to write messages to the remote peer.
|
|
43
|
+
*/
|
|
44
|
+
writable: WritableStream<Message>;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* @returns true if the document should be advertized to this peer.
|
|
48
|
+
*
|
|
49
|
+
* The remote peer can still request the document by it's id bypassing this check.
|
|
50
|
+
*/
|
|
51
|
+
shouldAdvertize(params: ShouldAdvertizeParams): Promise<boolean>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type ShouldAdvertizeParams = {
|
|
55
|
+
documentId: string;
|
|
56
|
+
};
|
package/src/automerge/index.ts
CHANGED
|
@@ -8,5 +8,4 @@ export * from './automerge-doc-loader';
|
|
|
8
8
|
export * from './leveldb-storage-adapter';
|
|
9
9
|
export * from './local-host-network-adapter';
|
|
10
10
|
export * from './mesh-network-adapter';
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './reference';
|
|
11
|
+
export * from './echo-replicator';
|
|
@@ -6,10 +6,9 @@ import { type MixedEncoding } from 'level-transcoder';
|
|
|
6
6
|
|
|
7
7
|
import { type StorageAdapterInterface, type Chunk, type StorageKey } from '@dxos/automerge/automerge-repo';
|
|
8
8
|
import { LifecycleState, Resource } from '@dxos/context';
|
|
9
|
+
import { type BatchLevel, type SubLevelDB } from '@dxos/kv-store';
|
|
9
10
|
import { type MaybePromise } from '@dxos/util';
|
|
10
11
|
|
|
11
|
-
import { type BatchLevel, type SubLevelDB } from './types';
|
|
12
|
-
|
|
13
12
|
export type LevelDBStorageAdapterParams = {
|
|
14
13
|
db: SubLevelDB;
|
|
15
14
|
callbacks?: StorageCallbacks;
|
|
@@ -107,6 +106,7 @@ const keyEncoder: MixedEncoding<StorageKey, Uint8Array, StorageKey> = {
|
|
|
107
106
|
.toString()
|
|
108
107
|
.split('-')
|
|
109
108
|
.map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%')),
|
|
109
|
+
format: 'buffer',
|
|
110
110
|
};
|
|
111
111
|
|
|
112
112
|
export const encodingOptions = {
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
import { type StorageKey } from '@dxos/automerge/automerge-repo';
|
|
6
6
|
import { IndexedDBStorageAdapter } from '@dxos/automerge/automerge-repo-storage-indexeddb';
|
|
7
|
+
import { type SubLevelDB } from '@dxos/kv-store';
|
|
7
8
|
import { log } from '@dxos/log';
|
|
8
9
|
import { StorageType, type Directory } from '@dxos/random-access-storage';
|
|
9
10
|
|
|
10
11
|
import { AutomergeStorageAdapter } from './automerge-storage-adapter';
|
|
11
12
|
import { encodingOptions } from './leveldb-storage-adapter';
|
|
12
|
-
import { type SubLevelDB } from './types';
|
|
13
13
|
|
|
14
14
|
export const levelMigration = async ({ db, directory }: { db: SubLevelDB; directory: Directory }) => {
|
|
15
15
|
// Note: Make automigration from previous storage to leveldb here.
|
|
@@ -6,13 +6,13 @@ import { expect } from 'chai';
|
|
|
6
6
|
|
|
7
7
|
import { type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
|
+
import { createTestLevel } from '@dxos/kv-store/testing';
|
|
9
10
|
import { StorageType, createStorage } from '@dxos/random-access-storage';
|
|
10
11
|
import { afterTest, describe, openAndClose, test } from '@dxos/test';
|
|
11
12
|
import { type MaybePromise } from '@dxos/util';
|
|
12
13
|
|
|
13
14
|
import { AutomergeStorageAdapter } from './automerge-storage-adapter';
|
|
14
15
|
import { LevelDBStorageAdapter } from './leveldb-storage-adapter';
|
|
15
|
-
import { createTestLevel } from '../testing';
|
|
16
16
|
|
|
17
17
|
const runTests = (
|
|
18
18
|
testNamespace: string,
|
package/src/pipeline/pipeline.ts
CHANGED
|
@@ -54,7 +54,7 @@ export class ControlPipeline {
|
|
|
54
54
|
private _lastTimeframeSaveTime: number = Date.now();
|
|
55
55
|
|
|
56
56
|
public readonly onFeedAdmitted = new Callback<AsyncCallback<FeedInfo>>();
|
|
57
|
-
public readonly
|
|
57
|
+
public readonly onMemberRoleChanged: Callback<AsyncCallback<MemberInfo[]>>;
|
|
58
58
|
public readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;
|
|
59
59
|
public readonly onDelegatedInvitation: Callback<AsyncCallback<DelegateInvitationCredential>>;
|
|
60
60
|
public readonly onDelegatedInvitationRemoved: Callback<AsyncCallback<DelegateInvitationCredential>>;
|
|
@@ -98,7 +98,7 @@ export class ControlPipeline {
|
|
|
98
98
|
await this.onFeedAdmitted.callIfSet(info);
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
this.
|
|
101
|
+
this.onMemberRoleChanged = this._spaceStateMachine.onMemberRoleChanged;
|
|
102
102
|
this.onCredentialProcessed = this._spaceStateMachine.onCredentialProcessed;
|
|
103
103
|
this.onDelegatedInvitation = this._spaceStateMachine.onDelegatedInvitation;
|
|
104
104
|
this.onDelegatedInvitationRemoved = this._spaceStateMachine.onDelegatedInvitationRemoved;
|
package/src/testing/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"level.test.d.ts","sourceRoot":"","sources":["../../../../src/automerge/level.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Reference } from '@dxos/echo-schema';
|
|
2
|
-
export declare const REFERENCE_TYPE_TAG = "dxos.echo.model.document.Reference";
|
|
3
|
-
/**
|
|
4
|
-
* Reference as it is stored in Automerge document.
|
|
5
|
-
*/
|
|
6
|
-
export type EncodedReferenceObject = {
|
|
7
|
-
'@type': typeof REFERENCE_TYPE_TAG;
|
|
8
|
-
itemId: string | null;
|
|
9
|
-
protocol: string | null;
|
|
10
|
-
host: string | null;
|
|
11
|
-
};
|
|
12
|
-
export declare const encodeReference: (reference: Reference) => EncodedReferenceObject;
|
|
13
|
-
export declare const decodeReference: (value: any) => Reference;
|
|
14
|
-
export declare const isEncodedReferenceObject: (value: any) => value is EncodedReferenceObject;
|
|
15
|
-
//# sourceMappingURL=reference.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../../../src/automerge/reference.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,eAAO,MAAM,kBAAkB,uCAAuC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,kBAAkB,CAAC;IACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,sBAMrD,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,GAAG,cACyC,CAAC;AAEpF,eAAO,MAAM,wBAAwB,UAAW,GAAG,oCACmC,CAAC"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { type AbstractChainedBatch, type AbstractSublevel } from 'abstract-level';
|
|
3
|
-
import { type Level } from 'level';
|
|
4
|
-
import { type EncodedReferenceObject } from './reference';
|
|
5
|
-
export type SpaceState = {
|
|
6
|
-
rootUrl?: string;
|
|
7
|
-
};
|
|
8
|
-
export interface SpaceDoc {
|
|
9
|
-
access?: {
|
|
10
|
-
spaceKey: string;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Objects inlined in the current document.
|
|
14
|
-
*/
|
|
15
|
-
objects?: {
|
|
16
|
-
[key: string]: ObjectStructure;
|
|
17
|
-
};
|
|
18
|
-
/**
|
|
19
|
-
* Object id points to an automerge doc url where the object is embedded.
|
|
20
|
-
*/
|
|
21
|
-
links?: {
|
|
22
|
-
[echoId: string]: string;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Representation of an ECHO object in an AM document.
|
|
27
|
-
*/
|
|
28
|
-
export type ObjectStructure = {
|
|
29
|
-
data: Record<string, any>;
|
|
30
|
-
meta: ObjectMeta;
|
|
31
|
-
system: ObjectSystem;
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* Echo object metadata.
|
|
35
|
-
*/
|
|
36
|
-
export type ObjectMeta = {
|
|
37
|
-
/**
|
|
38
|
-
* Foreign keys.
|
|
39
|
-
*/
|
|
40
|
-
keys: ForeignKey[];
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Reference to an object in a foreign database.
|
|
44
|
-
*/
|
|
45
|
-
export type ForeignKey = {
|
|
46
|
-
/**
|
|
47
|
-
* Name of the foreign database/system.
|
|
48
|
-
* E.g. `github.com`.
|
|
49
|
-
*/
|
|
50
|
-
source?: string;
|
|
51
|
-
/**
|
|
52
|
-
* Id within the foreign database.
|
|
53
|
-
*/
|
|
54
|
-
id?: string;
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* Automerge object system properties.
|
|
58
|
-
* (Is automerge specific.)
|
|
59
|
-
*/
|
|
60
|
-
export type ObjectSystem = {
|
|
61
|
-
/**
|
|
62
|
-
* Deletion marker.
|
|
63
|
-
*/
|
|
64
|
-
deleted?: boolean;
|
|
65
|
-
/**
|
|
66
|
-
* Object reference ('protobuf' protocol) type.
|
|
67
|
-
*/
|
|
68
|
-
type?: EncodedReferenceObject;
|
|
69
|
-
};
|
|
70
|
-
export type LevelDB = Level<string, string>;
|
|
71
|
-
export type SubLevelDB = AbstractSublevel<any, string | Buffer | Uint8Array, string, string>;
|
|
72
|
-
export type BatchLevel = AbstractChainedBatch<any, string, string>;
|
|
73
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/automerge/types.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;OAEG;IACH,OAAO,CAAC,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;KAChC,CAAC;IACF;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7F,MAAM,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../../../src/testing/level.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,eAAO,MAAM,eAAe,QAAO,OAA+E,CAAC"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { expect } from 'chai';
|
|
6
|
-
import { Level } from 'level';
|
|
7
|
-
|
|
8
|
-
import { PublicKey } from '@dxos/keys';
|
|
9
|
-
import { describe, openAndClose, test } from '@dxos/test';
|
|
10
|
-
|
|
11
|
-
import { type SubLevelDB } from './types';
|
|
12
|
-
import { createTestLevel } from '../testing';
|
|
13
|
-
|
|
14
|
-
describe('Level', () => {
|
|
15
|
-
test('missing keys', async () => {
|
|
16
|
-
const level = createTestLevel();
|
|
17
|
-
await openAndClose(level);
|
|
18
|
-
|
|
19
|
-
expect(() => level.get('missing')).to.throw;
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
test('data persistance after reload', async () => {
|
|
23
|
-
const path = `/tmp/dxos-${PublicKey.random().toHex()}`;
|
|
24
|
-
const level = new Level<string, string>(path);
|
|
25
|
-
await level.open();
|
|
26
|
-
|
|
27
|
-
const key = 'name';
|
|
28
|
-
const value = 'Rich';
|
|
29
|
-
{
|
|
30
|
-
await level.put(key, value);
|
|
31
|
-
expect(await level.get(key)).to.equal(value);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
await level.close();
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
const level = new Level<string, string>(path);
|
|
38
|
-
await level.open();
|
|
39
|
-
expect(await level.get(key)).to.equal(value);
|
|
40
|
-
await level.clear();
|
|
41
|
-
expect(() => level.get(key)).to.throw;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('batch different sublevels', async () => {
|
|
46
|
-
const level = createTestLevel();
|
|
47
|
-
await openAndClose(level);
|
|
48
|
-
|
|
49
|
-
const first: SubLevelDB = level.sublevel('first');
|
|
50
|
-
const second: SubLevelDB = level.sublevel('second');
|
|
51
|
-
|
|
52
|
-
const batch = first.batch();
|
|
53
|
-
|
|
54
|
-
const key = 'key';
|
|
55
|
-
const value = 'first-level-value';
|
|
56
|
-
batch.put(key, value, { sublevel: second });
|
|
57
|
-
await batch.write();
|
|
58
|
-
|
|
59
|
-
expect(() => first.get(key)).to.throw;
|
|
60
|
-
expect(await level.sublevel('second').get(key)).to.equal(value);
|
|
61
|
-
expect(await second.get(key)).to.equal(value);
|
|
62
|
-
expect(await second.iterator().all()).to.deep.equal([[key, value]]);
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test('sublevel prefixes', () => {
|
|
66
|
-
const level = createTestLevel();
|
|
67
|
-
expect(level.prefixKey('', 'utf8')).to.equal('');
|
|
68
|
-
|
|
69
|
-
{
|
|
70
|
-
const sublevel = level.sublevel('sublevel');
|
|
71
|
-
expect(sublevel.prefixKey('', 'utf8')).to.equal('!sublevel!');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
const sublevel = level.sublevel('');
|
|
76
|
-
expect(sublevel.prefixKey('', 'utf8')).to.equal('!!');
|
|
77
|
-
|
|
78
|
-
const sublevel2 = sublevel.sublevel('');
|
|
79
|
-
expect(sublevel2.prefixKey('', 'utf8')).to.equal('!!!!');
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { Reference } from '@dxos/echo-schema';
|
|
6
|
-
|
|
7
|
-
export const REFERENCE_TYPE_TAG = 'dxos.echo.model.document.Reference';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Reference as it is stored in Automerge document.
|
|
11
|
-
*/
|
|
12
|
-
export type EncodedReferenceObject = {
|
|
13
|
-
'@type': typeof REFERENCE_TYPE_TAG;
|
|
14
|
-
itemId: string | null;
|
|
15
|
-
protocol: string | null;
|
|
16
|
-
host: string | null;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export const encodeReference = (reference: Reference): EncodedReferenceObject => ({
|
|
20
|
-
'@type': REFERENCE_TYPE_TAG,
|
|
21
|
-
// NOTE: Automerge do not support undefined values, so we need to use null instead.
|
|
22
|
-
itemId: reference.itemId ?? null,
|
|
23
|
-
protocol: reference.protocol ?? null,
|
|
24
|
-
host: reference.host ?? null,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
export const decodeReference = (value: any) =>
|
|
28
|
-
new Reference(value.itemId, value.protocol ?? undefined, value.host ?? undefined);
|
|
29
|
-
|
|
30
|
-
export const isEncodedReferenceObject = (value: any): value is EncodedReferenceObject =>
|
|
31
|
-
typeof value === 'object' && value !== null && value['@type'] === REFERENCE_TYPE_TAG;
|
package/src/automerge/types.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { type AbstractChainedBatch, type AbstractSublevel } from 'abstract-level';
|
|
6
|
-
import { type Level } from 'level';
|
|
7
|
-
|
|
8
|
-
import { type EncodedReferenceObject } from './reference';
|
|
9
|
-
|
|
10
|
-
export type SpaceState = {
|
|
11
|
-
// Url of the root automerge document.
|
|
12
|
-
rootUrl?: string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export interface SpaceDoc {
|
|
16
|
-
access?: {
|
|
17
|
-
spaceKey: string;
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Objects inlined in the current document.
|
|
21
|
-
*/
|
|
22
|
-
objects?: {
|
|
23
|
-
[key: string]: ObjectStructure;
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Object id points to an automerge doc url where the object is embedded.
|
|
27
|
-
*/
|
|
28
|
-
links?: {
|
|
29
|
-
[echoId: string]: string;
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Representation of an ECHO object in an AM document.
|
|
35
|
-
*/
|
|
36
|
-
export type ObjectStructure = {
|
|
37
|
-
data: Record<string, any>;
|
|
38
|
-
meta: ObjectMeta;
|
|
39
|
-
system: ObjectSystem;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Echo object metadata.
|
|
44
|
-
*/
|
|
45
|
-
export type ObjectMeta = {
|
|
46
|
-
/**
|
|
47
|
-
* Foreign keys.
|
|
48
|
-
*/
|
|
49
|
-
keys: ForeignKey[];
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Reference to an object in a foreign database.
|
|
54
|
-
*/
|
|
55
|
-
export type ForeignKey = {
|
|
56
|
-
/**
|
|
57
|
-
* Name of the foreign database/system.
|
|
58
|
-
* E.g. `github.com`.
|
|
59
|
-
*/
|
|
60
|
-
source?: string;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Id within the foreign database.
|
|
64
|
-
*/
|
|
65
|
-
id?: string;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Automerge object system properties.
|
|
70
|
-
* (Is automerge specific.)
|
|
71
|
-
*/
|
|
72
|
-
export type ObjectSystem = {
|
|
73
|
-
/**
|
|
74
|
-
* Deletion marker.
|
|
75
|
-
*/
|
|
76
|
-
deleted?: boolean;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Object reference ('protobuf' protocol) type.
|
|
80
|
-
*/
|
|
81
|
-
type?: EncodedReferenceObject;
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
export type LevelDB = Level<string, string>;
|
|
85
|
-
export type SubLevelDB = AbstractSublevel<any, string | Buffer | Uint8Array, string, string>;
|
|
86
|
-
export type BatchLevel = AbstractChainedBatch<any, string, string>;
|
package/src/testing/level.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { Level } from 'level';
|
|
6
|
-
|
|
7
|
-
import { PublicKey } from '@dxos/keys';
|
|
8
|
-
|
|
9
|
-
import { type LevelDB } from '../automerge/types';
|
|
10
|
-
|
|
11
|
-
export const createTestLevel = (): LevelDB => new Level<string, string>(`/tmp/dxos-${PublicKey.random().toHex()}`);
|