@pluv/client 0.25.3 → 0.26.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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @pluv/client@0.25.3 build /home/runner/work/pluv/pluv/packages/client
2
+ > @pluv/client@0.26.0 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
- CJS dist/index.js 43.49 KB
12
- CJS ⚡️ Build success in 82ms
13
- ESM dist/index.mjs 42.22 KB
14
- ESM ⚡️ Build success in 92ms
11
+ ESM dist/index.mjs 42.38 KB
12
+ ESM ⚡️ Build success in 133ms
13
+ CJS dist/index.js 43.65 KB
14
+ CJS ⚡️ Build success in 134ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 3126ms
17
- DTS dist/index.d.mts 14.60 KB
18
- DTS dist/index.d.ts 14.60 KB
16
+ DTS ⚡️ Build success in 3009ms
17
+ DTS dist/index.d.mts 15.43 KB
18
+ DTS dist/index.d.ts 15.43 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,66 @@
1
1
  # @pluv/client
2
2
 
3
+ ## 0.26.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 19e5dda: **BREAKING**
8
+ Update `authEndpoint` and `wsEndpoint` to now use a parameterized object that passes through additional data via a `metadata` property.
9
+
10
+ ```tsx
11
+ // Before
12
+
13
+ import { env } from "./env";
14
+ import type { ioServer } from "./server";
15
+
16
+ const client = createClient<typeof ioServer>({
17
+ authEndpoint: (room: string) => `${env.API_URL}}/room/${room}`,
18
+ wsEndpoint: (room: string) => `${env.WS_URL}/room/${room}`,
19
+ });
20
+
21
+ // After
22
+
23
+ const client = createClient<
24
+ typeof ioServer,
25
+ // Optional: You can specify types for metadata here. This is useful for Cloudflare Pages
26
+ { apiUrl: string; wsUrl: string }
27
+ >({
28
+ authEndpoint: ({ metadata, room }) => `${metadata.apiUrl}}/room/${room}`,
29
+ wsEndpoint: ({ metadata, room }) => `${{ metadata.wsUrl }}/room/${room}`,
30
+ });
31
+
32
+ client.createRoom("my-room", {
33
+ // This property exists when the `metadata` generic type is defined above
34
+ metadata: {
35
+ apiUrl: "https://example.com/api",
36
+ wsUrl: "wss://example.com/api",
37
+ },
38
+ // ...
39
+ });
40
+
41
+ <PluvRoomProvider
42
+ // This property exists when the `metadata` generic type is defined above
43
+ metadata={{
44
+ apiUrl: "https://example.com/api",
45
+ wsUrl: "wss://example.com/api",
46
+ }}
47
+ >
48
+ {/* ... */}
49
+ </PluvRoomProvider>
50
+ ```
51
+
52
+ ### Patch Changes
53
+
54
+ - @pluv/crdt@0.26.0
55
+ - @pluv/types@0.26.0
56
+
57
+ ## 0.25.4
58
+
59
+ ### Patch Changes
60
+
61
+ - @pluv/crdt@0.25.4
62
+ - @pluv/types@0.25.4
63
+
3
64
  ## 0.25.3
4
65
 
5
66
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -97,48 +97,6 @@ type UsersManagerConfig<TPresence extends JsonObject = {}> = {
97
97
  presence?: InputZodLike<TPresence>;
98
98
  };
99
99
 
100
- type MockedRoomEvents<TIO extends IOLike> = Partial<{
101
- [P in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[P]>) => Partial<InferIOOutput<TIO>>;
102
- }>;
103
- type MockedRoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
104
- events?: MockedRoomEvents<TIO>;
105
- } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
106
- declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
107
- private _crdtManager;
108
- private _crdtNotifier;
109
- private _eventNotifier;
110
- private _events?;
111
- private _otherNotifier;
112
- private _state;
113
- private _stateNotifier;
114
- private _subscriptions;
115
- private _usersManager;
116
- constructor(room: string, options: MockedRoomConfig<TIO, TPresence, TStorage>);
117
- get storageLoaded(): boolean;
118
- broadcast<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>): void;
119
- canRedo: () => boolean;
120
- canUndo: () => boolean;
121
- event: <TEvent extends keyof InferIOOutput<TIO>>(event: TEvent, callback: EventNotifierSubscriptionCallback<TIO, TEvent>) => (() => void);
122
- getConnection: () => WebSocketConnection;
123
- getDoc(): AbstractCrdtDoc<TStorage>;
124
- getMyPresence: () => TPresence;
125
- getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
126
- getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
127
- getOthers: () => readonly Id<UserInfo<TIO, TPresence>>[];
128
- getStorage: <TKey extends keyof TStorage>(type: TKey) => TStorage[TKey] | null;
129
- getStorageJson(): InferCrdtJson<TStorage> | null;
130
- getStorageJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]> | null;
131
- other: (connectionId: string, callback: OtherNotifierSubscriptionCallback<TIO>) => (() => void);
132
- redo: () => void;
133
- storage: <TKey extends keyof TStorage>(key: TKey, fn: (value: InferCrdtJson<TStorage[TKey]>) => void) => (() => void);
134
- storageRoot: (fn: (value: { [P in keyof TStorage]: InferCrdtJson<TStorage[P]>; }) => void) => (() => void);
135
- subscribe: <TSubject extends keyof StateNotifierSubjects<TIO, TPresence>>(name: TSubject, callback: SubscriptionCallback<TIO, TPresence, TSubject>) => (() => void);
136
- transact: (fn: (storage: TStorage) => void, origin?: string) => void;
137
- undo: () => void;
138
- updateMyPresence: (presence: UpdateMyPresenceAction<TPresence>) => void;
139
- private _observeCrdt;
140
- }
141
-
142
100
  declare global {
143
101
  var process: {
144
102
  env: {
@@ -146,22 +104,26 @@ declare global {
146
104
  };
147
105
  };
148
106
  }
149
- type AuthEndpoint = string | ((room: string) => string | FetchOptions) | true;
150
- type WsEndpoint = string | ((room: string) => string);
107
+ interface EndpointParams<TMetadata extends JsonObject> {
108
+ metadata: TMetadata;
109
+ room: string;
110
+ }
111
+ type AuthEndpoint<TMetadata extends JsonObject> = string | ((params: EndpointParams<TMetadata>) => string | FetchOptions) | true;
112
+ type WsEndpoint<TMetadata extends JsonObject> = string | ((params: EndpointParams<TMetadata>) => string);
151
113
  type FetchOptions = {
152
114
  url: string;
153
115
  options?: RequestInit;
154
116
  };
155
- type RoomEndpoints<TIO extends IOLike> = {
156
- wsEndpoint?: WsEndpoint;
117
+ type RoomEndpoints<TIO extends IOLike, TMetadata extends JsonObject> = {
118
+ wsEndpoint?: WsEndpoint<TMetadata>;
157
119
  } & (InferIOAuthorizeRequired<InferIOAuthorize<TIO>> extends true ? {
158
- authEndpoint: AuthEndpoint;
120
+ authEndpoint: AuthEndpoint<TMetadata>;
159
121
  } : {
160
122
  authEndpoint?: undefined;
161
123
  });
162
- type PluvRoomAddon<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = (input: PluvRoomAddonInput<TIO, TPresence, TStorage>) => Partial<PluvRoomAddonResult>;
163
- interface PluvRoomAddonInput<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
164
- room: PluvRoom<TIO, TPresence, TStorage>;
124
+ type PluvRoomAddon<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = (input: PluvRoomAddonInput<TIO, TMetadata, TPresence, TStorage>) => Partial<PluvRoomAddonResult>;
125
+ interface PluvRoomAddonInput<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
126
+ room: PluvRoom<TIO, TMetadata, TPresence, TStorage>;
165
127
  }
166
128
  interface PluvRoomAddonResult {
167
129
  storage: AbstractStorageStore;
@@ -170,20 +132,25 @@ type PluvRoomDebug<TIO extends IOLike> = Id<{
170
132
  output: readonly (keyof InferIOOutput<TIO>)[];
171
133
  input: readonly (keyof InferIOInput<TIO>)[];
172
134
  }>;
173
- type PluvRoomOptions<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
174
- addons?: readonly PluvRoomAddon<TIO, TPresence, TStorage>[];
135
+ type PluvRoomOptions<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
136
+ addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, TStorage>[];
175
137
  debug?: boolean | PluvRoomDebug<TIO>;
176
138
  onAuthorizationFail?: (error: Error) => void;
177
- } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
178
- type RoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = RoomEndpoints<TIO> & PluvRoomOptions<TIO, TPresence, TStorage>;
179
- declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
180
- readonly _endpoints: RoomEndpoints<TIO>;
139
+ } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence> & (keyof TMetadata extends never ? {
140
+ metadata?: undefined;
141
+ } : {
142
+ metadata: TMetadata;
143
+ });
144
+ type RoomConfig<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = RoomEndpoints<TIO, TMetadata> & PluvRoomOptions<TIO, TMetadata, TPresence, TStorage>;
145
+ declare class PluvRoom<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
146
+ readonly _endpoints: RoomEndpoints<TIO, TMetadata>;
181
147
  private _crdtManager;
182
148
  private _crdtNotifier;
183
149
  private _debug;
184
150
  private _eventNotifier;
185
151
  private _intervals;
186
152
  private _listeners;
153
+ private _metadata;
187
154
  private _otherNotifier;
188
155
  private _state;
189
156
  private _stateNotifier;
@@ -193,7 +160,7 @@ declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TS
193
160
  private _windowListeners;
194
161
  private _wsListeners;
195
162
  private _usersManager;
196
- constructor(room: string, options: RoomConfig<TIO, TPresence, TStorage>);
163
+ constructor(room: string, options: RoomConfig<TIO, TMetadata, TPresence, TStorage>);
197
164
  get storageLoaded(): boolean;
198
165
  get webSocket(): WebSocket | null;
199
166
  broadcast: (<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>) => void) & { [event in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[event]>) => void; };
@@ -270,23 +237,65 @@ declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TS
270
237
  private _updateState;
271
238
  }
272
239
 
273
- type PluvClientOptions<TIO extends IOLike> = RoomEndpoints<TIO> & {
240
+ type PluvClientOptions<TIO extends IOLike, TMetadata extends JsonObject> = RoomEndpoints<TIO, TMetadata> & {
274
241
  debug?: boolean;
275
242
  };
276
- declare class PluvClient<TIO extends IOLike = IOLike> {
243
+ declare class PluvClient<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}> {
277
244
  private _authEndpoint;
278
245
  private _debug;
279
246
  private _wsEndpoint;
280
247
  private _rooms;
281
- constructor(options: PluvClientOptions<TIO>);
282
- createRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string, options: PluvRoomOptions<TIO, TPresence, TStorage>) => PluvRoom<TIO, TPresence, TStorage>;
283
- enter: (room: string | PluvRoom<TIO, any, any>) => Promise<PluvRoom<TIO, JsonObject, any>>;
284
- getRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string) => PluvRoom<TIO, TPresence, TStorage> | null;
285
- getRooms: () => readonly PluvRoom<TIO, JsonObject, any>[];
286
- leave: (room: string | PluvRoom<TIO, any, any>) => Promise<void>;
248
+ constructor(options: PluvClientOptions<TIO, TMetadata>);
249
+ createRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string, options: PluvRoomOptions<TIO, TMetadata, TPresence, TStorage>) => PluvRoom<TIO, TMetadata, TPresence, TStorage>;
250
+ enter: (room: string | PluvRoom<TIO, any, any, any>) => Promise<PluvRoom<TIO, TMetadata, JsonObject, any>>;
251
+ getRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string) => PluvRoom<TIO, TMetadata, TPresence, TStorage> | null;
252
+ getRooms: () => readonly PluvRoom<TIO, TMetadata, JsonObject, any>[];
253
+ leave: (room: string | PluvRoom<TIO, any, any, any>) => Promise<void>;
287
254
  private _logDebug;
288
255
  }
289
256
 
290
- declare const createClient: <TIO extends IOLike = IOLike<_pluv_types.IOAuthorize<any, any, any>, {}>>(options: PluvClientOptions<TIO>) => PluvClient<TIO>;
257
+ declare const createClient: <TIO extends IOLike = IOLike<_pluv_types.IOAuthorize<any, any, any>, {}>, TMetadata extends JsonObject = {}>(options: PluvClientOptions<TIO, TMetadata>) => PluvClient<TIO, TMetadata>;
258
+
259
+ type MockedRoomEvents<TIO extends IOLike> = Partial<{
260
+ [P in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[P]>) => Partial<InferIOOutput<TIO>>;
261
+ }>;
262
+ type MockedRoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
263
+ events?: MockedRoomEvents<TIO>;
264
+ } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
265
+ declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
266
+ private _crdtManager;
267
+ private _crdtNotifier;
268
+ private _eventNotifier;
269
+ private _events?;
270
+ private _otherNotifier;
271
+ private _state;
272
+ private _stateNotifier;
273
+ private _subscriptions;
274
+ private _usersManager;
275
+ constructor(room: string, options: MockedRoomConfig<TIO, TPresence, TStorage>);
276
+ get storageLoaded(): boolean;
277
+ broadcast<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>): void;
278
+ canRedo: () => boolean;
279
+ canUndo: () => boolean;
280
+ event: <TEvent extends keyof InferIOOutput<TIO>>(event: TEvent, callback: EventNotifierSubscriptionCallback<TIO, TEvent>) => (() => void);
281
+ getConnection: () => WebSocketConnection;
282
+ getDoc(): AbstractCrdtDoc<TStorage>;
283
+ getMyPresence: () => TPresence;
284
+ getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
285
+ getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
286
+ getOthers: () => readonly Id<UserInfo<TIO, TPresence>>[];
287
+ getStorage: <TKey extends keyof TStorage>(type: TKey) => TStorage[TKey] | null;
288
+ getStorageJson(): InferCrdtJson<TStorage> | null;
289
+ getStorageJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]> | null;
290
+ other: (connectionId: string, callback: OtherNotifierSubscriptionCallback<TIO>) => (() => void);
291
+ redo: () => void;
292
+ storage: <TKey extends keyof TStorage>(key: TKey, fn: (value: InferCrdtJson<TStorage[TKey]>) => void) => (() => void);
293
+ storageRoot: (fn: (value: { [P in keyof TStorage]: InferCrdtJson<TStorage[P]>; }) => void) => (() => void);
294
+ subscribe: <TSubject extends keyof StateNotifierSubjects<TIO, TPresence>>(name: TSubject, callback: SubscriptionCallback<TIO, TPresence, TSubject>) => (() => void);
295
+ transact: (fn: (storage: TStorage) => void, origin?: string) => void;
296
+ undo: () => void;
297
+ updateMyPresence: (presence: UpdateMyPresenceAction<TPresence>) => void;
298
+ private _observeCrdt;
299
+ }
291
300
 
292
- export { AbstractRoom, AbstractStorageStore, ConnectionState, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, type UserInfo, type WebSocketConnection, type WebSocketState, createClient };
301
+ export { AbstractRoom, AbstractStorageStore, ConnectionState, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, type PluvRoomOptions, type UserInfo, type WebSocketConnection, type WebSocketState, createClient };
package/dist/index.d.ts CHANGED
@@ -97,48 +97,6 @@ type UsersManagerConfig<TPresence extends JsonObject = {}> = {
97
97
  presence?: InputZodLike<TPresence>;
98
98
  };
99
99
 
100
- type MockedRoomEvents<TIO extends IOLike> = Partial<{
101
- [P in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[P]>) => Partial<InferIOOutput<TIO>>;
102
- }>;
103
- type MockedRoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
104
- events?: MockedRoomEvents<TIO>;
105
- } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
106
- declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
107
- private _crdtManager;
108
- private _crdtNotifier;
109
- private _eventNotifier;
110
- private _events?;
111
- private _otherNotifier;
112
- private _state;
113
- private _stateNotifier;
114
- private _subscriptions;
115
- private _usersManager;
116
- constructor(room: string, options: MockedRoomConfig<TIO, TPresence, TStorage>);
117
- get storageLoaded(): boolean;
118
- broadcast<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>): void;
119
- canRedo: () => boolean;
120
- canUndo: () => boolean;
121
- event: <TEvent extends keyof InferIOOutput<TIO>>(event: TEvent, callback: EventNotifierSubscriptionCallback<TIO, TEvent>) => (() => void);
122
- getConnection: () => WebSocketConnection;
123
- getDoc(): AbstractCrdtDoc<TStorage>;
124
- getMyPresence: () => TPresence;
125
- getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
126
- getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
127
- getOthers: () => readonly Id<UserInfo<TIO, TPresence>>[];
128
- getStorage: <TKey extends keyof TStorage>(type: TKey) => TStorage[TKey] | null;
129
- getStorageJson(): InferCrdtJson<TStorage> | null;
130
- getStorageJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]> | null;
131
- other: (connectionId: string, callback: OtherNotifierSubscriptionCallback<TIO>) => (() => void);
132
- redo: () => void;
133
- storage: <TKey extends keyof TStorage>(key: TKey, fn: (value: InferCrdtJson<TStorage[TKey]>) => void) => (() => void);
134
- storageRoot: (fn: (value: { [P in keyof TStorage]: InferCrdtJson<TStorage[P]>; }) => void) => (() => void);
135
- subscribe: <TSubject extends keyof StateNotifierSubjects<TIO, TPresence>>(name: TSubject, callback: SubscriptionCallback<TIO, TPresence, TSubject>) => (() => void);
136
- transact: (fn: (storage: TStorage) => void, origin?: string) => void;
137
- undo: () => void;
138
- updateMyPresence: (presence: UpdateMyPresenceAction<TPresence>) => void;
139
- private _observeCrdt;
140
- }
141
-
142
100
  declare global {
143
101
  var process: {
144
102
  env: {
@@ -146,22 +104,26 @@ declare global {
146
104
  };
147
105
  };
148
106
  }
149
- type AuthEndpoint = string | ((room: string) => string | FetchOptions) | true;
150
- type WsEndpoint = string | ((room: string) => string);
107
+ interface EndpointParams<TMetadata extends JsonObject> {
108
+ metadata: TMetadata;
109
+ room: string;
110
+ }
111
+ type AuthEndpoint<TMetadata extends JsonObject> = string | ((params: EndpointParams<TMetadata>) => string | FetchOptions) | true;
112
+ type WsEndpoint<TMetadata extends JsonObject> = string | ((params: EndpointParams<TMetadata>) => string);
151
113
  type FetchOptions = {
152
114
  url: string;
153
115
  options?: RequestInit;
154
116
  };
155
- type RoomEndpoints<TIO extends IOLike> = {
156
- wsEndpoint?: WsEndpoint;
117
+ type RoomEndpoints<TIO extends IOLike, TMetadata extends JsonObject> = {
118
+ wsEndpoint?: WsEndpoint<TMetadata>;
157
119
  } & (InferIOAuthorizeRequired<InferIOAuthorize<TIO>> extends true ? {
158
- authEndpoint: AuthEndpoint;
120
+ authEndpoint: AuthEndpoint<TMetadata>;
159
121
  } : {
160
122
  authEndpoint?: undefined;
161
123
  });
162
- type PluvRoomAddon<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = (input: PluvRoomAddonInput<TIO, TPresence, TStorage>) => Partial<PluvRoomAddonResult>;
163
- interface PluvRoomAddonInput<TIO extends IOLike = IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
164
- room: PluvRoom<TIO, TPresence, TStorage>;
124
+ type PluvRoomAddon<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = (input: PluvRoomAddonInput<TIO, TMetadata, TPresence, TStorage>) => Partial<PluvRoomAddonResult>;
125
+ interface PluvRoomAddonInput<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> {
126
+ room: PluvRoom<TIO, TMetadata, TPresence, TStorage>;
165
127
  }
166
128
  interface PluvRoomAddonResult {
167
129
  storage: AbstractStorageStore;
@@ -170,20 +132,25 @@ type PluvRoomDebug<TIO extends IOLike> = Id<{
170
132
  output: readonly (keyof InferIOOutput<TIO>)[];
171
133
  input: readonly (keyof InferIOInput<TIO>)[];
172
134
  }>;
173
- type PluvRoomOptions<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
174
- addons?: readonly PluvRoomAddon<TIO, TPresence, TStorage>[];
135
+ type PluvRoomOptions<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
136
+ addons?: readonly PluvRoomAddon<TIO, TMetadata, TPresence, TStorage>[];
175
137
  debug?: boolean | PluvRoomDebug<TIO>;
176
138
  onAuthorizationFail?: (error: Error) => void;
177
- } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
178
- type RoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = RoomEndpoints<TIO> & PluvRoomOptions<TIO, TPresence, TStorage>;
179
- declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
180
- readonly _endpoints: RoomEndpoints<TIO>;
139
+ } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence> & (keyof TMetadata extends never ? {
140
+ metadata?: undefined;
141
+ } : {
142
+ metadata: TMetadata;
143
+ });
144
+ type RoomConfig<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = RoomEndpoints<TIO, TMetadata> & PluvRoomOptions<TIO, TMetadata, TPresence, TStorage>;
145
+ declare class PluvRoom<TIO extends IOLike, TMetadata extends JsonObject = {}, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
146
+ readonly _endpoints: RoomEndpoints<TIO, TMetadata>;
181
147
  private _crdtManager;
182
148
  private _crdtNotifier;
183
149
  private _debug;
184
150
  private _eventNotifier;
185
151
  private _intervals;
186
152
  private _listeners;
153
+ private _metadata;
187
154
  private _otherNotifier;
188
155
  private _state;
189
156
  private _stateNotifier;
@@ -193,7 +160,7 @@ declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TS
193
160
  private _windowListeners;
194
161
  private _wsListeners;
195
162
  private _usersManager;
196
- constructor(room: string, options: RoomConfig<TIO, TPresence, TStorage>);
163
+ constructor(room: string, options: RoomConfig<TIO, TMetadata, TPresence, TStorage>);
197
164
  get storageLoaded(): boolean;
198
165
  get webSocket(): WebSocket | null;
199
166
  broadcast: (<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>) => void) & { [event in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[event]>) => void; };
@@ -270,23 +237,65 @@ declare class PluvRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TS
270
237
  private _updateState;
271
238
  }
272
239
 
273
- type PluvClientOptions<TIO extends IOLike> = RoomEndpoints<TIO> & {
240
+ type PluvClientOptions<TIO extends IOLike, TMetadata extends JsonObject> = RoomEndpoints<TIO, TMetadata> & {
274
241
  debug?: boolean;
275
242
  };
276
- declare class PluvClient<TIO extends IOLike = IOLike> {
243
+ declare class PluvClient<TIO extends IOLike = IOLike, TMetadata extends JsonObject = {}> {
277
244
  private _authEndpoint;
278
245
  private _debug;
279
246
  private _wsEndpoint;
280
247
  private _rooms;
281
- constructor(options: PluvClientOptions<TIO>);
282
- createRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string, options: PluvRoomOptions<TIO, TPresence, TStorage>) => PluvRoom<TIO, TPresence, TStorage>;
283
- enter: (room: string | PluvRoom<TIO, any, any>) => Promise<PluvRoom<TIO, JsonObject, any>>;
284
- getRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string) => PluvRoom<TIO, TPresence, TStorage> | null;
285
- getRooms: () => readonly PluvRoom<TIO, JsonObject, any>[];
286
- leave: (room: string | PluvRoom<TIO, any, any>) => Promise<void>;
248
+ constructor(options: PluvClientOptions<TIO, TMetadata>);
249
+ createRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string, options: PluvRoomOptions<TIO, TMetadata, TPresence, TStorage>) => PluvRoom<TIO, TMetadata, TPresence, TStorage>;
250
+ enter: (room: string | PluvRoom<TIO, any, any, any>) => Promise<PluvRoom<TIO, TMetadata, JsonObject, any>>;
251
+ getRoom: <TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}>(room: string) => PluvRoom<TIO, TMetadata, TPresence, TStorage> | null;
252
+ getRooms: () => readonly PluvRoom<TIO, TMetadata, JsonObject, any>[];
253
+ leave: (room: string | PluvRoom<TIO, any, any, any>) => Promise<void>;
287
254
  private _logDebug;
288
255
  }
289
256
 
290
- declare const createClient: <TIO extends IOLike = IOLike<_pluv_types.IOAuthorize<any, any, any>, {}>>(options: PluvClientOptions<TIO>) => PluvClient<TIO>;
257
+ declare const createClient: <TIO extends IOLike = IOLike<_pluv_types.IOAuthorize<any, any, any>, {}>, TMetadata extends JsonObject = {}>(options: PluvClientOptions<TIO, TMetadata>) => PluvClient<TIO, TMetadata>;
258
+
259
+ type MockedRoomEvents<TIO extends IOLike> = Partial<{
260
+ [P in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>[P]>) => Partial<InferIOOutput<TIO>>;
261
+ }>;
262
+ type MockedRoomConfig<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> = {
263
+ events?: MockedRoomEvents<TIO>;
264
+ } & Omit<CrdtManagerOptions<TStorage>, "encodedState"> & UsersManagerConfig<TPresence>;
265
+ declare class MockedRoom<TIO extends IOLike, TPresence extends JsonObject = {}, TStorage extends Record<string, CrdtType<any, any>> = {}> extends AbstractRoom<TIO, TPresence, TStorage> {
266
+ private _crdtManager;
267
+ private _crdtNotifier;
268
+ private _eventNotifier;
269
+ private _events?;
270
+ private _otherNotifier;
271
+ private _state;
272
+ private _stateNotifier;
273
+ private _subscriptions;
274
+ private _usersManager;
275
+ constructor(room: string, options: MockedRoomConfig<TIO, TPresence, TStorage>);
276
+ get storageLoaded(): boolean;
277
+ broadcast<TEvent extends keyof InferIOInput<TIO>>(event: TEvent, data: Id<InferIOInput<TIO>[TEvent]>): void;
278
+ canRedo: () => boolean;
279
+ canUndo: () => boolean;
280
+ event: <TEvent extends keyof InferIOOutput<TIO>>(event: TEvent, callback: EventNotifierSubscriptionCallback<TIO, TEvent>) => (() => void);
281
+ getConnection: () => WebSocketConnection;
282
+ getDoc(): AbstractCrdtDoc<TStorage>;
283
+ getMyPresence: () => TPresence;
284
+ getMyself: () => Id<UserInfo<TIO, TPresence>> | null;
285
+ getOther: (connectionId: string) => Id<UserInfo<TIO, TPresence>> | null;
286
+ getOthers: () => readonly Id<UserInfo<TIO, TPresence>>[];
287
+ getStorage: <TKey extends keyof TStorage>(type: TKey) => TStorage[TKey] | null;
288
+ getStorageJson(): InferCrdtJson<TStorage> | null;
289
+ getStorageJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]> | null;
290
+ other: (connectionId: string, callback: OtherNotifierSubscriptionCallback<TIO>) => (() => void);
291
+ redo: () => void;
292
+ storage: <TKey extends keyof TStorage>(key: TKey, fn: (value: InferCrdtJson<TStorage[TKey]>) => void) => (() => void);
293
+ storageRoot: (fn: (value: { [P in keyof TStorage]: InferCrdtJson<TStorage[P]>; }) => void) => (() => void);
294
+ subscribe: <TSubject extends keyof StateNotifierSubjects<TIO, TPresence>>(name: TSubject, callback: SubscriptionCallback<TIO, TPresence, TSubject>) => (() => void);
295
+ transact: (fn: (storage: TStorage) => void, origin?: string) => void;
296
+ undo: () => void;
297
+ updateMyPresence: (presence: UpdateMyPresenceAction<TPresence>) => void;
298
+ private _observeCrdt;
299
+ }
291
300
 
292
- export { AbstractRoom, AbstractStorageStore, ConnectionState, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, type UserInfo, type WebSocketConnection, type WebSocketState, createClient };
301
+ export { AbstractRoom, AbstractStorageStore, ConnectionState, MockedRoom, type MockedRoomConfig, type MockedRoomEvents, PluvClient, type PluvClientOptions, PluvRoom, type PluvRoomAddon, type PluvRoomAddonInput, type PluvRoomAddonResult, type PluvRoomDebug, type PluvRoomOptions, type UserInfo, type WebSocketConnection, type WebSocketState, createClient };