@foony/chat 0.0.1 → 0.2.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 +36 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/messages.d.ts +1 -1
- package/lib/messages.d.ts.map +1 -1
- package/lib/messages.js +5 -12
- package/lib/messages.js.map +1 -1
- package/lib/rooms.js +1 -1
- package/lib/rooms.js.map +1 -1
- package/lib/types.d.ts +10 -2
- package/lib/types.d.ts.map +1 -1
- package/lib-cjs/index.js +5 -1
- package/lib-cjs/index.js.map +1 -1
- package/lib-cjs/messages.js +5 -12
- package/lib-cjs/messages.js.map +1 -1
- package/lib-cjs/rooms.js +1 -1
- package/lib-cjs/rooms.js.map +1 -1
- package/package.json +5 -3
- package/src/index.ts +3 -0
- package/src/messages.ts +6 -14
- package/src/rooms.ts +1 -1
- package/src/types.ts +11 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@foony/chat`. Format loosely follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com); versions are semver.
|
|
5
|
+
|
|
6
|
+
## 0.2.0
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- **Message retention now comes from the channel's namespace rule** instead of
|
|
11
|
+
a per-message TTL, which `@foony/realtime` 0.14.0 removed. `send`, `update`,
|
|
12
|
+
and `delete` behave the same, and messages persist as long as the app's plan
|
|
13
|
+
and namespace rule allow.
|
|
14
|
+
|
|
15
|
+
- **Breaking: `messages.history` pages by serial.** `cursor` (and a page's
|
|
16
|
+
`nextCursor`) is now the oldest message's serial, a number, instead of a
|
|
17
|
+
message id string. Paging cannot loop or skip when a message id is reused,
|
|
18
|
+
and deep scrollback is much faster. Requires `@foony/realtime` >= 0.14.0.
|
|
19
|
+
|
|
20
|
+
## 0.1.0
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- **End-to-end room encryption.** `rooms.get(name, { cipher: { key } })`
|
|
25
|
+
encrypts every message, typing, reaction, and presence payload client-side, so
|
|
26
|
+
the edge only sees ciphertext. `generateRandomKey` and `CipherParams` are
|
|
27
|
+
re-exported for convenience. Requires `@foony/realtime` >= 0.3.0.
|
|
28
|
+
- **Durable message retention.** `messages.send/update/delete` request long
|
|
29
|
+
retention via per-message TTL; the edge clamps it to the app's plan, while
|
|
30
|
+
typing/reactions stay ephemeral.
|
|
31
|
+
|
|
32
|
+
## 0.0.1
|
|
33
|
+
|
|
34
|
+
- Initial release: rooms, messages (send/edit/delete, live subscribe, history
|
|
35
|
+
backfill), presence, typing indicators, room reactions, and presence-derived
|
|
36
|
+
occupancy.
|
package/lib/index.d.ts
CHANGED
|
@@ -15,5 +15,6 @@ export { Typing, type TypingListener } from './typing.js';
|
|
|
15
15
|
export { Reactions, type ReactionListener } from './reactions.js';
|
|
16
16
|
export { Occupancy, type OccupancyListener } from './occupancy.js';
|
|
17
17
|
export { MessageReconciler } from './reconciler.js';
|
|
18
|
+
export { generateRandomKey, type CipherParams } from '@foony/realtime';
|
|
18
19
|
export type { Message, MessageAction, ChatMessageEvent, SendMessageParams, UpdateMessageParams, MessagePage, PresenceMember, PresenceEvent, TypingEvent, RoomReaction, Occupancy as OccupancyData, RoomOptions, } from './types.js';
|
|
19
20
|
//# sourceMappingURL=index.d.ts.map
|
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;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;
|
|
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"}
|
package/lib/index.js
CHANGED
|
@@ -15,4 +15,7 @@ export { Typing } from './typing.js';
|
|
|
15
15
|
export { Reactions } from './reactions.js';
|
|
16
16
|
export { Occupancy } from './occupancy.js';
|
|
17
17
|
export { MessageReconciler } from './reconciler.js';
|
|
18
|
+
// Re-exported for convenience so chat users can set up room encryption without a
|
|
19
|
+
// direct @foony/realtime import.
|
|
20
|
+
export { generateRandomKey } from '@foony/realtime';
|
|
18
21
|
//# sourceMappingURL=index.js.map
|
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"}
|
|
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"}
|
package/lib/messages.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare class Messages {
|
|
|
37
37
|
*/
|
|
38
38
|
history(params?: {
|
|
39
39
|
limit?: number;
|
|
40
|
-
cursor?:
|
|
40
|
+
cursor?: number;
|
|
41
41
|
}): Promise<MessagePage>;
|
|
42
42
|
/** Lazily attach the single channel subscription that feeds the reconciler. */
|
|
43
43
|
private ensureChannelSubscription;
|
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,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"}
|
package/lib/messages.js
CHANGED
|
@@ -9,13 +9,6 @@
|
|
|
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
|
-
* Retention requested for chat messages: the maximum the platform offers (1
|
|
14
|
-
* year). The edge clamps this down to the app's plan ceiling, so a chat message
|
|
15
|
-
* persists as long as the plan allows — versus typing/reactions, which are left
|
|
16
|
-
* at the short ephemeral default. One year in milliseconds.
|
|
17
|
-
*/
|
|
18
|
-
const MESSAGE_TTL_MS = 365 * 24 * 60 * 60 * 1000;
|
|
19
12
|
/** The message feature of a {@link Room}. */
|
|
20
13
|
export class Messages {
|
|
21
14
|
channel;
|
|
@@ -41,7 +34,7 @@ export class Messages {
|
|
|
41
34
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
42
35
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
43
36
|
};
|
|
44
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
37
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
45
38
|
const now = new Date();
|
|
46
39
|
return {
|
|
47
40
|
id,
|
|
@@ -66,12 +59,12 @@ export class Messages {
|
|
|
66
59
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
67
60
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
68
61
|
};
|
|
69
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
62
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
70
63
|
}
|
|
71
64
|
/** Delete a message by id. */
|
|
72
65
|
async delete(id) {
|
|
73
66
|
const payload = { v: PAYLOAD_VERSION, action: 'delete', id };
|
|
74
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
67
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
75
68
|
}
|
|
76
69
|
/**
|
|
77
70
|
* Subscribe to live message changes. The first subscriber attaches the
|
|
@@ -96,7 +89,7 @@ export class Messages {
|
|
|
96
89
|
async history(params) {
|
|
97
90
|
const { messages: frames, more } = await this.channel.history({
|
|
98
91
|
...(params?.limit === undefined ? {} : { limit: params.limit }),
|
|
99
|
-
...(params?.cursor === undefined ? {} : {
|
|
92
|
+
...(params?.cursor === undefined ? {} : { before: params.cursor }),
|
|
100
93
|
});
|
|
101
94
|
const touched = [];
|
|
102
95
|
for (const frame of frames) {
|
|
@@ -115,7 +108,7 @@ export class Messages {
|
|
|
115
108
|
return {
|
|
116
109
|
messages,
|
|
117
110
|
hasMore: more,
|
|
118
|
-
...(frames.length > 0 && frames[0] ? { nextCursor: frames[0].
|
|
111
|
+
...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
|
|
119
112
|
};
|
|
120
113
|
}
|
|
121
114
|
/** Lazily attach the single channel subscription that feeds the reconciler. */
|
package/lib/messages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAKzC
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/lib/rooms.js
CHANGED
|
@@ -18,7 +18,7 @@ export class Rooms {
|
|
|
18
18
|
get(name, options) {
|
|
19
19
|
let existing = this.byName.get(name);
|
|
20
20
|
if (!existing) {
|
|
21
|
-
const channel = this.realtime.channels.get(roomChannelName(name));
|
|
21
|
+
const channel = this.realtime.channels.get(roomChannelName(name), options?.cipher ? { cipher: options.cipher } : undefined);
|
|
22
22
|
existing = new Room(name, channel, this.getClientId, options);
|
|
23
23
|
this.byName.set(name, existing);
|
|
24
24
|
}
|
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,CAAC,CAAC;
|
|
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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* stable `id` (so edit/delete reference it directly), and presence/typing/
|
|
6
6
|
* reactions/occupancy mirror the concepts without copying Ably's exact names.
|
|
7
7
|
*/
|
|
8
|
+
import type { CipherParams } from '@foony/realtime';
|
|
8
9
|
/** Latest action that produced a message's current state. */
|
|
9
10
|
export type MessageAction = 'create' | 'update' | 'delete';
|
|
10
11
|
/**
|
|
@@ -68,8 +69,8 @@ export type MessagePage = {
|
|
|
68
69
|
readonly messages: readonly Message[];
|
|
69
70
|
/** True when older messages remain beyond this page. */
|
|
70
71
|
readonly hasMore: boolean;
|
|
71
|
-
/** Cursor (oldest message
|
|
72
|
-
readonly nextCursor?:
|
|
72
|
+
/** Cursor (the page's oldest message serial) to pass back for the next page. */
|
|
73
|
+
readonly nextCursor?: number;
|
|
73
74
|
};
|
|
74
75
|
/** A single presence member in a room. */
|
|
75
76
|
export type PresenceMember = {
|
|
@@ -121,6 +122,13 @@ export type Occupancy = {
|
|
|
121
122
|
};
|
|
122
123
|
/** Per-room configuration. */
|
|
123
124
|
export type RoomOptions = {
|
|
125
|
+
/**
|
|
126
|
+
* Enable end-to-end encryption for the room. All message, typing, reaction, and
|
|
127
|
+
* presence payloads are encrypted client-side with this key, so the edge only
|
|
128
|
+
* sees ciphertext. Share the key between members out of band (e.g.
|
|
129
|
+
* `generateRandomKey`); never send it to the server.
|
|
130
|
+
*/
|
|
131
|
+
readonly cipher?: CipherParams;
|
|
124
132
|
/** Typing config. */
|
|
125
133
|
readonly typing?: {
|
|
126
134
|
/**
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,oCAAoC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,mBAAmB,GAAG;IAChC,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,aAAa,GAAG;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG;IACxB,mCAAmC;IACnC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACtF,CAAC;AAEF,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,SAAS,GAAG;IACtB,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF,8BAA8B;AAC9B,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,qBAAqB;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB;;;;WAIG;QACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;KACvC,CAAC;IACF,wBAAwB;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,uEAAuE;QACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH,CAAC"}
|
package/lib-cjs/index.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* package (planned as a separate `@foony/chat/react` subpath).
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
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.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
14
|
var rooms_js_1 = require("./rooms.js");
|
|
@@ -27,4 +27,8 @@ var occupancy_js_1 = require("./occupancy.js");
|
|
|
27
27
|
Object.defineProperty(exports, "Occupancy", { enumerable: true, get: function () { return occupancy_js_1.Occupancy; } });
|
|
28
28
|
var reconciler_js_1 = require("./reconciler.js");
|
|
29
29
|
Object.defineProperty(exports, "MessageReconciler", { enumerable: true, get: function () { return reconciler_js_1.MessageReconciler; } });
|
|
30
|
+
// Re-exported for convenience so chat users can set up room encryption without a
|
|
31
|
+
// direct @foony/realtime import.
|
|
32
|
+
var realtime_1 = require("@foony/realtime");
|
|
33
|
+
Object.defineProperty(exports, "generateRandomKey", { enumerable: true, get: function () { return realtime_1.generateRandomKey; } });
|
|
30
34
|
//# sourceMappingURL=index.js.map
|
package/lib-cjs/index.js.map
CHANGED
|
@@ -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"}
|
|
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"}
|
package/lib-cjs/messages.js
CHANGED
|
@@ -12,13 +12,6 @@ exports.Messages = void 0;
|
|
|
12
12
|
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
|
-
/**
|
|
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.
|
|
20
|
-
*/
|
|
21
|
-
const MESSAGE_TTL_MS = 365 * 24 * 60 * 60 * 1000;
|
|
22
15
|
/** The message feature of a {@link Room}. */
|
|
23
16
|
class Messages {
|
|
24
17
|
channel;
|
|
@@ -44,7 +37,7 @@ class Messages {
|
|
|
44
37
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
45
38
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
46
39
|
};
|
|
47
|
-
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload
|
|
40
|
+
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
|
|
48
41
|
const now = new Date();
|
|
49
42
|
return {
|
|
50
43
|
id,
|
|
@@ -69,12 +62,12 @@ class Messages {
|
|
|
69
62
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
70
63
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
71
64
|
};
|
|
72
|
-
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload
|
|
65
|
+
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
|
|
73
66
|
}
|
|
74
67
|
/** Delete a message by id. */
|
|
75
68
|
async delete(id) {
|
|
76
69
|
const payload = { v: protocol_js_1.PAYLOAD_VERSION, action: 'delete', id };
|
|
77
|
-
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload
|
|
70
|
+
await this.channel.publish(protocol_js_1.MESSAGE_EVENT, payload);
|
|
78
71
|
}
|
|
79
72
|
/**
|
|
80
73
|
* Subscribe to live message changes. The first subscriber attaches the
|
|
@@ -99,7 +92,7 @@ class Messages {
|
|
|
99
92
|
async history(params) {
|
|
100
93
|
const { messages: frames, more } = await this.channel.history({
|
|
101
94
|
...(params?.limit === undefined ? {} : { limit: params.limit }),
|
|
102
|
-
...(params?.cursor === undefined ? {} : {
|
|
95
|
+
...(params?.cursor === undefined ? {} : { before: params.cursor }),
|
|
103
96
|
});
|
|
104
97
|
const touched = [];
|
|
105
98
|
for (const frame of frames) {
|
|
@@ -118,7 +111,7 @@ class Messages {
|
|
|
118
111
|
return {
|
|
119
112
|
messages,
|
|
120
113
|
hasMore: more,
|
|
121
|
-
...(frames.length > 0 && frames[0] ? { nextCursor: frames[0].
|
|
114
|
+
...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
|
|
122
115
|
};
|
|
123
116
|
}
|
|
124
117
|
/** Lazily attach the single channel subscription that feeds the reconciler. */
|
package/lib-cjs/messages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,+CAAoF;AACpF,mDAAoD;AAEpD,uCAAyC;AAKzC
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|
package/lib-cjs/rooms.js
CHANGED
|
@@ -21,7 +21,7 @@ class Rooms {
|
|
|
21
21
|
get(name, options) {
|
|
22
22
|
let existing = this.byName.get(name);
|
|
23
23
|
if (!existing) {
|
|
24
|
-
const channel = this.realtime.channels.get((0, protocol_js_1.roomChannelName)(name));
|
|
24
|
+
const channel = this.realtime.channels.get((0, protocol_js_1.roomChannelName)(name), options?.cipher ? { cipher: options.cipher } : undefined);
|
|
25
25
|
existing = new room_js_1.Room(name, channel, this.getClientId, options);
|
|
26
26
|
this.byName.set(name, existing);
|
|
27
27
|
}
|
package/lib-cjs/rooms.js.map
CHANGED
|
@@ -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,CAAC,CAAC;
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foony/chat",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Chat API (rooms, messages, typing, reactions, presence, occupancy) built on @foony/realtime.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"lib-cjs",
|
|
24
24
|
"lib",
|
|
25
25
|
"src/**/*.ts",
|
|
26
|
-
"!src/**/*.test.ts"
|
|
26
|
+
"!src/**/*.test.ts",
|
|
27
|
+
"CHANGELOG.md"
|
|
27
28
|
],
|
|
28
29
|
"exports": {
|
|
29
30
|
".": {
|
|
@@ -34,6 +35,7 @@
|
|
|
34
35
|
}
|
|
35
36
|
},
|
|
36
37
|
"scripts": {
|
|
38
|
+
"prepublishOnly": "npm run build && npm test",
|
|
37
39
|
"build": "tsc && tsc -p tsconfig.cjs.json && node ./scripts/write-cjs-package-json.mjs",
|
|
38
40
|
"test": "vitest run",
|
|
39
41
|
"test:watch": "vitest"
|
|
@@ -42,7 +44,7 @@
|
|
|
42
44
|
"access": "public"
|
|
43
45
|
},
|
|
44
46
|
"peerDependencies": {
|
|
45
|
-
"@foony/realtime": ">=0.
|
|
47
|
+
"@foony/realtime": ">=0.14.0"
|
|
46
48
|
},
|
|
47
49
|
"devDependencies": {
|
|
48
50
|
"@foony/realtime": "file:../realtime-js",
|
package/src/index.ts
CHANGED
|
@@ -16,6 +16,9 @@ export { Typing, type TypingListener } from './typing.js';
|
|
|
16
16
|
export { Reactions, type ReactionListener } from './reactions.js';
|
|
17
17
|
export { Occupancy, type OccupancyListener } from './occupancy.js';
|
|
18
18
|
export { MessageReconciler } from './reconciler.js';
|
|
19
|
+
// Re-exported for convenience so chat users can set up room encryption without a
|
|
20
|
+
// direct @foony/realtime import.
|
|
21
|
+
export { generateRandomKey, type CipherParams } from '@foony/realtime';
|
|
19
22
|
export type {
|
|
20
23
|
Message,
|
|
21
24
|
MessageAction,
|
package/src/messages.ts
CHANGED
|
@@ -16,14 +16,6 @@ import { newMessageId } from './util.js';
|
|
|
16
16
|
/** Listener invoked for every materialized message change on the room. */
|
|
17
17
|
export type MessageListener = (event: ChatMessageEvent) => void;
|
|
18
18
|
|
|
19
|
-
/**
|
|
20
|
-
* Retention requested for chat messages: the maximum the platform offers (1
|
|
21
|
-
* year). The edge clamps this down to the app's plan ceiling, so a chat message
|
|
22
|
-
* persists as long as the plan allows — versus typing/reactions, which are left
|
|
23
|
-
* at the short ephemeral default. One year in milliseconds.
|
|
24
|
-
*/
|
|
25
|
-
const MESSAGE_TTL_MS = 365 * 24 * 60 * 60 * 1000;
|
|
26
|
-
|
|
27
19
|
/** The message feature of a {@link Room}. */
|
|
28
20
|
export class Messages {
|
|
29
21
|
private readonly reconciler: MessageReconciler;
|
|
@@ -49,7 +41,7 @@ export class Messages {
|
|
|
49
41
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
50
42
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
51
43
|
};
|
|
52
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
44
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
53
45
|
const now = new Date();
|
|
54
46
|
return {
|
|
55
47
|
id,
|
|
@@ -75,13 +67,13 @@ export class Messages {
|
|
|
75
67
|
...(params.metadata === undefined ? {} : { metadata: params.metadata }),
|
|
76
68
|
...(params.headers === undefined ? {} : { headers: params.headers }),
|
|
77
69
|
};
|
|
78
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
70
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
79
71
|
}
|
|
80
72
|
|
|
81
73
|
/** Delete a message by id. */
|
|
82
74
|
async delete(id: string): Promise<void> {
|
|
83
75
|
const payload: MessagePayload = { v: PAYLOAD_VERSION, action: 'delete', id };
|
|
84
|
-
await this.channel.publish(MESSAGE_EVENT, payload
|
|
76
|
+
await this.channel.publish(MESSAGE_EVENT, payload);
|
|
85
77
|
}
|
|
86
78
|
|
|
87
79
|
/**
|
|
@@ -105,10 +97,10 @@ export class Messages {
|
|
|
105
97
|
* reconciler as the live stream. Pass `cursor` (a previous page's
|
|
106
98
|
* `nextCursor`) to page further back.
|
|
107
99
|
*/
|
|
108
|
-
async history(params?: { limit?: number; cursor?:
|
|
100
|
+
async history(params?: { limit?: number; cursor?: number }): Promise<MessagePage> {
|
|
109
101
|
const { messages: frames, more } = await this.channel.history({
|
|
110
102
|
...(params?.limit === undefined ? {} : { limit: params.limit }),
|
|
111
|
-
...(params?.cursor === undefined ? {} : {
|
|
103
|
+
...(params?.cursor === undefined ? {} : { before: params.cursor }),
|
|
112
104
|
});
|
|
113
105
|
const touched: string[] = [];
|
|
114
106
|
for (const frame of frames) {
|
|
@@ -127,7 +119,7 @@ export class Messages {
|
|
|
127
119
|
return {
|
|
128
120
|
messages,
|
|
129
121
|
hasMore: more,
|
|
130
|
-
...(frames.length > 0 && frames[0] ? { nextCursor: frames[0].
|
|
122
|
+
...(frames.length > 0 && frames[0]?.seq !== undefined ? { nextCursor: frames[0].seq } : {}),
|
|
131
123
|
};
|
|
132
124
|
}
|
|
133
125
|
|
package/src/rooms.ts
CHANGED
|
@@ -22,7 +22,7 @@ export class Rooms {
|
|
|
22
22
|
get(name: string, options?: RoomOptions): Room {
|
|
23
23
|
let existing = this.byName.get(name);
|
|
24
24
|
if (!existing) {
|
|
25
|
-
const channel = this.realtime.channels.get(roomChannelName(name));
|
|
25
|
+
const channel = this.realtime.channels.get(roomChannelName(name), options?.cipher ? { cipher: options.cipher } : undefined);
|
|
26
26
|
existing = new Room(name, channel, this.getClientId, options);
|
|
27
27
|
this.byName.set(name, existing);
|
|
28
28
|
}
|
package/src/types.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* reactions/occupancy mirror the concepts without copying Ably's exact names.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import type { CipherParams } from '@foony/realtime';
|
|
10
|
+
|
|
9
11
|
/** Latest action that produced a message's current state. */
|
|
10
12
|
export type MessageAction = 'create' | 'update' | 'delete';
|
|
11
13
|
|
|
@@ -68,8 +70,8 @@ export type MessagePage = {
|
|
|
68
70
|
readonly messages: readonly Message[];
|
|
69
71
|
/** True when older messages remain beyond this page. */
|
|
70
72
|
readonly hasMore: boolean;
|
|
71
|
-
/** Cursor (oldest message
|
|
72
|
-
readonly nextCursor?:
|
|
73
|
+
/** Cursor (the page's oldest message serial) to pass back for the next page. */
|
|
74
|
+
readonly nextCursor?: number;
|
|
73
75
|
};
|
|
74
76
|
|
|
75
77
|
/** A single presence member in a room. */
|
|
@@ -124,6 +126,13 @@ export type Occupancy = {
|
|
|
124
126
|
|
|
125
127
|
/** Per-room configuration. */
|
|
126
128
|
export type RoomOptions = {
|
|
129
|
+
/**
|
|
130
|
+
* Enable end-to-end encryption for the room. All message, typing, reaction, and
|
|
131
|
+
* presence payloads are encrypted client-side with this key, so the edge only
|
|
132
|
+
* sees ciphertext. Share the key between members out of band (e.g.
|
|
133
|
+
* `generateRandomKey`); never send it to the server.
|
|
134
|
+
*/
|
|
135
|
+
readonly cipher?: CipherParams;
|
|
127
136
|
/** Typing config. */
|
|
128
137
|
readonly typing?: {
|
|
129
138
|
/**
|