react-jssip-kit 0.7.0 → 0.7.1

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
@@ -1,6 +1,6 @@
1
1
  import JsSIP from 'jssip';
2
2
  export { WebSocketInterface } from 'jssip';
3
- import React, { createContext, useContext, useCallback, useSyncExternalStore, useMemo, useEffect, useRef } from 'react';
3
+ import { createContext, useContext, useCallback, useSyncExternalStore, useMemo, useEffect, useRef } from 'react';
4
4
  import { jsx } from 'react/jsx-runtime';
5
5
 
6
6
  // src/jssip-lib/sip/debugger.ts
@@ -959,14 +959,6 @@ var SipClient = class extends EventTargetEmitter {
959
959
  this.attachBeforeUnload();
960
960
  this.syncDebugInspector(debug);
961
961
  }
962
- setMicrophoneProvider(fn) {
963
- this.requestMicrophoneStream = fn;
964
- if (fn && this.micRecoveryEnabled) {
965
- this.sessionManager.getSessions().forEach(({ id }) => {
966
- this.enableMicrophoneRecovery(id);
967
- });
968
- }
969
- }
970
962
  registerUA() {
971
963
  this.userAgent.register();
972
964
  }
@@ -978,21 +970,6 @@ var SipClient = class extends EventTargetEmitter {
978
970
  this.stateStore.reset();
979
971
  }
980
972
  call(target, callOptions = {}) {
981
- if (!callOptions.mediaStream && this.requestMicrophoneStream) {
982
- void this.requestMicrophoneStream().then((stream) => {
983
- if (!stream)
984
- throw new Error("microphone stream unavailable");
985
- this.call(target, { ...callOptions, mediaStream: stream });
986
- }).catch((e) => {
987
- const err = this.emitError(
988
- e,
989
- "MICROPHONE_FAILED",
990
- "microphone failed"
991
- );
992
- this.stateStore.batchSet({ error: err.cause });
993
- });
994
- return;
995
- }
996
973
  try {
997
974
  const opts = this.ensureMediaConstraints(callOptions);
998
975
  if (opts.mediaStream)
@@ -1063,7 +1040,7 @@ var SipClient = class extends EventTargetEmitter {
1063
1040
  if (h)
1064
1041
  session.on(ev, h);
1065
1042
  });
1066
- if (this.requestMicrophoneStream && this.micRecoveryEnabled) {
1043
+ if (this.micRecoveryEnabled) {
1067
1044
  this.enableMicrophoneRecovery(sessionId);
1068
1045
  }
1069
1046
  }
@@ -1159,22 +1136,10 @@ var SipClient = class extends EventTargetEmitter {
1159
1136
  answerSession(sessionId, options = {}) {
1160
1137
  if (!sessionId || !this.sessionExists(sessionId))
1161
1138
  return false;
1162
- if (!options.mediaStream && this.requestMicrophoneStream) {
1163
- void this.requestMicrophoneStream().then((stream) => {
1164
- if (!stream)
1165
- throw new Error("microphone stream unavailable");
1166
- this.answerSession(sessionId, { ...options, mediaStream: stream });
1167
- }).catch((e) => {
1168
- const err = this.emitError(
1169
- e,
1170
- "MICROPHONE_FAILED",
1171
- "microphone failed"
1172
- );
1173
- this.stateStore.batchSet({ error: err.cause });
1174
- });
1175
- return true;
1176
- }
1177
1139
  const opts = this.ensureMediaConstraints(options);
1140
+ if (opts.mediaStream) {
1141
+ this.sessionManager.setSessionMedia(sessionId, opts.mediaStream);
1142
+ }
1178
1143
  return this.sessionManager.answer(sessionId, opts);
1179
1144
  }
1180
1145
  hangupSession(sessionId, options) {
@@ -1237,9 +1202,6 @@ var SipClient = class extends EventTargetEmitter {
1237
1202
  if (!resolved)
1238
1203
  return () => {
1239
1204
  };
1240
- if (!this.requestMicrophoneStream)
1241
- return () => {
1242
- };
1243
1205
  this.disableMicrophoneRecovery(resolved);
1244
1206
  const intervalMs = options.intervalMs ?? this.micRecoveryDefaults.intervalMs;
1245
1207
  const maxRetries = options.maxRetries ?? this.micRecoveryDefaults.maxRetries;
@@ -1262,12 +1224,24 @@ var SipClient = class extends EventTargetEmitter {
1262
1224
  const senderLive = sender?.track?.readyState === "live";
1263
1225
  if (trackLive && senderLive)
1264
1226
  return;
1227
+ this.emitError(
1228
+ {
1229
+ cause: "microphone dropped",
1230
+ trackLive,
1231
+ senderLive
1232
+ },
1233
+ "MICROPHONE_DROPPED",
1234
+ "microphone dropped"
1235
+ );
1265
1236
  retries += 1;
1237
+ if (trackLive && !senderLive && track) {
1238
+ await rtc.replaceAudioTrack(track);
1239
+ return;
1240
+ }
1266
1241
  let nextStream;
1267
1242
  try {
1268
- if (!this.requestMicrophoneStream)
1269
- return;
1270
- nextStream = await this.requestMicrophoneStream();
1243
+ const deviceId = track?.getSettings?.().deviceId ?? sender?.track?.getSettings?.().deviceId;
1244
+ nextStream = await this.requestMicrophoneStreamInternal(deviceId);
1271
1245
  } catch (err) {
1272
1246
  console.warn("[sip] mic recovery failed to get stream", err);
1273
1247
  return;
@@ -1405,6 +1379,23 @@ var SipClient = class extends EventTargetEmitter {
1405
1379
  return void 0;
1406
1380
  }
1407
1381
  }
1382
+ async requestMicrophoneStreamInternal(deviceId) {
1383
+ if (typeof navigator === "undefined" || !navigator.mediaDevices?.getUserMedia) {
1384
+ throw new Error("getUserMedia not available");
1385
+ }
1386
+ const audio = deviceId && deviceId !== "default" ? { deviceId: { exact: deviceId } } : true;
1387
+ try {
1388
+ return await navigator.mediaDevices.getUserMedia({ audio });
1389
+ } catch (err) {
1390
+ const cause = err?.name || "getUserMedia failed";
1391
+ this.emitError(
1392
+ { raw: err, cause },
1393
+ "MICROPHONE_UNAVAILABLE",
1394
+ "microphone unavailable"
1395
+ );
1396
+ throw err;
1397
+ }
1398
+ }
1408
1399
  };
1409
1400
  function createSipClientInstance(options) {
1410
1401
  return new SipClient(options);
@@ -1597,16 +1588,12 @@ function CallPlayer({ sessionId }) {
1597
1588
  function SipProvider({
1598
1589
  client,
1599
1590
  children,
1600
- sipEventManager,
1601
- requestMicrophoneStream
1591
+ sipEventManager
1602
1592
  }) {
1603
1593
  const manager = useMemo(
1604
1594
  () => sipEventManager ?? createSipEventManager(client),
1605
1595
  [client, sipEventManager]
1606
1596
  );
1607
- React.useEffect(() => {
1608
- client.setMicrophoneProvider(requestMicrophoneStream);
1609
- }, [client, requestMicrophoneStream]);
1610
1597
  const contextValue = useMemo(() => ({ client, sipEventManager: manager }), [client, manager]);
1611
1598
  return /* @__PURE__ */ jsx(SipContext.Provider, { value: contextValue, children });
1612
1599
  }