@foony/chat 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/lib/chatClient.d.ts +12 -1
  3. package/lib/chatClient.d.ts.map +1 -1
  4. package/lib/chatClient.js +2 -2
  5. package/lib/chatClient.js.map +1 -1
  6. package/lib/index.d.ts +2 -1
  7. package/lib/index.d.ts.map +1 -1
  8. package/lib/index.js +1 -0
  9. package/lib/index.js.map +1 -1
  10. package/lib/messages.d.ts +45 -2
  11. package/lib/messages.d.ts.map +1 -1
  12. package/lib/messages.js +216 -16
  13. package/lib/messages.js.map +1 -1
  14. package/lib/room.d.ts +2 -1
  15. package/lib/room.d.ts.map +1 -1
  16. package/lib/room.js +2 -2
  17. package/lib/room.js.map +1 -1
  18. package/lib/rooms.d.ts +3 -1
  19. package/lib/rooms.d.ts.map +1 -1
  20. package/lib/rooms.js +4 -2
  21. package/lib/rooms.js.map +1 -1
  22. package/lib/storage.d.ts +33 -0
  23. package/lib/storage.d.ts.map +1 -0
  24. package/lib/storage.js +53 -0
  25. package/lib/storage.js.map +1 -0
  26. package/lib/types.d.ts +2 -2
  27. package/lib/types.d.ts.map +1 -1
  28. package/lib-cjs/chatClient.js +2 -2
  29. package/lib-cjs/chatClient.js.map +1 -1
  30. package/lib-cjs/index.js +3 -1
  31. package/lib-cjs/index.js.map +1 -1
  32. package/lib-cjs/messages.js +216 -16
  33. package/lib-cjs/messages.js.map +1 -1
  34. package/lib-cjs/room.js +2 -2
  35. package/lib-cjs/room.js.map +1 -1
  36. package/lib-cjs/rooms.js +4 -2
  37. package/lib-cjs/rooms.js.map +1 -1
  38. package/lib-cjs/storage.js +56 -0
  39. package/lib-cjs/storage.js.map +1 -0
  40. package/package.json +3 -2
  41. package/src/chatClient.ts +14 -2
  42. package/src/index.ts +2 -1
  43. package/src/messages.ts +224 -16
  44. package/src/room.ts +3 -1
  45. package/src/rooms.ts +3 -1
  46. package/src/storage.ts +80 -0
  47. package/src/types.ts +2 -2
package/lib/rooms.js CHANGED
@@ -9,17 +9,19 @@ import { Room } from './room.js';
9
9
  export class Rooms {
10
10
  realtime;
11
11
  getClientId;
12
+ storage;
12
13
  byName = new Map();
13
- constructor(realtime, getClientId) {
14
+ constructor(realtime, getClientId, storage = null) {
14
15
  this.realtime = realtime;
15
16
  this.getClientId = getClientId;
17
+ this.storage = storage;
16
18
  }
17
19
  /** Get (or create) the room named `name`. Stable instance per name. */
18
20
  get(name, options) {
19
21
  let existing = this.byName.get(name);
20
22
  if (!existing) {
21
23
  const channel = this.realtime.channels.get(roomChannelName(name), options?.cipher ? { cipher: options.cipher } : undefined);
22
- existing = new Room(name, channel, this.getClientId, options);
24
+ existing = new Room(name, channel, this.getClientId, options, this.storage);
23
25
  this.byName.set(name, existing);
24
26
  }
25
27
  return existing;
package/lib/rooms.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,4EAA4E;AAC5E,MAAM,OAAO,KAAK;IAIG;IACA;IAJF,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,YACmB,QAAkB,EAClB,WAAgC;QADhC,aAAQ,GAAR,QAAQ,CAAU;QAClB,gBAAW,GAAX,WAAW,CAAqB;IAChD,CAAC;IAEJ,uEAAuE;IACvE,GAAG,CAAC,IAAY,EAAE,OAAqB;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5H,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;CACF"}
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,4EAA4E;AAC5E,MAAM,OAAO,KAAK;IAIG;IACA;IACA;IALF,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,YACmB,QAAkB,EAClB,WAAgC,EAChC,UAA8B,IAAI;QAFlC,aAAQ,GAAR,QAAQ,CAAU;QAClB,gBAAW,GAAX,WAAW,CAAqB;QAChC,YAAO,GAAP,OAAO,CAA2B;IAClD,CAAC;IAEJ,uEAAuE;IACvE,GAAG,CAAC,IAAY,EAAE,OAAqB;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5H,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Optional message persistence. A {@link ChatStorage} keeps a per-room snapshot between page
3
+ * loads, so a returning client renders instantly from its own copy and the server replays only
4
+ * what was missed (via the channel's resume cursor) instead of serving history again.
5
+ */
6
+ import type { MessageFrame } from '@foony/realtime';
7
+ /** Snapshot of one room persisted between sessions. */
8
+ export type PersistedRoomState = {
9
+ /** Raw message frames, oldest-first, replayed through the reconciler on load. */
10
+ readonly frames: readonly MessageFrame[];
11
+ /** Newest stored seq, seeded as the resume cursor so the server replays only the gap. */
12
+ readonly serial: number;
13
+ /** True when older messages remained on the server below the stored window when saved. */
14
+ readonly hasMore: boolean;
15
+ };
16
+ /** Where room snapshots live. Implementations must tolerate concurrent tabs (last write wins). */
17
+ export type ChatStorage = {
18
+ /** The stored snapshot for `room`, or null when none exists. */
19
+ load(room: string): Promise<PersistedRoomState | null>;
20
+ /** Overwrite `room`'s snapshot. */
21
+ save(room: string, state: PersistedRoomState): Promise<void>;
22
+ /** Drop `room`'s snapshot (its resume cursor aged out, or the room was released). */
23
+ remove(room: string): Promise<void>;
24
+ };
25
+ /**
26
+ * A {@link ChatStorage} backed by IndexedDB, or null where IndexedDB does not exist (Node,
27
+ * some webviews) so callers can pass the result straight to `new ChatClient(...)`.
28
+ *
29
+ * @example
30
+ * const chat = new ChatClient(realtime, { storage: indexedDbChatStorage() ?? undefined });
31
+ */
32
+ export declare function indexedDbChatStorage(dbName?: string): ChatStorage | null;
33
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,uDAAuD;AACvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,kGAAkG;AAClG,MAAM,MAAM,WAAW,GAAG;IACxB,gEAAgE;IAChE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACvD,mCAAmC;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,qFAAqF;IACrF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAKF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,SAAe,GAAG,WAAW,GAAG,IAAI,CAqB9E"}
package/lib/storage.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Optional message persistence. A {@link ChatStorage} keeps a per-room snapshot between page
3
+ * loads, so a returning client renders instantly from its own copy and the server replays only
4
+ * what was missed (via the channel's resume cursor) instead of serving history again.
5
+ */
6
+ /** Object store holding one record per room inside the IndexedDB database. */
7
+ const STORE = 'rooms';
8
+ /**
9
+ * A {@link ChatStorage} backed by IndexedDB, or null where IndexedDB does not exist (Node,
10
+ * some webviews) so callers can pass the result straight to `new ChatClient(...)`.
11
+ *
12
+ * @example
13
+ * const chat = new ChatClient(realtime, { storage: indexedDbChatStorage() ?? undefined });
14
+ */
15
+ export function indexedDbChatStorage(dbName = 'foony-chat') {
16
+ if (typeof indexedDB === 'undefined') {
17
+ return null;
18
+ }
19
+ const database = openDatabase(dbName);
20
+ return {
21
+ async load(room) {
22
+ const db = await database;
23
+ return await requestOf(db.transaction(STORE, 'readonly').objectStore(STORE).get(room)) ?? null;
24
+ },
25
+ async save(room, state) {
26
+ const db = await database;
27
+ await requestOf(db.transaction(STORE, 'readwrite').objectStore(STORE).put(state, room));
28
+ },
29
+ async remove(room) {
30
+ const db = await database;
31
+ await requestOf(db.transaction(STORE, 'readwrite').objectStore(STORE).delete(room));
32
+ },
33
+ };
34
+ }
35
+ /** Open (or create) the database with its single room store. */
36
+ function openDatabase(dbName) {
37
+ return new Promise((resolve, reject) => {
38
+ const request = indexedDB.open(dbName, 1);
39
+ request.onupgradeneeded = () => {
40
+ request.result.createObjectStore(STORE);
41
+ };
42
+ request.onsuccess = () => resolve(request.result);
43
+ request.onerror = () => reject(request.error ?? new Error('indexedDB open failed'));
44
+ });
45
+ }
46
+ /** Promisify one IDBRequest. */
47
+ function requestOf(request) {
48
+ return new Promise((resolve, reject) => {
49
+ request.onsuccess = () => resolve(request.result);
50
+ request.onerror = () => reject(request.error ?? new Error('indexedDB request failed'));
51
+ });
52
+ }
53
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,8EAA8E;AAC9E,MAAM,KAAK,GAAG,OAAO,CAAC;AAEtB;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAM,GAAG,YAAY;IACxD,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;YAC1B,OAAO,MAAM,SAAS,CACpB,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAC/D,IAAI,IAAI,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,KAAyB;YAChD,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;YAC1B,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,IAAY;YACvB,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;YAC1B,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gEAAgE;AAChE,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,eAAe,GAAG,GAAG,EAAE;YAC7B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;QACF,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gCAAgC;AAChC,SAAS,SAAS,CAAI,OAAsB;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC"}
package/lib/types.d.ts CHANGED
@@ -69,8 +69,8 @@ export type MessagePage = {
69
69
  readonly messages: readonly Message[];
70
70
  /** True when older messages remain beyond this page. */
71
71
  readonly hasMore: boolean;
72
- /** Cursor (oldest message id in the page) to pass back for the next page. */
73
- readonly nextCursor?: string;
72
+ /** Cursor (the page's oldest message serial) to pass back for the next page. */
73
+ readonly nextCursor?: number;
74
74
  };
75
75
  /** A single presence member in a room. */
76
76
  export type PresenceMember = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,9 @@ class ChatClient {
12
12
  realtime;
13
13
  /** Room registry and factory. */
14
14
  rooms;
15
- constructor(realtime) {
15
+ constructor(realtime, options) {
16
16
  this.realtime = realtime;
17
- this.rooms = new rooms_js_1.Rooms(realtime, () => this.clientId);
17
+ this.rooms = new rooms_js_1.Rooms(realtime, () => this.clientId, options?.storage ?? null);
18
18
  }
19
19
  /** The underlying realtime connection (status, events). */
20
20
  get connection() {
@@ -1 +1 @@
1
- {"version":3,"file":"chatClient.js","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,yCAAmC;AAEnC,+DAA+D;AAC/D,MAAa,UAAU;IAIQ;IAH7B,iCAAiC;IACxB,KAAK,CAAQ;IAEtB,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,2DAA2D;IAC3D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;CACF;AApBD,gCAoBC"}
1
+ {"version":3,"file":"chatClient.js","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,yCAAmC;AAcnC,+DAA+D;AAC/D,MAAa,UAAU;IAIQ;IAH7B,iCAAiC;IACxB,KAAK,CAAQ;IAEtB,YAA6B,QAAkB,EAAE,OAA2B;QAA/C,aAAQ,GAAR,QAAQ,CAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;IAClF,CAAC;IAED,2DAA2D;IAC3D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,CAAC;CACF;AApBD,gCAoBC"}
package/lib-cjs/index.js CHANGED
@@ -8,9 +8,11 @@
8
8
  * package (planned as a separate `@foony/chat/react` subpath).
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.generateRandomKey = exports.MessageReconciler = exports.Occupancy = exports.Reactions = exports.Typing = exports.Presence = exports.Messages = exports.Room = exports.Rooms = exports.ChatClient = void 0;
11
+ exports.generateRandomKey = exports.MessageReconciler = exports.Occupancy = exports.Reactions = exports.Typing = exports.Presence = exports.Messages = exports.Room = exports.Rooms = exports.indexedDbChatStorage = exports.ChatClient = void 0;
12
12
  var chatClient_js_1 = require("./chatClient.js");
13
13
  Object.defineProperty(exports, "ChatClient", { enumerable: true, get: function () { return chatClient_js_1.ChatClient; } });
14
+ var storage_js_1 = require("./storage.js");
15
+ Object.defineProperty(exports, "indexedDbChatStorage", { enumerable: true, get: function () { return storage_js_1.indexedDbChatStorage; } });
14
16
  var rooms_js_1 = require("./rooms.js");
15
17
  Object.defineProperty(exports, "Rooms", { enumerable: true, get: function () { return rooms_js_1.Rooms; } });
16
18
  var room_js_1 = require("./room.js");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,iDAA6C;AAApC,2GAAA,UAAU,OAAA;AACnB,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,qCAA8E;AAArE,+FAAA,IAAI,OAAA;AACb,6CAA+D;AAAtD,uGAAA,QAAQ,OAAA;AACjB,6CAAgE;AAAvD,uGAAA,QAAQ,OAAA;AACjB,yCAA0D;AAAjD,mGAAA,MAAM,OAAA;AACf,+CAAkE;AAAzD,yGAAA,SAAS,OAAA;AAClB,+CAAmE;AAA1D,yGAAA,SAAS,OAAA;AAClB,iDAAoD;AAA3C,kHAAA,iBAAiB,OAAA;AAC1B,iFAAiF;AACjF,iCAAiC;AACjC,4CAAuE;AAA9D,6GAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,iDAAqE;AAA5D,2GAAA,UAAU,OAAA;AACnB,2CAA+F;AAAtF,kHAAA,oBAAoB,OAAA;AAC7B,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,qCAA8E;AAArE,+FAAA,IAAI,OAAA;AACb,6CAA+D;AAAtD,uGAAA,QAAQ,OAAA;AACjB,6CAAgE;AAAvD,uGAAA,QAAQ,OAAA;AACjB,yCAA0D;AAAjD,mGAAA,MAAM,OAAA;AACf,+CAAkE;AAAzD,yGAAA,SAAS,OAAA;AAClB,+CAAmE;AAA1D,yGAAA,SAAS,OAAA;AAClB,iDAAoD;AAA3C,kHAAA,iBAAiB,OAAA;AAC1B,iFAAiF;AACjF,iCAAiC;AACjC,4CAAuE;AAA9D,6GAAA,iBAAiB,OAAA"}
@@ -13,25 +13,125 @@ const protocol_js_1 = require("./protocol.js");
13
13
  const reconciler_js_1 = require("./reconciler.js");
14
14
  const util_js_1 = require("./util.js");
15
15
  /**
16
- * Retention requested for chat messages: the maximum the platform offers (1
17
- * year). The edge clamps this down to the app's plan ceiling, so a chat message
18
- * persists as long as the plan allows — versus typing/reactions, which are left
19
- * at the short ephemeral default. One year in milliseconds.
16
+ * How many stored frames a room keeps. Matches a deep scrollback page: anything older is
17
+ * re-fetchable through `history()` and not worth the disk.
20
18
  */
21
- const MESSAGE_TTL_MS = 365 * 24 * 60 * 60 * 1000;
19
+ const PERSIST_MAX_FRAMES = 300;
20
+ /** Delay between an applied frame and the storage write, so bursts save once. */
21
+ const PERSIST_DEBOUNCE_MS = 300;
22
+ /** Page size fetched when a stored resume cursor has aged out of retention. */
23
+ const RECOVER_PAGE_LIMIT = 100;
24
+ /** Default history page size, matching the server's default. */
25
+ const DEFAULT_HISTORY_LIMIT = 100;
22
26
  /** The message feature of a {@link Room}. */
23
27
  class Messages {
24
28
  channel;
25
29
  roomName;
26
30
  getClientId;
31
+ storage;
27
32
  reconciler;
28
33
  listeners = new Set();
29
34
  channelUnsubscribe = null;
30
- constructor(channel, roomName, getClientId) {
35
+ /** Resolves once the stored snapshot (if any) has been replayed and the resume cursor seeded. */
36
+ ready;
37
+ /** Frames worth persisting (those with a seq), oldest-first after each normalize. */
38
+ frameLog = [];
39
+ /** True when older messages remain on the server below the stored window. */
40
+ storedHasMore = false;
41
+ /** The seeded resume serial, until the first attach reports whether it held. */
42
+ seededSerial = 0;
43
+ channelStateOff = null;
44
+ persistTimer = null;
45
+ pendingSubscribe = false;
46
+ constructor(channel, roomName, getClientId, storage = null) {
31
47
  this.channel = channel;
32
48
  this.roomName = roomName;
33
49
  this.getClientId = getClientId;
50
+ this.storage = storage;
34
51
  this.reconciler = new reconciler_js_1.MessageReconciler(roomName);
52
+ this.ready = this.storage ? this.restore() : Promise.resolve();
53
+ }
54
+ /**
55
+ * Replay the stored snapshot into the reconciler and seed the channel's resume cursor, so the
56
+ * first attach replays only the gap. Runs before the first channel subscribe (see
57
+ * `ensureChannelSubscription`), because a seed after attach is a no-op.
58
+ */
59
+ async restore() {
60
+ let state = null;
61
+ try {
62
+ state = await this.storage.load(this.roomName);
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ if (!state || state.frames.length === 0) {
68
+ return;
69
+ }
70
+ for (const frame of state.frames) {
71
+ if (frame.name === protocol_js_1.MESSAGE_EVENT) {
72
+ this.reconciler.apply(frame);
73
+ }
74
+ if (frame.seq !== undefined && frame.seq > 0) {
75
+ this.frameLog.push(frame);
76
+ }
77
+ }
78
+ this.storedHasMore = state.hasMore;
79
+ if (state.serial > 0) {
80
+ this.seededSerial = state.serial;
81
+ this.channel.resumeFrom(state.serial);
82
+ this.channelStateOff = this.channel.on((change) => this.onChannelState(change));
83
+ }
84
+ }
85
+ /**
86
+ * The seeded cursor is judged by the first attach: `resumed: false` means the serial aged out
87
+ * of retention, so the stored copy may be missing messages and is thrown away.
88
+ */
89
+ onChannelState(change) {
90
+ if (change.current !== 'attached' || this.seededSerial === 0) {
91
+ return;
92
+ }
93
+ this.seededSerial = 0;
94
+ this.channelStateOff?.();
95
+ this.channelStateOff = null;
96
+ if (!change.resumed) {
97
+ void this.recoverFromLostCursor();
98
+ }
99
+ }
100
+ /**
101
+ * The stored window could not be stitched to the live stream, so drop it and fetch a fresh
102
+ * page, emitting the result to subscribers like live traffic (their render already happened
103
+ * from the stale copy).
104
+ */
105
+ async recoverFromLostCursor() {
106
+ try {
107
+ await this.storage.remove(this.roomName);
108
+ }
109
+ catch {
110
+ // Best effort: a failed remove leaves a stale copy that the next failed resume retries.
111
+ }
112
+ this.frameLog = [];
113
+ this.storedHasMore = true;
114
+ try {
115
+ const { messages: frames, more } = await this.channel.history({ limit: RECOVER_PAGE_LIMIT });
116
+ this.storedHasMore = more;
117
+ for (const frame of frames) {
118
+ this.addToFrameLog(frame);
119
+ if (frame.name !== protocol_js_1.MESSAGE_EVENT) {
120
+ continue;
121
+ }
122
+ const event = this.reconciler.apply(frame);
123
+ if (event === null) {
124
+ continue;
125
+ }
126
+ for (const listener of [...this.listeners]) {
127
+ listener(event);
128
+ }
129
+ }
130
+ this.schedulePersist();
131
+ }
132
+ catch {
133
+ // The room still works live; the next history() call backfills.
134
+ }
35
135
  }
36
136
  /** Send a new message. Returns the message optimistically; its `id` is stable. */
37
137
  async send(params) {
@@ -44,7 +144,7 @@ class Messages {
44
144
  ...(params.metadata === undefined ? {} : { metadata: params.metadata }),
45
145
  ...(params.headers === undefined ? {} : { headers: params.headers }),
46
146
  };
47
- await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload, { ttlMs: MESSAGE_TTL_MS });
147
+ await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
48
148
  const now = new Date();
49
149
  return {
50
150
  id,
@@ -69,12 +169,12 @@ class Messages {
69
169
  ...(params.metadata === undefined ? {} : { metadata: params.metadata }),
70
170
  ...(params.headers === undefined ? {} : { headers: params.headers }),
71
171
  };
72
- await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload, { ttlMs: MESSAGE_TTL_MS });
172
+ await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
73
173
  }
74
174
  /** Delete a message by id. */
75
175
  async delete(id) {
76
176
  const payload = { v: protocol_js_1.PAYLOAD_VERSION, action: 'delete', id };
77
- await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload, { ttlMs: MESSAGE_TTL_MS });
177
+ await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
78
178
  }
79
179
  /**
80
180
  * Subscribe to live message changes. The first subscriber attaches the
@@ -97,12 +197,22 @@ class Messages {
97
197
  * `nextCursor`) to page further back.
98
198
  */
99
199
  async history(params) {
200
+ if (this.storage) {
201
+ await this.ready;
202
+ if (params?.cursor === undefined) {
203
+ const stored = this.storedPage(params?.limit ?? DEFAULT_HISTORY_LIMIT);
204
+ if (stored) {
205
+ return stored;
206
+ }
207
+ }
208
+ }
100
209
  const { messages: frames, more } = await this.channel.history({
101
210
  ...(params?.limit === undefined ? {} : { limit: params.limit }),
102
- ...(params?.cursor === undefined ? {} : { start: params.cursor }),
211
+ ...(params?.cursor === undefined ? {} : { before: params.cursor }),
103
212
  });
104
213
  const touched = [];
105
214
  for (const frame of frames) {
215
+ this.addToFrameLog(frame);
106
216
  if (frame.name !== protocol_js_1.MESSAGE_EVENT) {
107
217
  continue;
108
218
  }
@@ -112,29 +222,119 @@ class Messages {
112
222
  touched.push(id);
113
223
  }
114
224
  }
225
+ this.schedulePersist();
115
226
  const messages = touched
116
227
  .map((id) => this.reconciler.get(id))
117
228
  .filter((message) => message !== undefined);
118
229
  return {
119
230
  messages,
120
231
  hasMore: more,
121
- ...(frames.length > 0 && frames[0] ? { nextCursor: frames[0].messageId } : {}),
232
+ ...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
233
+ };
234
+ }
235
+ /**
236
+ * Build the newest page from the stored window, or null when the window is too small for the
237
+ * request (fewer frames than asked and older messages remain on the server).
238
+ */
239
+ storedPage(limit) {
240
+ this.normalizeFrameLog();
241
+ if (this.frameLog.length === 0 || (this.frameLog.length < limit && this.storedHasMore)) {
242
+ return null;
243
+ }
244
+ const window = this.frameLog.slice(-limit);
245
+ const touched = [];
246
+ for (const frame of window) {
247
+ const id = messageIdOf(frame);
248
+ if (id !== null && !touched.includes(id)) {
249
+ touched.push(id);
250
+ }
251
+ }
252
+ const messages = touched
253
+ .map((id) => this.reconciler.get(id))
254
+ .filter((message) => message !== undefined);
255
+ return {
256
+ messages,
257
+ hasMore: this.storedHasMore || this.frameLog.length > window.length,
258
+ ...(window[0]?.seq === undefined ? {} : { nextCursor: window[0].seq }),
122
259
  };
123
260
  }
124
261
  /** Lazily attach the single channel subscription that feeds the reconciler. */
125
262
  ensureChannelSubscription() {
126
- if (this.channelUnsubscribe) {
263
+ if (this.channelUnsubscribe || this.pendingSubscribe) {
264
+ return;
265
+ }
266
+ if (!this.storage) {
267
+ this.channelUnsubscribe = this.channel.subscribe(protocol_js_1.MESSAGE_EVENT, (frame) => this.onLiveFrame(frame));
127
268
  return;
128
269
  }
129
- this.channelUnsubscribe = this.channel.subscribe(protocol_js_1.MESSAGE_EVENT, (frame) => {
130
- const event = this.reconciler.apply(frame);
131
- if (event === null) {
270
+ // With storage, the subscribe waits for the restore: the resume seed must be in place
271
+ // before the attach the subscription triggers, or the server backfills nothing.
272
+ this.pendingSubscribe = true;
273
+ void this.ready.then(() => {
274
+ this.pendingSubscribe = false;
275
+ if (this.channelUnsubscribe || this.listeners.size === 0) {
132
276
  return;
133
277
  }
278
+ this.channelUnsubscribe = this.channel.subscribe(protocol_js_1.MESSAGE_EVENT, (frame) => this.onLiveFrame(frame));
279
+ });
280
+ }
281
+ /** Apply one live frame, fan it out, and keep the stored window fresh. */
282
+ onLiveFrame(frame) {
283
+ this.addToFrameLog(frame);
284
+ const event = this.reconciler.apply(frame);
285
+ if (event !== null) {
134
286
  for (const listener of [...this.listeners]) {
135
287
  listener(event);
136
288
  }
137
- });
289
+ }
290
+ this.schedulePersist();
291
+ }
292
+ /** Track a sequenced frame for persistence. No-op without storage. */
293
+ addToFrameLog(frame) {
294
+ if (!this.storage || frame.seq === undefined || frame.seq <= 0) {
295
+ return;
296
+ }
297
+ this.frameLog.push(frame);
298
+ if (this.frameLog.length > PERSIST_MAX_FRAMES * 2) {
299
+ this.normalizeFrameLog();
300
+ }
301
+ }
302
+ /** Sort, dedupe by seq, and trim the frame log to the newest window. */
303
+ normalizeFrameLog() {
304
+ if (this.frameLog.length === 0) {
305
+ return;
306
+ }
307
+ const bySeq = new Map();
308
+ for (const frame of this.frameLog) {
309
+ bySeq.set(frame.seq, frame);
310
+ }
311
+ const sorted = [...bySeq.values()].sort((left, right) => left.seq - right.seq);
312
+ if (sorted.length > PERSIST_MAX_FRAMES) {
313
+ this.frameLog = sorted.slice(-PERSIST_MAX_FRAMES);
314
+ this.storedHasMore = true;
315
+ }
316
+ else {
317
+ this.frameLog = sorted;
318
+ }
319
+ }
320
+ /** Save the stored window shortly, coalescing bursts into one write. */
321
+ schedulePersist() {
322
+ if (!this.storage || this.persistTimer !== null) {
323
+ return;
324
+ }
325
+ this.persistTimer = setTimeout(() => {
326
+ this.persistTimer = null;
327
+ this.normalizeFrameLog();
328
+ if (this.frameLog.length === 0) {
329
+ return;
330
+ }
331
+ const serial = this.frameLog[this.frameLog.length - 1].seq;
332
+ void this.storage
333
+ .save(this.roomName, { frames: [...this.frameLog], serial, hasMore: this.storedHasMore })
334
+ .catch(() => {
335
+ // Best effort: a lost save costs the next load a server history fetch, nothing more.
336
+ });
337
+ }, PERSIST_DEBOUNCE_MS);
138
338
  }
139
339
  }
140
340
  exports.Messages = Messages;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
package/lib-cjs/room.js CHANGED
@@ -30,10 +30,10 @@ class Room {
30
30
  hadBeenAttached = false;
31
31
  constructor(
32
32
  /** Room name (without the `chat:` channel prefix). */
33
- name, channel, getClientId, options) {
33
+ name, channel, getClientId, options, storage = null) {
34
34
  this.name = name;
35
35
  this.channel = channel;
36
- this.messages = new messages_js_1.Messages(channel, name, getClientId);
36
+ this.messages = new messages_js_1.Messages(channel, name, getClientId, storage);
37
37
  this.presence = new presence_js_1.Presence(channel);
38
38
  this.typing = new typing_js_1.Typing(channel, getClientId, options?.typing?.heartbeatThrottleMs);
39
39
  this.reactions = new reactions_js_1.Reactions(channel, getClientId);
@@ -1 +1 @@
1
- {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,+CAAyC;AACzC,iDAA2C;AAC3C,+CAAyC;AACzC,iDAA2C;AAC3C,2CAAqC;AASrC,6EAA6E;AAC7E,MAAa,IAAI;IAiBJ;IACQ;IAjBnB,wDAAwD;IAC/C,QAAQ,CAAW;IAC5B,iEAAiE;IACxD,QAAQ,CAAW;IAC5B,yBAAyB;IAChB,MAAM,CAAS;IACxB,sCAAsC;IAC7B,SAAS,CAAY;IAC9B,8CAA8C;IACrC,SAAS,CAAY;IAEb,sBAAsB,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnE,eAAe,GAAG,KAAK,CAAC;IAEhC;IACE,sDAAsD;IAC7C,IAAY,EACJ,OAAgB,EACjC,WAAgC,EAChC,OAAqB;QAHZ,SAAI,GAAJ,IAAI,CAAQ;QACJ,YAAO,GAAP,OAAO,CAAS;QAIjC,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC9E,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,yEAAyE;IACzE,cAAc,CAAC,QAA8C;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,QAA+B;QAC7C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,MAA0B;QAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5C,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBACxD,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACzC,yDAAyD;YACzD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AA1ED,oBA0EC"}
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAIH,+CAAyC;AACzC,iDAA2C;AAC3C,+CAAyC;AACzC,iDAA2C;AAC3C,2CAAqC;AASrC,6EAA6E;AAC7E,MAAa,IAAI;IAiBJ;IACQ;IAjBnB,wDAAwD;IAC/C,QAAQ,CAAW;IAC5B,iEAAiE;IACxD,QAAQ,CAAW;IAC5B,yBAAyB;IAChB,MAAM,CAAS;IACxB,sCAAsC;IAC7B,SAAS,CAAY;IAC9B,8CAA8C;IACrC,SAAS,CAAY;IAEb,sBAAsB,GAAG,IAAI,GAAG,EAAyB,CAAC;IACnE,eAAe,GAAG,KAAK,CAAC;IAEhC;IACE,sDAAsD;IAC7C,IAAY,EACJ,OAAgB,EACjC,WAAgC,EAChC,OAAqB,EACrB,UAA8B,IAAI;QAJzB,SAAI,GAAJ,IAAI,CAAQ;QACJ,YAAO,GAAP,OAAO,CAAS;QAKjC,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,wBAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC9E,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,yEAAyE;IACzE,cAAc,CAAC,QAA8C;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,QAA+B;QAC7C,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,MAA0B;QAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5C,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBACxD,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACzC,yDAAyD;YACzD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AA3ED,oBA2EC"}
package/lib-cjs/rooms.js CHANGED
@@ -12,17 +12,19 @@ const room_js_1 = require("./room.js");
12
12
  class Rooms {
13
13
  realtime;
14
14
  getClientId;
15
+ storage;
15
16
  byName = new Map();
16
- constructor(realtime, getClientId) {
17
+ constructor(realtime, getClientId, storage = null) {
17
18
  this.realtime = realtime;
18
19
  this.getClientId = getClientId;
20
+ this.storage = storage;
19
21
  }
20
22
  /** Get (or create) the room named `name`. Stable instance per name. */
21
23
  get(name, options) {
22
24
  let existing = this.byName.get(name);
23
25
  if (!existing) {
24
26
  const channel = this.realtime.channels.get((0, protocol_js_1.roomChannelName)(name), options?.cipher ? { cipher: options.cipher } : undefined);
25
- existing = new room_js_1.Room(name, channel, this.getClientId, options);
27
+ existing = new room_js_1.Room(name, channel, this.getClientId, options, this.storage);
26
28
  this.byName.set(name, existing);
27
29
  }
28
30
  return existing;
@@ -1 +1 @@
1
- {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,+CAAgD;AAChD,uCAAiC;AAGjC,4EAA4E;AAC5E,MAAa,KAAK;IAIG;IACA;IAJF,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,YACmB,QAAkB,EAClB,WAAgC;QADhC,aAAQ,GAAR,QAAQ,CAAU;QAClB,gBAAW,GAAX,WAAW,CAAqB;IAChD,CAAC;IAEJ,uEAAuE;IACvE,GAAG,CAAC,IAAY,EAAE,OAAqB;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAA,6BAAe,EAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5H,QAAQ,GAAG,IAAI,cAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,6BAAe,EAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;CACF;AA7BD,sBA6BC"}
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAGH,+CAAgD;AAChD,uCAAiC;AAIjC,4EAA4E;AAC5E,MAAa,KAAK;IAIG;IACA;IACA;IALF,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,YACmB,QAAkB,EAClB,WAAgC,EAChC,UAA8B,IAAI;QAFlC,aAAQ,GAAR,QAAQ,CAAU;QAClB,gBAAW,GAAX,WAAW,CAAqB;QAChC,YAAO,GAAP,OAAO,CAA2B;IAClD,CAAC;IAEJ,uEAAuE;IACvE,GAAG,CAAC,IAAY,EAAE,OAAqB;QACrC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAA,6BAAe,EAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC5H,QAAQ,GAAG,IAAI,cAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,OAAO,CAAC,IAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,6BAAe,EAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;CACF;AA9BD,sBA8BC"}