@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 CHANGED
@@ -16322,8 +16322,9 @@ var SipManager = class extends EventEmitter {
16322
16322
  { urls: "stun:stun1.l.google.com:19302" }
16323
16323
  ]
16324
16324
  },
16325
- iceGatheringTimeout: 2e3,
16326
- iceCheckingTimeout: 5e3
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("\u{1F4F5} Hanging up call...");
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("\u26A0\uFE0F Error sending BYE", { error });
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("\u{1F9F9} Performing complete audio resource cleanup...", {
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("\u{1F9F9} Cleaning up audio element...");
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("\u{1F6D1} Stopping remote track", { kind: track.kind });
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("\u{1F9F9} Cleaning up local stream...");
16818
+ this.logger.debug("Cleaning up local stream");
16818
16819
  const tracks = this.localStream.getTracks();
16819
16820
  tracks.forEach((track) => {
16820
- this.logger.debug("\u{1F6D1} Stopping local track", { kind: track.kind });
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("\u{1F3A4} Stopping pre-acquired microphone stream...");
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("\u{1F6D1} Stopping pre-acquired track", { kind: track.kind });
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("\u{1F9F9} Cleaning up remote stream...");
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("\u{1F6D1} Stopping remote track", { kind: track.kind });
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("\u{1F3B5} Closing audio context...");
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("\u26A0\uFE0F Error closing audio context", { error });
16854
+ this.logger.warn("Error closing audio context", { error });
16854
16855
  }
16855
16856
  }
16856
16857
  delete this.audioAnalyser;
16857
- this.logger.info("\u2705 Audio resources cleanup completed");
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", { url: sseUrl, isRetry, useEventSource: this.useEventSource });
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
- this.eventSource.addEventListener("open", () => {
17076
- this.logger.info("EventSource SSE connection established");
17077
- this.reconnectAttempts = 0;
17078
- this.emit("connected");
17079
- });
17080
- this.eventSource.addEventListener("message", (event) => {
17081
- this.logger.debug("EventSource message received", { data: event.data });
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("Error parsing EventSource message", { error, data: event.data });
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("transcription", (event) => {
17097
- this.logger.debug("EventSource transcription event", { data: event.data });
17098
- try {
17099
- const data = JSON.parse(event.data);
17100
- this.handleMessage({ ...data, type: "transcription" });
17101
- } catch (error) {
17102
- this.logger.error("Error parsing transcription event", { error, data: event.data });
17103
- }
17104
- });
17105
- this.eventSource.addEventListener("call_event", (event) => {
17106
- this.logger.debug("EventSource call_event", { data: event.data });
17107
- try {
17108
- const data = JSON.parse(event.data);
17109
- this.handleMessage(data);
17110
- } catch (error) {
17111
- this.logger.error("Error parsing call_event", { error, data: event.data });
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("=== CONVERSATION INITIALIZATION START ===");
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("\u2713 Authentication check passed");
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("\u2713 Access token obtained for API calls", {
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("\u2713 Ephemeral credentials already available");
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");