@foony/chat 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,31 @@
3
3
  All notable changes to `@foony/chat`. Format loosely follows
4
4
  [Keep a Changelog](https://keepachangelog.com); versions are semver.
5
5
 
6
+ ## 0.3.1
7
+
8
+ ### Fixed
9
+
10
+ - Chat continues without its local cache when browser privacy settings block IndexedDB or the cache runs out of space.
11
+
12
+ ## 0.3.0
13
+
14
+ ### Added
15
+
16
+ - **Rooms can persist between page loads.** Pass a storage to the client and a
17
+ returning visitor renders from their local copy while the server replays only
18
+ what they missed, so `history()` resolves instantly on repeat visits:
19
+
20
+ ```js
21
+ const chat = new ChatClient(realtime, {
22
+ storage: indexedDbChatStorage() ?? undefined,
23
+ });
24
+ ```
25
+
26
+ `indexedDbChatStorage()` keeps the newest 300 messages per room in
27
+ IndexedDB and returns null where IndexedDB does not exist. If a stored
28
+ copy is too old to stitch to the live stream, it is dropped and history
29
+ is fetched fresh. Requires `@foony/realtime` 0.16.0.
30
+
6
31
  ## 0.2.0
7
32
 
8
33
  ### Changed
@@ -5,12 +5,23 @@
5
5
  */
6
6
  import type { Connection, Realtime } from '@foony/realtime';
7
7
  import { Rooms } from './rooms.js';
8
+ import type { ChatStorage } from './storage.js';
9
+ /** Client-wide options. */
10
+ export type ChatClientOptions = {
11
+ /**
12
+ * Persist each room's recent messages between page loads (see
13
+ * {@link indexedDbChatStorage | `indexedDbChatStorage()`}). A returning client renders from
14
+ * its stored copy and the server replays only what it missed, instead of serving history
15
+ * again on every visit. Omit to keep everything in memory.
16
+ */
17
+ readonly storage?: ChatStorage;
18
+ };
8
19
  /** Chat client built on top of a {@link Realtime} instance. */
9
20
  export declare class ChatClient {
10
21
  private readonly realtime;
11
22
  /** Room registry and factory. */
12
23
  readonly rooms: Rooms;
13
- constructor(realtime: Realtime);
24
+ constructor(realtime: Realtime, options?: ChatClientOptions);
14
25
  /** The underlying realtime connection (status, events). */
15
26
  get connection(): Connection;
16
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chatClient.d.ts","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,+DAA+D;AAC/D,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEO,QAAQ,EAAE,QAAQ;IAI/C,2DAA2D;IAC3D,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;CACF"}
1
+ {"version":3,"file":"chatClient.d.ts","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,2BAA2B;AAC3B,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF,+DAA+D;AAC/D,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEO,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAI5E,2DAA2D;IAC3D,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED;;;OAGG;IACH,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;CACF"}
package/lib/chatClient.js CHANGED
@@ -9,9 +9,9 @@ export class ChatClient {
9
9
  realtime;
10
10
  /** Room registry and factory. */
11
11
  rooms;
12
- constructor(realtime) {
12
+ constructor(realtime, options) {
13
13
  this.realtime = realtime;
14
- this.rooms = new Rooms(realtime, () => this.clientId);
14
+ this.rooms = new Rooms(realtime, () => this.clientId, options?.storage ?? null);
15
15
  }
16
16
  /** The underlying realtime connection (status, events). */
17
17
  get connection() {
@@ -1 +1 @@
1
- {"version":3,"file":"chatClient.js","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,+DAA+D;AAC/D,MAAM,OAAO,UAAU;IAIQ;IAH7B,iCAAiC;IACxB,KAAK,CAAQ;IAEtB,YAA6B,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,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"}
1
+ {"version":3,"file":"chatClient.js","sourceRoot":"","sources":["../src/chatClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAcnC,+DAA+D;AAC/D,MAAM,OAAO,UAAU;IAIQ;IAH7B,iCAAiC;IACxB,KAAK,CAAQ;IAEtB,YAA6B,QAAkB,EAAE,OAA2B;QAA/C,aAAQ,GAAR,QAAQ,CAAU;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,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"}
package/lib/index.d.ts CHANGED
@@ -6,7 +6,8 @@
6
6
  * reactions and occupancy. React bindings are intentionally out of this core
7
7
  * package (planned as a separate `@foony/chat/react` subpath).
8
8
  */
9
- export { ChatClient } from './chatClient.js';
9
+ export { ChatClient, type ChatClientOptions } from './chatClient.js';
10
+ export { indexedDbChatStorage, type ChatStorage, type PersistedRoomState } from './storage.js';
10
11
  export { Rooms } from './rooms.js';
11
12
  export { Room, type RoomStatus, type DiscontinuityListener } from './room.js';
12
13
  export { Messages, type MessageListener } from './messages.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,IAAI,aAAa,EAC1B,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,IAAI,aAAa,EAC1B,WAAW,GACZ,MAAM,YAAY,CAAC"}
package/lib/index.js CHANGED
@@ -7,6 +7,7 @@
7
7
  * package (planned as a separate `@foony/chat/react` subpath).
8
8
  */
9
9
  export { ChatClient } from './chatClient.js';
10
+ export { indexedDbChatStorage } from './storage.js';
10
11
  export { Rooms } from './rooms.js';
11
12
  export { Room } from './room.js';
12
13
  export { Messages } from './messages.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAA+C,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAwB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,MAAM,EAAuB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAA0B,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,iFAAiF;AACjF,iCAAiC;AACjC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAA0B,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAA6C,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAA+C,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAwB,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAyB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,MAAM,EAAuB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAA0B,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,iFAAiF;AACjF,iCAAiC;AACjC,OAAO,EAAE,iBAAiB,EAAqB,MAAM,iBAAiB,CAAC"}
package/lib/messages.d.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  * (the app renders backfill itself, matching Ably's historyBeforeSubscribe).
8
8
  */
9
9
  import type { Channel, UnsubscribeFn } from '@foony/realtime';
10
+ import type { ChatStorage } from './storage.js';
10
11
  import type { ChatMessageEvent, Message, MessagePage, SendMessageParams, UpdateMessageParams } from './types.js';
11
12
  /** Listener invoked for every materialized message change on the room. */
12
13
  export type MessageListener = (event: ChatMessageEvent) => void;
@@ -15,10 +16,39 @@ export declare class Messages {
15
16
  private readonly channel;
16
17
  private readonly roomName;
17
18
  private readonly getClientId;
19
+ private readonly storage;
18
20
  private readonly reconciler;
19
21
  private readonly listeners;
20
22
  private channelUnsubscribe;
21
- constructor(channel: Channel, roomName: string, getClientId: () => string | null);
23
+ /** Resolves once the stored snapshot (if any) has been replayed and the resume cursor seeded. */
24
+ private readonly ready;
25
+ /** Frames worth persisting (those with a seq), oldest-first after each normalize. */
26
+ private frameLog;
27
+ /** True when older messages remain on the server below the stored window. */
28
+ private storedHasMore;
29
+ /** The seeded resume serial, until the first attach reports whether it held. */
30
+ private seededSerial;
31
+ private channelStateOff;
32
+ private persistTimer;
33
+ private pendingSubscribe;
34
+ constructor(channel: Channel, roomName: string, getClientId: () => string | null, storage?: ChatStorage | null);
35
+ /**
36
+ * Replay the stored snapshot into the reconciler and seed the channel's resume cursor, so the
37
+ * first attach replays only the gap. Runs before the first channel subscribe (see
38
+ * `ensureChannelSubscription`), because a seed after attach is a no-op.
39
+ */
40
+ private restore;
41
+ /**
42
+ * The seeded cursor is judged by the first attach: `resumed: false` means the serial aged out
43
+ * of retention, so the stored copy may be missing messages and is thrown away.
44
+ */
45
+ private onChannelState;
46
+ /**
47
+ * The stored window could not be stitched to the live stream, so drop it and fetch a fresh
48
+ * page, emitting the result to subscribers like live traffic (their render already happened
49
+ * from the stale copy).
50
+ */
51
+ private recoverFromLostCursor;
22
52
  /** Send a new message. Returns the message optimistically; its `id` is stable. */
23
53
  send(params: SendMessageParams): Promise<Message>;
24
54
  /** Edit a message by id. Replaces text/metadata/headers (omitted fields clear). */
@@ -39,7 +69,20 @@ export declare class Messages {
39
69
  limit?: number;
40
70
  cursor?: number;
41
71
  }): Promise<MessagePage>;
72
+ /**
73
+ * Build the newest page from the stored window, or null when the window is too small for the
74
+ * request (fewer frames than asked and older messages remain on the server).
75
+ */
76
+ private storedPage;
42
77
  /** Lazily attach the single channel subscription that feeds the reconciler. */
43
78
  private ensureChannelSubscription;
79
+ /** Apply one live frame, fan it out, and keep the stored window fresh. */
80
+ private onLiveFrame;
81
+ /** Track a sequenced frame for persistence. No-op without storage. */
82
+ private addToFrameLog;
83
+ /** Sort, dedupe by seq, and trim the frame log to the newest window. */
84
+ private normalizeFrameLog;
85
+ /** Save the stored window shortly, coalescing bursts into one write. */
86
+ private schedulePersist;
44
87
  }
45
88
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjH,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEhE,6CAA6C;AAC7C,qBAAa,QAAQ;IAMjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAP9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,kBAAkB,CAA8B;gBAGrC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI;IAKnD,kFAAkF;IAC5E,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,mFAAmF;IAC7E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,8BAA8B;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa;IAYnD;;;;OAIG;IACG,OAAO,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BjF,+EAA+E;IAC/E,OAAO,CAAC,yBAAyB;CAclC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGjH,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAiBhE,6CAA6C;AAC7C,qBAAa,QAAQ;IAkBjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IApB1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,kBAAkB,CAA8B;IAExD,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,qFAAqF;IACrF,OAAO,CAAC,QAAQ,CAAsB;IACtC,6EAA6E;IAC7E,OAAO,CAAC,aAAa,CAAS;IAC9B,gFAAgF;IAChF,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,gBAAgB,CAAS;gBAGd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,OAAO,GAAE,WAAW,GAAG,IAAW;IAMrD;;;;OAIG;YACW,OAAO;IA0BrB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;OAIG;YACW,qBAAqB;IA8BnC,kFAAkF;IAC5E,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,mFAAmF;IAC7E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE,8BAA8B;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa;IAYnD;;;;OAIG;IACG,OAAO,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAqCjF;;;OAGG;IACH,OAAO,CAAC,UAAU;IAuBlB,+EAA+E;IAC/E,OAAO,CAAC,yBAAyB;IAoBjC,0EAA0E;IAC1E,OAAO,CAAC,WAAW;IAWnB,sEAAsE;IACtE,OAAO,CAAC,aAAa;IAUrB,wEAAwE;IACxE,OAAO,CAAC,iBAAiB;IAiBzB,wEAAwE;IACxE,OAAO,CAAC,eAAe;CAkBxB"}
package/lib/messages.js CHANGED
@@ -9,19 +9,126 @@
9
9
  import { MESSAGE_EVENT, PAYLOAD_VERSION } from './protocol.js';
10
10
  import { MessageReconciler } from './reconciler.js';
11
11
  import { newMessageId } from './util.js';
12
+ /**
13
+ * How many stored frames a room keeps. Matches a deep scrollback page: anything older is
14
+ * re-fetchable through `history()` and not worth the disk.
15
+ */
16
+ const PERSIST_MAX_FRAMES = 300;
17
+ /** Delay between an applied frame and the storage write, so bursts save once. */
18
+ const PERSIST_DEBOUNCE_MS = 300;
19
+ /** Page size fetched when a stored resume cursor has aged out of retention. */
20
+ const RECOVER_PAGE_LIMIT = 100;
21
+ /** Default history page size, matching the server's default. */
22
+ const DEFAULT_HISTORY_LIMIT = 100;
12
23
  /** The message feature of a {@link Room}. */
13
24
  export class Messages {
14
25
  channel;
15
26
  roomName;
16
27
  getClientId;
28
+ storage;
17
29
  reconciler;
18
30
  listeners = new Set();
19
31
  channelUnsubscribe = null;
20
- constructor(channel, roomName, getClientId) {
32
+ /** Resolves once the stored snapshot (if any) has been replayed and the resume cursor seeded. */
33
+ ready;
34
+ /** Frames worth persisting (those with a seq), oldest-first after each normalize. */
35
+ frameLog = [];
36
+ /** True when older messages remain on the server below the stored window. */
37
+ storedHasMore = false;
38
+ /** The seeded resume serial, until the first attach reports whether it held. */
39
+ seededSerial = 0;
40
+ channelStateOff = null;
41
+ persistTimer = null;
42
+ pendingSubscribe = false;
43
+ constructor(channel, roomName, getClientId, storage = null) {
21
44
  this.channel = channel;
22
45
  this.roomName = roomName;
23
46
  this.getClientId = getClientId;
47
+ this.storage = storage;
24
48
  this.reconciler = new MessageReconciler(roomName);
49
+ this.ready = this.storage ? this.restore() : Promise.resolve();
50
+ }
51
+ /**
52
+ * Replay the stored snapshot into the reconciler and seed the channel's resume cursor, so the
53
+ * first attach replays only the gap. Runs before the first channel subscribe (see
54
+ * `ensureChannelSubscription`), because a seed after attach is a no-op.
55
+ */
56
+ async restore() {
57
+ let state = null;
58
+ try {
59
+ state = await this.storage.load(this.roomName);
60
+ }
61
+ catch {
62
+ return;
63
+ }
64
+ if (!state || state.frames.length === 0) {
65
+ return;
66
+ }
67
+ for (const frame of state.frames) {
68
+ if (frame.name === MESSAGE_EVENT) {
69
+ this.reconciler.apply(frame);
70
+ }
71
+ if (frame.seq !== undefined && frame.seq > 0) {
72
+ this.frameLog.push(frame);
73
+ }
74
+ }
75
+ this.storedHasMore = state.hasMore;
76
+ if (state.serial > 0) {
77
+ this.seededSerial = state.serial;
78
+ this.channel.resumeFrom(state.serial);
79
+ this.channelStateOff = this.channel.on((change) => this.onChannelState(change));
80
+ }
81
+ }
82
+ /**
83
+ * The seeded cursor is judged by the first attach: `resumed: false` means the serial aged out
84
+ * of retention, so the stored copy may be missing messages and is thrown away.
85
+ */
86
+ onChannelState(change) {
87
+ if (change.current !== 'attached' || this.seededSerial === 0) {
88
+ return;
89
+ }
90
+ this.seededSerial = 0;
91
+ this.channelStateOff?.();
92
+ this.channelStateOff = null;
93
+ if (!change.resumed) {
94
+ void this.recoverFromLostCursor();
95
+ }
96
+ }
97
+ /**
98
+ * The stored window could not be stitched to the live stream, so drop it and fetch a fresh
99
+ * page, emitting the result to subscribers like live traffic (their render already happened
100
+ * from the stale copy).
101
+ */
102
+ async recoverFromLostCursor() {
103
+ try {
104
+ await this.storage.remove(this.roomName);
105
+ }
106
+ catch {
107
+ // Best effort: a failed remove leaves a stale copy that the next failed resume retries.
108
+ }
109
+ this.frameLog = [];
110
+ this.storedHasMore = true;
111
+ try {
112
+ const { messages: frames, more } = await this.channel.history({ limit: RECOVER_PAGE_LIMIT });
113
+ this.storedHasMore = more;
114
+ for (const frame of frames) {
115
+ this.addToFrameLog(frame);
116
+ if (frame.name !== MESSAGE_EVENT) {
117
+ continue;
118
+ }
119
+ const event = this.reconciler.apply(frame);
120
+ if (event === null) {
121
+ continue;
122
+ }
123
+ for (const listener of [...this.listeners]) {
124
+ listener(event);
125
+ }
126
+ }
127
+ this.schedulePersist();
128
+ }
129
+ catch {
130
+ // The room still works live; the next history() call backfills.
131
+ }
25
132
  }
26
133
  /** Send a new message. Returns the message optimistically; its `id` is stable. */
27
134
  async send(params) {
@@ -87,12 +194,22 @@ export class Messages {
87
194
  * `nextCursor`) to page further back.
88
195
  */
89
196
  async history(params) {
197
+ if (this.storage) {
198
+ await this.ready;
199
+ if (params?.cursor === undefined) {
200
+ const stored = this.storedPage(params?.limit ?? DEFAULT_HISTORY_LIMIT);
201
+ if (stored) {
202
+ return stored;
203
+ }
204
+ }
205
+ }
90
206
  const { messages: frames, more } = await this.channel.history({
91
207
  ...(params?.limit === undefined ? {} : { limit: params.limit }),
92
208
  ...(params?.cursor === undefined ? {} : { before: params.cursor }),
93
209
  });
94
210
  const touched = [];
95
211
  for (const frame of frames) {
212
+ this.addToFrameLog(frame);
96
213
  if (frame.name !== MESSAGE_EVENT) {
97
214
  continue;
98
215
  }
@@ -102,6 +219,7 @@ export class Messages {
102
219
  touched.push(id);
103
220
  }
104
221
  }
222
+ this.schedulePersist();
105
223
  const messages = touched
106
224
  .map((id) => this.reconciler.get(id))
107
225
  .filter((message) => message !== undefined);
@@ -111,20 +229,109 @@ export class Messages {
111
229
  ...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
112
230
  };
113
231
  }
232
+ /**
233
+ * Build the newest page from the stored window, or null when the window is too small for the
234
+ * request (fewer frames than asked and older messages remain on the server).
235
+ */
236
+ storedPage(limit) {
237
+ this.normalizeFrameLog();
238
+ if (this.frameLog.length === 0 || (this.frameLog.length < limit && this.storedHasMore)) {
239
+ return null;
240
+ }
241
+ const window = this.frameLog.slice(-limit);
242
+ const touched = [];
243
+ for (const frame of window) {
244
+ const id = messageIdOf(frame);
245
+ if (id !== null && !touched.includes(id)) {
246
+ touched.push(id);
247
+ }
248
+ }
249
+ const messages = touched
250
+ .map((id) => this.reconciler.get(id))
251
+ .filter((message) => message !== undefined);
252
+ return {
253
+ messages,
254
+ hasMore: this.storedHasMore || this.frameLog.length > window.length,
255
+ ...(window[0]?.seq === undefined ? {} : { nextCursor: window[0].seq }),
256
+ };
257
+ }
114
258
  /** Lazily attach the single channel subscription that feeds the reconciler. */
115
259
  ensureChannelSubscription() {
116
- if (this.channelUnsubscribe) {
260
+ if (this.channelUnsubscribe || this.pendingSubscribe) {
261
+ return;
262
+ }
263
+ if (!this.storage) {
264
+ this.channelUnsubscribe = this.channel.subscribe(MESSAGE_EVENT, (frame) => this.onLiveFrame(frame));
117
265
  return;
118
266
  }
119
- this.channelUnsubscribe = this.channel.subscribe(MESSAGE_EVENT, (frame) => {
120
- const event = this.reconciler.apply(frame);
121
- if (event === null) {
267
+ // With storage, the subscribe waits for the restore: the resume seed must be in place
268
+ // before the attach the subscription triggers, or the server backfills nothing.
269
+ this.pendingSubscribe = true;
270
+ void this.ready.then(() => {
271
+ this.pendingSubscribe = false;
272
+ if (this.channelUnsubscribe || this.listeners.size === 0) {
122
273
  return;
123
274
  }
275
+ this.channelUnsubscribe = this.channel.subscribe(MESSAGE_EVENT, (frame) => this.onLiveFrame(frame));
276
+ });
277
+ }
278
+ /** Apply one live frame, fan it out, and keep the stored window fresh. */
279
+ onLiveFrame(frame) {
280
+ this.addToFrameLog(frame);
281
+ const event = this.reconciler.apply(frame);
282
+ if (event !== null) {
124
283
  for (const listener of [...this.listeners]) {
125
284
  listener(event);
126
285
  }
127
- });
286
+ }
287
+ this.schedulePersist();
288
+ }
289
+ /** Track a sequenced frame for persistence. No-op without storage. */
290
+ addToFrameLog(frame) {
291
+ if (!this.storage || frame.seq === undefined || frame.seq <= 0) {
292
+ return;
293
+ }
294
+ this.frameLog.push(frame);
295
+ if (this.frameLog.length > PERSIST_MAX_FRAMES * 2) {
296
+ this.normalizeFrameLog();
297
+ }
298
+ }
299
+ /** Sort, dedupe by seq, and trim the frame log to the newest window. */
300
+ normalizeFrameLog() {
301
+ if (this.frameLog.length === 0) {
302
+ return;
303
+ }
304
+ const bySeq = new Map();
305
+ for (const frame of this.frameLog) {
306
+ bySeq.set(frame.seq, frame);
307
+ }
308
+ const sorted = [...bySeq.values()].sort((left, right) => left.seq - right.seq);
309
+ if (sorted.length > PERSIST_MAX_FRAMES) {
310
+ this.frameLog = sorted.slice(-PERSIST_MAX_FRAMES);
311
+ this.storedHasMore = true;
312
+ }
313
+ else {
314
+ this.frameLog = sorted;
315
+ }
316
+ }
317
+ /** Save the stored window shortly, coalescing bursts into one write. */
318
+ schedulePersist() {
319
+ if (!this.storage || this.persistTimer !== null) {
320
+ return;
321
+ }
322
+ this.persistTimer = setTimeout(() => {
323
+ this.persistTimer = null;
324
+ this.normalizeFrameLog();
325
+ if (this.frameLog.length === 0) {
326
+ return;
327
+ }
328
+ const serial = this.frameLog[this.frameLog.length - 1].seq;
329
+ void this.storage
330
+ .save(this.roomName, { frames: [...this.frameLog], serial, hasMore: this.storedHasMore })
331
+ .catch(() => {
332
+ // Best effort: a lost save costs the next load a server history fetch, nothing more.
333
+ });
334
+ }, PERSIST_DEBOUNCE_MS);
128
335
  }
129
336
  }
130
337
  /** The chat message id a frame refers to (payload `id`), or null if unparseable. */
@@ -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/room.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * machine.
6
6
  */
7
7
  import type { Channel, ChannelStateChange, UnsubscribeFn } from '@foony/realtime';
8
+ import type { ChatStorage } from './storage.js';
8
9
  import { Messages } from './messages.js';
9
10
  import { Occupancy } from './occupancy.js';
10
11
  import { Presence } from './presence.js';
@@ -34,7 +35,7 @@ export declare class Room {
34
35
  private hadBeenAttached;
35
36
  constructor(
36
37
  /** Room name (without the `chat:` channel prefix). */
37
- name: string, channel: Channel, getClientId: () => string | null, options?: RoomOptions);
38
+ name: string, channel: Channel, getClientId: () => string | null, options?: RoomOptions, storage?: ChatStorage | null);
38
39
  /** Current room status. */
39
40
  get status(): RoomStatus;
40
41
  /** Ensure the room is attached so messages and presence flow. */
package/lib/room.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1C,wEAAwE;AACxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAE7D,6EAA6E;AAC7E,qBAAa,IAAI;IAgBb,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjB1B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoC;IAC3E,OAAO,CAAC,eAAe,CAAS;;IAG9B,sDAAsD;IAC7C,IAAI,EAAE,MAAM,EACJ,OAAO,EAAE,OAAO,EACjC,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,OAAO,CAAC,EAAE,WAAW;IAUvB,2BAA2B;IAC3B,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED,iEAAiE;IAC3D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,sEAAsE;IAChE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,yEAAyE;IACzE,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,aAAa;IAI7E;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,aAAa;IAO/D,OAAO,CAAC,cAAc;CAavB"}
1
+ {"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1C,wEAAwE;AACxE,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAE7D,6EAA6E;AAC7E,qBAAa,IAAI;IAgBb,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjB1B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoC;IAC3E,OAAO,CAAC,eAAe,CAAS;;IAG9B,sDAAsD;IAC7C,IAAI,EAAE,MAAM,EACJ,OAAO,EAAE,OAAO,EACjC,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,OAAO,CAAC,EAAE,WAAW,EACrB,OAAO,GAAE,WAAW,GAAG,IAAW;IAUpC,2BAA2B;IAC3B,IAAI,MAAM,IAAI,UAAU,CAEvB;IAED,iEAAiE;IAC3D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,sEAAsE;IAChE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,yEAAyE;IACzE,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,GAAG,aAAa;IAI7E;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,aAAa;IAO/D,OAAO,CAAC,cAAc;CAavB"}
package/lib/room.js CHANGED
@@ -27,10 +27,10 @@ export class Room {
27
27
  hadBeenAttached = false;
28
28
  constructor(
29
29
  /** Room name (without the `chat:` channel prefix). */
30
- name, channel, getClientId, options) {
30
+ name, channel, getClientId, options, storage = null) {
31
31
  this.name = name;
32
32
  this.channel = channel;
33
- this.messages = new Messages(channel, name, getClientId);
33
+ this.messages = new Messages(channel, name, getClientId, storage);
34
34
  this.presence = new Presence(channel);
35
35
  this.typing = new Typing(channel, getClientId, options?.typing?.heartbeatThrottleMs);
36
36
  this.reactions = new Reactions(channel, getClientId);
package/lib/room.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
package/lib/rooms.d.ts CHANGED
@@ -5,13 +5,15 @@
5
5
  */
6
6
  import type { Realtime } from '@foony/realtime';
7
7
  import { Room } from './room.js';
8
+ import type { ChatStorage } from './storage.js';
8
9
  import type { RoomOptions } from './types.js';
9
10
  /** Factory and cache for {@link Room} instances on a {@link ChatClient}. */
10
11
  export declare class Rooms {
11
12
  private readonly realtime;
12
13
  private readonly getClientId;
14
+ private readonly storage;
13
15
  private readonly byName;
14
- constructor(realtime: Realtime, getClientId: () => string | null);
16
+ constructor(realtime: Realtime, getClientId: () => string | null, storage?: ChatStorage | null);
15
17
  /** Get (or create) the room named `name`. Stable instance per name. */
16
18
  get(name: string, options?: RoomOptions): Room;
17
19
  /** Detach and forget the room named `name`. No-op if not present. */
@@ -1 +1 @@
1
- {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,4EAA4E;AAC5E,qBAAa,KAAK;IAId,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAJ9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;gBAG/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI;IAGnD,uEAAuE;IACvE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAU9C,qEAAqE;IACrE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAS5B"}
1
+ {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../src/rooms.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,4EAA4E;AAC5E,qBAAa,KAAK;IAId,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;gBAG/B,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,MAAM,GAAG,IAAI,EAChC,OAAO,GAAE,WAAW,GAAG,IAAW;IAGrD,uEAAuE;IACvE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAU9C,qEAAqE;IACrE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAS5B"}
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"}