@dxos/echo-pipeline 0.5.9-main.ea1d25b → 0.5.9-main.eacfffa

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 (43) hide show
  1. package/dist/lib/browser/{chunk-I2J5TTHJ.mjs → chunk-ZCEMVITI.mjs} +28 -7
  2. package/dist/lib/browser/{chunk-I2J5TTHJ.mjs.map → chunk-ZCEMVITI.mjs.map} +1 -1
  3. package/dist/lib/browser/index.mjs +138 -230
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +11 -7
  7. package/dist/lib/browser/testing/index.mjs.map +1 -1
  8. package/dist/lib/node/{chunk-QPCNQ4ZK.cjs → chunk-V2O4ACHA.cjs} +31 -10
  9. package/dist/lib/node/{chunk-QPCNQ4ZK.cjs.map → chunk-V2O4ACHA.cjs.map} +1 -1
  10. package/dist/lib/node/index.cjs +172 -259
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +21 -17
  14. package/dist/lib/node/testing/index.cjs.map +1 -1
  15. package/dist/types/src/automerge/automerge-doc-loader.d.ts.map +1 -1
  16. package/dist/types/src/automerge/automerge-host.d.ts +1 -9
  17. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  18. package/dist/types/src/automerge/echo-network-adapter.d.ts +6 -0
  19. package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
  20. package/dist/types/src/automerge/echo-replicator.d.ts +1 -0
  21. package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
  22. package/dist/types/src/automerge/index.d.ts +0 -1
  23. package/dist/types/src/automerge/index.d.ts.map +1 -1
  24. package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
  25. package/package.json +33 -33
  26. package/src/automerge/automerge-doc-loader.test.ts +2 -3
  27. package/src/automerge/automerge-doc-loader.ts +4 -2
  28. package/src/automerge/automerge-host.ts +8 -35
  29. package/src/automerge/echo-network-adapter.ts +24 -8
  30. package/src/automerge/echo-replicator.ts +2 -0
  31. package/src/automerge/index.ts +0 -1
  32. package/src/automerge/mesh-echo-replicator.ts +8 -1
  33. package/src/automerge/storage-adapter.test.ts +103 -139
  34. package/src/space/space-protocol.test.ts +2 -0
  35. package/dist/types/src/automerge/automerge-storage-adapter.d.ts +0 -16
  36. package/dist/types/src/automerge/automerge-storage-adapter.d.ts.map +0 -1
  37. package/dist/types/src/automerge/automerge-storage/342/200/223wrapper.d.ts +0 -25
  38. package/dist/types/src/automerge/automerge-storage/342/200/223wrapper.d.ts.map +0 -1
  39. package/dist/types/src/automerge/migrations.d.ts +0 -7
  40. package/dist/types/src/automerge/migrations.d.ts.map +0 -1
  41. package/src/automerge/automerge-storage-adapter.ts +0 -103
  42. package/src/automerge/automerge-storage/342/200/223wrapper.ts +0 -59
  43. package/src/automerge/migrations.ts +0 -42
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../src/automerge/migrations.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAK1E,eAAO,MAAM,cAAc,sBAA6B;IAAE,EAAE,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,kBA4B/F,CAAC"}
@@ -1,103 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
- //
5
- // Copyright 2023 DXOS.org
6
- //
7
-
8
- import { type Chunk, type StorageKey, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';
9
- import { type Directory } from '@dxos/random-access-storage';
10
- import { arrayToBuffer, bufferToArray } from '@dxos/util';
11
-
12
- export class AutomergeStorageAdapter implements StorageAdapterInterface {
13
- // TODO(mykola): Hack for restricting automerge Repo to access storage if Host is `closed`.
14
- // Automerge Repo do not have any lifetime management.
15
- private _state: 'opened' | 'closed' = 'opened';
16
-
17
- constructor(private readonly _directory: Directory) {}
18
-
19
- async load(key: StorageKey): Promise<Uint8Array | undefined> {
20
- if (this._state !== 'opened') {
21
- return undefined;
22
- }
23
- const filename = this._getFilename(key);
24
- const file = this._directory.getOrCreateFile(filename);
25
- const { size } = await file.stat();
26
- if (!size || size === 0) {
27
- return undefined;
28
- }
29
- const buffer = await file.read(0, size);
30
- return bufferToArray(buffer);
31
- }
32
-
33
- async save(key: StorageKey, data: Uint8Array): Promise<void> {
34
- if (this._state !== 'opened') {
35
- return undefined;
36
- }
37
- const filename = this._getFilename(key);
38
- const file = this._directory.getOrCreateFile(filename);
39
- await file.write(0, arrayToBuffer(data));
40
- await file.truncate?.(data.length);
41
-
42
- await file.flush?.();
43
- }
44
-
45
- async remove(key: StorageKey): Promise<void> {
46
- if (this._state !== 'opened') {
47
- return undefined;
48
- }
49
- // TODO(dmaretskyi): Better deletion.
50
- const filename = this._getFilename(key);
51
- const file = this._directory.getOrCreateFile(filename);
52
- await file.destroy();
53
- }
54
-
55
- async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {
56
- if (this._state !== 'opened') {
57
- return [];
58
- }
59
- const filename = this._getFilename(keyPrefix);
60
- const entries = await this._directory.list();
61
- return Promise.all(
62
- entries
63
- .filter((entry) => entry.startsWith(filename))
64
- .map(async (entry): Promise<Chunk> => {
65
- const file = this._directory.getOrCreateFile(entry);
66
- const { size } = await file.stat();
67
- const buffer = await file.read(0, size);
68
- return {
69
- key: this._getKeyFromFilename(entry),
70
- data: bufferToArray(buffer),
71
- };
72
- }),
73
- );
74
- }
75
-
76
- async removeRange(keyPrefix: StorageKey): Promise<void> {
77
- if (this._state !== 'opened') {
78
- return undefined;
79
- }
80
- const filename = this._getFilename(keyPrefix);
81
- const entries = await this._directory.list();
82
- await Promise.all(
83
- entries
84
- .filter((entry) => entry.startsWith(filename))
85
- .map(async (entry): Promise<void> => {
86
- const file = this._directory.getOrCreateFile(entry);
87
- await file.destroy();
88
- }),
89
- );
90
- }
91
-
92
- async close(): Promise<void> {
93
- this._state = 'closed';
94
- }
95
-
96
- private _getFilename(key: StorageKey): string {
97
- return key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-');
98
- }
99
-
100
- private _getKeyFromFilename(filename: string): StorageKey {
101
- return filename.split('-').map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%'));
102
- }
103
- }
@@ -1,59 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type StorageKey, type Chunk, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';
6
- import { type MaybePromise } from '@dxos/util';
7
-
8
- import { AutomergeStorageAdapter } from './automerge-storage-adapter';
9
-
10
- export type StorageCallbacks = {
11
- beforeSave?: (path: string[]) => MaybePromise<void>;
12
- afterSave?: (path: string[]) => MaybePromise<void>;
13
- };
14
-
15
- export type AutomergeStorageWrapperParams = {
16
- storage: StorageAdapterInterface;
17
- callbacks: StorageCallbacks;
18
- };
19
-
20
- /**
21
- * Wrapper for automerge storage that adds callback on save.
22
- */
23
- export class AutomergeStorageWrapper implements StorageAdapterInterface {
24
- private readonly _storage: StorageAdapterInterface;
25
- private readonly _callbacks: StorageCallbacks;
26
-
27
- constructor({ storage, callbacks }: AutomergeStorageWrapperParams) {
28
- this._storage = storage;
29
- this._callbacks = callbacks;
30
- }
31
-
32
- async load(key: StorageKey): Promise<Uint8Array | undefined> {
33
- return this._storage.load(key);
34
- }
35
-
36
- async save(key: StorageKey, value: Uint8Array): Promise<void> {
37
- await this._callbacks.beforeSave?.(key);
38
- await this._storage.save(key, value);
39
- await this._callbacks.afterSave?.(key);
40
- }
41
-
42
- async remove(key: StorageKey): Promise<void> {
43
- return this._storage.remove(key);
44
- }
45
-
46
- async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {
47
- return this._storage.loadRange(keyPrefix);
48
- }
49
-
50
- async removeRange(keyPrefix: StorageKey): Promise<void> {
51
- return this._storage.removeRange(keyPrefix);
52
- }
53
-
54
- async close() {
55
- if (this._storage instanceof AutomergeStorageAdapter) {
56
- return this._storage.close();
57
- }
58
- }
59
- }
@@ -1,42 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type StorageKey } from '@dxos/automerge/automerge-repo';
6
- import { IndexedDBStorageAdapter } from '@dxos/automerge/automerge-repo-storage-indexeddb';
7
- import { type SublevelDB } from '@dxos/kv-store';
8
- import { log } from '@dxos/log';
9
- import { StorageType, type Directory } from '@dxos/random-access-storage';
10
-
11
- import { AutomergeStorageAdapter } from './automerge-storage-adapter';
12
- import { encodingOptions } from './leveldb-storage-adapter';
13
-
14
- export const levelMigration = async ({ db, directory }: { db: SublevelDB; directory: Directory }) => {
15
- // Note: Make auto-migration from previous storage to leveldb here.
16
- const isNewLevel = !(await db
17
- .iterator<StorageKey, Uint8Array>({
18
- ...encodingOptions,
19
- })
20
- .next());
21
-
22
- if (!isNewLevel) {
23
- return;
24
- }
25
-
26
- const oldStorageAdapter =
27
- directory.type === StorageType.IDB
28
- ? new IndexedDBStorageAdapter(directory.path, 'data')
29
- : new AutomergeStorageAdapter(directory);
30
-
31
- const chunks = await oldStorageAdapter.loadRange([]);
32
- if (chunks.length === 0) {
33
- return;
34
- }
35
-
36
- const batch = db.batch();
37
- log.info('found chunks on old storage adapter', { chunks: chunks.length });
38
- for (const { key, data } of await oldStorageAdapter.loadRange([])) {
39
- data && batch.put<StorageKey, Uint8Array>(key, data, { ...encodingOptions });
40
- }
41
- await batch.write();
42
- };