@anganyai/voice-sdk 0.0.8 → 0.0.10
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/index.cjs +71 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +71 -50
- package/dist/index.js.map +1 -1
- package/package.json +28 -18
package/dist/index.cjs
CHANGED
|
@@ -16322,8 +16322,9 @@ var SipManager = class extends EventEmitter {
|
|
|
16322
16322
|
{ urls: "stun:stun1.l.google.com:19302" }
|
|
16323
16323
|
]
|
|
16324
16324
|
},
|
|
16325
|
-
|
|
16326
|
-
|
|
16325
|
+
// Reduced timeouts for faster connection (was 2000ms/5000ms)
|
|
16326
|
+
iceGatheringTimeout: 500,
|
|
16327
|
+
iceCheckingTimeout: 2e3
|
|
16327
16328
|
},
|
|
16328
16329
|
delegate: {
|
|
16329
16330
|
onConnect: () => {
|
|
@@ -16488,7 +16489,7 @@ var SipManager = class extends EventEmitter {
|
|
|
16488
16489
|
this.logger.debug("No active session to hang up");
|
|
16489
16490
|
return;
|
|
16490
16491
|
}
|
|
16491
|
-
this.logger.info("
|
|
16492
|
+
this.logger.info("Hanging up call...");
|
|
16492
16493
|
try {
|
|
16493
16494
|
const sessionState = this.currentSession.state;
|
|
16494
16495
|
if (sessionState === "Established" || sessionState === "Establishing") {
|
|
@@ -16497,7 +16498,7 @@ var SipManager = class extends EventEmitter {
|
|
|
16497
16498
|
this.logger.debug("Session already terminated, skipping BYE", { state: sessionState });
|
|
16498
16499
|
}
|
|
16499
16500
|
} catch (error) {
|
|
16500
|
-
this.logger.warn("
|
|
16501
|
+
this.logger.warn("Error sending BYE", { error });
|
|
16501
16502
|
}
|
|
16502
16503
|
delete this.currentSession;
|
|
16503
16504
|
this.cleanupAudioResources();
|
|
@@ -16792,16 +16793,16 @@ var SipManager = class extends EventEmitter {
|
|
|
16792
16793
|
delete this.audioAnalyser;
|
|
16793
16794
|
}
|
|
16794
16795
|
cleanupAudioResources() {
|
|
16795
|
-
this.logger.debug("
|
|
16796
|
+
this.logger.debug("Performing audio resource cleanup", {
|
|
16796
16797
|
platform: isReactNative() ? "react-native" : "browser"
|
|
16797
16798
|
});
|
|
16798
16799
|
this.stopAudioMonitoring();
|
|
16799
16800
|
if (this.audioElement && isBrowser()) {
|
|
16800
|
-
this.logger.debug("
|
|
16801
|
+
this.logger.debug("Cleaning up audio element");
|
|
16801
16802
|
if (this.audioElement.srcObject) {
|
|
16802
16803
|
const tracks = this.audioElement.srcObject.getTracks();
|
|
16803
16804
|
tracks.forEach((track) => {
|
|
16804
|
-
this.logger.debug("
|
|
16805
|
+
this.logger.debug("Stopping remote track", { kind: track.kind });
|
|
16805
16806
|
track.stop();
|
|
16806
16807
|
});
|
|
16807
16808
|
this.audioElement.srcObject = null;
|
|
@@ -16814,29 +16815,29 @@ var SipManager = class extends EventEmitter {
|
|
|
16814
16815
|
this.logger.debug("Audio element cleaned up");
|
|
16815
16816
|
}
|
|
16816
16817
|
if (this.localStream) {
|
|
16817
|
-
this.logger.debug("
|
|
16818
|
+
this.logger.debug("Cleaning up local stream");
|
|
16818
16819
|
const tracks = this.localStream.getTracks();
|
|
16819
16820
|
tracks.forEach((track) => {
|
|
16820
|
-
this.logger.debug("
|
|
16821
|
+
this.logger.debug("Stopping local track", { kind: track.kind });
|
|
16821
16822
|
track.stop();
|
|
16822
16823
|
});
|
|
16823
16824
|
delete this.localStream;
|
|
16824
16825
|
}
|
|
16825
16826
|
if (this.preAcquiredStream) {
|
|
16826
|
-
this.logger.debug("
|
|
16827
|
+
this.logger.debug("Stopping pre-acquired microphone stream");
|
|
16827
16828
|
const tracks = this.preAcquiredStream.getTracks();
|
|
16828
16829
|
tracks.forEach((track) => {
|
|
16829
|
-
this.logger.debug("
|
|
16830
|
+
this.logger.debug("Stopping pre-acquired track", { kind: track.kind });
|
|
16830
16831
|
track.stop();
|
|
16831
16832
|
});
|
|
16832
16833
|
delete this.preAcquiredStream;
|
|
16833
16834
|
}
|
|
16834
16835
|
if (this.remoteStream) {
|
|
16835
|
-
this.logger.debug("
|
|
16836
|
+
this.logger.debug("Cleaning up remote stream");
|
|
16836
16837
|
try {
|
|
16837
16838
|
const tracks = this.remoteStream.getTracks();
|
|
16838
16839
|
tracks.forEach((track) => {
|
|
16839
|
-
this.logger.debug("
|
|
16840
|
+
this.logger.debug("Stopping remote track", { kind: track.kind });
|
|
16840
16841
|
track.stop();
|
|
16841
16842
|
});
|
|
16842
16843
|
} catch (error) {
|
|
@@ -16846,15 +16847,15 @@ var SipManager = class extends EventEmitter {
|
|
|
16846
16847
|
}
|
|
16847
16848
|
if (this.audioContext) {
|
|
16848
16849
|
try {
|
|
16849
|
-
this.logger.debug("
|
|
16850
|
+
this.logger.debug("Closing audio context");
|
|
16850
16851
|
this.audioContext.close();
|
|
16851
16852
|
delete this.audioContext;
|
|
16852
16853
|
} catch (error) {
|
|
16853
|
-
this.logger.warn("
|
|
16854
|
+
this.logger.warn("Error closing audio context", { error });
|
|
16854
16855
|
}
|
|
16855
16856
|
}
|
|
16856
16857
|
delete this.audioAnalyser;
|
|
16857
|
-
this.logger.
|
|
16858
|
+
this.logger.debug("Audio resources cleanup completed");
|
|
16858
16859
|
}
|
|
16859
16860
|
startKeepAlive() {
|
|
16860
16861
|
this.stopKeepAlive();
|
|
@@ -17012,7 +17013,11 @@ var TranscriptionService = class extends EventEmitter {
|
|
|
17012
17013
|
*/
|
|
17013
17014
|
async connectToSSE(accessToken, isRetry = false) {
|
|
17014
17015
|
const sseUrl = `${this.apiUrl}/api/v1/events?event_types=transcription,call_event`;
|
|
17015
|
-
this.logger.debug("Connecting to SSE endpoint", {
|
|
17016
|
+
this.logger.debug("Connecting to SSE endpoint", {
|
|
17017
|
+
url: sseUrl,
|
|
17018
|
+
isRetry,
|
|
17019
|
+
useEventSource: this.useEventSource
|
|
17020
|
+
});
|
|
17016
17021
|
if (this.useEventSource && this.eventSourceFactory) {
|
|
17017
17022
|
return this.connectWithEventSource(sseUrl, accessToken);
|
|
17018
17023
|
}
|
|
@@ -17072,19 +17077,29 @@ var TranscriptionService = class extends EventEmitter {
|
|
|
17072
17077
|
"Cache-Control": "no-cache"
|
|
17073
17078
|
}
|
|
17074
17079
|
});
|
|
17075
|
-
|
|
17076
|
-
this.logger.
|
|
17077
|
-
|
|
17078
|
-
|
|
17079
|
-
|
|
17080
|
-
|
|
17081
|
-
|
|
17080
|
+
const handleSSEEvent = (eventType, event) => {
|
|
17081
|
+
this.logger.debug(`EventSource [${eventType}] received`, {
|
|
17082
|
+
data: event.data,
|
|
17083
|
+
type: event.type
|
|
17084
|
+
});
|
|
17085
|
+
if (!event.data) {
|
|
17086
|
+
this.logger.debug(`EventSource [${eventType}] has no data, skipping`);
|
|
17087
|
+
return;
|
|
17088
|
+
}
|
|
17082
17089
|
try {
|
|
17083
17090
|
const data = JSON.parse(event.data);
|
|
17091
|
+
if (!data.type && eventType !== "message") {
|
|
17092
|
+
data.type = eventType;
|
|
17093
|
+
}
|
|
17084
17094
|
this.handleMessage(data);
|
|
17085
17095
|
} catch (error) {
|
|
17086
|
-
this.logger.error(
|
|
17096
|
+
this.logger.error(`Error parsing EventSource [${eventType}]`, { error, data: event.data });
|
|
17087
17097
|
}
|
|
17098
|
+
};
|
|
17099
|
+
this.eventSource.addEventListener("open", () => {
|
|
17100
|
+
this.logger.info("EventSource SSE connection established");
|
|
17101
|
+
this.reconnectAttempts = 0;
|
|
17102
|
+
this.emit("connected");
|
|
17088
17103
|
});
|
|
17089
17104
|
this.eventSource.addEventListener("error", (event) => {
|
|
17090
17105
|
this.logger.error("EventSource error", { event });
|
|
@@ -17093,24 +17108,32 @@ var TranscriptionService = class extends EventEmitter {
|
|
|
17093
17108
|
this.handleReconnection();
|
|
17094
17109
|
}
|
|
17095
17110
|
});
|
|
17096
|
-
this.eventSource.addEventListener("
|
|
17097
|
-
|
|
17098
|
-
|
|
17099
|
-
|
|
17100
|
-
|
|
17101
|
-
|
|
17102
|
-
|
|
17103
|
-
|
|
17104
|
-
|
|
17105
|
-
this.eventSource.addEventListener(
|
|
17106
|
-
|
|
17107
|
-
|
|
17108
|
-
|
|
17109
|
-
|
|
17110
|
-
|
|
17111
|
-
|
|
17112
|
-
|
|
17113
|
-
|
|
17111
|
+
this.eventSource.addEventListener("message", (event) => handleSSEEvent("message", event));
|
|
17112
|
+
this.eventSource.addEventListener(
|
|
17113
|
+
"transcription",
|
|
17114
|
+
(event) => handleSSEEvent("transcription", event)
|
|
17115
|
+
);
|
|
17116
|
+
this.eventSource.addEventListener(
|
|
17117
|
+
"call_event",
|
|
17118
|
+
(event) => handleSSEEvent("call_event", event)
|
|
17119
|
+
);
|
|
17120
|
+
this.eventSource.addEventListener(
|
|
17121
|
+
"call_started",
|
|
17122
|
+
(event) => handleSSEEvent("call_started", event)
|
|
17123
|
+
);
|
|
17124
|
+
this.eventSource.addEventListener(
|
|
17125
|
+
"call_ended",
|
|
17126
|
+
(event) => handleSSEEvent("call_ended", event)
|
|
17127
|
+
);
|
|
17128
|
+
this.eventSource.addEventListener(
|
|
17129
|
+
"connected",
|
|
17130
|
+
(event) => handleSSEEvent("connected", event)
|
|
17131
|
+
);
|
|
17132
|
+
this.eventSource.addEventListener("welcome", (event) => handleSSEEvent("welcome", event));
|
|
17133
|
+
this.eventSource.addEventListener(
|
|
17134
|
+
"heartbeat",
|
|
17135
|
+
(event) => handleSSEEvent("heartbeat", event)
|
|
17136
|
+
);
|
|
17114
17137
|
}
|
|
17115
17138
|
/**
|
|
17116
17139
|
* Stop the SSE connection
|
|
@@ -17552,11 +17575,10 @@ var Conversation = class extends EventEmitter {
|
|
|
17552
17575
|
* Initialize and start the conversation
|
|
17553
17576
|
*/
|
|
17554
17577
|
async initialize() {
|
|
17555
|
-
this.logger.debug("
|
|
17578
|
+
this.logger.debug("Initializing conversation");
|
|
17556
17579
|
try {
|
|
17557
17580
|
this.setState("connecting");
|
|
17558
17581
|
this.startTime = /* @__PURE__ */ new Date();
|
|
17559
|
-
this.logger.debug("=== STEP 1: CHECKING AUTHENTICATION ===");
|
|
17560
17582
|
const authStatus = this.authManager.getAuthStatus();
|
|
17561
17583
|
this.logger.debug("Auth status received", {
|
|
17562
17584
|
authenticated: authStatus.authenticated,
|
|
@@ -17568,8 +17590,7 @@ var Conversation = class extends EventEmitter {
|
|
|
17568
17590
|
this.logger.error("Authentication check failed", { authStatus });
|
|
17569
17591
|
throw new AuthenticationError("Not authenticated");
|
|
17570
17592
|
}
|
|
17571
|
-
this.logger.debug("
|
|
17572
|
-
this.logger.debug("=== STEP 2: GETTING ACCESS TOKEN (OPTIONAL) ===");
|
|
17593
|
+
this.logger.debug("Authentication check passed");
|
|
17573
17594
|
let accessToken = authStatus.tokens?.accessToken;
|
|
17574
17595
|
this.logger.debug("OAuth access token", { hasOAuthToken: !!accessToken });
|
|
17575
17596
|
if (!accessToken) {
|
|
@@ -17594,11 +17615,10 @@ var Conversation = class extends EventEmitter {
|
|
|
17594
17615
|
);
|
|
17595
17616
|
} else {
|
|
17596
17617
|
this.accessToken = accessToken;
|
|
17597
|
-
this.logger.debug("
|
|
17618
|
+
this.logger.debug("Access token obtained for API calls", {
|
|
17598
17619
|
tokenLength: accessToken.length
|
|
17599
17620
|
});
|
|
17600
17621
|
}
|
|
17601
|
-
this.logger.debug("=== STEP 3: ENSURING EPHEMERAL CREDENTIALS ===");
|
|
17602
17622
|
if (!this.ephemeralCredentials) {
|
|
17603
17623
|
this.logger.debug("Getting ephemeral credentials");
|
|
17604
17624
|
this.ephemeralCredentials = this.authManager.getCachedEphemeralCredentials();
|
|
@@ -17614,7 +17634,7 @@ var Conversation = class extends EventEmitter {
|
|
|
17614
17634
|
uriCount: this.ephemeralCredentials.sip?.uris?.length || 0
|
|
17615
17635
|
});
|
|
17616
17636
|
} else {
|
|
17617
|
-
this.logger.debug("
|
|
17637
|
+
this.logger.debug("Ephemeral credentials already available");
|
|
17618
17638
|
}
|
|
17619
17639
|
this.logger.debug("Raw ephemeral credentials", {
|
|
17620
17640
|
sip: {
|
|
@@ -17738,6 +17758,7 @@ var Conversation = class extends EventEmitter {
|
|
|
17738
17758
|
}
|
|
17739
17759
|
}
|
|
17740
17760
|
await this.sipManager.makeCall(callOptions);
|
|
17761
|
+
this.logger.debug("Conversation initialization complete");
|
|
17741
17762
|
} catch (error) {
|
|
17742
17763
|
this.logger.error("Failed to initialize conversation", { error });
|
|
17743
17764
|
this.setState("error");
|