@pluv/io 4.0.0 → 4.0.2

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,20 +1,14 @@
1
-
2
- > @pluv/io@4.0.0 build /home/runner/work/pluv/pluv/packages/io
3
- > pnpm run version && tsdown
4
-
5
-
6
- > @pluv/io@4.0.0 version /home/runner/work/pluv/pluv/packages/io
7
- > genversion ./src/version.generated.ts --esm
8
-
9
- ℹ tsdown v0.20.0-beta.4 powered by rolldown v1.0.0-beta.60
1
+ $ pnpm run version && tsdown
2
+ $ genversion ./src/version.generated.ts --esm
3
+ ℹ tsdown v0.22.2 powered by rolldown v1.1.0
10
4
  ℹ config file: /home/runner/work/pluv/pluv/packages/io/tsdown.config.ts
11
5
  ℹ entry: src/index.ts
12
6
  ℹ target: esnext
13
7
  ℹ tsconfig: tsconfig.json
14
8
  ℹ Build start
15
- ℹ dist/index.mjs  45.06 kB │ gzip: 10.66 kB
16
- ℹ dist/index.mjs.map 131.03 kB │ gzip: 26.80 kB
17
- ℹ dist/index.d.mts.map  18.91 kB │ gzip: 4.07 kB
9
+ ℹ dist/index.mjs  44.59 kB │ gzip: 10.51 kB
10
+ ℹ dist/index.mjs.map 131.43 kB │ gzip: 26.44 kB
11
+ ℹ dist/index.d.mts.map  18.77 kB │ gzip: 4.08 kB
18
12
  ℹ dist/index.d.mts  35.53 kB │ gzip: 5.97 kB
19
- ℹ 4 files, total: 230.54 kB
20
- ✔ Build complete in 2894ms
13
+ ℹ 4 files, total: 230.31 kB
14
+ ✔ Build complete in 2976ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @pluv/io
2
2
 
3
+ ## 4.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - e1913b3: Upgraded internal dependencies
8
+ - Updated dependencies [e1913b3]
9
+ - @pluv/types@4.0.2
10
+ - @pluv/crdt@4.0.2
11
+
12
+ ## 4.0.1
13
+
14
+ ### Patch Changes
15
+
16
+ - @pluv/crdt@4.0.1
17
+ - @pluv/types@4.0.1
18
+
3
19
  ## 4.0.0
4
20
 
5
21
  ### Major Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/AbstractPersistence.ts","../src/AbstractWebSocket.ts","../src/PluvProcedure.ts","../src/PluvRouter.ts","../src/types.ts","../src/AbstractPubSub.ts","../src/authorize.ts","../src/AbstractPlatform.ts","../src/IORoom.ts","../src/PluvServer.ts","../src/PluvIO.ts","../src/createIO.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/AbstractPersistence.ts","../src/AbstractWebSocket.ts","../src/PluvProcedure.ts","../src/PluvRouter.ts","../src/types.ts","../src/AbstractPubSub.ts","../src/authorize.ts","../src/AbstractPlatform.ts","../src/IORoom.ts","../src/PluvServer.ts","../src/PluvIO.ts","../src/createIO.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -3,10 +3,8 @@ import hkdf from "@panva/hkdf";
3
3
  import { EncryptJWT, jwtDecrypt } from "jose";
4
4
  import { noop } from "@pluv/crdt";
5
5
  import colors from "kleur";
6
-
7
6
  //#region src/AbstractPersistence.ts
8
7
  var AbstractPersistence = class {};
9
-
10
8
  //#endregion
11
9
  //#region src/Persistence.ts
12
10
  var Persistence = class extends AbstractPersistence {
@@ -63,11 +61,9 @@ var Persistence = class extends AbstractPersistence {
63
61
  return Promise.resolve();
64
62
  }
65
63
  };
66
-
67
64
  //#endregion
68
65
  //#region src/AbstractPubSub.ts
69
66
  var AbstractPubSub = class {};
70
-
71
67
  //#endregion
72
68
  //#region src/PubSub.ts
73
69
  var PubSub = class extends AbstractPubSub {
@@ -107,7 +103,6 @@ var PubSub = class extends AbstractPubSub {
107
103
  this._unsubscriptions.delete(subscriptionId);
108
104
  }
109
105
  };
110
-
111
106
  //#endregion
112
107
  //#region src/AbstractPlatform.ts
113
108
  var AbstractPlatform = class {
@@ -132,7 +127,6 @@ var AbstractPlatform = class {
132
127
  return this;
133
128
  }
134
129
  };
135
-
136
130
  //#endregion
137
131
  //#region src/AbstractWebSocket.ts
138
132
  var AbstractWebSocket = class {
@@ -175,7 +169,6 @@ var AbstractWebSocket = class {
175
169
  return this.send(JSON.stringify(data));
176
170
  }
177
171
  };
178
-
179
172
  //#endregion
180
173
  //#region src/authorize.ts
181
174
  const DEFAULT_MAX_AGE_MS = 6e4;
@@ -206,7 +199,6 @@ const authorize = (params) => {
206
199
  encode
207
200
  };
208
201
  };
209
-
210
202
  //#endregion
211
203
  //#region src/PluvProcedure.ts
212
204
  var PluvProcedure = class PluvProcedure {
@@ -267,7 +259,6 @@ var PluvProcedure = class PluvProcedure {
267
259
  };
268
260
  }
269
261
  };
270
-
271
262
  //#endregion
272
263
  //#region src/PluvRouter.ts
273
264
  var PluvRouter = class PluvRouter {
@@ -284,22 +275,12 @@ var PluvRouter = class PluvRouter {
284
275
  return /^[a-z_$][a-z0-9_$]*$/gi.test(name);
285
276
  }
286
277
  };
287
-
288
- //#endregion
289
- //#region src/constants.ts
290
- const GARBAGE_COLLECT_INTERVAL_MS = 6e4;
291
- const MAX_PRESENCE_SIZE_BYTES = 512;
292
278
  const MAX_STORAGE_SIZE_BYTES = 31457280;
293
- const MAX_USER_ID_LENGTH = 128;
294
- const MAX_USER_SIZE_BYTES = 512;
295
- const PING_TIMEOUT_MS = 3e4;
296
-
297
279
  //#endregion
298
280
  //#region src/utils/oneLine.ts
299
281
  const oneLine = (strings, ...values) => {
300
282
  return strings.map((str) => str.replace(/\s+/g, " ")).reduce((acc, str, i) => acc + str + (i < values.length ? values[i] : ""), "").replace(/\s+/g, " ").trim();
301
283
  };
302
-
303
284
  //#endregion
304
285
  //#region src/utils/pickBy.ts
305
286
  const pickBy = (obj, by) => {
@@ -312,13 +293,12 @@ const pickBy = (obj, by) => {
312
293
  }
313
294
  return result;
314
295
  };
315
-
316
296
  //#endregion
317
297
  //#region src/IORoom.ts
318
298
  var IORoom = class {
319
299
  id;
320
300
  _doc;
321
- _lastGarbageCollectMs = -1 * (GARBAGE_COLLECT_INTERVAL_MS + 1);
301
+ _lastGarbageCollectMs = -1 * 60001;
322
302
  _uninitialize = null;
323
303
  _authorize = null;
324
304
  _context;
@@ -364,7 +344,7 @@ var IORoom = class {
364
344
  return Promise.resolve(!!this._uninitialize?.then((result) => !!result));
365
345
  }
366
346
  constructor(id, config) {
367
- const { _meta, authorize: authorize$1, context, crdt = noop, debug, getInitialStorage, onRoomDestroyed, onStorageDestroyed, onMessage, onUserConnected, onUserDisconnected, platform, roomContext, router } = config;
347
+ const { _meta, authorize, context, crdt = noop, debug, getInitialStorage, onRoomDestroyed, onStorageDestroyed, onMessage, onUserConnected, onUserDisconnected, platform, roomContext, router } = config;
368
348
  this.id = id;
369
349
  this._context = context;
370
350
  this._crdt = crdt;
@@ -384,7 +364,7 @@ var IORoom = class {
384
364
  onUserConnected: (event) => onUserConnected?.(event),
385
365
  onUserDisconnected: (event) => onUserDisconnected?.(event)
386
366
  };
387
- if (authorize$1) this._authorize = authorize$1;
367
+ if (authorize) this._authorize = authorize;
388
368
  this._platform.getWebSockets().forEach((webSocket) => {
389
369
  const deserialized = this._platform.getSerializedState(webSocket);
390
370
  const sessionId = this._platform.getSessionId(webSocket);
@@ -436,7 +416,7 @@ var IORoom = class {
436
416
  */
437
417
  return Array.from(this._sessions.values()).reduce((count, pluvWs) => {
438
418
  if (pluvWs.state.quit) return count;
439
- return currentTime - (this._platform.getLastPing(pluvWs) ?? pluvWs.state.timers.ping) > PING_TIMEOUT_MS ? count : count + 1;
419
+ return currentTime - (this._platform.getLastPing(pluvWs) ?? pluvWs.state.timers.ping) > 3e4 ? count : count + 1;
440
420
  }, 0);
441
421
  }
442
422
  onClose(webSocket) {
@@ -580,7 +560,7 @@ var IORoom = class {
580
560
  async _emitQuitters() {
581
561
  const currentTime = (/* @__PURE__ */ new Date()).getTime();
582
562
  const quitters = Array.from(this._sessions.values()).filter((pluvWs) => {
583
- return pluvWs.state.quit || currentTime - pluvWs.state.timers.ping > PING_TIMEOUT_MS;
563
+ return pluvWs.state.quit || currentTime - pluvWs.state.timers.ping > 3e4;
584
564
  });
585
565
  this._closeWebSockets(quitters);
586
566
  }
@@ -758,7 +738,6 @@ var IORoom = class {
758
738
  case "sync":
759
739
  await this._sendSyncMessage(message, sender);
760
740
  return;
761
- case "broadcast":
762
741
  default: {
763
742
  const sessionIds = options.sessionIds;
764
743
  await this._sendBroadcastMessage(message, sender, sessionIds);
@@ -769,9 +748,9 @@ var IORoom = class {
769
748
  this._wasDocEmptyOnInit = doc.isEmpty();
770
749
  const uninitialize = async () => {
771
750
  this._platform.pubSub.unsubscribe(pubSubId);
772
- const [doc$1, context] = await Promise.all([this._doc, this._getContext()]);
773
- const encodedState = doc$1.getEncodedState();
774
- doc$1.destroy();
751
+ const [doc, context] = await Promise.all([this._doc, this._getContext()]);
752
+ const encodedState = doc.getEncodedState();
753
+ doc.destroy();
775
754
  this._doc = Promise.resolve(this._docFactory.getEmpty());
776
755
  await Promise.resolve(this._listeners.onRoomDestroyed({
777
756
  ..."_meta" in this._platform && !!this._platform._meta ? { _meta: this._platform._meta } : {},
@@ -834,11 +813,11 @@ var IORoom = class {
834
813
  return session.presence;
835
814
  },
836
815
  set presence(presence) {
837
- const sessionId$1 = this.session?.id;
838
- if (!sessionId$1) return;
816
+ const sessionId = this.session?.id;
817
+ if (!sessionId) return;
839
818
  setPresence({
840
819
  presence,
841
- sessionId: sessionId$1,
820
+ sessionId,
842
821
  timer: this.time
843
822
  });
844
823
  },
@@ -1027,7 +1006,7 @@ var IORoom = class {
1027
1006
  * @date April 18, 2025
1028
1007
  */
1029
1008
  if (message.type === "$pong") {
1030
- if (Date.now() - this._lastGarbageCollectMs > GARBAGE_COLLECT_INTERVAL_MS) await this.garbageCollect();
1009
+ if (Date.now() - this._lastGarbageCollectMs > 6e4) await this.garbageCollect();
1031
1010
  }
1032
1011
  const user = pluvWs.session.user ?? null;
1033
1012
  this._sendMessage(pluvWs, {
@@ -1082,11 +1061,9 @@ var IORoom = class {
1082
1061
  });
1083
1062
  }
1084
1063
  };
1085
-
1086
1064
  //#endregion
1087
1065
  //#region src/version.generated.ts
1088
- const version = "4.0.0";
1089
-
1066
+ const version = "4.0.2";
1090
1067
  //#endregion
1091
1068
  //#region src/PluvServer.ts
1092
1069
  var PluvServer = class {
@@ -1123,7 +1100,7 @@ var PluvServer = class {
1123
1100
  return { $othersReceived: { others: sessions.filter((wsSession) => {
1124
1101
  if (wsSession.id === session?.id) return false;
1125
1102
  if (wsSession.quit) return false;
1126
- if (currentTime - wsSession.timers.ping > PING_TIMEOUT_MS) return false;
1103
+ if (currentTime - wsSession.timers.ping > 3e4) return false;
1127
1104
  return true;
1128
1105
  }).reduce((acc, { id, presence, timers, user }) => ({
1129
1106
  ...acc,
@@ -1338,7 +1315,6 @@ var PluvServer = class {
1338
1315
  if (this._config.debug) console.log(...data);
1339
1316
  }
1340
1317
  };
1341
-
1342
1318
  //#endregion
1343
1319
  //#region src/PluvIO.ts
1344
1320
  var PluvIO = class {
@@ -1353,18 +1329,18 @@ var PluvIO = class {
1353
1329
  return new PluvProcedure();
1354
1330
  }
1355
1331
  constructor(options) {
1356
- const { authorize: authorize$1, context, crdt = noop, debug = false, limits, platform } = options;
1332
+ const { authorize, context, crdt = noop, debug = false, limits, platform } = options;
1357
1333
  this._crdt = crdt;
1358
1334
  this._debug = debug;
1359
1335
  this._limits = {
1360
- presenceMaxSize: MAX_PRESENCE_SIZE_BYTES,
1336
+ presenceMaxSize: 512,
1361
1337
  storageMaxSize: MAX_STORAGE_SIZE_BYTES,
1362
- userIdMaxLength: MAX_USER_ID_LENGTH,
1363
- userMaxSize: MAX_USER_SIZE_BYTES,
1338
+ userIdMaxLength: 128,
1339
+ userMaxSize: 512,
1364
1340
  ...limits
1365
1341
  };
1366
1342
  this._platform = platform;
1367
- if (authorize$1) this._authorize = authorize$1;
1343
+ if (authorize) this._authorize = authorize;
1368
1344
  if (context) this._context = context;
1369
1345
  }
1370
1346
  async createToken(params) {
@@ -1426,13 +1402,12 @@ var PluvIO = class {
1426
1402
  return this._authorize;
1427
1403
  }
1428
1404
  };
1429
-
1430
1405
  //#endregion
1431
1406
  //#region src/createIO.ts
1432
1407
  const createIO = (params) => {
1433
- const { authorize: authorize$1, context, crdt, debug, limits, platform } = params;
1408
+ const { authorize, context, crdt, debug, limits, platform } = params;
1434
1409
  return new PluvIO({
1435
- authorize: authorize$1,
1410
+ authorize,
1436
1411
  context,
1437
1412
  crdt,
1438
1413
  debug,
@@ -1440,7 +1415,7 @@ const createIO = (params) => {
1440
1415
  platform
1441
1416
  });
1442
1417
  };
1443
-
1444
1418
  //#endregion
1445
1419
  export { AbstractPersistence, AbstractPlatform, AbstractPubSub, AbstractWebSocket, PluvIO, PluvProcedure, PluvRouter, PluvServer, authorize, createIO };
1420
+
1446
1421
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["authorize","doc","sessionId","__PLUV_VERSION","__PLUV_VERSION","authorize"],"sources":["../src/AbstractPersistence.ts","../src/Persistence.ts","../src/AbstractPubSub.ts","../src/PubSub.ts","../src/AbstractPlatform.ts","../src/AbstractWebSocket.ts","../src/authorize.ts","../src/PluvProcedure.ts","../src/PluvRouter.ts","../src/constants.ts","../src/utils/oneLine.ts","../src/utils/pickBy.ts","../src/IORoom.ts","../src/version.generated.ts","../src/PluvServer.ts","../src/PluvIO.ts","../src/createIO.ts"],"sourcesContent":["import type { JsonObject } from \"@pluv/types\";\n\nexport abstract class AbstractPersistence {\n public abstract addUser(\n room: string,\n connectionId: string,\n user: JsonObject | null,\n ): Promise<void>;\n\n public abstract deleteStorageState(room: string): Promise<void>;\n\n public abstract deleteUser(room: string, connectionId: string): Promise<void>;\n\n public abstract deleteUsers(room: string): Promise<void>;\n\n public abstract getStorageState(room: string): Promise<string | null>;\n\n public abstract getUser(room: string, connectionId: string): Promise<JsonObject | null>;\n\n public abstract getUsers(\n room: string,\n ): Promise<Map<[connectionId: string][0], JsonObject | null>>;\n\n public abstract getUsersSize(room: string): Promise<number>;\n\n public abstract initialize(roomContext: any): typeof this;\n\n public abstract setStorageState(room: string, state: string): Promise<void>;\n}\n","import type { JsonObject } from \"@pluv/types\";\nimport { AbstractPersistence } from \"./AbstractPersistence\";\n\nexport class Persistence extends AbstractPersistence {\n private _storages = new Map<string, string>();\n private _users = new Map<string, Map<string, JsonObject | null>>();\n\n public addUser(room: string, connectionId: string, user: JsonObject | null): Promise<void> {\n const users = this._users.get(room) ?? new Map<string, JsonObject | null>();\n\n this._users.set(room, users);\n users.set(connectionId, user);\n\n return Promise.resolve();\n }\n\n public deleteStorageState(room: string): Promise<void> {\n this._storages.delete(room);\n\n return Promise.resolve();\n }\n\n public async deleteUser(room: string, connectionId: string): Promise<void> {\n const users = this._users.get(room);\n\n if (!users) return;\n\n users.delete(connectionId);\n\n if (!users.size) {\n await this.deleteUsers(room);\n await this.deleteStorageState(room);\n }\n\n return Promise.resolve();\n }\n\n public deleteUsers(room: string): Promise<void> {\n this._users.delete(room);\n\n return Promise.resolve();\n }\n\n public getSize(room: string): Promise<number> {\n return Promise.resolve(this._users.get(room)?.size ?? 0);\n }\n\n public getStorageState(room: string): Promise<string | null> {\n const storage = this._storages.get(room) ?? null;\n\n return Promise.resolve(storage);\n }\n\n public getUser(room: string, connectionId: string): Promise<JsonObject | null> {\n const user = this._users.get(room)?.get(connectionId);\n\n return Promise.resolve(user ?? null);\n }\n\n public async getUsers(room: string): Promise<Map<string, JsonObject | null>> {\n const users = this._users.get(room);\n\n if (!users) return new Map();\n\n return users;\n }\n\n public async getUsersSize(room: string): Promise<number> {\n return this._users.size;\n }\n\n public initialize(roomContext: any): this {\n return this;\n }\n\n public setStorageState(room: string, state: string): Promise<void> {\n this._storages.set(room, state);\n\n return Promise.resolve();\n }\n}\n","import type { IOEventMessage, IOLike, InferIOOutput } from \"@pluv/types\";\nimport type { SendMessageOptions } from \"./types\";\n\nexport type IOPubSubEventMessage<\n TIO extends IOLike,\n TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>,\n> = IOEventMessage<TIO, TEvent> & {\n options?: SendMessageOptions;\n};\n\nexport abstract class AbstractPubSub {\n public abstract publish(roomName: string, payload: IOPubSubEventMessage<any>): Promise<void>;\n\n public abstract subscribe(\n roomName: string,\n onMessage: (message: IOPubSubEventMessage<any>) => void,\n ): Promise<number>;\n\n public abstract unsubscribe(subscriptionId: number): void;\n}\n","import type { Subject } from \"wonka\";\nimport { makeSubject, subscribe } from \"wonka\";\nimport type { IOPubSubEventMessage } from \"./AbstractPubSub\";\nimport { AbstractPubSub } from \"./AbstractPubSub\";\n\nexport class PubSub extends AbstractPubSub {\n private _currentSubscriptionId: number = 0;\n // Map of roomName to subjects\n private _subjects = new Map<string, Subject<IOPubSubEventMessage<any>>>();\n // Map of roomName to subscription ids\n private _subscriptionsRefs = new Map<string, readonly number[]>();\n // Map of\n private _unsubscriptions = new Map<number, [roomName: string, unsubscribe: () => void]>();\n\n public async publish(roomName: string, payload: IOPubSubEventMessage<any>): Promise<void> {\n const subject = this._subjects.get(roomName);\n\n if (!subject) return;\n\n Promise.resolve(subject.next(payload));\n }\n\n public subscribe(\n roomName: string,\n onMessage: (message: IOPubSubEventMessage<any>) => void,\n ): Promise<number> {\n const id = this._currentSubscriptionId++;\n const refs = this._subscriptionsRefs.get(roomName) ?? [];\n\n const subject = makeSubject<IOPubSubEventMessage<any>>();\n\n this._subjects.set(roomName, subject);\n this._subscriptionsRefs.set(roomName, [...refs, id]);\n\n const unsubscribe = subscribe(onMessage)(subject.source).unsubscribe;\n\n this._unsubscriptions.set(id, [roomName, unsubscribe]);\n\n return Promise.resolve(id);\n }\n\n public unsubscribe(subscriptionId: number): void {\n const [roomName, unsubscribe] = this._unsubscriptions.get(subscriptionId) ?? [];\n\n if (!roomName || !unsubscribe) return;\n\n const refs = this._subscriptionsRefs.get(roomName);\n\n if (!refs) return;\n\n if (refs.length === 1) {\n this._subjects.delete(roomName);\n this._subscriptionsRefs.delete(roomName);\n this._unsubscriptions.delete(subscriptionId);\n\n return;\n }\n\n const index = refs.indexOf(subscriptionId);\n\n this._subscriptionsRefs.set(\n roomName,\n index === -1 ? refs : [...refs.slice(0, index), ...refs.slice(index + 1)],\n );\n\n unsubscribe();\n\n this._unsubscriptions.delete(subscriptionId);\n }\n}\n","import type { Maybe } from \"@pluv/types\";\nimport type { AbstractPersistence } from \"./AbstractPersistence\";\nimport type { AbstractPubSub } from \"./AbstractPubSub\";\nimport type { AbstractWebSocket, InferWebSocketSource } from \"./AbstractWebSocket\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { Persistence } from \"./Persistence\";\nimport { PubSub } from \"./PubSub\";\nimport type { PlatformConfig, ResolvedPluvIOAuthorize, WebSocketSerializedState } from \"./types\";\n\nexport type InferPlatformWebSocketType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<infer IAbstractWebSocket> ? IAbstractWebSocket : never;\n\nexport type InferPlatformWebSocketSource<TPlatform> =\n TPlatform extends AbstractPlatform<infer IAbstractWebSocket>\n ? InferWebSocketSource<IAbstractWebSocket>\n : never;\n\nexport type InferInitContextType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<any, infer IInitContext> ? IInitContext : never;\n\nexport type InferRoomContextType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<any, any, infer IRoomContext> ? IRoomContext : never;\n\nexport type AbstractPlatformConfig<TRoomContext extends Record<string, any> = {}> = {\n persistence?: AbstractPersistence;\n pubSub?: AbstractPubSub;\n roomContext?: TRoomContext;\n};\n\nexport interface ConvertWebSocketConfig {\n room: string;\n}\n\nexport abstract class AbstractPlatform<\n TWebSocket extends AbstractWebSocket<any, any> = AbstractWebSocket<any, any>,\n TInitContext extends Record<string, any> = {},\n TRoomContext extends Record<string, any> = {},\n TConfig extends PlatformConfig = PlatformConfig,\n> {\n protected readonly _initContext: TInitContext | undefined;\n protected readonly _roomContext: TRoomContext | undefined;\n\n private _initialized: boolean = false;\n\n public persistence: AbstractPersistence;\n public pubSub: AbstractPubSub;\n\n public abstract readonly id: string;\n public readonly _createToken?: (\n params: JWTEncodeParams<any, any> & {\n authorize: Maybe<ResolvedPluvIOAuthorize<any, any>>;\n },\n ) => Promise<string>;\n public _fetch?: (...args: any[]) => Promise<any>;\n public abstract readonly _config: TConfig;\n public abstract readonly _name: string;\n\n constructor(config: AbstractPlatformConfig<TRoomContext> = {}) {\n const { roomContext, persistence, pubSub } = config;\n\n (this as any)._meta = (config as any)._meta;\n if (!!roomContext) this._roomContext = roomContext;\n\n this.persistence = persistence ?? new Persistence();\n this.pubSub = pubSub ?? new PubSub();\n }\n\n public abstract acceptWebSocket(webSocket: AbstractWebSocket): Promise<void>;\n\n public abstract convertWebSocket(\n webSocket: InferWebSocketSource<TWebSocket>,\n config: ConvertWebSocketConfig,\n ): AbstractWebSocket<any, any>;\n\n public abstract getLastPing(webSocket: AbstractWebSocket<any, any>): number | null;\n\n public abstract getSerializedState(\n webSocket: InferWebSocketSource<TWebSocket>,\n ): WebSocketSerializedState | null;\n\n public abstract getSessionId(webSocket: InferWebSocketSource<TWebSocket>): string | null;\n\n public abstract getWebSockets(): readonly InferWebSocketSource<TWebSocket>[];\n\n public abstract initialize(config: AbstractPlatformConfig<TRoomContext>): this;\n\n public abstract parseData(data: string | ArrayBuffer): Record<string, any>;\n\n public abstract randomUUID(): string;\n\n public abstract setSerializedState(\n webSocket: AbstractWebSocket,\n state: WebSocketSerializedState,\n ): WebSocketSerializedState;\n\n public validateConfig(config: any): void {}\n\n protected _initialize(): typeof this {\n if (this._initialized) throw new Error(\"Platform is already initialized\");\n\n this._initialized = true;\n\n return this;\n }\n}\n","import type {\n BaseUser,\n InferIOAuthorizeUser,\n IOAuthorize,\n IOEventMessage,\n JsonObject,\n MaybePromise,\n} from \"@pluv/types\";\nimport type { AbstractPersistence } from \"./AbstractPersistence\";\nimport type { AbstractPlatform } from \"./AbstractPlatform\";\nimport type { WebSocketSerializedState, WebSocketSession } from \"./types\";\n\nexport type AbstractEvent = {};\n\nexport type AbstractCloseEvent = AbstractEvent & {\n readonly code: number;\n readonly reason: string;\n};\n\nexport type AbstractMessageEvent<T = any> = AbstractEvent & {\n readonly data: T;\n};\n\nexport type AbstractErrorEvent = AbstractEvent & {\n error: unknown;\n message?: string;\n};\n\nexport interface AbstractEventMap {\n close: AbstractCloseEvent;\n message: AbstractMessageEvent;\n error: AbstractErrorEvent;\n}\n\nexport type EventType = keyof AbstractEventMap;\n\nexport interface AbstractWebSocketHandleErrorParams {\n error: unknown;\n message?: string;\n room: string;\n session?: WebSocketSession<any>;\n}\n\nexport type AbstractListener<TType extends keyof AbstractEventMap> = (\n event: AbstractEventMap[TType],\n) => MaybePromise<void>;\n\nexport type InferWebSocketSource<TAbstractWebSocket extends AbstractWebSocket> =\n TAbstractWebSocket extends AbstractWebSocket<infer IWebSocket> ? IWebSocket : never;\n\nexport interface AbstractWebSocketConfig {\n persistence: AbstractPersistence;\n platform: AbstractPlatform<any>;\n room: string;\n}\n\nexport abstract class AbstractWebSocket<\n TWebSocket = any,\n TAuthorize extends IOAuthorize<any, any> | null = null,\n> {\n /** The connection is not yet open. */\n public readonly CONNECTING = 0;\n /** The connection is open and ready to communicate. */\n public readonly OPEN = 1;\n /** The connection is in the process of closing. */\n public readonly CLOSING = 2;\n /** The connection is closed. */\n public readonly CLOSED = 3;\n\n public readonly persistence: AbstractPersistence;\n public readonly room: string;\n public readonly webSocket: TWebSocket;\n\n protected readonly _platform: AbstractPlatform<this>;\n\n public abstract set presence(presence: JsonObject | null);\n public abstract get readyState(): 0 | 1 | 2 | 3;\n public abstract get session(): WebSocketSession<TAuthorize>;\n public abstract get sessionId(): string;\n public abstract get state(): WebSocketSerializedState;\n public abstract set state(state: WebSocketSerializedState);\n public abstract set user(user: InferIOAuthorizeUser<TAuthorize>);\n\n constructor(webSocket: TWebSocket, config: AbstractWebSocketConfig) {\n const { persistence, platform, room } = config;\n\n this.persistence = persistence;\n this._platform = platform;\n this.room = room;\n this.webSocket = webSocket;\n }\n\n /**\n * TODO\n * @description Return an unsubscribe method to remove the event-listener.\n * This is preferred over adding an explicit abstract removeEventListener\n * method, because the implementing class might have to transform the\n * listener, and removing the same listener might be complicated as a\n * result.\n * @date August 28, 2022\n */\n public abstract addEventListener<TType extends EventType>(\n type: TType,\n handler: AbstractListener<TType>,\n ): void;\n\n public abstract close(code?: number | undefined, reason?: string | undefined): void;\n\n public abstract send(message: ArrayBuffer | ArrayBufferView | string): void;\n\n public abstract terminate(): void;\n\n public handleError(params: AbstractWebSocketHandleErrorParams): void {\n const { error, message: _message, room, session } = params;\n\n const message = error instanceof Error ? error.message : \"Unexpected error\";\n const stack: string | null = error instanceof Error ? (error.stack ?? null) : null;\n const connectionId = (session?.id ?? null) as string;\n\n return this.sendMessage({\n connectionId,\n data: { message, stack },\n room,\n type: \"$error\" as const,\n user: session?.user ?? null,\n });\n }\n\n public sendMessage<TMessage extends IOEventMessage<any> = IOEventMessage<any>>(\n data: TMessage,\n ): void {\n return this.send(JSON.stringify(data));\n }\n}\n","import hkdf from \"@panva/hkdf\";\nimport type { BaseUser } from \"@pluv/types\";\nimport { EncryptJWT, jwtDecrypt } from \"jose\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\n\nconst DEFAULT_MAX_AGE_MS = 60_000;\n\nexport const getEncryptionKey = async (secret: string): Promise<Uint8Array> => {\n return await hkdf(\"sha256\", secret, \"\", \"Pluv.io Generated Encryption Key\", 32);\n};\n\nexport interface JWT<TUser extends BaseUser> {\n room: string;\n sub: string;\n user: TUser;\n}\n\nexport type JWTEncodeParams<\n TUser extends BaseUser | null,\n TPlatform extends AbstractPlatform<any, any>,\n> = {\n maxAge?: number;\n room: string;\n user: TUser extends BaseUser ? TUser : \"Error: Cannot create token without authorization!\";\n} & InferInitContextType<TPlatform>;\n\nexport interface AuthorizeParams {\n platform: AbstractPlatform<any, any>;\n secret: string;\n}\n\nexport interface AuthorizeModule {\n decode: <TUser extends BaseUser>(jwt: string) => Promise<TUser | null>;\n encode: <TUser extends BaseUser, TPlatform extends AbstractPlatform<any, any>>(\n params: JWTEncodeParams<TUser, TPlatform>,\n ) => Promise<string>;\n}\n\nconst now = () => (Date.now() / 1_000) | 0;\n\nexport const authorize = (params: AuthorizeParams) => {\n const { platform, secret } = params;\n\n const encode = async <TUser extends BaseUser, TPlatform extends AbstractPlatform<any, any>>(\n encodeParams: JWTEncodeParams<TUser, TPlatform>,\n ): Promise<string> => {\n const { maxAge = DEFAULT_MAX_AGE_MS, room, user } = encodeParams;\n\n const encryptionSecret = await getEncryptionKey(secret);\n\n const token = await new EncryptJWT({\n room,\n sub: room ? `${room}|${user.id}` : user.id,\n user,\n })\n .setProtectedHeader({ alg: \"dir\", enc: \"A256GCM\" })\n .setIssuedAt()\n .setExpirationTime(now() + maxAge)\n .setJti(platform.randomUUID())\n .encrypt(encryptionSecret);\n\n return token.toString();\n };\n\n const decode = async <TUser extends BaseUser>(jwt: string): Promise<JWT<TUser> | null> => {\n const encryptionSecret = await getEncryptionKey(secret);\n\n const { payload } = await jwtDecrypt(jwt, encryptionSecret, {\n clockTolerance: 15,\n });\n\n return (payload as any) ?? null;\n };\n\n return { decode, encode };\n};\n","import type {\n EventRecord,\n IOAuthorize,\n InputZodLike,\n JsonObject,\n ProcedureLike,\n} from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { EventResolver, EventResolverKind, MergeEventRecords } from \"./types\";\n\nexport interface PluvProcedureConfig<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TInput extends JsonObject = {},\n TOutput extends EventRecord<string, any> = {},\n> {\n broadcast?: EventResolver<\n \"broadcast\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null;\n input?: InputZodLike<TInput>;\n self?: EventResolver<\"self\", TPlatform, TAuthorize, TContext, TInput, Partial<TOutput>> | null;\n sync?: EventResolver<\"sync\", TPlatform, TAuthorize, TContext, TInput, Partial<TOutput>> | null;\n}\n\nexport class PluvProcedure<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TInput extends JsonObject = {},\n TOutput extends EventRecord<string, any> = {},\n TFilled extends \"input\" | \"broadcast\" | \"self\" | \"sync\" | \"\" = \"\",\n> {\n private _broadcast: EventResolver<\n \"broadcast\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n private _input: InputZodLike<TInput> | null = null;\n private _self: EventResolver<\n \"self\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n private _sync: EventResolver<\n \"sync\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n\n public get config(): ProcedureLike<TInput, TOutput>[\"config\"] {\n return {\n broadcast: this._broadcast?.bind(this) ?? null,\n input: this._input ?? null,\n resolver: this._resolver(),\n self: this._self?.bind(this) ?? null,\n sync: this._sync?.bind(this) ?? null,\n } as ProcedureLike<TInput, TOutput>[\"config\"];\n }\n\n constructor(\n config: PluvProcedureConfig<TPlatform, TAuthorize, TContext, TInput, TOutput> = {},\n ) {\n const { broadcast, input, self, sync } = config;\n\n this._broadcast = broadcast ?? null;\n this._input = input ?? null;\n this._self = self ?? null;\n this._sync = sync ?? null;\n }\n\n public broadcast<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"broadcast\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"broadcast\"\n >,\n TFilled | \"input\" | \"broadcast\"\n > {\n const { broadcast } = this.config;\n\n if (!!broadcast) throw new Error(\"Broadcast was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"broadcast\"\n >({\n ...(this.config as any),\n broadcast: resolver as any,\n });\n }\n\n public input<TData extends JsonObject>(\n input: InputZodLike<TData>,\n ): Omit<\n PluvProcedure<TPlatform, TAuthorize, TContext, TData, {}, TFilled | \"input\">,\n TFilled | \"input\"\n > {\n return new PluvProcedure<TPlatform, TAuthorize, TContext, TData, {}, TFilled | \"input\">({\n input,\n });\n }\n\n public self<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"self\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"self\"\n >,\n TFilled | \"input\" | \"self\"\n > {\n const { self } = this.config;\n\n if (!!self) throw new Error(\"Self was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"self\"\n >({\n ...(this.config as any),\n self: resolver as any,\n });\n }\n\n public sync<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"sync\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"sync\"\n >,\n TFilled | \"input\" | \"sync\"\n > {\n const { sync } = this.config;\n\n if (!!sync) throw new Error(\"Sync was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"sync\"\n >({\n ...(this.config as any),\n sync: resolver as any,\n });\n }\n\n private _resolver(): EventResolver<\n EventResolverKind,\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n TOutput\n > {\n return (data, context) => {\n return {\n ...this._broadcast?.(data, context),\n ...this._self?.(data, context),\n ...this._sync?.(data, context),\n } as TOutput;\n };\n }\n}\n","import type { IORouterLike } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { PluvProcedure } from \"./PluvProcedure\";\nimport type { PluvIOAuthorize } from \"./types\";\n\nexport type PluvRouterEventConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n> = { [P: string]: Pick<PluvProcedure<TPlatform, TAuthorize, TContext, any, any>, \"config\"> };\n\nexport type MergedRouter<\n TRouters extends PluvRouter<TPlatform, TAuthorize, TContext, any>[] = [],\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> = any,\n TContext extends Record<string, any> = {},\n TRoot extends TRouters[0][\"_defs\"][\"events\"] = {},\n> = TRouters extends [\n infer IHead extends PluvRouter<TPlatform, TAuthorize, TContext, any>,\n ...infer ITail extends PluvRouter<TPlatform, TAuthorize, TContext, any>[],\n]\n ? MergedRouter<ITail, TPlatform, TAuthorize, TContext, TRoot & IHead[\"_defs\"][\"events\"]>\n : PluvRouter<TPlatform, TAuthorize, TContext, TRoot>;\n\nexport class PluvRouter<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IORouterLike<TEvents> {\n readonly _defs: { events: TEvents } = { events: {} as TEvents };\n\n constructor(events: TEvents) {\n const invalidName = Object.keys(events).find((name) => !this._isValidEventName(name));\n\n if (typeof invalidName === \"string\") {\n throw new Error(\n `Invalid event name. Event names must be formatted as valid JavaScript variable names: \"${invalidName}\"`,\n );\n }\n\n this._defs = { events };\n }\n\n public static merge<TRouters extends PluvRouter<any, any, any, any>[]>(\n ...routers: TRouters\n ): MergedRouter<TRouters> {\n const events = Object.assign(\n Object.create(null),\n ...routers.map((router) => router._defs.events),\n );\n\n return new PluvRouter<any, any, any, any>(events) as MergedRouter<TRouters>;\n }\n\n private _isValidEventName(name: string): boolean {\n return /^[a-z_$][a-z0-9_$]*$/gi.test(name);\n }\n}\n","export const GARBAGE_COLLECT_INTERVAL_MS = 60_000;\nexport const MAX_PRESENCE_SIZE_BYTES = 512;\nexport const MAX_STORAGE_SIZE_BYTES = 31_457_280;\nexport const MAX_USER_ID_LENGTH = 128;\nexport const MAX_USER_SIZE_BYTES = 512;\nexport const PING_TIMEOUT_MS = 30_000;\n","export const oneLine = (strings: TemplateStringsArray, ...values: unknown[]): string => {\n return strings\n .map((str) => str.replace(/\\s+/g, \" \"))\n .reduce((acc, str, i) => acc + str + (i < values.length ? values[i] : \"\"), \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n};\n","export const pickBy = <T extends Record<string, any>>(\n obj: T,\n by: (value: T[keyof T]) => boolean,\n): Partial<T> => {\n const result: Partial<T> = {};\n const keys: (keyof T)[] = Object.keys(obj);\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n const value = obj[key];\n\n if (by(value)) result[key] = value;\n }\n\n return result;\n};\n","import type { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type {\n BaseIOEventRecord,\n BaseUser,\n CrdtDocLike,\n CrdtLibraryType,\n EventMessage,\n IOEventMessage,\n IOLike,\n Id,\n InferEventMessage,\n InferEventsOutput,\n InferIOAuthorize,\n InferIOAuthorizeUser,\n InferIOInput,\n JsonObject,\n Maybe,\n} from \"@pluv/types\";\nimport colors from \"kleur\";\nimport type {\n AbstractPlatform,\n InferInitContextType,\n InferPlatformWebSocketSource,\n InferRoomContextType,\n} from \"./AbstractPlatform\";\nimport type {\n AbstractCloseEvent,\n AbstractErrorEvent,\n AbstractMessageEvent,\n} from \"./AbstractWebSocket\";\nimport { AbstractWebSocket } from \"./AbstractWebSocket\";\nimport type { PluvRouter, PluvRouterEventConfig } from \"./PluvRouter\";\nimport { authorize } from \"./authorize\";\nimport { GARBAGE_COLLECT_INTERVAL_MS, PING_TIMEOUT_MS } from \"./constants\";\nimport type {\n EventResolverContext,\n EventResolverKind,\n GetInitialStorageFn,\n IORoomDestroyedEvent,\n IORoomListenerEvent,\n IORoomMessageEvent,\n IOUserConnectedEvent,\n IOUserDisconnectedEvent,\n PluvContext,\n PluvIOAuthorize,\n ResolvedPluvIOAuthorize,\n WebSocketSession,\n WebSocketType,\n} from \"./types\";\nimport { oneLine } from \"./utils\";\n\ntype BroadcastMessage<TIO extends IORoom<any, any, any, any, any>> =\n | InferEventMessage<InferIOInput<TIO>>\n | InferEventMessage<BaseIOEventRecord<InferIOAuthorize<TIO>>>;\n\ninterface BroadcastParams<TIO extends IORoom<any, any, any, any, any>> {\n message: BroadcastMessage<TIO>;\n senderId?: string;\n}\n\nexport interface IORoomListeners<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> {\n onRoomDestroyed: (event: IORoomDestroyedEvent<TPlatform, TContext>) => void;\n onStorageDestroyed: (event: IORoomListenerEvent<TPlatform, TContext>) => void;\n onMessage: (event: IORoomMessageEvent<TPlatform, TAuthorize, TContext, TEvents>) => void;\n onUserConnected: (event: IOUserConnectedEvent<TPlatform, TAuthorize, TContext>) => void;\n onUserDisconnected: (event: IOUserDisconnectedEvent<TPlatform, TAuthorize, TContext>) => void;\n}\n\nexport type BroadcastProxy<TIO extends IORoom<any, any, any, any, any>> = (<\n TEvent extends keyof InferIOInput<TIO>,\n>(\n event: TEvent,\n data: Id<InferIOInput<TIO>[TEvent]>,\n) => Promise<void>) & {\n [event in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>>[event]) => Promise<void>;\n};\n\nexport type IORoomConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<IORoomListeners<TPlatform, TAuthorize, TContext, TEvents>> & {\n authorize?: TAuthorize;\n context: PluvContext<TPlatform, TContext>;\n crdt?: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n debug: boolean;\n getInitialStorage: GetInitialStorageFn<TContext>;\n platform: TPlatform;\n roomContext: InferRoomContextType<TPlatform>;\n router: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n};\n\ninterface SendMessageSender {\n sessionId: string | null;\n user: JsonObject | null;\n}\n\ninterface PatchPresenceParams {\n presence: JsonObject | null;\n sessionId: string;\n timer?: number | null;\n}\n\nexport type WebSocketRegisterConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n> = {\n token?: string | null;\n} & InferInitContextType<TPlatform>;\n\nexport class IORoom<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n null,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IOLike<TAuthorize, TCrdt, TEvents> {\n public readonly id: string;\n\n private _doc: Promise<CrdtDocLike<any, any>>;\n private _lastGarbageCollectMs: number = -1 * (GARBAGE_COLLECT_INTERVAL_MS + 1);\n private _uninitialize: Promise<() => Promise<void>> | null = null;\n\n private readonly _authorize: TAuthorize = null as TAuthorize;\n private readonly _context: PluvContext<TPlatform, TContext>;\n private readonly _crdt: TCrdt;\n private readonly _debug: boolean;\n private readonly _docFactory: AbstractCrdtDocFactory<any, any>;\n private readonly _getInitialStorage: GetInitialStorageFn<TContext>;\n private readonly _listeners: IORoomListeners<TPlatform, TAuthorize, TContext, TEvents>;\n private readonly _platform: TPlatform;\n private readonly _roomContext: InferRoomContextType<TPlatform>;\n private readonly _router: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n private readonly _sessions = new Map<\n [sessionId: string][0],\n AbstractWebSocket<any, TAuthorize>\n >();\n private readonly _userSessionss = new Map<[userId: string][0], Set<[sessionId: string][0]>>();\n\n private _wasDocEmptyOnInit: boolean = true;\n private _storageInitializedViaSession: boolean = false;\n\n /**\n * @ignore\n * @readonly\n * @deprecated Internal use only. Changes to this will never be marked as breaking.\n */\n public get _defs() {\n return {\n authorize: this._authorize,\n context: this._context,\n crdt: this._crdt,\n events: this._router._defs.events,\n platform: this._platform,\n } as {\n authorize: TAuthorize;\n context: TContext;\n crdt: TCrdt;\n events: TEvents;\n platform: TPlatform;\n };\n }\n\n public get broadcast(): BroadcastProxy<this> {\n const _broadcast = <TEvent extends keyof InferIOInput<this>>(\n event: TEvent,\n data: Id<InferIOInput<this>[TEvent]>,\n ): Promise<void> => {\n const message = { type: event, data } as BroadcastMessage<this>;\n\n return Promise.resolve(this._broadcast({ message }));\n };\n\n return new Proxy(_broadcast, {\n get(fn, prop) {\n return (data: any) => fn(prop as any, data);\n },\n }) as BroadcastProxy<this>;\n }\n\n private get _initialized(): Promise<boolean> {\n return Promise.resolve(!!this._uninitialize?.then((result) => !!result));\n }\n\n constructor(id: string, config: IORoomConfig<TPlatform, TAuthorize, TContext, TEvents>) {\n const {\n _meta,\n authorize,\n context,\n crdt = noop,\n debug,\n getInitialStorage,\n onRoomDestroyed,\n onStorageDestroyed,\n onMessage,\n onUserConnected,\n onUserDisconnected,\n platform,\n roomContext,\n router,\n } = config as IORoomConfig<TPlatform, TAuthorize, TContext, TEvents> & { _meta?: any };\n\n this.id = id;\n\n this._context = context;\n this._crdt = crdt as TCrdt;\n this._debug = debug;\n this._docFactory = crdt.doc(() => ({}));\n this._getInitialStorage = getInitialStorage;\n this._roomContext = roomContext;\n this._router = router;\n this._platform = platform.initialize({ ...(!!_meta ? { _meta } : {}), roomContext });\n\n // Listeners are provided from server-level configuration via createRoom\n this._listeners = {\n onRoomDestroyed: (event) => onRoomDestroyed?.(event),\n onStorageDestroyed: (event) => onStorageDestroyed?.(event),\n onMessage: (event) => onMessage?.(event),\n onUserConnected: (event) => onUserConnected?.(event),\n onUserDisconnected: (event) => onUserDisconnected?.(event),\n };\n\n if (authorize) this._authorize = authorize;\n\n /**\n * @description Everything below this line relates to waking up from hibernation.\n * @see https://developers.cloudflare.com/durable-objects/best-practices/websockets/#websocket-hibernation-api\n * @date April 17, 2025\n */\n const webSockets =\n this._platform.getWebSockets() as readonly InferPlatformWebSocketSource<TPlatform>[];\n\n webSockets.forEach((webSocket) => {\n const deserialized = this._platform.getSerializedState(webSocket);\n const sessionId = this._platform.getSessionId(webSocket);\n\n if (!deserialized) return;\n if (typeof sessionId !== \"string\") return;\n\n const pluvWs = this._platform.convertWebSocket(webSocket, { room: this.id });\n\n this._sessions.set(sessionId, pluvWs);\n\n const userId = pluvWs.session.user?.id;\n\n if (!!userId) this._addUserSession(userId, sessionId);\n });\n\n const { doc, uninitialize } = this._initialize();\n\n this._doc = doc;\n this._uninitialize = uninitialize;\n }\n\n /**\n * @description Closes a connection with the specified sessionId\n * @param sessionId The session id of the connection to close\n */\n public async evict(sessionId: string): Promise<void> {\n const session = this._sessions.get(sessionId);\n\n if (session) session.state.quit = true;\n\n await this._emitQuitters();\n }\n\n /**\n * @description Closes all connections to this room, effectively destroying\n * the room\n */\n public async evictAll(): Promise<void> {\n const sessions = Array.from(this._sessions.values());\n\n sessions.forEach((session) => {\n session.state.quit = true;\n });\n\n await this._emitQuitters();\n }\n\n /**\n * @description The IORoom will garbage collect occasionally as connections ping/pong the\n * server\n */\n public async garbageCollect(): Promise<void> {\n this._lastGarbageCollectMs = Date.now();\n this._emitQuitters();\n this._emitSyncState();\n }\n\n public getSize(): number {\n const currentTime = new Date().getTime();\n\n /**\n * @description Doing this instead of .size because some sessions\n * in the map can be considered as \"omitted\".\n * @date December 21, 2022\n */\n return Array.from(this._sessions.values()).reduce((count, pluvWs) => {\n if (pluvWs.state.quit) return count;\n\n const pingTime = this._platform.getLastPing(pluvWs) ?? pluvWs.state.timers.ping;\n\n return currentTime - pingTime > PING_TIMEOUT_MS ? count : count + 1;\n }, 0);\n }\n\n public onClose(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractCloseEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onClose(wsSession);\n }\n\n public onError(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractErrorEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onClose(wsSession);\n }\n\n public onMessage(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractMessageEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onMessage(wsSession);\n }\n\n public async register(\n webSocket: InferPlatformWebSocketSource<TPlatform>,\n ...options: keyof InferInitContextType<TPlatform> extends never\n ? [{ token?: string }?]\n : [WebSocketRegisterConfig<TPlatform>]\n ): Promise<void> {\n const _options = (options[0] ?? {}) as WebSocketRegisterConfig<TPlatform>;\n const token = _options.token ?? null;\n\n /**\n * TODO\n * @description Update the sessionId strategy so that the userId can be used to retrieve\n * the session in O(1) time if authorized.\n * @date April 15, 2025\n */\n const sessionId = this._platform.getSessionId(webSocket);\n const sessionExists = typeof sessionId === \"string\" && this._sessions.has(sessionId);\n\n if (sessionExists) return;\n\n if (!(await this._initialized)) {\n this._initialize();\n await this._initialized;\n }\n\n const user: BaseUser | null = await this._getAuthorizedUser(token, _options);\n const ioAuthorize = this._getIOAuthorize(_options);\n const isUnauthorized = !!ioAuthorize && !user;\n const pluvWs = this._platform.convertWebSocket(webSocket, { room: this.id });\n\n if (isUnauthorized) {\n this._logDebug(`${colors.blue(\"Authorization failed for connection\")}`);\n pluvWs.handleError({ error: new Error(\"Not authorized\"), room: this.id });\n pluvWs.close(3000, \"WebSocket unauthorized.\");\n\n return;\n }\n\n if (!!user) {\n const latest = this._getLatestPresence(user.id);\n const prevState = pluvWs.state;\n\n pluvWs.user = user;\n\n this._platform.setSerializedState(pluvWs, {\n ...prevState,\n presence: latest.presence,\n timers: { ...prevState.timers, presence: latest.timer },\n });\n this._addUserSession(user.id, pluvWs.sessionId);\n }\n\n this._logDebug(\n `${colors.blue(`Registering connection for room ${this.id}:`)} ${pluvWs.sessionId}`,\n );\n\n await this._platform.acceptWebSocket(pluvWs);\n this._sessions.set(pluvWs.sessionId, pluvWs);\n await this._platform.persistence.addUser(this.id, pluvWs.sessionId, user ?? {});\n\n if (this._platform._config.registrationMode === \"attached\") {\n const onClose = this._onClose(pluvWs).bind(this);\n const onMessage = this._onMessage(pluvWs).bind(this);\n\n pluvWs.addEventListener(\"close\", onClose);\n pluvWs.addEventListener(\"error\", onClose);\n pluvWs.addEventListener(\"message\", onMessage);\n }\n\n await this._emitRegistered(pluvWs);\n\n const size = this.getSize();\n\n this._logDebug(oneLine`\n ${colors.blue(`Registered connection for room ${this.id}:`)}\n ${pluvWs.sessionId}\n `);\n this._logDebug(`${colors.blue(`Room ${this.id} size:`)} ${size}`);\n }\n\n private _addUserSession(userId: string, sessionId: string): Set<[sessionId: string][0]> {\n const set = this._userSessionss.get(userId) ?? new Set<string>();\n const updated = set.add(sessionId);\n\n this._userSessionss.set(userId, updated);\n\n return updated;\n }\n\n private async _broadcast(params: BroadcastParams<this>): Promise<void> {\n const { message, senderId } = params;\n\n const sender = senderId ? (this._sessions.get(senderId) ?? null) : null;\n const session = sender?.session ?? null;\n const user = session?.user ?? null;\n\n if (typeof senderId !== \"string\") return;\n\n this._platform.pubSub.publish(this.id, {\n connectionId: senderId ?? null,\n room: this.id,\n user,\n ...message,\n });\n }\n\n private async _closeWebSockets(\n webSockets: readonly AbstractWebSocket<any, TAuthorize>[],\n ): Promise<void> {\n const closeWebSocket = async (\n webSocket: AbstractWebSocket<any, TAuthorize>,\n ): Promise<void> => {\n webSocket.state = { ...webSocket.state, quit: true };\n\n const sessionId = webSocket.sessionId;\n\n this._logDebug(\n `${colors.blue(`Unregistering connection for room ${this.id}:`)} ${sessionId}`,\n );\n this._sessions.delete(sessionId);\n\n await this._platform.persistence.deleteUser(this.id, sessionId).catch(() => null);\n await this._broadcast({\n message: { type: \"$exit\", data: { sessionId } },\n senderId: sessionId,\n });\n\n const session = webSocket.session;\n const user = session.user;\n\n if (!!user) this._removeUserSession(user.id, sessionId);\n\n try {\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.getEncodedState();\n\n await Promise.resolve(\n this._listeners.onUserDisconnected({\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n user,\n }),\n );\n } catch (error) {\n console.error(error);\n }\n\n this._logDebug(\n `${colors.blue(`Unregistered connection for room ${this.id}:`)} ${webSocket.sessionId}`,\n );\n };\n\n const promises = webSockets.map(async (webSocket) => {\n await closeWebSocket(webSocket).catch(() => null);\n });\n\n await Promise.all(promises).catch(() => null);\n\n const size = this.getSize();\n\n this._logDebug(`${colors.blue(`Room ${this.id} size:`)} ${size}`);\n\n if (!!size) return;\n if (!this._uninitialize) return;\n\n const uninitialize = (await this._uninitialize).bind(this);\n await uninitialize();\n }\n\n private async _emitQuitters(): Promise<void> {\n const currentTime = new Date().getTime();\n const quitters = Array.from(this._sessions.values()).filter((pluvWs) => {\n return pluvWs.state.quit || currentTime - pluvWs.state.timers.ping > PING_TIMEOUT_MS;\n });\n\n this._closeWebSockets(quitters);\n }\n\n private async _emitRegistered(pluvWs: AbstractWebSocket<any, TAuthorize>): Promise<void> {\n const session = pluvWs.session;\n const sessionId = session.id;\n const presence = session.presence;\n const user = session.user;\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.isEmpty() ? null : doc.getEncodedState();\n\n await this._sendSelfMessage(\n {\n type: \"$registered\",\n data: {\n presence,\n sessionId,\n state: encodedState,\n timers: { presence: session.timers.presence },\n },\n },\n { sessionId, user },\n );\n\n try {\n await Promise.resolve(\n this._listeners.onUserConnected({\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n user,\n webSocket: pluvWs.webSocket,\n }),\n );\n } catch (err) {\n console.error(err);\n }\n }\n\n private async _emitSyncState(): Promise<void> {\n const connectionIds = await this._platform.persistence\n .getUsers(this.id)\n .then((map) => Object.keys(map));\n\n await this._broadcast({\n message: {\n type: \"$syncStateReceived\",\n data: { connectionIds },\n },\n });\n }\n\n private _ensureDetached(): void {\n if (this._platform._config.registrationMode === \"detached\") return;\n\n throw new Error(\"Platform must use detached mode\");\n }\n\n private _getAbstractWs(\n webSocket: WebSocketType<TPlatform>,\n ): AbstractWebSocket<any, TAuthorize> | null {\n if ((webSocket as unknown as any) instanceof AbstractWebSocket) return webSocket;\n\n const sessionId = this._platform.getSessionId(webSocket);\n\n if (typeof sessionId === \"string\") {\n const session = this._sessions.get(sessionId) ?? null;\n\n if (session) return session;\n }\n\n const sessions = Array.from(this._sessions.values());\n\n return sessions.find((pluvWs) => pluvWs.webSocket === webSocket) ?? null;\n }\n\n /**\n * TODO\n * @description Revisit any cast types\n * @date July 17, 2025\n */\n private async _getAuthorizedUser(\n token: Maybe<string>,\n options: WebSocketRegisterConfig<TPlatform>,\n ): Promise<InferIOAuthorizeUser<TAuthorize>> {\n const ioAuthorize = this._getIOAuthorize(options);\n\n if (!ioAuthorize) return null as any;\n if (!token) return null as any;\n\n if (!ioAuthorize.secret)\n throw new Error(\"`authorize` was specified without a valid secret\");\n\n const payload = await authorize({\n platform: this._platform,\n secret: ioAuthorize.secret,\n }).decode(token);\n\n if (!payload) {\n this._logDebug(colors.blue(\"Could not decode token:\"));\n this._logDebug(token);\n\n return null as any;\n }\n\n if (payload.room !== this.id) {\n this._logDebug(colors.blue(`Token is not authorized for room ${this.id}:`));\n this._logDebug(colors.blue(\"Received:\"), payload.room);\n this._logDebug(token);\n\n return null as any;\n }\n\n try {\n return ioAuthorize.user.parse(payload.user) ?? null;\n } catch {\n this._logDebug(`${colors.blue(\"Token fails validation:\")} ${token}`);\n\n return null as any;\n }\n }\n\n private async _getContext(): Promise<TContext> {\n return typeof this._context === \"function\"\n ? await Promise.resolve(this._context(this._roomContext))\n : await Promise.resolve(this._context);\n }\n\n private async _getInitialDoc(): Promise<CrdtDocLike<any, any>> {\n const doc = this._docFactory.getEmpty();\n\n const [encodedState, context] = await Promise.all([\n this._platform.persistence.getStorageState(this.id),\n this._getContext(),\n ]);\n\n if (!encodedState) {\n const loadedState = await this._getInitialStorage({\n context,\n room: this.id,\n });\n\n if (!!loadedState && !this._docFactory.isEmpty(loadedState)) {\n doc.applyEncodedState({ update: loadedState });\n }\n }\n\n if (typeof encodedState === \"string\") {\n doc.applyEncodedState({ update: encodedState });\n\n // If we loaded storage from persistence and it's non-empty, storage was previously initialized.\n // This handles hibernation wake-up: restore the initialization state so that onStorageDestroyed\n // will fire correctly when the room is destroyed.\n if (!doc.isEmpty()) {\n this._storageInitializedViaSession = true;\n }\n }\n\n return doc;\n }\n\n private _getIOAuthorize(\n options: WebSocketRegisterConfig<TPlatform>,\n ): ResolvedPluvIOAuthorize<any, any> | null {\n if (typeof this._authorize === \"function\") return this._authorize(options);\n\n return this._authorize as ResolvedPluvIOAuthorize<any, any> | null;\n }\n\n private _getLatestPresence(userId: string): {\n timer: number | null;\n presence: JsonObject | null;\n } {\n if (!this._authorize) return { timer: null, presence: null };\n\n const sessionIds = Array.from(this._userSessionss.get(userId)?.values() ?? []);\n\n if (!sessionIds.length) return { timer: null, presence: null };\n\n return sessionIds.reduce(\n (state, sessionId) => {\n const pluvWs = this._sessions.get(sessionId) ?? null;\n\n if (!pluvWs) return state;\n\n const session = pluvWs.session;\n const presence = session.presence;\n const timer = session.timers.presence;\n\n if (session.user?.id !== userId) return state;\n if (typeof state.timer !== \"number\") return { presence, timer };\n if (typeof timer !== \"number\") return state;\n\n return timer > state.timer ? { presence, timer } : state;\n },\n { presence: null, timer: null } as {\n presence: JsonObject | null;\n timer: number | null;\n },\n );\n }\n\n private _getProcedure(\n message: EventMessage<string, any>,\n ):\n | (typeof this._router)[\"_defs\"][\"events\"][keyof (typeof this._router)[\"_defs\"][\"events\"]]\n | null {\n return (\n this._router._defs.events[\n message.type as keyof (typeof this._router)[\"_defs\"][\"events\"]\n ] ?? null\n );\n }\n\n private _getProcedureInputs(\n message: EventMessage<string, any>,\n ): InferIOInput<this>[keyof TEvents] {\n const procedure = this._getProcedure(message);\n\n if (!procedure) return message.data;\n\n return procedure.config.input ? procedure.config.input.parse(message.data) : message.data;\n }\n\n private _getSession(webSocket: WebSocketType<TPlatform>): WebSocketSession<TAuthorize> {\n const pluvWs = this._getAbstractWs(webSocket);\n\n if (!pluvWs) throw new Error(\"Session could not be found\");\n\n return pluvWs.session;\n }\n\n private _getSessions() {\n const sessions = Array.from(this._sessions.values()).map((pluvWs) => pluvWs.session);\n\n return sessions;\n }\n\n private _initialize() {\n const promise = (async () => {\n this._logDebug(`${colors.blue(`Initializing room: ${this.id}`)}`);\n\n if (!!this._uninitialize) {\n const uninitialize = (await this._uninitialize).bind(this);\n await uninitialize();\n\n this._uninitialize = null;\n }\n\n const pubSubId = await this._platform.pubSub.subscribe(\n this.id,\n async ({ options = {}, ...message }): Promise<void> => {\n await promise;\n\n const sender: SendMessageSender = {\n sessionId: message.connectionId,\n user: message.user,\n };\n\n switch (options.type) {\n case \"self\": {\n await this._sendSelfMessage(message, sender);\n return;\n }\n case \"sync\": {\n await this._sendSyncMessage(message, sender);\n return;\n }\n case \"broadcast\":\n default: {\n const sessionIds = options.sessionIds;\n\n await this._sendBroadcastMessage(message, sender, sessionIds);\n }\n }\n },\n );\n\n const doc = await this._getInitialDoc();\n\n // Track if doc was empty when room was first initialized\n this._wasDocEmptyOnInit = doc.isEmpty();\n\n const uninitialize = async () => {\n this._platform.pubSub.unsubscribe(pubSubId);\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.getEncodedState();\n\n doc.destroy();\n this._doc = Promise.resolve(this._docFactory.getEmpty());\n\n // Always emit onRoomDestroyed\n await Promise.resolve(\n this._listeners.onRoomDestroyed({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n platform: this._platform,\n room: this.id,\n }),\n );\n\n // Only emit onStorageDestroyed if storage was initialized via initializeSession\n if (this._storageInitializedViaSession) {\n await Promise.resolve(\n this._listeners.onStorageDestroyed({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n }),\n );\n\n this._storageInitializedViaSession = false;\n }\n\n this._uninitialize = null;\n };\n\n return { doc, uninitialize };\n })();\n\n this._doc = promise.then((result) => result.doc);\n this._uninitialize = promise.then((result) => result.uninitialize);\n\n return { doc: this._doc, uninitialize: this._uninitialize };\n }\n\n private _logDebug(...data: any[]): void {\n if (this._debug) console.log(...data);\n }\n\n private _onClose(webSocket: AbstractWebSocket<any, TAuthorize>): () => Promise<void> {\n return async (): Promise<void> => {\n if (!(await this._initialized)) return;\n await this._closeWebSockets([webSocket]);\n };\n }\n\n private _onMessage(\n webSocket: AbstractWebSocket<any, TAuthorize>,\n ): (event: AbstractMessageEvent) => Promise<void> {\n return async (event: AbstractMessageEvent): Promise<void> => {\n if (!(await this._initialized)) return;\n\n const pluvWs = this._getAbstractWs(webSocket as WebSocketType<TPlatform>);\n\n if (!pluvWs) throw new Error(\"Could not get session\");\n\n const session = this._getSession(pluvWs as WebSocketType<TPlatform>);\n const sessions = this._getSessions();\n\n const setPresence = (params: PatchPresenceParams): void => {\n this._setPresence.bind(this)(params);\n };\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const eventContext: EventResolverContext<\n EventResolverKind,\n TPlatform,\n TAuthorize,\n TContext\n > = {\n context,\n doc,\n garbageCollect: async () => {\n await this.garbageCollect();\n },\n platform: this._platform,\n get presence() {\n return session.presence as JsonObject | null;\n },\n set presence(presence: JsonObject | null) {\n const sessionId = this.session?.id;\n\n if (!sessionId) return;\n\n setPresence({ presence, sessionId, timer: this.time });\n },\n room: this.id,\n session,\n sessions,\n time: new Date().getTime(),\n };\n\n if (pluvWs.state.quit) {\n await this._closeWebSockets([pluvWs]).catch(() => null);\n pluvWs.close(1011, \"WebSocket broken.\");\n\n return;\n }\n\n const message = this._parseMessage(event);\n\n if (!message) return;\n\n const procedure = this._getProcedure(message);\n\n this._listeners.onMessage({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n encodedState: doc.getEncodedState(),\n message: message as InferEventMessage<\n InferEventsOutput<TEvents>,\n keyof InferEventsOutput<TEvents>\n >,\n platform: this._platform,\n room: this.id,\n user: session.user,\n webSocket: session.webSocket.webSocket,\n });\n\n const sessionId = session.id;\n const user = session.user;\n\n if (!procedure) {\n await this._broadcast({\n message: message as any,\n senderId: sessionId,\n });\n\n return;\n }\n\n let inputs: InferIOInput<this>[keyof TEvents];\n\n try {\n inputs = this._getProcedureInputs(message);\n } catch (error) {\n pluvWs.handleError({\n error,\n message: \"Invalid input\",\n room: this.id,\n session,\n });\n\n return;\n }\n\n await Promise.all([\n procedure.config.broadcast?.(inputs, eventContext),\n procedure.config.self?.(inputs, eventContext),\n procedure.config.sync?.(inputs, eventContext),\n ]).then(async ([broadcast, self, sync]) => {\n const handleBroadcast = async () => {\n if (!broadcast) return;\n\n const messages = Object.entries(broadcast).map(async ([type, data]: any) => {\n await this._broadcast({\n message: { data, type },\n senderId: sessionId,\n });\n });\n\n await Promise.all(messages);\n };\n\n const handleSelf = async () => {\n if (!self) return;\n\n const messages = Object.entries(self).map(async ([type, data]) => {\n await this._sendSelfMessage({ data, type }, { sessionId, user });\n });\n\n await Promise.all(messages);\n };\n\n const handleSync = async () => {\n if (!sync) return;\n\n await this._platform.pubSub.publish(this.id, {\n connectionId: session.id,\n options: { type: \"sync\" },\n room: this.id,\n user,\n ...message,\n });\n\n const messages = Object.entries(sync).map(async ([type, data]) => {\n await this._sendSelfMessage({ data, type }, { sessionId, user });\n });\n\n await Promise.all(messages);\n };\n\n await Promise.all([handleBroadcast(), handleSelf(), handleSync()]);\n });\n\n // After processing messages that might update storage (like $initializeSession),\n // check if storage was initialized via initializeSession\n await this._checkStorageInitializedViaSession();\n };\n }\n\n private _parseMessage(message: {\n data: string | ArrayBuffer;\n }): EventMessage<string, any> | null {\n try {\n const parsed = this._platform.parseData(message.data);\n\n if (typeof parsed !== \"object\") return null;\n if (typeof parsed.type !== \"string\") return null;\n if (typeof parsed.data !== \"object\") return null;\n\n return parsed as EventMessage<string, any>;\n } catch {\n return null;\n }\n }\n\n private _setPresence(params: PatchPresenceParams): void {\n const { presence, sessionId, timer: _timer } = params;\n\n const timer = _timer ?? new Date().getTime();\n const pluvWs = this._sessions.get(sessionId) ?? null;\n\n if (!pluvWs) return;\n\n const wsSession = pluvWs.session;\n const user = wsSession.user as BaseUser | null;\n\n const sessionIds = user\n ? new Set<string>([...(this._userSessionss.get(user.id) ?? []), sessionId])\n : new Set([sessionId]);\n\n sessionIds.forEach((sId) => {\n const pWs = this._sessions.get(sId);\n const session = pWs?.session;\n\n if (!session) return;\n\n const prevState = session.webSocket.state;\n\n this._platform.setSerializedState(session.webSocket, {\n ...prevState,\n presence,\n timers: {\n ...prevState.timers,\n presence: timer,\n },\n });\n });\n }\n\n private _removeUserSession(\n userId: string,\n sessionId: string,\n ): Set<[sessionId: string][0]> | null {\n const set = this._userSessionss.get(userId);\n\n if (!set) return null;\n\n set.delete(sessionId);\n\n if (!!set.size) return set;\n\n this._userSessionss.delete(userId);\n\n return set;\n }\n\n private async _checkStorageInitializedViaSession(): Promise<void> {\n if (this._storageInitializedViaSession) return;\n\n // Only mark as initialized if:\n // 1. Doc was empty when room was first initialized\n // 2. Doc is now non-empty\n // 3. At least one session has been registered\n const doc = await this._doc;\n if (this._wasDocEmptyOnInit && !doc.isEmpty() && this._sessions.size > 0) {\n this._storageInitializedViaSession = true;\n }\n }\n\n private async _sendMessage(\n pluvWs: AbstractWebSocket<any, TAuthorize>,\n message: IOEventMessage<any>,\n ): Promise<void> {\n if (!(await this._initialized)) return;\n\n await Promise.resolve(pluvWs.sendMessage(message));\n }\n\n private async _sendBroadcastMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n sessionIds?: readonly string[],\n ): Promise<void> {\n const { data, type } = message;\n const connectionId = sender?.sessionId ?? null;\n const room = this.id;\n\n if (typeof connectionId !== \"string\") return;\n\n const webSockets =\n sessionIds?.reduce((dict, id) => {\n const pluvWs = this._sessions.get(id);\n\n return pluvWs ? dict.set(id, pluvWs) : dict;\n }, new Map<string, AbstractWebSocket<any, TAuthorize>>()) ?? this._sessions;\n\n const promises = Array.from(webSockets.values()).map(async (pluvWs) => {\n const session = pluvWs.session;\n const user = session.user ?? null;\n\n this._sendMessage(pluvWs, { connectionId, data, room, type, user });\n });\n\n await Promise.all(promises);\n }\n\n private async _sendSelfMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n ): Promise<void> {\n const senderId = sender?.sessionId ?? null;\n\n if (typeof senderId !== \"string\") return;\n\n const pluvWs = this._sessions.get(senderId);\n\n if (!pluvWs) return;\n\n /**\n * @description Note that this will not fire for Cloudflare's hibernatable websockets\n * because the server will auto-respond with the $pong event without calling any\n * functions.\n * @date April 18, 2025\n */\n if (message.type === \"$pong\") {\n const elapsedMs = Date.now() - this._lastGarbageCollectMs;\n\n if (elapsedMs > GARBAGE_COLLECT_INTERVAL_MS) {\n await this.garbageCollect();\n }\n }\n\n const session = pluvWs.session;\n const user = session.user ?? null;\n\n this._sendMessage(pluvWs, {\n connectionId: senderId,\n room: this.id,\n user,\n ...message,\n });\n }\n\n private async _sendSyncMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n ): Promise<void> {\n if (!sender) return;\n\n const connectionId = sender.sessionId;\n\n if (typeof connectionId !== \"string\") return;\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const resolverCtx: EventResolverContext<\"sync\", TPlatform, TAuthorize, TContext> = {\n context,\n doc,\n garbageCollect: async () => {\n await this.garbageCollect();\n },\n platform: this._platform,\n get presence() {\n return null;\n },\n set presence(presence: JsonObject | null) {\n return;\n },\n room: this.id,\n session: null,\n sessions: this._getSessions(),\n time: new Date().getTime(),\n };\n\n const resolver = this._getProcedure(message)?.config.sync;\n\n if (!resolver) return;\n\n let inputs: InferIOInput<this>[keyof TEvents];\n\n try {\n inputs = this._getProcedureInputs(message);\n } catch {\n return;\n }\n\n Promise.resolve(resolver(inputs, resolverCtx)).then((output) => {\n if (!output) return;\n\n Object.keys(output).forEach((type: string) => {\n const data = output[type] ?? {};\n\n this._platform.pubSub.publish(this.id, {\n connectionId,\n data,\n options: { type: \"self\" },\n room: this.id,\n type,\n user: (sender.user ?? null) as BaseUser | null,\n });\n });\n });\n }\n}\n","// Generated by genversion.\nexport const version = '4.0.0'\n","import type { AbstractCrdtDocFactory, CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type {\n AreAllOptional,\n IOLike,\n Id,\n InferIOAuthorize,\n InferIOAuthorizeUser,\n JsonObject,\n Maybe,\n NonNilProps,\n} from \"@pluv/types\";\nimport colors from \"kleur\";\nimport type {\n AbstractPlatform,\n InferInitContextType,\n InferRoomContextType,\n} from \"./AbstractPlatform\";\nimport { IORoom } from \"./IORoom\";\nimport type { PluvIO } from \"./PluvIO\";\nimport { PluvProcedure } from \"./PluvProcedure\";\nimport type { PluvRouterEventConfig } from \"./PluvRouter\";\nimport { PluvRouter } from \"./PluvRouter\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { PING_TIMEOUT_MS } from \"./constants\";\nimport type {\n BasePluvIOListeners,\n GetInitialStorageFn,\n PluvContext,\n PluvIOAuthorize,\n PluvIOLimits,\n PluvIOListeners,\n} from \"./types\";\nimport { oneLine, pickBy } from \"./utils\";\nimport { __PLUV_VERSION } from \"./version\";\n\nexport type InferIORoom<TServer extends PluvServer<any, any, any, any, any>> =\n TServer extends PluvServer<\n infer IPlatform,\n infer IAuthorize,\n infer IContext,\n infer ICrdt,\n infer IEvents\n >\n ? IORoom<IPlatform, IAuthorize, IContext, ICrdt, IEvents>\n : never;\n\nexport type PluvServerConfig<\n TPlatform extends AbstractPlatform<any, any> = AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<PluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>> & {\n authorize?: TAuthorize;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n debug?: boolean;\n limits: PluvIOLimits;\n io: PluvIO<TPlatform, TAuthorize, TContext>;\n platform: () => TPlatform;\n router?: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n} & (TCrdt extends CrdtLibraryType<NoopCrdtDocFactory>\n ? { getInitialStorage?: \"[ERROR]: Must specify crdt to use getInitialStorage\" }\n : { getInitialStorage: GetInitialStorageFn<TContext> });\n\ntype BaseCreateRoomOptions<\n TPlatform extends AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> = {\n debug?: boolean;\n};\n\nexport type CreateRoomOptions<\n TPlatform extends AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> = keyof Omit<InferRoomContextType<TPlatform>, \"meta\"> extends never\n ? [BaseCreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents>] | []\n : [\n Id<\n BaseCreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents> &\n InferRoomContextType<TPlatform>\n >,\n ];\n\nexport class PluvServer<\n TPlatform extends AbstractPlatform<any, any> = AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IOLike<TAuthorize, TCrdt, TEvents> {\n public readonly version: string = __PLUV_VERSION as any;\n\n private readonly _config: NonNilProps<\n PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n >;\n private readonly _docFactory: AbstractCrdtDocFactory<any, any>;\n\n public get fetch(): (...args: any[]) => Promise<any> {\n return (...args: any[]): Promise<any> => {\n const platform = this._config.platform();\n platform.validateConfig(this._config);\n\n if (!platform._fetch) {\n throw new Error(`\\`${platform._name}\\` does not support \\`fetch\\``);\n }\n\n return platform._fetch(...args);\n };\n }\n\n /**\n * @ignore\n * @readonly\n * @deprecated Internal use only. Changes to this will never be marked as breaking.\n */\n public get _defs() {\n return {\n authorize: this._config.authorize,\n context: this._config.context,\n crdt: this._config.crdt,\n events: this._router._defs.events,\n platform: this._config.platform(),\n } as {\n authorize: TAuthorize;\n context: PluvContext<TPlatform, TContext>;\n crdt: TCrdt;\n events: TEvents;\n platform: TPlatform;\n };\n }\n\n private get _baseRouter(): PluvRouter<TPlatform, TAuthorize, TContext, {}> {\n const listeners = this._getListeners();\n\n return new PluvRouter({\n $getOthers: this._procedure.sync((data, { room, session, sessions }) => {\n const currentTime = Date.now();\n\n const others = sessions\n .filter((wsSession) => {\n if (wsSession.id === session?.id) return false;\n if (wsSession.quit) return false;\n if (currentTime - wsSession.timers.ping > PING_TIMEOUT_MS) return false;\n\n return true;\n })\n .reduce<{\n [connectionId: string]: {\n connectionId: string;\n room: string | null;\n user: JsonObject | null;\n };\n }>(\n (acc, { id, presence, timers, user }) => ({\n ...acc,\n [id]: {\n connectionId: id,\n presence,\n room,\n timers: { presence: timers.presence },\n user,\n },\n }),\n {},\n );\n\n return { $othersReceived: { others } };\n }),\n $initializeSession: this._procedure\n .broadcast((data, { session }) => {\n const presence = (data as any)?.presence;\n const timers = session.timers;\n\n if (!session) return {};\n\n session.presence = presence;\n\n return {\n $userJoined: {\n connectionId: session.id,\n user: session.user,\n presence,\n timers: { presence: timers.presence },\n },\n };\n })\n .self(async (data, { context, doc, platform, room, session }) => {\n const oldState = await platform.persistence.getStorageState(room);\n /**\n * !HACK\n * @description This is the frontend's initialStorage. We only want to\n * apply this if the server's storage is empty (i.e. no initial storage\n * has been applied)\n */\n const update = (data as any)?.update as Maybe<string>;\n\n if (!oldState) {\n const loadedState = await this._getInitialStorage({ context, room });\n\n if (!!loadedState && !this._docFactory.isEmpty(loadedState)) {\n doc.applyEncodedState({ update: loadedState });\n }\n }\n\n /**\n * @description Storage was already initialized. Don't overwrite the current\n * storage state with the incoming initial storage. Return what the current state\n * is without changes.\n * @date May 7, 2025\n */\n if (!doc.isEmpty()) {\n const encodedState = doc.getEncodedState();\n\n return {\n $storageReceived: { changeKind: \"unchanged\", state: encodedState },\n };\n }\n\n /**\n * @description Storage was never initialized, and there is an incoming\n * initialStorage from the client. Apply the initialStorage and persist the state\n * as an update.\n * @date May 7, 2025\n */\n if (!!update) {\n const encodedState = doc.applyEncodedState({ update }).getEncodedState();\n const storageSize = new TextEncoder().encode(encodedState).length;\n\n if (\n !!this._config.limits.storageMaxSize &&\n storageSize > this._config.limits.storageMaxSize\n ) {\n throw new Error(\"Storage has exceeded the size limit\");\n }\n\n await platform.persistence\n .setStorageState(room, encodedState)\n .catch((error) => {\n this._logDebug(error);\n });\n\n listeners.onStorageUpdated({\n context,\n encodedState,\n platform,\n room,\n user: session?.user,\n webSocket: session?.webSocket.webSocket,\n });\n\n return {\n $storageReceived: { changeKind: \"initialized\", state: encodedState },\n };\n }\n\n const encodedState = doc.getEncodedState();\n\n return { $storageReceived: { changeKind: \"empty\", state: encodedState } };\n }),\n $ping: this._procedure.self((data, { platform, session }) => {\n if (!session) return {};\n\n const currentTime = new Date().getTime();\n const prevState = session.webSocket.state;\n\n platform.setSerializedState(session.webSocket, {\n ...prevState,\n timers: {\n ...prevState.timers,\n ping: currentTime,\n },\n });\n\n return { $pong: {} };\n }),\n $updatePresence: this._procedure.broadcast((data, context) => {\n const presence = (data as any)?.presence;\n const { session } = context;\n\n if (!session) return {};\n\n const cleanedPatch = pickBy(\n presence ?? {},\n (value) => typeof value !== \"undefined\",\n );\n const updated = Object.assign(Object.create(null), session.presence, cleanedPatch);\n const bytes = new TextEncoder().encode(JSON.stringify(updated)).length;\n\n if (\n !!this._config.limits.presenceMaxSize &&\n bytes > this._config.limits.presenceMaxSize\n ) {\n throw new Error(oneLine`\n Large presence. Presence must be at most\n ${this._config.limits.presenceMaxSize.toLocaleString()} bytes.\n Current size: ${bytes.toLocaleString()} bytes\n `);\n }\n\n context.presence = updated;\n\n return {\n $presenceUpdated: {\n presence: updated,\n timers: { presence: session.timers.presence },\n },\n };\n }),\n $updateStorage: this._procedure.broadcast((data, { context, doc, platform, room }) => {\n const origin = (data as any)?.origin as Maybe<string>;\n const update: string | null = (data as any)?.update ?? null;\n\n if (origin === \"$initialized\" && Object.keys(doc.toJson()).length) return {};\n\n const updated = update === null ? doc : doc.applyEncodedState({ update });\n const encodedState = updated.getEncodedState();\n const storageSize = new TextEncoder().encode(encodedState).length;\n\n if (\n !!this._config.limits.storageMaxSize &&\n storageSize > this._config.limits.storageMaxSize\n ) {\n throw new Error(oneLine`\n Large Storage. Storage must be at most\n ${this._config.limits.storageMaxSize.toLocaleString()} bytes.\n Current size: ${storageSize.toLocaleString()} bytes\n `);\n }\n\n platform.persistence.setStorageState(room, encodedState).then(() => {\n listeners.onStorageUpdated({\n context,\n encodedState,\n platform,\n room,\n });\n });\n\n return { $storageUpdated: { state: encodedState } };\n }),\n });\n }\n\n private get _procedure(): PluvProcedure<TPlatform, TAuthorize, TContext, {}, {}> {\n return new PluvProcedure();\n }\n\n private get _router(): PluvRouter<TPlatform, TAuthorize, TContext, TEvents> {\n return (\n this._config.router\n ? PluvRouter.merge(this._baseRouter, this._config.router)\n : this._baseRouter\n ) as PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n }\n\n constructor(options: PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>) {\n this._config = {\n crdt: noop,\n debug: false,\n router: new PluvRouter<TPlatform, TAuthorize, TContext, TEvents>({} as TEvents),\n ...options,\n } as NonNilProps<PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>>;\n\n const {\n onRoomDestroyed,\n onRoomMessage,\n onStorageDestroyed,\n onStorageUpdated,\n onUserConnected,\n onUserDisconnected,\n } = options as Partial<BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>>;\n\n this._docFactory = this._config.crdt.doc(() => ({}));\n (this as any)._listeners = {\n onRoomDestroyed: (event) => onRoomDestroyed?.(event),\n onRoomMessage: (event) => onRoomMessage?.(event),\n onStorageDestroyed: (event) => onStorageDestroyed?.(event),\n onStorageUpdated: (event) => onStorageUpdated?.(event),\n onUserConnected: (event) => onUserConnected?.(event),\n onUserDisconnected: (event) => onUserDisconnected?.(event),\n } as BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>;\n }\n\n public createRoom(\n room: string,\n ...options: CreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents>\n ): IORoom<TPlatform, TAuthorize, TContext, TCrdt, TEvents> {\n const { _meta, debug, ...platformRoomContext } = (options[0] ?? {}) as CreateRoomOptions<\n TPlatform,\n TAuthorize,\n TContext,\n TEvents\n >[0] & {\n _meta?: any;\n };\n\n const platform = this._config.platform();\n\n platform.validateConfig(this._config);\n\n if (platform._config.handleMode !== \"io\") {\n throw new Error(`\\`createRoom\\` is unsupported for \\`${platform._name}\\``);\n }\n\n if (!/^[a-z0-9](?:[a-z0-9-_]*[a-z0-9])?$/i.test(room))\n throw new Error(\"Unsupported room name\");\n\n const roomContext = platformRoomContext as InferRoomContextType<TPlatform>;\n const listeners = this._getListeners();\n const logDebug = this._logDebug.bind(this);\n\n const newRoom = new IORoom<TPlatform, TAuthorize, TContext, TCrdt, TEvents>(room, {\n ...(!!_meta ? { _meta } : {}),\n authorize: this._config.authorize ?? undefined,\n context: this._config.context,\n crdt: this._config.crdt,\n debug: debug ?? this._config.debug,\n getInitialStorage: this._getInitialStorage,\n async onRoomDestroyed(event) {\n logDebug(`${colors.blue(\"Deleting empty room:\")} ${room}`);\n\n // Always fire server-level onRoomDestroyed\n await Promise.resolve(listeners.onRoomDestroyed(event));\n\n logDebug(`${colors.blue(\"Deleted room:\")} ${room}`);\n },\n async onStorageDestroyed(event) {\n logDebug(`${colors.blue(\"Destroying storage for room:\")} ${room}`);\n\n // Always fire server-level onStorageDestroyed\n await Promise.resolve(listeners.onStorageDestroyed(event));\n\n await event.platform.persistence.deleteStorageState(room);\n\n logDebug(`${colors.blue(\"Destroyed storage for room:\")} ${room}`);\n },\n async onMessage(event) {\n await Promise.resolve(listeners.onRoomMessage(event));\n },\n async onUserConnected(event) {\n await Promise.resolve(listeners.onUserConnected(event));\n },\n async onUserDisconnected(event) {\n await Promise.resolve(listeners.onUserDisconnected(event));\n },\n platform,\n roomContext,\n router: this._router,\n });\n\n this._logDebug(`${colors.blue(\"Created room:\")} ${room}`);\n\n return newRoom;\n }\n\n public async createToken(\n params: JWTEncodeParams<InferIOAuthorizeUser<InferIOAuthorize<this>>, TPlatform>,\n ): Promise<string> {\n return await this._config.io.createToken(params);\n }\n\n private _getInitialStorage: GetInitialStorageFn<TContext> = (...args) => {\n const getInitialStorage =\n typeof this._config.getInitialStorage !== \"string\"\n ? (this._config.getInitialStorage ??\n ((() => null) as GetInitialStorageFn<TContext>))\n : ((() => null) as GetInitialStorageFn<TContext>);\n\n return getInitialStorage(...args);\n };\n\n private _getListeners(): BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents> {\n return (this as any)._listeners;\n }\n\n private _logDebug(...data: any[]): void {\n if (this._config.debug) console.log(...data);\n }\n}\n","import type { AbstractCrdtDocFactory, CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type { BaseUser, HasRequiredProperty, IOAuthorize, InferIOAuthorizeUser } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { WebSocketRegisterConfig } from \"./IORoom\";\nimport { PluvProcedure } from \"./PluvProcedure\";\nimport type { MergedRouter, PluvRouterEventConfig } from \"./PluvRouter\";\nimport { PluvRouter } from \"./PluvRouter\";\nimport { PluvServer, PluvServerConfig } from \"./PluvServer\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { authorize } from \"./authorize\";\nimport {\n MAX_PRESENCE_SIZE_BYTES,\n MAX_STORAGE_SIZE_BYTES,\n MAX_USER_ID_LENGTH,\n MAX_USER_SIZE_BYTES,\n} from \"./constants\";\nimport type {\n GetInitialStorageFn,\n PluvContext,\n PluvIOAuthorize,\n PluvIOLimits,\n PluvIOListeners,\n PluvIORouter,\n ResolvedPluvIOAuthorize,\n} from \"./types\";\nimport { oneLine } from \"./utils\";\nimport { __PLUV_VERSION } from \"./version\";\n\nexport type PluvIOConfig<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n> = {\n authorize?: TAuthorize;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: TCrdt;\n debug?: boolean;\n limits?: PluvIOLimits;\n platform: () => TPlatform;\n};\n\ntype ResolvedServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<PluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>> &\n PluvIORouter<TPlatform, TAuthorize, TContext, TEvents> &\n (TCrdt extends CrdtLibraryType<NoopCrdtDocFactory>\n ? { getInitialStorage?: \"[ERROR]: Must specify crdt to use getInitialStorage\" }\n : { getInitialStorage: GetInitialStorageFn<TContext> });\n\nexport type BaseServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = {\n [P in keyof ResolvedServerConfig<\n TPlatform,\n TAuthorize,\n TContext,\n TCrdt,\n TEvents\n > as ResolvedServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>[P] extends undefined\n ? never\n : P]: ResolvedServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>[P];\n};\n\nexport type ServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> =\n HasRequiredProperty<\n BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n > extends true\n ? [BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>]\n : [BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>?];\n\nexport class PluvIO<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n> {\n public readonly version: string = __PLUV_VERSION as any;\n\n private readonly _authorize: TAuthorize = null as TAuthorize;\n private readonly _context: PluvContext<TPlatform, TContext> = {} as PluvContext<\n TPlatform,\n TContext\n >;\n private readonly _crdt: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n private readonly _debug: boolean;\n private readonly _limits: PluvIOLimits;\n private readonly _platform: () => TPlatform;\n\n public get procedure(): PluvProcedure<TPlatform, TAuthorize, TContext, {}, {}> {\n return new PluvProcedure();\n }\n\n constructor(options: PluvIOConfig<TPlatform, TAuthorize, TContext, TCrdt>) {\n const { authorize, context, crdt = noop, debug = false, limits, platform } = options;\n\n this._crdt = crdt as CrdtLibraryType<any>;\n this._debug = debug;\n this._limits = {\n presenceMaxSize: MAX_PRESENCE_SIZE_BYTES,\n storageMaxSize: MAX_STORAGE_SIZE_BYTES,\n userIdMaxLength: MAX_USER_ID_LENGTH,\n userMaxSize: MAX_USER_SIZE_BYTES,\n ...limits,\n };\n this._platform = platform;\n\n if (authorize) this._authorize = authorize;\n if (context) this._context = context;\n }\n\n public async createToken(\n params: JWTEncodeParams<InferIOAuthorizeUser<TAuthorize>, TPlatform>,\n ): Promise<string> {\n if (!this._authorize) {\n throw new Error(\"IO does not specify authorize during initialization.\");\n }\n\n const ioAuthorize = this._getIOAuthorize(params);\n const user = params.user as BaseUser;\n const parsed = !!ioAuthorize ? ioAuthorize.user.parse(user) : user;\n\n if (!!this._limits.userIdMaxLength && user.id.length > this._limits.userIdMaxLength) {\n throw new Error(oneLine`\n createToken was called with a long user id. User ID must be at\n most 128 characters. Current length: ${user.id.length.toLocaleString()}\n `);\n }\n\n const bytes = new TextEncoder().encode(JSON.stringify(parsed)).length;\n\n if (!!this._limits.userMaxSize && bytes > this._limits.userMaxSize) {\n throw new Error(oneLine`\n createToken called with large payload. User must be at most 512\n bytes. Current size: ${bytes.toLocaleString()}\n `);\n }\n\n const platform = this._platform();\n\n /**\n * !HACK\n * @description Allow the platform to overwrite this behavior as needed. This is introduced\n * to support platformPluv\n * @date December 15, 2024\n */\n if (platform._createToken) {\n return await platform._createToken({ ...params, authorize: ioAuthorize });\n }\n\n const secret = ioAuthorize?.secret ?? null;\n\n if (!secret) throw new Error(\"`authorize` was specified without a valid secret\");\n\n return await authorize({ platform, secret }).encode(\n params as JWTEncodeParams<any, TPlatform>,\n );\n }\n\n public mergeRouters<TRouters extends PluvRouter<TPlatform, TAuthorize, TContext, any>[]>(\n ...routers: TRouters\n ): MergedRouter<TRouters> {\n return PluvRouter.merge(...routers);\n }\n\n public router<TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>>(\n events: TEvents,\n ): PluvRouter<TPlatform, TAuthorize, TContext, TEvents> {\n const invalidName = Object.keys(events).find((name) => name.includes(\"$\"));\n\n if (typeof invalidName === \"string\") {\n throw new Error(oneLine`\n Invalid event name. Event names must not contain $: \"${invalidName}\"\n `);\n }\n\n return new PluvRouter<TPlatform, TAuthorize, TContext, TEvents>(events);\n }\n\n public server<TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {}>(\n ...config: ServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n ): PluvServer<TPlatform, TAuthorize, TContext, TCrdt, TEvents> {\n const serverConfig = (config[0] ?? {}) as PluvServerConfig<\n TPlatform,\n TAuthorize,\n TContext,\n TCrdt,\n TEvents\n >;\n\n return new PluvServer<TPlatform, TAuthorize, TContext, TCrdt, TEvents>({\n ...serverConfig,\n authorize: this._authorize ?? undefined,\n context: this._context,\n crdt: this._crdt,\n debug: this._debug,\n io: this as PluvIO<TPlatform, TAuthorize, TContext, TCrdt>,\n limits: this._limits,\n platform: this._platform,\n });\n }\n\n private _getIOAuthorize(\n options: WebSocketRegisterConfig<TPlatform>,\n ): ResolvedPluvIOAuthorize<any, any> | null {\n if (typeof this._authorize === \"function\") {\n return this._authorize(options);\n }\n\n return this._authorize as ResolvedPluvIOAuthorize<any, any> | null;\n }\n}\n","import type { CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport type { BaseUser } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { PluvIOConfig } from \"./PluvIO\";\nimport { PluvIO } from \"./PluvIO\";\nimport type { PluvContext, PluvIOAuthorize, PluvIOLimits } from \"./types\";\n\nexport type CreateIOParams<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n> = {\n authorize?: PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: TCrdt;\n debug?: boolean;\n limits?: PluvIOLimits;\n platform: () => TPlatform;\n};\n\nexport const createIO = <\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n>(\n params: CreateIOParams<TPlatform, TContext, TUser, TCrdt>,\n): PluvIO<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n> => {\n const { authorize, context, crdt, debug, limits, platform } = params;\n\n return new PluvIO<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n >({\n authorize,\n context,\n crdt,\n debug,\n limits,\n platform,\n } as PluvIOConfig<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n >);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["__PLUV_VERSION","__PLUV_VERSION"],"sources":["../src/AbstractPersistence.ts","../src/Persistence.ts","../src/AbstractPubSub.ts","../src/PubSub.ts","../src/AbstractPlatform.ts","../src/AbstractWebSocket.ts","../src/authorize.ts","../src/PluvProcedure.ts","../src/PluvRouter.ts","../src/constants.ts","../src/utils/oneLine.ts","../src/utils/pickBy.ts","../src/IORoom.ts","../src/version.generated.ts","../src/PluvServer.ts","../src/PluvIO.ts","../src/createIO.ts"],"sourcesContent":["import type { JsonObject } from \"@pluv/types\";\n\nexport abstract class AbstractPersistence {\n public abstract addUser(\n room: string,\n connectionId: string,\n user: JsonObject | null,\n ): Promise<void>;\n\n public abstract deleteStorageState(room: string): Promise<void>;\n\n public abstract deleteUser(room: string, connectionId: string): Promise<void>;\n\n public abstract deleteUsers(room: string): Promise<void>;\n\n public abstract getStorageState(room: string): Promise<string | null>;\n\n public abstract getUser(room: string, connectionId: string): Promise<JsonObject | null>;\n\n public abstract getUsers(\n room: string,\n ): Promise<Map<[connectionId: string][0], JsonObject | null>>;\n\n public abstract getUsersSize(room: string): Promise<number>;\n\n public abstract initialize(roomContext: any): typeof this;\n\n public abstract setStorageState(room: string, state: string): Promise<void>;\n}\n","import type { JsonObject } from \"@pluv/types\";\nimport { AbstractPersistence } from \"./AbstractPersistence\";\n\nexport class Persistence extends AbstractPersistence {\n private _storages = new Map<string, string>();\n private _users = new Map<string, Map<string, JsonObject | null>>();\n\n public addUser(room: string, connectionId: string, user: JsonObject | null): Promise<void> {\n const users = this._users.get(room) ?? new Map<string, JsonObject | null>();\n\n this._users.set(room, users);\n users.set(connectionId, user);\n\n return Promise.resolve();\n }\n\n public deleteStorageState(room: string): Promise<void> {\n this._storages.delete(room);\n\n return Promise.resolve();\n }\n\n public async deleteUser(room: string, connectionId: string): Promise<void> {\n const users = this._users.get(room);\n\n if (!users) return;\n\n users.delete(connectionId);\n\n if (!users.size) {\n await this.deleteUsers(room);\n await this.deleteStorageState(room);\n }\n\n return Promise.resolve();\n }\n\n public deleteUsers(room: string): Promise<void> {\n this._users.delete(room);\n\n return Promise.resolve();\n }\n\n public getSize(room: string): Promise<number> {\n return Promise.resolve(this._users.get(room)?.size ?? 0);\n }\n\n public getStorageState(room: string): Promise<string | null> {\n const storage = this._storages.get(room) ?? null;\n\n return Promise.resolve(storage);\n }\n\n public getUser(room: string, connectionId: string): Promise<JsonObject | null> {\n const user = this._users.get(room)?.get(connectionId);\n\n return Promise.resolve(user ?? null);\n }\n\n public async getUsers(room: string): Promise<Map<string, JsonObject | null>> {\n const users = this._users.get(room);\n\n if (!users) return new Map();\n\n return users;\n }\n\n public async getUsersSize(room: string): Promise<number> {\n return this._users.size;\n }\n\n public initialize(roomContext: any): this {\n return this;\n }\n\n public setStorageState(room: string, state: string): Promise<void> {\n this._storages.set(room, state);\n\n return Promise.resolve();\n }\n}\n","import type { IOEventMessage, IOLike, InferIOOutput } from \"@pluv/types\";\nimport type { SendMessageOptions } from \"./types\";\n\nexport type IOPubSubEventMessage<\n TIO extends IOLike,\n TEvent extends keyof InferIOOutput<TIO> = keyof InferIOOutput<TIO>,\n> = IOEventMessage<TIO, TEvent> & {\n options?: SendMessageOptions;\n};\n\nexport abstract class AbstractPubSub {\n public abstract publish(roomName: string, payload: IOPubSubEventMessage<any>): Promise<void>;\n\n public abstract subscribe(\n roomName: string,\n onMessage: (message: IOPubSubEventMessage<any>) => void,\n ): Promise<number>;\n\n public abstract unsubscribe(subscriptionId: number): void;\n}\n","import type { Subject } from \"wonka\";\nimport { makeSubject, subscribe } from \"wonka\";\nimport type { IOPubSubEventMessage } from \"./AbstractPubSub\";\nimport { AbstractPubSub } from \"./AbstractPubSub\";\n\nexport class PubSub extends AbstractPubSub {\n private _currentSubscriptionId: number = 0;\n // Map of roomName to subjects\n private _subjects = new Map<string, Subject<IOPubSubEventMessage<any>>>();\n // Map of roomName to subscription ids\n private _subscriptionsRefs = new Map<string, readonly number[]>();\n // Map of\n private _unsubscriptions = new Map<number, [roomName: string, unsubscribe: () => void]>();\n\n public async publish(roomName: string, payload: IOPubSubEventMessage<any>): Promise<void> {\n const subject = this._subjects.get(roomName);\n\n if (!subject) return;\n\n Promise.resolve(subject.next(payload));\n }\n\n public subscribe(\n roomName: string,\n onMessage: (message: IOPubSubEventMessage<any>) => void,\n ): Promise<number> {\n const id = this._currentSubscriptionId++;\n const refs = this._subscriptionsRefs.get(roomName) ?? [];\n\n const subject = makeSubject<IOPubSubEventMessage<any>>();\n\n this._subjects.set(roomName, subject);\n this._subscriptionsRefs.set(roomName, [...refs, id]);\n\n const unsubscribe = subscribe(onMessage)(subject.source).unsubscribe;\n\n this._unsubscriptions.set(id, [roomName, unsubscribe]);\n\n return Promise.resolve(id);\n }\n\n public unsubscribe(subscriptionId: number): void {\n const [roomName, unsubscribe] = this._unsubscriptions.get(subscriptionId) ?? [];\n\n if (!roomName || !unsubscribe) return;\n\n const refs = this._subscriptionsRefs.get(roomName);\n\n if (!refs) return;\n\n if (refs.length === 1) {\n this._subjects.delete(roomName);\n this._subscriptionsRefs.delete(roomName);\n this._unsubscriptions.delete(subscriptionId);\n\n return;\n }\n\n const index = refs.indexOf(subscriptionId);\n\n this._subscriptionsRefs.set(\n roomName,\n index === -1 ? refs : [...refs.slice(0, index), ...refs.slice(index + 1)],\n );\n\n unsubscribe();\n\n this._unsubscriptions.delete(subscriptionId);\n }\n}\n","import type { Maybe } from \"@pluv/types\";\nimport type { AbstractPersistence } from \"./AbstractPersistence\";\nimport type { AbstractPubSub } from \"./AbstractPubSub\";\nimport type { AbstractWebSocket, InferWebSocketSource } from \"./AbstractWebSocket\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { Persistence } from \"./Persistence\";\nimport { PubSub } from \"./PubSub\";\nimport type { PlatformConfig, ResolvedPluvIOAuthorize, WebSocketSerializedState } from \"./types\";\n\nexport type InferPlatformWebSocketType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<infer IAbstractWebSocket> ? IAbstractWebSocket : never;\n\nexport type InferPlatformWebSocketSource<TPlatform> =\n TPlatform extends AbstractPlatform<infer IAbstractWebSocket>\n ? InferWebSocketSource<IAbstractWebSocket>\n : never;\n\nexport type InferInitContextType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<any, infer IInitContext> ? IInitContext : never;\n\nexport type InferRoomContextType<TPlatform extends AbstractPlatform> =\n TPlatform extends AbstractPlatform<any, any, infer IRoomContext> ? IRoomContext : never;\n\nexport type AbstractPlatformConfig<TRoomContext extends Record<string, any> = {}> = {\n persistence?: AbstractPersistence;\n pubSub?: AbstractPubSub;\n roomContext?: TRoomContext;\n};\n\nexport interface ConvertWebSocketConfig {\n room: string;\n}\n\nexport abstract class AbstractPlatform<\n TWebSocket extends AbstractWebSocket<any, any> = AbstractWebSocket<any, any>,\n TInitContext extends Record<string, any> = {},\n TRoomContext extends Record<string, any> = {},\n TConfig extends PlatformConfig = PlatformConfig,\n> {\n protected readonly _initContext: TInitContext | undefined;\n protected readonly _roomContext: TRoomContext | undefined;\n\n private _initialized: boolean = false;\n\n public persistence: AbstractPersistence;\n public pubSub: AbstractPubSub;\n\n public abstract readonly id: string;\n public readonly _createToken?: (\n params: JWTEncodeParams<any, any> & {\n authorize: Maybe<ResolvedPluvIOAuthorize<any, any>>;\n },\n ) => Promise<string>;\n public _fetch?: (...args: any[]) => Promise<any>;\n public abstract readonly _config: TConfig;\n public abstract readonly _name: string;\n\n constructor(config: AbstractPlatformConfig<TRoomContext> = {}) {\n const { roomContext, persistence, pubSub } = config;\n\n (this as any)._meta = (config as any)._meta;\n if (!!roomContext) this._roomContext = roomContext;\n\n this.persistence = persistence ?? new Persistence();\n this.pubSub = pubSub ?? new PubSub();\n }\n\n public abstract acceptWebSocket(webSocket: AbstractWebSocket): Promise<void>;\n\n public abstract convertWebSocket(\n webSocket: InferWebSocketSource<TWebSocket>,\n config: ConvertWebSocketConfig,\n ): AbstractWebSocket<any, any>;\n\n public abstract getLastPing(webSocket: AbstractWebSocket<any, any>): number | null;\n\n public abstract getSerializedState(\n webSocket: InferWebSocketSource<TWebSocket>,\n ): WebSocketSerializedState | null;\n\n public abstract getSessionId(webSocket: InferWebSocketSource<TWebSocket>): string | null;\n\n public abstract getWebSockets(): readonly InferWebSocketSource<TWebSocket>[];\n\n public abstract initialize(config: AbstractPlatformConfig<TRoomContext>): this;\n\n public abstract parseData(data: string | ArrayBuffer): Record<string, any>;\n\n public abstract randomUUID(): string;\n\n public abstract setSerializedState(\n webSocket: AbstractWebSocket,\n state: WebSocketSerializedState,\n ): WebSocketSerializedState;\n\n public validateConfig(config: any): void {}\n\n protected _initialize(): typeof this {\n if (this._initialized) throw new Error(\"Platform is already initialized\");\n\n this._initialized = true;\n\n return this;\n }\n}\n","import type {\n BaseUser,\n InferIOAuthorizeUser,\n IOAuthorize,\n IOEventMessage,\n JsonObject,\n MaybePromise,\n} from \"@pluv/types\";\nimport type { AbstractPersistence } from \"./AbstractPersistence\";\nimport type { AbstractPlatform } from \"./AbstractPlatform\";\nimport type { WebSocketSerializedState, WebSocketSession } from \"./types\";\n\nexport type AbstractEvent = {};\n\nexport type AbstractCloseEvent = AbstractEvent & {\n readonly code: number;\n readonly reason: string;\n};\n\nexport type AbstractMessageEvent<T = any> = AbstractEvent & {\n readonly data: T;\n};\n\nexport type AbstractErrorEvent = AbstractEvent & {\n error: unknown;\n message?: string;\n};\n\nexport interface AbstractEventMap {\n close: AbstractCloseEvent;\n message: AbstractMessageEvent;\n error: AbstractErrorEvent;\n}\n\nexport type EventType = keyof AbstractEventMap;\n\nexport interface AbstractWebSocketHandleErrorParams {\n error: unknown;\n message?: string;\n room: string;\n session?: WebSocketSession<any>;\n}\n\nexport type AbstractListener<TType extends keyof AbstractEventMap> = (\n event: AbstractEventMap[TType],\n) => MaybePromise<void>;\n\nexport type InferWebSocketSource<TAbstractWebSocket extends AbstractWebSocket> =\n TAbstractWebSocket extends AbstractWebSocket<infer IWebSocket> ? IWebSocket : never;\n\nexport interface AbstractWebSocketConfig {\n persistence: AbstractPersistence;\n platform: AbstractPlatform<any>;\n room: string;\n}\n\nexport abstract class AbstractWebSocket<\n TWebSocket = any,\n TAuthorize extends IOAuthorize<any, any> | null = null,\n> {\n /** The connection is not yet open. */\n public readonly CONNECTING = 0;\n /** The connection is open and ready to communicate. */\n public readonly OPEN = 1;\n /** The connection is in the process of closing. */\n public readonly CLOSING = 2;\n /** The connection is closed. */\n public readonly CLOSED = 3;\n\n public readonly persistence: AbstractPersistence;\n public readonly room: string;\n public readonly webSocket: TWebSocket;\n\n protected readonly _platform: AbstractPlatform<this>;\n\n public abstract set presence(presence: JsonObject | null);\n public abstract get readyState(): 0 | 1 | 2 | 3;\n public abstract get session(): WebSocketSession<TAuthorize>;\n public abstract get sessionId(): string;\n public abstract get state(): WebSocketSerializedState;\n public abstract set state(state: WebSocketSerializedState);\n public abstract set user(user: InferIOAuthorizeUser<TAuthorize>);\n\n constructor(webSocket: TWebSocket, config: AbstractWebSocketConfig) {\n const { persistence, platform, room } = config;\n\n this.persistence = persistence;\n this._platform = platform;\n this.room = room;\n this.webSocket = webSocket;\n }\n\n /**\n * TODO\n * @description Return an unsubscribe method to remove the event-listener.\n * This is preferred over adding an explicit abstract removeEventListener\n * method, because the implementing class might have to transform the\n * listener, and removing the same listener might be complicated as a\n * result.\n * @date August 28, 2022\n */\n public abstract addEventListener<TType extends EventType>(\n type: TType,\n handler: AbstractListener<TType>,\n ): void;\n\n public abstract close(code?: number | undefined, reason?: string | undefined): void;\n\n public abstract send(message: ArrayBuffer | ArrayBufferView | string): void;\n\n public abstract terminate(): void;\n\n public handleError(params: AbstractWebSocketHandleErrorParams): void {\n const { error, message: _message, room, session } = params;\n\n const message = error instanceof Error ? error.message : \"Unexpected error\";\n const stack: string | null = error instanceof Error ? (error.stack ?? null) : null;\n const connectionId = (session?.id ?? null) as string;\n\n return this.sendMessage({\n connectionId,\n data: { message, stack },\n room,\n type: \"$error\" as const,\n user: session?.user ?? null,\n });\n }\n\n public sendMessage<TMessage extends IOEventMessage<any> = IOEventMessage<any>>(\n data: TMessage,\n ): void {\n return this.send(JSON.stringify(data));\n }\n}\n","import hkdf from \"@panva/hkdf\";\nimport type { BaseUser } from \"@pluv/types\";\nimport { EncryptJWT, jwtDecrypt } from \"jose\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\n\nconst DEFAULT_MAX_AGE_MS = 60_000;\n\nexport const getEncryptionKey = async (secret: string): Promise<Uint8Array> => {\n return await hkdf(\"sha256\", secret, \"\", \"Pluv.io Generated Encryption Key\", 32);\n};\n\nexport interface JWT<TUser extends BaseUser> {\n room: string;\n sub: string;\n user: TUser;\n}\n\nexport type JWTEncodeParams<\n TUser extends BaseUser | null,\n TPlatform extends AbstractPlatform<any, any>,\n> = {\n maxAge?: number;\n room: string;\n user: TUser extends BaseUser ? TUser : \"Error: Cannot create token without authorization!\";\n} & InferInitContextType<TPlatform>;\n\nexport interface AuthorizeParams {\n platform: AbstractPlatform<any, any>;\n secret: string;\n}\n\nexport interface AuthorizeModule {\n decode: <TUser extends BaseUser>(jwt: string) => Promise<TUser | null>;\n encode: <TUser extends BaseUser, TPlatform extends AbstractPlatform<any, any>>(\n params: JWTEncodeParams<TUser, TPlatform>,\n ) => Promise<string>;\n}\n\nconst now = () => (Date.now() / 1_000) | 0;\n\nexport const authorize = (params: AuthorizeParams) => {\n const { platform, secret } = params;\n\n const encode = async <TUser extends BaseUser, TPlatform extends AbstractPlatform<any, any>>(\n encodeParams: JWTEncodeParams<TUser, TPlatform>,\n ): Promise<string> => {\n const { maxAge = DEFAULT_MAX_AGE_MS, room, user } = encodeParams;\n\n const encryptionSecret = await getEncryptionKey(secret);\n\n const token = await new EncryptJWT({\n room,\n sub: room ? `${room}|${user.id}` : user.id,\n user,\n })\n .setProtectedHeader({ alg: \"dir\", enc: \"A256GCM\" })\n .setIssuedAt()\n .setExpirationTime(now() + maxAge)\n .setJti(platform.randomUUID())\n .encrypt(encryptionSecret);\n\n return token.toString();\n };\n\n const decode = async <TUser extends BaseUser>(jwt: string): Promise<JWT<TUser> | null> => {\n const encryptionSecret = await getEncryptionKey(secret);\n\n const { payload } = await jwtDecrypt(jwt, encryptionSecret, {\n clockTolerance: 15,\n });\n\n return (payload as any) ?? null;\n };\n\n return { decode, encode };\n};\n","import type {\n EventRecord,\n IOAuthorize,\n InputZodLike,\n JsonObject,\n ProcedureLike,\n} from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { EventResolver, EventResolverKind, MergeEventRecords } from \"./types\";\n\nexport interface PluvProcedureConfig<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TInput extends JsonObject = {},\n TOutput extends EventRecord<string, any> = {},\n> {\n broadcast?: EventResolver<\n \"broadcast\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null;\n input?: InputZodLike<TInput>;\n self?: EventResolver<\"self\", TPlatform, TAuthorize, TContext, TInput, Partial<TOutput>> | null;\n sync?: EventResolver<\"sync\", TPlatform, TAuthorize, TContext, TInput, Partial<TOutput>> | null;\n}\n\nexport class PluvProcedure<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TInput extends JsonObject = {},\n TOutput extends EventRecord<string, any> = {},\n TFilled extends \"input\" | \"broadcast\" | \"self\" | \"sync\" | \"\" = \"\",\n> {\n private _broadcast: EventResolver<\n \"broadcast\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n private _input: InputZodLike<TInput> | null = null;\n private _self: EventResolver<\n \"self\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n private _sync: EventResolver<\n \"sync\",\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n Partial<TOutput>\n > | null = null;\n\n public get config(): ProcedureLike<TInput, TOutput>[\"config\"] {\n return {\n broadcast: this._broadcast?.bind(this) ?? null,\n input: this._input ?? null,\n resolver: this._resolver(),\n self: this._self?.bind(this) ?? null,\n sync: this._sync?.bind(this) ?? null,\n } as ProcedureLike<TInput, TOutput>[\"config\"];\n }\n\n constructor(\n config: PluvProcedureConfig<TPlatform, TAuthorize, TContext, TInput, TOutput> = {},\n ) {\n const { broadcast, input, self, sync } = config;\n\n this._broadcast = broadcast ?? null;\n this._input = input ?? null;\n this._self = self ?? null;\n this._sync = sync ?? null;\n }\n\n public broadcast<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"broadcast\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"broadcast\"\n >,\n TFilled | \"input\" | \"broadcast\"\n > {\n const { broadcast } = this.config;\n\n if (!!broadcast) throw new Error(\"Broadcast was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"broadcast\"\n >({\n ...(this.config as any),\n broadcast: resolver as any,\n });\n }\n\n public input<TData extends JsonObject>(\n input: InputZodLike<TData>,\n ): Omit<\n PluvProcedure<TPlatform, TAuthorize, TContext, TData, {}, TFilled | \"input\">,\n TFilled | \"input\"\n > {\n return new PluvProcedure<TPlatform, TAuthorize, TContext, TData, {}, TFilled | \"input\">({\n input,\n });\n }\n\n public self<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"self\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"self\"\n >,\n TFilled | \"input\" | \"self\"\n > {\n const { self } = this.config;\n\n if (!!self) throw new Error(\"Self was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"self\"\n >({\n ...(this.config as any),\n self: resolver as any,\n });\n }\n\n public sync<TResult extends EventRecord<string, any> = {}>(\n resolver: EventResolver<\"sync\", TPlatform, TAuthorize, TContext, TInput, TResult>,\n ): Omit<\n PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"sync\"\n >,\n TFilled | \"input\" | \"sync\"\n > {\n const { sync } = this.config;\n\n if (!!sync) throw new Error(\"Sync was already defined for this procedure\");\n\n return new PluvProcedure<\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n MergeEventRecords<[TOutput, TResult]>,\n TFilled | \"input\" | \"sync\"\n >({\n ...(this.config as any),\n sync: resolver as any,\n });\n }\n\n private _resolver(): EventResolver<\n EventResolverKind,\n TPlatform,\n TAuthorize,\n TContext,\n TInput,\n TOutput\n > {\n return (data, context) => {\n return {\n ...this._broadcast?.(data, context),\n ...this._self?.(data, context),\n ...this._sync?.(data, context),\n } as TOutput;\n };\n }\n}\n","import type { IORouterLike } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { PluvProcedure } from \"./PluvProcedure\";\nimport type { PluvIOAuthorize } from \"./types\";\n\nexport type PluvRouterEventConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n> = { [P: string]: Pick<PluvProcedure<TPlatform, TAuthorize, TContext, any, any>, \"config\"> };\n\nexport type MergedRouter<\n TRouters extends PluvRouter<TPlatform, TAuthorize, TContext, any>[] = [],\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> = any,\n TContext extends Record<string, any> = {},\n TRoot extends TRouters[0][\"_defs\"][\"events\"] = {},\n> = TRouters extends [\n infer IHead extends PluvRouter<TPlatform, TAuthorize, TContext, any>,\n ...infer ITail extends PluvRouter<TPlatform, TAuthorize, TContext, any>[],\n]\n ? MergedRouter<ITail, TPlatform, TAuthorize, TContext, TRoot & IHead[\"_defs\"][\"events\"]>\n : PluvRouter<TPlatform, TAuthorize, TContext, TRoot>;\n\nexport class PluvRouter<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IORouterLike<TEvents> {\n readonly _defs: { events: TEvents } = { events: {} as TEvents };\n\n constructor(events: TEvents) {\n const invalidName = Object.keys(events).find((name) => !this._isValidEventName(name));\n\n if (typeof invalidName === \"string\") {\n throw new Error(\n `Invalid event name. Event names must be formatted as valid JavaScript variable names: \"${invalidName}\"`,\n );\n }\n\n this._defs = { events };\n }\n\n public static merge<TRouters extends PluvRouter<any, any, any, any>[]>(\n ...routers: TRouters\n ): MergedRouter<TRouters> {\n const events = Object.assign(\n Object.create(null),\n ...routers.map((router) => router._defs.events),\n );\n\n return new PluvRouter<any, any, any, any>(events) as MergedRouter<TRouters>;\n }\n\n private _isValidEventName(name: string): boolean {\n return /^[a-z_$][a-z0-9_$]*$/gi.test(name);\n }\n}\n","export const GARBAGE_COLLECT_INTERVAL_MS = 60_000;\nexport const MAX_PRESENCE_SIZE_BYTES = 512;\nexport const MAX_STORAGE_SIZE_BYTES = 31_457_280;\nexport const MAX_USER_ID_LENGTH = 128;\nexport const MAX_USER_SIZE_BYTES = 512;\nexport const PING_TIMEOUT_MS = 30_000;\n","export const oneLine = (strings: TemplateStringsArray, ...values: unknown[]): string => {\n return strings\n .map((str) => str.replace(/\\s+/g, \" \"))\n .reduce((acc, str, i) => acc + str + (i < values.length ? values[i] : \"\"), \"\")\n .replace(/\\s+/g, \" \")\n .trim();\n};\n","export const pickBy = <T extends Record<string, any>>(\n obj: T,\n by: (value: T[keyof T]) => boolean,\n): Partial<T> => {\n const result: Partial<T> = {};\n const keys: (keyof T)[] = Object.keys(obj);\n\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n const value = obj[key];\n\n if (by(value)) result[key] = value;\n }\n\n return result;\n};\n","import type { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type {\n BaseIOEventRecord,\n BaseUser,\n CrdtDocLike,\n CrdtLibraryType,\n EventMessage,\n IOEventMessage,\n IOLike,\n Id,\n InferEventMessage,\n InferEventsOutput,\n InferIOAuthorize,\n InferIOAuthorizeUser,\n InferIOInput,\n JsonObject,\n Maybe,\n} from \"@pluv/types\";\nimport colors from \"kleur\";\nimport type {\n AbstractPlatform,\n InferInitContextType,\n InferPlatformWebSocketSource,\n InferRoomContextType,\n} from \"./AbstractPlatform\";\nimport type {\n AbstractCloseEvent,\n AbstractErrorEvent,\n AbstractMessageEvent,\n} from \"./AbstractWebSocket\";\nimport { AbstractWebSocket } from \"./AbstractWebSocket\";\nimport type { PluvRouter, PluvRouterEventConfig } from \"./PluvRouter\";\nimport { authorize } from \"./authorize\";\nimport { GARBAGE_COLLECT_INTERVAL_MS, PING_TIMEOUT_MS } from \"./constants\";\nimport type {\n EventResolverContext,\n EventResolverKind,\n GetInitialStorageFn,\n IORoomDestroyedEvent,\n IORoomListenerEvent,\n IORoomMessageEvent,\n IOUserConnectedEvent,\n IOUserDisconnectedEvent,\n PluvContext,\n PluvIOAuthorize,\n ResolvedPluvIOAuthorize,\n WebSocketSession,\n WebSocketType,\n} from \"./types\";\nimport { oneLine } from \"./utils\";\n\ntype BroadcastMessage<TIO extends IORoom<any, any, any, any, any>> =\n | InferEventMessage<InferIOInput<TIO>>\n | InferEventMessage<BaseIOEventRecord<InferIOAuthorize<TIO>>>;\n\ninterface BroadcastParams<TIO extends IORoom<any, any, any, any, any>> {\n message: BroadcastMessage<TIO>;\n senderId?: string;\n}\n\nexport interface IORoomListeners<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> {\n onRoomDestroyed: (event: IORoomDestroyedEvent<TPlatform, TContext>) => void;\n onStorageDestroyed: (event: IORoomListenerEvent<TPlatform, TContext>) => void;\n onMessage: (event: IORoomMessageEvent<TPlatform, TAuthorize, TContext, TEvents>) => void;\n onUserConnected: (event: IOUserConnectedEvent<TPlatform, TAuthorize, TContext>) => void;\n onUserDisconnected: (event: IOUserDisconnectedEvent<TPlatform, TAuthorize, TContext>) => void;\n}\n\nexport type BroadcastProxy<TIO extends IORoom<any, any, any, any, any>> = (<\n TEvent extends keyof InferIOInput<TIO>,\n>(\n event: TEvent,\n data: Id<InferIOInput<TIO>[TEvent]>,\n) => Promise<void>) & {\n [event in keyof InferIOInput<TIO>]: (data: Id<InferIOInput<TIO>>[event]) => Promise<void>;\n};\n\nexport type IORoomConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<IORoomListeners<TPlatform, TAuthorize, TContext, TEvents>> & {\n authorize?: TAuthorize;\n context: PluvContext<TPlatform, TContext>;\n crdt?: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n debug: boolean;\n getInitialStorage: GetInitialStorageFn<TContext>;\n platform: TPlatform;\n roomContext: InferRoomContextType<TPlatform>;\n router: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n};\n\ninterface SendMessageSender {\n sessionId: string | null;\n user: JsonObject | null;\n}\n\ninterface PatchPresenceParams {\n presence: JsonObject | null;\n sessionId: string;\n timer?: number | null;\n}\n\nexport type WebSocketRegisterConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n> = {\n token?: string | null;\n} & InferInitContextType<TPlatform>;\n\nexport class IORoom<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n null,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IOLike<TAuthorize, TCrdt, TEvents> {\n public readonly id: string;\n\n private _doc: Promise<CrdtDocLike<any, any>>;\n private _lastGarbageCollectMs: number = -1 * (GARBAGE_COLLECT_INTERVAL_MS + 1);\n private _uninitialize: Promise<() => Promise<void>> | null = null;\n\n private readonly _authorize: TAuthorize = null as TAuthorize;\n private readonly _context: PluvContext<TPlatform, TContext>;\n private readonly _crdt: TCrdt;\n private readonly _debug: boolean;\n private readonly _docFactory: AbstractCrdtDocFactory<any, any>;\n private readonly _getInitialStorage: GetInitialStorageFn<TContext>;\n private readonly _listeners: IORoomListeners<TPlatform, TAuthorize, TContext, TEvents>;\n private readonly _platform: TPlatform;\n private readonly _roomContext: InferRoomContextType<TPlatform>;\n private readonly _router: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n private readonly _sessions = new Map<\n [sessionId: string][0],\n AbstractWebSocket<any, TAuthorize>\n >();\n private readonly _userSessionss = new Map<[userId: string][0], Set<[sessionId: string][0]>>();\n\n private _wasDocEmptyOnInit: boolean = true;\n private _storageInitializedViaSession: boolean = false;\n\n /**\n * @ignore\n * @readonly\n * @deprecated Internal use only. Changes to this will never be marked as breaking.\n */\n public get _defs() {\n return {\n authorize: this._authorize,\n context: this._context,\n crdt: this._crdt,\n events: this._router._defs.events,\n platform: this._platform,\n } as {\n authorize: TAuthorize;\n context: TContext;\n crdt: TCrdt;\n events: TEvents;\n platform: TPlatform;\n };\n }\n\n public get broadcast(): BroadcastProxy<this> {\n const _broadcast = <TEvent extends keyof InferIOInput<this>>(\n event: TEvent,\n data: Id<InferIOInput<this>[TEvent]>,\n ): Promise<void> => {\n const message = { type: event, data } as BroadcastMessage<this>;\n\n return Promise.resolve(this._broadcast({ message }));\n };\n\n return new Proxy(_broadcast, {\n get(fn, prop) {\n return (data: any) => fn(prop as any, data);\n },\n }) as BroadcastProxy<this>;\n }\n\n private get _initialized(): Promise<boolean> {\n return Promise.resolve(!!this._uninitialize?.then((result) => !!result));\n }\n\n constructor(id: string, config: IORoomConfig<TPlatform, TAuthorize, TContext, TEvents>) {\n const {\n _meta,\n authorize,\n context,\n crdt = noop,\n debug,\n getInitialStorage,\n onRoomDestroyed,\n onStorageDestroyed,\n onMessage,\n onUserConnected,\n onUserDisconnected,\n platform,\n roomContext,\n router,\n } = config as IORoomConfig<TPlatform, TAuthorize, TContext, TEvents> & { _meta?: any };\n\n this.id = id;\n\n this._context = context;\n this._crdt = crdt as TCrdt;\n this._debug = debug;\n this._docFactory = crdt.doc(() => ({}));\n this._getInitialStorage = getInitialStorage;\n this._roomContext = roomContext;\n this._router = router;\n this._platform = platform.initialize({ ...(!!_meta ? { _meta } : {}), roomContext });\n\n // Listeners are provided from server-level configuration via createRoom\n this._listeners = {\n onRoomDestroyed: (event) => onRoomDestroyed?.(event),\n onStorageDestroyed: (event) => onStorageDestroyed?.(event),\n onMessage: (event) => onMessage?.(event),\n onUserConnected: (event) => onUserConnected?.(event),\n onUserDisconnected: (event) => onUserDisconnected?.(event),\n };\n\n if (authorize) this._authorize = authorize;\n\n /**\n * @description Everything below this line relates to waking up from hibernation.\n * @see https://developers.cloudflare.com/durable-objects/best-practices/websockets/#websocket-hibernation-api\n * @date April 17, 2025\n */\n const webSockets =\n this._platform.getWebSockets() as readonly InferPlatformWebSocketSource<TPlatform>[];\n\n webSockets.forEach((webSocket) => {\n const deserialized = this._platform.getSerializedState(webSocket);\n const sessionId = this._platform.getSessionId(webSocket);\n\n if (!deserialized) return;\n if (typeof sessionId !== \"string\") return;\n\n const pluvWs = this._platform.convertWebSocket(webSocket, { room: this.id });\n\n this._sessions.set(sessionId, pluvWs);\n\n const userId = pluvWs.session.user?.id;\n\n if (!!userId) this._addUserSession(userId, sessionId);\n });\n\n const { doc, uninitialize } = this._initialize();\n\n this._doc = doc;\n this._uninitialize = uninitialize;\n }\n\n /**\n * @description Closes a connection with the specified sessionId\n * @param sessionId The session id of the connection to close\n */\n public async evict(sessionId: string): Promise<void> {\n const session = this._sessions.get(sessionId);\n\n if (session) session.state.quit = true;\n\n await this._emitQuitters();\n }\n\n /**\n * @description Closes all connections to this room, effectively destroying\n * the room\n */\n public async evictAll(): Promise<void> {\n const sessions = Array.from(this._sessions.values());\n\n sessions.forEach((session) => {\n session.state.quit = true;\n });\n\n await this._emitQuitters();\n }\n\n /**\n * @description The IORoom will garbage collect occasionally as connections ping/pong the\n * server\n */\n public async garbageCollect(): Promise<void> {\n this._lastGarbageCollectMs = Date.now();\n this._emitQuitters();\n this._emitSyncState();\n }\n\n public getSize(): number {\n const currentTime = new Date().getTime();\n\n /**\n * @description Doing this instead of .size because some sessions\n * in the map can be considered as \"omitted\".\n * @date December 21, 2022\n */\n return Array.from(this._sessions.values()).reduce((count, pluvWs) => {\n if (pluvWs.state.quit) return count;\n\n const pingTime = this._platform.getLastPing(pluvWs) ?? pluvWs.state.timers.ping;\n\n return currentTime - pingTime > PING_TIMEOUT_MS ? count : count + 1;\n }, 0);\n }\n\n public onClose(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractCloseEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onClose(wsSession);\n }\n\n public onError(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractErrorEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onClose(wsSession);\n }\n\n public onMessage(\n webSocket: WebSocketType<TPlatform>,\n ): (event: AbstractMessageEvent) => Promise<void> {\n this._ensureDetached();\n\n const wsSession = this._getAbstractWs(webSocket);\n\n if (!wsSession) return async () => undefined;\n\n return this._onMessage(wsSession);\n }\n\n public async register(\n webSocket: InferPlatformWebSocketSource<TPlatform>,\n ...options: keyof InferInitContextType<TPlatform> extends never\n ? [{ token?: string }?]\n : [WebSocketRegisterConfig<TPlatform>]\n ): Promise<void> {\n const _options = (options[0] ?? {}) as WebSocketRegisterConfig<TPlatform>;\n const token = _options.token ?? null;\n\n /**\n * TODO\n * @description Update the sessionId strategy so that the userId can be used to retrieve\n * the session in O(1) time if authorized.\n * @date April 15, 2025\n */\n const sessionId = this._platform.getSessionId(webSocket);\n const sessionExists = typeof sessionId === \"string\" && this._sessions.has(sessionId);\n\n if (sessionExists) return;\n\n if (!(await this._initialized)) {\n this._initialize();\n await this._initialized;\n }\n\n const user: BaseUser | null = await this._getAuthorizedUser(token, _options);\n const ioAuthorize = this._getIOAuthorize(_options);\n const isUnauthorized = !!ioAuthorize && !user;\n const pluvWs = this._platform.convertWebSocket(webSocket, { room: this.id });\n\n if (isUnauthorized) {\n this._logDebug(`${colors.blue(\"Authorization failed for connection\")}`);\n pluvWs.handleError({ error: new Error(\"Not authorized\"), room: this.id });\n pluvWs.close(3000, \"WebSocket unauthorized.\");\n\n return;\n }\n\n if (!!user) {\n const latest = this._getLatestPresence(user.id);\n const prevState = pluvWs.state;\n\n pluvWs.user = user;\n\n this._platform.setSerializedState(pluvWs, {\n ...prevState,\n presence: latest.presence,\n timers: { ...prevState.timers, presence: latest.timer },\n });\n this._addUserSession(user.id, pluvWs.sessionId);\n }\n\n this._logDebug(\n `${colors.blue(`Registering connection for room ${this.id}:`)} ${pluvWs.sessionId}`,\n );\n\n await this._platform.acceptWebSocket(pluvWs);\n this._sessions.set(pluvWs.sessionId, pluvWs);\n await this._platform.persistence.addUser(this.id, pluvWs.sessionId, user ?? {});\n\n if (this._platform._config.registrationMode === \"attached\") {\n const onClose = this._onClose(pluvWs).bind(this);\n const onMessage = this._onMessage(pluvWs).bind(this);\n\n pluvWs.addEventListener(\"close\", onClose);\n pluvWs.addEventListener(\"error\", onClose);\n pluvWs.addEventListener(\"message\", onMessage);\n }\n\n await this._emitRegistered(pluvWs);\n\n const size = this.getSize();\n\n this._logDebug(oneLine`\n ${colors.blue(`Registered connection for room ${this.id}:`)}\n ${pluvWs.sessionId}\n `);\n this._logDebug(`${colors.blue(`Room ${this.id} size:`)} ${size}`);\n }\n\n private _addUserSession(userId: string, sessionId: string): Set<[sessionId: string][0]> {\n const set = this._userSessionss.get(userId) ?? new Set<string>();\n const updated = set.add(sessionId);\n\n this._userSessionss.set(userId, updated);\n\n return updated;\n }\n\n private async _broadcast(params: BroadcastParams<this>): Promise<void> {\n const { message, senderId } = params;\n\n const sender = senderId ? (this._sessions.get(senderId) ?? null) : null;\n const session = sender?.session ?? null;\n const user = session?.user ?? null;\n\n if (typeof senderId !== \"string\") return;\n\n this._platform.pubSub.publish(this.id, {\n connectionId: senderId ?? null,\n room: this.id,\n user,\n ...message,\n });\n }\n\n private async _closeWebSockets(\n webSockets: readonly AbstractWebSocket<any, TAuthorize>[],\n ): Promise<void> {\n const closeWebSocket = async (\n webSocket: AbstractWebSocket<any, TAuthorize>,\n ): Promise<void> => {\n webSocket.state = { ...webSocket.state, quit: true };\n\n const sessionId = webSocket.sessionId;\n\n this._logDebug(\n `${colors.blue(`Unregistering connection for room ${this.id}:`)} ${sessionId}`,\n );\n this._sessions.delete(sessionId);\n\n await this._platform.persistence.deleteUser(this.id, sessionId).catch(() => null);\n await this._broadcast({\n message: { type: \"$exit\", data: { sessionId } },\n senderId: sessionId,\n });\n\n const session = webSocket.session;\n const user = session.user;\n\n if (!!user) this._removeUserSession(user.id, sessionId);\n\n try {\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.getEncodedState();\n\n await Promise.resolve(\n this._listeners.onUserDisconnected({\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n user,\n }),\n );\n } catch (error) {\n console.error(error);\n }\n\n this._logDebug(\n `${colors.blue(`Unregistered connection for room ${this.id}:`)} ${webSocket.sessionId}`,\n );\n };\n\n const promises = webSockets.map(async (webSocket) => {\n await closeWebSocket(webSocket).catch(() => null);\n });\n\n await Promise.all(promises).catch(() => null);\n\n const size = this.getSize();\n\n this._logDebug(`${colors.blue(`Room ${this.id} size:`)} ${size}`);\n\n if (!!size) return;\n if (!this._uninitialize) return;\n\n const uninitialize = (await this._uninitialize).bind(this);\n await uninitialize();\n }\n\n private async _emitQuitters(): Promise<void> {\n const currentTime = new Date().getTime();\n const quitters = Array.from(this._sessions.values()).filter((pluvWs) => {\n return pluvWs.state.quit || currentTime - pluvWs.state.timers.ping > PING_TIMEOUT_MS;\n });\n\n this._closeWebSockets(quitters);\n }\n\n private async _emitRegistered(pluvWs: AbstractWebSocket<any, TAuthorize>): Promise<void> {\n const session = pluvWs.session;\n const sessionId = session.id;\n const presence = session.presence;\n const user = session.user;\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.isEmpty() ? null : doc.getEncodedState();\n\n await this._sendSelfMessage(\n {\n type: \"$registered\",\n data: {\n presence,\n sessionId,\n state: encodedState,\n timers: { presence: session.timers.presence },\n },\n },\n { sessionId, user },\n );\n\n try {\n await Promise.resolve(\n this._listeners.onUserConnected({\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n user,\n webSocket: pluvWs.webSocket,\n }),\n );\n } catch (err) {\n console.error(err);\n }\n }\n\n private async _emitSyncState(): Promise<void> {\n const connectionIds = await this._platform.persistence\n .getUsers(this.id)\n .then((map) => Object.keys(map));\n\n await this._broadcast({\n message: {\n type: \"$syncStateReceived\",\n data: { connectionIds },\n },\n });\n }\n\n private _ensureDetached(): void {\n if (this._platform._config.registrationMode === \"detached\") return;\n\n throw new Error(\"Platform must use detached mode\");\n }\n\n private _getAbstractWs(\n webSocket: WebSocketType<TPlatform>,\n ): AbstractWebSocket<any, TAuthorize> | null {\n if ((webSocket as unknown as any) instanceof AbstractWebSocket) return webSocket;\n\n const sessionId = this._platform.getSessionId(webSocket);\n\n if (typeof sessionId === \"string\") {\n const session = this._sessions.get(sessionId) ?? null;\n\n if (session) return session;\n }\n\n const sessions = Array.from(this._sessions.values());\n\n return sessions.find((pluvWs) => pluvWs.webSocket === webSocket) ?? null;\n }\n\n /**\n * TODO\n * @description Revisit any cast types\n * @date July 17, 2025\n */\n private async _getAuthorizedUser(\n token: Maybe<string>,\n options: WebSocketRegisterConfig<TPlatform>,\n ): Promise<InferIOAuthorizeUser<TAuthorize>> {\n const ioAuthorize = this._getIOAuthorize(options);\n\n if (!ioAuthorize) return null as any;\n if (!token) return null as any;\n\n if (!ioAuthorize.secret)\n throw new Error(\"`authorize` was specified without a valid secret\");\n\n const payload = await authorize({\n platform: this._platform,\n secret: ioAuthorize.secret,\n }).decode(token);\n\n if (!payload) {\n this._logDebug(colors.blue(\"Could not decode token:\"));\n this._logDebug(token);\n\n return null as any;\n }\n\n if (payload.room !== this.id) {\n this._logDebug(colors.blue(`Token is not authorized for room ${this.id}:`));\n this._logDebug(colors.blue(\"Received:\"), payload.room);\n this._logDebug(token);\n\n return null as any;\n }\n\n try {\n return ioAuthorize.user.parse(payload.user) ?? null;\n } catch {\n this._logDebug(`${colors.blue(\"Token fails validation:\")} ${token}`);\n\n return null as any;\n }\n }\n\n private async _getContext(): Promise<TContext> {\n return typeof this._context === \"function\"\n ? await Promise.resolve(this._context(this._roomContext))\n : await Promise.resolve(this._context);\n }\n\n private async _getInitialDoc(): Promise<CrdtDocLike<any, any>> {\n const doc = this._docFactory.getEmpty();\n\n const [encodedState, context] = await Promise.all([\n this._platform.persistence.getStorageState(this.id),\n this._getContext(),\n ]);\n\n if (!encodedState) {\n const loadedState = await this._getInitialStorage({\n context,\n room: this.id,\n });\n\n if (!!loadedState && !this._docFactory.isEmpty(loadedState)) {\n doc.applyEncodedState({ update: loadedState });\n }\n }\n\n if (typeof encodedState === \"string\") {\n doc.applyEncodedState({ update: encodedState });\n\n // If we loaded storage from persistence and it's non-empty, storage was previously initialized.\n // This handles hibernation wake-up: restore the initialization state so that onStorageDestroyed\n // will fire correctly when the room is destroyed.\n if (!doc.isEmpty()) {\n this._storageInitializedViaSession = true;\n }\n }\n\n return doc;\n }\n\n private _getIOAuthorize(\n options: WebSocketRegisterConfig<TPlatform>,\n ): ResolvedPluvIOAuthorize<any, any> | null {\n if (typeof this._authorize === \"function\") return this._authorize(options);\n\n return this._authorize as ResolvedPluvIOAuthorize<any, any> | null;\n }\n\n private _getLatestPresence(userId: string): {\n timer: number | null;\n presence: JsonObject | null;\n } {\n if (!this._authorize) return { timer: null, presence: null };\n\n const sessionIds = Array.from(this._userSessionss.get(userId)?.values() ?? []);\n\n if (!sessionIds.length) return { timer: null, presence: null };\n\n return sessionIds.reduce(\n (state, sessionId) => {\n const pluvWs = this._sessions.get(sessionId) ?? null;\n\n if (!pluvWs) return state;\n\n const session = pluvWs.session;\n const presence = session.presence;\n const timer = session.timers.presence;\n\n if (session.user?.id !== userId) return state;\n if (typeof state.timer !== \"number\") return { presence, timer };\n if (typeof timer !== \"number\") return state;\n\n return timer > state.timer ? { presence, timer } : state;\n },\n { presence: null, timer: null } as {\n presence: JsonObject | null;\n timer: number | null;\n },\n );\n }\n\n private _getProcedure(\n message: EventMessage<string, any>,\n ):\n | (typeof this._router)[\"_defs\"][\"events\"][keyof (typeof this._router)[\"_defs\"][\"events\"]]\n | null {\n return (\n this._router._defs.events[\n message.type as keyof (typeof this._router)[\"_defs\"][\"events\"]\n ] ?? null\n );\n }\n\n private _getProcedureInputs(\n message: EventMessage<string, any>,\n ): InferIOInput<this>[keyof TEvents] {\n const procedure = this._getProcedure(message);\n\n if (!procedure) return message.data;\n\n return procedure.config.input ? procedure.config.input.parse(message.data) : message.data;\n }\n\n private _getSession(webSocket: WebSocketType<TPlatform>): WebSocketSession<TAuthorize> {\n const pluvWs = this._getAbstractWs(webSocket);\n\n if (!pluvWs) throw new Error(\"Session could not be found\");\n\n return pluvWs.session;\n }\n\n private _getSessions() {\n const sessions = Array.from(this._sessions.values()).map((pluvWs) => pluvWs.session);\n\n return sessions;\n }\n\n private _initialize() {\n const promise = (async () => {\n this._logDebug(`${colors.blue(`Initializing room: ${this.id}`)}`);\n\n if (!!this._uninitialize) {\n const uninitialize = (await this._uninitialize).bind(this);\n await uninitialize();\n\n this._uninitialize = null;\n }\n\n const pubSubId = await this._platform.pubSub.subscribe(\n this.id,\n async ({ options = {}, ...message }): Promise<void> => {\n await promise;\n\n const sender: SendMessageSender = {\n sessionId: message.connectionId,\n user: message.user,\n };\n\n switch (options.type) {\n case \"self\": {\n await this._sendSelfMessage(message, sender);\n return;\n }\n case \"sync\": {\n await this._sendSyncMessage(message, sender);\n return;\n }\n case \"broadcast\":\n default: {\n const sessionIds = options.sessionIds;\n\n await this._sendBroadcastMessage(message, sender, sessionIds);\n }\n }\n },\n );\n\n const doc = await this._getInitialDoc();\n\n // Track if doc was empty when room was first initialized\n this._wasDocEmptyOnInit = doc.isEmpty();\n\n const uninitialize = async () => {\n this._platform.pubSub.unsubscribe(pubSubId);\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const encodedState = doc.getEncodedState();\n\n doc.destroy();\n this._doc = Promise.resolve(this._docFactory.getEmpty());\n\n // Always emit onRoomDestroyed\n await Promise.resolve(\n this._listeners.onRoomDestroyed({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n platform: this._platform,\n room: this.id,\n }),\n );\n\n // Only emit onStorageDestroyed if storage was initialized via initializeSession\n if (this._storageInitializedViaSession) {\n await Promise.resolve(\n this._listeners.onStorageDestroyed({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n encodedState,\n platform: this._platform,\n room: this.id,\n }),\n );\n\n this._storageInitializedViaSession = false;\n }\n\n this._uninitialize = null;\n };\n\n return { doc, uninitialize };\n })();\n\n this._doc = promise.then((result) => result.doc);\n this._uninitialize = promise.then((result) => result.uninitialize);\n\n return { doc: this._doc, uninitialize: this._uninitialize };\n }\n\n private _logDebug(...data: any[]): void {\n if (this._debug) console.log(...data);\n }\n\n private _onClose(webSocket: AbstractWebSocket<any, TAuthorize>): () => Promise<void> {\n return async (): Promise<void> => {\n if (!(await this._initialized)) return;\n await this._closeWebSockets([webSocket]);\n };\n }\n\n private _onMessage(\n webSocket: AbstractWebSocket<any, TAuthorize>,\n ): (event: AbstractMessageEvent) => Promise<void> {\n return async (event: AbstractMessageEvent): Promise<void> => {\n if (!(await this._initialized)) return;\n\n const pluvWs = this._getAbstractWs(webSocket as WebSocketType<TPlatform>);\n\n if (!pluvWs) throw new Error(\"Could not get session\");\n\n const session = this._getSession(pluvWs as WebSocketType<TPlatform>);\n const sessions = this._getSessions();\n\n const setPresence = (params: PatchPresenceParams): void => {\n this._setPresence.bind(this)(params);\n };\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const eventContext: EventResolverContext<\n EventResolverKind,\n TPlatform,\n TAuthorize,\n TContext\n > = {\n context,\n doc,\n garbageCollect: async () => {\n await this.garbageCollect();\n },\n platform: this._platform,\n get presence() {\n return session.presence as JsonObject | null;\n },\n set presence(presence: JsonObject | null) {\n const sessionId = this.session?.id;\n\n if (!sessionId) return;\n\n setPresence({ presence, sessionId, timer: this.time });\n },\n room: this.id,\n session,\n sessions,\n time: new Date().getTime(),\n };\n\n if (pluvWs.state.quit) {\n await this._closeWebSockets([pluvWs]).catch(() => null);\n pluvWs.close(1011, \"WebSocket broken.\");\n\n return;\n }\n\n const message = this._parseMessage(event);\n\n if (!message) return;\n\n const procedure = this._getProcedure(message);\n\n this._listeners.onMessage({\n ...(\"_meta\" in this._platform && !!this._platform._meta\n ? { _meta: this._platform._meta }\n : {}),\n context,\n encodedState: doc.getEncodedState(),\n message: message as InferEventMessage<\n InferEventsOutput<TEvents>,\n keyof InferEventsOutput<TEvents>\n >,\n platform: this._platform,\n room: this.id,\n user: session.user,\n webSocket: session.webSocket.webSocket,\n });\n\n const sessionId = session.id;\n const user = session.user;\n\n if (!procedure) {\n await this._broadcast({\n message: message as any,\n senderId: sessionId,\n });\n\n return;\n }\n\n let inputs: InferIOInput<this>[keyof TEvents];\n\n try {\n inputs = this._getProcedureInputs(message);\n } catch (error) {\n pluvWs.handleError({\n error,\n message: \"Invalid input\",\n room: this.id,\n session,\n });\n\n return;\n }\n\n await Promise.all([\n procedure.config.broadcast?.(inputs, eventContext),\n procedure.config.self?.(inputs, eventContext),\n procedure.config.sync?.(inputs, eventContext),\n ]).then(async ([broadcast, self, sync]) => {\n const handleBroadcast = async () => {\n if (!broadcast) return;\n\n const messages = Object.entries(broadcast).map(async ([type, data]: any) => {\n await this._broadcast({\n message: { data, type },\n senderId: sessionId,\n });\n });\n\n await Promise.all(messages);\n };\n\n const handleSelf = async () => {\n if (!self) return;\n\n const messages = Object.entries(self).map(async ([type, data]) => {\n await this._sendSelfMessage({ data, type }, { sessionId, user });\n });\n\n await Promise.all(messages);\n };\n\n const handleSync = async () => {\n if (!sync) return;\n\n await this._platform.pubSub.publish(this.id, {\n connectionId: session.id,\n options: { type: \"sync\" },\n room: this.id,\n user,\n ...message,\n });\n\n const messages = Object.entries(sync).map(async ([type, data]) => {\n await this._sendSelfMessage({ data, type }, { sessionId, user });\n });\n\n await Promise.all(messages);\n };\n\n await Promise.all([handleBroadcast(), handleSelf(), handleSync()]);\n });\n\n // After processing messages that might update storage (like $initializeSession),\n // check if storage was initialized via initializeSession\n await this._checkStorageInitializedViaSession();\n };\n }\n\n private _parseMessage(message: {\n data: string | ArrayBuffer;\n }): EventMessage<string, any> | null {\n try {\n const parsed = this._platform.parseData(message.data);\n\n if (typeof parsed !== \"object\") return null;\n if (typeof parsed.type !== \"string\") return null;\n if (typeof parsed.data !== \"object\") return null;\n\n return parsed as EventMessage<string, any>;\n } catch {\n return null;\n }\n }\n\n private _setPresence(params: PatchPresenceParams): void {\n const { presence, sessionId, timer: _timer } = params;\n\n const timer = _timer ?? new Date().getTime();\n const pluvWs = this._sessions.get(sessionId) ?? null;\n\n if (!pluvWs) return;\n\n const wsSession = pluvWs.session;\n const user = wsSession.user as BaseUser | null;\n\n const sessionIds = user\n ? new Set<string>([...(this._userSessionss.get(user.id) ?? []), sessionId])\n : new Set([sessionId]);\n\n sessionIds.forEach((sId) => {\n const pWs = this._sessions.get(sId);\n const session = pWs?.session;\n\n if (!session) return;\n\n const prevState = session.webSocket.state;\n\n this._platform.setSerializedState(session.webSocket, {\n ...prevState,\n presence,\n timers: {\n ...prevState.timers,\n presence: timer,\n },\n });\n });\n }\n\n private _removeUserSession(\n userId: string,\n sessionId: string,\n ): Set<[sessionId: string][0]> | null {\n const set = this._userSessionss.get(userId);\n\n if (!set) return null;\n\n set.delete(sessionId);\n\n if (!!set.size) return set;\n\n this._userSessionss.delete(userId);\n\n return set;\n }\n\n private async _checkStorageInitializedViaSession(): Promise<void> {\n if (this._storageInitializedViaSession) return;\n\n // Only mark as initialized if:\n // 1. Doc was empty when room was first initialized\n // 2. Doc is now non-empty\n // 3. At least one session has been registered\n const doc = await this._doc;\n if (this._wasDocEmptyOnInit && !doc.isEmpty() && this._sessions.size > 0) {\n this._storageInitializedViaSession = true;\n }\n }\n\n private async _sendMessage(\n pluvWs: AbstractWebSocket<any, TAuthorize>,\n message: IOEventMessage<any>,\n ): Promise<void> {\n if (!(await this._initialized)) return;\n\n await Promise.resolve(pluvWs.sendMessage(message));\n }\n\n private async _sendBroadcastMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n sessionIds?: readonly string[],\n ): Promise<void> {\n const { data, type } = message;\n const connectionId = sender?.sessionId ?? null;\n const room = this.id;\n\n if (typeof connectionId !== \"string\") return;\n\n const webSockets =\n sessionIds?.reduce((dict, id) => {\n const pluvWs = this._sessions.get(id);\n\n return pluvWs ? dict.set(id, pluvWs) : dict;\n }, new Map<string, AbstractWebSocket<any, TAuthorize>>()) ?? this._sessions;\n\n const promises = Array.from(webSockets.values()).map(async (pluvWs) => {\n const session = pluvWs.session;\n const user = session.user ?? null;\n\n this._sendMessage(pluvWs, { connectionId, data, room, type, user });\n });\n\n await Promise.all(promises);\n }\n\n private async _sendSelfMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n ): Promise<void> {\n const senderId = sender?.sessionId ?? null;\n\n if (typeof senderId !== \"string\") return;\n\n const pluvWs = this._sessions.get(senderId);\n\n if (!pluvWs) return;\n\n /**\n * @description Note that this will not fire for Cloudflare's hibernatable websockets\n * because the server will auto-respond with the $pong event without calling any\n * functions.\n * @date April 18, 2025\n */\n if (message.type === \"$pong\") {\n const elapsedMs = Date.now() - this._lastGarbageCollectMs;\n\n if (elapsedMs > GARBAGE_COLLECT_INTERVAL_MS) {\n await this.garbageCollect();\n }\n }\n\n const session = pluvWs.session;\n const user = session.user ?? null;\n\n this._sendMessage(pluvWs, {\n connectionId: senderId,\n room: this.id,\n user,\n ...message,\n });\n }\n\n private async _sendSyncMessage(\n message: EventMessage<string, any>,\n sender: SendMessageSender | null,\n ): Promise<void> {\n if (!sender) return;\n\n const connectionId = sender.sessionId;\n\n if (typeof connectionId !== \"string\") return;\n\n const [doc, context] = await Promise.all([this._doc, this._getContext()]);\n const resolverCtx: EventResolverContext<\"sync\", TPlatform, TAuthorize, TContext> = {\n context,\n doc,\n garbageCollect: async () => {\n await this.garbageCollect();\n },\n platform: this._platform,\n get presence() {\n return null;\n },\n set presence(presence: JsonObject | null) {\n return;\n },\n room: this.id,\n session: null,\n sessions: this._getSessions(),\n time: new Date().getTime(),\n };\n\n const resolver = this._getProcedure(message)?.config.sync;\n\n if (!resolver) return;\n\n let inputs: InferIOInput<this>[keyof TEvents];\n\n try {\n inputs = this._getProcedureInputs(message);\n } catch {\n return;\n }\n\n Promise.resolve(resolver(inputs, resolverCtx)).then((output) => {\n if (!output) return;\n\n Object.keys(output).forEach((type: string) => {\n const data = output[type] ?? {};\n\n this._platform.pubSub.publish(this.id, {\n connectionId,\n data,\n options: { type: \"self\" },\n room: this.id,\n type,\n user: (sender.user ?? null) as BaseUser | null,\n });\n });\n });\n }\n}\n","// Generated by genversion.\nexport const version = '4.0.2'\n","import type { AbstractCrdtDocFactory, CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type {\n AreAllOptional,\n IOLike,\n Id,\n InferIOAuthorize,\n InferIOAuthorizeUser,\n JsonObject,\n Maybe,\n NonNilProps,\n} from \"@pluv/types\";\nimport colors from \"kleur\";\nimport type {\n AbstractPlatform,\n InferInitContextType,\n InferRoomContextType,\n} from \"./AbstractPlatform\";\nimport { IORoom } from \"./IORoom\";\nimport type { PluvIO } from \"./PluvIO\";\nimport { PluvProcedure } from \"./PluvProcedure\";\nimport type { PluvRouterEventConfig } from \"./PluvRouter\";\nimport { PluvRouter } from \"./PluvRouter\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { PING_TIMEOUT_MS } from \"./constants\";\nimport type {\n BasePluvIOListeners,\n GetInitialStorageFn,\n PluvContext,\n PluvIOAuthorize,\n PluvIOLimits,\n PluvIOListeners,\n} from \"./types\";\nimport { oneLine, pickBy } from \"./utils\";\nimport { __PLUV_VERSION } from \"./version\";\n\nexport type InferIORoom<TServer extends PluvServer<any, any, any, any, any>> =\n TServer extends PluvServer<\n infer IPlatform,\n infer IAuthorize,\n infer IContext,\n infer ICrdt,\n infer IEvents\n >\n ? IORoom<IPlatform, IAuthorize, IContext, ICrdt, IEvents>\n : never;\n\nexport type PluvServerConfig<\n TPlatform extends AbstractPlatform<any, any> = AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<PluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>> & {\n authorize?: TAuthorize;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n debug?: boolean;\n limits: PluvIOLimits;\n io: PluvIO<TPlatform, TAuthorize, TContext>;\n platform: () => TPlatform;\n router?: PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n} & (TCrdt extends CrdtLibraryType<NoopCrdtDocFactory>\n ? { getInitialStorage?: \"[ERROR]: Must specify crdt to use getInitialStorage\" }\n : { getInitialStorage: GetInitialStorageFn<TContext> });\n\ntype BaseCreateRoomOptions<\n TPlatform extends AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> = {\n debug?: boolean;\n};\n\nexport type CreateRoomOptions<\n TPlatform extends AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>,\n> = keyof Omit<InferRoomContextType<TPlatform>, \"meta\"> extends never\n ? [BaseCreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents>] | []\n : [\n Id<\n BaseCreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents> &\n InferRoomContextType<TPlatform>\n >,\n ];\n\nexport class PluvServer<\n TPlatform extends AbstractPlatform<any, any> = AbstractPlatform<any, any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> implements IOLike<TAuthorize, TCrdt, TEvents> {\n public readonly version: string = __PLUV_VERSION as any;\n\n private readonly _config: NonNilProps<\n PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n >;\n private readonly _docFactory: AbstractCrdtDocFactory<any, any>;\n\n public get fetch(): (...args: any[]) => Promise<any> {\n return (...args: any[]): Promise<any> => {\n const platform = this._config.platform();\n platform.validateConfig(this._config);\n\n if (!platform._fetch) {\n throw new Error(`\\`${platform._name}\\` does not support \\`fetch\\``);\n }\n\n return platform._fetch(...args);\n };\n }\n\n /**\n * @ignore\n * @readonly\n * @deprecated Internal use only. Changes to this will never be marked as breaking.\n */\n public get _defs() {\n return {\n authorize: this._config.authorize,\n context: this._config.context,\n crdt: this._config.crdt,\n events: this._router._defs.events,\n platform: this._config.platform(),\n } as {\n authorize: TAuthorize;\n context: PluvContext<TPlatform, TContext>;\n crdt: TCrdt;\n events: TEvents;\n platform: TPlatform;\n };\n }\n\n private get _baseRouter(): PluvRouter<TPlatform, TAuthorize, TContext, {}> {\n const listeners = this._getListeners();\n\n return new PluvRouter({\n $getOthers: this._procedure.sync((data, { room, session, sessions }) => {\n const currentTime = Date.now();\n\n const others = sessions\n .filter((wsSession) => {\n if (wsSession.id === session?.id) return false;\n if (wsSession.quit) return false;\n if (currentTime - wsSession.timers.ping > PING_TIMEOUT_MS) return false;\n\n return true;\n })\n .reduce<{\n [connectionId: string]: {\n connectionId: string;\n room: string | null;\n user: JsonObject | null;\n };\n }>(\n (acc, { id, presence, timers, user }) => ({\n ...acc,\n [id]: {\n connectionId: id,\n presence,\n room,\n timers: { presence: timers.presence },\n user,\n },\n }),\n {},\n );\n\n return { $othersReceived: { others } };\n }),\n $initializeSession: this._procedure\n .broadcast((data, { session }) => {\n const presence = (data as any)?.presence;\n const timers = session.timers;\n\n if (!session) return {};\n\n session.presence = presence;\n\n return {\n $userJoined: {\n connectionId: session.id,\n user: session.user,\n presence,\n timers: { presence: timers.presence },\n },\n };\n })\n .self(async (data, { context, doc, platform, room, session }) => {\n const oldState = await platform.persistence.getStorageState(room);\n /**\n * !HACK\n * @description This is the frontend's initialStorage. We only want to\n * apply this if the server's storage is empty (i.e. no initial storage\n * has been applied)\n */\n const update = (data as any)?.update as Maybe<string>;\n\n if (!oldState) {\n const loadedState = await this._getInitialStorage({ context, room });\n\n if (!!loadedState && !this._docFactory.isEmpty(loadedState)) {\n doc.applyEncodedState({ update: loadedState });\n }\n }\n\n /**\n * @description Storage was already initialized. Don't overwrite the current\n * storage state with the incoming initial storage. Return what the current state\n * is without changes.\n * @date May 7, 2025\n */\n if (!doc.isEmpty()) {\n const encodedState = doc.getEncodedState();\n\n return {\n $storageReceived: { changeKind: \"unchanged\", state: encodedState },\n };\n }\n\n /**\n * @description Storage was never initialized, and there is an incoming\n * initialStorage from the client. Apply the initialStorage and persist the state\n * as an update.\n * @date May 7, 2025\n */\n if (!!update) {\n const encodedState = doc.applyEncodedState({ update }).getEncodedState();\n const storageSize = new TextEncoder().encode(encodedState).length;\n\n if (\n !!this._config.limits.storageMaxSize &&\n storageSize > this._config.limits.storageMaxSize\n ) {\n throw new Error(\"Storage has exceeded the size limit\");\n }\n\n await platform.persistence\n .setStorageState(room, encodedState)\n .catch((error) => {\n this._logDebug(error);\n });\n\n listeners.onStorageUpdated({\n context,\n encodedState,\n platform,\n room,\n user: session?.user,\n webSocket: session?.webSocket.webSocket,\n });\n\n return {\n $storageReceived: { changeKind: \"initialized\", state: encodedState },\n };\n }\n\n const encodedState = doc.getEncodedState();\n\n return { $storageReceived: { changeKind: \"empty\", state: encodedState } };\n }),\n $ping: this._procedure.self((data, { platform, session }) => {\n if (!session) return {};\n\n const currentTime = new Date().getTime();\n const prevState = session.webSocket.state;\n\n platform.setSerializedState(session.webSocket, {\n ...prevState,\n timers: {\n ...prevState.timers,\n ping: currentTime,\n },\n });\n\n return { $pong: {} };\n }),\n $updatePresence: this._procedure.broadcast((data, context) => {\n const presence = (data as any)?.presence;\n const { session } = context;\n\n if (!session) return {};\n\n const cleanedPatch = pickBy(\n presence ?? {},\n (value) => typeof value !== \"undefined\",\n );\n const updated = Object.assign(Object.create(null), session.presence, cleanedPatch);\n const bytes = new TextEncoder().encode(JSON.stringify(updated)).length;\n\n if (\n !!this._config.limits.presenceMaxSize &&\n bytes > this._config.limits.presenceMaxSize\n ) {\n throw new Error(oneLine`\n Large presence. Presence must be at most\n ${this._config.limits.presenceMaxSize.toLocaleString()} bytes.\n Current size: ${bytes.toLocaleString()} bytes\n `);\n }\n\n context.presence = updated;\n\n return {\n $presenceUpdated: {\n presence: updated,\n timers: { presence: session.timers.presence },\n },\n };\n }),\n $updateStorage: this._procedure.broadcast((data, { context, doc, platform, room }) => {\n const origin = (data as any)?.origin as Maybe<string>;\n const update: string | null = (data as any)?.update ?? null;\n\n if (origin === \"$initialized\" && Object.keys(doc.toJson()).length) return {};\n\n const updated = update === null ? doc : doc.applyEncodedState({ update });\n const encodedState = updated.getEncodedState();\n const storageSize = new TextEncoder().encode(encodedState).length;\n\n if (\n !!this._config.limits.storageMaxSize &&\n storageSize > this._config.limits.storageMaxSize\n ) {\n throw new Error(oneLine`\n Large Storage. Storage must be at most\n ${this._config.limits.storageMaxSize.toLocaleString()} bytes.\n Current size: ${storageSize.toLocaleString()} bytes\n `);\n }\n\n platform.persistence.setStorageState(room, encodedState).then(() => {\n listeners.onStorageUpdated({\n context,\n encodedState,\n platform,\n room,\n });\n });\n\n return { $storageUpdated: { state: encodedState } };\n }),\n });\n }\n\n private get _procedure(): PluvProcedure<TPlatform, TAuthorize, TContext, {}, {}> {\n return new PluvProcedure();\n }\n\n private get _router(): PluvRouter<TPlatform, TAuthorize, TContext, TEvents> {\n return (\n this._config.router\n ? PluvRouter.merge(this._baseRouter, this._config.router)\n : this._baseRouter\n ) as PluvRouter<TPlatform, TAuthorize, TContext, TEvents>;\n }\n\n constructor(options: PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>) {\n this._config = {\n crdt: noop,\n debug: false,\n router: new PluvRouter<TPlatform, TAuthorize, TContext, TEvents>({} as TEvents),\n ...options,\n } as NonNilProps<PluvServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>>;\n\n const {\n onRoomDestroyed,\n onRoomMessage,\n onStorageDestroyed,\n onStorageUpdated,\n onUserConnected,\n onUserDisconnected,\n } = options as Partial<BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>>;\n\n this._docFactory = this._config.crdt.doc(() => ({}));\n (this as any)._listeners = {\n onRoomDestroyed: (event) => onRoomDestroyed?.(event),\n onRoomMessage: (event) => onRoomMessage?.(event),\n onStorageDestroyed: (event) => onStorageDestroyed?.(event),\n onStorageUpdated: (event) => onStorageUpdated?.(event),\n onUserConnected: (event) => onUserConnected?.(event),\n onUserDisconnected: (event) => onUserDisconnected?.(event),\n } as BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>;\n }\n\n public createRoom(\n room: string,\n ...options: CreateRoomOptions<TPlatform, TAuthorize, TContext, TEvents>\n ): IORoom<TPlatform, TAuthorize, TContext, TCrdt, TEvents> {\n const { _meta, debug, ...platformRoomContext } = (options[0] ?? {}) as CreateRoomOptions<\n TPlatform,\n TAuthorize,\n TContext,\n TEvents\n >[0] & {\n _meta?: any;\n };\n\n const platform = this._config.platform();\n\n platform.validateConfig(this._config);\n\n if (platform._config.handleMode !== \"io\") {\n throw new Error(`\\`createRoom\\` is unsupported for \\`${platform._name}\\``);\n }\n\n if (!/^[a-z0-9](?:[a-z0-9-_]*[a-z0-9])?$/i.test(room))\n throw new Error(\"Unsupported room name\");\n\n const roomContext = platformRoomContext as InferRoomContextType<TPlatform>;\n const listeners = this._getListeners();\n const logDebug = this._logDebug.bind(this);\n\n const newRoom = new IORoom<TPlatform, TAuthorize, TContext, TCrdt, TEvents>(room, {\n ...(!!_meta ? { _meta } : {}),\n authorize: this._config.authorize ?? undefined,\n context: this._config.context,\n crdt: this._config.crdt,\n debug: debug ?? this._config.debug,\n getInitialStorage: this._getInitialStorage,\n async onRoomDestroyed(event) {\n logDebug(`${colors.blue(\"Deleting empty room:\")} ${room}`);\n\n // Always fire server-level onRoomDestroyed\n await Promise.resolve(listeners.onRoomDestroyed(event));\n\n logDebug(`${colors.blue(\"Deleted room:\")} ${room}`);\n },\n async onStorageDestroyed(event) {\n logDebug(`${colors.blue(\"Destroying storage for room:\")} ${room}`);\n\n // Always fire server-level onStorageDestroyed\n await Promise.resolve(listeners.onStorageDestroyed(event));\n\n await event.platform.persistence.deleteStorageState(room);\n\n logDebug(`${colors.blue(\"Destroyed storage for room:\")} ${room}`);\n },\n async onMessage(event) {\n await Promise.resolve(listeners.onRoomMessage(event));\n },\n async onUserConnected(event) {\n await Promise.resolve(listeners.onUserConnected(event));\n },\n async onUserDisconnected(event) {\n await Promise.resolve(listeners.onUserDisconnected(event));\n },\n platform,\n roomContext,\n router: this._router,\n });\n\n this._logDebug(`${colors.blue(\"Created room:\")} ${room}`);\n\n return newRoom;\n }\n\n public async createToken(\n params: JWTEncodeParams<InferIOAuthorizeUser<InferIOAuthorize<this>>, TPlatform>,\n ): Promise<string> {\n return await this._config.io.createToken(params);\n }\n\n private _getInitialStorage: GetInitialStorageFn<TContext> = (...args) => {\n const getInitialStorage =\n typeof this._config.getInitialStorage !== \"string\"\n ? (this._config.getInitialStorage ??\n ((() => null) as GetInitialStorageFn<TContext>))\n : ((() => null) as GetInitialStorageFn<TContext>);\n\n return getInitialStorage(...args);\n };\n\n private _getListeners(): BasePluvIOListeners<TPlatform, TAuthorize, TContext, TEvents> {\n return (this as any)._listeners;\n }\n\n private _logDebug(...data: any[]): void {\n if (this._config.debug) console.log(...data);\n }\n}\n","import type { AbstractCrdtDocFactory, CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport { noop } from \"@pluv/crdt\";\nimport type { BaseUser, HasRequiredProperty, IOAuthorize, InferIOAuthorizeUser } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { WebSocketRegisterConfig } from \"./IORoom\";\nimport { PluvProcedure } from \"./PluvProcedure\";\nimport type { MergedRouter, PluvRouterEventConfig } from \"./PluvRouter\";\nimport { PluvRouter } from \"./PluvRouter\";\nimport { PluvServer, PluvServerConfig } from \"./PluvServer\";\nimport type { JWTEncodeParams } from \"./authorize\";\nimport { authorize } from \"./authorize\";\nimport {\n MAX_PRESENCE_SIZE_BYTES,\n MAX_STORAGE_SIZE_BYTES,\n MAX_USER_ID_LENGTH,\n MAX_USER_SIZE_BYTES,\n} from \"./constants\";\nimport type {\n GetInitialStorageFn,\n PluvContext,\n PluvIOAuthorize,\n PluvIOLimits,\n PluvIOListeners,\n PluvIORouter,\n ResolvedPluvIOAuthorize,\n} from \"./types\";\nimport { oneLine } from \"./utils\";\nimport { __PLUV_VERSION } from \"./version\";\n\nexport type PluvIOConfig<\n TPlatform extends AbstractPlatform<any>,\n TAuthorize extends IOAuthorize<any, InferInitContextType<TPlatform>> | null,\n TContext extends Record<string, any>,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n> = {\n authorize?: TAuthorize;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: TCrdt;\n debug?: boolean;\n limits?: PluvIOLimits;\n platform: () => TPlatform;\n};\n\ntype ResolvedServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = Partial<PluvIOListeners<TPlatform, TAuthorize, TContext, TEvents>> &\n PluvIORouter<TPlatform, TAuthorize, TContext, TEvents> &\n (TCrdt extends CrdtLibraryType<NoopCrdtDocFactory>\n ? { getInitialStorage?: \"[ERROR]: Must specify crdt to use getInitialStorage\" }\n : { getInitialStorage: GetInitialStorageFn<TContext> });\n\nexport type BaseServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> = {\n [P in keyof ResolvedServerConfig<\n TPlatform,\n TAuthorize,\n TContext,\n TCrdt,\n TEvents\n > as ResolvedServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>[P] extends undefined\n ? never\n : P]: ResolvedServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>[P];\n};\n\nexport type ServerConfig<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {},\n> =\n HasRequiredProperty<\n BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n > extends true\n ? [BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>]\n : [BaseServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>?];\n\nexport class PluvIO<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TAuthorize extends PluvIOAuthorize<TPlatform, any, InferInitContextType<TPlatform>> | null =\n any,\n TContext extends Record<string, any> = {},\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<any>,\n> {\n public readonly version: string = __PLUV_VERSION as any;\n\n private readonly _authorize: TAuthorize = null as TAuthorize;\n private readonly _context: PluvContext<TPlatform, TContext> = {} as PluvContext<\n TPlatform,\n TContext\n >;\n private readonly _crdt: { doc: (value: any) => AbstractCrdtDocFactory<any, any> };\n private readonly _debug: boolean;\n private readonly _limits: PluvIOLimits;\n private readonly _platform: () => TPlatform;\n\n public get procedure(): PluvProcedure<TPlatform, TAuthorize, TContext, {}, {}> {\n return new PluvProcedure();\n }\n\n constructor(options: PluvIOConfig<TPlatform, TAuthorize, TContext, TCrdt>) {\n const { authorize, context, crdt = noop, debug = false, limits, platform } = options;\n\n this._crdt = crdt as CrdtLibraryType<any>;\n this._debug = debug;\n this._limits = {\n presenceMaxSize: MAX_PRESENCE_SIZE_BYTES,\n storageMaxSize: MAX_STORAGE_SIZE_BYTES,\n userIdMaxLength: MAX_USER_ID_LENGTH,\n userMaxSize: MAX_USER_SIZE_BYTES,\n ...limits,\n };\n this._platform = platform;\n\n if (authorize) this._authorize = authorize;\n if (context) this._context = context;\n }\n\n public async createToken(\n params: JWTEncodeParams<InferIOAuthorizeUser<TAuthorize>, TPlatform>,\n ): Promise<string> {\n if (!this._authorize) {\n throw new Error(\"IO does not specify authorize during initialization.\");\n }\n\n const ioAuthorize = this._getIOAuthorize(params);\n const user = params.user as BaseUser;\n const parsed = !!ioAuthorize ? ioAuthorize.user.parse(user) : user;\n\n if (!!this._limits.userIdMaxLength && user.id.length > this._limits.userIdMaxLength) {\n throw new Error(oneLine`\n createToken was called with a long user id. User ID must be at\n most 128 characters. Current length: ${user.id.length.toLocaleString()}\n `);\n }\n\n const bytes = new TextEncoder().encode(JSON.stringify(parsed)).length;\n\n if (!!this._limits.userMaxSize && bytes > this._limits.userMaxSize) {\n throw new Error(oneLine`\n createToken called with large payload. User must be at most 512\n bytes. Current size: ${bytes.toLocaleString()}\n `);\n }\n\n const platform = this._platform();\n\n /**\n * !HACK\n * @description Allow the platform to overwrite this behavior as needed. This is introduced\n * to support platformPluv\n * @date December 15, 2024\n */\n if (platform._createToken) {\n return await platform._createToken({ ...params, authorize: ioAuthorize });\n }\n\n const secret = ioAuthorize?.secret ?? null;\n\n if (!secret) throw new Error(\"`authorize` was specified without a valid secret\");\n\n return await authorize({ platform, secret }).encode(\n params as JWTEncodeParams<any, TPlatform>,\n );\n }\n\n public mergeRouters<TRouters extends PluvRouter<TPlatform, TAuthorize, TContext, any>[]>(\n ...routers: TRouters\n ): MergedRouter<TRouters> {\n return PluvRouter.merge(...routers);\n }\n\n public router<TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext>>(\n events: TEvents,\n ): PluvRouter<TPlatform, TAuthorize, TContext, TEvents> {\n const invalidName = Object.keys(events).find((name) => name.includes(\"$\"));\n\n if (typeof invalidName === \"string\") {\n throw new Error(oneLine`\n Invalid event name. Event names must not contain $: \"${invalidName}\"\n `);\n }\n\n return new PluvRouter<TPlatform, TAuthorize, TContext, TEvents>(events);\n }\n\n public server<TEvents extends PluvRouterEventConfig<TPlatform, TAuthorize, TContext> = {}>(\n ...config: ServerConfig<TPlatform, TAuthorize, TContext, TCrdt, TEvents>\n ): PluvServer<TPlatform, TAuthorize, TContext, TCrdt, TEvents> {\n const serverConfig = (config[0] ?? {}) as PluvServerConfig<\n TPlatform,\n TAuthorize,\n TContext,\n TCrdt,\n TEvents\n >;\n\n return new PluvServer<TPlatform, TAuthorize, TContext, TCrdt, TEvents>({\n ...serverConfig,\n authorize: this._authorize ?? undefined,\n context: this._context,\n crdt: this._crdt,\n debug: this._debug,\n io: this as PluvIO<TPlatform, TAuthorize, TContext, TCrdt>,\n limits: this._limits,\n platform: this._platform,\n });\n }\n\n private _getIOAuthorize(\n options: WebSocketRegisterConfig<TPlatform>,\n ): ResolvedPluvIOAuthorize<any, any> | null {\n if (typeof this._authorize === \"function\") {\n return this._authorize(options);\n }\n\n return this._authorize as ResolvedPluvIOAuthorize<any, any> | null;\n }\n}\n","import type { CrdtLibraryType, NoopCrdtDocFactory } from \"@pluv/crdt\";\nimport type { BaseUser } from \"@pluv/types\";\nimport type { AbstractPlatform, InferInitContextType } from \"./AbstractPlatform\";\nimport type { PluvIOConfig } from \"./PluvIO\";\nimport { PluvIO } from \"./PluvIO\";\nimport type { PluvContext, PluvIOAuthorize, PluvIOLimits } from \"./types\";\n\nexport type CreateIOParams<\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n> = {\n authorize?: PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>;\n context?: PluvContext<TPlatform, TContext>;\n crdt?: TCrdt;\n debug?: boolean;\n limits?: PluvIOLimits;\n platform: () => TPlatform;\n};\n\nexport const createIO = <\n TPlatform extends AbstractPlatform<any> = AbstractPlatform<any>,\n TContext extends Record<string, any> = {},\n TUser extends BaseUser | null = null,\n TCrdt extends CrdtLibraryType<any> = CrdtLibraryType<NoopCrdtDocFactory>,\n>(\n params: CreateIOParams<TPlatform, TContext, TUser, TCrdt>,\n): PluvIO<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n> => {\n const { authorize, context, crdt, debug, limits, platform } = params;\n\n return new PluvIO<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n >({\n authorize,\n context,\n crdt,\n debug,\n limits,\n platform,\n } as PluvIOConfig<\n TPlatform,\n PluvIOAuthorize<TPlatform, TUser, InferInitContextType<TPlatform>>,\n TContext,\n TCrdt\n >);\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/io",
3
- "version": "4.0.0",
3
+ "version": "4.0.2",
4
4
  "description": "@pluv/io server-side websocket manager",
5
5
  "author": {
6
6
  "email": "david@pluv.io",
@@ -21,19 +21,19 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@panva/hkdf": "^1.2.1",
24
- "jose": "^6.1.3",
24
+ "jose": "^6.2.3",
25
25
  "kleur": "^4.1.5",
26
- "wonka": "^6.3.5",
27
- "@pluv/crdt": "^4.0.0",
28
- "@pluv/types": "^4.0.0"
26
+ "wonka": "^6.3.6",
27
+ "@pluv/crdt": "^4.0.2",
28
+ "@pluv/types": "^4.0.2"
29
29
  },
30
30
  "devDependencies": {
31
- "eslint": "^9.39.2",
31
+ "eslint": "^10.4.1",
32
32
  "genversion": "^3.2.0",
33
- "tsdown": "0.20.0-beta.4",
33
+ "tsdown": "0.22.2",
34
34
  "typescript": "^5.9.3",
35
- "@pluv/tsconfig": "^4.0.0",
36
- "eslint-config-pluv": "^4.0.0"
35
+ "@pluv/tsconfig": "^4.0.2",
36
+ "eslint-config-pluv": "^4.0.2"
37
37
  },
38
38
  "exports": {
39
39
  ".": "./dist/index.mjs",
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '4.0.0'
2
+ export const version = '4.0.2'