@automerge/automerge-repo 2.0.0-collectionsync-alpha.1 → 2.0.1
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/README.md +8 -8
- package/dist/AutomergeUrl.d.ts +17 -5
- package/dist/AutomergeUrl.d.ts.map +1 -1
- package/dist/AutomergeUrl.js +71 -24
- package/dist/DocHandle.d.ts +33 -41
- package/dist/DocHandle.d.ts.map +1 -1
- package/dist/DocHandle.js +105 -66
- package/dist/FindProgress.d.ts +30 -0
- package/dist/FindProgress.d.ts.map +1 -0
- package/dist/FindProgress.js +1 -0
- package/dist/RemoteHeadsSubscriptions.d.ts +4 -5
- package/dist/RemoteHeadsSubscriptions.d.ts.map +1 -1
- package/dist/RemoteHeadsSubscriptions.js +4 -1
- package/dist/Repo.d.ts +24 -5
- package/dist/Repo.d.ts.map +1 -1
- package/dist/Repo.js +355 -169
- package/dist/helpers/abortable.d.ts +36 -0
- package/dist/helpers/abortable.d.ts.map +1 -0
- package/dist/helpers/abortable.js +47 -0
- package/dist/helpers/arraysAreEqual.d.ts.map +1 -1
- package/dist/helpers/bufferFromHex.d.ts +3 -0
- package/dist/helpers/bufferFromHex.d.ts.map +1 -0
- package/dist/helpers/bufferFromHex.js +13 -0
- package/dist/helpers/debounce.d.ts.map +1 -1
- package/dist/helpers/eventPromise.d.ts.map +1 -1
- package/dist/helpers/headsAreSame.d.ts +2 -2
- package/dist/helpers/headsAreSame.d.ts.map +1 -1
- package/dist/helpers/mergeArrays.d.ts +1 -1
- package/dist/helpers/mergeArrays.d.ts.map +1 -1
- package/dist/helpers/pause.d.ts.map +1 -1
- package/dist/helpers/tests/network-adapter-tests.d.ts.map +1 -1
- package/dist/helpers/tests/network-adapter-tests.js +13 -13
- package/dist/helpers/tests/storage-adapter-tests.d.ts.map +1 -1
- package/dist/helpers/tests/storage-adapter-tests.js +6 -9
- package/dist/helpers/throttle.d.ts.map +1 -1
- package/dist/helpers/withTimeout.d.ts.map +1 -1
- package/dist/index.d.ts +35 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -6
- package/dist/network/NetworkSubsystem.d.ts +0 -1
- package/dist/network/NetworkSubsystem.d.ts.map +1 -1
- package/dist/network/NetworkSubsystem.js +0 -3
- package/dist/network/messages.d.ts +1 -7
- package/dist/network/messages.d.ts.map +1 -1
- package/dist/network/messages.js +1 -2
- package/dist/storage/StorageAdapter.d.ts +0 -9
- package/dist/storage/StorageAdapter.d.ts.map +1 -1
- package/dist/storage/StorageAdapter.js +0 -33
- package/dist/storage/StorageSubsystem.d.ts +6 -2
- package/dist/storage/StorageSubsystem.d.ts.map +1 -1
- package/dist/storage/StorageSubsystem.js +131 -37
- package/dist/storage/keyHash.d.ts +1 -1
- package/dist/storage/keyHash.d.ts.map +1 -1
- package/dist/synchronizer/CollectionSynchronizer.d.ts +3 -4
- package/dist/synchronizer/CollectionSynchronizer.d.ts.map +1 -1
- package/dist/synchronizer/CollectionSynchronizer.js +32 -26
- package/dist/synchronizer/DocSynchronizer.d.ts +8 -8
- package/dist/synchronizer/DocSynchronizer.d.ts.map +1 -1
- package/dist/synchronizer/DocSynchronizer.js +205 -79
- package/dist/types.d.ts +4 -1
- package/dist/types.d.ts.map +1 -1
- package/fuzz/fuzz.ts +3 -3
- package/package.json +4 -5
- package/src/AutomergeUrl.ts +101 -26
- package/src/DocHandle.ts +158 -77
- package/src/FindProgress.ts +48 -0
- package/src/RemoteHeadsSubscriptions.ts +11 -9
- package/src/Repo.ts +465 -180
- package/src/helpers/abortable.ts +62 -0
- package/src/helpers/bufferFromHex.ts +14 -0
- package/src/helpers/headsAreSame.ts +2 -2
- package/src/helpers/tests/network-adapter-tests.ts +14 -13
- package/src/helpers/tests/storage-adapter-tests.ts +13 -24
- package/src/index.ts +57 -38
- package/src/network/NetworkSubsystem.ts +0 -4
- package/src/network/messages.ts +2 -11
- package/src/storage/StorageAdapter.ts +0 -42
- package/src/storage/StorageSubsystem.ts +155 -45
- package/src/storage/keyHash.ts +1 -1
- package/src/synchronizer/CollectionSynchronizer.ts +42 -29
- package/src/synchronizer/DocSynchronizer.ts +263 -89
- package/src/types.ts +4 -1
- package/test/AutomergeUrl.test.ts +130 -0
- package/test/CollectionSynchronizer.test.ts +6 -8
- package/test/DocHandle.test.ts +161 -77
- package/test/DocSynchronizer.test.ts +11 -9
- package/test/RemoteHeadsSubscriptions.test.ts +1 -1
- package/test/Repo.test.ts +406 -341
- package/test/StorageSubsystem.test.ts +95 -20
- package/test/remoteHeads.test.ts +28 -13
- package/dist/CollectionHandle.d.ts +0 -14
- package/dist/CollectionHandle.d.ts.map +0 -1
- package/dist/CollectionHandle.js +0 -37
- package/dist/DocUrl.d.ts +0 -47
- package/dist/DocUrl.d.ts.map +0 -1
- package/dist/DocUrl.js +0 -72
- package/dist/EphemeralData.d.ts +0 -20
- package/dist/EphemeralData.d.ts.map +0 -1
- package/dist/EphemeralData.js +0 -1
- package/dist/ferigan.d.ts +0 -51
- package/dist/ferigan.d.ts.map +0 -1
- package/dist/ferigan.js +0 -98
- package/dist/src/DocHandle.d.ts +0 -182
- package/dist/src/DocHandle.d.ts.map +0 -1
- package/dist/src/DocHandle.js +0 -405
- package/dist/src/DocUrl.d.ts +0 -49
- package/dist/src/DocUrl.d.ts.map +0 -1
- package/dist/src/DocUrl.js +0 -72
- package/dist/src/EphemeralData.d.ts +0 -19
- package/dist/src/EphemeralData.d.ts.map +0 -1
- package/dist/src/EphemeralData.js +0 -1
- package/dist/src/Repo.d.ts +0 -74
- package/dist/src/Repo.d.ts.map +0 -1
- package/dist/src/Repo.js +0 -208
- package/dist/src/helpers/arraysAreEqual.d.ts +0 -2
- package/dist/src/helpers/arraysAreEqual.d.ts.map +0 -1
- package/dist/src/helpers/arraysAreEqual.js +0 -2
- package/dist/src/helpers/cbor.d.ts +0 -4
- package/dist/src/helpers/cbor.d.ts.map +0 -1
- package/dist/src/helpers/cbor.js +0 -8
- package/dist/src/helpers/eventPromise.d.ts +0 -11
- package/dist/src/helpers/eventPromise.d.ts.map +0 -1
- package/dist/src/helpers/eventPromise.js +0 -7
- package/dist/src/helpers/headsAreSame.d.ts +0 -2
- package/dist/src/helpers/headsAreSame.d.ts.map +0 -1
- package/dist/src/helpers/headsAreSame.js +0 -4
- package/dist/src/helpers/mergeArrays.d.ts +0 -2
- package/dist/src/helpers/mergeArrays.d.ts.map +0 -1
- package/dist/src/helpers/mergeArrays.js +0 -15
- package/dist/src/helpers/pause.d.ts +0 -6
- package/dist/src/helpers/pause.d.ts.map +0 -1
- package/dist/src/helpers/pause.js +0 -10
- package/dist/src/helpers/tests/network-adapter-tests.d.ts +0 -21
- package/dist/src/helpers/tests/network-adapter-tests.d.ts.map +0 -1
- package/dist/src/helpers/tests/network-adapter-tests.js +0 -122
- package/dist/src/helpers/withTimeout.d.ts +0 -12
- package/dist/src/helpers/withTimeout.d.ts.map +0 -1
- package/dist/src/helpers/withTimeout.js +0 -24
- package/dist/src/index.d.ts +0 -53
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -40
- package/dist/src/network/NetworkAdapter.d.ts +0 -26
- package/dist/src/network/NetworkAdapter.d.ts.map +0 -1
- package/dist/src/network/NetworkAdapter.js +0 -4
- package/dist/src/network/NetworkSubsystem.d.ts +0 -23
- package/dist/src/network/NetworkSubsystem.d.ts.map +0 -1
- package/dist/src/network/NetworkSubsystem.js +0 -120
- package/dist/src/network/messages.d.ts +0 -85
- package/dist/src/network/messages.d.ts.map +0 -1
- package/dist/src/network/messages.js +0 -23
- package/dist/src/storage/StorageAdapter.d.ts +0 -14
- package/dist/src/storage/StorageAdapter.d.ts.map +0 -1
- package/dist/src/storage/StorageAdapter.js +0 -1
- package/dist/src/storage/StorageSubsystem.d.ts +0 -12
- package/dist/src/storage/StorageSubsystem.d.ts.map +0 -1
- package/dist/src/storage/StorageSubsystem.js +0 -145
- package/dist/src/synchronizer/CollectionSynchronizer.d.ts +0 -25
- package/dist/src/synchronizer/CollectionSynchronizer.d.ts.map +0 -1
- package/dist/src/synchronizer/CollectionSynchronizer.js +0 -106
- package/dist/src/synchronizer/DocSynchronizer.d.ts +0 -29
- package/dist/src/synchronizer/DocSynchronizer.d.ts.map +0 -1
- package/dist/src/synchronizer/DocSynchronizer.js +0 -263
- package/dist/src/synchronizer/Synchronizer.d.ts +0 -9
- package/dist/src/synchronizer/Synchronizer.d.ts.map +0 -1
- package/dist/src/synchronizer/Synchronizer.js +0 -2
- package/dist/src/types.d.ts +0 -16
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -1
- package/dist/test/CollectionSynchronizer.test.d.ts +0 -2
- package/dist/test/CollectionSynchronizer.test.d.ts.map +0 -1
- package/dist/test/CollectionSynchronizer.test.js +0 -57
- package/dist/test/DocHandle.test.d.ts +0 -2
- package/dist/test/DocHandle.test.d.ts.map +0 -1
- package/dist/test/DocHandle.test.js +0 -238
- package/dist/test/DocSynchronizer.test.d.ts +0 -2
- package/dist/test/DocSynchronizer.test.d.ts.map +0 -1
- package/dist/test/DocSynchronizer.test.js +0 -111
- package/dist/test/Network.test.d.ts +0 -2
- package/dist/test/Network.test.d.ts.map +0 -1
- package/dist/test/Network.test.js +0 -11
- package/dist/test/Repo.test.d.ts +0 -2
- package/dist/test/Repo.test.d.ts.map +0 -1
- package/dist/test/Repo.test.js +0 -568
- package/dist/test/StorageSubsystem.test.d.ts +0 -2
- package/dist/test/StorageSubsystem.test.d.ts.map +0 -1
- package/dist/test/StorageSubsystem.test.js +0 -56
- package/dist/test/helpers/DummyNetworkAdapter.d.ts +0 -9
- package/dist/test/helpers/DummyNetworkAdapter.d.ts.map +0 -1
- package/dist/test/helpers/DummyNetworkAdapter.js +0 -15
- package/dist/test/helpers/DummyStorageAdapter.d.ts +0 -16
- package/dist/test/helpers/DummyStorageAdapter.d.ts.map +0 -1
- package/dist/test/helpers/DummyStorageAdapter.js +0 -33
- package/dist/test/helpers/generate-large-object.d.ts +0 -5
- package/dist/test/helpers/generate-large-object.d.ts.map +0 -1
- package/dist/test/helpers/generate-large-object.js +0 -9
- package/dist/test/helpers/getRandomItem.d.ts +0 -2
- package/dist/test/helpers/getRandomItem.d.ts.map +0 -1
- package/dist/test/helpers/getRandomItem.js +0 -4
- package/dist/test/types.d.ts +0 -4
- package/dist/test/types.d.ts.map +0 -1
- package/dist/test/types.js +0 -1
- package/src/CollectionHandle.ts +0 -54
- package/src/ferigan.ts +0 -184
package/README.md
CHANGED
|
@@ -40,9 +40,9 @@ A `Repo` exposes these methods:
|
|
|
40
40
|
|
|
41
41
|
- `create<T>(initialValue: T?)`
|
|
42
42
|
Creates a new `Automerge.Doc` and returns a `DocHandle` for it. Accepts an optional initial value for the document. Produces an empty document (potentially violating the type!) otherwise.
|
|
43
|
-
- `find<T>(docId: DocumentId)
|
|
43
|
+
- `find<T>(docId: DocumentId): Promise<DocHandle<T>>`
|
|
44
44
|
Looks up a given document either on the local machine or (if necessary) over any configured
|
|
45
|
-
networks.
|
|
45
|
+
networks. Returns a promise that resolves when the document is loaded or throws if load fails.
|
|
46
46
|
- `delete(docId: DocumentId)`
|
|
47
47
|
Deletes the local copy of a document from the local cache and local storage. _This does not currently delete the document from any other peers_.
|
|
48
48
|
- `import(binary: Uint8Array)`
|
|
@@ -57,10 +57,9 @@ A `Repo` exposes these methods:
|
|
|
57
57
|
A `DocHandle` is a wrapper around an `Automerge.Doc`. Its primary function is to dispatch changes to
|
|
58
58
|
the document.
|
|
59
59
|
|
|
60
|
-
- `handle.doc()`
|
|
61
|
-
Returns a `
|
|
62
|
-
|
|
63
|
-
returning a value.
|
|
60
|
+
- `handle.doc()`
|
|
61
|
+
Returns a `Doc<T>` that will contain the current value of the document.
|
|
62
|
+
Throws an error if the document is deleted.
|
|
64
63
|
- `handle.change((doc: T) => void)`
|
|
65
64
|
Calls the provided callback with an instrumented mutable object
|
|
66
65
|
representing the document. Any changes made to the document will be recorded and distributed to
|
|
@@ -233,14 +232,14 @@ Now import it and add it to your list of network adapters:
|
|
|
233
232
|
|
|
234
233
|
```ts
|
|
235
234
|
// main.tsx
|
|
236
|
-
import {
|
|
235
|
+
import { WebSocketClientAdapter } from "@automerge/automerge-repo-network-websocket" // <-- add this line
|
|
237
236
|
|
|
238
237
|
// ...
|
|
239
238
|
|
|
240
239
|
const repo = new Repo({
|
|
241
240
|
network: [
|
|
242
241
|
new BroadcastChannelNetworkAdapter(),
|
|
243
|
-
new
|
|
242
|
+
new WebSocketClientAdapter("ws://localhost:3030"), // <-- add this line
|
|
244
243
|
],
|
|
245
244
|
storage: new IndexedDBStorageAdapter(),
|
|
246
245
|
})
|
|
@@ -262,3 +261,4 @@ With gratitude for contributions by:
|
|
|
262
261
|
- Jeremy Rose
|
|
263
262
|
- Alex Currie-Clark
|
|
264
263
|
- Dylan Mackenzie
|
|
264
|
+
- Maciek Sakrejda
|
package/dist/AutomergeUrl.d.ts
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
|
-
import type { LegacyDocumentId, AutomergeUrl, BinaryDocumentId, DocumentId, AnyDocumentId } from "./types.js";
|
|
1
|
+
import type { LegacyDocumentId, AutomergeUrl, BinaryDocumentId, DocumentId, AnyDocumentId, UrlHeads } from "./types.js";
|
|
2
|
+
import type { Heads as AutomergeHeads } from "@automerge/automerge/slim";
|
|
2
3
|
export declare const urlPrefix = "automerge:";
|
|
3
|
-
|
|
4
|
-
export declare const parseAutomergeUrl: (url: AutomergeUrl) => {
|
|
4
|
+
interface ParsedAutomergeUrl {
|
|
5
5
|
/** unencoded DocumentId */
|
|
6
6
|
binaryDocumentId: BinaryDocumentId;
|
|
7
|
-
/** encoded DocumentId */
|
|
7
|
+
/** bs58 encoded DocumentId */
|
|
8
8
|
documentId: DocumentId;
|
|
9
|
-
|
|
9
|
+
/** Optional array of heads, if specified in URL */
|
|
10
|
+
heads?: UrlHeads;
|
|
11
|
+
/** Optional hex array of heads, in Automerge core format */
|
|
12
|
+
hexHeads?: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Given an Automerge URL, returns the DocumentId in both base58check-encoded form and binary form */
|
|
15
|
+
export declare const parseAutomergeUrl: (url: AutomergeUrl) => ParsedAutomergeUrl;
|
|
10
16
|
/**
|
|
11
17
|
* Given a documentId in either binary or base58check-encoded form, returns an Automerge URL.
|
|
12
18
|
* Throws on invalid input.
|
|
13
19
|
*/
|
|
14
20
|
export declare const stringifyAutomergeUrl: (arg: UrlOptions | DocumentId | BinaryDocumentId) => AutomergeUrl;
|
|
21
|
+
/** Helper to extract just the heads from a URL if they exist */
|
|
22
|
+
export declare const getHeadsFromUrl: (url: AutomergeUrl) => string[] | undefined;
|
|
23
|
+
export declare const anyDocumentIdToAutomergeUrl: (id: AnyDocumentId) => AutomergeUrl | undefined;
|
|
15
24
|
/**
|
|
16
25
|
* Given a string, returns true if it is a valid Automerge URL. This function also acts as a type
|
|
17
26
|
* discriminator in Typescript.
|
|
@@ -25,6 +34,8 @@ export declare const isValidUuid: (str: unknown) => str is LegacyDocumentId;
|
|
|
25
34
|
export declare const generateAutomergeUrl: () => AutomergeUrl;
|
|
26
35
|
export declare const documentIdToBinary: (docId: DocumentId) => BinaryDocumentId | undefined;
|
|
27
36
|
export declare const binaryToDocumentId: (docId: BinaryDocumentId) => DocumentId;
|
|
37
|
+
export declare const encodeHeads: (heads: AutomergeHeads) => UrlHeads;
|
|
38
|
+
export declare const decodeHeads: (heads: UrlHeads) => AutomergeHeads;
|
|
28
39
|
export declare const parseLegacyUUID: (str: string) => AutomergeUrl | undefined;
|
|
29
40
|
/**
|
|
30
41
|
* Given any valid expression of a document ID, returns a DocumentId in base58check-encoded form.
|
|
@@ -40,6 +51,7 @@ export declare const parseLegacyUUID: (str: string) => AutomergeUrl | undefined;
|
|
|
40
51
|
export declare const interpretAsDocumentId: (id: AnyDocumentId) => DocumentId;
|
|
41
52
|
type UrlOptions = {
|
|
42
53
|
documentId: DocumentId | BinaryDocumentId;
|
|
54
|
+
heads?: UrlHeads;
|
|
43
55
|
};
|
|
44
56
|
export {};
|
|
45
57
|
//# sourceMappingURL=AutomergeUrl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutomergeUrl.d.ts","sourceRoot":"","sources":["../src/AutomergeUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"AutomergeUrl.d.ts","sourceRoot":"","sources":["../src/AutomergeUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAA;AASnB,OAAO,KAAK,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAExE,eAAO,MAAM,SAAS,eAAe,CAAA;AAErC,UAAU,kBAAkB;IAC1B,2BAA2B;IAC3B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,8BAA8B;IAC9B,UAAU,EAAE,UAAU,CAAA;IACtB,mDAAmD;IACnD,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,sGAAsG;AACtG,eAAO,MAAM,iBAAiB,GAAI,KAAK,YAAY,KAAG,kBAsBrD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,KAAK,UAAU,GAAG,UAAU,GAAG,gBAAgB,KAC9C,YAgCF,CAAA;AAED,gEAAgE;AAChE,eAAO,MAAM,eAAe,GAAI,KAAK,YAAY,KAAG,MAAM,EAAE,GAAG,SAG9D,CAAA;AAED,eAAO,MAAM,2BAA2B,GAAI,IAAI,aAAa,6BAO9C,CAAA;AAEf;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,YAsBzD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,UASvD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,gBACH,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAO,YAGvC,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,KACjB,gBAAgB,GAAG,SAAS,CAAA;AAE/D,eAAO,MAAM,kBAAkB,GAAI,OAAO,gBAAgB,KAC7B,UAAU,CAAA;AAEvC,eAAO,MAAM,WAAW,GAAI,OAAO,cAAc,KAAG,QACsB,CAAA;AAE1E,eAAO,MAAM,WAAW,GAAI,OAAO,QAAQ,KAAG,cACgC,CAAA;AAE9E,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,6BAI1C,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAAI,IAAI,aAAa,eAqBtD,CAAA;AAID,KAAK,UAAU,GAAG;IAChB,UAAU,EAAE,UAAU,GAAG,gBAAgB,CAAA;IACzC,KAAK,CAAC,EAAE,QAAQ,CAAA;CACjB,CAAA"}
|
package/dist/AutomergeUrl.js
CHANGED
|
@@ -1,53 +1,98 @@
|
|
|
1
1
|
import * as Uuid from "uuid";
|
|
2
2
|
import bs58check from "bs58check";
|
|
3
|
+
import { uint8ArrayFromHexString, uint8ArrayToHexString, } from "./helpers/bufferFromHex.js";
|
|
3
4
|
export const urlPrefix = "automerge:";
|
|
4
5
|
/** Given an Automerge URL, returns the DocumentId in both base58check-encoded form and binary form */
|
|
5
6
|
export const parseAutomergeUrl = (url) => {
|
|
7
|
+
const [baseUrl, headsSection, ...rest] = url.split("#");
|
|
8
|
+
if (rest.length > 0) {
|
|
9
|
+
throw new Error("Invalid URL: contains multiple heads sections");
|
|
10
|
+
}
|
|
6
11
|
const regex = new RegExp(`^${urlPrefix}(\\w+)$`);
|
|
7
|
-
const [, docMatch] =
|
|
12
|
+
const [, docMatch] = baseUrl.match(regex) || [];
|
|
8
13
|
const documentId = docMatch;
|
|
9
14
|
const binaryDocumentId = documentIdToBinary(documentId);
|
|
10
15
|
if (!binaryDocumentId)
|
|
11
16
|
throw new Error("Invalid document URL: " + url);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
if (headsSection === undefined)
|
|
18
|
+
return { binaryDocumentId, documentId };
|
|
19
|
+
const heads = (headsSection === "" ? [] : headsSection.split("|"));
|
|
20
|
+
const hexHeads = heads.map(head => {
|
|
21
|
+
try {
|
|
22
|
+
return uint8ArrayToHexString(bs58check.decode(head));
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
throw new Error(`Invalid head in URL: ${head}`);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return { binaryDocumentId, hexHeads, documentId, heads };
|
|
18
29
|
};
|
|
19
30
|
/**
|
|
20
31
|
* Given a documentId in either binary or base58check-encoded form, returns an Automerge URL.
|
|
21
32
|
* Throws on invalid input.
|
|
22
33
|
*/
|
|
23
34
|
export const stringifyAutomergeUrl = (arg) => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
if (arg instanceof Uint8Array || typeof arg === "string") {
|
|
36
|
+
return (urlPrefix +
|
|
37
|
+
(arg instanceof Uint8Array
|
|
38
|
+
? binaryToDocumentId(arg)
|
|
39
|
+
: arg));
|
|
40
|
+
}
|
|
41
|
+
const { documentId, heads = undefined } = arg;
|
|
42
|
+
if (documentId === undefined)
|
|
43
|
+
throw new Error("Invalid documentId: " + documentId);
|
|
29
44
|
const encodedDocumentId = documentId instanceof Uint8Array
|
|
30
45
|
? binaryToDocumentId(documentId)
|
|
31
|
-
:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
46
|
+
: documentId;
|
|
47
|
+
let url = `${urlPrefix}${encodedDocumentId}`;
|
|
48
|
+
if (heads !== undefined) {
|
|
49
|
+
heads.forEach(head => {
|
|
50
|
+
try {
|
|
51
|
+
bs58check.decode(head);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
throw new Error(`Invalid head: ${head}`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
url += "#" + heads.join("|");
|
|
58
|
+
}
|
|
59
|
+
return url;
|
|
60
|
+
};
|
|
61
|
+
/** Helper to extract just the heads from a URL if they exist */
|
|
62
|
+
export const getHeadsFromUrl = (url) => {
|
|
63
|
+
const { heads } = parseAutomergeUrl(url);
|
|
64
|
+
return heads;
|
|
37
65
|
};
|
|
66
|
+
export const anyDocumentIdToAutomergeUrl = (id) => isValidAutomergeUrl(id)
|
|
67
|
+
? id
|
|
68
|
+
: isValidDocumentId(id)
|
|
69
|
+
? stringifyAutomergeUrl({ documentId: id })
|
|
70
|
+
: isValidUuid(id)
|
|
71
|
+
? parseLegacyUUID(id)
|
|
72
|
+
: undefined;
|
|
38
73
|
/**
|
|
39
74
|
* Given a string, returns true if it is a valid Automerge URL. This function also acts as a type
|
|
40
75
|
* discriminator in Typescript.
|
|
41
76
|
*/
|
|
42
77
|
export const isValidAutomergeUrl = (str) => {
|
|
43
|
-
if (typeof str !== "string")
|
|
44
|
-
return false;
|
|
45
|
-
if (!str || !str.startsWith(urlPrefix))
|
|
78
|
+
if (typeof str !== "string" || !str || !str.startsWith(urlPrefix))
|
|
46
79
|
return false;
|
|
47
|
-
const automergeUrl = str;
|
|
48
80
|
try {
|
|
49
|
-
const { documentId } = parseAutomergeUrl(
|
|
50
|
-
|
|
81
|
+
const { documentId, heads } = parseAutomergeUrl(str);
|
|
82
|
+
if (!isValidDocumentId(documentId))
|
|
83
|
+
return false;
|
|
84
|
+
if (heads &&
|
|
85
|
+
!heads.every(head => {
|
|
86
|
+
try {
|
|
87
|
+
bs58check.decode(head);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}))
|
|
94
|
+
return false;
|
|
95
|
+
return true;
|
|
51
96
|
}
|
|
52
97
|
catch {
|
|
53
98
|
return false;
|
|
@@ -74,6 +119,8 @@ export const generateAutomergeUrl = () => {
|
|
|
74
119
|
};
|
|
75
120
|
export const documentIdToBinary = (docId) => bs58check.decodeUnsafe(docId);
|
|
76
121
|
export const binaryToDocumentId = (docId) => bs58check.encode(docId);
|
|
122
|
+
export const encodeHeads = (heads) => heads.map(h => bs58check.encode(uint8ArrayFromHexString(h)));
|
|
123
|
+
export const decodeHeads = (heads) => heads.map(h => uint8ArrayToHexString(bs58check.decode(h)));
|
|
77
124
|
export const parseLegacyUUID = (str) => {
|
|
78
125
|
if (!Uuid.validate(str))
|
|
79
126
|
return undefined;
|
package/dist/DocHandle.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { next as A } from "@automerge/automerge/slim";
|
|
2
2
|
import { EventEmitter } from "eventemitter3";
|
|
3
|
-
import type { AutomergeUrl, DocumentId, PeerId } from "./types.js";
|
|
3
|
+
import type { AutomergeUrl, DocumentId, PeerId, UrlHeads } from "./types.js";
|
|
4
4
|
import { StorageId } from "./storage/types.js";
|
|
5
5
|
/**
|
|
6
6
|
* A DocHandle is a wrapper around a single Automerge document that lets us listen for changes and
|
|
@@ -65,39 +65,26 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
65
65
|
*/
|
|
66
66
|
whenReady(awaitStates?: HandleState[]): Promise<void>;
|
|
67
67
|
/**
|
|
68
|
-
*
|
|
68
|
+
* Returns the current state of the Automerge document this handle manages.
|
|
69
|
+
*
|
|
70
|
+
* @returns the current document
|
|
71
|
+
* @throws on deleted and unavailable documents
|
|
69
72
|
*
|
|
70
|
-
* This is the recommended way to access a handle's document. Note that this waits for the handle
|
|
71
|
-
* to be ready if necessary. If loading (or synchronization) fails, this will never resolve.
|
|
72
73
|
*/
|
|
73
|
-
doc(
|
|
74
|
-
/** states to wait for, such as "LOADING". mostly for internal use. */
|
|
75
|
-
awaitStates?: HandleState[]): Promise<A.Doc<T> | undefined>;
|
|
74
|
+
doc(): A.Doc<T>;
|
|
76
75
|
/**
|
|
77
|
-
* Synchronously returns the current state of the Automerge document this handle manages, or
|
|
78
|
-
* undefined. Consider using `await handle.doc()` instead. Check `isReady()`, or use `whenReady()`
|
|
79
|
-
* if you want to make sure loading is complete first.
|
|
80
|
-
*
|
|
81
|
-
* Not to be confused with the SyncState of the document, which describes the state of the
|
|
82
|
-
* synchronization process.
|
|
83
76
|
*
|
|
84
|
-
*
|
|
85
|
-
|
|
86
|
-
*
|
|
87
|
-
* @returns the current document, or undefined if the document is not ready.
|
|
88
|
-
*/
|
|
89
|
-
docSync(): A.Doc<T> | undefined;
|
|
77
|
+
* @deprecated */
|
|
78
|
+
docSync(): A.Doc<T>;
|
|
90
79
|
/**
|
|
91
80
|
* Returns the current "heads" of the document, akin to a git commit.
|
|
92
81
|
* This precisely defines the state of a document.
|
|
93
82
|
* @returns the current document's heads, or undefined if the document is not ready
|
|
94
83
|
*/
|
|
95
|
-
heads():
|
|
84
|
+
heads(): UrlHeads;
|
|
96
85
|
begin(): void;
|
|
97
86
|
/**
|
|
98
|
-
*
|
|
99
|
-
* by the `heads` passed in. The return value is the same type as docSync() and will return
|
|
100
|
-
* undefined if the object hasn't finished loading.
|
|
87
|
+
* Returns an array of all past "heads" for the document in topological order.
|
|
101
88
|
*
|
|
102
89
|
* @remarks
|
|
103
90
|
* A point-in-time in an automerge document is an *array* of heads since there may be
|
|
@@ -106,12 +93,12 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
106
93
|
* history views would be quite large under concurrency (every thing in each branch against each other).
|
|
107
94
|
* There might be a clever way to think about this, but we haven't found it yet, so for now at least
|
|
108
95
|
* we present a single traversable view which excludes concurrency.
|
|
109
|
-
* @returns The individual heads for every change in the document.
|
|
96
|
+
* @returns UrlHeads[] - The individual heads for every change in the document. Each item is a tagged string[1].
|
|
110
97
|
*/
|
|
111
|
-
history():
|
|
98
|
+
history(): UrlHeads[] | undefined;
|
|
112
99
|
/**
|
|
113
100
|
* Creates a fixed "view" of an automerge document at the given point in time represented
|
|
114
|
-
* by the `heads` passed in. The return value is the same type as
|
|
101
|
+
* by the `heads` passed in. The return value is the same type as doc() and will return
|
|
115
102
|
* undefined if the object hasn't finished loading.
|
|
116
103
|
*
|
|
117
104
|
* @remarks
|
|
@@ -119,20 +106,24 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
119
106
|
* of Automerge doesn't check types at runtime, so if you go back to an old set of heads
|
|
120
107
|
* that doesn't match the heads here, Typescript will not save you.
|
|
121
108
|
*
|
|
122
|
-
* @
|
|
109
|
+
* @argument heads - The heads to view the document at. See history().
|
|
110
|
+
* @returns DocHandle<T> at the time of `heads`
|
|
123
111
|
*/
|
|
124
|
-
view(heads:
|
|
112
|
+
view(heads: UrlHeads): DocHandle<T>;
|
|
125
113
|
/**
|
|
126
114
|
* Returns a set of Patch operations that will move a materialized document from one state to another
|
|
127
115
|
* if applied.
|
|
128
116
|
*
|
|
129
117
|
* @remarks
|
|
130
|
-
* We allow specifying
|
|
131
|
-
*
|
|
118
|
+
* We allow specifying either:
|
|
119
|
+
* - Two sets of heads to compare directly
|
|
120
|
+
* - A single set of heads to compare against our current heads
|
|
121
|
+
* - Another DocHandle to compare against (which must share history with this document)
|
|
132
122
|
*
|
|
133
|
-
* @
|
|
123
|
+
* @throws Error if the documents don't share history or if either document is not ready
|
|
124
|
+
* @returns Automerge patches that go from one document state to the other
|
|
134
125
|
*/
|
|
135
|
-
diff(first:
|
|
126
|
+
diff(first: UrlHeads | DocHandle<T>, second?: UrlHeads): A.Patch[];
|
|
136
127
|
/**
|
|
137
128
|
* `metadata(head?)` allows you to look at the metadata for a change
|
|
138
129
|
* this can be used to build history graphs to find commit messages and edit times.
|
|
@@ -159,12 +150,12 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
159
150
|
*/
|
|
160
151
|
doneLoading(): void;
|
|
161
152
|
/**
|
|
162
|
-
* Called by the repo
|
|
153
|
+
* Called by the repo when a doc handle changes or we receive new remote heads.
|
|
163
154
|
* @hidden
|
|
164
155
|
*/
|
|
165
|
-
setRemoteHeads(storageId: StorageId, heads:
|
|
156
|
+
setRemoteHeads(storageId: StorageId, heads: UrlHeads): void;
|
|
166
157
|
/** Returns the heads of the storageId. */
|
|
167
|
-
getRemoteHeads(storageId: StorageId):
|
|
158
|
+
getRemoteHeads(storageId: StorageId): UrlHeads | undefined;
|
|
168
159
|
/**
|
|
169
160
|
* All changes to an Automerge document should be made through this method.
|
|
170
161
|
* Inside the callback, the document should be treated as mutable: all edits will be recorded
|
|
@@ -186,7 +177,7 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
186
177
|
*
|
|
187
178
|
* @returns A set of heads representing the concurrent change that was made.
|
|
188
179
|
*/
|
|
189
|
-
changeAt(heads:
|
|
180
|
+
changeAt(heads: UrlHeads, callback: A.ChangeFn<T>, options?: A.ChangeOptions<T>): UrlHeads | undefined;
|
|
190
181
|
/**
|
|
191
182
|
* Merges another document into this document. Any peers we are sharing changes with will be
|
|
192
183
|
* notified of the changes resulting from the merge.
|
|
@@ -199,11 +190,12 @@ export declare class DocHandle<T> extends EventEmitter<DocHandleEvents<T>> {
|
|
|
199
190
|
/** the handle of the document to merge into this one */
|
|
200
191
|
otherHandle: DocHandle<T>): void;
|
|
201
192
|
/**
|
|
202
|
-
*
|
|
193
|
+
* Updates the internal state machine to mark the document unavailable.
|
|
203
194
|
* @hidden
|
|
204
195
|
*/
|
|
205
196
|
unavailable(): void;
|
|
206
|
-
/**
|
|
197
|
+
/**
|
|
198
|
+
* Called by the repo either when the document is not found in storage.
|
|
207
199
|
* @hidden
|
|
208
200
|
* */
|
|
209
201
|
request(): void;
|
|
@@ -234,6 +226,7 @@ export type DocHandleOptions<T> = {
|
|
|
234
226
|
initialValue?: T;
|
|
235
227
|
} | {
|
|
236
228
|
isNew?: false;
|
|
229
|
+
heads?: UrlHeads;
|
|
237
230
|
/** The number of milliseconds before we mark this document as unavailable if we don't have it and nobody shares it with us. */
|
|
238
231
|
timeoutDelay?: number;
|
|
239
232
|
};
|
|
@@ -242,7 +235,6 @@ export interface DocHandleEvents<T> {
|
|
|
242
235
|
"heads-changed": (payload: DocHandleEncodedChangePayload<T>) => void;
|
|
243
236
|
change: (payload: DocHandleChangePayload<T>) => void;
|
|
244
237
|
delete: (payload: DocHandleDeletePayload<T>) => void;
|
|
245
|
-
unavailable: (payload: DocHandleUnavailablePayload<T>) => void;
|
|
246
238
|
"ephemeral-message": (payload: DocHandleEphemeralMessagePayload<T>) => void;
|
|
247
239
|
"ephemeral-message-outbound": (payload: DocHandleOutboundEphemeralMessagePayload<T>) => void;
|
|
248
240
|
"remote-heads": (payload: DocHandleRemoteHeadsPayload) => void;
|
|
@@ -285,7 +277,7 @@ export interface DocHandleOutboundEphemeralMessagePayload<T> {
|
|
|
285
277
|
/** Emitted when we have new remote heads for this document */
|
|
286
278
|
export interface DocHandleRemoteHeadsPayload {
|
|
287
279
|
storageId: StorageId;
|
|
288
|
-
heads:
|
|
280
|
+
heads: UrlHeads;
|
|
289
281
|
}
|
|
290
282
|
/**
|
|
291
283
|
* Possible internal states for a DocHandle
|
package/dist/DocHandle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocHandle.d.ts","sourceRoot":"","sources":["../src/DocHandle.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DocHandle.d.ts","sourceRoot":"","sources":["../src/DocHandle.ts"],"names":[],"mappings":"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"}
|