loro-crdt 1.0.7 → 1.0.8-alpha.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.
Binary file
@@ -0,0 +1,249 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ export const memory: WebAssembly.Memory;
4
+ export function __wbg_lorocounter_free(a: number): void;
5
+ export function lorocounter_new(): number;
6
+ export function lorocounter_increment(a: number, b: number, c: number): void;
7
+ export function lorocounter_decrement(a: number, b: number, c: number): void;
8
+ export function lorocounter_value(a: number): number;
9
+ export function lorocounter_subscribe(a: number, b: number, c: number): void;
10
+ export function lorocounter_parent(a: number): number;
11
+ export function lorocounter_isAttached(a: number): number;
12
+ export function lorocounter_getAttached(a: number): number;
13
+ export function __wbg_awarenesswasm_free(a: number): void;
14
+ export function awarenesswasm_new(a: number, b: number): number;
15
+ export function awarenesswasm_encode(a: number, b: number, c: number): void;
16
+ export function awarenesswasm_encodeAll(a: number, b: number): void;
17
+ export function awarenesswasm_apply(a: number, b: number, c: number, d: number): void;
18
+ export function awarenesswasm_setLocalState(a: number, b: number): void;
19
+ export function awarenesswasm_peer(a: number): number;
20
+ export function awarenesswasm_getAllStates(a: number): number;
21
+ export function awarenesswasm_getState(a: number, b: number): number;
22
+ export function awarenesswasm_getTimestamp(a: number, b: number, c: number): void;
23
+ export function awarenesswasm_removeOutdated(a: number, b: number): void;
24
+ export function awarenesswasm_length(a: number): number;
25
+ export function awarenesswasm_isEmpty(a: number): number;
26
+ export function awarenesswasm_peers(a: number, b: number): void;
27
+ export function run(): void;
28
+ export function encodeFrontiers(a: number, b: number, c: number): void;
29
+ export function decodeFrontiers(a: number, b: number, c: number): void;
30
+ export function setDebug(): void;
31
+ export function __wbg_lorodoc_free(a: number): void;
32
+ export function lorodoc_new(): number;
33
+ export function lorodoc_setDetachedEditing(a: number, b: number): void;
34
+ export function lorodoc_isDetachedEditingEnabled(a: number): number;
35
+ export function lorodoc_setRecordTimestamp(a: number, b: number): void;
36
+ export function lorodoc_setChangeMergeInterval(a: number, b: number): void;
37
+ export function lorodoc_configTextStyle(a: number, b: number, c: number): void;
38
+ export function lorodoc_fromSnapshot(a: number, b: number, c: number): void;
39
+ export function lorodoc_attach(a: number): void;
40
+ export function lorodoc_isDetached(a: number): number;
41
+ export function lorodoc_detach(a: number): void;
42
+ export function lorodoc_fork(a: number): number;
43
+ export function lorodoc_forkAt(a: number, b: number, c: number, d: number): void;
44
+ export function lorodoc_checkoutToLatest(a: number, b: number): void;
45
+ export function lorodoc_travelChangeAncestors(a: number, b: number, c: number, d: number, e: number): void;
46
+ export function lorodoc_checkout(a: number, b: number, c: number, d: number): void;
47
+ export function lorodoc_peerId(a: number): number;
48
+ export function lorodoc_peerIdStr(a: number): number;
49
+ export function lorodoc_setPeerId(a: number, b: number, c: number): void;
50
+ export function lorodoc_commit(a: number, b: number, c: number): void;
51
+ export function lorodoc_getPendingTxnLength(a: number): number;
52
+ export function lorodoc_getText(a: number, b: number, c: number): void;
53
+ export function lorodoc_getMap(a: number, b: number, c: number): void;
54
+ export function lorodoc_getList(a: number, b: number, c: number): void;
55
+ export function lorodoc_getMovableList(a: number, b: number, c: number): void;
56
+ export function lorodoc_getCounter(a: number, b: number, c: number): void;
57
+ export function lorodoc_getTree(a: number, b: number, c: number): void;
58
+ export function lorodoc_getContainerById(a: number, b: number, c: number): void;
59
+ export function lorodoc_setNextCommitMessage(a: number, b: number, c: number): void;
60
+ export function lorodoc_getDeepValueWithID(a: number): number;
61
+ export function lorodoc_getPathToContainer(a: number, b: number, c: number): void;
62
+ export function lorodoc_JSONPath(a: number, b: number, c: number, d: number): void;
63
+ export function lorodoc_version(a: number): number;
64
+ export function lorodoc_shallowSinceVV(a: number): number;
65
+ export function lorodoc_isShallow(a: number): number;
66
+ export function lorodoc_shallowSinceFrontiers(a: number): number;
67
+ export function lorodoc_oplogVersion(a: number): number;
68
+ export function lorodoc_frontiers(a: number): number;
69
+ export function lorodoc_oplogFrontiers(a: number): number;
70
+ export function lorodoc_cmpWithFrontiers(a: number, b: number, c: number, d: number): void;
71
+ export function lorodoc_cmpFrontiers(a: number, b: number, c: number, d: number, e: number, f: number): void;
72
+ export function lorodoc_exportSnapshot(a: number, b: number): void;
73
+ export function lorodoc_exportFrom(a: number, b: number, c: number): void;
74
+ export function lorodoc_export(a: number, b: number, c: number): void;
75
+ export function lorodoc_exportJsonUpdates(a: number, b: number, c: number, d: number): void;
76
+ export function lorodoc_importJsonUpdates(a: number, b: number, c: number): void;
77
+ export function lorodoc_import(a: number, b: number, c: number, d: number): void;
78
+ export function lorodoc_importUpdateBatch(a: number, b: number, c: number): void;
79
+ export function lorodoc_getShallowValue(a: number, b: number): void;
80
+ export function lorodoc_toJSON(a: number, b: number): void;
81
+ export function lorodoc_subscribe(a: number, b: number): number;
82
+ export function lorodoc_subscribeLocalUpdates(a: number, b: number): number;
83
+ export function lorodoc_debugHistory(a: number): void;
84
+ export function lorodoc_getAllChanges(a: number): number;
85
+ export function lorodoc_getChangeAt(a: number, b: number, c: number): void;
86
+ export function lorodoc_getChangeAtLamport(a: number, b: number, c: number, d: number, e: number): void;
87
+ export function lorodoc_getOpsInChange(a: number, b: number, c: number): void;
88
+ export function lorodoc_frontiersToVV(a: number, b: number, c: number, d: number): void;
89
+ export function lorodoc_vvToFrontiers(a: number, b: number, c: number): void;
90
+ export function lorodoc_getByPath(a: number, b: number, c: number): number;
91
+ export function lorodoc_getCursorPos(a: number, b: number, c: number): void;
92
+ export function __wbg_lorotext_free(a: number): void;
93
+ export function lorotext_new(): number;
94
+ export function lorotext_kind(a: number): number;
95
+ export function lorotext_iter(a: number, b: number): void;
96
+ export function lorotext_update(a: number, b: number, c: number): void;
97
+ export function lorotext_updateByLine(a: number, b: number, c: number): void;
98
+ export function lorotext_insert(a: number, b: number, c: number, d: number, e: number): void;
99
+ export function lorotext_slice(a: number, b: number, c: number, d: number): void;
100
+ export function lorotext_charAt(a: number, b: number, c: number): void;
101
+ export function lorotext_splice(a: number, b: number, c: number, d: number, e: number, f: number): void;
102
+ export function lorotext_insertUtf8(a: number, b: number, c: number, d: number, e: number): void;
103
+ export function lorotext_delete(a: number, b: number, c: number, d: number): void;
104
+ export function lorotext_deleteUtf8(a: number, b: number, c: number, d: number): void;
105
+ export function lorotext_mark(a: number, b: number, c: number, d: number, e: number, f: number): void;
106
+ export function lorotext_unmark(a: number, b: number, c: number, d: number, e: number): void;
107
+ export function lorotext_toString(a: number, b: number): void;
108
+ export function lorotext_toDelta(a: number): number;
109
+ export function lorotext_id(a: number): number;
110
+ export function lorotext_length(a: number): number;
111
+ export function lorotext_subscribe(a: number, b: number, c: number): void;
112
+ export function lorotext_applyDelta(a: number, b: number, c: number): void;
113
+ export function lorotext_parent(a: number): number;
114
+ export function lorotext_getAttached(a: number): number;
115
+ export function lorotext_getCursor(a: number, b: number, c: number): number;
116
+ export function __wbg_loromap_free(a: number): void;
117
+ export function loromap_new(): number;
118
+ export function loromap_kind(a: number): number;
119
+ export function loromap_set(a: number, b: number, c: number, d: number, e: number): void;
120
+ export function loromap_delete(a: number, b: number, c: number, d: number): void;
121
+ export function loromap_get(a: number, b: number, c: number): number;
122
+ export function loromap_getOrCreateContainer(a: number, b: number, c: number, d: number, e: number): void;
123
+ export function loromap_keys(a: number, b: number): void;
124
+ export function loromap_values(a: number, b: number): void;
125
+ export function loromap_entries(a: number, b: number): void;
126
+ export function loromap_id(a: number): number;
127
+ export function loromap_toJSON(a: number): number;
128
+ export function loromap_setContainer(a: number, b: number, c: number, d: number, e: number): void;
129
+ export function loromap_subscribe(a: number, b: number, c: number): void;
130
+ export function loromap_size(a: number): number;
131
+ export function loromap_parent(a: number): number;
132
+ export function loromap_getAttached(a: number): number;
133
+ export function loromap_clear(a: number, b: number): void;
134
+ export function __wbg_lorolist_free(a: number): void;
135
+ export function lorolist_new(): number;
136
+ export function lorolist_kind(a: number): number;
137
+ export function lorolist_insert(a: number, b: number, c: number, d: number): void;
138
+ export function lorolist_delete(a: number, b: number, c: number, d: number): void;
139
+ export function lorolist_get(a: number, b: number): number;
140
+ export function lorolist_id(a: number): number;
141
+ export function lorolist_toArray(a: number, b: number): void;
142
+ export function lorolist_toJSON(a: number): number;
143
+ export function lorolist_insertContainer(a: number, b: number, c: number, d: number): void;
144
+ export function lorolist_subscribe(a: number, b: number, c: number): void;
145
+ export function lorolist_length(a: number): number;
146
+ export function lorolist_parent(a: number): number;
147
+ export function lorolist_isAttached(a: number): number;
148
+ export function lorolist_getAttached(a: number): number;
149
+ export function lorolist_getCursor(a: number, b: number, c: number): number;
150
+ export function lorolist_push(a: number, b: number, c: number): void;
151
+ export function lorolist_pop(a: number, b: number): void;
152
+ export function lorolist_clear(a: number, b: number): void;
153
+ export function loromovablelist_new(): number;
154
+ export function loromovablelist_kind(a: number): number;
155
+ export function loromovablelist_insert(a: number, b: number, c: number, d: number): void;
156
+ export function loromovablelist_delete(a: number, b: number, c: number, d: number): void;
157
+ export function loromovablelist_get(a: number, b: number): number;
158
+ export function loromovablelist_id(a: number): number;
159
+ export function loromovablelist_toArray(a: number, b: number): void;
160
+ export function loromovablelist_toJSON(a: number): number;
161
+ export function loromovablelist_insertContainer(a: number, b: number, c: number, d: number): void;
162
+ export function loromovablelist_subscribe(a: number, b: number, c: number): void;
163
+ export function loromovablelist_length(a: number): number;
164
+ export function loromovablelist_getAttached(a: number): number;
165
+ export function loromovablelist_getCursor(a: number, b: number, c: number): number;
166
+ export function loromovablelist_move(a: number, b: number, c: number, d: number): void;
167
+ export function loromovablelist_set(a: number, b: number, c: number, d: number): void;
168
+ export function loromovablelist_setContainer(a: number, b: number, c: number, d: number): void;
169
+ export function loromovablelist_push(a: number, b: number, c: number): void;
170
+ export function loromovablelist_pop(a: number, b: number): void;
171
+ export function loromovablelist_clear(a: number, b: number): void;
172
+ export function __wbg_lorotree_free(a: number): void;
173
+ export function lorotreenode___getClassname(a: number, b: number): void;
174
+ export function __wbg_lorotreenode_free(a: number): void;
175
+ export function lorotreenode_id(a: number): number;
176
+ export function lorotreenode_createNode(a: number, b: number, c: number, d: number): void;
177
+ export function lorotreenode_move(a: number, b: number, c: number, d: number, e: number): void;
178
+ export function lorotreenode_moveAfter(a: number, b: number, c: number): void;
179
+ export function lorotreenode_moveBefore(a: number, b: number, c: number): void;
180
+ export function lorotreenode_index(a: number, b: number): void;
181
+ export function lorotreenode_fractionalIndex(a: number, b: number): void;
182
+ export function lorotreenode_data(a: number, b: number): void;
183
+ export function lorotreenode_parent(a: number, b: number): void;
184
+ export function lorotreenode_children(a: number): number;
185
+ export function lorotreenode_isDeleted(a: number, b: number): void;
186
+ export function lorotree_new(): number;
187
+ export function lorotree_kind(a: number): number;
188
+ export function lorotree_createNode(a: number, b: number, c: number, d: number, e: number): void;
189
+ export function lorotree_move(a: number, b: number, c: number, d: number, e: number, f: number): void;
190
+ export function lorotree_delete(a: number, b: number, c: number): void;
191
+ export function lorotree_getNodeByID(a: number, b: number): number;
192
+ export function lorotree_id(a: number): number;
193
+ export function lorotree_has(a: number, b: number): number;
194
+ export function lorotree_isNodeDeleted(a: number, b: number, c: number): void;
195
+ export function lorotree_toArray(a: number, b: number): void;
196
+ export function lorotree_getNodes(a: number, b: number, c: number): void;
197
+ export function lorotree_toJSON(a: number): number;
198
+ export function lorotree_nodes(a: number, b: number): void;
199
+ export function lorotree_roots(a: number, b: number): void;
200
+ export function lorotree_subscribe(a: number, b: number, c: number): void;
201
+ export function lorotree_parent(a: number): number;
202
+ export function lorotree_isAttached(a: number): number;
203
+ export function lorotree_getAttached(a: number): number;
204
+ export function lorotree_enableFractionalIndex(a: number, b: number): void;
205
+ export function lorotree_disableFractionalIndex(a: number): void;
206
+ export function lorotree_isFractionalIndexEnabled(a: number): number;
207
+ export function __wbg_cursor_free(a: number): void;
208
+ export function cursor_containerId(a: number): number;
209
+ export function cursor_pos(a: number): number;
210
+ export function cursor_side(a: number): number;
211
+ export function cursor_encode(a: number, b: number): void;
212
+ export function cursor_decode(a: number, b: number, c: number): void;
213
+ export function cursor_kind(a: number): number;
214
+ export function __wbg_undomanager_free(a: number): void;
215
+ export function undomanager_new(a: number, b: number): number;
216
+ export function undomanager_undo(a: number, b: number): void;
217
+ export function undomanager_redo(a: number, b: number): void;
218
+ export function undomanager_canUndo(a: number): number;
219
+ export function undomanager_canRedo(a: number): number;
220
+ export function undomanager_setMaxUndoSteps(a: number, b: number): void;
221
+ export function undomanager_setMergeInterval(a: number, b: number): void;
222
+ export function undomanager_addExcludeOriginPrefix(a: number, b: number, c: number): void;
223
+ export function undomanager_checkBinding(a: number, b: number): number;
224
+ export function undomanager_setOnPush(a: number, b: number): void;
225
+ export function undomanager_setOnPop(a: number, b: number): void;
226
+ export function undomanager_clear(a: number): void;
227
+ export function __wbg_versionvector_free(a: number): void;
228
+ export function versionvector_new(a: number, b: number): void;
229
+ export function versionvector_parseJSON(a: number, b: number): void;
230
+ export function versionvector_toJSON(a: number): number;
231
+ export function versionvector_encode(a: number, b: number): void;
232
+ export function versionvector_decode(a: number, b: number, c: number): void;
233
+ export function versionvector_get(a: number, b: number, c: number): void;
234
+ export function versionvector_compare(a: number, b: number, c: number): void;
235
+ export function decodeImportBlobMeta(a: number, b: number, c: number): void;
236
+ export function __wbg_loromovablelist_free(a: number): void;
237
+ export function loromovablelist_parent(a: number): number;
238
+ export function lorotext_isAttached(a: number): number;
239
+ export function loromap_isAttached(a: number): number;
240
+ export function loromovablelist_isAttached(a: number): number;
241
+ export function __wbindgen_export_0(a: number, b: number): number;
242
+ export function __wbindgen_export_1(a: number, b: number, c: number, d: number): number;
243
+ export const __wbindgen_export_2: WebAssembly.Table;
244
+ export function __wbindgen_export_3(a: number, b: number, c: number): void;
245
+ export function __wbindgen_export_4(a: number, b: number): void;
246
+ export function __wbindgen_add_to_stack_pointer(a: number): number;
247
+ export function __wbindgen_export_5(a: number, b: number, c: number): void;
248
+ export function __wbindgen_export_6(a: number): void;
249
+ export function __wbindgen_start(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loro-crdt",
3
- "version": "1.0.7",
3
+ "version": "1.0.8-alpha.0",
4
4
  "description": "Loro CRDTs is a high-performance CRDT framework that makes your app state synchronized, collaborative and maintainable effortlessly.",
5
5
  "keywords": [
6
6
  "crdt",
@@ -14,36 +14,25 @@
14
14
  "type": "git",
15
15
  "url": "git+https://github.com/loro-dev/loro.git"
16
16
  },
17
- "main": "dist/loro.js",
18
- "module": "dist/loro.mjs",
19
- "typings": "dist/loro.d.ts",
20
- "author": "Loro",
17
+ "main": "nodejs/index.js",
18
+ "module": "bundler/index.js",
19
+ "types": "bundler/index.d.ts",
20
+ "scripts": {
21
+ "build-dev": "deno run -A ./scripts/build.ts dev && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test",
22
+ "build-release": "deno run -A ./scripts/build.ts release && rollup -c && deno run -A ./scripts/post-rollup.ts && npm run test",
23
+ "test": "cd ./deno_tests && deno test -A"
24
+ },
21
25
  "homepage": "https://loro.dev",
26
+ "author": "",
22
27
  "license": "MIT",
23
- "dependencies": {
24
- "loro-wasm": "1.0.7"
25
- },
26
28
  "devDependencies": {
29
+ "@rollup/plugin-alias": "^5.1.1",
27
30
  "@rollup/plugin-node-resolve": "^15.0.1",
28
- "@typescript-eslint/parser": "^6.2.0",
29
- "@vitest/ui": "^1.0.4",
30
- "esbuild": "^0.18.20",
31
- "eslint": "^8.46.0",
32
- "loro-crdt-old": "npm:loro-crdt@=0.16.0",
33
- "loro-crdt-alpha-4": "npm:loro-crdt@=1.0.0-alpha.4",
34
- "prettier": "^3.0.0",
31
+ "@rollup/plugin-typescript": "^12.1.1",
35
32
  "rollup": "^3.20.1",
36
- "rollup-plugin-dts": "^5.3.0",
37
- "rollup-plugin-esbuild": "^5.0.0",
38
- "typescript": "^5.0.2",
39
- "vite": "^4.2.1",
40
- "vite-plugin-wasm": "^3.2.2",
41
- "vitest": "^1.4.0"
42
- },
43
- "scripts": {
44
- "build": "rollup -c",
45
- "watch": "rollup -c -w",
46
- "test": "node --expose-gc ./node_modules/vitest/vitest.mjs run && npx tsc --noEmit",
47
- "prepublish": "pnpm run build"
33
+ "tslib": "^2.8.0",
34
+ "typescript": "^5.6.3",
35
+ "vite-plugin-top-level-await": "^1.2.2",
36
+ "vite-plugin-wasm": "^3.1.0"
48
37
  }
49
- }
38
+ }
package/ts/index.ts ADDED
@@ -0,0 +1,216 @@
1
+ export * from "loro-wasm";
2
+ export type * from "loro-wasm";
3
+ import {
4
+ AwarenessWasm,
5
+ PeerID,
6
+ Container,
7
+ ContainerID,
8
+ ContainerType,
9
+ Delta,
10
+ LoroCounter,
11
+ LoroDoc,
12
+ LoroList,
13
+ LoroMap,
14
+ LoroText,
15
+ LoroTree,
16
+ OpId,
17
+ Value,
18
+ AwarenessListener,
19
+ } from "loro-wasm";
20
+
21
+ /**
22
+ * @deprecated Please use LoroDoc
23
+ */
24
+ export class Loro extends LoroDoc { }
25
+
26
+ const CONTAINER_TYPES = [
27
+ "Map",
28
+ "Text",
29
+ "List",
30
+ "Tree",
31
+ "MovableList",
32
+ "Counter",
33
+ ];
34
+
35
+ export function isContainerId(s: string): s is ContainerID {
36
+ return s.startsWith("cid:");
37
+ }
38
+
39
+ /** Whether the value is a container.
40
+ *
41
+ * # Example
42
+ *
43
+ * ```ts
44
+ * const doc = new LoroDoc();
45
+ * const map = doc.getMap("map");
46
+ * const list = doc.getList("list");
47
+ * const text = doc.getText("text");
48
+ * isContainer(map); // true
49
+ * isContainer(list); // true
50
+ * isContainer(text); // true
51
+ * isContainer(123); // false
52
+ * isContainer("123"); // false
53
+ * isContainer({}); // false
54
+ * ```
55
+ */
56
+ export function isContainer(value: any): value is Container {
57
+ if (typeof value !== "object" || value == null) {
58
+ return false;
59
+ }
60
+
61
+ const p = Object.getPrototypeOf(value);
62
+ if (p == null || typeof p !== "object" || typeof p["kind"] !== "function") {
63
+ return false;
64
+ }
65
+
66
+ return CONTAINER_TYPES.includes(value.kind());
67
+ }
68
+
69
+
70
+ /** Get the type of a value that may be a container.
71
+ *
72
+ * # Example
73
+ *
74
+ * ```ts
75
+ * const doc = new LoroDoc();
76
+ * const map = doc.getMap("map");
77
+ * const list = doc.getList("list");
78
+ * const text = doc.getText("text");
79
+ * getType(map); // "Map"
80
+ * getType(list); // "List"
81
+ * getType(text); // "Text"
82
+ * getType(123); // "Json"
83
+ * getType("123"); // "Json"
84
+ * getType({}); // "Json"
85
+ * ```
86
+ */
87
+ export function getType<T>(
88
+ value: T,
89
+ ): T extends LoroText ? "Text"
90
+ : T extends LoroMap<any> ? "Map"
91
+ : T extends LoroTree<any> ? "Tree"
92
+ : T extends LoroList<any> ? "List"
93
+ : T extends LoroCounter ? "Counter"
94
+ : "Json" {
95
+ if (isContainer(value)) {
96
+ return value.kind() as unknown as any;
97
+ }
98
+
99
+ return "Json" as any;
100
+ }
101
+
102
+
103
+ export function newContainerID(id: OpId, type: ContainerType): ContainerID {
104
+ return `cid:${id.counter}@${id.peer}:${type}`;
105
+ }
106
+
107
+ export function newRootContainerID(
108
+ name: string,
109
+ type: ContainerType,
110
+ ): ContainerID {
111
+ return `cid:root-${name}:${type}`;
112
+ }
113
+
114
+
115
+
116
+ /**
117
+ * Awareness is a structure that allows to track the ephemeral state of the peers.
118
+ *
119
+ * If we don't receive a state update from a peer within the timeout, we will remove their state.
120
+ * The timeout is in milliseconds. This can be used to handle the off-line state of a peer.
121
+ */
122
+ export class Awareness<T extends Value = Value> {
123
+ inner: AwarenessWasm<T>;
124
+ private peer: PeerID;
125
+ private timer: number | undefined;
126
+ private timeout: number;
127
+ private listeners: Set<AwarenessListener> = new Set();
128
+ constructor(peer: PeerID, timeout: number = 30000) {
129
+ this.inner = new AwarenessWasm(peer, timeout);
130
+ this.peer = peer;
131
+ this.timeout = timeout;
132
+ }
133
+
134
+ apply(bytes: Uint8Array, origin = "remote") {
135
+ const { updated, added } = this.inner.apply(bytes);
136
+ this.listeners.forEach((listener) => {
137
+ listener({ updated, added, removed: [] }, origin);
138
+ });
139
+
140
+ this.startTimerIfNotEmpty();
141
+ }
142
+
143
+ setLocalState(state: T) {
144
+ const wasEmpty = this.inner.getState(this.peer) == null;
145
+ this.inner.setLocalState(state);
146
+ if (wasEmpty) {
147
+ this.listeners.forEach((listener) => {
148
+ listener(
149
+ { updated: [], added: [this.inner.peer()], removed: [] },
150
+ "local",
151
+ );
152
+ });
153
+ } else {
154
+ this.listeners.forEach((listener) => {
155
+ listener(
156
+ { updated: [this.inner.peer()], added: [], removed: [] },
157
+ "local",
158
+ );
159
+ });
160
+ }
161
+
162
+ this.startTimerIfNotEmpty();
163
+ }
164
+
165
+ getLocalState(): T | undefined {
166
+ return this.inner.getState(this.peer);
167
+ }
168
+
169
+ getAllStates(): Record<PeerID, T> {
170
+ return this.inner.getAllStates();
171
+ }
172
+
173
+ encode(peers: PeerID[]): Uint8Array {
174
+ return this.inner.encode(peers);
175
+ }
176
+
177
+ encodeAll(): Uint8Array {
178
+ return this.inner.encodeAll();
179
+ }
180
+
181
+ addListener(listener: AwarenessListener) {
182
+ this.listeners.add(listener);
183
+ }
184
+
185
+ removeListener(listener: AwarenessListener) {
186
+ this.listeners.delete(listener);
187
+ }
188
+
189
+ peers(): PeerID[] {
190
+ return this.inner.peers();
191
+ }
192
+
193
+ destroy() {
194
+ clearInterval(this.timer);
195
+ this.listeners.clear();
196
+ }
197
+
198
+ private startTimerIfNotEmpty() {
199
+ if (this.inner.isEmpty() || this.timer != null) {
200
+ return;
201
+ }
202
+
203
+ this.timer = setInterval(() => {
204
+ const removed = this.inner.removeOutdated();
205
+ if (removed.length > 0) {
206
+ this.listeners.forEach((listener) => {
207
+ listener({ updated: [], added: [], removed }, "timeout");
208
+ });
209
+ }
210
+ if (this.inner.isEmpty()) {
211
+ clearInterval(this.timer);
212
+ this.timer = undefined;
213
+ }
214
+ }, this.timeout / 2) as unknown as number;
215
+ }
216
+ }