@automerge/automerge-repo 2.0.0-collectionsync-alpha.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +8 -8
  2. package/dist/AutomergeUrl.d.ts +17 -5
  3. package/dist/AutomergeUrl.d.ts.map +1 -1
  4. package/dist/AutomergeUrl.js +71 -24
  5. package/dist/DocHandle.d.ts +33 -41
  6. package/dist/DocHandle.d.ts.map +1 -1
  7. package/dist/DocHandle.js +105 -66
  8. package/dist/FindProgress.d.ts +30 -0
  9. package/dist/FindProgress.d.ts.map +1 -0
  10. package/dist/FindProgress.js +1 -0
  11. package/dist/RemoteHeadsSubscriptions.d.ts +4 -5
  12. package/dist/RemoteHeadsSubscriptions.d.ts.map +1 -1
  13. package/dist/RemoteHeadsSubscriptions.js +4 -1
  14. package/dist/Repo.d.ts +24 -5
  15. package/dist/Repo.d.ts.map +1 -1
  16. package/dist/Repo.js +355 -169
  17. package/dist/helpers/abortable.d.ts +36 -0
  18. package/dist/helpers/abortable.d.ts.map +1 -0
  19. package/dist/helpers/abortable.js +47 -0
  20. package/dist/helpers/arraysAreEqual.d.ts.map +1 -1
  21. package/dist/helpers/bufferFromHex.d.ts +3 -0
  22. package/dist/helpers/bufferFromHex.d.ts.map +1 -0
  23. package/dist/helpers/bufferFromHex.js +13 -0
  24. package/dist/helpers/debounce.d.ts.map +1 -1
  25. package/dist/helpers/eventPromise.d.ts.map +1 -1
  26. package/dist/helpers/headsAreSame.d.ts +2 -2
  27. package/dist/helpers/headsAreSame.d.ts.map +1 -1
  28. package/dist/helpers/mergeArrays.d.ts +1 -1
  29. package/dist/helpers/mergeArrays.d.ts.map +1 -1
  30. package/dist/helpers/pause.d.ts.map +1 -1
  31. package/dist/helpers/tests/network-adapter-tests.d.ts.map +1 -1
  32. package/dist/helpers/tests/network-adapter-tests.js +13 -13
  33. package/dist/helpers/tests/storage-adapter-tests.d.ts.map +1 -1
  34. package/dist/helpers/tests/storage-adapter-tests.js +6 -9
  35. package/dist/helpers/throttle.d.ts.map +1 -1
  36. package/dist/helpers/withTimeout.d.ts.map +1 -1
  37. package/dist/index.d.ts +35 -7
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +37 -6
  40. package/dist/network/NetworkSubsystem.d.ts +0 -1
  41. package/dist/network/NetworkSubsystem.d.ts.map +1 -1
  42. package/dist/network/NetworkSubsystem.js +0 -3
  43. package/dist/network/messages.d.ts +1 -7
  44. package/dist/network/messages.d.ts.map +1 -1
  45. package/dist/network/messages.js +1 -2
  46. package/dist/storage/StorageAdapter.d.ts +0 -9
  47. package/dist/storage/StorageAdapter.d.ts.map +1 -1
  48. package/dist/storage/StorageAdapter.js +0 -33
  49. package/dist/storage/StorageSubsystem.d.ts +6 -2
  50. package/dist/storage/StorageSubsystem.d.ts.map +1 -1
  51. package/dist/storage/StorageSubsystem.js +131 -37
  52. package/dist/storage/keyHash.d.ts +1 -1
  53. package/dist/storage/keyHash.d.ts.map +1 -1
  54. package/dist/synchronizer/CollectionSynchronizer.d.ts +3 -4
  55. package/dist/synchronizer/CollectionSynchronizer.d.ts.map +1 -1
  56. package/dist/synchronizer/CollectionSynchronizer.js +32 -26
  57. package/dist/synchronizer/DocSynchronizer.d.ts +8 -8
  58. package/dist/synchronizer/DocSynchronizer.d.ts.map +1 -1
  59. package/dist/synchronizer/DocSynchronizer.js +205 -79
  60. package/dist/types.d.ts +4 -1
  61. package/dist/types.d.ts.map +1 -1
  62. package/fuzz/fuzz.ts +3 -3
  63. package/package.json +4 -5
  64. package/src/AutomergeUrl.ts +101 -26
  65. package/src/DocHandle.ts +158 -77
  66. package/src/FindProgress.ts +48 -0
  67. package/src/RemoteHeadsSubscriptions.ts +11 -9
  68. package/src/Repo.ts +465 -180
  69. package/src/helpers/abortable.ts +62 -0
  70. package/src/helpers/bufferFromHex.ts +14 -0
  71. package/src/helpers/headsAreSame.ts +2 -2
  72. package/src/helpers/tests/network-adapter-tests.ts +14 -13
  73. package/src/helpers/tests/storage-adapter-tests.ts +13 -24
  74. package/src/index.ts +57 -38
  75. package/src/network/NetworkSubsystem.ts +0 -4
  76. package/src/network/messages.ts +2 -11
  77. package/src/storage/StorageAdapter.ts +0 -42
  78. package/src/storage/StorageSubsystem.ts +155 -45
  79. package/src/storage/keyHash.ts +1 -1
  80. package/src/synchronizer/CollectionSynchronizer.ts +42 -29
  81. package/src/synchronizer/DocSynchronizer.ts +263 -89
  82. package/src/types.ts +4 -1
  83. package/test/AutomergeUrl.test.ts +130 -0
  84. package/test/CollectionSynchronizer.test.ts +6 -8
  85. package/test/DocHandle.test.ts +161 -77
  86. package/test/DocSynchronizer.test.ts +11 -9
  87. package/test/RemoteHeadsSubscriptions.test.ts +1 -1
  88. package/test/Repo.test.ts +406 -341
  89. package/test/StorageSubsystem.test.ts +95 -20
  90. package/test/remoteHeads.test.ts +28 -13
  91. package/dist/CollectionHandle.d.ts +0 -14
  92. package/dist/CollectionHandle.d.ts.map +0 -1
  93. package/dist/CollectionHandle.js +0 -37
  94. package/dist/DocUrl.d.ts +0 -47
  95. package/dist/DocUrl.d.ts.map +0 -1
  96. package/dist/DocUrl.js +0 -72
  97. package/dist/EphemeralData.d.ts +0 -20
  98. package/dist/EphemeralData.d.ts.map +0 -1
  99. package/dist/EphemeralData.js +0 -1
  100. package/dist/ferigan.d.ts +0 -51
  101. package/dist/ferigan.d.ts.map +0 -1
  102. package/dist/ferigan.js +0 -98
  103. package/dist/src/DocHandle.d.ts +0 -182
  104. package/dist/src/DocHandle.d.ts.map +0 -1
  105. package/dist/src/DocHandle.js +0 -405
  106. package/dist/src/DocUrl.d.ts +0 -49
  107. package/dist/src/DocUrl.d.ts.map +0 -1
  108. package/dist/src/DocUrl.js +0 -72
  109. package/dist/src/EphemeralData.d.ts +0 -19
  110. package/dist/src/EphemeralData.d.ts.map +0 -1
  111. package/dist/src/EphemeralData.js +0 -1
  112. package/dist/src/Repo.d.ts +0 -74
  113. package/dist/src/Repo.d.ts.map +0 -1
  114. package/dist/src/Repo.js +0 -208
  115. package/dist/src/helpers/arraysAreEqual.d.ts +0 -2
  116. package/dist/src/helpers/arraysAreEqual.d.ts.map +0 -1
  117. package/dist/src/helpers/arraysAreEqual.js +0 -2
  118. package/dist/src/helpers/cbor.d.ts +0 -4
  119. package/dist/src/helpers/cbor.d.ts.map +0 -1
  120. package/dist/src/helpers/cbor.js +0 -8
  121. package/dist/src/helpers/eventPromise.d.ts +0 -11
  122. package/dist/src/helpers/eventPromise.d.ts.map +0 -1
  123. package/dist/src/helpers/eventPromise.js +0 -7
  124. package/dist/src/helpers/headsAreSame.d.ts +0 -2
  125. package/dist/src/helpers/headsAreSame.d.ts.map +0 -1
  126. package/dist/src/helpers/headsAreSame.js +0 -4
  127. package/dist/src/helpers/mergeArrays.d.ts +0 -2
  128. package/dist/src/helpers/mergeArrays.d.ts.map +0 -1
  129. package/dist/src/helpers/mergeArrays.js +0 -15
  130. package/dist/src/helpers/pause.d.ts +0 -6
  131. package/dist/src/helpers/pause.d.ts.map +0 -1
  132. package/dist/src/helpers/pause.js +0 -10
  133. package/dist/src/helpers/tests/network-adapter-tests.d.ts +0 -21
  134. package/dist/src/helpers/tests/network-adapter-tests.d.ts.map +0 -1
  135. package/dist/src/helpers/tests/network-adapter-tests.js +0 -122
  136. package/dist/src/helpers/withTimeout.d.ts +0 -12
  137. package/dist/src/helpers/withTimeout.d.ts.map +0 -1
  138. package/dist/src/helpers/withTimeout.js +0 -24
  139. package/dist/src/index.d.ts +0 -53
  140. package/dist/src/index.d.ts.map +0 -1
  141. package/dist/src/index.js +0 -40
  142. package/dist/src/network/NetworkAdapter.d.ts +0 -26
  143. package/dist/src/network/NetworkAdapter.d.ts.map +0 -1
  144. package/dist/src/network/NetworkAdapter.js +0 -4
  145. package/dist/src/network/NetworkSubsystem.d.ts +0 -23
  146. package/dist/src/network/NetworkSubsystem.d.ts.map +0 -1
  147. package/dist/src/network/NetworkSubsystem.js +0 -120
  148. package/dist/src/network/messages.d.ts +0 -85
  149. package/dist/src/network/messages.d.ts.map +0 -1
  150. package/dist/src/network/messages.js +0 -23
  151. package/dist/src/storage/StorageAdapter.d.ts +0 -14
  152. package/dist/src/storage/StorageAdapter.d.ts.map +0 -1
  153. package/dist/src/storage/StorageAdapter.js +0 -1
  154. package/dist/src/storage/StorageSubsystem.d.ts +0 -12
  155. package/dist/src/storage/StorageSubsystem.d.ts.map +0 -1
  156. package/dist/src/storage/StorageSubsystem.js +0 -145
  157. package/dist/src/synchronizer/CollectionSynchronizer.d.ts +0 -25
  158. package/dist/src/synchronizer/CollectionSynchronizer.d.ts.map +0 -1
  159. package/dist/src/synchronizer/CollectionSynchronizer.js +0 -106
  160. package/dist/src/synchronizer/DocSynchronizer.d.ts +0 -29
  161. package/dist/src/synchronizer/DocSynchronizer.d.ts.map +0 -1
  162. package/dist/src/synchronizer/DocSynchronizer.js +0 -263
  163. package/dist/src/synchronizer/Synchronizer.d.ts +0 -9
  164. package/dist/src/synchronizer/Synchronizer.d.ts.map +0 -1
  165. package/dist/src/synchronizer/Synchronizer.js +0 -2
  166. package/dist/src/types.d.ts +0 -16
  167. package/dist/src/types.d.ts.map +0 -1
  168. package/dist/src/types.js +0 -1
  169. package/dist/test/CollectionSynchronizer.test.d.ts +0 -2
  170. package/dist/test/CollectionSynchronizer.test.d.ts.map +0 -1
  171. package/dist/test/CollectionSynchronizer.test.js +0 -57
  172. package/dist/test/DocHandle.test.d.ts +0 -2
  173. package/dist/test/DocHandle.test.d.ts.map +0 -1
  174. package/dist/test/DocHandle.test.js +0 -238
  175. package/dist/test/DocSynchronizer.test.d.ts +0 -2
  176. package/dist/test/DocSynchronizer.test.d.ts.map +0 -1
  177. package/dist/test/DocSynchronizer.test.js +0 -111
  178. package/dist/test/Network.test.d.ts +0 -2
  179. package/dist/test/Network.test.d.ts.map +0 -1
  180. package/dist/test/Network.test.js +0 -11
  181. package/dist/test/Repo.test.d.ts +0 -2
  182. package/dist/test/Repo.test.d.ts.map +0 -1
  183. package/dist/test/Repo.test.js +0 -568
  184. package/dist/test/StorageSubsystem.test.d.ts +0 -2
  185. package/dist/test/StorageSubsystem.test.d.ts.map +0 -1
  186. package/dist/test/StorageSubsystem.test.js +0 -56
  187. package/dist/test/helpers/DummyNetworkAdapter.d.ts +0 -9
  188. package/dist/test/helpers/DummyNetworkAdapter.d.ts.map +0 -1
  189. package/dist/test/helpers/DummyNetworkAdapter.js +0 -15
  190. package/dist/test/helpers/DummyStorageAdapter.d.ts +0 -16
  191. package/dist/test/helpers/DummyStorageAdapter.d.ts.map +0 -1
  192. package/dist/test/helpers/DummyStorageAdapter.js +0 -33
  193. package/dist/test/helpers/generate-large-object.d.ts +0 -5
  194. package/dist/test/helpers/generate-large-object.d.ts.map +0 -1
  195. package/dist/test/helpers/generate-large-object.js +0 -9
  196. package/dist/test/helpers/getRandomItem.d.ts +0 -2
  197. package/dist/test/helpers/getRandomItem.d.ts.map +0 -1
  198. package/dist/test/helpers/getRandomItem.js +0 -4
  199. package/dist/test/types.d.ts +0 -4
  200. package/dist/test/types.d.ts.map +0 -1
  201. package/dist/test/types.js +0 -1
  202. package/src/CollectionHandle.ts +0 -54
  203. package/src/ferigan.ts +0 -184
@@ -1,49 +0,0 @@
1
- import {
2
- type AutomergeUrl,
3
- type BinaryDocumentId,
4
- type DocumentId,
5
- } from "./types.js"
6
- export declare const urlPrefix = "automerge:"
7
- /**
8
- * given an Automerge URL, return a decoded DocumentId (and the encoded DocumentId)
9
- *
10
- * @param url
11
- * @returns { binaryDocumentId: BinaryDocumentId, documentId: DocumentId }
12
- */
13
- export declare const parseAutomergeUrl: (url: AutomergeUrl) => {
14
- binaryDocumentId: BinaryDocumentId
15
- documentId: DocumentId
16
- }
17
- interface StringifyAutomergeUrlOptions {
18
- documentId: DocumentId | BinaryDocumentId
19
- }
20
- /**
21
- * Given a documentId in either canonical form, return an Automerge URL
22
- * Throws on invalid input.
23
- * Note: this is an object because we anticipate adding fields in the future.
24
- * @param { documentId: BinaryDocumentId | DocumentId }
25
- * @returns AutomergeUrl
26
- */
27
- export declare const stringifyAutomergeUrl: ({
28
- documentId,
29
- }: StringifyAutomergeUrlOptions) => AutomergeUrl
30
- /**
31
- * Given a string, return true if it is a valid Automerge URL
32
- * also acts as a type discriminator in Typescript.
33
- * @param str: URL candidate
34
- * @returns boolean
35
- */
36
- export declare const isValidAutomergeUrl: (str: string) => str is AutomergeUrl
37
- /**
38
- * generateAutomergeUrl produces a new AutomergeUrl.
39
- * generally only called by create(), but used in tests as well.
40
- * @returns a new Automerge URL with a random UUID documentId
41
- */
42
- export declare const generateAutomergeUrl: () => AutomergeUrl
43
- export declare const documentIdToBinary: (
44
- docId: DocumentId
45
- ) => BinaryDocumentId | undefined
46
- export declare const binaryToDocumentId: (docId: BinaryDocumentId) => DocumentId
47
- export declare const parseLegacyUUID: (str: string) => AutomergeUrl | undefined
48
- export {}
49
- //# sourceMappingURL=DocUrl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocUrl.d.ts","sourceRoot":"","sources":["../../src/DocUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;AAInB,eAAO,MAAM,SAAS,eAAe,CAAA;AAErC;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAS,YAAY;;;CAIlD,CAAA;AAED,UAAU,4BAA4B;IACpC,UAAU,EAAE,UAAU,GAAG,gBAAgB,CAAA;CAC1C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,oBAE/B,4BAA4B,KAAG,YAQjC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAAS,MAAM,wBAK9C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAO,YAGpC,CAAA;AAEJ,eAAO,MAAM,kBAAkB,UACtB,UAAU,KAChB,gBAAgB,GAAG,SACyC,CAAA;AAE/D,eAAO,MAAM,kBAAkB,UAAW,gBAAgB,KAAG,UACtB,CAAA;AAEvC,eAAO,MAAM,eAAe,QAAS,MAAM,KAAG,YAAY,GAAG,SAM5D,CAAA"}
@@ -1,72 +0,0 @@
1
- import * as Uuid from "uuid"
2
- import bs58check from "bs58check"
3
- export const urlPrefix = "automerge:"
4
- /**
5
- * given an Automerge URL, return a decoded DocumentId (and the encoded DocumentId)
6
- *
7
- * @param url
8
- * @returns { binaryDocumentId: BinaryDocumentId, documentId: DocumentId }
9
- */
10
- export const parseAutomergeUrl = url => {
11
- const { binaryDocumentId, documentId } = parts(url)
12
- if (!binaryDocumentId) throw new Error("Invalid document URL: " + url)
13
- return { binaryDocumentId, documentId }
14
- }
15
- /**
16
- * Given a documentId in either canonical form, return an Automerge URL
17
- * Throws on invalid input.
18
- * Note: this is an object because we anticipate adding fields in the future.
19
- * @param { documentId: BinaryDocumentId | DocumentId }
20
- * @returns AutomergeUrl
21
- */
22
- export const stringifyAutomergeUrl = ({ documentId }) => {
23
- if (documentId instanceof Uint8Array)
24
- return urlPrefix + binaryToDocumentId(documentId)
25
- else if (typeof documentId === "string") {
26
- return urlPrefix + documentId
27
- }
28
- throw new Error("Invalid documentId: " + documentId)
29
- }
30
- /**
31
- * Given a string, return true if it is a valid Automerge URL
32
- * also acts as a type discriminator in Typescript.
33
- * @param str: URL candidate
34
- * @returns boolean
35
- */
36
- export const isValidAutomergeUrl = str => {
37
- if (!str.startsWith(urlPrefix)) return false
38
- const { binaryDocumentId: documentId } = parts(str)
39
- return documentId ? true : false
40
- }
41
- /**
42
- * generateAutomergeUrl produces a new AutomergeUrl.
43
- * generally only called by create(), but used in tests as well.
44
- * @returns a new Automerge URL with a random UUID documentId
45
- */
46
- export const generateAutomergeUrl = () =>
47
- stringifyAutomergeUrl({
48
- documentId: Uuid.v4(null, new Uint8Array(16)),
49
- })
50
- export const documentIdToBinary = docId => bs58check.decodeUnsafe(docId)
51
- export const binaryToDocumentId = docId => bs58check.encode(docId)
52
- export const parseLegacyUUID = str => {
53
- if (Uuid.validate(str)) {
54
- const uuid = Uuid.parse(str)
55
- return stringifyAutomergeUrl({ documentId: uuid })
56
- }
57
- return undefined
58
- }
59
- /**
60
- * parts breaks up the URL into constituent pieces,
61
- * eventually this could include things like heads, so we use this structure
62
- * we return both a binary & string-encoded version of the document ID
63
- * @param str
64
- * @returns { binaryDocumentId, documentId }
65
- */
66
- const parts = str => {
67
- const regex = new RegExp(`^${urlPrefix}(\\w+)$`)
68
- const [_, docMatch] = str.match(regex) || []
69
- const documentId = docMatch
70
- const binaryDocumentId = documentIdToBinary(documentId)
71
- return { binaryDocumentId, documentId }
72
- }
@@ -1,19 +0,0 @@
1
- import { DocumentId, PeerId } from "./index.js"
2
- import { EphemeralMessageContents } from "./network/messages.js"
3
- export type SessionId = string & {
4
- __SessionId: false
5
- }
6
- export interface EphemeralDataPayload {
7
- documentId: DocumentId
8
- peerId: PeerId
9
- data: {
10
- peerId: PeerId
11
- documentId: DocumentId
12
- data: unknown
13
- }
14
- }
15
- export type EphemeralDataMessageEvents = {
16
- message: (event: EphemeralMessageContents) => void
17
- data: (event: EphemeralDataPayload) => void
18
- }
19
- //# sourceMappingURL=EphemeralData.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EphemeralData.d.ts","sourceRoot":"","sources":["../../src/EphemeralData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAGhE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,WAAW,EAAE,KAAK,CAAA;CAAE,CAAA;AAEvD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CAChE;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAA;IAClD,IAAI,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAA;CAC5C,CAAA"}
@@ -1 +0,0 @@
1
- export {}
@@ -1,74 +0,0 @@
1
- import { NetworkAdapter } from "./network/NetworkAdapter.js"
2
- import { NetworkSubsystem } from "./network/NetworkSubsystem.js"
3
- import { StorageAdapter } from "./storage/StorageAdapter.js"
4
- import { StorageSubsystem } from "./storage/StorageSubsystem.js"
5
- import { type AutomergeUrl, DocumentId, PeerId } from "./types.js"
6
- import { DocHandle } from "./DocHandle.js"
7
- import { EventEmitter } from "eventemitter3"
8
- /** A Repo is a collection of documents with networking, syncing, and storage capabilities. */
9
- /** The `Repo` is the main entry point of this library
10
- *
11
- * @remarks
12
- * To construct a `Repo` you will need an {@link StorageAdapter} and one or
13
- * more {@link NetworkAdapter}s. Once you have a `Repo` you can use it to
14
- * obtain {@link DocHandle}s.
15
- */
16
- export declare class Repo extends EventEmitter<DocCollectionEvents> {
17
- #private
18
- networkSubsystem: NetworkSubsystem
19
- storageSubsystem?: StorageSubsystem
20
- /** By default, we share generously with all peers. */
21
- sharePolicy: SharePolicy
22
- constructor({ storage, network, peerId, sharePolicy }: RepoConfig)
23
- /** Returns all the handles we have cached. */
24
- get handles(): Record<DocumentId, DocHandle<any>>
25
- /**
26
- * Creates a new document and returns a handle to it. The initial value of the document is
27
- * an empty object `{}`. Its documentId is generated by the system. we emit a `document` event
28
- * to advertise interest in the document.
29
- */
30
- create<T>(): DocHandle<T>
31
- /**
32
- * Retrieves a document by id. It gets data from the local system, but also emits a `document`
33
- * event to advertise interest in the document.
34
- */
35
- find<T>(
36
- /** The documentId of the handle to retrieve */
37
- automergeUrl: AutomergeUrl
38
- ): DocHandle<T>
39
- delete(
40
- /** The documentId of the handle to delete */
41
- id: DocumentId | AutomergeUrl
42
- ): void
43
- }
44
- export interface RepoConfig {
45
- /** Our unique identifier */
46
- peerId?: PeerId
47
- /** A storage adapter can be provided, or not */
48
- storage?: StorageAdapter
49
- /** One or more network adapters must be provided */
50
- network: NetworkAdapter[]
51
- /**
52
- * Normal peers typically share generously with everyone (meaning we sync all our documents with
53
- * all peers). A server only syncs documents that a peer explicitly requests by ID.
54
- */
55
- sharePolicy?: SharePolicy
56
- }
57
- export type SharePolicy = (
58
- peerId: PeerId,
59
- documentId?: DocumentId
60
- ) => Promise<boolean>
61
- interface DocCollectionEvents {
62
- document: (arg: DocumentPayload) => void
63
- "delete-document": (arg: DeleteDocumentPayload) => void
64
- "unavailable-document": (arg: DeleteDocumentPayload) => void
65
- }
66
- interface DocumentPayload {
67
- handle: DocHandle<any>
68
- isNew: boolean
69
- }
70
- interface DeleteDocumentPayload {
71
- documentId: DocumentId
72
- }
73
- export {}
74
- //# sourceMappingURL=Repo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Repo.d.ts","sourceRoot":"","sources":["../../src/Repo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,EAAE,KAAK,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AASlE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAG5C,8FAA8F;AAC9F;;;;;;GAMG;AACH,qBAAa,IAAK,SAAQ,YAAY,CAAC,mBAAmB,CAAC;;IAGzD,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IAGnC,sDAAsD;IACtD,WAAW,EAAE,WAAW,CAAmB;gBAE/B,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,UAAU;IAuHjE,8CAA8C;IAC9C,IAAI,OAAO,uCAEV;IAED;;;;OAIG;IACH,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IA0BzB;;;OAGG;IACH,IAAI,CAAC,CAAC;IACJ,+CAA+C;IAC/C,YAAY,EAAE,YAAY,GACzB,SAAS,CAAC,CAAC,CAAC;IAgCf,MAAM;IACJ,6CAA6C;IAC7C,EAAE,EAAE,UAAU,GAAG,YAAY;CAchC;AAED,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,gDAAgD;IAChD,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB,oDAAoD;IACpD,OAAO,EAAE,cAAc,EAAE,CAAA;IAEzB;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,KACpB,OAAO,CAAC,OAAO,CAAC,CAAA;AAGrB,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAA;IACxC,iBAAiB,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;IACvD,sBAAsB,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAC7D;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;CACf;AAED,UAAU,qBAAqB;IAC7B,UAAU,EAAE,UAAU,CAAA;CACvB"}
package/dist/src/Repo.js DELETED
@@ -1,208 +0,0 @@
1
- import debug from "debug"
2
- import { NetworkSubsystem } from "./network/NetworkSubsystem.js"
3
- import { StorageSubsystem } from "./storage/StorageSubsystem.js"
4
- import { CollectionSynchronizer } from "./synchronizer/CollectionSynchronizer.js"
5
- import {
6
- parseAutomergeUrl,
7
- generateAutomergeUrl,
8
- isValidAutomergeUrl,
9
- parseLegacyUUID,
10
- } from "./DocUrl.js"
11
- import { DocHandle } from "./DocHandle.js"
12
- import { EventEmitter } from "eventemitter3"
13
- /** A Repo is a collection of documents with networking, syncing, and storage capabilities. */
14
- /** The `Repo` is the main entry point of this library
15
- *
16
- * @remarks
17
- * To construct a `Repo` you will need an {@link StorageAdapter} and one or
18
- * more {@link NetworkAdapter}s. Once you have a `Repo` you can use it to
19
- * obtain {@link DocHandle}s.
20
- */
21
- export class Repo extends EventEmitter {
22
- #log
23
- networkSubsystem
24
- storageSubsystem
25
- #handleCache = {}
26
- /** By default, we share generously with all peers. */
27
- sharePolicy = async () => true
28
- constructor({ storage, network, peerId, sharePolicy }) {
29
- super()
30
- this.#log = debug(`automerge-repo:repo`)
31
- this.sharePolicy = sharePolicy ?? this.sharePolicy
32
- // DOC COLLECTION
33
- // The `document` event is fired by the DocCollection any time we create a new document or look
34
- // up a document by ID. We listen for it in order to wire up storage and network synchronization.
35
- this.on("document", async ({ handle, isNew }) => {
36
- if (storageSubsystem) {
37
- // Save when the document changes
38
- handle.on("heads-changed", async ({ handle, doc }) => {
39
- await storageSubsystem.saveDoc(handle.documentId, doc)
40
- })
41
- if (isNew) {
42
- // this is a new document, immediately save it
43
- await storageSubsystem.saveDoc(handle.documentId, handle.docSync())
44
- } else {
45
- // Try to load from disk
46
- const loadedDoc = await storageSubsystem.loadDoc(handle.documentId)
47
- if (loadedDoc) {
48
- handle.update(() => loadedDoc)
49
- }
50
- }
51
- }
52
- handle.on("unavailable", () => {
53
- this.#log("document unavailable", { documentId: handle.documentId })
54
- this.emit("unavailable-document", {
55
- documentId: handle.documentId,
56
- })
57
- })
58
- if (this.networkSubsystem.isReady()) {
59
- handle.request()
60
- } else {
61
- handle.awaitNetwork()
62
- this.networkSubsystem
63
- .whenReady()
64
- .then(() => {
65
- handle.networkReady()
66
- })
67
- .catch(err => {
68
- this.#log("error waiting for network", { err })
69
- })
70
- }
71
- // Register the document with the synchronizer. This advertises our interest in the document.
72
- synchronizer.addDocument(handle.documentId)
73
- })
74
- this.on("delete-document", ({ documentId }) => {
75
- // TODO Pass the delete on to the network
76
- // synchronizer.removeDocument(documentId)
77
- if (storageSubsystem) {
78
- storageSubsystem.remove(documentId).catch(err => {
79
- this.#log("error deleting document", { documentId, err })
80
- })
81
- }
82
- })
83
- // SYNCHRONIZER
84
- // The synchronizer uses the network subsystem to keep documents in sync with peers.
85
- const synchronizer = new CollectionSynchronizer(this)
86
- // When the synchronizer emits sync messages, send them to peers
87
- synchronizer.on("message", message => {
88
- this.#log(`sending sync message to ${message.targetId}`)
89
- networkSubsystem.send(message)
90
- })
91
- // STORAGE
92
- // The storage subsystem has access to some form of persistence, and deals with save and loading documents.
93
- const storageSubsystem = storage ? new StorageSubsystem(storage) : undefined
94
- this.storageSubsystem = storageSubsystem
95
- // NETWORK
96
- // The network subsystem deals with sending and receiving messages to and from peers.
97
- const networkSubsystem = new NetworkSubsystem(network, peerId)
98
- this.networkSubsystem = networkSubsystem
99
- // When we get a new peer, register it with the synchronizer
100
- networkSubsystem.on("peer", async ({ peerId }) => {
101
- this.#log("peer connected", { peerId })
102
- synchronizer.addPeer(peerId)
103
- })
104
- // When a peer disconnects, remove it from the synchronizer
105
- networkSubsystem.on("peer-disconnected", ({ peerId }) => {
106
- synchronizer.removePeer(peerId)
107
- })
108
- // Handle incoming messages
109
- networkSubsystem.on("message", async msg => {
110
- await synchronizer.receiveMessage(msg)
111
- })
112
- }
113
- /** Returns an existing handle if we have it; creates one otherwise. */
114
- #getHandle(
115
- /** The documentId of the handle to look up or create */
116
- documentId,
117
- /** If we know we're creating a new document, specify this so we can have access to it immediately */
118
- isNew
119
- ) {
120
- // If we have the handle cached, return it
121
- if (this.#handleCache[documentId]) return this.#handleCache[documentId]
122
- // If not, create a new handle, cache it, and return it
123
- if (!documentId) throw new Error(`Invalid documentId ${documentId}`)
124
- const handle = new DocHandle(documentId, { isNew })
125
- this.#handleCache[documentId] = handle
126
- return handle
127
- }
128
- /** Returns all the handles we have cached. */
129
- get handles() {
130
- return this.#handleCache
131
- }
132
- /**
133
- * Creates a new document and returns a handle to it. The initial value of the document is
134
- * an empty object `{}`. Its documentId is generated by the system. we emit a `document` event
135
- * to advertise interest in the document.
136
- */
137
- create() {
138
- // TODO:
139
- // either
140
- // - pass an initial value and do something like this to ensure that you get a valid initial value
141
- // const myInitialValue = {
142
- // tasks: [],
143
- // filter: "all",
144
- //
145
- // const guaranteeInitialValue = (doc: any) => {
146
- // if (!doc.tasks) doc.tasks = []
147
- // if (!doc.filter) doc.filter = "all"
148
- // return { ...myInitialValue, ...doc }
149
- // }
150
- // or
151
- // - pass a "reify" function that takes a `<any>` and returns `<T>`
152
- // Generate a new UUID and store it in the buffer
153
- const { documentId } = parseAutomergeUrl(generateAutomergeUrl())
154
- const handle = this.#getHandle(documentId, true)
155
- this.emit("document", { handle, isNew: true })
156
- return handle
157
- }
158
- /**
159
- * Retrieves a document by id. It gets data from the local system, but also emits a `document`
160
- * event to advertise interest in the document.
161
- */
162
- find(
163
- /** The documentId of the handle to retrieve */
164
- automergeUrl
165
- ) {
166
- if (!isValidAutomergeUrl(automergeUrl)) {
167
- let maybeAutomergeUrl = parseLegacyUUID(automergeUrl)
168
- if (maybeAutomergeUrl) {
169
- console.warn(
170
- "Legacy UUID document ID detected, converting to AutomergeUrl. This will be removed in a future version."
171
- )
172
- automergeUrl = maybeAutomergeUrl
173
- } else {
174
- throw new Error(`Invalid AutomergeUrl: '${automergeUrl}'`)
175
- }
176
- }
177
- const { documentId } = parseAutomergeUrl(automergeUrl)
178
- // If we have the handle cached, return it
179
- if (this.#handleCache[documentId]) {
180
- if (this.#handleCache[documentId].isUnavailable()) {
181
- // this ensures that the event fires after the handle has been returned
182
- setTimeout(() => {
183
- this.#handleCache[documentId].emit("unavailable", {
184
- handle: this.#handleCache[documentId],
185
- })
186
- })
187
- }
188
- return this.#handleCache[documentId]
189
- }
190
- const handle = this.#getHandle(documentId, false)
191
- this.emit("document", { handle, isNew: false })
192
- return handle
193
- }
194
- delete(
195
- /** The documentId of the handle to delete */
196
- id
197
- ) {
198
- if (isValidAutomergeUrl(id)) {
199
- ;({ documentId: id } = parseAutomergeUrl(id))
200
- }
201
- const handle = this.#getHandle(id, false)
202
- handle.delete()
203
- delete this.#handleCache[id]
204
- this.emit("delete-document", {
205
- documentId: id,
206
- })
207
- }
208
- }
@@ -1,2 +0,0 @@
1
- export declare const arraysAreEqual: <T>(a: T[], b: T[]) => boolean
2
- //# sourceMappingURL=arraysAreEqual.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arraysAreEqual.d.ts","sourceRoot":"","sources":["../../../src/helpers/arraysAreEqual.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,gCACiD,CAAA"}
@@ -1,2 +0,0 @@
1
- export const arraysAreEqual = (a, b) =>
2
- a.length === b.length && a.every((element, index) => element === b[index])
@@ -1,4 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- export declare function encode(obj: any): Buffer
3
- export declare function decode(buf: Buffer | Uint8Array): any
4
- //# sourceMappingURL=cbor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cbor.d.ts","sourceRoot":"","sources":["../../../src/helpers/cbor.ts"],"names":[],"mappings":";AAEA,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAGvC;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,GAAG,CAEpD"}
@@ -1,8 +0,0 @@
1
- import { Encoder, decode as cborXdecode } from "cbor-x"
2
- export function encode(obj) {
3
- let encoder = new Encoder({ tagUint8Array: false })
4
- return encoder.encode(obj)
5
- }
6
- export function decode(buf) {
7
- return cborXdecode(buf)
8
- }
@@ -1,11 +0,0 @@
1
- import { EventEmitter } from "eventemitter3"
2
- /** Returns a promise that resolves when the given event is emitted on the given emitter. */
3
- export declare const eventPromise: (
4
- emitter: EventEmitter,
5
- event: string
6
- ) => Promise<any>
7
- export declare const eventPromises: (
8
- emitters: EventEmitter[],
9
- event: string
10
- ) => Promise<any[]>
11
- //# sourceMappingURL=eventPromise.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eventPromise.d.ts","sourceRoot":"","sources":["../../../src/helpers/eventPromise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,4FAA4F;AAC5F,eAAO,MAAM,YAAY,YAAa,YAAY,SAAS,MAAM,iBACE,CAAA;AAEnE,eAAO,MAAM,aAAa,aAAc,YAAY,EAAE,SAAS,MAAM,mBAGpE,CAAA"}
@@ -1,7 +0,0 @@
1
- /** Returns a promise that resolves when the given event is emitted on the given emitter. */
2
- export const eventPromise = (emitter, event) =>
3
- new Promise(resolve => emitter.once(event, d => resolve(d)))
4
- export const eventPromises = (emitters, event) => {
5
- const promises = emitters.map(emitter => eventPromise(emitter, event))
6
- return Promise.all(promises)
7
- }
@@ -1,2 +0,0 @@
1
- export declare const headsAreSame: (a: Heads, b: Heads) => boolean
2
- //# sourceMappingURL=headsAreSame.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"headsAreSame.d.ts","sourceRoot":"","sources":["../../../src/helpers/headsAreSame.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,iCAExB,CAAA"}
@@ -1,4 +0,0 @@
1
- import { arraysAreEqual } from "./arraysAreEqual.js"
2
- export const headsAreSame = (a, b) => {
3
- return arraysAreEqual(a, b)
4
- }
@@ -1,2 +0,0 @@
1
- export declare function mergeArrays(myArrays: Uint8Array[]): Uint8Array
2
- //# sourceMappingURL=mergeArrays.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mergeArrays.d.ts","sourceRoot":"","sources":["../../../src/helpers/mergeArrays.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,cAgBjD"}
@@ -1,15 +0,0 @@
1
- export function mergeArrays(myArrays) {
2
- // Get the total length of all arrays.
3
- let length = 0
4
- myArrays.forEach(item => {
5
- length += item.length
6
- })
7
- // Create a new array with total length and merge all source arrays.
8
- const mergedArray = new Uint8Array(length)
9
- let offset = 0
10
- myArrays.forEach(item => {
11
- mergedArray.set(item, offset)
12
- offset += item.length
13
- })
14
- return mergedArray
15
- }
@@ -1,6 +0,0 @@
1
- export declare const pause: (t?: number) => Promise<void>
2
- export declare function rejectOnTimeout<T>(
3
- promise: Promise<T>,
4
- millis: number
5
- ): Promise<T>
6
- //# sourceMappingURL=pause.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/helpers/pause.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,+BAC4C,CAAA;AAE9D,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAKlF"}
@@ -1,10 +0,0 @@
1
- export const pause = (t = 0) =>
2
- new Promise(resolve => setTimeout(() => resolve(), t))
3
- export function rejectOnTimeout(promise, millis) {
4
- return Promise.race([
5
- promise,
6
- pause(millis).then(() => {
7
- throw new Error("timeout exceeded")
8
- }),
9
- ])
10
- }
@@ -1,21 +0,0 @@
1
- import { type NetworkAdapter } from "../../index.js"
2
- /**
3
- * Runs a series of tests against a set of three peers, each represented by one or more instantiated
4
- * network adapters.
5
- *
6
- * The adapter `setup` function should return an object with the following properties:
7
- *
8
- * - `adapters`: A tuple representing three peers' network configuration. Each element can be either
9
- * a single adapter or an array of adapters. Each will be used to instantiate a Repo for that
10
- * peer.
11
- * - `teardown`: An optional function that will be called after the tests have run. This can be used
12
- * to clean up any resources that were created during the test.
13
- */
14
- export declare function runAdapterTests(_setup: SetupFn, title?: string): void
15
- type Network = NetworkAdapter | NetworkAdapter[]
16
- export type SetupFn = () => Promise<{
17
- adapters: [Network, Network, Network]
18
- teardown?: () => void
19
- }>
20
- export {}
21
- //# sourceMappingURL=network-adapter-tests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-adapter-tests.d.ts","sourceRoot":"","sources":["../../../../src/helpers/tests/network-adapter-tests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAc,MAAM,gBAAgB,CAAA;AAM9E;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CA8HrE;AAID,KAAK,OAAO,GAAG,cAAc,GAAG,cAAc,EAAE,CAAA;AAEhD,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,CAAC,CAAA"}