@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.
- package/CHANGELOG.md +33 -0
- package/lib/chatClient.d.ts +12 -1
- package/lib/chatClient.d.ts.map +1 -1
- package/lib/chatClient.js +2 -2
- package/lib/chatClient.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/messages.d.ts +45 -2
- package/lib/messages.d.ts.map +1 -1
- package/lib/messages.js +216 -16
- package/lib/messages.js.map +1 -1
- package/lib/room.d.ts +2 -1
- package/lib/room.d.ts.map +1 -1
- package/lib/room.js +2 -2
- package/lib/room.js.map +1 -1
- package/lib/rooms.d.ts +3 -1
- package/lib/rooms.d.ts.map +1 -1
- package/lib/rooms.js +4 -2
- package/lib/rooms.js.map +1 -1
- package/lib/storage.d.ts +33 -0
- package/lib/storage.d.ts.map +1 -0
- package/lib/storage.js +53 -0
- package/lib/storage.js.map +1 -0
- package/lib/types.d.ts +2 -2
- package/lib/types.d.ts.map +1 -1
- package/lib-cjs/chatClient.js +2 -2
- package/lib-cjs/chatClient.js.map +1 -1
- package/lib-cjs/index.js +3 -1
- package/lib-cjs/index.js.map +1 -1
- package/lib-cjs/messages.js +216 -16
- package/lib-cjs/messages.js.map +1 -1
- package/lib-cjs/room.js +2 -2
- package/lib-cjs/room.js.map +1 -1
- package/lib-cjs/rooms.js +4 -2
- package/lib-cjs/rooms.js.map +1 -1
- package/lib-cjs/storage.js +56 -0
- package/lib-cjs/storage.js.map +1 -0
- package/package.json +3 -2
- package/src/chatClient.ts +14 -2
- package/src/index.ts +2 -1
- package/src/messages.ts +224 -16
- package/src/room.ts +3 -1
- package/src/rooms.ts +3 -1
- package/src/storage.ts +80 -0
- package/src/types.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,39 @@
|
|
|
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.0
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **Rooms can persist between page loads.** Pass a storage to the client and a
|
|
11
|
+
returning visitor renders from their local copy while the server replays only
|
|
12
|
+
what they missed, so `history()` resolves instantly on repeat visits:
|
|
13
|
+
|
|
14
|
+
```js
|
|
15
|
+
const chat = new ChatClient(realtime, {
|
|
16
|
+
storage: indexedDbChatStorage() ?? undefined,
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`indexedDbChatStorage()` keeps the newest 300 messages per room in
|
|
21
|
+
IndexedDB and returns null where IndexedDB does not exist. If a stored
|
|
22
|
+
copy is too old to stitch to the live stream, it is dropped and history
|
|
23
|
+
is fetched fresh. Requires `@foony/realtime` 0.16.0.
|
|
24
|
+
|
|
25
|
+
## 0.2.0
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **Message retention now comes from the channel's namespace rule** instead of
|
|
30
|
+
a per-message TTL, which `@foony/realtime` 0.14.0 removed. `send`, `update`,
|
|
31
|
+
and `delete` behave the same, and messages persist as long as the app's plan
|
|
32
|
+
and namespace rule allow.
|
|
33
|
+
|
|
34
|
+
- **Breaking: `messages.history` pages by serial.** `cursor` (and a page's
|
|
35
|
+
`nextCursor`) is now the oldest message's serial, a number, instead of a
|
|
36
|
+
message id string. Paging cannot loop or skip when a message id is reused,
|
|
37
|
+
and deep scrollback is much faster. Requires `@foony/realtime` >= 0.14.0.
|
|
38
|
+
|
|
6
39
|
## 0.1.0
|
|
7
40
|
|
|
8
41
|
### Added
|
package/lib/chatClient.d.ts
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
|
/**
|
package/lib/chatClient.d.ts.map
CHANGED
|
@@ -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;
|
|
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() {
|
package/lib/chatClient.js.map
CHANGED
|
@@ -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;
|
|
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';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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
|
-
|
|
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). */
|
|
@@ -37,9 +67,22 @@ export declare class Messages {
|
|
|
37
67
|
*/
|
|
38
68
|
history(params?: {
|
|
39
69
|
limit?: number;
|
|
40
|
-
cursor?:
|
|
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
|
package/lib/messages.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
@@ -10,25 +10,125 @@ import { MESSAGE_EVENT, PAYLOAD_VERSION } from './protocol.js';
|
|
|
10
10
|
import { MessageReconciler } from './reconciler.js';
|
|
11
11
|
import { newMessageId } from './util.js';
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* persists as long as the plan allows — versus typing/reactions, which are left
|
|
16
|
-
* at the short ephemeral default. One year in milliseconds.
|
|
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.
|
|
17
15
|
*/
|
|
18
|
-
const
|
|
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;
|
|
19
23
|
/** The message feature of a {@link Room}. */
|
|
20
24
|
export class Messages {
|
|
21
25
|
channel;
|
|
22
26
|
roomName;
|
|
23
27
|
getClientId;
|
|
28
|
+
storage;
|
|
24
29
|
reconciler;
|
|
25
30
|
listeners = new Set();
|
|
26
31
|
channelUnsubscribe = null;
|
|
27
|
-
|
|
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) {
|
|
28
44
|
this.channel = channel;
|
|
29
45
|
this.roomName = roomName;
|
|
30
46
|
this.getClientId = getClientId;
|
|
47
|
+
this.storage = storage;
|
|
31
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
|
+
}
|
|
32
132
|
}
|
|
33
133
|
/** Send a new message. Returns the message optimistically; its `id` is stable. */
|
|
34
134
|
async send(params) {
|
|
@@ -41,7 +141,7 @@ export class Messages {
|
|
|
41
141
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
42
142
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
43
143
|
};
|
|
44
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
144
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
45
145
|
const now = new Date();
|
|
46
146
|
return {
|
|
47
147
|
id,
|
|
@@ -66,12 +166,12 @@ export class Messages {
|
|
|
66
166
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
67
167
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
68
168
|
};
|
|
69
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
169
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
70
170
|
}
|
|
71
171
|
/** Delete a message by id. */
|
|
72
172
|
async delete(id) {
|
|
73
173
|
const payload = { v: PAYLOAD_VERSION, action: 'delete', id };
|
|
74
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
174
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
75
175
|
}
|
|
76
176
|
/**
|
|
77
177
|
* Subscribe to live message changes. The first subscriber attaches the
|
|
@@ -94,12 +194,22 @@ export class Messages {
|
|
|
94
194
|
* `nextCursor`) to page further back.
|
|
95
195
|
*/
|
|
96
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
|
+
}
|
|
97
206
|
const { messages: frames, more } = await this.channel.history({
|
|
98
207
|
...(params?.limit === undefined ? {} : { limit: params.limit }),
|
|
99
|
-
...(params?.cursor === undefined ? {} : {
|
|
208
|
+
...(params?.cursor === undefined ? {} : { before: params.cursor }),
|
|
100
209
|
});
|
|
101
210
|
const touched = [];
|
|
102
211
|
for (const frame of frames) {
|
|
212
|
+
this.addToFrameLog(frame);
|
|
103
213
|
if (frame.name !== MESSAGE_EVENT) {
|
|
104
214
|
continue;
|
|
105
215
|
}
|
|
@@ -109,29 +219,119 @@ export class Messages {
|
|
|
109
219
|
touched.push(id);
|
|
110
220
|
}
|
|
111
221
|
}
|
|
222
|
+
this.schedulePersist();
|
|
112
223
|
const messages = touched
|
|
113
224
|
.map((id) => this.reconciler.get(id))
|
|
114
225
|
.filter((message) => message !== undefined);
|
|
115
226
|
return {
|
|
116
227
|
messages,
|
|
117
228
|
hasMore: more,
|
|
118
|
-
...(frames.length > 0 && frames[0] ? { nextCursor: frames[0].
|
|
229
|
+
...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
|
|
230
|
+
};
|
|
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 }),
|
|
119
256
|
};
|
|
120
257
|
}
|
|
121
258
|
/** Lazily attach the single channel subscription that feeds the reconciler. */
|
|
122
259
|
ensureChannelSubscription() {
|
|
123
|
-
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));
|
|
124
265
|
return;
|
|
125
266
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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) {
|
|
129
273
|
return;
|
|
130
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) {
|
|
131
283
|
for (const listener of [...this.listeners]) {
|
|
132
284
|
listener(event);
|
|
133
285
|
}
|
|
134
|
-
}
|
|
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);
|
|
135
335
|
}
|
|
136
336
|
}
|
|
137
337
|
/** The chat message id a frame refers to (payload `id`), or null if unparseable. */
|
package/lib/messages.js.map
CHANGED
|
@@ -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;
|
|
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":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,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;AASrC,6EAA6E;AAC7E,MAAM,OAAO,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,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,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"}
|
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. */
|
package/lib/rooms.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|