Example Voximplant scenarios.
A script by V.
| /* | |
| * basic redirect to SIP | |
| * listens for call event and redirects all calls to the same sip number | |
| */ | |
| VoxEngine.addEventListener(AppEvents.CallAlerting, function(event) { | |
| var PBXoptions = { | |
| server: { | |
| ip: 'xxx.xxx.xxx.xxx' | |
| }, | |
| sip: { | |
| login: 'your-sip-login', | |
| password: 'your-sip-password' | |
| } | |
| }; | |
| // incoming call event properties | |
| var incomingCall = event.call; // Call: Incoming call that triggered the event | |
| var callerId = event.callerid; // String: CallerID for current call | |
| var customData = event.customData; // Optional String: Custom data that was passed from client with the call | |
| var destination = event.destination; // String: Dialed number | |
| var displayName = event.displayName; // String: Displayable name of the caller | |
| var fromURI = event.fromURI; // String: CallerID with domain or SIP URI for incoming SIP call | |
| var headers = event.headers; // Object: Custom SIP headers received with the call (ones starting with "X-") | |
| var name = event.name; // String: The name of the event - "Application.CallAlerting" | |
| var toURI = event.toURI; // String: Dialed SIP URI | |
| // VoxEngine.callSIP(to, callerid, displayName, password, authUser, extraHeaders, video, outProxy) | |
| // to - String: SIP URI to make call to | |
| // callerid - String (optional): CallerID that will be displayed to called user. If not specified, "[email protected]" string will be sent, where "appname" is the Voximplant application name and "accname" is the Voximplant account name. | |
| // displayName - String (optional): Name of calling user, that will be displayed to called user | |
| // password - String (optional): Password for SIP Authentication | |
| // authUser - String (optional): Username for SIP Authentication. If not specified, callerid is used as username for authentication | |
| // extraHeaders - Object (optional): Optional custom parameters (SIP headers) that should be passed with call (INVITE) message. Parameter names must start with "X-" to be processed by application | |
| // video - Boolean (optional): Specifies if call should have video support. Please note that price for audio-only and video calls is different! | |
| // outProxy - String (optional) - Specifies outbound proxy | |
| var sipOpts = { | |
| to: 'sip:' + PBXoptions.sip.login + '@' + PBXoptions.server.ip, | |
| callerid: callerId, | |
| displayName: displayName, | |
| password: PBXoptions.sip.password, | |
| authUser: PBXoptions.sip.login, | |
| extraHeaders: {}, | |
| video: false, | |
| outProxy: null | |
| }; | |
| var sipCall = VoxEngine.callSIP(sipOpts.to, sipOpts.callerid, sipOpts.displayName, sipOpts.password, sipOpts.authUser, sipOpts.extraHeaders, sipOpts.video, sipOpts.outProxy); | |
| VoxEngine.sendMediaBetween(incomingCall, sipCall); // Start sending media from mediaUnit1 to mediaUnit2 and vice versa | |
| VoxEngine.easyProcess(incomingCall, sipCall); // Adds all default event listeners to pass signaling information between two calls | |
| /* comment this section if it is not required to release voximplant virtual telephone number after redirection */ | |
| var forwardOptions = { | |
| onEstablishedCallback: function(incoming, outgoing) { | |
| Logger.write(' >>> forwardCallToSIP, onEstablishedCallback()'); | |
| var key; | |
| if (typeof incoming === 'object') { for (key in incoming) { Logger.write(' > incoming' + '[' + key+ ']: ' + incoming[key]); } } | |
| else { Logger.write(' >>>>>> incoming call: ' + incoming); } | |
| if (typeof outgoing === 'object') { for (key in outgoing) { Logger.write(' > outgoing' + '[' + key+ ']: ' + outgoing[key]); } } | |
| else { Logger.write(' >>>>>> outgoing call: ' + outgoing); } | |
| }, | |
| video: false | |
| }; | |
| VoxEngine.forwardCallToSIP(forwardOptions.onEstablishedCallback, forwardOptions.video); // forward call to Sip | |
| /* comment this section if it is not required to release voximplant virtual telephone number after redirection */ | |
| }); |
| /* | |
| * extended redirect to SIP | |
| * listens to call event | |
| * intercepts an incoming call which is already redirected from physical phone to virtual phone number | |
| * redirects an incoming redirected call to sip account associated with original destination retrieved from original call headers | |
| */ | |
| VoxEngine.addEventListener(AppEvents.CallAlerting, function(event) { | |
| var PBXoptions = { | |
| server: { | |
| ip: 'xxx.xxx.xxx.xxx' | |
| }, | |
| sip: { | |
| to: 'callee-sip-login', | |
| login: 'your-sip-login', | |
| password: 'your-sip-password' | |
| } | |
| }; | |
| // incoming call event properties | |
| var incomingCall = event.call; // Call: Incoming call that triggered the event | |
| var callerId = event.callerid; // String: CallerID for current call | |
| var customData = event.customData; // Optional String: Custom data that was passed from client with the call | |
| var destination = event.destination; // String: Dialed number | |
| var displayName = event.displayName; // String: Displayable name of the caller | |
| var fromURI = event.fromURI; // String: CallerID with domain or SIP URI for incoming SIP call | |
| var headers = event.headers; // Object: Custom SIP headers received with the call (ones starting with "X-") | |
| var name = event.name; // String: The name of the event - "Application.CallAlerting" | |
| var toURI = event.toURI; // String: Dialed SIP URI | |
| // resolve caller SIP number | |
| var url = 'http://your-server.domain/api/resolve-sip-acc?'; | |
| url += 'callerId=' + callerId + '&'; | |
| url += 'customData=' + customData + '&'; | |
| // url += 'destination=' + destination + '&'; // bad destination, it is virtual number not the callee | |
| url += 'destination=' + headers.Diversion.match(/[0-9+]/)[0] + '&'; // real destination, not the one with virtual number, which is strored in destination variable | |
| url += 'displayName=' + displayName + '&'; | |
| url += 'fromURI=' + fromURI + '&'; | |
| url += 'name=' + name + '&'; | |
| url += 'toURI=' + toURI + '&'; | |
| url += 'token=xD9VCSF9yetRX7sXefZRCVh4MQQgCD44aBe2D2PA'; | |
| Net.httpRequestAsync(url).then(function(response) { | |
| /* | |
| * if this example response should contain stringified object ad text { id: 'callee-sip-id' } | |
| */ | |
| /* DEBUG response */ | |
| Logger.write(' >>>> resolve callee SIP number'); | |
| for (var key in response) { Logger.write(' > response' + '[' + key+ ']: ' + response[key]); } | |
| var resJSON = JSON.parse(response.text); | |
| if (!resJSON.id) { | |
| event.call.startEarlyMedia(); | |
| event.call.say("There is no SIP account for this user", Language.US_ENGLISH_FEMALE); | |
| } else { | |
| Logger.write('resolved sip login: ' + resJSON.id); | |
| PBXoptions.sip.to = resJSON.id; | |
| // VoxEngine.callSIP(to, callerid, displayName, password, authUser, extraHeaders, video, outProxy) | |
| // to - String: SIP URI to make call to | |
| // callerid - String (optional): CallerID that will be displayed to called user. If not specified, "[email protected]" string will be sent, where "appname" is the Voximplant application name and "accname" is the Voximplant account name. | |
| // displayName - String (optional): Name of calling user, that will be displayed to called user | |
| // password - String (optional): Password for SIP Authentication | |
| // authUser - String (optional): Username for SIP Authentication. If not specified, callerid is used as username for authentication | |
| // extraHeaders - Object (optional): Optional custom parameters (SIP headers) that should be passed with call (INVITE) message. Parameter names must start with "X-" to be processed by application | |
| // video - Boolean (optional): Specifies if call should have video support. Please note that price for audio-only and video calls is different! | |
| // outProxy - String (optional) - Specifies outbound proxy | |
| var sipOpts = { | |
| to: 'sip:' + PBXoptions.sip.to + '@' + PBXoptions.server.ip, | |
| callerid: callerId, | |
| displayName: displayName, | |
| password: PBXoptions.sip.password, | |
| authUser: PBXoptions.sip.login, | |
| extraHeaders: { | |
| 'X-NUMBER': callerId | |
| }, | |
| video: false, | |
| outProxy: null | |
| }; | |
| var sipCall = VoxEngine.callSIP(sipOpts.to, sipOpts.callerid, sipOpts.displayName, sipOpts.password, sipOpts.authUser, sipOpts.extraHeaders, sipOpts.video, sipOpts.outProxy); | |
| VoxEngine.sendMediaBetween(incomingCall, sipCall); // Start sending media from mediaUnit1 to mediaUnit2 and vice versa | |
| VoxEngine.easyProcess(incomingCall, sipCall); // Adds all default event listeners to pass signaling information between two calls | |
| /* comment this section if it is not required to release voximplant virtual telephone number after redirection */ | |
| var forwardOptions = { | |
| onEstablishedCallback: function(incoming, outgoing) { | |
| Logger.write(' >>> forwardCallToSIP, onEstablishedCallback()'); | |
| var key; | |
| if (typeof incoming === 'object') { for (key in incoming) { Logger.write(' > incoming' + '[' + key+ ']: ' + incoming[key]); } } | |
| else { Logger.write(' >>>>>> incoming call: ' + incoming); } | |
| if (typeof outgoing === 'object') { for (key in outgoing) { Logger.write(' > outgoing' + '[' + key+ ']: ' + outgoing[key]); } } | |
| else { Logger.write(' >>>>>> outgoing call: ' + outgoing); } | |
| }, | |
| video: false | |
| }; | |
| VoxEngine.forwardCallToSIP(forwardOptions.onEstablishedCallback, forwardOptions.video); // forward call to Sip | |
| /* comment this section if it is not required to release voximplant virtual telephone number after redirection */ | |
| } | |
| }); | |
| }); |
Example Voximplant scenarios.
A script by V.