@ctchealth/plato-sdk 0.0.18 → 0.0.19
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 +32 -21
- package/eslint.config.cjs +121 -0
- package/jest.config.ts +10 -0
- package/package.json +3 -4
- package/project.json +24 -0
- package/src/lib/{constants.d.ts → constants.ts} +3 -3
- package/src/lib/plato-intefaces.ts +433 -0
- package/src/lib/plato-sdk.ts +776 -0
- package/src/lib/utils.ts +72 -0
- package/tsconfig.json +22 -0
- package/tsconfig.lib.json +11 -0
- package/tsconfig.spec.json +10 -0
- package/src/index.js +0 -18
- package/src/index.js.map +0 -1
- package/src/lib/constants.js +0 -20
- package/src/lib/constants.js.map +0 -1
- package/src/lib/plato-intefaces.d.ts +0 -393
- package/src/lib/plato-intefaces.js +0 -173
- package/src/lib/plato-intefaces.js.map +0 -1
- package/src/lib/plato-sdk.d.ts +0 -193
- package/src/lib/plato-sdk.js +0 -663
- package/src/lib/plato-sdk.js.map +0 -1
- package/src/lib/utils.d.ts +0 -24
- package/src/lib/utils.js +0 -70
- package/src/lib/utils.js.map +0 -1
- /package/src/{index.d.ts → index.ts} +0 -0
package/src/lib/plato-sdk.js
DELETED
|
@@ -1,663 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PlatoApiClient = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
/**
|
|
6
|
-
* Copyright (c) 2025 ctcHealth. All rights reserved.
|
|
7
|
-
*
|
|
8
|
-
* This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
|
|
9
|
-
*
|
|
10
|
-
* This source code and all related materials are confidential and proprietary to ctcHealth.
|
|
11
|
-
* Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
|
|
12
|
-
* and may result in disciplinary action and civil and/or criminal penalties.
|
|
13
|
-
*
|
|
14
|
-
* This software is intended solely for authorized use within ctcHealth and its designated partners.
|
|
15
|
-
*
|
|
16
|
-
* For internal use only.
|
|
17
|
-
*/
|
|
18
|
-
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
19
|
-
const web_1 = tslib_1.__importDefault(require("@vapi-ai/web"));
|
|
20
|
-
const utils_1 = require("./utils");
|
|
21
|
-
const constants_1 = require("./constants");
|
|
22
|
-
/**
|
|
23
|
-
* Encodes API key and user into a ClientToken (base64 JSON) for x-client-token header.
|
|
24
|
-
* The API decodes this to extract Token and User for validation.
|
|
25
|
-
*/
|
|
26
|
-
function encodeApiKeyClientToken(token, user) {
|
|
27
|
-
const payload = {
|
|
28
|
-
Token: token,
|
|
29
|
-
User: user,
|
|
30
|
-
UserId: user,
|
|
31
|
-
Exp: Math.floor(Date.now() / 1000) + 86400, // 24h
|
|
32
|
-
};
|
|
33
|
-
const json = JSON.stringify(payload);
|
|
34
|
-
if (typeof Buffer !== 'undefined') {
|
|
35
|
-
return Buffer.from(json, 'utf8').toString('base64');
|
|
36
|
-
}
|
|
37
|
-
const bytes = new TextEncoder().encode(json);
|
|
38
|
-
let binary = '';
|
|
39
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
40
|
-
binary += String.fromCharCode(bytes[i]);
|
|
41
|
-
}
|
|
42
|
-
return btoa(binary);
|
|
43
|
-
}
|
|
44
|
-
class PlatoApiClient {
|
|
45
|
-
config;
|
|
46
|
-
static ACTIVE_CALL_STORAGE_KEY = 'plato_active_call';
|
|
47
|
-
http;
|
|
48
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
49
|
-
eventListeners = {};
|
|
50
|
-
callControllerInstance;
|
|
51
|
-
eventsAttached = false;
|
|
52
|
-
currentCallId;
|
|
53
|
-
// Vapi-native events (events that Vapi SDK supports)
|
|
54
|
-
// Exclude our custom SDK events from this list
|
|
55
|
-
vapiEventNames = [
|
|
56
|
-
'call-start',
|
|
57
|
-
'call-end',
|
|
58
|
-
'speech-start',
|
|
59
|
-
'speech-end',
|
|
60
|
-
'error',
|
|
61
|
-
'message',
|
|
62
|
-
'volume-level',
|
|
63
|
-
];
|
|
64
|
-
// All event names including SDK-specific events
|
|
65
|
-
eventNames = [
|
|
66
|
-
'call-start',
|
|
67
|
-
'call-end',
|
|
68
|
-
'speech-start',
|
|
69
|
-
'speech-end',
|
|
70
|
-
'error',
|
|
71
|
-
'message',
|
|
72
|
-
'volume-level',
|
|
73
|
-
'call-details-ready',
|
|
74
|
-
];
|
|
75
|
-
constructor(config) {
|
|
76
|
-
this.config = config;
|
|
77
|
-
if (!config.baseUrl) {
|
|
78
|
-
throw new Error('baseUrl is required');
|
|
79
|
-
}
|
|
80
|
-
const token = config.token;
|
|
81
|
-
const user = config.user;
|
|
82
|
-
if (!token || !user) {
|
|
83
|
-
throw new Error('token and user are required');
|
|
84
|
-
}
|
|
85
|
-
if (config.baseUrl.endsWith('/')) {
|
|
86
|
-
config.baseUrl = config.baseUrl.slice(0, -1);
|
|
87
|
-
}
|
|
88
|
-
const clientToken = config.jwtToken ? config.jwtToken : encodeApiKeyClientToken(token, user);
|
|
89
|
-
this.http = axios_1.default.create({
|
|
90
|
-
baseURL: config.baseUrl,
|
|
91
|
-
headers: {
|
|
92
|
-
'x-client-token': clientToken,
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Update the JWT token for all subsequent requests.
|
|
98
|
-
* Useful when the token is refreshed or when switching user context.
|
|
99
|
-
*/
|
|
100
|
-
setJwtToken(jwtToken) {
|
|
101
|
-
this.http.defaults.headers.common['x-client-token'] = jwtToken;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Remove the JWT token from subsequent requests.
|
|
105
|
-
*/
|
|
106
|
-
clearJwtToken() {
|
|
107
|
-
delete this.http.defaults.headers.common['x-client-token'];
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Register a listener for a call event with strict typing.
|
|
111
|
-
* @param event Event name
|
|
112
|
-
* @param listener Listener function
|
|
113
|
-
*/
|
|
114
|
-
on(event, listener) {
|
|
115
|
-
if (!this.eventListeners[event]) {
|
|
116
|
-
this.eventListeners[event] = [];
|
|
117
|
-
}
|
|
118
|
-
const listeners = this.eventListeners[event];
|
|
119
|
-
if (listeners) {
|
|
120
|
-
listeners.push(listener);
|
|
121
|
-
}
|
|
122
|
-
if (this.callControllerInstance && !this.eventsAttached) {
|
|
123
|
-
this.attachEvents();
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Remove a listener for a call event with strict typing.
|
|
128
|
-
* @param event Event name
|
|
129
|
-
* @param listener Listener function
|
|
130
|
-
*/
|
|
131
|
-
off(event, listener) {
|
|
132
|
-
const listeners = this.eventListeners[event];
|
|
133
|
-
if (!listeners)
|
|
134
|
-
return;
|
|
135
|
-
this.eventListeners[event] = listeners.filter(l => l !== listener);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Internal: Attach event listeners and propagate to registered listeners.
|
|
139
|
-
*/
|
|
140
|
-
attachEvents() {
|
|
141
|
-
if (this.eventsAttached || !this.callControllerInstance)
|
|
142
|
-
return;
|
|
143
|
-
this.eventsAttached = true;
|
|
144
|
-
const vapi = this.callControllerInstance;
|
|
145
|
-
// Only attach Vapi-native events to the Vapi instance
|
|
146
|
-
this.vapiEventNames.forEach(event => {
|
|
147
|
-
vapi.on(event, (payload) => {
|
|
148
|
-
(this.eventListeners[event] || []).forEach(listener => listener(payload));
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Internal: Emit SDK-specific events that are not part of Vapi.
|
|
154
|
-
*/
|
|
155
|
-
emit(event, payload) {
|
|
156
|
-
const listeners = this.eventListeners[event];
|
|
157
|
-
if (listeners) {
|
|
158
|
-
listeners.forEach(listener => listener(payload));
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Store active call state in localStorage for recovery purposes.
|
|
163
|
-
* @private
|
|
164
|
-
*/
|
|
165
|
-
storeCallState(state) {
|
|
166
|
-
try {
|
|
167
|
-
localStorage.setItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY, JSON.stringify(state));
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
console.warn('Failed to store call state:', error);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Retrieve active call state from localStorage.
|
|
175
|
-
* Validates the stored data and clears it if invalid.
|
|
176
|
-
* @private
|
|
177
|
-
* @returns The stored call state or null if not found or invalid
|
|
178
|
-
*/
|
|
179
|
-
getStoredCallState() {
|
|
180
|
-
try {
|
|
181
|
-
const stored = localStorage.getItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY);
|
|
182
|
-
if (!stored) {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
const parsed = JSON.parse(stored);
|
|
186
|
-
// Validate required fields
|
|
187
|
-
if (!parsed.callId || !parsed.externalCallId || !parsed.simulationId || !parsed.startedAt) {
|
|
188
|
-
console.warn('Invalid stored call state, clearing');
|
|
189
|
-
this.clearCallState();
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
return parsed;
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
console.warn('Failed to retrieve call state:', error);
|
|
196
|
-
return null;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Clear active call state from localStorage.
|
|
201
|
-
* @private
|
|
202
|
-
*/
|
|
203
|
-
clearCallState() {
|
|
204
|
-
try {
|
|
205
|
-
localStorage.removeItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY);
|
|
206
|
-
}
|
|
207
|
-
catch (error) {
|
|
208
|
-
console.warn('Failed to clear call state:', error);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Check if a stored call is considered abandoned based on age.
|
|
213
|
-
* Calls older than 5 minutes are considered abandoned.
|
|
214
|
-
* @private
|
|
215
|
-
* @param state The call state to check
|
|
216
|
-
* @returns true if the call is abandoned, false otherwise
|
|
217
|
-
*/
|
|
218
|
-
isCallAbandoned(state) {
|
|
219
|
-
const ABANDONMENT_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes
|
|
220
|
-
const startedAt = new Date(state.startedAt).getTime();
|
|
221
|
-
const now = Date.now();
|
|
222
|
-
const age = now - startedAt;
|
|
223
|
-
return age > ABANDONMENT_THRESHOLD_MS;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Recover and clean up any abandoned calls from previous sessions.
|
|
227
|
-
*
|
|
228
|
-
* This method should be called during application initialization,
|
|
229
|
-
* typically in ngOnInit() or useEffect(). It detects calls that were
|
|
230
|
-
* active when the page was last refreshed and notifies the backend
|
|
231
|
-
* to process them if they're older than 5 minutes.
|
|
232
|
-
*
|
|
233
|
-
* The backend endpoint is idempotent, so calling this method multiple
|
|
234
|
-
* times for the same call is safe.
|
|
235
|
-
*
|
|
236
|
-
* @returns Promise<boolean> - true if an abandoned call was recovered and processed
|
|
237
|
-
*
|
|
238
|
-
* @example
|
|
239
|
-
* // In Angular component
|
|
240
|
-
* async ngOnInit(): Promise<void> {
|
|
241
|
-
* const recovered = await this.platoClient.recoverAbandonedCall();
|
|
242
|
-
* if (recovered) {
|
|
243
|
-
* console.log('Recovered abandoned call from previous session');
|
|
244
|
-
* }
|
|
245
|
-
* }
|
|
246
|
-
*
|
|
247
|
-
* @example
|
|
248
|
-
* // In React component
|
|
249
|
-
* useEffect(() => {
|
|
250
|
-
* platoClient.recoverAbandonedCall()
|
|
251
|
-
* .then(recovered => {
|
|
252
|
-
* if (recovered) {
|
|
253
|
-
* console.log('Recovered abandoned call');
|
|
254
|
-
* }
|
|
255
|
-
* })
|
|
256
|
-
* .catch(console.error);
|
|
257
|
-
* }, []);
|
|
258
|
-
*/
|
|
259
|
-
async recoverAbandonedCall() {
|
|
260
|
-
try {
|
|
261
|
-
const storedState = this.getStoredCallState();
|
|
262
|
-
if (!storedState) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
if (!this.isCallAbandoned(storedState)) {
|
|
266
|
-
return false;
|
|
267
|
-
}
|
|
268
|
-
console.log('Detected abandoned call, notifying backend:', storedState.callId);
|
|
269
|
-
try {
|
|
270
|
-
const response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
271
|
-
callId: storedState.callId,
|
|
272
|
-
});
|
|
273
|
-
console.log('Backend notified of abandoned call:', response.data);
|
|
274
|
-
}
|
|
275
|
-
catch (error) {
|
|
276
|
-
console.error('Failed to notify backend of abandoned call:', error);
|
|
277
|
-
}
|
|
278
|
-
this.clearCallState();
|
|
279
|
-
return true;
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
console.error('Error during call recovery:', error);
|
|
283
|
-
this.clearCallState();
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
async createSimulation(createSimulationParams) {
|
|
288
|
-
try {
|
|
289
|
-
const res = await this.http.post('/api/v1/simulation', {
|
|
290
|
-
...createSimulationParams,
|
|
291
|
-
});
|
|
292
|
-
return {
|
|
293
|
-
simulationId: res.data.simulationId,
|
|
294
|
-
phase: res.data.phase,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
catch (e) {
|
|
298
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
299
|
-
console.error('Error creating simulation:', e.response?.data.message);
|
|
300
|
-
}
|
|
301
|
-
throw e;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
async checkSimulationStatus(simulationId) {
|
|
305
|
-
const res = await this.http.get(`/api/v1/simulation/status/${simulationId}`);
|
|
306
|
-
return res.data;
|
|
307
|
-
}
|
|
308
|
-
async getUserSimulations() {
|
|
309
|
-
try {
|
|
310
|
-
const res = await this.http.get('/api/v1/simulation/user/simulations');
|
|
311
|
-
return res.data;
|
|
312
|
-
}
|
|
313
|
-
catch (e) {
|
|
314
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
315
|
-
console.error('Error getting user simulations:', e.response?.data.message);
|
|
316
|
-
}
|
|
317
|
-
throw e;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
async getSimulationDetails(simulationId) {
|
|
321
|
-
try {
|
|
322
|
-
const res = await this.http.get(`/api/v1/simulation/details/${simulationId}`);
|
|
323
|
-
return res.data;
|
|
324
|
-
}
|
|
325
|
-
catch (e) {
|
|
326
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
327
|
-
console.error('Error getting simulation details:', e.response?.data.message);
|
|
328
|
-
}
|
|
329
|
-
throw e;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Deletes a simulation (assistant) from the server and Vapi.
|
|
334
|
-
* @param simulationId - MongoDB ObjectId of the simulation
|
|
335
|
-
* @throws 404 if simulation not found
|
|
336
|
-
*/
|
|
337
|
-
async deleteSimulation(simulationId) {
|
|
338
|
-
try {
|
|
339
|
-
await this.http.delete(`/api/v1/simulation/${simulationId}`);
|
|
340
|
-
}
|
|
341
|
-
catch (e) {
|
|
342
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
343
|
-
console.error('Error deleting simulation:', e.response?.data.message);
|
|
344
|
-
}
|
|
345
|
-
throw e;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
async getCallDetails(callId) {
|
|
349
|
-
try {
|
|
350
|
-
const res = await this.http.get(`/api/v1/simulation/call/${callId}`);
|
|
351
|
-
return res.data;
|
|
352
|
-
}
|
|
353
|
-
catch (e) {
|
|
354
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
355
|
-
console.error('Error getting call details:', e.response?.data.message);
|
|
356
|
-
}
|
|
357
|
-
throw e;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
async getCallRecordings(queryParams) {
|
|
361
|
-
try {
|
|
362
|
-
const res = await this.http.get(`/api/v1/simulation/call/recordings`, {
|
|
363
|
-
params: queryParams,
|
|
364
|
-
});
|
|
365
|
-
return res.data;
|
|
366
|
-
}
|
|
367
|
-
catch (e) {
|
|
368
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
369
|
-
console.error('Error getting call recordings:', e.response?.data.message);
|
|
370
|
-
}
|
|
371
|
-
throw e;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
async getCallRecording(callId) {
|
|
375
|
-
try {
|
|
376
|
-
const res = await this.http.get(`/api/v1/simulation/call/recordings/${callId}`);
|
|
377
|
-
return res.data;
|
|
378
|
-
}
|
|
379
|
-
catch (e) {
|
|
380
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
381
|
-
console.error('Error getting call recording:', e.response?.data.message);
|
|
382
|
-
}
|
|
383
|
-
throw e;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
/**
|
|
387
|
-
* Remove all listeners for all call events.
|
|
388
|
-
*/
|
|
389
|
-
removeAllEventListeners() {
|
|
390
|
-
if (!this.callControllerInstance)
|
|
391
|
-
return;
|
|
392
|
-
this.eventNames.forEach(event => {
|
|
393
|
-
(this.eventListeners[event] || []).forEach(listener => {
|
|
394
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
395
|
-
// @ts-expect-error
|
|
396
|
-
this.callControllerInstance?.off(event, listener);
|
|
397
|
-
});
|
|
398
|
-
this.eventListeners[event] = [];
|
|
399
|
-
});
|
|
400
|
-
this.eventsAttached = false;
|
|
401
|
-
}
|
|
402
|
-
async startCall(simulationId) {
|
|
403
|
-
// Check for any previous call state before starting new call
|
|
404
|
-
// If found, notify backend to ensure it gets processed
|
|
405
|
-
const storedState = this.getStoredCallState();
|
|
406
|
-
if (storedState) {
|
|
407
|
-
console.log('Found previous call state, notifying backend before starting new call:', storedState.callId);
|
|
408
|
-
try {
|
|
409
|
-
await this.http.post('/api/v1/postcall/call-ended', {
|
|
410
|
-
callId: storedState.callId,
|
|
411
|
-
});
|
|
412
|
-
console.log('Backend notified of previous call');
|
|
413
|
-
}
|
|
414
|
-
catch (error) {
|
|
415
|
-
console.error('Failed to notify backend of previous call:', error);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
// Now clear the state before starting new call
|
|
419
|
-
this.clearCallState();
|
|
420
|
-
this.callControllerInstance = new web_1.default('f07d17ec-d4e6-487d-a0b9-0539c01aecbb', 'https://db41aykk1gw9e.cloudfront.net' // base url
|
|
421
|
-
);
|
|
422
|
-
if (!this.eventsAttached) {
|
|
423
|
-
this.attachEvents();
|
|
424
|
-
}
|
|
425
|
-
// Internal call-end listener
|
|
426
|
-
this.callControllerInstance.on('call-end', () => {
|
|
427
|
-
this.onCallEnded().catch(error => {
|
|
428
|
-
console.error('Error in onCallEnded: ', error);
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
const { data } = await this.http.get(`/api/v1/simulation/${simulationId}`);
|
|
432
|
-
const assistantId = data;
|
|
433
|
-
const call = await this.callControllerInstance.start(assistantId);
|
|
434
|
-
if (!call || !call.assistantId) {
|
|
435
|
-
throw new Error('Cannot start a call, please try again later');
|
|
436
|
-
}
|
|
437
|
-
try {
|
|
438
|
-
const apiCall = await this.createCall({
|
|
439
|
-
callId: call.id,
|
|
440
|
-
assistantId: call.assistantId,
|
|
441
|
-
});
|
|
442
|
-
// Store the callId for use in onCallEnded
|
|
443
|
-
this.currentCallId = apiCall._id;
|
|
444
|
-
// Store call state in localStorage for recovery
|
|
445
|
-
this.storeCallState({
|
|
446
|
-
callId: apiCall._id,
|
|
447
|
-
externalCallId: call.id,
|
|
448
|
-
simulationId: simulationId,
|
|
449
|
-
startedAt: new Date().toISOString(),
|
|
450
|
-
version: 1,
|
|
451
|
-
});
|
|
452
|
-
// Return stopCall, callId, and event subscription methods with strict typing
|
|
453
|
-
return {
|
|
454
|
-
stopCall: () => {
|
|
455
|
-
this.callControllerInstance?.stop();
|
|
456
|
-
this.removeAllEventListeners();
|
|
457
|
-
this.clearCallState();
|
|
458
|
-
},
|
|
459
|
-
callId: apiCall._id,
|
|
460
|
-
/**
|
|
461
|
-
* Subscribe to call events for this call with strict typing.
|
|
462
|
-
* @param event Event name
|
|
463
|
-
* @param listener Listener function
|
|
464
|
-
*/
|
|
465
|
-
on: (event, listener) => this.on(event, listener),
|
|
466
|
-
/**
|
|
467
|
-
* Unsubscribe from call events for this call with strict typing.
|
|
468
|
-
* @param event Event name
|
|
469
|
-
* @param listener Listener function
|
|
470
|
-
*/
|
|
471
|
-
off: (event, listener) => this.off(event, listener),
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
catch (e) {
|
|
475
|
-
this.callControllerInstance?.stop();
|
|
476
|
-
this.removeAllEventListeners();
|
|
477
|
-
this.clearCallState();
|
|
478
|
-
throw e;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
async onCallEnded() {
|
|
482
|
-
let callIdForRetry;
|
|
483
|
-
try {
|
|
484
|
-
if (!this.currentCallId) {
|
|
485
|
-
return;
|
|
486
|
-
}
|
|
487
|
-
callIdForRetry = this.currentCallId;
|
|
488
|
-
// First attempt
|
|
489
|
-
let response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
490
|
-
callId: callIdForRetry,
|
|
491
|
-
});
|
|
492
|
-
// If status is "processing", retry once immediately
|
|
493
|
-
if (response.data?.status === 'processing') {
|
|
494
|
-
response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
495
|
-
callId: callIdForRetry,
|
|
496
|
-
});
|
|
497
|
-
}
|
|
498
|
-
// After onCallEnded completes successfully, fetch and emit call details
|
|
499
|
-
try {
|
|
500
|
-
const callDetails = await this.getCallDetails(callIdForRetry);
|
|
501
|
-
this.emit('call-details-ready', callDetails);
|
|
502
|
-
}
|
|
503
|
-
catch (error) {
|
|
504
|
-
console.error('Error fetching call details after call ended:', error);
|
|
505
|
-
// Don't throw - we don't want to break the onCallEnded flow
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
catch {
|
|
509
|
-
// Silently handle errors in post-call processing
|
|
510
|
-
}
|
|
511
|
-
finally {
|
|
512
|
-
// Clean up the callId after processing (success or failure)
|
|
513
|
-
this.currentCallId = undefined;
|
|
514
|
-
// Clear stored call state after normal call end
|
|
515
|
-
this.clearCallState();
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
async createCall(payload) {
|
|
519
|
-
const response = await this.http.post('/api/v1/simulation/call', {
|
|
520
|
-
...payload,
|
|
521
|
-
});
|
|
522
|
-
return response.data;
|
|
523
|
-
}
|
|
524
|
-
async uploadPdfSlides(file) {
|
|
525
|
-
try {
|
|
526
|
-
const checkResult = (0, utils_1.checkFile)(file, constants_1.MAX_PDF_FILE_SIZE, constants_1.ALLOWED_PDF_MIME_TYPES);
|
|
527
|
-
if (checkResult !== true) {
|
|
528
|
-
throw new Error(checkResult);
|
|
529
|
-
}
|
|
530
|
-
// Check PDF page count before proceeding
|
|
531
|
-
const pageCount = await (0, utils_1.getPdfPageCount)(file);
|
|
532
|
-
if (pageCount > constants_1.MAX_PDF_PAGES) {
|
|
533
|
-
throw new Error(`PDF has ${pageCount} pages, which exceeds the maximum allowed page count of ${constants_1.MAX_PDF_PAGES} pages.`);
|
|
534
|
-
}
|
|
535
|
-
const contentHash = await (0, utils_1.calculateHash)(file);
|
|
536
|
-
const filename = file instanceof File ? file.name : file.filename;
|
|
537
|
-
if (!filename) {
|
|
538
|
-
throw new Error('Invalid input: could not extract filename from the provided file or blob.');
|
|
539
|
-
}
|
|
540
|
-
if (/[^a-zA-Z0-9._ -]/.test(filename)) {
|
|
541
|
-
throw new Error('Filename contains invalid characters. Only English letters, numbers, dots, hyphens, and underscores are allowed.');
|
|
542
|
-
}
|
|
543
|
-
const { presignedPost, pdfId } = (await this.http.post('/api/v1/pdfSlides/request-upload', {
|
|
544
|
-
contentHash,
|
|
545
|
-
filename,
|
|
546
|
-
})).data;
|
|
547
|
-
const formData = new FormData();
|
|
548
|
-
Object.entries(presignedPost.fields).forEach(([key, value]) => {
|
|
549
|
-
formData.append(key, value);
|
|
550
|
-
});
|
|
551
|
-
formData.append('file', file);
|
|
552
|
-
try {
|
|
553
|
-
await axios_1.default.post(presignedPost.url, formData, {
|
|
554
|
-
headers: {
|
|
555
|
-
'Content-Type': 'multipart/form-data',
|
|
556
|
-
},
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
catch (uploadError) {
|
|
560
|
-
// S3 upload failed - clean up the MongoDB record created during request-upload
|
|
561
|
-
try {
|
|
562
|
-
await this.deleteSlideAnalysis(pdfId);
|
|
563
|
-
}
|
|
564
|
-
catch (deleteError) {
|
|
565
|
-
console.error('Failed to clean up PDF record after upload failure:', deleteError);
|
|
566
|
-
}
|
|
567
|
-
throw uploadError;
|
|
568
|
-
}
|
|
569
|
-
/*
|
|
570
|
-
// replace const { presignedPost, pdfId } with const { presignedPost, objectKey, pdfId }
|
|
571
|
-
// Uncomment this block if you are testing locally without AWS EventBridge
|
|
572
|
-
await this.http.post('/api/v1/pdfSlides/test-event-bridge', {
|
|
573
|
-
s3Name: objectKey,
|
|
574
|
-
});
|
|
575
|
-
*/
|
|
576
|
-
return pdfId;
|
|
577
|
-
}
|
|
578
|
-
catch (e) {
|
|
579
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
580
|
-
console.error('Error uploading PDF slides:', e.response?.data?.message || e.message);
|
|
581
|
-
}
|
|
582
|
-
else {
|
|
583
|
-
console.error('Error uploading PDF slides:', e instanceof Error ? e.message : 'Unknown error');
|
|
584
|
-
}
|
|
585
|
-
throw e;
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
async getRecommendations() {
|
|
589
|
-
try {
|
|
590
|
-
const res = await this.http.get('/api/v1/recommendations');
|
|
591
|
-
return res.data;
|
|
592
|
-
}
|
|
593
|
-
catch (e) {
|
|
594
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
595
|
-
console.error('Error getting recommendations:', e.response?.data.message);
|
|
596
|
-
}
|
|
597
|
-
throw e;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
async getSlidesAnalysis(queryParams) {
|
|
601
|
-
try {
|
|
602
|
-
const res = await this.http.get('/api/v1/pdfSlides', {
|
|
603
|
-
params: queryParams,
|
|
604
|
-
});
|
|
605
|
-
return res.data;
|
|
606
|
-
}
|
|
607
|
-
catch (e) {
|
|
608
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
609
|
-
console.error('Error getting PDF slides analysis:', e.response?.data.message);
|
|
610
|
-
}
|
|
611
|
-
throw e;
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
async getSlideAnalysis(id) {
|
|
615
|
-
try {
|
|
616
|
-
const res = await this.http.get(`/api/v1/pdfSlides/${id}`);
|
|
617
|
-
return res.data;
|
|
618
|
-
}
|
|
619
|
-
catch (e) {
|
|
620
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
621
|
-
console.error('Error getting PDF slide analysis by ID:', e.response?.data.message);
|
|
622
|
-
}
|
|
623
|
-
throw e;
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
async deleteSlideAnalysis(id) {
|
|
627
|
-
try {
|
|
628
|
-
await this.http.delete(`/api/v1/pdfSlides/${id}`);
|
|
629
|
-
}
|
|
630
|
-
catch (e) {
|
|
631
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
632
|
-
console.error('Error deleting PDF slide analysis:', e.response?.data.message);
|
|
633
|
-
}
|
|
634
|
-
throw e;
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
async checkPdfStatus(id) {
|
|
638
|
-
try {
|
|
639
|
-
const res = await this.http.get(`/api/v1/pdfSlides/status/${id}`);
|
|
640
|
-
return res.data;
|
|
641
|
-
}
|
|
642
|
-
catch (e) {
|
|
643
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
644
|
-
console.error('Error checking PDF status:', e.response?.data.message);
|
|
645
|
-
}
|
|
646
|
-
throw e;
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
async getAssistantImages() {
|
|
650
|
-
try {
|
|
651
|
-
const res = await this.http.get('/api/v1/assistant-images');
|
|
652
|
-
return res.data;
|
|
653
|
-
}
|
|
654
|
-
catch (e) {
|
|
655
|
-
if (axios_1.default.isAxiosError(e)) {
|
|
656
|
-
console.error('Error getting assistant images:', e.response?.data.message);
|
|
657
|
-
}
|
|
658
|
-
throw e;
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
exports.PlatoApiClient = PlatoApiClient;
|
|
663
|
-
//# sourceMappingURL=plato-sdk.js.map
|
package/src/lib/plato-sdk.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|