@pluv/client 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
 
2
- > @pluv/client@2.1.0 build /home/runner/work/pluv/pluv/packages/client
2
+ > @pluv/client@2.2.1 build /home/runner/work/pluv/pluv/packages/client
3
3
  > tsup src/index.ts --format esm,cjs --dts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -8,11 +8,11 @@
8
8
  CLI Target: es6
9
9
  ESM Build start
10
10
  CJS Build start
11
- ESM dist/index.mjs 61.64 KB
12
- ESM ⚡️ Build success in 102ms
13
- CJS dist/index.js 63.17 KB
14
- CJS ⚡️ Build success in 108ms
11
+ CJS dist/index.js 65.55 KB
12
+ CJS ⚡️ Build success in 161ms
13
+ ESM dist/index.mjs 63.81 KB
14
+ ESM ⚡️ Build success in 161ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 4639ms
17
- DTS dist/index.d.mts 20.08 KB
18
- DTS dist/index.d.ts 20.08 KB
16
+ DTS ⚡️ Build success in 4523ms
17
+ DTS dist/index.d.mts 20.11 KB
18
+ DTS dist/index.d.ts 20.11 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,56 @@
1
1
  # @pluv/client
2
2
 
3
+ ## 2.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - @pluv/crdt@2.2.1
8
+ - @pluv/types@2.2.1
9
+
10
+ ## 2.2.0
11
+
12
+ ### Minor Changes
13
+
14
+ - 3ce1547: Updated typings for `PluvRoom.getDoc` to be narrower to get the native doc type.
15
+
16
+ ```ts
17
+ import { createClient } from "@pluv/client";
18
+ import { yjs } from "@pluv/crdt-yjs";
19
+ import type { Doc as YDoc } from "yjs";
20
+
21
+ const client = createClient({
22
+ // ...
23
+ crdt: yjs,
24
+ });
25
+ const room = client.createRoom("example-room");
26
+
27
+ const doc = room.getDoc();
28
+
29
+ // This is now typed as the native YDoc
30
+ doc.value;
31
+ // ^? const value: YDoc
32
+ ```
33
+
34
+ - fd3bfe2: Added the ability to listen to the room's underlying websocket's event listeners.
35
+ - aee40cb: Updated `presence` types to be more lenient (i.e. no-longer extends `JsonObject`). This is to enable types like `.passthrough` with zod, which can be useful for integrating `yjs.awareness` with libraries such as [lexical](https://lexical.dev/).
36
+ - edd1789: **DEPRECATED** `PluvRoom.storageLoaded` will be removed in v3. Added `PluvRoom.getStorageLoaded` with improved detection of when the storage was synced.
37
+
38
+ ```ts
39
+ const room = client.createRoom("example-room");
40
+
41
+ // Before
42
+ room.storageLoaded;
43
+
44
+ // After
45
+ room.getStorageLoaded();
46
+ ```
47
+
48
+ ### Patch Changes
49
+
50
+ - 48191fa: Fixed `PluvRoom.getDoc` not returning a stable doc reference for a single connection.
51
+ - @pluv/crdt@2.2.0
52
+ - @pluv/types@2.2.0
53
+
3
54
  ## 2.1.0
4
55
 
5
56
  ### Minor Changes
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
- import { CrdtType, AbstractCrdtDocFactory, NoopCrdtDocFactory, InferStorage, InferCrdtJson } from '@pluv/crdt';
1
+ import { AbstractCrdtDocFactory, InferDocLike, NoopCrdtDocFactory, InferStorage, InferDoc, InferCrdtJson } from '@pluv/crdt';
2
2
  export { CrdtType, InferCrdtJson } from '@pluv/crdt';
3
- import { IOLike, JsonObject, EventRecord, CrdtDocLike, UserInfo, MaybePromise, Id, ConnectionState, ProcedureLike, InputZodLike, IORouterLike, InferIOAuthorizeUser, InferIOAuthorize, BaseUser, RoomLike, InferIOOutput, InferIOInput, BroadcastProxy, EventProxy, OtherSubscriptionCallback, StorageProxy, SubscribeProxy, UpdateMyPresenceAction, MergeEvents } from '@pluv/types';
4
- export { BaseUser, ConnectionState, EventMessage, EventNotifierSubscriptionCallback, EventRecord, IOEventMessage, MergeEvents, RoomLike, UserInfo, WebSocketState } from '@pluv/types';
3
+ import { IOLike, JsonObject, EventRecord, CrdtDocLike, UserInfo, MaybePromise, Id, ProcedureLike, InputZodLike, IORouterLike, InferIOAuthorizeUser, InferIOAuthorize, BaseUser, RoomLike, InferIOOutput, InferIOInput, RoomEventListenerMap, BroadcastProxy, EventProxy, WebSocketConnection, OtherSubscriptionCallback, StorageProxy, SubscribeProxy, UpdateMyPresenceAction, MergeEvents } from '@pluv/types';
4
+ export { BaseUser, ConnectionState, EventMessage, EventNotifierSubscriptionCallback, EventRecord, IOEventMessage, MergeEvents, RoomLike, UserInfo, WebSocketConnection, WebSocketState } from '@pluv/types';
5
5
 
6
6
  declare abstract class AbstractStorageStore {
7
7
  room: string;
@@ -21,9 +21,9 @@ type InferCallback<TIO extends IOLike<any, any>> = (i: typeof identity) => {
21
21
  };
22
22
  declare const infer: <TIO extends IOLike<any, any>>(callback: InferCallback<TIO>) => InferCallback<TIO>;
23
23
 
24
- type EventResolver<TIO extends IOLike = IOLike, TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = (data: TInput, context: EventResolverContext<TIO, TPresence, TStorage>) => MaybePromise<TOutput | void>;
25
- interface EventResolverContext<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
26
- doc: CrdtDocLike<TStorage>;
24
+ type EventResolver<TIO extends IOLike, TInput extends JsonObject, TOutput extends EventRecord<string, any>, TPresence extends Record<string, any>, TDocLike extends CrdtDocLike<any, any>> = (data: TInput, context: EventResolverContext<TIO, TPresence, TDocLike>) => MaybePromise<TOutput | void>;
25
+ interface EventResolverContext<TIO extends IOLike, TPresence extends Record<string, any>, TDocLike extends CrdtDocLike<any, any>> {
26
+ doc: TDocLike;
27
27
  others: readonly UserInfo<TIO, TPresence>[];
28
28
  room: string;
29
29
  user: UserInfo<TIO, TPresence>;
@@ -45,65 +45,47 @@ interface PublicKeyParams<TMetadata extends JsonObject> {
45
45
  metadata: TMetadata;
46
46
  }
47
47
  type PublicKey<TMetadata extends JsonObject> = string | ((params: PublicKeyParams<TMetadata>) => string);
48
- interface WebSocketConnection {
49
- /**
50
- * @description How many times a connection attempt was made. This will increment upon each
51
- * unsuccessful attempt, and will reset upon a successful connection.
52
- * @date April 13, 2025
53
- */
54
- attempts: number;
55
- /**
56
- * @description How many times the user has connected to the room. This can be more than 1 in
57
- * the case of reconnects. This is tracked because on the very first connection (i.e. when
58
- * count is 0) we don't want to send the storage state as an update to the room and overwrite
59
- * the upstream state.
60
- * @date April 13, 2025
61
- */
62
- count: number;
63
- id: string | null;
64
- state: ConnectionState;
65
- }
66
48
  type WithMetadata<TMetadata extends JsonObject = {}> = keyof TMetadata extends never ? {
67
49
  metadata?: undefined;
68
50
  } : {
69
51
  metadata: TMetadata;
70
52
  };
71
53
 
72
- interface PluvProcedureConfig<TIO extends IOLike = IOLike, TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
73
- broadcast?: EventResolver<TIO, TInput, TOutput, TPresence, TStorage> | null;
54
+ interface PluvProcedureConfig<TIO extends IOLike, TInput extends JsonObject, TOutput extends EventRecord<string, any>, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>> {
55
+ broadcast?: EventResolver<TIO, TInput, TOutput, TPresence, InferDocLike<TCrdt>> | null;
74
56
  input?: InputZodLike<TInput>;
75
57
  }
76
- declare class PluvProcedure<TIO extends IOLike = IOLike, TInput extends JsonObject = {}, TOutput extends EventRecord<string, any> = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}, TFilled extends "input" | "broadcast" | "" = ""> implements ProcedureLike<TInput, TOutput> {
58
+ declare class PluvProcedure<TIO extends IOLike, TInput extends JsonObject, TOutput extends EventRecord<string, any>, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TFilled extends "input" | "broadcast" | ""> implements ProcedureLike<TInput, TOutput> {
77
59
  private _broadcast;
78
60
  private _input;
79
61
  get config(): ProcedureLike<TInput, TOutput>["config"];
80
- constructor(config?: PluvProcedureConfig<TIO, TInput, TOutput, TPresence, TStorage>);
81
- broadcast<TResult extends EventRecord<string, any> = {}>(resolver: EventResolver<TIO, TInput, TResult, TPresence, TStorage>): Omit<PluvProcedure<TIO, TInput, MergeEventRecords<[TOutput, TResult]>, TPresence, TStorage, TFilled | "input" | "broadcast">, TFilled | "input" | "broadcast">;
82
- input<TData extends JsonObject>(input: InputZodLike<TData>): Omit<PluvProcedure<TIO, TData, {}, TPresence, TStorage, TFilled | "input">, TFilled | "input">;
62
+ constructor(config?: PluvProcedureConfig<TIO, TInput, TOutput, TPresence, TCrdt>);
63
+ broadcast<TResult extends EventRecord<string, any> = {}>(resolver: EventResolver<TIO, TInput, TResult, TPresence, InferDocLike<TCrdt>>): Omit<PluvProcedure<TIO, TInput, MergeEventRecords<[TOutput, TResult]>, TPresence, TCrdt, TFilled | "input" | "broadcast">, TFilled | "input" | "broadcast">;
64
+ input<TData extends JsonObject>(input: InputZodLike<TData>): Omit<PluvProcedure<TIO, TData, {}, TPresence, TCrdt, TFilled | "input">, TFilled | "input">;
83
65
  private _resolver;
84
66
  }
85
67
 
86
- type CrdtManagerOptions<TCrdt extends AbstractCrdtDocFactory<any>> = {
68
+ type CrdtManagerOptions<TCrdt extends AbstractCrdtDocFactory<any, any>> = {
87
69
  initialStorage?: TCrdt;
88
70
  };
89
71
 
90
- type PluvRouterEventConfig<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
91
- [P: string]: Pick<PluvProcedure<TIO, any, any, TPresence, TStorage>, "config">;
72
+ type PluvRouterEventConfig<TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>> = {
73
+ [P: string]: Pick<PluvProcedure<TIO, any, any, TPresence, TCrdt, "">, "config">;
92
74
  };
93
- type MergedRouter<TRouters extends PluvRouter<TIO, TPresence, TStorage, any>[] = [], TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}, TRoot extends TRouters[0]["_defs"]["events"] = {}> = TRouters extends [
94
- infer IHead extends PluvRouter<TIO, TPresence, TStorage, any>,
95
- ...infer ITail extends PluvRouter<TIO, TPresence, TStorage, any>[]
96
- ] ? MergedRouter<ITail, TIO, TPresence, TStorage, TRoot & IHead["_defs"]["events"]> : PluvRouter<TIO, TPresence, TStorage, TRoot>;
97
- declare class PluvRouter<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}, TEvents extends PluvRouterEventConfig<TIO, TPresence, TStorage> = {}> implements IORouterLike<TEvents> {
75
+ type MergedRouter<TRouters extends PluvRouter<TIO, TPresence, TCrdt, any>[], TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TRoot extends TRouters[0]["_defs"]["events"]> = TRouters extends [
76
+ infer IHead extends PluvRouter<TIO, TPresence, TCrdt, any>,
77
+ ...infer ITail extends PluvRouter<TIO, TPresence, TCrdt, any>[]
78
+ ] ? MergedRouter<ITail, TIO, TPresence, TCrdt, TRoot & IHead["_defs"]["events"]> : PluvRouter<TIO, TPresence, TCrdt, TRoot>;
79
+ declare class PluvRouter<TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, TCrdt> = {}> implements IORouterLike<TEvents> {
98
80
  readonly _defs: {
99
81
  events: TEvents;
100
82
  };
101
83
  constructor(events: TEvents);
102
- static merge<TRouters extends PluvRouter<any, any, any, any>[]>(...routers: TRouters): MergedRouter<TRouters>;
84
+ static merge<TRouters extends PluvRouter<TIO, TPresence, TCrdt, any>[], TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>>(...routers: TRouters): MergedRouter<TRouters, TIO, TPresence, TCrdt, {}>;
103
85
  private _isValidEventName;
104
86
  }
105
87
 
106
- type UsersManagerConfig<TPresence extends JsonObject = {}> = {
88
+ type UsersManagerConfig<TPresence extends Record<string, any> = {}> = {
107
89
  initialPresence?: TPresence;
108
90
  limits: PluvClientLimits;
109
91
  presence?: InputZodLike<TPresence>;
@@ -133,8 +115,8 @@ type RoomEndpoints<TIO extends IOLike<any, any>, TMetadata extends JsonObject> =
133
115
  } : {
134
116
  authEndpoint?: undefined;
135
117
  });
136
- type PluvRoomAddon<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>> = (input: PluvRoomAddonInput<TIO, TMetadata, TPresence, TCrdt>) => Partial<PluvRoomAddonResult>;
137
- interface PluvRoomAddonInput<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>> {
118
+ type PluvRoomAddon<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>> = (input: PluvRoomAddonInput<TIO, TMetadata, TPresence, TCrdt>) => Partial<PluvRoomAddonResult>;
119
+ interface PluvRoomAddonInput<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>> {
138
120
  room: PluvRoom<TIO, TMetadata, TPresence, TCrdt>;
139
121
  }
140
122
  interface PluvRoomAddonResult {
@@ -149,7 +131,7 @@ interface ReconnectTimeoutMsParams {
149
131
  attempts: number;
150
132
  }
151
133
  type ReconnectTimeoutMs = number | ((params: ReconnectTimeoutMsParams) => number);
152
- type RoomConfig<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> = Id<{
134
+ type RoomConfig<TIO extends IOLike, TMetadata extends JsonObject, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> = Id<{
153
135
  addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, TCrdt>[];
154
136
  debug?: boolean | PluvRoomDebug<TIO>;
155
137
  limits: PluvClientLimits;
@@ -159,7 +141,7 @@ type RoomConfig<TIO extends IOLike, TMetadata extends JsonObject, TPresence exte
159
141
  reconnectTimeoutMs?: ReconnectTimeoutMs;
160
142
  router?: PluvRouter<TIO, TPresence, InferStorage<TCrdt>, TEvents>;
161
143
  } & RoomEndpoints<TIO, TMetadata> & Pick<CrdtManagerOptions<TCrdt>, "initialStorage"> & UsersManagerConfig<TPresence>>;
162
- declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TCrdt extends AbstractCrdtDocFactory<any> = NoopCrdtDocFactory, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {}> implements RoomLike<TIO, TPresence, InferStorage<TCrdt>> {
144
+ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObject = {}, TPresence extends Record<string, any> = {}, TCrdt extends AbstractCrdtDocFactory<any, any> = NoopCrdtDocFactory, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {}> implements RoomLike<TIO, InferDoc<TCrdt>, TPresence, InferStorage<TCrdt>> {
163
145
  readonly _endpoints: RoomEndpoints<TIO, TMetadata>;
164
146
  readonly id: string;
165
147
  readonly metadata?: InputZodLike<TMetadata>;
@@ -169,6 +151,7 @@ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObjec
169
151
  private readonly _eventNotifier;
170
152
  private readonly _intervals;
171
153
  private readonly _limits;
154
+ private readonly _listenerManager;
172
155
  private readonly _listeners;
173
156
  private readonly _publicKey;
174
157
  private readonly _reconnectTimeoutMs;
@@ -184,8 +167,12 @@ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObjec
184
167
  private _windowListeners;
185
168
  private _wsListeners;
186
169
  constructor(room: string, options: RoomConfig<TIO, TMetadata, TPresence, TCrdt, TEvents>);
170
+ /**
171
+ * @deprecated To be removed in v3. Use `getStorageLoaded` instead.
172
+ */
187
173
  get storageLoaded(): boolean;
188
174
  get webSocket(): WebSocket | null;
175
+ addEventListener<TKind extends keyof RoomEventListenerMap>(kind: TKind, handler: RoomEventListenerMap[TKind]): () => void;
189
176
  broadcast: BroadcastProxy<TIO, TEvents>;
190
177
  canRedo: () => boolean;
191
178
  canUndo: () => boolean;
@@ -196,7 +183,7 @@ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObjec
196
183
  */
197
184
  event: EventProxy<TIO, TEvents>;
198
185
  getConnection: () => WebSocketConnection;
199
- getDoc: () => CrdtDocLike<InferStorage<TCrdt>>;
186
+ getDoc: () => CrdtDocLike<InferDoc<TCrdt>, InferStorage<TCrdt>>;
200
187
  getMyPresence: () => TPresence;
201
188
  getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
202
189
  getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
@@ -204,13 +191,14 @@ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObjec
204
191
  getStorage: <TKey extends keyof InferStorage<TCrdt>>(type: TKey) => InferStorage<TCrdt>[TKey] | null;
205
192
  getStorageJson(): InferCrdtJson<InferStorage<TCrdt>> | null;
206
193
  getStorageJson<TKey extends keyof InferStorage<TCrdt>>(type: TKey): InferCrdtJson<InferStorage<TCrdt>[TKey]> | null;
194
+ getStorageLoaded: () => boolean;
207
195
  /**
208
196
  * @deprecated To be removed in v3. Use PluvRoom.subscribe.other instead
209
197
  */
210
198
  other: (connectionId: string, callback: OtherSubscriptionCallback<TIO, TPresence>) => (() => void);
211
199
  redo: () => void;
212
200
  /**
213
- * @deprecated To be removed in v3. To be removed in v3. Use PluvRoom.subscribe.storage instead
201
+ * @deprecated To be removed in v3. Use PluvRoom.subscribe.storage instead
214
202
  */
215
203
  storage: StorageProxy<InferStorage<TCrdt>>;
216
204
  /**
@@ -270,7 +258,7 @@ declare class PluvRoom<TIO extends IOLike<any, any>, TMetadata extends JsonObjec
270
258
  private _updateState;
271
259
  }
272
260
 
273
- type PluvClientOptions<TIO extends IOLike<any, any>, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>, TMetadata extends JsonObject> = RoomEndpoints<TIO, TMetadata> & {
261
+ type PluvClientOptions<TIO extends IOLike<any, any>, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TMetadata extends JsonObject> = RoomEndpoints<TIO, TMetadata> & {
274
262
  debug?: boolean;
275
263
  initialStorage?: TCrdt;
276
264
  /**
@@ -283,7 +271,7 @@ type PluvClientOptions<TIO extends IOLike<any, any>, TPresence extends JsonObjec
283
271
  publicKey?: PublicKey<TMetadata>;
284
272
  types: InferCallback<TIO>;
285
273
  };
286
- type CreateRoomOptions<TIO extends IOLike<any, any>, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>, TMetadata extends JsonObject, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {}> = {
274
+ type CreateRoomOptions<TIO extends IOLike<any, any>, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TMetadata extends JsonObject, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {}> = {
287
275
  addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, InferStorage<TCrdt>>[];
288
276
  debug?: boolean | PluvRoomDebug<TIO>;
289
277
  initialPresence?: TPresence;
@@ -293,7 +281,7 @@ type CreateRoomOptions<TIO extends IOLike<any, any>, TPresence extends JsonObjec
293
281
  router?: PluvRouter<TIO, TPresence, InferStorage<TCrdt>, TEvents>;
294
282
  };
295
283
  type EnterRoomParams<TMetadata extends JsonObject = {}> = keyof TMetadata extends never ? [] : [WithMetadata<TMetadata>];
296
- declare class PluvClient<TIO extends IOLike<any, any>, TPresence extends JsonObject = {}, TCrdt extends AbstractCrdtDocFactory<any> = NoopCrdtDocFactory, TMetadata extends JsonObject = {}> {
284
+ declare class PluvClient<TIO extends IOLike<any, any>, TPresence extends Record<string, any> = {}, TCrdt extends AbstractCrdtDocFactory<any, any> = NoopCrdtDocFactory, TMetadata extends JsonObject = {}> {
297
285
  readonly metadata?: InputZodLike<TMetadata>;
298
286
  private readonly _authEndpoint;
299
287
  private readonly _debug;
@@ -306,7 +294,7 @@ declare class PluvClient<TIO extends IOLike<any, any>, TPresence extends JsonObj
306
294
  get _defs(): {
307
295
  initialStorage: TCrdt | undefined;
308
296
  };
309
- get procedure(): PluvProcedure<TIO, {}, {}, TPresence, InferStorage<TCrdt>>;
297
+ get procedure(): PluvProcedure<TIO, {}, {}, TPresence, TCrdt, "">;
310
298
  constructor(options: PluvClientOptions<TIO, TPresence, TCrdt, TMetadata>);
311
299
  createRoom: <TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>> = {}>(room: string, options?: CreateRoomOptions<TIO, TPresence, TCrdt, TMetadata, TEvents>) => PluvRoom<TIO, TMetadata, TPresence, TCrdt, TEvents>;
312
300
  enter: (room: string | PluvRoom<TIO, TMetadata, any, any, any>, ...args: EnterRoomParams<TMetadata>) => Promise<PluvRoom<TIO, TMetadata, TPresence, TCrdt, any>>;
@@ -317,18 +305,22 @@ declare class PluvClient<TIO extends IOLike<any, any>, TPresence extends JsonObj
317
305
  private _logDebug;
318
306
  }
319
307
 
320
- declare const createClient: <TIO extends IOLike<any, any>, TPresence extends JsonObject = {}, TCrdt extends AbstractCrdtDocFactory<any> = NoopCrdtDocFactory, TMetadata extends JsonObject = {}>(options: PluvClientOptions<TIO, TPresence, TCrdt, TMetadata>) => PluvClient<TIO, TPresence, TCrdt, TMetadata>;
308
+ declare const createClient: <TIO extends IOLike<any, any>, TPresence extends Record<string, any> = {}, TCrdt extends AbstractCrdtDocFactory<any, any> = NoopCrdtDocFactory, TMetadata extends JsonObject = {}>(options: PluvClientOptions<TIO, TPresence, TCrdt, TMetadata>) => PluvClient<TIO, TPresence, TCrdt, TMetadata>;
321
309
 
322
310
  type MockedRoomEvents<TIO extends IOLike> = Partial<{
323
311
  [P in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[P]>) => Partial<InferIOOutput<TIO>>;
324
312
  }>;
325
- type MockedRoomConfig<TIO extends IOLike, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> = {
313
+ type MockedRoomConfig<TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> = {
326
314
  events?: MockedRoomEvents<MergeEvents<TEvents, TIO>>;
327
315
  limits?: PluvClientLimits;
328
316
  router?: PluvRouter<TIO, TPresence, InferStorage<TCrdt>, TEvents>;
329
317
  } & Pick<CrdtManagerOptions<TCrdt>, "initialStorage"> & Omit<UsersManagerConfig<TPresence>, "limits">;
330
- declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject, TCrdt extends AbstractCrdtDocFactory<any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> implements RoomLike<TIO, TPresence, InferStorage<TCrdt>> {
318
+ declare class MockedRoom<TIO extends IOLike, TPresence extends Record<string, any>, TCrdt extends AbstractCrdtDocFactory<any, any>, TEvents extends PluvRouterEventConfig<TIO, TPresence, InferStorage<TCrdt>>> implements RoomLike<TIO, InferDoc<TCrdt>, TPresence, InferStorage<TCrdt>> {
331
319
  readonly id: string;
320
+ /**
321
+ * @deprecated To be removed in v3. Use `getStorageLoaded` instead.
322
+ */
323
+ readonly storageLoaded: boolean;
332
324
  private readonly _crdtManager;
333
325
  private readonly _crdtNotifier;
334
326
  private readonly _eventNotifier;
@@ -341,13 +333,13 @@ declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject, TCrdt
341
333
  private readonly _subscriptions;
342
334
  private readonly _usersManager;
343
335
  constructor(room: string, options: MockedRoomConfig<TIO, TPresence, TCrdt, TEvents>);
344
- get storageLoaded(): boolean;
336
+ addEventListener<TKind extends keyof RoomEventListenerMap>(kind: TKind, handler: RoomEventListenerMap[TKind]): () => void;
345
337
  broadcast: BroadcastProxy<TIO, TEvents>;
346
338
  canRedo: () => boolean;
347
339
  canUndo: () => boolean;
348
340
  event: EventProxy<TIO, TEvents>;
349
341
  getConnection: () => WebSocketConnection;
350
- getDoc(): CrdtDocLike<InferStorage<TCrdt>>;
342
+ getDoc(): CrdtDocLike<InferDoc<TCrdt>, InferStorage<TCrdt>>;
351
343
  getMyPresence: () => TPresence;
352
344
  getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
353
345
  getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
@@ -355,6 +347,7 @@ declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject, TCrdt
355
347
  getStorage: <TKey extends keyof InferStorage<TCrdt>>(type: TKey) => InferStorage<TCrdt>[TKey] | null;
356
348
  getStorageJson(): InferCrdtJson<InferStorage<TCrdt>> | null;
357
349
  getStorageJson<TKey extends keyof InferStorage<TCrdt>>(type: TKey): InferCrdtJson<InferStorage<TCrdt>[TKey]> | null;
350
+ getStorageLoaded(): boolean;
358
351
  other: (connectionId: string, callback: OtherSubscriptionCallback<TIO, TPresence>) => (() => void);
359
352
  redo: () => void;
360
353
  storage: StorageProxy<InferStorage<TCrdt>>;
@@ -377,4 +370,4 @@ declare const register: <TMetadata extends JsonObject>(params: RegisterParams<TM
377
370
  wsEndpoint: (params: EndpointParams<TMetadata>) => string;
378
371
  };
379
372
 
380
- export { AbstractStorageStore, type CreateRoomOptions, type EnterRoomParams, type InferCallback, type InferMetadata, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, type PluvProcedureConfig, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, PluvRouter, type PluvRouterEventConfig, type PublicKey, type PublicKeyParams, type RegisterParams, type RoomConnectParams, type RoomEndpoints, type WebSocketConnection, createClient, infer, register };
373
+ export { AbstractStorageStore, type CreateRoomOptions, type EnterRoomParams, type InferCallback, type InferMetadata, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, type PluvProcedureConfig, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, PluvRouter, type PluvRouterEventConfig, type PublicKey, type PublicKeyParams, type RegisterParams, type RoomConnectParams, type RoomEndpoints, createClient, infer, register };