@voipsdk/react-native-voipcloud 1.0.7 → 1.0.9
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/CHANGELOG.md +37 -0
- package/android/src/main/libs/voipcloud-release.aar +0 -0
- package/ios/VoipCloud.mm +11 -0
- package/ios/VoipCloudEngine.h +5 -0
- package/ios/VoipCloudEngine.mm +50 -1
- package/lib/commonjs/VoipCloud.js +11 -0
- package/lib/commonjs/VoipCloud.js.map +1 -1
- package/lib/module/VoipCloud.js +11 -0
- package/lib/module/VoipCloud.js.map +1 -1
- package/lib/typescript/VoipCloud.d.ts +7 -0
- package/package.json +1 -1
- package/src/VoipCloud.ts +14 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,43 @@ All notable changes to `@voipsdk/react-native-voipcloud` are documented here.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.9] - 2026-11-08
|
|
9
|
+
|
|
10
|
+
Folds in the push-wake / audio-session recovery fixes that were living as an
|
|
11
|
+
app-side `patch-package` patch (`@voipsdk+react-native-voipcloud+1.0.8.patch`),
|
|
12
|
+
so a fresh install behaves correctly without any patch. Adds an explicit
|
|
13
|
+
transport-recovery API and fixes iOS audio routing for CallKit (incoming) calls
|
|
14
|
+
and after a GSM-call interruption.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- `VoipCloud.handleIpChange()` — iOS: restart the SIP transports (UDP rebind,
|
|
19
|
+
TCP/TLS shutdown) and re-REGISTER every account with a refreshed Contact
|
|
20
|
+
(PJSIP `Endpoint::handleIpChange`). Use after a long iOS suspend / network
|
|
21
|
+
change, when `refreshRegistration` would reuse a dead socket and the REGISTER
|
|
22
|
+
never leaves / never gets a 200. Refused (`VC_IP_CHANGE`) while any call
|
|
23
|
+
exists, so it never disturbs a ringing/active call; rejects `VC_UNSUPPORTED`
|
|
24
|
+
where the native side lacks it. Wired on iOS (`handleIpChangeWithError:`).
|
|
25
|
+
|
|
26
|
+
### Changed / Fixed
|
|
27
|
+
|
|
28
|
+
- **iOS (CallKit audio):** incoming (CallKit) calls no longer call
|
|
29
|
+
`setActive:YES` from the app on answer. Activating the `AVAudioSession` from
|
|
30
|
+
the app before CallKit grants priority failed with `!pri`
|
|
31
|
+
(`AVAudioSessionErrorInsufficientPriority`), so PJSIP opened its sound device
|
|
32
|
+
on a session CallKit didn't control → silent call. CallKit now owns the
|
|
33
|
+
session for incoming calls; the host rewires media from
|
|
34
|
+
`provider:didActivateAudioSession:`. The engine only activates/deactivates the
|
|
35
|
+
session it owns itself (outgoing calls), tracked via `_appOwnsAudioSession`.
|
|
36
|
+
- **iOS (GSM interruption):** `reconnectAudioMedia` now reopens the sound device
|
|
37
|
+
(`pjsua_set_null_snd_dev` + `pjsua_set_snd_dev`) before reconnecting media — a
|
|
38
|
+
stopped audio unit (GSM-call interruption) is not restarted by `refreshDevs`
|
|
39
|
+
alone, which left call audio dead after the interruption ended.
|
|
40
|
+
|
|
41
|
+
## [1.0.8] - 2026-08-26
|
|
42
|
+
Update libraries voipcloud-release.aar 16kb for android
|
|
43
|
+
|
|
44
|
+
|
|
8
45
|
## [1.0.7] - 2026-08-13
|
|
9
46
|
|
|
10
47
|
Folds in the SDP bandwidth-modifier fixes that were living as app-side
|
|
Binary file
|
package/ios/VoipCloud.mm
CHANGED
|
@@ -109,6 +109,17 @@ RCT_EXPORT_METHOD(refreshRegistration:(NSInteger)accountId
|
|
|
109
109
|
else reject(@"VC_REFRESH", err.localizedDescription ?: @"Failed to refresh registration", err);
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
// Restart SIP transports + re-REGISTER (Endpoint::handleIpChange). For the
|
|
113
|
+
// push-wake path after a long suspend / network change, when a plain refresh
|
|
114
|
+
// would go out on a dead socket.
|
|
115
|
+
RCT_EXPORT_METHOD(handleIpChange:(RCTPromiseResolveBlock)resolve
|
|
116
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
117
|
+
{
|
|
118
|
+
NSError *err = nil;
|
|
119
|
+
if ([VoipCloudEngine.shared handleIpChangeWithError:&err]) resolve(nil);
|
|
120
|
+
else reject(@"VC_IP_CHANGE", err.localizedDescription ?: @"handleIpChange failed", err);
|
|
121
|
+
}
|
|
122
|
+
|
|
112
123
|
#pragma mark - Calls
|
|
113
124
|
|
|
114
125
|
RCT_EXPORT_METHOD(makeCall:(NSInteger)accountId
|
package/ios/VoipCloudEngine.h
CHANGED
|
@@ -46,6 +46,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
46
46
|
/// of unregister+recreate — the push-wake refresh that avoids contact churn/482.
|
|
47
47
|
/// NO (with *error) if the account was never registered.
|
|
48
48
|
- (BOOL)refreshRegistrationAccount:(int)accountId error:(NSError **)error;
|
|
49
|
+
/// Endpoint::handleIpChange — restart the SIP transports (UDP rebind, TCP/TLS
|
|
50
|
+
/// shutdown) and re-REGISTER every account with a refreshed Contact. Use after an
|
|
51
|
+
/// iOS suspend / network change, when the socket under a plain refresh may be dead.
|
|
52
|
+
/// Refused (NO) while calls exist, to never disturb a ringing/active call.
|
|
53
|
+
- (BOOL)handleIpChangeWithError:(NSError **)error;
|
|
49
54
|
|
|
50
55
|
/// Place a call from `accountId` to `uri` (full SIP URI). Returns callId, or -1.
|
|
51
56
|
- (int)makeCallFromAccount:(int)accountId toUri:(NSString *)uri error:(NSError **)error;
|
package/ios/VoipCloudEngine.mm
CHANGED
|
@@ -114,7 +114,13 @@ public:
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
void reconnectAudioMedia() {
|
|
117
|
+
// [VoicePBX] reopen sound device - a stopped audio unit (GSM call
|
|
118
|
+
// interruption) is not restarted by refreshDevs alone.
|
|
119
|
+
pjsua_set_null_snd_dev();
|
|
117
120
|
try { Endpoint::instance().audDevManager().refreshDevs(); } catch (...) {}
|
|
121
|
+
pj_status_t st = pjsua_set_snd_dev(PJMEDIA_AUD_DEFAULT_CAPTURE_DEV,
|
|
122
|
+
PJMEDIA_AUD_DEFAULT_PLAYBACK_DEV);
|
|
123
|
+
if (st != PJ_SUCCESS) NSLog(@"[VoipCloud] reopen sound device failed: %d", st);
|
|
118
124
|
connectAudioMedia();
|
|
119
125
|
emitMediaState();
|
|
120
126
|
}
|
|
@@ -288,6 +294,11 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
|
|
|
288
294
|
int _udpTransportId;
|
|
289
295
|
int _tcpTransportId;
|
|
290
296
|
int _tlsTransportId;
|
|
297
|
+
// YES only while the APP activated the AVAudioSession (outgoing call). For
|
|
298
|
+
// incoming calls CallKit owns the session: it activates it after the answer
|
|
299
|
+
// action is fulfilled (provider:didActivateAudioSession:) and deactivates it
|
|
300
|
+
// itself, so the engine must neither activate nor deactivate it then.
|
|
301
|
+
BOOL _appOwnsAudioSession;
|
|
291
302
|
}
|
|
292
303
|
|
|
293
304
|
+ (instancetype)shared {
|
|
@@ -560,6 +571,34 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
|
|
|
560
571
|
}
|
|
561
572
|
}
|
|
562
573
|
|
|
574
|
+
// Recover the SIP transport after an iOS suspend or a network switch. A plain
|
|
575
|
+
// setRegistration(true) reuses the old socket: after a long suspend a TCP/TLS
|
|
576
|
+
// connection is dead and a UDP socket may be defunct or bound to a vanished
|
|
577
|
+
// interface, so the REGISTER never leaves / never gets a 200 and the PBX can't
|
|
578
|
+
// route the INVITE. handleIpChange is PJSIP's documented recovery: restarts the
|
|
579
|
+
// listeners, shuts down the accounts' connections and re-REGISTERs (contact
|
|
580
|
+
// update). Registration results arrive via onRegState as usual.
|
|
581
|
+
- (BOOL)handleIpChangeWithError:(NSError **)error {
|
|
582
|
+
if (!_ep) {
|
|
583
|
+
if (error) *error = VCMakeError(-1, @"Endpoint not started");
|
|
584
|
+
return NO;
|
|
585
|
+
}
|
|
586
|
+
if (!_calls.empty()) {
|
|
587
|
+
if (error) *error = VCMakeError(-1, @"Calls in progress — IP change refused");
|
|
588
|
+
return NO;
|
|
589
|
+
}
|
|
590
|
+
try {
|
|
591
|
+
IpChangeParam prm;
|
|
592
|
+
prm.restartListener = true;
|
|
593
|
+
prm.restartLisDelay = 0;
|
|
594
|
+
_ep->handleIpChange(prm);
|
|
595
|
+
return YES;
|
|
596
|
+
} catch (Error &err) {
|
|
597
|
+
if (error) *error = VCMakeError(err.status, VCStr(err.info()));
|
|
598
|
+
return NO;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
563
602
|
#pragma mark Calls
|
|
564
603
|
|
|
565
604
|
- (int)makeCallFromAccount:(int)accountId toUri:(NSString *)uri error:(NSError **)error {
|
|
@@ -579,6 +618,8 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
|
|
|
579
618
|
int cid = call->getId();
|
|
580
619
|
call->cachedId = cid;
|
|
581
620
|
[self storeCall:call withId:cid];
|
|
621
|
+
// Outgoing calls do not go through CallKit on iOS — the app owns audio.
|
|
622
|
+
_appOwnsAudioSession = YES;
|
|
582
623
|
[self activateAudioSession];
|
|
583
624
|
return cid;
|
|
584
625
|
} catch (Error &err) {
|
|
@@ -593,7 +634,12 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
|
|
|
593
634
|
try {
|
|
594
635
|
CallOpParam op; op.statusCode = PJSIP_SC_OK;
|
|
595
636
|
call->answer(op);
|
|
596
|
-
|
|
637
|
+
// Incoming calls are CallKit calls: do NOT setActive:YES here. Doing it
|
|
638
|
+
// from the app (background/lock screen, before CallKit grants priority)
|
|
639
|
+
// fails with '!pri' (AVAudioSessionErrorInsufficientPriority) and PJSIP
|
|
640
|
+
// opens its sound device on a session CallKit doesn't control → silent
|
|
641
|
+
// call. CallKit activates the session; the host then rewires media via
|
|
642
|
+
// reconnectCallAudio from didActivateAudioSession.
|
|
597
643
|
return YES;
|
|
598
644
|
} catch (Error &err) { if (error) *error = VCMakeError(err.status, VCStr(err.info())); return NO; }
|
|
599
645
|
}
|
|
@@ -709,6 +755,9 @@ void VCCall::onDtmfDigit(OnDtmfDigitParam &prm) {
|
|
|
709
755
|
|
|
710
756
|
- (void)deactivateAudioSessionIfIdle {
|
|
711
757
|
if (!_calls.empty()) return;
|
|
758
|
+
// Only undo an activation the app itself made — CallKit deactivates its own.
|
|
759
|
+
if (!_appOwnsAudioSession) return;
|
|
760
|
+
_appOwnsAudioSession = NO;
|
|
712
761
|
NSError *e = nil;
|
|
713
762
|
[[AVAudioSession sharedInstance]
|
|
714
763
|
setActive:NO
|
|
@@ -50,6 +50,17 @@ const VoipCloud = exports.VoipCloud = {
|
|
|
50
50
|
refreshRegistration(accountId) {
|
|
51
51
|
return callNative(() => _nativeModule.NativeVoipCloud.refreshRegistration(accountId));
|
|
52
52
|
},
|
|
53
|
+
/**
|
|
54
|
+
* iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
|
|
55
|
+
* `Endpoint::handleIpChange`). Use after a long suspend / network change, when
|
|
56
|
+
* `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
|
|
57
|
+
* while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
|
|
58
|
+
*/
|
|
59
|
+
handleIpChange() {
|
|
60
|
+
return callNative(() => typeof _nativeModule.NativeVoipCloud.handleIpChange === 'function' ? _nativeModule.NativeVoipCloud.handleIpChange() : Promise.reject(Object.assign(new Error('handleIpChange not supported'), {
|
|
61
|
+
code: 'VC_UNSUPPORTED'
|
|
62
|
+
})));
|
|
63
|
+
},
|
|
53
64
|
makeCall(accountId, destinationUri) {
|
|
54
65
|
return callNative(() => _nativeModule.NativeVoipCloud.makeCall(accountId, destinationUri));
|
|
55
66
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_nativeModule","require","_events","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","NativeVoipCloud","VoipCloud","exports","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","on","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA;AACA,SAASE,eAAeA,CAAA,EAAmB;EACvC,OAAOC,OAAO,CAACC,MAAM,CACjBC,MAAM,CAACC,MAAM,CACT,IAAIC,KAAK,CACL,+DAA+D,GAC/D,+CAA+C,GAC/C,gFACJ,CAAC,EACD;IAAEC,IAAI,EAAE;EAAgB,CAC5B,CACJ,CAAC;AACL;AAEA,SAASC,UAAUA,CAAIC,EAAoB,EAAc;EACrD,IAAI,CAACC,6BAAe,EAAE,OAAOT,eAAe,CAAC,CAAC;EAC9C,OAAOQ,EAAE,CAAC,CAAC;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,SAAS,GAAAC,OAAA,CAAAD,SAAA,GAAG;EACrBE,IAAIA,CAACC,GAAe,GAAG,CAAC,CAAC,EAAiB;IACtC,OAAON,UAAU,CAAC,MAAME,6BAAe,CAACG,IAAI,CAACC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAC5D,CAAC;EAEDC,QAAQA,CAAA,EAAkB;IACtB,OAAOP,UAAU,CAAC,MAAME,6BAAe,CAACK,QAAQ,CAAC,CAAC,CAAC;EACvD,CAAC;EAEDC,QAAQA,CAACC,OAAsB,EAAmB;IAC9C,OAAOT,UAAU,CAAC,MAAME,6BAAe,CAACM,QAAQ,CAACC,OAAO,CAAC,CAAC;EAC9D,CAAC;EAEDC,UAAUA,CAACC,SAAiB,EAAiB;IACzC,OAAOX,UAAU,CAAC,MAAME,6BAAe,CAACQ,UAAU,CAACC,SAAS,CAAC,CAAC;EAClE,CAAC;EAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACIC,mBAAmBA,CAACD,SAAiB,EAAiB;IAClD,OAAOX,UAAU,CAAC,MAAME,6BAAe,CAACU,mBAAmB,CAACD,SAAS,CAAC,CAAC;EAC3E,CAAC;
|
|
1
|
+
{"version":3,"names":["_nativeModule","require","_events","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","NativeVoipCloud","VoipCloud","exports","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","handleIpChange","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","on","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/VoipCloud.js
CHANGED
|
@@ -45,6 +45,17 @@ export const VoipCloud = {
|
|
|
45
45
|
refreshRegistration(accountId) {
|
|
46
46
|
return callNative(() => NativeVoipCloud.refreshRegistration(accountId));
|
|
47
47
|
},
|
|
48
|
+
/**
|
|
49
|
+
* iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
|
|
50
|
+
* `Endpoint::handleIpChange`). Use after a long suspend / network change, when
|
|
51
|
+
* `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
|
|
52
|
+
* while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
|
|
53
|
+
*/
|
|
54
|
+
handleIpChange() {
|
|
55
|
+
return callNative(() => typeof NativeVoipCloud.handleIpChange === 'function' ? NativeVoipCloud.handleIpChange() : Promise.reject(Object.assign(new Error('handleIpChange not supported'), {
|
|
56
|
+
code: 'VC_UNSUPPORTED'
|
|
57
|
+
})));
|
|
58
|
+
},
|
|
48
59
|
makeCall(accountId, destinationUri) {
|
|
49
60
|
return callNative(() => NativeVoipCloud.makeCall(accountId, destinationUri));
|
|
50
61
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeVoipCloud","on","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","VoipCloud","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"AACA,SAASA,eAAe,QAAQ,gBAAgB;AAChD,SAASC,EAAE,QAAQ,UAAU;;AAE7B;AACA,SAASC,eAAeA,CAAA,EAAmB;EACvC,OAAOC,OAAO,CAACC,MAAM,CACjBC,MAAM,CAACC,MAAM,CACT,IAAIC,KAAK,CACL,+DAA+D,GAC/D,+CAA+C,GAC/C,gFACJ,CAAC,EACD;IAAEC,IAAI,EAAE;EAAgB,CAC5B,CACJ,CAAC;AACL;AAEA,SAASC,UAAUA,CAAIC,EAAoB,EAAc;EACrD,IAAI,CAACV,eAAe,EAAE,OAAOE,eAAe,CAAC,CAAC;EAC9C,OAAOQ,EAAE,CAAC,CAAC;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAG;EACrBC,IAAIA,CAACC,GAAe,GAAG,CAAC,CAAC,EAAiB;IACtC,OAAOJ,UAAU,CAAC,MAAMT,eAAe,CAACY,IAAI,CAACC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;EAC5D,CAAC;EAEDC,QAAQA,CAAA,EAAkB;IACtB,OAAOL,UAAU,CAAC,MAAMT,eAAe,CAACc,QAAQ,CAAC,CAAC,CAAC;EACvD,CAAC;EAEDC,QAAQA,CAACC,OAAsB,EAAmB;IAC9C,OAAOP,UAAU,CAAC,MAAMT,eAAe,CAACe,QAAQ,CAACC,OAAO,CAAC,CAAC;EAC9D,CAAC;EAEDC,UAAUA,CAACC,SAAiB,EAAiB;IACzC,OAAOT,UAAU,CAAC,MAAMT,eAAe,CAACiB,UAAU,CAACC,SAAS,CAAC,CAAC;EAClE,CAAC;EAED;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACIC,mBAAmBA,CAACD,SAAiB,EAAiB;IAClD,OAAOT,UAAU,CAAC,MAAMT,eAAe,CAACmB,mBAAmB,CAACD,SAAS,CAAC,CAAC;EAC3E,CAAC;
|
|
1
|
+
{"version":3,"names":["NativeVoipCloud","on","rejectNotLinked","Promise","reject","Object","assign","Error","code","callNative","fn","VoipCloud","init","cfg","shutdown","register","account","unregister","accountId","refreshRegistration","handleIpChange","makeCall","destinationUri","answer","callId","hangup","mode","hold","unhold","mute","sendDtmf","digits","transferCall","hangupAllCalls","reconnectCallAudio"],"sourceRoot":"../../src","sources":["VoipCloud.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -23,6 +23,13 @@ export declare const VoipCloud: {
|
|
|
23
23
|
* registered — the caller should fall back to `register()` on a cold start.
|
|
24
24
|
*/
|
|
25
25
|
refreshRegistration(accountId: number): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
|
|
28
|
+
* `Endpoint::handleIpChange`). Use after a long suspend / network change, when
|
|
29
|
+
* `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
|
|
30
|
+
* while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
|
|
31
|
+
*/
|
|
32
|
+
handleIpChange(): Promise<void>;
|
|
26
33
|
makeCall(accountId: number, destinationUri: string): Promise<number>;
|
|
27
34
|
answer(callId: number): Promise<void>;
|
|
28
35
|
hangup(callId: number, mode?: "busy" | "cancel" | "normal"): Promise<void>;
|
package/package.json
CHANGED
package/src/VoipCloud.ts
CHANGED
|
@@ -59,6 +59,20 @@ export const VoipCloud = {
|
|
|
59
59
|
return callNative(() => NativeVoipCloud.refreshRegistration(accountId));
|
|
60
60
|
},
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* iOS: restart SIP transports and re-REGISTER all accounts (PJSIP
|
|
64
|
+
* `Endpoint::handleIpChange`). Use after a long suspend / network change, when
|
|
65
|
+
* `refreshRegistration` would reuse a dead socket. Rejects `VC_IP_CHANGE`
|
|
66
|
+
* while calls exist, and `VC_UNSUPPORTED` where the native side lacks it.
|
|
67
|
+
*/
|
|
68
|
+
handleIpChange(): Promise<void> {
|
|
69
|
+
return callNative(() =>
|
|
70
|
+
typeof NativeVoipCloud.handleIpChange === 'function'
|
|
71
|
+
? NativeVoipCloud.handleIpChange()
|
|
72
|
+
: Promise.reject(Object.assign(new Error('handleIpChange not supported'), { code: 'VC_UNSUPPORTED' })),
|
|
73
|
+
);
|
|
74
|
+
},
|
|
75
|
+
|
|
62
76
|
makeCall(accountId: number, destinationUri: string): Promise<number> {
|
|
63
77
|
return callNative(() => NativeVoipCloud.makeCall(accountId, destinationUri));
|
|
64
78
|
},
|