@waitaya.buc/client-js 0.1.0-alpha.2 → 0.1.0-alpha.4
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/README.md +13 -6
- package/dist/adapters/livekit/livekit.adapter.d.ts.map +1 -1
- package/dist/adapters/livekit/livekit.adapter.js +3 -1
- package/dist/adapters/livekit/livekit.adapter.js.map +1 -1
- package/dist/adapters/livekit/react-native.d.ts +1 -7
- package/dist/adapters/livekit/react-native.d.ts.map +1 -1
- package/dist/adapters/livekit/react-native.js +5 -0
- package/dist/adapters/livekit/react-native.js.map +1 -1
- package/dist/adapters/livekit/service-adapters/chat.adapter.d.ts +36 -0
- package/dist/adapters/livekit/service-adapters/chat.adapter.d.ts.map +1 -0
- package/dist/adapters/livekit/service-adapters/chat.adapter.js +145 -0
- package/dist/adapters/livekit/service-adapters/chat.adapter.js.map +1 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts +1 -0
- package/dist/adapters/livekit/service-adapters/index.d.ts.map +1 -1
- package/dist/adapters/livekit/service-adapters/index.js +1 -0
- package/dist/adapters/livekit/service-adapters/index.js.map +1 -1
- package/dist/core/errors/error-codes.d.ts +6 -0
- package/dist/core/errors/error-codes.d.ts.map +1 -1
- package/dist/core/errors/error-codes.js +6 -0
- package/dist/core/errors/error-codes.js.map +1 -1
- package/dist/core/errors/vroom.error.d.ts +18 -0
- package/dist/core/errors/vroom.error.d.ts.map +1 -1
- package/dist/core/errors/vroom.error.js +27 -0
- package/dist/core/errors/vroom.error.js.map +1 -1
- package/dist/core/ports/outbound/chat-adapter.port.d.ts +29 -0
- package/dist/core/ports/outbound/chat-adapter.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/chat-adapter.port.js +2 -0
- package/dist/core/ports/outbound/chat-adapter.port.js.map +1 -0
- package/dist/core/ports/outbound/react-native-bindings.port.d.ts +39 -0
- package/dist/core/ports/outbound/react-native-bindings.port.d.ts.map +1 -0
- package/dist/core/ports/outbound/react-native-bindings.port.js +2 -0
- package/dist/core/ports/outbound/react-native-bindings.port.js.map +1 -0
- package/dist/core/services/chat.service.d.ts +56 -0
- package/dist/core/services/chat.service.d.ts.map +1 -0
- package/dist/core/services/chat.service.js +293 -0
- package/dist/core/services/chat.service.js.map +1 -0
- package/dist/core/session.d.ts +3 -0
- package/dist/core/session.d.ts.map +1 -1
- package/dist/core/session.js +10 -5
- package/dist/core/session.js.map +1 -1
- package/dist/core/types/chat.types.d.ts +157 -0
- package/dist/core/types/chat.types.d.ts.map +1 -0
- package/dist/core/types/chat.types.js +28 -0
- package/dist/core/types/chat.types.js.map +1 -0
- package/dist/core/types/service-adapters.types.d.ts +3 -2
- package/dist/core/types/service-adapters.types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/react-native.d.ts +17 -0
- package/dist/react-native.d.ts.map +1 -0
- package/dist/react-native.js +17 -0
- package/dist/react-native.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract that React Native bindings of any provider adapter must satisfy.
|
|
3
|
+
*
|
|
4
|
+
* Scope: This port currently reflects the **WebRTC family** of providers
|
|
5
|
+
* (LiveKit, Daily, Twilio Video, etc.) which all expose `RTCView` from
|
|
6
|
+
* `react-native-webrtc` and a `MediaStream` with `.toURL()`.
|
|
7
|
+
*
|
|
8
|
+
* If a non-WebRTC provider (e.g., Agora with `RtcSurfaceView`) is added
|
|
9
|
+
* later, do NOT force-fit it into this shape — split into a parallel port
|
|
10
|
+
* or generalize this one with a clear migration plan. The current shape
|
|
11
|
+
* is intentional, not a placeholder.
|
|
12
|
+
*
|
|
13
|
+
* This is an **optional contract** — only providers that support React
|
|
14
|
+
* Native need to satisfy it. Web-only adapters can ignore this port.
|
|
15
|
+
*/
|
|
16
|
+
export interface ReactNativeBindings {
|
|
17
|
+
RTCView: ReactComponentType<RTCViewProps>;
|
|
18
|
+
MediaStream: new (...args: never[]) => MediaStreamLike;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Minimal structural type matching React's `ComponentType`.
|
|
22
|
+
*
|
|
23
|
+
* Defined locally so this port (and the core) does not take a dependency on
|
|
24
|
+
* `react` types. Adapters that import `ComponentType` from `react` will
|
|
25
|
+
* remain assignable to this shape via structural typing.
|
|
26
|
+
*/
|
|
27
|
+
export type ReactComponentType<P> = (props: P) => unknown;
|
|
28
|
+
export interface RTCViewProps {
|
|
29
|
+
streamURL: string | null;
|
|
30
|
+
objectFit?: 'cover' | 'contain';
|
|
31
|
+
mirror?: boolean;
|
|
32
|
+
zOrder?: number;
|
|
33
|
+
style?: unknown;
|
|
34
|
+
}
|
|
35
|
+
export interface MediaStreamLike {
|
|
36
|
+
toURL(): string;
|
|
37
|
+
readonly id: string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=react-native-bindings.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-bindings.port.d.ts","sourceRoot":"","sources":["../../../../src/core/ports/outbound/react-native-bindings.port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAA;IACzC,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,eAAe,CAAA;CACvD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAA;AAEzD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-native-bindings.port.js","sourceRoot":"","sources":["../../../../src/core/ports/outbound/react-native-bindings.port.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ChatAdapter } from '../ports/outbound/chat-adapter.port';
|
|
2
|
+
import type { User } from '../types/user.types';
|
|
3
|
+
import { type ChatEventMap, type ChatEventName, type ChatSendParams } from '../types/chat.types';
|
|
4
|
+
import { BaseService } from './base.service';
|
|
5
|
+
/**
|
|
6
|
+
* Dependencies injected by the Session composition root.
|
|
7
|
+
*/
|
|
8
|
+
export interface ChatServiceDeps {
|
|
9
|
+
/** Local user id */
|
|
10
|
+
localUserId: string;
|
|
11
|
+
/** Whether the local user is allowed to perform moderation actions */
|
|
12
|
+
canModerate: () => boolean;
|
|
13
|
+
/** Resolve a user id to a `User` object for event payload hydration */
|
|
14
|
+
resolveUser: (userId: string) => User | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare class ChatService extends BaseService {
|
|
17
|
+
private adapter;
|
|
18
|
+
private deps;
|
|
19
|
+
private eventHandlers;
|
|
20
|
+
private unsubscribes;
|
|
21
|
+
private sendTimestamps;
|
|
22
|
+
private seenMsgIds;
|
|
23
|
+
private seenMsgIdSet;
|
|
24
|
+
private mutedUserIds;
|
|
25
|
+
private roomMuted;
|
|
26
|
+
constructor(adapter: ChatAdapter, deps: ChatServiceDeps);
|
|
27
|
+
/**
|
|
28
|
+
* Send a chat message.
|
|
29
|
+
* @throws ChatMutedError if the room or local user is muted
|
|
30
|
+
* @throws ChatRateLimitedError if the per-second send budget is exhausted
|
|
31
|
+
* @throws ChatSendTimeoutError if the send does not complete in time
|
|
32
|
+
*/
|
|
33
|
+
send(params: ChatSendParams): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Set typing indicator state. Fire-and-forget; failures are swallowed
|
|
36
|
+
* because typing is best-effort.
|
|
37
|
+
*/
|
|
38
|
+
setTyping(isTyping: boolean): void;
|
|
39
|
+
muteParticipant(userId: string): Promise<void>;
|
|
40
|
+
unmuteParticipant(userId: string): Promise<void>;
|
|
41
|
+
muteRoom(): Promise<void>;
|
|
42
|
+
unmuteRoom(): Promise<void>;
|
|
43
|
+
on<E extends ChatEventName>(event: E, handler: ChatEventMap[E]): void;
|
|
44
|
+
off<E extends ChatEventName>(event?: E, handler?: ChatEventMap[E]): void;
|
|
45
|
+
/** @internal */
|
|
46
|
+
destroy(): void;
|
|
47
|
+
private setupListeners;
|
|
48
|
+
private handleIncomingMessage;
|
|
49
|
+
private handleIncomingTyping;
|
|
50
|
+
private handleIncomingControl;
|
|
51
|
+
private tryAcquireRateLimit;
|
|
52
|
+
private recordSeen;
|
|
53
|
+
private assertCanModerate;
|
|
54
|
+
private emit;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=chat.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/chat.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,aAAa,EAElB,KAAK,cAAc,EAIpB,MAAM,qBAAqB,CAAA;AAQ5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,WAAW,EAAE,MAAM,OAAO,CAAA;IAC1B,uEAAuE;IACvE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,CAAA;CAClD;AAWD,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,IAAI,CAAiB;IAE7B,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,YAAY,CAAwB;IAE5C,OAAO,CAAC,cAAc,CAAe;IAErC,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,YAAY,CAAyB;IAE7C,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,SAAS,CAAQ;gBAEb,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe;IAOvD;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAW5B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAchD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAUzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,EAAE,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAOrE,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAYxE,gBAAgB;IAChB,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,IAAI;CASb"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { ChatEvent, CHAT_RATE_LIMIT_PER_SECOND, CHAT_SEND_TIMEOUT_MS, } from '../types/chat.types';
|
|
2
|
+
import { ChatMutedError, ChatRateLimitedError, ChatSendTimeoutError, PermissionDeniedError, VroomError, } from '../errors/vroom.error';
|
|
3
|
+
import { BaseService } from './base.service';
|
|
4
|
+
/**
|
|
5
|
+
* Chat service — domain logic for real-time messaging.
|
|
6
|
+
*
|
|
7
|
+
* Owns rate limiting, send timeout, dedup, client-side mute enforcement,
|
|
8
|
+
* user hydration, and role-based authorization. The transport itself is
|
|
9
|
+
* provided by an injected `ChatAdapter`.
|
|
10
|
+
*/
|
|
11
|
+
const SEEN_MSG_CACHE_SIZE = 500;
|
|
12
|
+
export class ChatService extends BaseService {
|
|
13
|
+
constructor(adapter, deps) {
|
|
14
|
+
super();
|
|
15
|
+
this.eventHandlers = new Map();
|
|
16
|
+
this.unsubscribes = [];
|
|
17
|
+
this.sendTimestamps = [];
|
|
18
|
+
this.seenMsgIds = [];
|
|
19
|
+
this.seenMsgIdSet = new Set();
|
|
20
|
+
this.mutedUserIds = new Set();
|
|
21
|
+
this.roomMuted = false;
|
|
22
|
+
this.adapter = adapter;
|
|
23
|
+
this.deps = deps;
|
|
24
|
+
this.setupListeners();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Send a chat message.
|
|
28
|
+
* @throws ChatMutedError if the room or local user is muted
|
|
29
|
+
* @throws ChatRateLimitedError if the per-second send budget is exhausted
|
|
30
|
+
* @throws ChatSendTimeoutError if the send does not complete in time
|
|
31
|
+
*/
|
|
32
|
+
async send(params) {
|
|
33
|
+
const clientMsgId = generateMsgId();
|
|
34
|
+
const timestamp = Date.now();
|
|
35
|
+
if (this.roomMuted) {
|
|
36
|
+
throw new ChatMutedError('Room chat is muted');
|
|
37
|
+
}
|
|
38
|
+
if (this.mutedUserIds.has(this.deps.localUserId)) {
|
|
39
|
+
throw new ChatMutedError('You have been muted');
|
|
40
|
+
}
|
|
41
|
+
if (!this.tryAcquireRateLimit()) {
|
|
42
|
+
throw new ChatRateLimitedError(`Rate limit exceeded (${CHAT_RATE_LIMIT_PER_SECOND} msg/s)`);
|
|
43
|
+
}
|
|
44
|
+
const message = {
|
|
45
|
+
clientMsgId,
|
|
46
|
+
senderId: this.deps.localUserId,
|
|
47
|
+
text: params.text,
|
|
48
|
+
timestamp,
|
|
49
|
+
to: params.to,
|
|
50
|
+
metadata: params.metadata,
|
|
51
|
+
};
|
|
52
|
+
const recipient = params.to
|
|
53
|
+
? { kind: 'user', userId: params.to }
|
|
54
|
+
: { kind: 'room' };
|
|
55
|
+
this.emit(ChatEvent.MessageSending, {
|
|
56
|
+
clientMsgId,
|
|
57
|
+
text: params.text,
|
|
58
|
+
to: params.to,
|
|
59
|
+
timestamp,
|
|
60
|
+
});
|
|
61
|
+
try {
|
|
62
|
+
await withTimeout(this.adapter.sendMessage(message, recipient), CHAT_SEND_TIMEOUT_MS, () => new ChatSendTimeoutError(`Chat send timed out after ${CHAT_SEND_TIMEOUT_MS}ms`));
|
|
63
|
+
this.emit(ChatEvent.MessageSent, {
|
|
64
|
+
clientMsgId,
|
|
65
|
+
timestamp: Date.now(),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
this.emit(ChatEvent.MessageFailed, {
|
|
70
|
+
clientMsgId,
|
|
71
|
+
reason: classifyFailure(error),
|
|
72
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
73
|
+
timestamp: Date.now(),
|
|
74
|
+
});
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set typing indicator state. Fire-and-forget; failures are swallowed
|
|
80
|
+
* because typing is best-effort.
|
|
81
|
+
*/
|
|
82
|
+
setTyping(isTyping) {
|
|
83
|
+
const state = {
|
|
84
|
+
senderId: this.deps.localUserId,
|
|
85
|
+
isTyping,
|
|
86
|
+
timestamp: Date.now(),
|
|
87
|
+
};
|
|
88
|
+
void this.adapter.sendTyping(state).catch(() => undefined);
|
|
89
|
+
}
|
|
90
|
+
// ─── Moderation ──────────────────────────────────────────────────
|
|
91
|
+
async muteParticipant(userId) {
|
|
92
|
+
this.assertCanModerate();
|
|
93
|
+
await this.adapter.sendControl({
|
|
94
|
+
type: 'MUTE_PARTICIPANT',
|
|
95
|
+
targetUserId: userId,
|
|
96
|
+
timestamp: Date.now(),
|
|
97
|
+
});
|
|
98
|
+
this.mutedUserIds.add(userId);
|
|
99
|
+
this.emit(ChatEvent.ParticipantMuted, {
|
|
100
|
+
userId,
|
|
101
|
+
timestamp: Date.now(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async unmuteParticipant(userId) {
|
|
105
|
+
this.assertCanModerate();
|
|
106
|
+
await this.adapter.sendControl({
|
|
107
|
+
type: 'UNMUTE_PARTICIPANT',
|
|
108
|
+
targetUserId: userId,
|
|
109
|
+
timestamp: Date.now(),
|
|
110
|
+
});
|
|
111
|
+
this.mutedUserIds.delete(userId);
|
|
112
|
+
this.emit(ChatEvent.ParticipantUnmuted, {
|
|
113
|
+
userId,
|
|
114
|
+
timestamp: Date.now(),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async muteRoom() {
|
|
118
|
+
this.assertCanModerate();
|
|
119
|
+
await this.adapter.sendControl({
|
|
120
|
+
type: 'MUTE_ROOM',
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
});
|
|
123
|
+
this.roomMuted = true;
|
|
124
|
+
this.emit(ChatEvent.RoomMuted, { timestamp: Date.now() });
|
|
125
|
+
}
|
|
126
|
+
async unmuteRoom() {
|
|
127
|
+
this.assertCanModerate();
|
|
128
|
+
await this.adapter.sendControl({
|
|
129
|
+
type: 'UNMUTE_ROOM',
|
|
130
|
+
timestamp: Date.now(),
|
|
131
|
+
});
|
|
132
|
+
this.roomMuted = false;
|
|
133
|
+
this.emit(ChatEvent.RoomUnmuted, { timestamp: Date.now() });
|
|
134
|
+
}
|
|
135
|
+
// ─── Events ──────────────────────────────────────────────────────
|
|
136
|
+
on(event, handler) {
|
|
137
|
+
if (!this.eventHandlers.has(event)) {
|
|
138
|
+
this.eventHandlers.set(event, new Set());
|
|
139
|
+
}
|
|
140
|
+
this.eventHandlers.get(event).add(handler);
|
|
141
|
+
}
|
|
142
|
+
off(event, handler) {
|
|
143
|
+
if (!event) {
|
|
144
|
+
this.eventHandlers.clear();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (!handler) {
|
|
148
|
+
this.eventHandlers.delete(event);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.eventHandlers.get(event)?.delete(handler);
|
|
152
|
+
}
|
|
153
|
+
/** @internal */
|
|
154
|
+
destroy() {
|
|
155
|
+
this.unsubscribes.forEach((u) => u());
|
|
156
|
+
this.unsubscribes = [];
|
|
157
|
+
this.eventHandlers.clear();
|
|
158
|
+
this.sendTimestamps = [];
|
|
159
|
+
this.seenMsgIds = [];
|
|
160
|
+
this.seenMsgIdSet.clear();
|
|
161
|
+
this.mutedUserIds.clear();
|
|
162
|
+
this.adapter.destroy();
|
|
163
|
+
}
|
|
164
|
+
// ─── Internals ───────────────────────────────────────────────────
|
|
165
|
+
setupListeners() {
|
|
166
|
+
this.unsubscribes.push(this.adapter.onMessage((raw) => this.handleIncomingMessage(raw)));
|
|
167
|
+
this.unsubscribes.push(this.adapter.onTyping((state) => this.handleIncomingTyping(state)));
|
|
168
|
+
this.unsubscribes.push(this.adapter.onControl((cmd) => this.handleIncomingControl(cmd)));
|
|
169
|
+
}
|
|
170
|
+
handleIncomingMessage(raw) {
|
|
171
|
+
if (this.seenMsgIdSet.has(raw.clientMsgId))
|
|
172
|
+
return;
|
|
173
|
+
this.recordSeen(raw.clientMsgId);
|
|
174
|
+
if (this.roomMuted)
|
|
175
|
+
return;
|
|
176
|
+
if (this.mutedUserIds.has(raw.senderId))
|
|
177
|
+
return;
|
|
178
|
+
// Filter DMs that aren't addressed to us and aren't sent by us
|
|
179
|
+
if (raw.to &&
|
|
180
|
+
raw.to !== this.deps.localUserId &&
|
|
181
|
+
raw.senderId !== this.deps.localUserId) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const from = this.deps.resolveUser(raw.senderId) ?? {
|
|
185
|
+
id: raw.senderId,
|
|
186
|
+
displayName: raw.senderId,
|
|
187
|
+
role: 'member',
|
|
188
|
+
};
|
|
189
|
+
this.emit(ChatEvent.Message, {
|
|
190
|
+
from,
|
|
191
|
+
text: raw.text,
|
|
192
|
+
to: raw.to,
|
|
193
|
+
timestamp: raw.timestamp,
|
|
194
|
+
metadata: raw.metadata,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
handleIncomingTyping(state) {
|
|
198
|
+
if (state.senderId === this.deps.localUserId)
|
|
199
|
+
return;
|
|
200
|
+
if (this.mutedUserIds.has(state.senderId))
|
|
201
|
+
return;
|
|
202
|
+
if (this.roomMuted)
|
|
203
|
+
return;
|
|
204
|
+
this.emit(ChatEvent.Typing, {
|
|
205
|
+
userId: state.senderId,
|
|
206
|
+
isTyping: state.isTyping,
|
|
207
|
+
timestamp: state.timestamp,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
handleIncomingControl(cmd) {
|
|
211
|
+
switch (cmd.type) {
|
|
212
|
+
case 'MUTE_PARTICIPANT':
|
|
213
|
+
this.mutedUserIds.add(cmd.targetUserId);
|
|
214
|
+
this.emit(ChatEvent.ParticipantMuted, {
|
|
215
|
+
userId: cmd.targetUserId,
|
|
216
|
+
timestamp: cmd.timestamp,
|
|
217
|
+
});
|
|
218
|
+
return;
|
|
219
|
+
case 'UNMUTE_PARTICIPANT':
|
|
220
|
+
this.mutedUserIds.delete(cmd.targetUserId);
|
|
221
|
+
this.emit(ChatEvent.ParticipantUnmuted, {
|
|
222
|
+
userId: cmd.targetUserId,
|
|
223
|
+
timestamp: cmd.timestamp,
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
case 'MUTE_ROOM':
|
|
227
|
+
this.roomMuted = true;
|
|
228
|
+
this.emit(ChatEvent.RoomMuted, { timestamp: cmd.timestamp });
|
|
229
|
+
return;
|
|
230
|
+
case 'UNMUTE_ROOM':
|
|
231
|
+
this.roomMuted = false;
|
|
232
|
+
this.emit(ChatEvent.RoomUnmuted, { timestamp: cmd.timestamp });
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
tryAcquireRateLimit() {
|
|
237
|
+
const now = Date.now();
|
|
238
|
+
const windowStart = now - 1000;
|
|
239
|
+
this.sendTimestamps = this.sendTimestamps.filter((t) => t >= windowStart);
|
|
240
|
+
if (this.sendTimestamps.length >= CHAT_RATE_LIMIT_PER_SECOND)
|
|
241
|
+
return false;
|
|
242
|
+
this.sendTimestamps.push(now);
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
recordSeen(id) {
|
|
246
|
+
this.seenMsgIdSet.add(id);
|
|
247
|
+
this.seenMsgIds.push(id);
|
|
248
|
+
if (this.seenMsgIds.length > SEEN_MSG_CACHE_SIZE) {
|
|
249
|
+
const evicted = this.seenMsgIds.shift();
|
|
250
|
+
if (evicted)
|
|
251
|
+
this.seenMsgIdSet.delete(evicted);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
assertCanModerate() {
|
|
255
|
+
if (!this.deps.canModerate()) {
|
|
256
|
+
throw new PermissionDeniedError('Only host or moderator can change chat mute state');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
emit(event, payload) {
|
|
260
|
+
const handlers = this.eventHandlers.get(event);
|
|
261
|
+
if (handlers) {
|
|
262
|
+
handlers.forEach((h) => h(payload));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
function generateMsgId() {
|
|
267
|
+
const rand = Math.random().toString(36).slice(2, 10);
|
|
268
|
+
return `${Date.now().toString(36)}-${rand}`;
|
|
269
|
+
}
|
|
270
|
+
function withTimeout(promise, ms, onTimeout) {
|
|
271
|
+
return new Promise((resolve, reject) => {
|
|
272
|
+
const timer = setTimeout(() => reject(onTimeout()), ms);
|
|
273
|
+
promise.then((v) => {
|
|
274
|
+
clearTimeout(timer);
|
|
275
|
+
resolve(v);
|
|
276
|
+
}, (err) => {
|
|
277
|
+
clearTimeout(timer);
|
|
278
|
+
reject(err);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
function classifyFailure(error) {
|
|
283
|
+
if (error instanceof ChatSendTimeoutError)
|
|
284
|
+
return 'timeout';
|
|
285
|
+
if (error instanceof ChatRateLimitedError)
|
|
286
|
+
return 'rate-limited';
|
|
287
|
+
if (error instanceof ChatMutedError)
|
|
288
|
+
return 'muted';
|
|
289
|
+
if (error instanceof VroomError)
|
|
290
|
+
return 'unknown';
|
|
291
|
+
return 'unknown';
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=chat.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.service.js","sourceRoot":"","sources":["../../../src/core/services/chat.service.ts"],"names":[],"mappings":"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"}
|
package/dist/core/session.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type { SwitchDeviceOptions, ScreenShareOptions, DeviceKind } from './type
|
|
|
7
7
|
import { type SessionEventName, type EventHandlers } from './types/events.types';
|
|
8
8
|
import { StatsService } from './services/stats.service';
|
|
9
9
|
import { RecordingService } from './services/recording.service';
|
|
10
|
+
import { ChatService } from './services/chat.service';
|
|
10
11
|
type EventHandler<E extends SessionEventName> = NonNullable<EventHandlers[E]>;
|
|
11
12
|
/**
|
|
12
13
|
* Session represents an active RTC connection.
|
|
@@ -30,6 +31,8 @@ export declare class Session {
|
|
|
30
31
|
stats: StatsService;
|
|
31
32
|
/** Recording service for session recording (optional - requires permissions). */
|
|
32
33
|
recording?: RecordingService;
|
|
34
|
+
/** Chat service for real-time messaging (optional - requires "chat" feature). */
|
|
35
|
+
chat?: ChatService;
|
|
33
36
|
/**
|
|
34
37
|
* Track attachment adapter for attaching tracks to media elements.
|
|
35
38
|
* Use this instead of setting srcObject directly to ensure proper
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC9F,OAAO,EAAgB,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAA0B,MAAM,sBAAsB,CAAA;AAEtH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|
package/dist/core/session.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SessionEvent } from './types/events.types';
|
|
2
2
|
import { StatsService } from './services/stats.service';
|
|
3
3
|
import { RecordingService } from './services/recording.service';
|
|
4
|
+
import { ChatService } from './services/chat.service';
|
|
4
5
|
import { TokenService } from './utils/token';
|
|
5
6
|
/**
|
|
6
7
|
* Session represents an active RTC connection.
|
|
@@ -222,11 +223,15 @@ export class Session {
|
|
|
222
223
|
this.recording = new RecordingService(adapters.recording);
|
|
223
224
|
this.services.push(this.recording);
|
|
224
225
|
}
|
|
225
|
-
//
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
// Chat (optional - requires "chat" feature)
|
|
227
|
+
if (adapters.chat) {
|
|
228
|
+
this.chat = new ChatService(adapters.chat, {
|
|
229
|
+
localUserId: permissions.userId,
|
|
230
|
+
canModerate: () => this.tokenService.canModerate(),
|
|
231
|
+
resolveUser: (userId) => this.adapter.getParticipants().find((p) => p.id === userId),
|
|
232
|
+
});
|
|
233
|
+
this.services.push(this.chat);
|
|
234
|
+
}
|
|
230
235
|
}
|
|
231
236
|
/**
|
|
232
237
|
* Setup event handlers from ConnectParams
|
package/dist/core/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAqE,MAAM,sBAAsB,CAAA;AAEtH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAI5C;;;;;;;GAOG;AACH,MAAM,OAAO,OAAO;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
|