@manonero/chat-client-sdk 0.0.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2453 -0
- package/dist/ChatClient.d.ts +181 -0
- package/dist/ChatClient.d.ts.map +1 -0
- package/dist/ChatClient.js +246 -0
- package/dist/ChatClient.js.map +1 -0
- package/dist/errors/ChatApiError.d.ts +45 -0
- package/dist/errors/ChatApiError.d.ts.map +1 -0
- package/dist/errors/ChatApiError.js +69 -0
- package/dist/errors/ChatApiError.js.map +1 -0
- package/dist/http/AuthApi.d.ts +26 -0
- package/dist/http/AuthApi.d.ts.map +1 -0
- package/dist/http/AuthApi.js +35 -0
- package/dist/http/AuthApi.js.map +1 -0
- package/dist/http/BotApi.d.ts +43 -0
- package/dist/http/BotApi.d.ts.map +1 -0
- package/dist/http/BotApi.js +60 -0
- package/dist/http/BotApi.js.map +1 -0
- package/dist/http/ConversationApi.d.ts +92 -0
- package/dist/http/ConversationApi.d.ts.map +1 -0
- package/dist/http/ConversationApi.js +128 -0
- package/dist/http/ConversationApi.js.map +1 -0
- package/dist/http/FileApi.d.ts +60 -0
- package/dist/http/FileApi.d.ts.map +1 -0
- package/dist/http/FileApi.js +91 -0
- package/dist/http/FileApi.js.map +1 -0
- package/dist/http/HealthApi.d.ts +28 -0
- package/dist/http/HealthApi.d.ts.map +1 -0
- package/dist/http/HealthApi.js +34 -0
- package/dist/http/HealthApi.js.map +1 -0
- package/dist/http/HttpClient.d.ts +69 -0
- package/dist/http/HttpClient.d.ts.map +1 -0
- package/dist/http/HttpClient.js +244 -0
- package/dist/http/HttpClient.js.map +1 -0
- package/dist/http/MessageApi.d.ts +69 -0
- package/dist/http/MessageApi.d.ts.map +1 -0
- package/dist/http/MessageApi.js +104 -0
- package/dist/http/MessageApi.js.map +1 -0
- package/dist/http/ParticipantApi.d.ts +28 -0
- package/dist/http/ParticipantApi.d.ts.map +1 -0
- package/dist/http/ParticipantApi.js +37 -0
- package/dist/http/ParticipantApi.js.map +1 -0
- package/dist/http/ProxyApi.d.ts +59 -0
- package/dist/http/ProxyApi.d.ts.map +1 -0
- package/dist/http/ProxyApi.js +86 -0
- package/dist/http/ProxyApi.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/realtime/ChatHubClient.d.ts +143 -0
- package/dist/realtime/ChatHubClient.d.ts.map +1 -0
- package/dist/realtime/ChatHubClient.js +365 -0
- package/dist/realtime/ChatHubClient.js.map +1 -0
- package/dist/realtime/NotificationHubClient.d.ts +89 -0
- package/dist/realtime/NotificationHubClient.d.ts.map +1 -0
- package/dist/realtime/NotificationHubClient.js +191 -0
- package/dist/realtime/NotificationHubClient.js.map +1 -0
- package/dist/realtime/ReconnectionManager.d.ts +65 -0
- package/dist/realtime/ReconnectionManager.d.ts.map +1 -0
- package/dist/realtime/ReconnectionManager.js +129 -0
- package/dist/realtime/ReconnectionManager.js.map +1 -0
- package/dist/types/auth.d.ts +30 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/block.d.ts +163 -0
- package/dist/types/block.d.ts.map +1 -0
- package/dist/types/block.js +77 -0
- package/dist/types/block.js.map +1 -0
- package/dist/types/bot.d.ts +42 -0
- package/dist/types/bot.d.ts.map +1 -0
- package/dist/types/bot.js +3 -0
- package/dist/types/bot.js.map +1 -0
- package/dist/types/chat-events.d.ts +191 -0
- package/dist/types/chat-events.d.ts.map +1 -0
- package/dist/types/chat-events.js +3 -0
- package/dist/types/chat-events.js.map +1 -0
- package/dist/types/common.d.ts +64 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +3 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/conversation.d.ts +106 -0
- package/dist/types/conversation.d.ts.map +1 -0
- package/dist/types/conversation.js +3 -0
- package/dist/types/conversation.js.map +1 -0
- package/dist/types/file.d.ts +31 -0
- package/dist/types/file.d.ts.map +1 -0
- package/dist/types/file.js +3 -0
- package/dist/types/file.js.map +1 -0
- package/dist/types/message.d.ts +84 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +3 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/notification-events.d.ts +89 -0
- package/dist/types/notification-events.d.ts.map +1 -0
- package/dist/types/notification-events.js +3 -0
- package/dist/types/notification-events.js.map +1 -0
- package/dist/types/participant.d.ts +22 -0
- package/dist/types/participant.d.ts.map +1 -0
- package/dist/types/participant.js +3 -0
- package/dist/types/participant.js.map +1 -0
- package/dist/types/signalr.d.ts +84 -0
- package/dist/types/signalr.d.ts.map +1 -0
- package/dist/types/signalr.js +3 -0
- package/dist/types/signalr.js.map +1 -0
- package/dist/utils/TypedEventEmitter.d.ts +32 -0
- package/dist/utils/TypedEventEmitter.d.ts.map +1 -0
- package/dist/utils/TypedEventEmitter.js +60 -0
- package/dist/utils/TypedEventEmitter.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationHubClient.js","sourceRoot":"","sources":["../../src/realtime/NotificationHubClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ChatHubClient } from './ChatHubClient.js';
|
|
2
|
+
import type { NotificationHubClient } from './NotificationHubClient.js';
|
|
3
|
+
export interface ReconnectionManagerOptions {
|
|
4
|
+
/** ChatHub client to manage */
|
|
5
|
+
chatHub: ChatHubClient;
|
|
6
|
+
/** NotificationHub client to manage */
|
|
7
|
+
notificationHub: NotificationHubClient;
|
|
8
|
+
/**
|
|
9
|
+
* Called when reconnect is rejected with 401 (token likely expired).
|
|
10
|
+
* Should return a fresh token, or null to cancel reconnect attempts.
|
|
11
|
+
*
|
|
12
|
+
* The returned token should be committed to the application's token store
|
|
13
|
+
* so that the shared tokenProvider reflects the new value immediately —
|
|
14
|
+
* the SDK will then pick it up on the next connect() call.
|
|
15
|
+
*/
|
|
16
|
+
onTokenExpired?: () => Promise<string | null>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ReconnectionManager coordinates reconnection for both ChatHub and NotificationHub.
|
|
20
|
+
*
|
|
21
|
+
* Responsibilities:
|
|
22
|
+
* 1. Listens for `disconnected` events from both hubs and attempts to reconnect.
|
|
23
|
+
* 2. After ChatHub reconnects, re-joins all previously joined conversations.
|
|
24
|
+
* 3. On 401-style reconnect failures, calls `onTokenExpired` to obtain a fresh token,
|
|
25
|
+
* then retries the connection once.
|
|
26
|
+
*
|
|
27
|
+
* Note on token propagation:
|
|
28
|
+
* - SignalR tokens are provided at connect-time via accessTokenFactory.
|
|
29
|
+
* - Both hub clients call tokenProvider() on every new connect(), so updating
|
|
30
|
+
* the token in the provider is sufficient before calling connect() again.
|
|
31
|
+
* - Existing active connections cannot receive a new token mid-session.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ReconnectionManager {
|
|
34
|
+
private readonly chatHub;
|
|
35
|
+
private readonly notificationHub;
|
|
36
|
+
private readonly onTokenExpired?;
|
|
37
|
+
private unsubscribeChatDisconnected?;
|
|
38
|
+
private unsubscribeNotificationDisconnected?;
|
|
39
|
+
/** Whether the manager is actively managing reconnections */
|
|
40
|
+
private active;
|
|
41
|
+
constructor(options: ReconnectionManagerOptions);
|
|
42
|
+
/**
|
|
43
|
+
* Start managing reconnections. Attaches `disconnected` listeners to both hubs.
|
|
44
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
45
|
+
*/
|
|
46
|
+
start(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Stop managing reconnections and detach all listeners.
|
|
49
|
+
*/
|
|
50
|
+
stop(): void;
|
|
51
|
+
private handleChatDisconnected;
|
|
52
|
+
private handleNotificationDisconnected;
|
|
53
|
+
/**
|
|
54
|
+
* Determine if the disconnect error is likely due to token expiry (HTTP 401).
|
|
55
|
+
* SignalR surfaces these conditions only as text in the error message, so this
|
|
56
|
+
* is a best-effort heuristic that matches the most common phrasings.
|
|
57
|
+
*/
|
|
58
|
+
private isTokenExpiredError;
|
|
59
|
+
/**
|
|
60
|
+
* Attempt to reconnect a hub with exponential backoff (max 3 retries).
|
|
61
|
+
* After a successful connect, calls `afterConnect` to restore subscriptions.
|
|
62
|
+
*/
|
|
63
|
+
private reconnectHub;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ReconnectionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReconnectionManager.d.ts","sourceRoot":"","sources":["../../src/realtime/ReconnectionManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,WAAW,0BAA0B;IACzC,+BAA+B;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,uCAAuC;IACvC,eAAe,EAAE,qBAAqB,CAAC;IACvC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA+B;IAE/D,OAAO,CAAC,2BAA2B,CAAC,CAAa;IACjD,OAAO,CAAC,mCAAmC,CAAC,CAAa;IAEzD,6DAA6D;IAC7D,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,0BAA0B;IAM/C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAeb;;OAEG;IACH,IAAI,IAAI,IAAI;YAYE,sBAAsB;YAmBtB,8BAA8B;IAqB5C;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;OAGG;YACW,YAAY;CA2B3B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// realtime/ReconnectionManager.ts — Coordinates auto-reconnect for both hubs
|
|
2
|
+
import { HubConnectionState } from '@microsoft/signalr';
|
|
3
|
+
/**
|
|
4
|
+
* ReconnectionManager coordinates reconnection for both ChatHub and NotificationHub.
|
|
5
|
+
*
|
|
6
|
+
* Responsibilities:
|
|
7
|
+
* 1. Listens for `disconnected` events from both hubs and attempts to reconnect.
|
|
8
|
+
* 2. After ChatHub reconnects, re-joins all previously joined conversations.
|
|
9
|
+
* 3. On 401-style reconnect failures, calls `onTokenExpired` to obtain a fresh token,
|
|
10
|
+
* then retries the connection once.
|
|
11
|
+
*
|
|
12
|
+
* Note on token propagation:
|
|
13
|
+
* - SignalR tokens are provided at connect-time via accessTokenFactory.
|
|
14
|
+
* - Both hub clients call tokenProvider() on every new connect(), so updating
|
|
15
|
+
* the token in the provider is sufficient before calling connect() again.
|
|
16
|
+
* - Existing active connections cannot receive a new token mid-session.
|
|
17
|
+
*/
|
|
18
|
+
export class ReconnectionManager {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
/** Whether the manager is actively managing reconnections */
|
|
21
|
+
this.active = false;
|
|
22
|
+
this.chatHub = options.chatHub;
|
|
23
|
+
this.notificationHub = options.notificationHub;
|
|
24
|
+
this.onTokenExpired = options.onTokenExpired;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Start managing reconnections. Attaches `disconnected` listeners to both hubs.
|
|
28
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
29
|
+
*/
|
|
30
|
+
start() {
|
|
31
|
+
if (this.active)
|
|
32
|
+
return;
|
|
33
|
+
this.active = true;
|
|
34
|
+
this.unsubscribeChatDisconnected = this.chatHub.on('disconnected', (err) => void this.handleChatDisconnected(err));
|
|
35
|
+
this.unsubscribeNotificationDisconnected = this.notificationHub.on('disconnected', (err) => void this.handleNotificationDisconnected(err));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stop managing reconnections and detach all listeners.
|
|
39
|
+
*/
|
|
40
|
+
stop() {
|
|
41
|
+
this.active = false;
|
|
42
|
+
this.unsubscribeChatDisconnected?.();
|
|
43
|
+
this.unsubscribeNotificationDisconnected?.();
|
|
44
|
+
this.unsubscribeChatDisconnected = undefined;
|
|
45
|
+
this.unsubscribeNotificationDisconnected = undefined;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Disconnect handlers
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
async handleChatDisconnected(err) {
|
|
51
|
+
if (!this.active)
|
|
52
|
+
return;
|
|
53
|
+
// Skip reconnect when the user (or ChatClient.disconnect/logout) closed it.
|
|
54
|
+
if (this.chatHub.intentionallyClosed)
|
|
55
|
+
return;
|
|
56
|
+
// withAutomaticReconnect already tried — this is a terminal disconnect.
|
|
57
|
+
// Attempt one more manual reconnect after optional token refresh.
|
|
58
|
+
if (this.isTokenExpiredError(err)) {
|
|
59
|
+
const newToken = await this.onTokenExpired?.();
|
|
60
|
+
if (!newToken)
|
|
61
|
+
return; // Client chose to abandon reconnect
|
|
62
|
+
}
|
|
63
|
+
await this.reconnectHub(() => this.chatHub.state, () => this.chatHub.connect(), () => this.chatHub.rejoinConversations());
|
|
64
|
+
}
|
|
65
|
+
async handleNotificationDisconnected(err) {
|
|
66
|
+
if (!this.active)
|
|
67
|
+
return;
|
|
68
|
+
if (this.notificationHub.intentionallyClosed)
|
|
69
|
+
return;
|
|
70
|
+
if (this.isTokenExpiredError(err)) {
|
|
71
|
+
const newToken = await this.onTokenExpired?.();
|
|
72
|
+
if (!newToken)
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await this.reconnectHub(() => this.notificationHub.state, () => this.notificationHub.connect(),
|
|
76
|
+
// NotificationHub has no client-callable methods — nothing to restore.
|
|
77
|
+
() => Promise.resolve());
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Helpers
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
/**
|
|
83
|
+
* Determine if the disconnect error is likely due to token expiry (HTTP 401).
|
|
84
|
+
* SignalR surfaces these conditions only as text in the error message, so this
|
|
85
|
+
* is a best-effort heuristic that matches the most common phrasings.
|
|
86
|
+
*/
|
|
87
|
+
isTokenExpiredError(err) {
|
|
88
|
+
if (!err)
|
|
89
|
+
return false;
|
|
90
|
+
const msg = (err.message ?? '').toLowerCase();
|
|
91
|
+
return (msg.includes('401') ||
|
|
92
|
+
msg.includes('unauthorized') ||
|
|
93
|
+
msg.includes('expired') ||
|
|
94
|
+
msg.includes('invalid_token') ||
|
|
95
|
+
msg.includes('invalid token'));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Attempt to reconnect a hub with exponential backoff (max 3 retries).
|
|
99
|
+
* After a successful connect, calls `afterConnect` to restore subscriptions.
|
|
100
|
+
*/
|
|
101
|
+
async reconnectHub(getState, connect, afterConnect) {
|
|
102
|
+
if (getState() === HubConnectionState.Connected)
|
|
103
|
+
return;
|
|
104
|
+
const delays = [2000, 5000, 10000]; // ms — 2s, 5s, 10s
|
|
105
|
+
for (const delay of delays) {
|
|
106
|
+
if (!this.active)
|
|
107
|
+
return;
|
|
108
|
+
await sleep(delay);
|
|
109
|
+
if (getState() === HubConnectionState.Connected)
|
|
110
|
+
return;
|
|
111
|
+
try {
|
|
112
|
+
await connect();
|
|
113
|
+
// Successful connect — restore state
|
|
114
|
+
await afterConnect().catch(() => {
|
|
115
|
+
// Best-effort: don't fail reconnect if re-subscribe fails
|
|
116
|
+
});
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Retry after next delay
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// All retries exhausted — emit is handled by the hub's onclose handler
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function sleep(ms) {
|
|
127
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=ReconnectionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReconnectionManager.js","sourceRoot":"","sources":["../../src/realtime/ReconnectionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface GoogleLoginRequest {
|
|
2
|
+
idToken: string;
|
|
3
|
+
}
|
|
4
|
+
export interface DsAccountLoginRequest {
|
|
5
|
+
token: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DevLoginRequest {
|
|
8
|
+
username: string;
|
|
9
|
+
password: string;
|
|
10
|
+
}
|
|
11
|
+
export type LoginRequest = GoogleLoginRequest | DsAccountLoginRequest | DevLoginRequest;
|
|
12
|
+
export interface AuthResponse {
|
|
13
|
+
token: string;
|
|
14
|
+
expiresAt: string;
|
|
15
|
+
user: AuthUserInfo;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Authenticated user information returned from login.
|
|
19
|
+
* NOTE: avatar is a plain string URL (NOT a MediaReference).
|
|
20
|
+
*/
|
|
21
|
+
export interface AuthUserInfo {
|
|
22
|
+
id: string;
|
|
23
|
+
uniqueName: string;
|
|
24
|
+
fullName: string;
|
|
25
|
+
/** Plain URL string, not MediaReference. Server may return `null` explicitly when no avatar exists. */
|
|
26
|
+
avatar?: string | null;
|
|
27
|
+
/** Role of the user, e.g. 'dev'. null for Google/DsAccount users. */
|
|
28
|
+
role?: string | null;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,eAAe,CAAC;AAExF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA,kDAAkD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export type TextFormat = 'Plain' | 'Markdown' | 'Html' | 'ProseMirrorJson';
|
|
2
|
+
export type ButtonAction = 'Postback' | 'Url' | 'Call' | 'Copy';
|
|
3
|
+
export type ButtonStyle = 'Default' | 'Primary' | 'Danger';
|
|
4
|
+
export type ChoiceMode = 'Single' | 'Multiple';
|
|
5
|
+
export type QuickReplyAction = 'SendText' | 'Postback' | 'Url';
|
|
6
|
+
export type MentionType = 'User' | 'All' | 'Here' | 'Role';
|
|
7
|
+
import type { MediaReference } from './common.js';
|
|
8
|
+
export interface TextBlock {
|
|
9
|
+
$type: 'text';
|
|
10
|
+
format: TextFormat;
|
|
11
|
+
content: string;
|
|
12
|
+
plainText: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ImageBlock {
|
|
15
|
+
$type: 'image';
|
|
16
|
+
source: MediaReference;
|
|
17
|
+
thumbnail: MediaReference | null;
|
|
18
|
+
altText: string | null;
|
|
19
|
+
width: number | null;
|
|
20
|
+
height: number | null;
|
|
21
|
+
caption: string | null;
|
|
22
|
+
fileSizeBytes: number | null;
|
|
23
|
+
}
|
|
24
|
+
export interface VideoBlock {
|
|
25
|
+
$type: 'video';
|
|
26
|
+
source: MediaReference;
|
|
27
|
+
thumbnail: MediaReference | null;
|
|
28
|
+
caption: string | null;
|
|
29
|
+
durationSeconds: number | null;
|
|
30
|
+
mimeType: string | null;
|
|
31
|
+
fileSizeBytes: number | null;
|
|
32
|
+
}
|
|
33
|
+
export interface AudioBlock {
|
|
34
|
+
$type: 'audio';
|
|
35
|
+
source: MediaReference;
|
|
36
|
+
durationSeconds: number | null;
|
|
37
|
+
mimeType: string | null;
|
|
38
|
+
transcript: string | null;
|
|
39
|
+
fileSizeBytes: number | null;
|
|
40
|
+
}
|
|
41
|
+
export interface FileBlock {
|
|
42
|
+
$type: 'file';
|
|
43
|
+
source: MediaReference;
|
|
44
|
+
fileName: string;
|
|
45
|
+
mimeType: string | null;
|
|
46
|
+
fileSizeBytes: number | null;
|
|
47
|
+
}
|
|
48
|
+
export interface LinkPreviewBlock {
|
|
49
|
+
$type: 'linkPreview';
|
|
50
|
+
url: string;
|
|
51
|
+
title: string | null;
|
|
52
|
+
description: string | null;
|
|
53
|
+
image: MediaReference | null;
|
|
54
|
+
siteName: string | null;
|
|
55
|
+
}
|
|
56
|
+
export interface EmbedBlock {
|
|
57
|
+
$type: 'embed';
|
|
58
|
+
url: string;
|
|
59
|
+
html: string | null;
|
|
60
|
+
width: number | null;
|
|
61
|
+
height: number | null;
|
|
62
|
+
}
|
|
63
|
+
export interface LocationBlock {
|
|
64
|
+
$type: 'location';
|
|
65
|
+
latitude: number;
|
|
66
|
+
longitude: number;
|
|
67
|
+
name: string | null;
|
|
68
|
+
address: string | null;
|
|
69
|
+
}
|
|
70
|
+
export interface ContactBlock {
|
|
71
|
+
$type: 'contact';
|
|
72
|
+
displayName: string;
|
|
73
|
+
phone: string | null;
|
|
74
|
+
email: string | null;
|
|
75
|
+
organization: string | null;
|
|
76
|
+
}
|
|
77
|
+
export interface ChoiceOption {
|
|
78
|
+
label: string;
|
|
79
|
+
value: string;
|
|
80
|
+
selected: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface ChoiceBlock {
|
|
83
|
+
$type: 'choice';
|
|
84
|
+
prompt: string;
|
|
85
|
+
options: ChoiceOption[];
|
|
86
|
+
mode: ChoiceMode;
|
|
87
|
+
submitted: boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface CardField {
|
|
90
|
+
label: string;
|
|
91
|
+
value: string;
|
|
92
|
+
}
|
|
93
|
+
export interface ActionButton {
|
|
94
|
+
label: string;
|
|
95
|
+
action: ButtonAction;
|
|
96
|
+
value?: string | null;
|
|
97
|
+
style: ButtonStyle;
|
|
98
|
+
}
|
|
99
|
+
export interface CardBlock {
|
|
100
|
+
$type: 'card';
|
|
101
|
+
title: string | null;
|
|
102
|
+
subtitle: string | null;
|
|
103
|
+
image: MediaReference | null;
|
|
104
|
+
fields: CardField[] | null;
|
|
105
|
+
buttons: ActionButton[] | null;
|
|
106
|
+
}
|
|
107
|
+
export interface CarouselBlock {
|
|
108
|
+
$type: 'carousel';
|
|
109
|
+
cards: CardBlock[];
|
|
110
|
+
}
|
|
111
|
+
export interface DividerBlock {
|
|
112
|
+
$type: 'divider';
|
|
113
|
+
}
|
|
114
|
+
export interface CustomBlock {
|
|
115
|
+
$type: 'custom';
|
|
116
|
+
type: string;
|
|
117
|
+
data: Record<string, unknown> | null;
|
|
118
|
+
}
|
|
119
|
+
/** Discriminated union of all message block types */
|
|
120
|
+
export type Block = TextBlock | ImageBlock | VideoBlock | AudioBlock | FileBlock | LinkPreviewBlock | EmbedBlock | LocationBlock | ContactBlock | ChoiceBlock | CardBlock | CarouselBlock | DividerBlock | CustomBlock;
|
|
121
|
+
export interface QuickReply {
|
|
122
|
+
label: string;
|
|
123
|
+
action: QuickReplyAction;
|
|
124
|
+
value: string | null;
|
|
125
|
+
icon: string | null;
|
|
126
|
+
}
|
|
127
|
+
export interface Mention {
|
|
128
|
+
type: MentionType;
|
|
129
|
+
targetId: string | null;
|
|
130
|
+
displayName: string;
|
|
131
|
+
offset: number | null;
|
|
132
|
+
length: number | null;
|
|
133
|
+
}
|
|
134
|
+
export declare function isTextBlock(b: Block): b is TextBlock;
|
|
135
|
+
export declare function isImageBlock(b: Block): b is ImageBlock;
|
|
136
|
+
export declare function isVideoBlock(b: Block): b is VideoBlock;
|
|
137
|
+
export declare function isAudioBlock(b: Block): b is AudioBlock;
|
|
138
|
+
export declare function isFileBlock(b: Block): b is FileBlock;
|
|
139
|
+
export declare function isLinkPreviewBlock(b: Block): b is LinkPreviewBlock;
|
|
140
|
+
export declare function isEmbedBlock(b: Block): b is EmbedBlock;
|
|
141
|
+
export declare function isLocationBlock(b: Block): b is LocationBlock;
|
|
142
|
+
export declare function isContactBlock(b: Block): b is ContactBlock;
|
|
143
|
+
export declare function isChoiceBlock(b: Block): b is ChoiceBlock;
|
|
144
|
+
export declare function isCardBlock(b: Block): b is CardBlock;
|
|
145
|
+
export declare function isCarouselBlock(b: Block): b is CarouselBlock;
|
|
146
|
+
export declare function isDividerBlock(b: Block): b is DividerBlock;
|
|
147
|
+
export declare function isCustomBlock(b: Block): b is CustomBlock;
|
|
148
|
+
/**
|
|
149
|
+
* Re-construct a block object with `$type` as the first property.
|
|
150
|
+
*
|
|
151
|
+
* The server's polymorphic deserializer requires `$type` to appear as the
|
|
152
|
+
* first property in every block JSON payload (gateway spec §13). JavaScript
|
|
153
|
+
* engines preserve insertion order for string keys (ES2015+), so reassembling
|
|
154
|
+
* via destructure-then-spread guarantees the correct serialization order.
|
|
155
|
+
*
|
|
156
|
+
* `CarouselBlock` is the only block type containing nested blocks (its `cards`
|
|
157
|
+
* array of `CardBlock`); each nested card is recursively normalized so the
|
|
158
|
+
* spec rule holds at every level.
|
|
159
|
+
*/
|
|
160
|
+
export declare function withTypeFirst<T extends Block>(block: T): T;
|
|
161
|
+
/** Apply {@link withTypeFirst} to every block in an array. */
|
|
162
|
+
export declare function normalizeBlocksForSend<T extends Block>(blocks: T[]): T[];
|
|
163
|
+
//# sourceMappingURL=block.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/types/block.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// block.ts — Message block types (discriminated union)
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Type guards — narrow Block union based on $type discriminator
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
export function isTextBlock(b) {
|
|
6
|
+
return b.$type === 'text';
|
|
7
|
+
}
|
|
8
|
+
export function isImageBlock(b) {
|
|
9
|
+
return b.$type === 'image';
|
|
10
|
+
}
|
|
11
|
+
export function isVideoBlock(b) {
|
|
12
|
+
return b.$type === 'video';
|
|
13
|
+
}
|
|
14
|
+
export function isAudioBlock(b) {
|
|
15
|
+
return b.$type === 'audio';
|
|
16
|
+
}
|
|
17
|
+
export function isFileBlock(b) {
|
|
18
|
+
return b.$type === 'file';
|
|
19
|
+
}
|
|
20
|
+
export function isLinkPreviewBlock(b) {
|
|
21
|
+
return b.$type === 'linkPreview';
|
|
22
|
+
}
|
|
23
|
+
export function isEmbedBlock(b) {
|
|
24
|
+
return b.$type === 'embed';
|
|
25
|
+
}
|
|
26
|
+
export function isLocationBlock(b) {
|
|
27
|
+
return b.$type === 'location';
|
|
28
|
+
}
|
|
29
|
+
export function isContactBlock(b) {
|
|
30
|
+
return b.$type === 'contact';
|
|
31
|
+
}
|
|
32
|
+
export function isChoiceBlock(b) {
|
|
33
|
+
return b.$type === 'choice';
|
|
34
|
+
}
|
|
35
|
+
export function isCardBlock(b) {
|
|
36
|
+
return b.$type === 'card';
|
|
37
|
+
}
|
|
38
|
+
export function isCarouselBlock(b) {
|
|
39
|
+
return b.$type === 'carousel';
|
|
40
|
+
}
|
|
41
|
+
export function isDividerBlock(b) {
|
|
42
|
+
return b.$type === 'divider';
|
|
43
|
+
}
|
|
44
|
+
export function isCustomBlock(b) {
|
|
45
|
+
return b.$type === 'custom';
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Block serialization helpers
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Re-construct a block object with `$type` as the first property.
|
|
52
|
+
*
|
|
53
|
+
* The server's polymorphic deserializer requires `$type` to appear as the
|
|
54
|
+
* first property in every block JSON payload (gateway spec §13). JavaScript
|
|
55
|
+
* engines preserve insertion order for string keys (ES2015+), so reassembling
|
|
56
|
+
* via destructure-then-spread guarantees the correct serialization order.
|
|
57
|
+
*
|
|
58
|
+
* `CarouselBlock` is the only block type containing nested blocks (its `cards`
|
|
59
|
+
* array of `CardBlock`); each nested card is recursively normalized so the
|
|
60
|
+
* spec rule holds at every level.
|
|
61
|
+
*/
|
|
62
|
+
export function withTypeFirst(block) {
|
|
63
|
+
const { $type, ...rest } = block;
|
|
64
|
+
if (block.$type === 'carousel') {
|
|
65
|
+
return {
|
|
66
|
+
$type,
|
|
67
|
+
...rest,
|
|
68
|
+
cards: block.cards.map((card) => withTypeFirst(card)),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return { $type, ...rest };
|
|
72
|
+
}
|
|
73
|
+
/** Apply {@link withTypeFirst} to every block in an array. */
|
|
74
|
+
export function normalizeBlocksForSend(blocks) {
|
|
75
|
+
return blocks.map(withTypeFirst);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block.js","sourceRoot":"","sources":["../../src/types/block.ts"],"names":[],"mappings":"AAAA,uDAAuD;AA2KvD,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAQ;IACnC,OAAO,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAQ;IACnC,OAAO,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAQ;IACnC,OAAO,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAQ;IACzC,OAAO,CAAC,CAAC,KAAK,KAAK,aAAa,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAQ;IACnC,OAAO,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAQ;IACtC,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAQ;IACrC,OAAO,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAQ;IAClC,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAQ;IACtC,OAAO,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAQ;IACrC,OAAO,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAkB,KAAQ;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACjC,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK;YACL,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SACjD,CAAC;IACT,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,EAAO,CAAC;AACjC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CAAkB,MAAW;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MediaReference } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* Bot DTO returned from server.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: BotDto does NOT include uniqueName/fullName — those live on the
|
|
6
|
+
* corresponding ParticipantDto. Use ParticipantApi.getById(bot.participantId)
|
|
7
|
+
* to fetch bot display name / avatar from participant record.
|
|
8
|
+
* CreateBotRequest / UpdateBotRequest accept uniqueName/fullName to create/update
|
|
9
|
+
* the associated participant, but the response only returns participantId.
|
|
10
|
+
*/
|
|
11
|
+
export interface BotDto {
|
|
12
|
+
id: string;
|
|
13
|
+
participantId: string;
|
|
14
|
+
description?: string | null;
|
|
15
|
+
metadata?: Record<string, unknown> | null;
|
|
16
|
+
kafkaTopic: string;
|
|
17
|
+
isActive: boolean;
|
|
18
|
+
listenAllGroupMessages: boolean;
|
|
19
|
+
createdBy: string;
|
|
20
|
+
/** ISO 8601 */
|
|
21
|
+
createdAt: string;
|
|
22
|
+
/** ISO 8601 */
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CreateBotRequest {
|
|
26
|
+
uniqueName: string;
|
|
27
|
+
fullName: string;
|
|
28
|
+
avatar?: MediaReference;
|
|
29
|
+
description?: string;
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
kafkaTopic: string;
|
|
32
|
+
listenAllGroupMessages?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface UpdateBotRequest {
|
|
35
|
+
uniqueName?: string;
|
|
36
|
+
fullName?: string;
|
|
37
|
+
avatar?: MediaReference;
|
|
38
|
+
description?: string;
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
listenAllGroupMessages?: boolean;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../src/types/bot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,sBAAsB,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAElC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/types/bot.ts"],"names":[],"mappings":"AAAA,gCAAgC"}
|