loro-crdt 1.5.9 → 1.5.11

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.
@@ -73,27 +73,34 @@ export declare class Awareness<T extends Value = Value> {
73
73
  private startTimerIfNotEmpty;
74
74
  }
75
75
  /**
76
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
76
+ * EphemeralStore tracks ephemeral key-value state across peers.
77
77
  *
78
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
79
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
78
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
79
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
80
+ * - Timeout unit: milliseconds.
81
+ * - After timeout: keys are considered expired. They are omitted from
82
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
83
+ * while the store is non-empty and removes expired keys; when removals happen
84
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
80
85
  *
81
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
82
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
86
+ * See: https://loro.dev/docs/tutorial/ephemeral
83
87
  *
84
- * @example
88
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
89
+ * doesn't receive updates within this duration, it will expire and be removed
90
+ * on the next cleanup tick.
85
91
  *
92
+ * @example
86
93
  * ```ts
87
94
  * const store = new EphemeralStore();
88
95
  * const store2 = new EphemeralStore();
89
- * // Subscribe to local updates
90
- * store.subscribeLocalUpdates((data)=>{
91
- * store2.apply(data);
92
- * })
93
- * // Subscribe to all updates
94
- * store2.subscribe((event)=>{
95
- * console.log("event: ", event);
96
- * })
96
+ * // Subscribe to local updates and forward over the wire
97
+ * store.subscribeLocalUpdates((data) => {
98
+ * store2.apply(data);
99
+ * });
100
+ * // Subscribe to all updates (including removals by timeout)
101
+ * store2.subscribe((event) => {
102
+ * console.log("event:", event);
103
+ * });
97
104
  * // Set a value
98
105
  * store.set("key", "value");
99
106
  * // Encode the value
package/bundler/index.js CHANGED
@@ -154,27 +154,34 @@ class Awareness {
154
154
  }
155
155
  }
156
156
  /**
157
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
157
+ * EphemeralStore tracks ephemeral key-value state across peers.
158
158
  *
159
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
160
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
159
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
160
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
161
+ * - Timeout unit: milliseconds.
162
+ * - After timeout: keys are considered expired. They are omitted from
163
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
164
+ * while the store is non-empty and removes expired keys; when removals happen
165
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
161
166
  *
162
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
163
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
167
+ * See: https://loro.dev/docs/tutorial/ephemeral
164
168
  *
165
- * @example
169
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
170
+ * doesn't receive updates within this duration, it will expire and be removed
171
+ * on the next cleanup tick.
166
172
  *
173
+ * @example
167
174
  * ```ts
168
175
  * const store = new EphemeralStore();
169
176
  * const store2 = new EphemeralStore();
170
- * // Subscribe to local updates
171
- * store.subscribeLocalUpdates((data)=>{
172
- * store2.apply(data);
173
- * })
174
- * // Subscribe to all updates
175
- * store2.subscribe((event)=>{
176
- * console.log("event: ", event);
177
- * })
177
+ * // Subscribe to local updates and forward over the wire
178
+ * store.subscribeLocalUpdates((data) => {
179
+ * store2.apply(data);
180
+ * });
181
+ * // Subscribe to all updates (including removals by timeout)
182
+ * store2.subscribe((event) => {
183
+ * console.log("event:", event);
184
+ * });
178
185
  * // Set a value
179
186
  * store.set("key", "value");
180
187
  * // Encode the value
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -2181,6 +2181,7 @@ export class LoroDoc {
2181
2181
  * @param mode - The export mode to use. Can be one of:
2182
2182
  * - `{ mode: "snapshot" }`: Export a full snapshot of the document.
2183
2183
  * - `{ mode: "update", from?: VersionVector }`: Export updates from the given version vector.
2184
+ * If `from` is not provided, it will export the whole history of the document.
2184
2185
  * - `{ mode: "updates-in-range", spans: { id: ID, len: number }[] }`: Export updates within the specified ID spans.
2185
2186
  * - `{ mode: "shallow-snapshot", frontiers: Frontiers }`: Export a garbage-collected snapshot up to the given frontiers.
2186
2187
  *
@@ -3608,6 +3609,10 @@ export class UndoManager {
3608
3609
  * Redo the last undone operation.
3609
3610
  */
3610
3611
  redo(): boolean;
3612
+ /**
3613
+ * Get the peer id of the undo manager.
3614
+ */
3615
+ peer(): PeerID;
3611
3616
  /**
3612
3617
  * Can undo the last operation.
3613
3618
  */
@@ -925,9 +925,19 @@ export class EphemeralStoreWasm {
925
925
  * @param {Uint8Array} data
926
926
  */
927
927
  apply(data) {
928
- const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export_0);
929
- const len0 = WASM_VECTOR_LEN;
930
- wasm.ephemeralstorewasm_apply(this.__wbg_ptr, ptr0, len0);
928
+ try {
929
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
930
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export_0);
931
+ const len0 = WASM_VECTOR_LEN;
932
+ wasm.ephemeralstorewasm_apply(retptr, this.__wbg_ptr, ptr0, len0);
933
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
934
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
935
+ if (r1) {
936
+ throw takeObject(r0);
937
+ }
938
+ } finally {
939
+ wasm.__wbindgen_add_to_stack_pointer(16);
940
+ }
931
941
  }
932
942
  removeOutdated() {
933
943
  wasm.ephemeralstorewasm_removeOutdated(this.__wbg_ptr);
@@ -2266,6 +2276,7 @@ export class LoroDoc {
2266
2276
  * @param mode - The export mode to use. Can be one of:
2267
2277
  * - `{ mode: "snapshot" }`: Export a full snapshot of the document.
2268
2278
  * - `{ mode: "update", from?: VersionVector }`: Export updates from the given version vector.
2279
+ * If `from` is not provided, it will export the whole history of the document.
2269
2280
  * - `{ mode: "updates-in-range", spans: { id: ID, len: number }[] }`: Export updates within the specified ID spans.
2270
2281
  * - `{ mode: "shallow-snapshot", frontiers: Frontiers }`: Export a garbage-collected snapshot up to the given frontiers.
2271
2282
  *
@@ -6171,6 +6182,14 @@ export class UndoManager {
6171
6182
  wasm.__wbindgen_add_to_stack_pointer(16);
6172
6183
  }
6173
6184
  }
6185
+ /**
6186
+ * Get the peer id of the undo manager.
6187
+ * @returns {PeerID}
6188
+ */
6189
+ peer() {
6190
+ const ret = wasm.undomanager_peer(this.__wbg_ptr);
6191
+ return takeObject(ret);
6192
+ }
6174
6193
  groupStart() {
6175
6194
  try {
6176
6195
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
@@ -6805,7 +6824,7 @@ export function __wbg_node_02999533c4ea02e3(arg0) {
6805
6824
  return addHeapObject(ret);
6806
6825
  };
6807
6826
 
6808
- export function __wbg_now_439b66158bc4f246() {
6827
+ export function __wbg_now_4f8b2820be8a682c() {
6809
6828
  const ret = Date.now();
6810
6829
  return ret;
6811
6830
  };
@@ -6947,12 +6966,12 @@ export function __wbindgen_cb_drop(arg0) {
6947
6966
  };
6948
6967
 
6949
6968
  export function __wbindgen_closure_wrapper563(arg0, arg1, arg2) {
6950
- const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_60);
6969
+ const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_60);
6951
6970
  return addHeapObject(ret);
6952
6971
  };
6953
6972
 
6954
- export function __wbindgen_closure_wrapper566(arg0, arg1, arg2) {
6955
- const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_63);
6973
+ export function __wbindgen_closure_wrapper565(arg0, arg1, arg2) {
6974
+ const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_63);
6956
6975
  return addHeapObject(ret);
6957
6976
  };
6958
6977
 
Binary file
@@ -37,7 +37,7 @@ export const ephemeralstorewasm_subscribeLocalUpdates: (a: number, b: number) =>
37
37
  export const ephemeralstorewasm_subscribe: (a: number, b: number) => number;
38
38
  export const ephemeralstorewasm_encode: (a: number, b: number, c: number, d: number) => void;
39
39
  export const ephemeralstorewasm_encodeAll: (a: number, b: number) => void;
40
- export const ephemeralstorewasm_apply: (a: number, b: number, c: number) => void;
40
+ export const ephemeralstorewasm_apply: (a: number, b: number, c: number, d: number) => void;
41
41
  export const ephemeralstorewasm_removeOutdated: (a: number) => void;
42
42
  export const ephemeralstorewasm_isEmpty: (a: number) => number;
43
43
  export const ephemeralstorewasm_keys: (a: number, b: number) => void;
@@ -280,6 +280,7 @@ export const __wbg_undomanager_free: (a: number, b: number) => void;
280
280
  export const undomanager_new: (a: number, b: number) => number;
281
281
  export const undomanager_undo: (a: number, b: number) => void;
282
282
  export const undomanager_redo: (a: number, b: number) => void;
283
+ export const undomanager_peer: (a: number) => number;
283
284
  export const undomanager_groupStart: (a: number, b: number) => void;
284
285
  export const undomanager_groupEnd: (a: number) => void;
285
286
  export const undomanager_canUndo: (a: number) => number;
package/nodejs/index.d.ts CHANGED
@@ -73,27 +73,34 @@ export declare class Awareness<T extends Value = Value> {
73
73
  private startTimerIfNotEmpty;
74
74
  }
75
75
  /**
76
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
76
+ * EphemeralStore tracks ephemeral key-value state across peers.
77
77
  *
78
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
79
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
78
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
79
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
80
+ * - Timeout unit: milliseconds.
81
+ * - After timeout: keys are considered expired. They are omitted from
82
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
83
+ * while the store is non-empty and removes expired keys; when removals happen
84
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
80
85
  *
81
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
82
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
86
+ * See: https://loro.dev/docs/tutorial/ephemeral
83
87
  *
84
- * @example
88
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
89
+ * doesn't receive updates within this duration, it will expire and be removed
90
+ * on the next cleanup tick.
85
91
  *
92
+ * @example
86
93
  * ```ts
87
94
  * const store = new EphemeralStore();
88
95
  * const store2 = new EphemeralStore();
89
- * // Subscribe to local updates
90
- * store.subscribeLocalUpdates((data)=>{
91
- * store2.apply(data);
92
- * })
93
- * // Subscribe to all updates
94
- * store2.subscribe((event)=>{
95
- * console.log("event: ", event);
96
- * })
96
+ * // Subscribe to local updates and forward over the wire
97
+ * store.subscribeLocalUpdates((data) => {
98
+ * store2.apply(data);
99
+ * });
100
+ * // Subscribe to all updates (including removals by timeout)
101
+ * store2.subscribe((event) => {
102
+ * console.log("event:", event);
103
+ * });
97
104
  * // Set a value
98
105
  * store.set("key", "value");
99
106
  * // Encode the value
package/nodejs/index.js CHANGED
@@ -155,27 +155,34 @@ class Awareness {
155
155
  }
156
156
  }
157
157
  /**
158
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
158
+ * EphemeralStore tracks ephemeral key-value state across peers.
159
159
  *
160
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
161
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
160
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
161
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
162
+ * - Timeout unit: milliseconds.
163
+ * - After timeout: keys are considered expired. They are omitted from
164
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
165
+ * while the store is non-empty and removes expired keys; when removals happen
166
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
162
167
  *
163
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
164
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
168
+ * See: https://loro.dev/docs/tutorial/ephemeral
165
169
  *
166
- * @example
170
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
171
+ * doesn't receive updates within this duration, it will expire and be removed
172
+ * on the next cleanup tick.
167
173
  *
174
+ * @example
168
175
  * ```ts
169
176
  * const store = new EphemeralStore();
170
177
  * const store2 = new EphemeralStore();
171
- * // Subscribe to local updates
172
- * store.subscribeLocalUpdates((data)=>{
173
- * store2.apply(data);
174
- * })
175
- * // Subscribe to all updates
176
- * store2.subscribe((event)=>{
177
- * console.log("event: ", event);
178
- * })
178
+ * // Subscribe to local updates and forward over the wire
179
+ * store.subscribeLocalUpdates((data) => {
180
+ * store2.apply(data);
181
+ * });
182
+ * // Subscribe to all updates (including removals by timeout)
183
+ * store2.subscribe((event) => {
184
+ * console.log("event:", event);
185
+ * });
179
186
  * // Set a value
180
187
  * store.set("key", "value");
181
188
  * // Encode the value
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":["LoroDoc","AwarenessWasm","EphemeralStoreWasm"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../index.ts"],"sourcesContent":[null],"names":["LoroDoc","AwarenessWasm","EphemeralStoreWasm"],"mappings":"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"}
@@ -2181,6 +2181,7 @@ export class LoroDoc {
2181
2181
  * @param mode - The export mode to use. Can be one of:
2182
2182
  * - `{ mode: "snapshot" }`: Export a full snapshot of the document.
2183
2183
  * - `{ mode: "update", from?: VersionVector }`: Export updates from the given version vector.
2184
+ * If `from` is not provided, it will export the whole history of the document.
2184
2185
  * - `{ mode: "updates-in-range", spans: { id: ID, len: number }[] }`: Export updates within the specified ID spans.
2185
2186
  * - `{ mode: "shallow-snapshot", frontiers: Frontiers }`: Export a garbage-collected snapshot up to the given frontiers.
2186
2187
  *
@@ -3608,6 +3609,10 @@ export class UndoManager {
3608
3609
  * Redo the last undone operation.
3609
3610
  */
3610
3611
  redo(): boolean;
3612
+ /**
3613
+ * Get the peer id of the undo manager.
3614
+ */
3615
+ peer(): PeerID;
3611
3616
  /**
3612
3617
  * Can undo the last operation.
3613
3618
  */
@@ -924,9 +924,19 @@ class EphemeralStoreWasm {
924
924
  * @param {Uint8Array} data
925
925
  */
926
926
  apply(data) {
927
- const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export_0);
928
- const len0 = WASM_VECTOR_LEN;
929
- wasm.ephemeralstorewasm_apply(this.__wbg_ptr, ptr0, len0);
927
+ try {
928
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
929
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_export_0);
930
+ const len0 = WASM_VECTOR_LEN;
931
+ wasm.ephemeralstorewasm_apply(retptr, this.__wbg_ptr, ptr0, len0);
932
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
933
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
934
+ if (r1) {
935
+ throw takeObject(r0);
936
+ }
937
+ } finally {
938
+ wasm.__wbindgen_add_to_stack_pointer(16);
939
+ }
930
940
  }
931
941
  removeOutdated() {
932
942
  wasm.ephemeralstorewasm_removeOutdated(this.__wbg_ptr);
@@ -2267,6 +2277,7 @@ class LoroDoc {
2267
2277
  * @param mode - The export mode to use. Can be one of:
2268
2278
  * - `{ mode: "snapshot" }`: Export a full snapshot of the document.
2269
2279
  * - `{ mode: "update", from?: VersionVector }`: Export updates from the given version vector.
2280
+ * If `from` is not provided, it will export the whole history of the document.
2270
2281
  * - `{ mode: "updates-in-range", spans: { id: ID, len: number }[] }`: Export updates within the specified ID spans.
2271
2282
  * - `{ mode: "shallow-snapshot", frontiers: Frontiers }`: Export a garbage-collected snapshot up to the given frontiers.
2272
2283
  *
@@ -6179,6 +6190,14 @@ class UndoManager {
6179
6190
  wasm.__wbindgen_add_to_stack_pointer(16);
6180
6191
  }
6181
6192
  }
6193
+ /**
6194
+ * Get the peer id of the undo manager.
6195
+ * @returns {PeerID}
6196
+ */
6197
+ peer() {
6198
+ const ret = wasm.undomanager_peer(this.__wbg_ptr);
6199
+ return takeObject(ret);
6200
+ }
6182
6201
  groupStart() {
6183
6202
  try {
6184
6203
  const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
@@ -6815,7 +6834,7 @@ module.exports.__wbg_node_02999533c4ea02e3 = function(arg0) {
6815
6834
  return addHeapObject(ret);
6816
6835
  };
6817
6836
 
6818
- module.exports.__wbg_now_439b66158bc4f246 = function() {
6837
+ module.exports.__wbg_now_4f8b2820be8a682c = function() {
6819
6838
  const ret = Date.now();
6820
6839
  return ret;
6821
6840
  };
@@ -6957,12 +6976,12 @@ module.exports.__wbindgen_cb_drop = function(arg0) {
6957
6976
  };
6958
6977
 
6959
6978
  module.exports.__wbindgen_closure_wrapper563 = function(arg0, arg1, arg2) {
6960
- const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_60);
6979
+ const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_60);
6961
6980
  return addHeapObject(ret);
6962
6981
  };
6963
6982
 
6964
- module.exports.__wbindgen_closure_wrapper566 = function(arg0, arg1, arg2) {
6965
- const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_63);
6983
+ module.exports.__wbindgen_closure_wrapper565 = function(arg0, arg1, arg2) {
6984
+ const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_63);
6966
6985
  return addHeapObject(ret);
6967
6986
  };
6968
6987
 
Binary file
@@ -37,7 +37,7 @@ export const ephemeralstorewasm_subscribeLocalUpdates: (a: number, b: number) =>
37
37
  export const ephemeralstorewasm_subscribe: (a: number, b: number) => number;
38
38
  export const ephemeralstorewasm_encode: (a: number, b: number, c: number, d: number) => void;
39
39
  export const ephemeralstorewasm_encodeAll: (a: number, b: number) => void;
40
- export const ephemeralstorewasm_apply: (a: number, b: number, c: number) => void;
40
+ export const ephemeralstorewasm_apply: (a: number, b: number, c: number, d: number) => void;
41
41
  export const ephemeralstorewasm_removeOutdated: (a: number) => void;
42
42
  export const ephemeralstorewasm_isEmpty: (a: number) => number;
43
43
  export const ephemeralstorewasm_keys: (a: number, b: number) => void;
@@ -280,6 +280,7 @@ export const __wbg_undomanager_free: (a: number, b: number) => void;
280
280
  export const undomanager_new: (a: number, b: number) => number;
281
281
  export const undomanager_undo: (a: number, b: number) => void;
282
282
  export const undomanager_redo: (a: number, b: number) => void;
283
+ export const undomanager_peer: (a: number) => number;
283
284
  export const undomanager_groupStart: (a: number, b: number) => void;
284
285
  export const undomanager_groupEnd: (a: number) => void;
285
286
  export const undomanager_canUndo: (a: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loro-crdt",
3
- "version": "1.5.9",
3
+ "version": "1.5.11",
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",
package/web/index.d.ts CHANGED
@@ -73,27 +73,34 @@ export declare class Awareness<T extends Value = Value> {
73
73
  private startTimerIfNotEmpty;
74
74
  }
75
75
  /**
76
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
76
+ * EphemeralStore tracks ephemeral key-value state across peers.
77
77
  *
78
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
79
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
78
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
79
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
80
+ * - Timeout unit: milliseconds.
81
+ * - After timeout: keys are considered expired. They are omitted from
82
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
83
+ * while the store is non-empty and removes expired keys; when removals happen
84
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
80
85
  *
81
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
82
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
86
+ * See: https://loro.dev/docs/tutorial/ephemeral
83
87
  *
84
- * @example
88
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
89
+ * doesn't receive updates within this duration, it will expire and be removed
90
+ * on the next cleanup tick.
85
91
  *
92
+ * @example
86
93
  * ```ts
87
94
  * const store = new EphemeralStore();
88
95
  * const store2 = new EphemeralStore();
89
- * // Subscribe to local updates
90
- * store.subscribeLocalUpdates((data)=>{
91
- * store2.apply(data);
92
- * })
93
- * // Subscribe to all updates
94
- * store2.subscribe((event)=>{
95
- * console.log("event: ", event);
96
- * })
96
+ * // Subscribe to local updates and forward over the wire
97
+ * store.subscribeLocalUpdates((data) => {
98
+ * store2.apply(data);
99
+ * });
100
+ * // Subscribe to all updates (including removals by timeout)
101
+ * store2.subscribe((event) => {
102
+ * console.log("event:", event);
103
+ * });
97
104
  * // Set a value
98
105
  * store.set("key", "value");
99
106
  * // Encode the value
package/web/index.js CHANGED
@@ -155,27 +155,34 @@ class Awareness {
155
155
  }
156
156
  }
157
157
  /**
158
- * EphemeralStore is a structure that allows to track the ephemeral state of the peers.
158
+ * EphemeralStore tracks ephemeral key-value state across peers.
159
159
  *
160
- * It can be used to synchronize cursor positions, selections, and the names of the peers.
161
- * Each entry uses timestamp-based LWW (Last-Write-Wins) for conflict resolution.
160
+ * - Use it for lightweight presence/state like cursors, selections, and UI hints.
161
+ * - Conflict resolution is timestamp-based LWW (Last-Write-Wins) per key.
162
+ * - Timeout unit: milliseconds.
163
+ * - After timeout: keys are considered expired. They are omitted from
164
+ * `encode(key)`, `encodeAll()` and `getAllStates()`. A periodic cleanup runs
165
+ * while the store is non-empty and removes expired keys; when removals happen
166
+ * subscribers receive an event with `by: "timeout"` and the `removed` keys.
162
167
  *
163
- * If we don't receive a state update from a peer within the timeout, we will remove their state.
164
- * The timeout is in milliseconds. This can be used to handle the offline state of a peer.
168
+ * See: https://loro.dev/docs/tutorial/ephemeral
165
169
  *
166
- * @example
170
+ * @param timeout Inactivity timeout in milliseconds (default: 30000). If a key
171
+ * doesn't receive updates within this duration, it will expire and be removed
172
+ * on the next cleanup tick.
167
173
  *
174
+ * @example
168
175
  * ```ts
169
176
  * const store = new EphemeralStore();
170
177
  * const store2 = new EphemeralStore();
171
- * // Subscribe to local updates
172
- * store.subscribeLocalUpdates((data)=>{
173
- * store2.apply(data);
174
- * })
175
- * // Subscribe to all updates
176
- * store2.subscribe((event)=>{
177
- * console.log("event: ", event);
178
- * })
178
+ * // Subscribe to local updates and forward over the wire
179
+ * store.subscribeLocalUpdates((data) => {
180
+ * store2.apply(data);
181
+ * });
182
+ * // Subscribe to all updates (including removals by timeout)
183
+ * store2.subscribe((event) => {
184
+ * console.log("event:", event);
185
+ * });
179
186
  * // Set a value
180
187
  * store.set("key", "value");
181
188
  * // Encode the value