@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vapi-ai/web",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "",
5
5
  "main": "dist/vapi.js",
6
6
  "types": "dist/vapi.d.ts",
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
  }