@foony/chat 0.0.1 → 0.1.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 +22 -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/rooms.js +1 -1
- package/lib/rooms.js.map +1 -1
- package/lib/types.d.ts +8 -0
- 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/rooms.js +1 -1
- package/lib-cjs/rooms.js.map +1 -1
- package/package.json +4 -3
- package/src/index.ts +3 -0
- package/src/rooms.ts +1 -1
- package/src/types.ts +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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.1.0
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
|
|
10
|
+
- **End-to-end room encryption.** `rooms.get(name, { cipher: { key } })`
|
|
11
|
+
encrypts every message, typing, reaction, and presence payload client-side, so
|
|
12
|
+
the edge only sees ciphertext. `generateRandomKey` and `CipherParams` are
|
|
13
|
+
re-exported for convenience. Requires `@foony/realtime` >= 0.3.0.
|
|
14
|
+
- **Durable message retention.** `messages.send/update/delete` request long
|
|
15
|
+
retention via per-message TTL; the edge clamps it to the app's plan, while
|
|
16
|
+
typing/reactions stay ephemeral.
|
|
17
|
+
|
|
18
|
+
## 0.0.1
|
|
19
|
+
|
|
20
|
+
- Initial release: rooms, messages (send/edit/delete, live subscribe, history
|
|
21
|
+
backfill), presence, typing indicators, room reactions, and presence-derived
|
|
22
|
+
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/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
|
/**
|
|
@@ -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":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
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/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.1.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
|
".": {
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
"access": "public"
|
|
43
44
|
},
|
|
44
45
|
"peerDependencies": {
|
|
45
|
-
"@foony/realtime": ">=0.
|
|
46
|
+
"@foony/realtime": ">=0.3.0"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
49
|
"@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/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
|
|
|
@@ -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
|
/**
|