@ctchealth/plato-sdk 0.0.20 → 0.0.21
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 +65 -2
- package/package.json +1 -1
- package/src/lib/plato-intefaces.d.ts +0 -4
- package/src/lib/plato-intefaces.js.map +1 -1
- package/src/lib/plato-sdk.d.ts +8 -73
- package/src/lib/plato-sdk.js +419 -263
- package/src/lib/plato-sdk.js.map +1 -1
- package/src/lib/utils.d.ts +4 -0
- package/src/lib/utils.js +24 -0
- package/src/lib/utils.js.map +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ All API requests require authentication via a client token. Pass a pre-signed JW
|
|
|
17
17
|
- Comprehensive event system for call management
|
|
18
18
|
- Type-safe API with full TypeScript support
|
|
19
19
|
- Medical training simulation configuration
|
|
20
|
-
- Simulation persistence
|
|
20
|
+
- Simulation persistence across page reloads
|
|
21
21
|
|
|
22
22
|
## Installation
|
|
23
23
|
|
|
@@ -599,6 +599,7 @@ const inProgress = simulations.find(
|
|
|
599
599
|
);
|
|
600
600
|
```
|
|
601
601
|
|
|
602
|
+
<!--
|
|
602
603
|
## Call Recovery
|
|
603
604
|
|
|
604
605
|
The SDK automatically handles call recovery in case of page refreshes or browser closures during active calls. This ensures that call data is never lost and all calls get properly processed by the backend, even if the page is refreshed while a call is in progress.
|
|
@@ -900,6 +901,7 @@ A: The `recoverAbandonedCall()` method returns `true` when a call is recovered.
|
|
|
900
901
|
**Q: What if the backend is down during recovery?**
|
|
901
902
|
|
|
902
903
|
A: The recovery attempt is logged and the stored state is cleared to prevent infinite retries. The SDK continues working normally. Recovery failures are graceful and don't break the app.
|
|
904
|
+
-->
|
|
903
905
|
|
|
904
906
|
## Event System
|
|
905
907
|
|
|
@@ -914,6 +916,7 @@ The SDK provides a comprehensive event system for managing voice calls:
|
|
|
914
916
|
- `message`: Triggered when a message is received (contains transcript and metadata)
|
|
915
917
|
- `volume-level`: Triggered with volume level updates (number)
|
|
916
918
|
- `error`: Triggered when an error occurs
|
|
919
|
+
- `call-ended-reason`: Triggered just before `call-end` with the reason the call was terminated (e.g. silence timeout). Use this to show the user a contextual message immediately
|
|
917
920
|
- `call-details-ready`: Triggered when post-call processing completes and call details are available (includes full `CallDTO` with transcript, summary, ratings, and evaluation)
|
|
918
921
|
|
|
919
922
|
### Event Usage
|
|
@@ -939,6 +942,29 @@ call.on('call-details-ready', callDetails => {
|
|
|
939
942
|
});
|
|
940
943
|
```
|
|
941
944
|
|
|
945
|
+
## Detecting Why a Call Ended
|
|
946
|
+
|
|
947
|
+
The `call-ended-reason` event fires **just before** `call-end`, giving you the reason the call was terminated in time to update the UI before any post-call processing begins.
|
|
948
|
+
|
|
949
|
+
### Usage
|
|
950
|
+
|
|
951
|
+
```typescript
|
|
952
|
+
call.on('call-ended-reason', ({ reason, isInactivity }) => {
|
|
953
|
+
// reason — raw string from the platform, e.g. "silence-timed-out"
|
|
954
|
+
// isInactivity — true when reason contains "silence" or "inactivity"
|
|
955
|
+
});
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
### Known Reason Values
|
|
959
|
+
|
|
960
|
+
| `reason` | `isInactivity` | When it occurs |
|
|
961
|
+
| --------------------- | -------------- | ------------------------------------------------------- |
|
|
962
|
+
| `silence-timed-out` | `true` | No speech detected within the configured silence window |
|
|
963
|
+
| `customer-ended-call` | `false` | The user clicked "End Call" |
|
|
964
|
+
| `pipeline-error` | `false` | An internal platform error terminated the call |
|
|
965
|
+
|
|
966
|
+
> **Note:** The `reason` field reflects the raw value from the underlying voice platform. New values may be introduced over time. Always handle unknown reasons gracefully by falling back to a generic message.
|
|
967
|
+
|
|
942
968
|
## Automatic Post-Call Feedback
|
|
943
969
|
|
|
944
970
|
The SDK automatically fetches detailed call information after each call ends and completes post-call processing. This includes comprehensive feedback such as transcript, summary, evaluation metrics, strengths, weaknesses, and ratings.
|
|
@@ -1118,10 +1144,22 @@ call.on('call-details-ready', callDetails => {
|
|
|
1118
1144
|
|
|
1119
1145
|
### Timing Considerations
|
|
1120
1146
|
|
|
1147
|
+
- `call-ended-reason`: Fires immediately before `call-end`, with the reason the call stopped
|
|
1121
1148
|
- `call-end`: Fires immediately when the call stops
|
|
1122
1149
|
- `call-details-ready`: Fires after backend processing completes (typically 2-5 seconds after call ends)
|
|
1123
1150
|
|
|
1124
|
-
Plan your UX accordingly—show a loading/processing state
|
|
1151
|
+
Plan your UX accordingly—show a contextual end message on `call-ended-reason`, then a loading/processing state until `call-details-ready` arrives.
|
|
1152
|
+
|
|
1153
|
+
### Call Duration and Data Availability
|
|
1154
|
+
|
|
1155
|
+
The quality of data returned in `call-details-ready` depends on the duration of the call:
|
|
1156
|
+
|
|
1157
|
+
| Call duration | Behaviour |
|
|
1158
|
+
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1159
|
+
| **< ~15 seconds** | `call-details-ready` fires immediately after `call-end` with whatever the database currently holds. Fields like `transcript`, `summary`, `score`, `strengths`, and `weaknesses` will typically be empty or zero — the call was too short to generate a meaningful analysis. |
|
|
1160
|
+
| **≥ ~15 seconds** | The SDK polls the backend until Vapi's post-call analysis is ready (transcript present), then emits `call-details-ready` with the fully populated `CallDTO`. |
|
|
1161
|
+
|
|
1162
|
+
> **Note:** The ~15 second threshold accounts for the Vapi connection handshake (typically 1–5 seconds) plus a minimum amount of conversation time required for analysis to be generated. Always handle empty fields gracefully regardless of call length.
|
|
1125
1163
|
|
|
1126
1164
|
## Data Types
|
|
1127
1165
|
|
|
@@ -1429,6 +1467,31 @@ try {
|
|
|
1429
1467
|
}
|
|
1430
1468
|
```
|
|
1431
1469
|
|
|
1470
|
+
### Concurrency Limit Error
|
|
1471
|
+
|
|
1472
|
+
When the platform has reached its maximum number of simultaneous active calls, `startCall()` throws a `CallConcurrencyLimitError`. This is a platform-wide limit, not user-specific. You should catch this specifically and show the user a clear message rather than a generic error.
|
|
1473
|
+
|
|
1474
|
+
```typescript
|
|
1475
|
+
import { CallConcurrencyLimitError } from 'plato-sdk';
|
|
1476
|
+
|
|
1477
|
+
const handleStartCall = async (simulationId: string) => {
|
|
1478
|
+
try {
|
|
1479
|
+
const call = await platoClient.startCall(simulationId);
|
|
1480
|
+
|
|
1481
|
+
call.on('call-start', () => setCallActive(true));
|
|
1482
|
+
call.on('call-end', () => setCallActive(false));
|
|
1483
|
+
} catch (error) {
|
|
1484
|
+
if (error instanceof CallConcurrencyLimitError) {
|
|
1485
|
+
setErrorMessage(
|
|
1486
|
+
'The platform has reached its maximum number of simultaneous calls. Please try again in a moment.'
|
|
1487
|
+
);
|
|
1488
|
+
} else {
|
|
1489
|
+
setErrorMessage('Failed to start call. Please try again.');
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
};
|
|
1493
|
+
```
|
|
1494
|
+
|
|
1432
1495
|
## Support
|
|
1433
1496
|
|
|
1434
1497
|
For support and questions, please contact the development team.
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAmB,CAAA;IACnB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;IACvB,qCAAmB,CAAA;AACrB,CAAC,EALW,gBAAgB,gCAAhB,gBAAgB,QAK3B;AAED,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,qCAAqB,CAAA;IACrB,iEAAiD,CAAA;IACjD,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AACD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,oDAAqC,CAAA;IACrC,0CAA2B,CAAA;IAC3B,0EAA2D,CAAA;IAC3D,gFAAiE,CAAA;IACjE,qDAAsC,CAAA;IACtC,wEAAyD,CAAA;AAC3D,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAED,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,qCAAa,CAAA;IACb,yCAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B;AAED,IAAY,cAQX;AARD,WAAY,cAAc;IACxB,gCAAc,CAAA;IACd,+BAAa,CAAA;IACb,gCAAc,CAAA;IACd,gCAAc,CAAA;IACd,+BAAa,CAAA;IACb,+BAAa,CAAA;IACb,gCAAc,CAAA;AAChB,CAAC,EARW,cAAc,8BAAd,cAAc,QAQzB;AAED,MAAa,0BAA0B;IACrC,aAAa,CAAU;IACvB,mBAAmB,CAAU;IAC7B,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,cAAc,CAAU;CACzB;AAND,gEAMC;AAED,MAAa,sBAAsB;IACjC,gBAAgB,CAAU;IAC1B,gBAAgB,CAAU;IAC1B,uBAAuB,CAAU;IACjC,QAAQ,CAAU;CACnB;AALD,wDAKC;AAED,MAAa,UAAU;IACrB,2BAA2B,CAAU;IACrC,iBAAiB,CAAU;IAC3B,kBAAkB,CAAU;CAC7B;AAJD,gCAIC;AAED,MAAa,kBAAkB;IAC7B,IAAI,CAAU;IACd,mBAAmB,CAA0B;IAC7C,OAAO,CAAe;IACtB,uBAAuB,CAA8B;IACrD,OAAO,CAAc;IACrB,eAAe,CAAwB;CACxC;AAPD,gDAOC;AAED,MAAa,aAAa;IACxB,IAAI,CAAU;IACd,WAAW,CAAU;CACtB;AAHD,sCAGC;AAED,MAAa,mBAAmB;IAC9B,OAAO,CAAsB;IAC7B,OAAO,CAAiB;IACxB,QAAQ,CAAU;IAClB,UAAU,CAAU;IACpB,qBAAqB,CAAU;IAC/B,OAAO,CAAU;IACjB,cAAc,CAAkB;IAChC,UAAU,CAAU;IACpB,UAAU,CAAW;CACtB;AAVD,kDAUC;AAID,MAAa,4BAA4B;IACvC,KAAK,CAAmB;IACxB,IAAI,CAAU;IACd,IAAI,CAAa;CAClB;AAJD,oEAIC;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,0BAAa,CAAA;AACf,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,sCAAmB,CAAA;IACnB,4CAAyB,CAAA;IACzB,wCAAqB,CAAA;IACrB,oCAAiB,CAAA;AACnB,CAAC,EALW,eAAe,+BAAf,eAAe,QAK1B;AAED,MAAa,uBAAuB;IAClC,GAAG,CAAU;IACb,SAAS,CAAQ;IACjB,eAAe,CAAmB;CACnC;AAJD,0DAIC;
|
|
1
|
+
{"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":"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"}
|
package/src/lib/plato-sdk.d.ts
CHANGED
|
@@ -36,17 +36,19 @@ export interface CallEventMap {
|
|
|
36
36
|
};
|
|
37
37
|
'volume-level': number;
|
|
38
38
|
'call-details-ready': CallDTO;
|
|
39
|
+
'call-ended-reason': {
|
|
40
|
+
reason: string;
|
|
41
|
+
isInactivity: boolean;
|
|
42
|
+
};
|
|
39
43
|
}
|
|
40
44
|
export type CallEventNames = keyof CallEventMap;
|
|
41
45
|
export type CallEventListener<K extends CallEventNames> = (payload: CallEventMap[K]) => void;
|
|
42
46
|
export declare class PlatoApiClient {
|
|
43
47
|
private config;
|
|
44
|
-
private static readonly ACTIVE_CALL_STORAGE_KEY;
|
|
45
48
|
private http;
|
|
46
49
|
private eventListeners;
|
|
47
50
|
private callControllerInstance?;
|
|
48
51
|
private eventsAttached;
|
|
49
|
-
private currentCallId?;
|
|
50
52
|
private vapiEventNames;
|
|
51
53
|
eventNames: CallEventNames[];
|
|
52
54
|
constructor(config: ApiClientConfig);
|
|
@@ -79,66 +81,6 @@ export declare class PlatoApiClient {
|
|
|
79
81
|
* Internal: Emit SDK-specific events that are not part of Vapi.
|
|
80
82
|
*/
|
|
81
83
|
private emit;
|
|
82
|
-
/**
|
|
83
|
-
* Store active call state in localStorage for recovery purposes.
|
|
84
|
-
* @private
|
|
85
|
-
*/
|
|
86
|
-
private storeCallState;
|
|
87
|
-
/**
|
|
88
|
-
* Retrieve active call state from localStorage.
|
|
89
|
-
* Validates the stored data and clears it if invalid.
|
|
90
|
-
* @private
|
|
91
|
-
* @returns The stored call state or null if not found or invalid
|
|
92
|
-
*/
|
|
93
|
-
private getStoredCallState;
|
|
94
|
-
/**
|
|
95
|
-
* Clear active call state from localStorage.
|
|
96
|
-
* @private
|
|
97
|
-
*/
|
|
98
|
-
private clearCallState;
|
|
99
|
-
/**
|
|
100
|
-
* Check if a stored call is considered abandoned based on age.
|
|
101
|
-
* Calls older than 5 minutes are considered abandoned.
|
|
102
|
-
* @private
|
|
103
|
-
* @param state The call state to check
|
|
104
|
-
* @returns true if the call is abandoned, false otherwise
|
|
105
|
-
*/
|
|
106
|
-
private isCallAbandoned;
|
|
107
|
-
/**
|
|
108
|
-
* Recover and clean up any abandoned calls from previous sessions.
|
|
109
|
-
*
|
|
110
|
-
* This method should be called during application initialization,
|
|
111
|
-
* typically in ngOnInit() or useEffect(). It detects calls that were
|
|
112
|
-
* active when the page was last refreshed and notifies the backend
|
|
113
|
-
* to process them if they're older than 5 minutes.
|
|
114
|
-
*
|
|
115
|
-
* The backend endpoint is idempotent, so calling this method multiple
|
|
116
|
-
* times for the same call is safe.
|
|
117
|
-
*
|
|
118
|
-
* @returns Promise<boolean> - true if an abandoned call was recovered and processed
|
|
119
|
-
*
|
|
120
|
-
* @example
|
|
121
|
-
* // In Angular component
|
|
122
|
-
* async ngOnInit(): Promise<void> {
|
|
123
|
-
* const recovered = await this.platoClient.recoverAbandonedCall();
|
|
124
|
-
* if (recovered) {
|
|
125
|
-
* console.log('Recovered abandoned call from previous session');
|
|
126
|
-
* }
|
|
127
|
-
* }
|
|
128
|
-
*
|
|
129
|
-
* @example
|
|
130
|
-
* // In React component
|
|
131
|
-
* useEffect(() => {
|
|
132
|
-
* platoClient.recoverAbandonedCall()
|
|
133
|
-
* .then(recovered => {
|
|
134
|
-
* if (recovered) {
|
|
135
|
-
* console.log('Recovered abandoned call');
|
|
136
|
-
* }
|
|
137
|
-
* })
|
|
138
|
-
* .catch(console.error);
|
|
139
|
-
* }, []);
|
|
140
|
-
*/
|
|
141
|
-
recoverAbandonedCall(): Promise<boolean>;
|
|
142
84
|
createSimulation(createSimulationParams: CreateSimulationDto): Promise<{
|
|
143
85
|
simulationId: string;
|
|
144
86
|
phase: CreationPhase;
|
|
@@ -164,23 +106,16 @@ export declare class PlatoApiClient {
|
|
|
164
106
|
* Remove all listeners for all call events.
|
|
165
107
|
*/
|
|
166
108
|
private removeAllEventListeners;
|
|
109
|
+
/**
|
|
110
|
+
* Starts a call for the given simulation.
|
|
111
|
+
* Polls the backend after call-end until the call is finalized, then emits 'call-details-ready'.
|
|
112
|
+
*/
|
|
167
113
|
startCall(simulationId: string): Promise<{
|
|
168
114
|
stopCall: () => void;
|
|
169
115
|
callId: string;
|
|
170
|
-
/**
|
|
171
|
-
* Subscribe to call events for this call with strict typing.
|
|
172
|
-
* @param event Event name
|
|
173
|
-
* @param listener Listener function
|
|
174
|
-
*/
|
|
175
116
|
on: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) => void;
|
|
176
|
-
/**
|
|
177
|
-
* Unsubscribe from call events for this call with strict typing.
|
|
178
|
-
* @param event Event name
|
|
179
|
-
* @param listener Listener function
|
|
180
|
-
*/
|
|
181
117
|
off: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) => void;
|
|
182
118
|
}>;
|
|
183
|
-
private onCallEnded;
|
|
184
119
|
private createCall;
|
|
185
120
|
uploadPdfSlides(file: File | Blob): Promise<string>;
|
|
186
121
|
getRecommendations(): Promise<RecommendationsResponseDto>;
|
package/src/lib/plato-sdk.js
CHANGED
|
@@ -21,13 +21,14 @@ const utils_1 = require("./utils");
|
|
|
21
21
|
const constants_1 = require("./constants");
|
|
22
22
|
class PlatoApiClient {
|
|
23
23
|
config;
|
|
24
|
-
static ACTIVE_CALL_STORAGE_KEY = 'plato_active_call';
|
|
24
|
+
// private static readonly ACTIVE_CALL_STORAGE_KEY = 'plato_active_call';
|
|
25
25
|
http;
|
|
26
26
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
27
27
|
eventListeners = {};
|
|
28
28
|
callControllerInstance;
|
|
29
29
|
eventsAttached = false;
|
|
30
|
-
currentCallId;
|
|
30
|
+
// private currentCallId?: string;
|
|
31
|
+
// private receivedAnyTranscript = false;
|
|
31
32
|
// Vapi-native events (events that Vapi SDK supports)
|
|
32
33
|
// Exclude our custom SDK events from this list
|
|
33
34
|
vapiEventNames = [
|
|
@@ -49,6 +50,7 @@ class PlatoApiClient {
|
|
|
49
50
|
'message',
|
|
50
51
|
'volume-level',
|
|
51
52
|
'call-details-ready',
|
|
53
|
+
'call-ended-reason',
|
|
52
54
|
];
|
|
53
55
|
constructor(config) {
|
|
54
56
|
this.config = config;
|
|
@@ -130,132 +132,125 @@ class PlatoApiClient {
|
|
|
130
132
|
listeners.forEach(listener => listener(payload));
|
|
131
133
|
}
|
|
132
134
|
}
|
|
133
|
-
/**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
storeCallState(state) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
}
|
|
253
|
-
catch (error) {
|
|
254
|
-
console.error('Error during call recovery:', error);
|
|
255
|
-
this.clearCallState();
|
|
256
|
-
return false;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
135
|
+
// /**
|
|
136
|
+
// * Store active call state in localStorage for recovery purposes.
|
|
137
|
+
// * @private
|
|
138
|
+
// */
|
|
139
|
+
// private storeCallState(state: ActiveCallState): void {
|
|
140
|
+
// try {
|
|
141
|
+
// localStorage.setItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY, JSON.stringify(state));
|
|
142
|
+
// } catch (error) {
|
|
143
|
+
// console.warn('Failed to store call state:', error);
|
|
144
|
+
// }
|
|
145
|
+
// }
|
|
146
|
+
// /**
|
|
147
|
+
// * Retrieve active call state from localStorage.
|
|
148
|
+
// * Validates the stored data and clears it if invalid.
|
|
149
|
+
// * @private
|
|
150
|
+
// * @returns The stored call state or null if not found or invalid
|
|
151
|
+
// */
|
|
152
|
+
// private getStoredCallState(): ActiveCallState | null {
|
|
153
|
+
// try {
|
|
154
|
+
// const stored = localStorage.getItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY);
|
|
155
|
+
// if (!stored) {
|
|
156
|
+
// return null;
|
|
157
|
+
// }
|
|
158
|
+
// const parsed = JSON.parse(stored) as ActiveCallState;
|
|
159
|
+
// // Validate required fields
|
|
160
|
+
// if (!parsed.callId || !parsed.externalCallId || !parsed.simulationId || !parsed.startedAt) {
|
|
161
|
+
// this.clearCallState();
|
|
162
|
+
// return null;
|
|
163
|
+
// }
|
|
164
|
+
// return parsed;
|
|
165
|
+
// } catch {
|
|
166
|
+
// return null;
|
|
167
|
+
// }
|
|
168
|
+
// }
|
|
169
|
+
// /**
|
|
170
|
+
// * Clear active call state from localStorage.
|
|
171
|
+
// * @private
|
|
172
|
+
// */
|
|
173
|
+
// private clearCallState(): void {
|
|
174
|
+
// try {
|
|
175
|
+
// localStorage.removeItem(PlatoApiClient.ACTIVE_CALL_STORAGE_KEY);
|
|
176
|
+
// } catch {
|
|
177
|
+
// // ignore
|
|
178
|
+
// }
|
|
179
|
+
// }
|
|
180
|
+
// /**
|
|
181
|
+
// * Check if a stored call is considered abandoned based on age.
|
|
182
|
+
// * Calls older than 5 minutes are considered abandoned.
|
|
183
|
+
// * @private
|
|
184
|
+
// * @param state The call state to check
|
|
185
|
+
// * @returns true if the call is abandoned, false otherwise
|
|
186
|
+
// */
|
|
187
|
+
// private isCallAbandoned(state: ActiveCallState): boolean {
|
|
188
|
+
// const ABANDONMENT_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes
|
|
189
|
+
// const startedAt = new Date(state.startedAt).getTime();
|
|
190
|
+
// const now = Date.now();
|
|
191
|
+
// const age = now - startedAt;
|
|
192
|
+
// return age > ABANDONMENT_THRESHOLD_MS;
|
|
193
|
+
// }
|
|
194
|
+
// /**
|
|
195
|
+
// * Recover and clean up any abandoned calls from previous sessions.
|
|
196
|
+
// *
|
|
197
|
+
// * This method should be called during application initialization,
|
|
198
|
+
// * typically in ngOnInit() or useEffect(). It detects calls that were
|
|
199
|
+
// * active when the page was last refreshed and notifies the backend
|
|
200
|
+
// * to process them if they're older than 5 minutes.
|
|
201
|
+
// *
|
|
202
|
+
// * The backend endpoint is idempotent, so calling this method multiple
|
|
203
|
+
// * times for the same call is safe.
|
|
204
|
+
// *
|
|
205
|
+
// * @returns Promise<boolean> - true if an abandoned call was recovered and processed
|
|
206
|
+
// *
|
|
207
|
+
// * @example
|
|
208
|
+
// * // In Angular component
|
|
209
|
+
// * async ngOnInit(): Promise<void> {
|
|
210
|
+
// * const recovered = await this.platoClient.recoverAbandonedCall();
|
|
211
|
+
// * if (recovered) {
|
|
212
|
+
// * console.log('Recovered abandoned call from previous session');
|
|
213
|
+
// * }
|
|
214
|
+
// * }
|
|
215
|
+
// *
|
|
216
|
+
// * @example
|
|
217
|
+
// * // In React component
|
|
218
|
+
// * useEffect(() => {
|
|
219
|
+
// * platoClient.recoverAbandonedCall()
|
|
220
|
+
// * .then(recovered => {
|
|
221
|
+
// * if (recovered) {
|
|
222
|
+
// * console.log('Recovered abandoned call');
|
|
223
|
+
// * }
|
|
224
|
+
// * })
|
|
225
|
+
// * .catch(console.error);
|
|
226
|
+
// * }, []);
|
|
227
|
+
// */
|
|
228
|
+
// async recoverAbandonedCall(): Promise<boolean> {
|
|
229
|
+
// try {
|
|
230
|
+
// const storedState = this.getStoredCallState();
|
|
231
|
+
// if (!storedState) {
|
|
232
|
+
// return false;
|
|
233
|
+
// }
|
|
234
|
+
// if (!this.isCallAbandoned(storedState)) {
|
|
235
|
+
// return false;
|
|
236
|
+
// }
|
|
237
|
+
// console.log('Detected abandoned call, notifying backend:', storedState.callId);
|
|
238
|
+
// try {
|
|
239
|
+
// const response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
240
|
+
// callId: storedState.callId,
|
|
241
|
+
// });
|
|
242
|
+
// console.log('Backend notified of abandoned call:', response.data);
|
|
243
|
+
// } catch (error) {
|
|
244
|
+
// console.error('Failed to notify backend of abandoned call:', error);
|
|
245
|
+
// }
|
|
246
|
+
// this.clearCallState();
|
|
247
|
+
// return true;
|
|
248
|
+
// } catch (error) {
|
|
249
|
+
// console.error('Error during call recovery:', error);
|
|
250
|
+
// this.clearCallState();
|
|
251
|
+
// return false;
|
|
252
|
+
// }
|
|
253
|
+
// }
|
|
259
254
|
async createSimulation(createSimulationParams) {
|
|
260
255
|
try {
|
|
261
256
|
const res = await this.http.post('/api/v1/simulation', {
|
|
@@ -267,9 +262,9 @@ class PlatoApiClient {
|
|
|
267
262
|
};
|
|
268
263
|
}
|
|
269
264
|
catch (e) {
|
|
270
|
-
if (
|
|
271
|
-
|
|
272
|
-
}
|
|
265
|
+
// if (axios.isAxiosError(e)) {
|
|
266
|
+
// console.error('Error creating simulation:', e.response?.data.message);
|
|
267
|
+
// }
|
|
273
268
|
throw e;
|
|
274
269
|
}
|
|
275
270
|
}
|
|
@@ -283,9 +278,9 @@ class PlatoApiClient {
|
|
|
283
278
|
return res.data;
|
|
284
279
|
}
|
|
285
280
|
catch (e) {
|
|
286
|
-
if (
|
|
287
|
-
|
|
288
|
-
}
|
|
281
|
+
// if (axios.isAxiosError(e)) {
|
|
282
|
+
// console.error('Error getting user simulations:', e.response?.data.message);
|
|
283
|
+
// }
|
|
289
284
|
throw e;
|
|
290
285
|
}
|
|
291
286
|
}
|
|
@@ -295,9 +290,9 @@ class PlatoApiClient {
|
|
|
295
290
|
return res.data;
|
|
296
291
|
}
|
|
297
292
|
catch (e) {
|
|
298
|
-
if (
|
|
299
|
-
|
|
300
|
-
}
|
|
293
|
+
// if (axios.isAxiosError(e)) {
|
|
294
|
+
// console.error('Error getting simulation details:', e.response?.data.message);
|
|
295
|
+
// }
|
|
301
296
|
throw e;
|
|
302
297
|
}
|
|
303
298
|
}
|
|
@@ -311,9 +306,9 @@ class PlatoApiClient {
|
|
|
311
306
|
await this.http.delete(`/api/v1/simulation/${simulationId}`);
|
|
312
307
|
}
|
|
313
308
|
catch (e) {
|
|
314
|
-
if (
|
|
315
|
-
|
|
316
|
-
}
|
|
309
|
+
// if (axios.isAxiosError(e)) {
|
|
310
|
+
// console.error('Error deleting simulation:', e.response?.data.message);
|
|
311
|
+
// }
|
|
317
312
|
throw e;
|
|
318
313
|
}
|
|
319
314
|
}
|
|
@@ -323,9 +318,9 @@ class PlatoApiClient {
|
|
|
323
318
|
return res.data;
|
|
324
319
|
}
|
|
325
320
|
catch (e) {
|
|
326
|
-
if (
|
|
327
|
-
|
|
328
|
-
}
|
|
321
|
+
// if (axios.isAxiosError(e)) {
|
|
322
|
+
// console.error('Error getting call details:', e.response?.data.message);
|
|
323
|
+
// }
|
|
329
324
|
throw e;
|
|
330
325
|
}
|
|
331
326
|
}
|
|
@@ -337,9 +332,9 @@ class PlatoApiClient {
|
|
|
337
332
|
return res.data;
|
|
338
333
|
}
|
|
339
334
|
catch (e) {
|
|
340
|
-
if (
|
|
341
|
-
|
|
342
|
-
}
|
|
335
|
+
// if (axios.isAxiosError(e)) {
|
|
336
|
+
// console.error('Error getting call recordings:', e.response?.data.message);
|
|
337
|
+
// }
|
|
343
338
|
throw e;
|
|
344
339
|
}
|
|
345
340
|
}
|
|
@@ -349,9 +344,9 @@ class PlatoApiClient {
|
|
|
349
344
|
return res.data;
|
|
350
345
|
}
|
|
351
346
|
catch (e) {
|
|
352
|
-
if (
|
|
353
|
-
|
|
354
|
-
}
|
|
347
|
+
// if (axios.isAxiosError(e)) {
|
|
348
|
+
// console.error('Error getting call recording:', e.response?.data.message);
|
|
349
|
+
// }
|
|
355
350
|
throw e;
|
|
356
351
|
}
|
|
357
352
|
}
|
|
@@ -371,39 +366,218 @@ class PlatoApiClient {
|
|
|
371
366
|
});
|
|
372
367
|
this.eventsAttached = false;
|
|
373
368
|
}
|
|
369
|
+
// async startCall(simulationId: string) {
|
|
370
|
+
// // Check for any previous call state before starting new call
|
|
371
|
+
// // If found, notify backend to ensure it gets processed
|
|
372
|
+
// const storedState = this.getStoredCallState();
|
|
373
|
+
// if (storedState) {
|
|
374
|
+
// try {
|
|
375
|
+
// await this.http.post('/api/v1/postcall/call-ended', {
|
|
376
|
+
// callId: storedState.callId,
|
|
377
|
+
// });
|
|
378
|
+
// } catch {
|
|
379
|
+
// // ignore
|
|
380
|
+
// }
|
|
381
|
+
// }
|
|
382
|
+
//
|
|
383
|
+
// // Now clear the state before starting new call
|
|
384
|
+
// this.clearCallState();
|
|
385
|
+
//
|
|
386
|
+
// this.callControllerInstance = new Vapi(
|
|
387
|
+
// this.config.publicKey,
|
|
388
|
+
// 'https://db41aykk1gw9e.cloudfront.net' // base url
|
|
389
|
+
// );
|
|
390
|
+
// if (!this.eventsAttached) {
|
|
391
|
+
// this.attachEvents();
|
|
392
|
+
// }
|
|
393
|
+
//
|
|
394
|
+
// this.receivedAnyTranscript = false;
|
|
395
|
+
// this.callControllerInstance.on(
|
|
396
|
+
// 'message',
|
|
397
|
+
// (msg: { transcript?: string; type?: string; status?: string; endedReason?: string }) => {
|
|
398
|
+
// if (msg.transcript && msg.transcript.trim().length > 0) {
|
|
399
|
+
// this.receivedAnyTranscript = true;
|
|
400
|
+
// }
|
|
401
|
+
// if (msg.type === 'status-update' && msg.status === 'ended' && msg.endedReason) {
|
|
402
|
+
// const reason = msg.endedReason;
|
|
403
|
+
// const isInactivity = /silence|inactivity/i.test(reason);
|
|
404
|
+
// this.emit('call-ended-reason', { reason, isInactivity });
|
|
405
|
+
// }
|
|
406
|
+
// }
|
|
407
|
+
// );
|
|
408
|
+
//
|
|
409
|
+
// // Internal call-end listener
|
|
410
|
+
// this.callControllerInstance.on('call-end', () => {
|
|
411
|
+
// this.onCallEnded().catch(() => {
|
|
412
|
+
// // ignore
|
|
413
|
+
// });
|
|
414
|
+
// });
|
|
415
|
+
//
|
|
416
|
+
// const { data } = await this.http.get(`/api/v1/simulation/${simulationId}`);
|
|
417
|
+
// const assistantId = data as string;
|
|
418
|
+
//
|
|
419
|
+
// let capturedVapiError: unknown;
|
|
420
|
+
// const vapiErrorCapture = (error: unknown) => {
|
|
421
|
+
// capturedVapiError = error;
|
|
422
|
+
// };
|
|
423
|
+
// this.callControllerInstance.on('error', vapiErrorCapture);
|
|
424
|
+
//
|
|
425
|
+
// let call: Call | null;
|
|
426
|
+
// try {
|
|
427
|
+
// call = await this.callControllerInstance.start(assistantId);
|
|
428
|
+
// } catch (e) {
|
|
429
|
+
// this.callControllerInstance.off('error', vapiErrorCapture);
|
|
430
|
+
// this.callControllerInstance?.stop();
|
|
431
|
+
// this.removeAllEventListeners();
|
|
432
|
+
// this.clearCallState();
|
|
433
|
+
// throw e;
|
|
434
|
+
// }
|
|
435
|
+
//
|
|
436
|
+
// this.callControllerInstance.off('error', vapiErrorCapture);
|
|
437
|
+
//
|
|
438
|
+
// if (!call || !call.assistantId) {
|
|
439
|
+
// this.callControllerInstance?.stop();
|
|
440
|
+
// this.removeAllEventListeners();
|
|
441
|
+
// this.clearCallState();
|
|
442
|
+
// if (isCallConcurrencyError(capturedVapiError)) {
|
|
443
|
+
// throw new CallConcurrencyLimitError();
|
|
444
|
+
// }
|
|
445
|
+
// throw new Error('Cannot start a call, please try again later');
|
|
446
|
+
// }
|
|
447
|
+
// try {
|
|
448
|
+
// const apiCall = await this.createCall({
|
|
449
|
+
// callId: call.id,
|
|
450
|
+
// assistantId: call.assistantId,
|
|
451
|
+
// });
|
|
452
|
+
//
|
|
453
|
+
// this.currentCallId = apiCall._id;
|
|
454
|
+
//
|
|
455
|
+
// this.storeCallState({
|
|
456
|
+
// callId: apiCall._id,
|
|
457
|
+
// externalCallId: call.id,
|
|
458
|
+
// simulationId: simulationId,
|
|
459
|
+
// startedAt: new Date().toISOString(),
|
|
460
|
+
// version: 1,
|
|
461
|
+
// });
|
|
462
|
+
//
|
|
463
|
+
// return {
|
|
464
|
+
// stopCall: () => {
|
|
465
|
+
// this.callControllerInstance?.stop();
|
|
466
|
+
// },
|
|
467
|
+
// callId: apiCall._id,
|
|
468
|
+
// on: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) =>
|
|
469
|
+
// this.on(event, listener),
|
|
470
|
+
// off: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) =>
|
|
471
|
+
// this.off(event, listener),
|
|
472
|
+
// };
|
|
473
|
+
// } catch (e) {
|
|
474
|
+
// this.callControllerInstance?.stop();
|
|
475
|
+
// this.removeAllEventListeners();
|
|
476
|
+
// this.clearCallState();
|
|
477
|
+
// throw e;
|
|
478
|
+
// }
|
|
479
|
+
// }
|
|
480
|
+
/**
|
|
481
|
+
* Starts a call for the given simulation.
|
|
482
|
+
* Polls the backend after call-end until the call is finalized, then emits 'call-details-ready'.
|
|
483
|
+
*/
|
|
374
484
|
async startCall(simulationId) {
|
|
375
|
-
|
|
376
|
-
// If found, notify backend to ensure it gets processed
|
|
377
|
-
const storedState = this.getStoredCallState();
|
|
378
|
-
if (storedState) {
|
|
379
|
-
console.log('Found previous call state, notifying backend before starting new call:', storedState.callId);
|
|
380
|
-
try {
|
|
381
|
-
await this.http.post('/api/v1/postcall/call-ended', {
|
|
382
|
-
callId: storedState.callId,
|
|
383
|
-
});
|
|
384
|
-
console.log('Backend notified of previous call');
|
|
385
|
-
}
|
|
386
|
-
catch (error) {
|
|
387
|
-
console.error('Failed to notify backend of previous call:', error);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
// Now clear the state before starting new call
|
|
391
|
-
this.clearCallState();
|
|
392
|
-
this.callControllerInstance = new web_1.default(this.config.publicKey, 'https://db41aykk1gw9e.cloudfront.net' // base url
|
|
393
|
-
);
|
|
485
|
+
this.callControllerInstance = new web_1.default(this.config.publicKey, 'https://db41aykk1gw9e.cloudfront.net');
|
|
394
486
|
if (!this.eventsAttached) {
|
|
395
487
|
this.attachEvents();
|
|
396
488
|
}
|
|
397
|
-
|
|
489
|
+
this.callControllerInstance.on('message', (msg) => {
|
|
490
|
+
if (msg.type === 'status-update' && msg.status === 'ended' && msg.endedReason) {
|
|
491
|
+
const reason = msg.endedReason;
|
|
492
|
+
const isInactivity = /silence|inactivity/i.test(reason);
|
|
493
|
+
this.emit('call-ended-reason', { reason, isInactivity });
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
let callId;
|
|
497
|
+
let stopPolling;
|
|
398
498
|
this.callControllerInstance.on('call-end', () => {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
499
|
+
if (!callId)
|
|
500
|
+
return;
|
|
501
|
+
const callAge = Date.now() - callStartedAt;
|
|
502
|
+
// console.log(`[PlatoSDK] Call ended. Age: ${callAge}ms (${(callAge / 1000).toFixed(2)}s)`);
|
|
503
|
+
if (callAge < 20000) {
|
|
504
|
+
// Call ended within 20s — return whatever is in the DB without requiring a transcript
|
|
505
|
+
const fetchAndEmit = async () => {
|
|
506
|
+
try {
|
|
507
|
+
// console.log('[PlatoSDK] Early end (<20s) — fetching call details immediately (no transcript check)');
|
|
508
|
+
const { data } = await this.http.get(`/api/v1/simulation/call/${callId}`);
|
|
509
|
+
this.emit('call-details-ready', data);
|
|
510
|
+
}
|
|
511
|
+
catch (e) {
|
|
512
|
+
this.emit('error', e instanceof Error ? e : new Error('Failed to fetch call details'));
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
this.removeAllEventListeners();
|
|
516
|
+
}
|
|
517
|
+
};
|
|
518
|
+
void fetchAndEmit();
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
let stopped = false;
|
|
522
|
+
let nextPollTimer;
|
|
523
|
+
const poll = async () => {
|
|
524
|
+
if (stopped)
|
|
525
|
+
return;
|
|
526
|
+
try {
|
|
527
|
+
// console.log('[PlatoSDK] Polling for call details (waiting for transcript)...');
|
|
528
|
+
const { data } = await this.http.get(`/api/v1/simulation/call/${callId}`);
|
|
529
|
+
if (data.transcript) {
|
|
530
|
+
stopped = true;
|
|
531
|
+
clearTimeout(globalTimer);
|
|
532
|
+
// console.log('[PlatoSDK] Transcript ready — emitting call-details-ready');
|
|
533
|
+
this.emit('call-details-ready', data);
|
|
534
|
+
this.removeAllEventListeners();
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
catch {
|
|
539
|
+
// ignore transient errors, keep polling
|
|
540
|
+
}
|
|
541
|
+
nextPollTimer = setTimeout(() => void poll(), 3000);
|
|
542
|
+
};
|
|
543
|
+
nextPollTimer = setTimeout(() => void poll(), 3000);
|
|
544
|
+
const globalTimer = setTimeout(() => {
|
|
545
|
+
stopped = true;
|
|
546
|
+
clearTimeout(nextPollTimer);
|
|
547
|
+
this.removeAllEventListeners();
|
|
548
|
+
}, 60000);
|
|
549
|
+
stopPolling = () => {
|
|
550
|
+
stopped = true;
|
|
551
|
+
clearTimeout(nextPollTimer);
|
|
552
|
+
clearTimeout(globalTimer);
|
|
553
|
+
};
|
|
402
554
|
});
|
|
403
555
|
const { data } = await this.http.get(`/api/v1/simulation/${simulationId}`);
|
|
404
556
|
const assistantId = data;
|
|
405
|
-
|
|
557
|
+
let capturedVapiError;
|
|
558
|
+
const vapiErrorCapture = (error) => {
|
|
559
|
+
capturedVapiError = error;
|
|
560
|
+
};
|
|
561
|
+
this.callControllerInstance.on('error', vapiErrorCapture);
|
|
562
|
+
const callStartedAt = Date.now();
|
|
563
|
+
// console.log('[PlatoSDK] Call start initiated at:', new Date(callStartedAt).toISOString());
|
|
564
|
+
let call;
|
|
565
|
+
try {
|
|
566
|
+
call = await this.callControllerInstance.start(assistantId);
|
|
567
|
+
}
|
|
568
|
+
catch (e) {
|
|
569
|
+
this.callControllerInstance.off('error', vapiErrorCapture);
|
|
570
|
+
this.callControllerInstance.stop();
|
|
571
|
+
this.removeAllEventListeners();
|
|
572
|
+
throw e;
|
|
573
|
+
}
|
|
574
|
+
this.callControllerInstance.off('error', vapiErrorCapture);
|
|
406
575
|
if (!call || !call.assistantId) {
|
|
576
|
+
this.callControllerInstance.stop();
|
|
577
|
+
this.removeAllEventListeners();
|
|
578
|
+
if ((0, utils_1.isCallConcurrencyError)(capturedVapiError)) {
|
|
579
|
+
throw new utils_1.CallConcurrencyLimitError();
|
|
580
|
+
}
|
|
407
581
|
throw new Error('Cannot start a call, please try again later');
|
|
408
582
|
}
|
|
409
583
|
try {
|
|
@@ -411,82 +585,62 @@ class PlatoApiClient {
|
|
|
411
585
|
callId: call.id,
|
|
412
586
|
assistantId: call.assistantId,
|
|
413
587
|
});
|
|
414
|
-
|
|
415
|
-
this.currentCallId = apiCall._id;
|
|
416
|
-
// Store call state in localStorage for recovery
|
|
417
|
-
this.storeCallState({
|
|
418
|
-
callId: apiCall._id,
|
|
419
|
-
externalCallId: call.id,
|
|
420
|
-
simulationId: simulationId,
|
|
421
|
-
startedAt: new Date().toISOString(),
|
|
422
|
-
version: 1,
|
|
423
|
-
});
|
|
424
|
-
// Return stopCall, callId, and event subscription methods with strict typing
|
|
588
|
+
callId = apiCall._id;
|
|
425
589
|
return {
|
|
426
590
|
stopCall: () => {
|
|
427
591
|
this.callControllerInstance?.stop();
|
|
428
|
-
|
|
429
|
-
this.clearCallState();
|
|
592
|
+
stopPolling?.();
|
|
430
593
|
},
|
|
431
594
|
callId: apiCall._id,
|
|
432
|
-
/**
|
|
433
|
-
* Subscribe to call events for this call with strict typing.
|
|
434
|
-
* @param event Event name
|
|
435
|
-
* @param listener Listener function
|
|
436
|
-
*/
|
|
437
595
|
on: (event, listener) => this.on(event, listener),
|
|
438
|
-
/**
|
|
439
|
-
* Unsubscribe from call events for this call with strict typing.
|
|
440
|
-
* @param event Event name
|
|
441
|
-
* @param listener Listener function
|
|
442
|
-
*/
|
|
443
596
|
off: (event, listener) => this.off(event, listener),
|
|
444
597
|
};
|
|
445
598
|
}
|
|
446
599
|
catch (e) {
|
|
447
600
|
this.callControllerInstance?.stop();
|
|
448
601
|
this.removeAllEventListeners();
|
|
449
|
-
this.clearCallState();
|
|
450
602
|
throw e;
|
|
451
603
|
}
|
|
452
604
|
}
|
|
453
|
-
async onCallEnded() {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
605
|
+
// private async onCallEnded(): Promise<void> {
|
|
606
|
+
// let callIdForRetry: string | undefined;
|
|
607
|
+
// try {
|
|
608
|
+
// if (!this.currentCallId) {
|
|
609
|
+
// return;
|
|
610
|
+
// }
|
|
611
|
+
//
|
|
612
|
+
// if (!this.receivedAnyTranscript) {
|
|
613
|
+
// return;
|
|
614
|
+
// }
|
|
615
|
+
//
|
|
616
|
+
// callIdForRetry = this.currentCallId;
|
|
617
|
+
//
|
|
618
|
+
// // First attempt
|
|
619
|
+
// let response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
620
|
+
// callId: callIdForRetry,
|
|
621
|
+
// });
|
|
622
|
+
//
|
|
623
|
+
// // If status is "processing", retry once immediately
|
|
624
|
+
// if (response.data?.status === 'processing') {
|
|
625
|
+
// response = await this.http.post('/api/v1/postcall/call-ended', {
|
|
626
|
+
// callId: callIdForRetry,
|
|
627
|
+
// });
|
|
628
|
+
// }
|
|
629
|
+
//
|
|
630
|
+
// try {
|
|
631
|
+
// const callDetails = await this.getCallDetails(callIdForRetry);
|
|
632
|
+
// this.emit('call-details-ready', callDetails);
|
|
633
|
+
// } catch {
|
|
634
|
+
// // ignore
|
|
635
|
+
// }
|
|
636
|
+
// } catch {
|
|
637
|
+
// // ignore
|
|
638
|
+
// } finally {
|
|
639
|
+
// this.currentCallId = undefined;
|
|
640
|
+
// this.clearCallState();
|
|
641
|
+
// this.removeAllEventListeners();
|
|
642
|
+
// }
|
|
643
|
+
// }
|
|
490
644
|
async createCall(payload) {
|
|
491
645
|
const response = await this.http.post('/api/v1/simulation/call', {
|
|
492
646
|
...payload,
|
|
@@ -533,8 +687,8 @@ class PlatoApiClient {
|
|
|
533
687
|
try {
|
|
534
688
|
await this.deleteSlideAnalysis(pdfId);
|
|
535
689
|
}
|
|
536
|
-
catch
|
|
537
|
-
console.error('Failed to clean up PDF record after upload failure:', deleteError);
|
|
690
|
+
catch {
|
|
691
|
+
// console.error('Failed to clean up PDF record after upload failure:', deleteError);
|
|
538
692
|
}
|
|
539
693
|
throw uploadError;
|
|
540
694
|
}
|
|
@@ -548,12 +702,14 @@ class PlatoApiClient {
|
|
|
548
702
|
return pdfId;
|
|
549
703
|
}
|
|
550
704
|
catch (e) {
|
|
551
|
-
if (
|
|
552
|
-
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
705
|
+
// if (axios.isAxiosError(e)) {
|
|
706
|
+
// console.error('Error uploading PDF slides:', e.response?.data?.message || e.message);
|
|
707
|
+
// } else {
|
|
708
|
+
// console.error(
|
|
709
|
+
// 'Error uploading PDF slides:',
|
|
710
|
+
// e instanceof Error ? e.message : 'Unknown error'
|
|
711
|
+
// );
|
|
712
|
+
// }
|
|
557
713
|
throw e;
|
|
558
714
|
}
|
|
559
715
|
}
|
|
@@ -563,9 +719,9 @@ class PlatoApiClient {
|
|
|
563
719
|
return res.data;
|
|
564
720
|
}
|
|
565
721
|
catch (e) {
|
|
566
|
-
if (
|
|
567
|
-
|
|
568
|
-
}
|
|
722
|
+
// if (axios.isAxiosError(e)) {
|
|
723
|
+
// console.error('Error getting recommendations:', e.response?.data.message);
|
|
724
|
+
// }
|
|
569
725
|
throw e;
|
|
570
726
|
}
|
|
571
727
|
}
|
|
@@ -577,9 +733,9 @@ class PlatoApiClient {
|
|
|
577
733
|
return res.data;
|
|
578
734
|
}
|
|
579
735
|
catch (e) {
|
|
580
|
-
if (
|
|
581
|
-
|
|
582
|
-
}
|
|
736
|
+
// if (axios.isAxiosError(e)) {
|
|
737
|
+
// console.error('Error getting PDF slides analysis:', e.response?.data.message);
|
|
738
|
+
// }
|
|
583
739
|
throw e;
|
|
584
740
|
}
|
|
585
741
|
}
|
|
@@ -589,9 +745,9 @@ class PlatoApiClient {
|
|
|
589
745
|
return res.data;
|
|
590
746
|
}
|
|
591
747
|
catch (e) {
|
|
592
|
-
if (
|
|
593
|
-
|
|
594
|
-
}
|
|
748
|
+
// if (axios.isAxiosError(e)) {
|
|
749
|
+
// console.error('Error getting PDF slide analysis by ID:', e.response?.data.message);
|
|
750
|
+
// }
|
|
595
751
|
throw e;
|
|
596
752
|
}
|
|
597
753
|
}
|
|
@@ -600,9 +756,9 @@ class PlatoApiClient {
|
|
|
600
756
|
await this.http.delete(`/api/v1/pdfSlides/${id}`);
|
|
601
757
|
}
|
|
602
758
|
catch (e) {
|
|
603
|
-
if (
|
|
604
|
-
|
|
605
|
-
}
|
|
759
|
+
// if (axios.isAxiosError(e)) {
|
|
760
|
+
// console.error('Error deleting PDF slide analysis:', e.response?.data.message);
|
|
761
|
+
// }
|
|
606
762
|
throw e;
|
|
607
763
|
}
|
|
608
764
|
}
|
|
@@ -612,9 +768,9 @@ class PlatoApiClient {
|
|
|
612
768
|
return res.data;
|
|
613
769
|
}
|
|
614
770
|
catch (e) {
|
|
615
|
-
if (
|
|
616
|
-
|
|
617
|
-
}
|
|
771
|
+
// if (axios.isAxiosError(e)) {
|
|
772
|
+
// console.error('Error checking PDF status:', e.response?.data.message);
|
|
773
|
+
// }
|
|
618
774
|
throw e;
|
|
619
775
|
}
|
|
620
776
|
}
|
|
@@ -624,9 +780,9 @@ class PlatoApiClient {
|
|
|
624
780
|
return res.data;
|
|
625
781
|
}
|
|
626
782
|
catch (e) {
|
|
627
|
-
if (
|
|
628
|
-
|
|
629
|
-
}
|
|
783
|
+
// if (axios.isAxiosError(e)) {
|
|
784
|
+
// console.error('Error getting assistant images:', e.response?.data.message);
|
|
785
|
+
// }
|
|
630
786
|
throw e;
|
|
631
787
|
}
|
|
632
788
|
}
|
|
@@ -642,9 +798,9 @@ class PlatoApiClient {
|
|
|
642
798
|
await this.http.delete(`/api/v1/simulation/call/${callId}`);
|
|
643
799
|
}
|
|
644
800
|
catch (e) {
|
|
645
|
-
if (
|
|
646
|
-
|
|
647
|
-
}
|
|
801
|
+
// if (axios.isAxiosError(e)) {
|
|
802
|
+
// console.error('Error deleting call:', e.response?.data.message);
|
|
803
|
+
// }
|
|
648
804
|
throw e;
|
|
649
805
|
}
|
|
650
806
|
}
|
package/src/lib/plato-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
|
package/src/lib/utils.d.ts
CHANGED
package/src/lib/utils.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CallConcurrencyLimitError = void 0;
|
|
4
|
+
exports.isCallConcurrencyError = isCallConcurrencyError;
|
|
3
5
|
exports.checkFile = checkFile;
|
|
4
6
|
exports.calculateHash = calculateHash;
|
|
5
7
|
exports.getPdfPageCount = getPdfPageCount;
|
|
@@ -17,6 +19,28 @@ exports.getPdfPageCount = getPdfPageCount;
|
|
|
17
19
|
* For internal use only.
|
|
18
20
|
*/
|
|
19
21
|
const pdf_lib_1 = require("pdf-lib");
|
|
22
|
+
class CallConcurrencyLimitError extends Error {
|
|
23
|
+
constructor() {
|
|
24
|
+
super('Over Concurrency Limit');
|
|
25
|
+
this.name = 'CallConcurrencyLimitError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.CallConcurrencyLimitError = CallConcurrencyLimitError;
|
|
29
|
+
function isCallConcurrencyError(err) {
|
|
30
|
+
if (!err || typeof err !== 'object')
|
|
31
|
+
return false;
|
|
32
|
+
const obj = err;
|
|
33
|
+
if (typeof obj['message'] === 'string' && obj['message'].includes('Over Concurrency Limit'))
|
|
34
|
+
return true;
|
|
35
|
+
// Vapi Response-like shape: { error: { message: "Over Concurrency Limit." } }
|
|
36
|
+
const nested = obj['error'];
|
|
37
|
+
if (nested && typeof nested === 'object') {
|
|
38
|
+
const nestedMsg = nested['message'];
|
|
39
|
+
if (typeof nestedMsg === 'string' && nestedMsg.includes('Over Concurrency Limit'))
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
20
44
|
/**
|
|
21
45
|
* Validates a file against size and type constraints.
|
|
22
46
|
*
|
package/src/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/utils.ts"],"names":[],"mappings":"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"}
|