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