@vapi-ai/web 2.2.0 → 2.2.2
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/dist/vapi.d.ts +1 -0
- package/dist/vapi.js +13 -0
- package/package.json +1 -1
- package/vapi.ts +14 -0
package/dist/vapi.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export default class Vapi extends VapiEventEmitter {
|
|
|
43
43
|
private speakingTimeout;
|
|
44
44
|
private dailyCallConfig;
|
|
45
45
|
private dailyCallObject;
|
|
46
|
+
private hasEmittedCallEndedStatus;
|
|
46
47
|
constructor(apiToken: string, apiBaseUrl?: string, dailyCallConfig?: Pick<DailyAdvancedConfig, 'avoidEval' | 'alwaysIncludeMicInPermissionPrompt'>, dailyCallObject?: Pick<DailyFactoryOptions, 'audioSource'>);
|
|
47
48
|
private cleanup;
|
|
48
49
|
private isMobileDevice;
|
package/dist/vapi.js
CHANGED
|
@@ -62,6 +62,7 @@ class Vapi extends VapiEventEmitter {
|
|
|
62
62
|
speakingTimeout = null;
|
|
63
63
|
dailyCallConfig = {};
|
|
64
64
|
dailyCallObject = {};
|
|
65
|
+
hasEmittedCallEndedStatus = false;
|
|
65
66
|
constructor(apiToken, apiBaseUrl, dailyCallConfig, dailyCallObject) {
|
|
66
67
|
super();
|
|
67
68
|
client_1.client.baseUrl = apiBaseUrl ?? 'https://api.vapi.ai';
|
|
@@ -71,6 +72,7 @@ class Vapi extends VapiEventEmitter {
|
|
|
71
72
|
}
|
|
72
73
|
cleanup() {
|
|
73
74
|
this.started = false;
|
|
75
|
+
this.hasEmittedCallEndedStatus = false;
|
|
74
76
|
this.call?.destroy();
|
|
75
77
|
this.call = null;
|
|
76
78
|
this.speakingTimeout = null;
|
|
@@ -114,6 +116,14 @@ class Vapi extends VapiEventEmitter {
|
|
|
114
116
|
this.call.iframe()?.style.setProperty('display', 'none');
|
|
115
117
|
this.call.on('left-meeting', () => {
|
|
116
118
|
this.emit('call-end');
|
|
119
|
+
if (!this.hasEmittedCallEndedStatus) {
|
|
120
|
+
this.emit('message', {
|
|
121
|
+
type: 'status-update',
|
|
122
|
+
status: 'ended',
|
|
123
|
+
'endedReason': 'customer-ended-call',
|
|
124
|
+
});
|
|
125
|
+
this.hasEmittedCallEndedStatus = true;
|
|
126
|
+
}
|
|
117
127
|
if (isVideoRecordingEnabled) {
|
|
118
128
|
this.call?.stopRecording();
|
|
119
129
|
}
|
|
@@ -241,6 +251,9 @@ class Vapi extends VapiEventEmitter {
|
|
|
241
251
|
try {
|
|
242
252
|
const parsedMessage = JSON.parse(e.data);
|
|
243
253
|
this.emit('message', parsedMessage);
|
|
254
|
+
if (parsedMessage && 'type' in parsedMessage && 'status' in parsedMessage && parsedMessage.type === 'status-update' && parsedMessage.status === 'ended') {
|
|
255
|
+
this.hasEmittedCallEndedStatus = true;
|
|
256
|
+
}
|
|
244
257
|
}
|
|
245
258
|
catch (parseError) {
|
|
246
259
|
console.log('Error parsing message data: ', parseError);
|
package/package.json
CHANGED
package/vapi.ts
CHANGED
|
@@ -152,6 +152,8 @@ export default class Vapi extends VapiEventEmitter {
|
|
|
152
152
|
private dailyCallConfig: DailyAdvancedConfig = {};
|
|
153
153
|
private dailyCallObject: DailyFactoryOptions = {};
|
|
154
154
|
|
|
155
|
+
private hasEmittedCallEndedStatus: boolean = false;
|
|
156
|
+
|
|
155
157
|
constructor(
|
|
156
158
|
apiToken: string,
|
|
157
159
|
apiBaseUrl?: string,
|
|
@@ -170,6 +172,7 @@ export default class Vapi extends VapiEventEmitter {
|
|
|
170
172
|
|
|
171
173
|
private cleanup() {
|
|
172
174
|
this.started = false;
|
|
175
|
+
this.hasEmittedCallEndedStatus = false;
|
|
173
176
|
this.call?.destroy();
|
|
174
177
|
this.call = null;
|
|
175
178
|
this.speakingTimeout = null;
|
|
@@ -232,6 +235,14 @@ export default class Vapi extends VapiEventEmitter {
|
|
|
232
235
|
|
|
233
236
|
this.call.on('left-meeting', () => {
|
|
234
237
|
this.emit('call-end');
|
|
238
|
+
if (!this.hasEmittedCallEndedStatus) {
|
|
239
|
+
this.emit('message', {
|
|
240
|
+
type: 'status-update',
|
|
241
|
+
status: 'ended',
|
|
242
|
+
'endedReason': 'customer-ended-call',
|
|
243
|
+
});
|
|
244
|
+
this.hasEmittedCallEndedStatus = true;
|
|
245
|
+
}
|
|
235
246
|
if (isVideoRecordingEnabled) {
|
|
236
247
|
this.call?.stopRecording();
|
|
237
248
|
}
|
|
@@ -379,6 +390,9 @@ export default class Vapi extends VapiEventEmitter {
|
|
|
379
390
|
try {
|
|
380
391
|
const parsedMessage = JSON.parse(e.data);
|
|
381
392
|
this.emit('message', parsedMessage);
|
|
393
|
+
if (parsedMessage && 'type' in parsedMessage && 'status' in parsedMessage && parsedMessage.type === 'status-update' && parsedMessage.status === 'ended') {
|
|
394
|
+
this.hasEmittedCallEndedStatus = true;
|
|
395
|
+
}
|
|
382
396
|
} catch (parseError) {
|
|
383
397
|
console.log('Error parsing message data: ', parseError);
|
|
384
398
|
}
|