Giter VIP home page Giter VIP logo

jssip's People

Contributors

acharlop avatar adubovikov avatar angeloraso avatar blindchickens avatar davies147 avatar fabrykowski avatar garysoed avatar gebsl avatar hexray-newbee avatar ibc avatar iwanbk avatar jlaine avatar jmillan avatar kkozlik avatar lei40251 avatar markusatm avatar nicketson avatar pedrokiefer avatar phwb avatar robymcandrew avatar roramirez avatar saghul avatar shimaore avatar simonlindberg avatar spike008t avatar staskobzar avatar stefang42 avatar swysor avatar voicenter avatar xcorail avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jssip's Issues

Content-Type check for incoming SIP MESSAGE

Enhance the content type check for incoming SIP MESSAGES. Nowadays only an exact "text/plain" value is allowed, but not media type parameters.

Also, respond a (415 Unsupported Media Type) if received content is not "text/plain"

Support ICE trickling for faster session stablishment

@freeswitch has referenced and commented some ways to solve the need to wait for all ice candidates before sending the INVITE request or 200 response: https://groups.google.com/forum/#!topic/jssip/7gcykkmH8RI

There is also a draft in DISPATCH "SIP signalling for ICE trickling draft-li-dispatch-ice-trickling-signalling" (http://tools.ietf.org/html/draft-li-dispatch-ice-trickling-signalling), which defines and evaluates the ICE trickling using SIP UPTADE, INFO and also SUBSCRIBE method.

sips schema not in contact url when registering over WSS

When JsSIP registers to a remote endpoint over a secure web socket wss, the contact addr does not indicate the sips url scheme, instead it has sip. So when trying to call that registered user its using the wrong scheme so it cannot properly find the socket connection.

I have added code on my server side to detect the WSS transport in the via and rewrite the contact to sips but it probably should be offered by the client too. The RFC draft also shows the usage of the sip schema in the contact on a register as the proper behavior but it probably should be modified on the next revision.

Despite the fact that its a idle socket connection that does not close, it still requires the knowledge of the proper schema on our sip stack to locate the cached socket connection to send calls back to the browser. There is a hash made from the combo of schema ip and rport.

Enforce name-addr syntax usage in From/To/Contact

In From/To/Contact always use name-addr format regardless there is display-name or not. A SIP URI allows ":" in a UR param value, but if such a URI appears in a header allowing name-addr/spec-addr like header (To/From/Contact/) then the URI must be enclposed between < > (so name-addr format is required).

Also do it in Contact within the new ua.contact.toString(anonymous=false) mechanism. I would suggest that such a toString method ALWAYS returns a name-addr style Contact value, so if you need to pass ;ob to the URI do it by passing some kind of optional argument to contact.toString() method:

ua.contact.toStrking({
  anynomous: true,
  outbound: true   // this would add ";ob" in Contact URI params
});

Reuse credentials

After succesfull Digest authentication store the credentials data (cnonc and other values) for reusing the same credentials in new requests (until the server/proxy decides to invalidate the nonce).

This is not critical or needed at all, so let's plan it for a future release.

check grunt v0.3.17 errors

Related to #40.

Running grunt v0.3.17 some jslint errors appear, they could be fixed rather than modifying grunt.js:

Running "lint:dist" (lint) task
Linting dist/jssip-0.2.1.js...ERROR
[L713:C18] Value of 'e' may be overwritten in IE.
      } catch(e) {
[L652:C21] 'e' is defined but never used.
  onOpen: function(e) {
[L771:C22] 'e' is defined but never used.
  onError: function(e) {
[L2955:C61] 'data' is defined but never used.
JsSIP.Session.prototype.close = function(event, sender, data) {
[L2955:C55] 'sender' is defined but never used.
JsSIP.Session.prototype.close = function(event, sender, data) {
[L2955:C47] 'event' is defined but never used.
JsSIP.Session.prototype.close = function(event, sender, data) {
[L3219:C34] 'e' is defined but never used.
      onMediaFailure = function(e) {
[L3743:C28] 'e' is defined but never used.
  function onMediaFailure(e) {

First question: couldn't jslint be executed before joining all the files into a single one? It's hard to find out some of the above errors.

So:

[L713:C18] Value of 'e' may be overwritten in IE.

So maybe another variable name should be used?

      } catch(e) {
[L652:C21] 'e' is defined but never used.
  onOpen: function(e) {
[L771:C22] 'e' is defined but never used.
  onError: function(e) {
[L2955:C61] 'data' is defined but never used.

So "data" can be removed from the function argument list?

JsSIP.Session.prototype.close = function(event, sender, data) {
[L2955:C55] 'sender' is defined but never used.
JsSIP.Session.prototype.close = function(event, sender, data) {
[L2955:C47] 'event' is defined but never used.
JsSIP.Session.prototype.close = function(event, sender, data) {
[L3219:C34] 'e' is defined but never used.
      onMediaFailure = function(e) {
[L3743:C28] 'e' is defined but never used.
  function onMediaFailure(e) {

Same?

Pass the SIP response or error cause (Event data) in UA.registrationFailed() event and others

When a registration or un-registration fails we may need to know the error cause (the [3456]XX final response or error cause) so it should be passed as parameter to the UA.registrationFailed() event.

NOTE: Where is UA.registrationFailed() in the API documentation? is there UA.unregistrationFailed()?

In case of registration/un-registration success, please also provide the 200 response within the registered() and unregistered() events.

NOTE: This issue is also related to #26 but covers more cases.

Improve authentication when the server is "ugly"

(Reported by Fabian Santana in jssip maillist).

Real use case:

  • JsSIP sends un-REGISTER (no credentials yet).
  • Asterisk replies 401 with a theorically new or still valid nonce "7b522aca".
  • JsSIP re-sends un-REGISTER with proper credentials.
  • Asterisk checks the credentials "response" field. It's valid but... Asterisk decides that the used nonce "7b522aca" is now invalid or has been disabled (WTF !). This is known due the "stale=true" field.
  • JsSIP then does not attempt to send a new un-REGISTER again.

The authentication code in JsSIP could be improved to handle strange (but existing...) scenarios like this. Perhaps try 2 times sending credentials instead of just one? That would make JsSIP more reliable in "non-reliable" scenarios.

NOTE: No user API change involved, so good for 0.2.2.

Add Transfer API

It'd be nice if the Session object supported some means of "transfer" for the call that would use one of the myriad of SIP means to transfer the call.

Tune jshint options

Using latest versions of grunt, there appear some warnings in the lint process. Adapt grunt.js to the newest versions.

WebSocket w/ binary frame

jssip does not understand messages sent in binary frame.

JsSIP | TRANSPORT | Received WebSocket message: 

[object ArrayBuffer]

Binary data received. Ignoring message

Here is possible dirty solution.

  onMessage: function(e) {
    var message, transaction,
      data = (typeof e.data === 'string') ? e.data : String.fromCharCode.apply(null, new Uint8Array(e.data));

Bug in Contact / Record-Route parser

Davide Corda [email protected] provides a patch via the jssip maillist that fixes a bug in Contact parser (and should also be applied to the Record-Route parser):

testing JsSIP with Boghe client I encountered a small problem on parsing Contact header

Sendig an invite from Boghe to JsSip, Boghe puts in message header a Contact like this

Contact: <sip:[email protected]:62221;transport=udp>;+g.oma.sip-im;language="en,fr";+g.3gpp.icsi-ref="urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel"

and JsSip throws an exception of type

JsSIP | MESSAGE | Error parsing Header Contact:"<sip:[email protected]:62221;transport=udp>;+g.oma.sip-im;language="en" 192.168.0.85:1274

Analyzing Parser.js source I noticed that contacts are just splitted by a comma. I attach a small patch that prevents the split if the comma is inside the quotation marks:

--- E:/CVS-Davide/DOUBANGO/JsSIP/src/Parser.js  Mon Nov 05 14:17:42 2012
+++ E:/CVS-Davide/DOUBANGO/JsSIP/src/Parser_patched.js  Mon Nov 12 11:19:30 2012
@@ -105,12 +105,17 @@
         break;
       case 'contact':
       case 'm':
-        header = header_value.split(',');
+//        header = header_value.split(',');
+        header = header_value.match(/([^\"\',]*((\'[^\']*\')*||(\"[^\"]*\")*))+/gm);//search , except in ""
         length = header.length;

+        var count=0;//found contact counter
         for(idx=0; idx < length; idx++) {
+          if(header[idx].length){
           message.addHeader('contact', header[idx]);
-          parsed = message.parseHeader('contact', idx);
+            parsed = message.parseHeader('contact', count);// idx);
+            count++;
+          }
         }
         break;
       case 'content-length':

JsSIP stack enforces its own minimum expires on response to register.

JsSIP has a param register_min_expires that is set to 120. If a REGISTER has a 200OK with the expires param, its bound to honor that expires time. It cannot decide to do a higher value or the registration will be invalid during the delta between the 2.

from RFC 3261 section 10.3 Processing REGISTER Requests

  1. The registrar now processes each contact address in the Contact
    header field in turn. For each address, it determines the
    expiration interval as follows:

     -  If the field value has an "expires" parameter, that value
        MUST be taken as the requested expiration.
    
     -  If there is no such parameter, but the request has an
        Expires header field, that value MUST be taken as the
        requested expiration.
    
     -  If there is neither, a locally-configured default value MUST
        be taken as the requested expiration.
    

Cannot call between Chrome and Asterisk

Using your demo library, I can register two users on an Asterisk 11B2 server, no NAT. If I try to initiate a call, I can make the other browser ring, but when I try to connect, the call is dropped:

I modified the init.js code so that my own Asterisk 11B2 WebSocket server is the default.

Note that I can only make my extension ring I'm calling from the Chrome client http://sipml5.org/call.htm to the jsSIP demo, but the call still drops.

If I use jsSIP on both ends, the client I'm calling never rings.

Below is my log from the Chrome client I called from:

JsSIP | EVENT EMITTER | Adding event: error jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | Adding event: failure jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | Adding event: terminate jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | Adding event: answer jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | Adding event: cancel jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | Adding event: ring jssip-0.1.0.js:55
JsSIP | EVENT EMITTER | new Listener added to event: ring jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | new Listener added to event: failure jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | new Listener added to event: answer jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | new Listener added to event: terminate jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | new Listener added to event: error jssip-0.1.0.js:51
JsSIP | MEDIA SESSION | Requesting access to local media. jssip-0.1.0.js:3748
JsSIP | MEDIA SESSION | Got stream [object LocalMediaStream] jssip-0.1.0.js:3730
Status changed to: 1 jssip-0.1.0.js:3705
ICE state is: 1792 jssip-0.1.0.js:3706
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | ICE candidate received: a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
jssip-0.1.0.js:3661
JsSIP | MEDIA SESSION | No more ICE candidate jssip-0.1.0.js:3664
JsSIP | MEDIA SESSION | Peerconnection status: undefined jssip-0.1.0.js:3665
JsSIP | MEDIA SESSION | Ice Status: undefined jssip-0.1.0.js:3666
JsSIP | TRANSPORT | Sending WebSocket message:

INVITE sip:[email protected] SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK5644188
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=hivi8vpt1e
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3066 INVITE
Contact: sip:[email protected];transport=ws;ob
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Content-Type: application/sdp
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0
Content-Length: 2231

v=0
o=- 195813164 1 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 31074 RTP/SAVPF 103 104 0 8 106 105 13 126
c=IN IP4 50.20.Z.Z
a=rtcp:31074 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=ice-ufrag:2MHSwIXPrBw/ymRt
a=ice-pwd:Jzzu3bgwVW1kkueUQxDaiScb
a=sendrecv
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:1Kcm8QAXIEX8ii9Ly+Ff3rH67c7KHJHrTUWuAtqY
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=ssrc:1350659546 cname:UyXVGmgSGAAl5jjV
a=ssrc:1350659546 mslabel:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN3
a=ssrc:1350659546 label:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN300
m=video 31074 RTP/SAVPF 100 101 102
c=IN IP4 50.20.Z.Z
a=rtcp:31074 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=ice-ufrag:2MHSwIXPrBw/ymRt
a=ice-pwd:Jzzu3bgwVW1kkueUQxDaiScb
a=sendrecv
a=mid:video
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:1Kcm8QAXIEX8ii9Ly+Ff3rH67c7KHJHrTUWuAtqY
a=rtpmap:100 VP8/90000
a=rtpmap:101 red/90000
a=rtpmap:102 ulpfec/90000
a=ssrc:1240465651 cname:UyXVGmgSGAAl5jjV
a=ssrc:1240465651 mslabel:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN3
a=ssrc:1240465651 label:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN310

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK5644188;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=hivi8vpt1e
To: sip:[email protected];tag=as687c05c1
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3066 INVITE
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="78d7b6c2"
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK5644188
Route: sip:50.10.W.W:8088;transport=ws;lr
To: sip:[email protected];tag=as687c05c1
From: sip:[email protected];tag=hivi8vpt1e
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3066 ACK

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Sending WebSocket message:

INVITE sip:[email protected] SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK8318290
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=hivi8vpt1e
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3067 INVITE
Contact: sip:[email protected];transport=ws;ob
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Content-Type: application/sdp
Authorization: Digest username="1060",realm="doubango.org",nonce="78d7b6c2",uri="sip:[email protected]",response="1ec2aed303255e6c8ad2e0309519b5a2",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0
Content-Length: 2231

v=0
o=- 195813164 1 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 31074 RTP/SAVPF 103 104 0 8 106 105 13 126
c=IN IP4 50.20.Z.Z
a=rtcp:31074 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=ice-ufrag:2MHSwIXPrBw/ymRt
a=ice-pwd:Jzzu3bgwVW1kkueUQxDaiScb
a=sendrecv
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:1Kcm8QAXIEX8ii9Ly+Ff3rH67c7KHJHrTUWuAtqY
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=ssrc:1350659546 cname:UyXVGmgSGAAl5jjV
a=ssrc:1350659546 mslabel:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN3
a=ssrc:1350659546 label:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN300
m=video 31074 RTP/SAVPF 100 101 102
c=IN IP4 50.20.Z.Z
a=rtcp:31074 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 37085 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 31074 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 44782 typ host generation 0
a=ice-ufrag:2MHSwIXPrBw/ymRt
a=ice-pwd:Jzzu3bgwVW1kkueUQxDaiScb
a=sendrecv
a=mid:video
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:1Kcm8QAXIEX8ii9Ly+Ff3rH67c7KHJHrTUWuAtqY
a=rtpmap:100 VP8/90000
a=rtpmap:101 red/90000
a=rtpmap:102 ulpfec/90000
a=ssrc:1240465651 cname:UyXVGmgSGAAl5jjV
a=ssrc:1240465651 mslabel:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN3
a=ssrc:1240465651 label:Oo3CjIgOm0QAMxREwWF0FuuC2IHKluRPhpN310

jssip-0.1.0.js:497
JsSIP | TRANSACTION | Timer D expired z9hG4bK5644188 jssip-0.1.0.js:1518
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 488 Not acceptable here
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK8318290;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=hivi8vpt1e
To: sip:[email protected];tag=as687c05c1
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3067 INVITE
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK8318290
Route: sip:50.10.W.W:8088;transport=ws;lr
To: sip:[email protected];tag=as687c05c1
From: sip:[email protected];tag=hivi8vpt1e
Call-ID: 9pzxzpiju0gukq8yta9k
CSeq: 3067 ACK

jssip-0.1.0.js:497
JsSIP | INVITE SESSION | Closing Invite Session 9pzxzpiju0gukq8yta9khivi8vpt1e jssip-0.1.0.js:2640
JsSIP | MEDIA SESSION | Closing peerConnection jssip-0.1.0.js:3711
Status changed to: 3 jssip-0.1.0.js:3705
ICE state is: 1792 jssip-0.1.0.js:3706
JsSIP | EVENT EMITTER | Emitting event: failure jssip-0.1.0.js:173
JsSIP | TRANSACTION | Timer D expired z9hG4bK8318290 jssip-0.1.0.js:1518
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK9262007
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=frfyyecabg
Call-ID: ocv0t0iu3xm0lik9
CSeq: 85 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:eea0ebda-630d-498c-a4d9-3afba27f5c12";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK9262007;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=frfyyecabg
To: sip:[email protected];tag=as06e14a91
Call-ID: ocv0t0iu3xm0lik9
CSeq: 85 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="13c32c8c"
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK1945829
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=frfyyecabg
Call-ID: ocv0t0iu3xm0lik9
CSeq: 86 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:eea0ebda-630d-498c-a4d9-3afba27f5c12";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Authorization: Digest username="1060",realm="doubango.org",nonce="13c32c8c",uri="sip:doubango.org",response="141bc22c732b35866d92593fd77ca2fa",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 200 OK
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK1945829;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=frfyyecabg
To: sip:[email protected];tag=as06e14a91
Call-ID: ocv0t0iu3xm0lik9
CSeq: 86 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Expires: 120
Contact: sip:[email protected];transport=ws;expires=120
Date: Mon, 01 Oct 2012 18:37:50 GMT
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | EVENT EMITTER | Emitting event: register jssip-0.1.0.js:173
Registered init.js:249
JsSIP | TRANSPORT | Received WebSocket message:

NOTIFY sip:[email protected];transport=ws SIP/2.0
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK13306961;rport
Max-Forwards: 70
From: "asterisk" sip:[email protected];tag=as2cf5a4f4
To: sip:[email protected];transport=ws
Contact: sip:[email protected]:5060;transport=WS
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX SVN-trunk-r373330M
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 107

Messages-Waiting: yes
Message-Account: sip:[email protected];transport=WS
Voice-Message: 1/0 (0/0)

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK13306961;rport
Max-Forwards: 69
To: sip:[email protected];transport=ws;tag=0ro0j1wneq
From: "asterisk" sip:[email protected];tag=as2cf5a4f4
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY

jssip-0.1.0.js:497
JsSIP | TRANSACTION | Timer J expired z9hG4bK13306961 jssip-0.1.0.js:1643

This is the log from the receiving client, although there isn't much to see since it didn't even ring on this side:

JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK237805;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=qiz1djts2j
To: sip:[email protected];tag=as60b0e39e
Call-ID: bhcb4pxqsvpldi
CSeq: 85 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="4d9ef429"
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK595307
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=qiz1djts2j
Call-ID: bhcb4pxqsvpldi
CSeq: 86 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:d08621f1-7875-4402-8608-791fc495482d";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Authorization: Digest username="1062",realm="doubango.org",nonce="4d9ef429",uri="sip:doubango.org",response="cdfa7644a383c8102b5d32fa2de2a341",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 200 OK
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK595307;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=qiz1djts2j
To: sip:[email protected];tag=as60b0e39e
Call-ID: bhcb4pxqsvpldi
CSeq: 86 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Expires: 120
Contact: sip:[email protected];transport=ws;expires=120
Date: Mon, 01 Oct 2012 18:37:03 GMT
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | EVENT EMITTER | Emitting event: register
jssip-0.1.0.js:173
Registered
init.js:249
JsSIP | TRANSPORT | Received WebSocket message:

NOTIFY sip:[email protected];transport=ws SIP/2.0
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK3219b100;rport
Max-Forwards: 70
From: "asterisk" sip:[email protected];tag=as61540f45
To: sip:[email protected];transport=ws
Contact: sip:[email protected]:5060;transport=WS
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX SVN-trunk-r373330M
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 106

Messages-Waiting: no
Message-Account: sip:[email protected];transport=WS
Voice-Message: 0/0 (0/0)

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK3219b100;rport
Max-Forwards: 69
To: sip:[email protected];transport=ws;tag=i1ztesl574
From: "asterisk" sip:[email protected];tag=as61540f45
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY

jssip-0.1.0.js:497
JsSIP | TRANSACTION | Timer J expired z9hG4bK3219b100
jssip-0.1.0.js:1643
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK342029
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=yvgyl8xott
Call-ID: bhcb4pxqsvpldi
CSeq: 87 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:d08621f1-7875-4402-8608-791fc495482d";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK342029;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=yvgyl8xott
To: sip:[email protected];tag=as45e42ecf
Call-ID: bhcb4pxqsvpldi
CSeq: 87 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="09469796"
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK5622186
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=yvgyl8xott
Call-ID: bhcb4pxqsvpldi
CSeq: 88 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:d08621f1-7875-4402-8608-791fc495482d";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Authorization: Digest username="1062",realm="doubango.org",nonce="09469796",uri="sip:doubango.org",response="25c870d1cb1897d28d54414c136927b8",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 200 OK
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK5622186;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=yvgyl8xott
To: sip:[email protected];tag=as45e42ecf
Call-ID: bhcb4pxqsvpldi
CSeq: 88 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Expires: 120
Contact: sip:[email protected];transport=ws;expires=120
Date: Mon, 01 Oct 2012 18:39:00 GMT
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | EVENT EMITTER | Emitting event: register
jssip-0.1.0.js:173
Registered
init.js:249
JsSIP | TRANSPORT | Received WebSocket message:

NOTIFY sip:[email protected];transport=ws SIP/2.0
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK1eff1ef3;rport
Max-Forwards: 70
From: "asterisk" sip:[email protected];tag=as6aa3e09d
To: sip:[email protected];transport=ws
Contact: sip:[email protected]:5060;transport=WS
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX SVN-trunk-r373330M
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 106

Messages-Waiting: no
Message-Account: sip:[email protected];transport=WS
Voice-Message: 0/0 (0/0)

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK1eff1ef3;rport
Max-Forwards: 69
To: sip:[email protected];transport=ws;tag=hd7da1nqy4
From: "asterisk" sip:[email protected];tag=as6aa3e09d
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY

jssip-0.1.0.js:497
JsSIP | TRANSACTION | Timer J expired z9hG4bK1eff1ef3
jssip-0.1.0.js:1643
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK764249
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=koe7xp8ime
Call-ID: bhcb4pxqsvpldi
CSeq: 89 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:d08621f1-7875-4402-8608-791fc495482d";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK764249;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=koe7xp8ime
To: sip:[email protected];tag=as7e764503
Call-ID: bhcb4pxqsvpldi
CSeq: 89 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="4462a737"
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK1926622
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=koe7xp8ime
Call-ID: bhcb4pxqsvpldi
CSeq: 90 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:d08621f1-7875-4402-8608-791fc495482d";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Authorization: Digest username="1062",realm="doubango.org",nonce="4462a737",uri="sip:doubango.org",response="797151893346e14e2773117b0200394f",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:497
JsSIP | TRANSPORT | Received WebSocket message:

SIP/2.0 200 OK
Via: SIP/2.0/TCP 124.84.61.31;branch=z9hG4bK1926622;received=50.20.Z.Z;rport=26823
From: sip:[email protected];tag=koe7xp8ime
To: sip:[email protected];tag=as7e764503
Call-ID: bhcb4pxqsvpldi
CSeq: 90 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Expires: 120
Contact: sip:[email protected];transport=ws;expires=120
Date: Mon, 01 Oct 2012 18:40:57 GMT
Content-Length: 0

jssip-0.1.0.js:614
JsSIP | EVENT EMITTER | Emitting event: register
jssip-0.1.0.js:173
Registered
init.js:249
JsSIP | TRANSPORT | Received WebSocket message:

NOTIFY sip:[email protected];transport=ws SIP/2.0
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK3744afe5;rport
Max-Forwards: 70
From: "asterisk" sip:[email protected];tag=as66d81c75
To: sip:[email protected];transport=ws
Contact: sip:[email protected]:5060;transport=WS
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX SVN-trunk-r373330M
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 106

Messages-Waiting: no
Message-Account: sip:[email protected];transport=WS
Voice-Message: 0/0 (0/0)

jssip-0.1.0.js:614
JsSIP | TRANSPORT | Sending WebSocket message:

SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK3744afe5;rport
Max-Forwards: 69
To: sip:[email protected];transport=ws;tag=gouo2ac9yk
From: "asterisk" sip:[email protected];tag=as66d81c75
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY

jssip-0.1.0.js:497
JsSIP | TRANSACTION | Timer J expired z9hG4bK3744afe5
jssip-0.1.0.js:1643

If it helps, here are the SIP Debug logs from Asterisk 11B2:

SIP Debugging re-enabled
Really destroying SIP dialog '[email protected]:5060' Method: NOTIFY
Really destroying SIP dialog 'bhcb4pxqsvpldi' Method: REGISTER
Really destroying SIP dialog '9bcc6ac6-629f-d42a-cef5-7d84e2fd0bdc' Method: REGISTER

<--- SIP read from WS:50.20.Z.Z:4441 --->
REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK8116630
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=1sbzs76ith
Call-ID: ocv0t0iu3xm0lik9
CSeq: 101 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:eea0ebda-630d-498c-a4d9-3afba27f5c12";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

<------------->
--- (12 headers 0 lines) ---
Sending to 50.20.Z.Z:4441 (NAT)

<--- Transmitting (NAT) to 50.20.Z.Z:4441 --->
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK8116630;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=1sbzs76ith
To: sip:[email protected];tag=as51a8c428
Call-ID: ocv0t0iu3xm0lik9
CSeq: 101 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="19db073f"
Content-Length: 0

<------------>
Scheduling destruction of SIP dialog 'ocv0t0iu3xm0lik9' in 32000 ms (Method: REGISTER)

<--- SIP read from WS:50.20.Z.Z:4441 --->
REGISTER sip:doubango.org SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK379200
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=1sbzs76ith
Call-ID: ocv0t0iu3xm0lik9
CSeq: 102 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:eea0ebda-630d-498c-a4d9-3afba27f5c12";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Authorization: Digest username="1060",realm="doubango.org",nonce="19db073f",uri="sip:doubango.org",response="fbf5218e1120c6c29b013149eccbc692",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

<------------->
--- (13 headers 0 lines) ---
Sending to 50.20.Z.Z:4441 (NAT)

<--- Transmitting (NAT) to 50.20.Z.Z:4441 --->
SIP/2.0 200 OK
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK379200;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=1sbzs76ith
To: sip:[email protected];tag=as51a8c428
Call-ID: ocv0t0iu3xm0lik9
CSeq: 102 REGISTER
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Expires: 120
Contact: sip:[email protected];transport=ws;expires=120
Date: Mon, 01 Oct 2012 18:53:29 GMT
Content-Length: 0

<------------>
Scheduling destruction of SIP dialog '[email protected]:5060' in 32000 ms (Method: NOTIFY)
Reliably Transmitting (NAT) to 50.20.Z.Z:4441:
NOTIFY sip:[email protected];transport=ws SIP/2.0
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK655cb331;rport
Max-Forwards: 70
From: "asterisk" sip:[email protected];tag=as412bffe4
To: sip:[email protected];transport=ws
Contact: sip:[email protected]:5060;transport=WS
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY
User-Agent: Asterisk PBX SVN-trunk-r373330M
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: 107

Messages-Waiting: yes
Message-Account: sip:[email protected];transport=WS
Voice-Message: 1/0 (0/0)


Scheduling destruction of SIP dialog 'ocv0t0iu3xm0lik9' in 32000 ms (Method: REGISTER)

<--- SIP read from WS:50.20.Z.Z:4441 --->
SIP/2.0 405 Method Not Allowed
Via: SIP/2.0/WS 50.10.W.W:5060;branch=z9hG4bK655cb331;rport
Max-Forwards: 69
To: sip:[email protected];transport=ws;tag=wrsj358p10
From: "asterisk" sip:[email protected];tag=as412bffe4
Call-ID: [email protected]:5060
CSeq: 102 NOTIFY

<------------->
--- (7 headers 0 lines) ---

<--- SIP read from WS:50.20.Z.Z:4441 --->
INVITE sip:[email protected] SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK9157720
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=apa3z5uiiw
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7743 INVITE
Contact: sip:[email protected];transport=ws;ob
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Content-Type: application/sdp
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0
Content-Length: 2232

v=0
o=- 1796400612 1 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 24532 RTP/SAVPF 103 104 0 8 106 105 13 126
c=IN IP4 50.20.Z.Z
a=rtcp:24532 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=ice-ufrag:i1GpsQJfNoTKzBpp
a=ice-pwd:yFU/lwMxF0Te3zaGLML2vIkI
a=sendrecv
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:nhPhKiSIISGjM/NfkU9Lz1zcmqq0pAMkasHv9ykR
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=ssrc:2201792920 cname:0QJmjabWahIThY/W
a=ssrc:2201792920 mslabel:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM
a=ssrc:2201792920 label:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM00
m=video 24532 RTP/SAVPF 100 101 102
c=IN IP4 50.20.Z.Z
a=rtcp:24532 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=ice-ufrag:i1GpsQJfNoTKzBpp
a=ice-pwd:yFU/lwMxF0Te3zaGLML2vIkI
a=sendrecv
a=mid:video
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:nhPhKiSIISGjM/NfkU9Lz1zcmqq0pAMkasHv9ykR
a=rtpmap:100 VP8/90000
a=rtpmap:101 red/90000
a=rtpmap:102 ulpfec/90000
a=ssrc:2714040175 cname:0QJmjabWahIThY/W
a=ssrc:2714040175 mslabel:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM
a=ssrc:2714040175 label:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM10
<------------->
--- (14 headers 52 lines) ---
Sending to 50.20.Z.Z:4441 (NAT)
Using INVITE request as basis request - 9pzxz2xb03wdtpbi96bt
Found peer '1060' for '1060' from 50.20.Z.Z:4441

<--- Reliably Transmitting (NAT) to 50.20.Z.Z:4441 --->
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK9157720;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=apa3z5uiiw
To: sip:[email protected];tag=as5d1200a0
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7743 INVITE
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="doubango.org", nonce="35da32b3"
Content-Length: 0

<------------>
Scheduling destruction of SIP dialog '9pzxz2xb03wdtpbi96bt' in 32000 ms (Method: INVITE)

<--- SIP read from WS:50.20.Z.Z:4441 --->
ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK9157720
Route: sip:50.10.W.W:8088;transport=ws;lr
To: sip:[email protected];tag=as5d1200a0
From: sip:[email protected];tag=apa3z5uiiw
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7743 ACK

<------------->
--- (7 headers 0 lines) ---

<--- SIP read from WS:50.20.Z.Z:4441 --->
INVITE sip:[email protected] SIP/2.0
Route: sip:50.10.W.W:8088;transport=ws;lr
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK4644969
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=apa3z5uiiw
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7744 INVITE
Contact: sip:[email protected];transport=ws;ob
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Content-Type: application/sdp
Authorization: Digest username="1060",realm="doubango.org",nonce="35da32b3",uri="sip:[email protected]",response="00ad5047678a77ed2b965f001e29599f",algorithm=MD5
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0
Content-Length: 2232

v=0
o=- 1796400612 1 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 24532 RTP/SAVPF 103 104 0 8 106 105 13 126
c=IN IP4 50.20.Z.Z
a=rtcp:24532 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=ice-ufrag:i1GpsQJfNoTKzBpp
a=ice-pwd:yFU/lwMxF0Te3zaGLML2vIkI
a=sendrecv
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:nhPhKiSIISGjM/NfkU9Lz1zcmqq0pAMkasHv9ykR
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=ssrc:2201792920 cname:0QJmjabWahIThY/W
a=ssrc:2201792920 mslabel:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM
a=ssrc:2201792920 label:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM00
m=video 24532 RTP/SAVPF 100 101 102
c=IN IP4 50.20.Z.Z
a=rtcp:24532 IN IP4 50.20.Z.Z
a=candidate:4086812097 1 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:4086812097 2 udp 2130714367 10.1.2.Z 56875 typ host generation 0
a=candidate:2971284297 1 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:2971284297 2 udp 1912610559 50.20.Z.Z 24532 typ srflx generation 0
a=candidate:3172217137 1 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=candidate:3172217137 2 tcp 1694506751 10.1.2.Z 51459 typ host generation 0
a=ice-ufrag:i1GpsQJfNoTKzBpp
a=ice-pwd:yFU/lwMxF0Te3zaGLML2vIkI
a=sendrecv
a=mid:video
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:nhPhKiSIISGjM/NfkU9Lz1zcmqq0pAMkasHv9ykR
a=rtpmap:100 VP8/90000
a=rtpmap:101 red/90000
a=rtpmap:102 ulpfec/90000
a=ssrc:2714040175 cname:0QJmjabWahIThY/W
a=ssrc:2714040175 mslabel:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM
a=ssrc:2714040175 label:C31dH76z83jDP3QgjlYtHate45zHVjIezYuM10
<------------->
--- (15 headers 52 lines) ---
Sending to 50.20.Z.Z:4441 (NAT)
Using INVITE request as basis request - 9pzxz2xb03wdtpbi96bt
Found peer '1060' for '1060' from 50.20.Z.Z:4441
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
Found RTP audio format 103
Found RTP audio format 104
Found RTP audio format 0
Found RTP audio format 8
Found RTP audio format 106
Found RTP audio format 105
Found RTP audio format 13
Found RTP audio format 126
Found unknown media description format ISAC for ID 103
Found unknown media description format ISAC for ID 104
Found audio description format PCMU for ID 0
Found audio description format PCMA for ID 8
Found unknown media description format CN for ID 106
Found unknown media description format CN for ID 105
Found audio description format CN for ID 13
Found audio description format telephone-event for ID 126
Found RTP video format 100
Found RTP video format 101
Found RTP video format 102
[Oct 1 18:53:31] WARNING[26615][C-00000021]: chan_sip.c:10083 process_sdp: Can't provide secure video requested in SDP offer

<--- Reliably Transmitting (NAT) to 50.20.Z.Z:4441 --->
SIP/2.0 488 Not acceptable here
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK4644969;received=50.20.Z.Z;rport=4441
From: sip:[email protected];tag=apa3z5uiiw
To: sip:[email protected];tag=as5d1200a0
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7744 INVITE
Server: Asterisk PBX SVN-trunk-r373330M
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
Content-Length: 0

<------------>
Scheduling destruction of SIP dialog '9pzxz2xb03wdtpbi96bt' in 32000 ms (Method: INVITE)

<--- SIP read from WS:50.20.Z.Z:4441 --->
ACK sip:[email protected] SIP/2.0
Via: SIP/2.0/TCP 251.207.101.84;branch=z9hG4bK4644969
Route: sip:50.10.W.W:8088;transport=ws;lr
To: sip:[email protected];tag=as5d1200a0
From: sip:[email protected];tag=apa3z5uiiw
Call-ID: 9pzxz2xb03wdtpbi96bt
CSeq: 7744 ACK

<------------->
--- (7 headers 0 lines) ---

50.20.Z.Z = Public IP for both clients
50.10.W.W = IP of Asterisk server
10.1.2.Z = Private IP address of calling client

There is no IP for the other client in any of these logs...

Use wrapper functions for webkitXXXXXX or mozXXXXXX named functions

Chrome prefixes WebRTC API functions with "webkit" and Firefox with "moz". Instead of dealing with them in every line of JsSIP code, I propose to create wrapper functions.

For example, for the getUserMedia() function defined in WebRTC, I propose to create a function:

JsSIP.getUserMedia()

Internally this function uses window.webkitGetUserMedia or window.mozGetUserMedia or window.getUserMedia (something that should be inspected and decided on load time to not check it every time in runtime).

Then the rest of JsSIP code using WebRTC functions would just call to JsSIP.getUserMedia(). Some for other WebRTC API functions. In this way just the wrapper functions must be edited, leaving the rest of code clean.

NOTE: No user API change, so 0.2.X.

`npm install` fails with "devel" version

npm does not like the "devel" version of JsSIP master branch and fails when executing npm install:

$ npm install
npm ERR! install Couldn't read dependencies
npm ERR! Error: invalid version: devel
npm ERR!     at validVersion (/usr/lib/nodejs/npm/node_modules/read-package-json/read-json.js:581:40)
npm ERR!     at final (/usr/lib/nodejs/npm/node_modules/read-package-json/read-json.js:341:23)
npm ERR!     at /usr/lib/nodejs/npm/node_modules/read-package-json/read-json.js:140:33
npm ERR!     at cb (/usr/lib/nodejs/npm/node_modules/slide/lib/async-map.js:48:11)
npm ERR!     at /usr/lib/nodejs/npm/node_modules/read-package-json/read-json.js:334:40
npm ERR!     at fs.readFile (fs.js:176:14)
npm ERR!     at fs.close (/usr/lib/nodejs/npm/node_modules/graceful-fs/graceful-fs.js:90:5)
npm ERR!     at Object.oncomplete (fs.js:297:15)
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <[email protected]>

npm ERR! System Linux 3.5.0-23-generic
npm ERR! command "nodejs" "/usr/bin/npm" "install"
npm ERR! cwd /tmp/JsSIP
npm ERR! node -v v0.8.16
npm ERR! npm -v 1.1.69
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /tmp/JsSIP/npm-debug.log
npm ERR! not ok code 0

Maybe we need to use another string instead of "devel"?

jssip 0.3.0-devel ignores captilization in GRUU URI

Using the demo at tryit.jssip.net, I noticed the ACK to the 200OK on call setup wasn't being routed by my proxy. It appears the cause is the failure on the part of jssip to capitalize characters when generating the ACK's Request URI.

The relevant contact header parameter in the 200 from my REGISTER is...
pub-gruu="sip:~~gr~[email protected];gr"

The ACK request line is...
ACK sip:~~gr~[email protected];gr SIP/2.0

trace_sip is enabled by default

If trace_sip is not set then SIP messages are logged into the JS console. According to the doc its default value is "false" but seems not to be true.

display_name does not allow multibyte symbols

Setting 'dispplay_uri' = ' Iñaki' fails, it requires using `'display_name' = '"Iñaki"' which is ugly. JsSIP should be clever enough to allow any kind of string as display_name value, and then ALWAYS enclose it between double quotes (regardless they are needed or not).

Prior to fix this bug, fixing #12 is required.

SIP 401 wrong password doesn't emit registrationFailed event

Use latest commit.
I already wait for 2-3 minutes.
It doesn't happen in jssip-0.2.1.js release

Here is console log

JsSIP | EVENT EMITTER | Adding event: newMessage jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: newSession jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: registrationFailed jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: unregistered jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: registered jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: disconnected jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: connected jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | new Listener added to event: connected jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: disconnected jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: newSession jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: newMessage jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: registered jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: unregistered jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: registrationFailed jssip-0.2.1.js:48
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://debox.lan:5065 jssip-0.2.1.js:619
JsSIP | TRANSPORT | WebSocket connected: ws://debox.lan:5065 jssip-0.2.1.js:655
JsSIP | UA | connection status set to: 0 jssip-0.2.1.js:4579
JsSIP | EVENT EMITTER | Emitting event: connected jssip-0.2.1.js:170
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:debox.lan SIP/2.0
Via: SIP/2.0/TCP 54.80.137.235;branch=z9hG4bK8246450
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=9ybgz79v0d
Call-ID: 8f56z5swk5tdquxr
CSeq: 81 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:25f0ce6c-6a7f-420f-8965-923fa07172f8";expires=600
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.2.1
Content-Length: 0

jssip-0.2.1.js:583
JsSIP | TRANSPORT | Received WebSocket text message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 54.80.137.235;branch=z9hG4bK8246450;rport=59501;received=10.0.11.151
To: sip:[email protected];tag=6900b0fde16e86cbb9932508d0cc0806.81cd
From: sip:[email protected];tag=9ybgz79v0d
Call-ID: 8f56z5swk5tdquxr
CSeq: 81 REGISTER
WWW-Authenticate: Digest realm="debox.lan", nonce="UO3SFlDt0OpJmONIEVgtVorZsefbeDi6"
Server: kamailio (3.4.0-dev7 (i386/linux))
Content-Length: 0

jssip-0.2.1.js:726
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:debox.lan SIP/2.0
Via: SIP/2.0/TCP 54.80.137.235;branch=z9hG4bK9713479
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=9ybgz79v0d
Call-ID: 8f56z5swk5tdquxr
CSeq: 82 REGISTER
Authorization: Digest username="2001",realm="debox.lan",nonce="UO3SFlDt0OpJmONIEVgtVorZsefbeDi6",uri="sip:debox.lan",response="209ca23f35a893dc8ebe81d91fd2f8a3",algorithm=MD5
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:25f0ce6c-6a7f-420f-8965-923fa07172f8";expires=600
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.2.1
Content-Length: 0

jssip-0.2.1.js:583
JsSIP | TRANSPORT | Received WebSocket text message:

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 54.80.137.235;branch=z9hG4bK9713479;rport=59501;received=10.0.11.151
To: sip:[email protected];tag=6900b0fde16e86cbb9932508d0cc0806.831b
From: sip:[email protected];tag=9ybgz79v0d
Call-ID: 8f56z5swk5tdquxr
CSeq: 82 REGISTER
WWW-Authenticate: Digest realm="debox.lan", nonce="UO3SFlDt0OpJmONIEVgtVorZsefbeDi6"
Server: kamailio (3.4.0-dev7 (i386/linux))
Content-Length: 0

Delete dist/ folder?

Since both the packed and minified js files are now available in the downloads section, what about removing the dist folder altogether?

This way there is no risk in forgetting to regenerate it, and it's really easy to do so anyway. (we need to add how to do that to the README, btw)

Bug in From display-name

By Davide Corda [email protected]:

I encountered another problem: if you set a display_name in init.js, line 211 the UA doesn't register because the FROM field is wrong:

REGISTER sip:pluto.com SIP/2.0
Route: <sip:xxx.yyy.zzz.www:8088;transport=ws;lr>
Via: SIP/2.0/TCP 25.55.128.76;branch=z9hG4bK9328951
Max-Forwards: 69
To: "pippo" <sip:[email protected]>
From: "pippo" <"pippo" <sip:[email protected]>>;tag=awlan9h021
Call-ID: ncl6ueouu8t9y66r

JsSIP | MESSAGE | Error parsing Header From:""pippo" <"pippo" sip:[email protected]>;tag=awlan9h021"


> The problem lies in line 649 of UA.js and/or in lines 70.. of SIPMessage.js where the field FROM is composed (the from_uri already contains the display name).

can't register to kamailio since commit 45a3b355c3ec409112d285e04c8d35ac1f71e9bd

This is the console log.
Previous commit has no problem

JsSIP | EVENT EMITTER | Adding event: newMessage jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: newSession jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: registrationFailed jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: unregistered jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: registered jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: disconnected jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | Adding event: connected jssip-0.2.1.js:52
JsSIP | EVENT EMITTER | new Listener added to event: connected jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: disconnected jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: newSession jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: newMessage jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: registered jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: unregistered jssip-0.2.1.js:48
JsSIP | EVENT EMITTER | new Listener added to event: registrationFailed jssip-0.2.1.js:48
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://ijo.us.to:5065 jssip-0.2.1.js:583
JsSIP | TRANSPORT | WebSocket connected: ws://ijo.us.to:5065 jssip-0.2.1.js:619
JsSIP | UA | connection status set to: 0 jssip-0.2.1.js:4902
JsSIP | TRANSPORT | Sending WebSocket message: 

REGISTER sip:ijo.us.to SIP/2.0
Route: <sip:ijo.us.to:5065;transport=ws;lr>
Via: SIP/2.0/TCP 111.172.15.237;branch=z9hG4bK4667089
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=x2bxsuibpu
Call-ID: bccowp78ciyhkt9
CSeq: 81 REGISTER
Contact: <sip:[email protected];transport=ws>;reg-id=1;+sip.instance="<urn:uuid:fe1ee98b-3a04-4cc0-8070-49a35a318bfe>";expires=600
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.2.1
Content-Length: 0


 jssip-0.2.1.js:547
JsSIP | EVENT EMITTER | Emitting event: connected jssip-0.2.1.js:170
JsSIP | TRANSPORT | Received WebSocket text message: 

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 111.172.15.237;branch=z9hG4bK4667089;rport=48780;received=114.79.55.42
To: sip:[email protected];tag=de2124f64c8ba40757c2328112792e3b.0f99
From: sip:[email protected];tag=x2bxsuibpu
Call-ID: bccowp78ciyhkt9
CSeq: 81 REGISTER
WWW-Authenticate: Digest realm="ijo.us.to", nonce="UNAyolDQMXYwFjaf4qm0GWTLG7CJPZRQ"
Server: kamailio (3.4.0-dev5 (i386/linux))
Content-Length: 0


 jssip-0.2.1.js:690
JsSIP | TRANSPORT | Sending WebSocket message: 

REGISTER sip:ijo.us.to SIP/2.0
Route: <sip:ijo.us.to:5065;transport=ws;lr>
Via: SIP/2.0/TCP 111.172.15.237;branch=z9hG4bK4734268
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=x2bxsuibpu
Call-ID: bccowp78ciyhkt9
CSeq: 82 REGISTER
Authorization: Digest username="2002", realm="ijo.us.to", nonce="UNAyolDQMXYwFjaf4qm0GWTLG7CJPZRQ", uri="sip:ijo.us.to", response="4085b90b68ffa3ce7db214e171244282", algorithm=MD5, 
Contact: <sip:[email protected];transport=ws>;reg-id=1;+sip.instance="<urn:uuid:fe1ee98b-3a04-4cc0-8070-49a35a318bfe>";expires=600
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.2.1
Content-Length: 0


 jssip-0.2.1.js:547
JsSIP | TRANSPORT | Received WebSocket text message: 

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 111.172.15.237;branch=z9hG4bK4734268;rport=48780;received=114.79.55.42
To: sip:[email protected];tag=de2124f64c8ba40757c2328112792e3b.360a
From: sip:[email protected];tag=x2bxsuibpu
Call-ID: bccowp78ciyhkt9
CSeq: 82 REGISTER
WWW-Authenticate: Digest realm="ijo.us.to", nonce="UNAyolDQMXYwFjaf4qm0GWTLG7CJPZRQ"
Server: kamailio (3.4.0-dev5 (i386/linux))
Content-Length: 0

Cache local media stream

For each call made or received the user has to allow the browser to access the camera or microphone.
I think the stream from webkitGetUserMedia can be cached. Someone else said something related to this on the list.

Start a branch "ims"

Some related info in the maillist. Basically we need sending empty credentials in the first REGISTER and so on...

URI username should allow colon password

Reported by Daniel Goepp in the maillist:

As per the RFC, it should be possible to send a password as part of the userinfo:

userinfo         =  ( user / telephone-subscriber ) [ ":" password ] "@"

However when we try to do this, we get rejected:

Uncaught INVALID_TARGET_ERROR: JsSIP | EXCEPTION | 3 

I've confirmed via the browser console that the parser fails when giving valid URIs with password:

JsSIP.grammar.parse("sip:user:[email protected]", "SIP_URI");
=> -1

JsSIP.grammar.parse("<sip:user:[email protected]>", "From");
=> -1

Don't fire "unregistered" event when there is no 200 to the un-REGISTER

(Reported by Fabian Santana in jssip maillist, and related to #25)

JsSIP emits "unregistered" event if it has no confirmation from the registrar (no 200 OK). Maybe jsSIP may fire other event, or perhaps provide some argument in the "unregistered" event telling the user whether the SIP un-registration succeded (200 OK) or not.

This maybe a change in the API so for 0.3.

cnonce value do NOT qouted

Authorization: Digest username="jssip",realm="officesip.local",nonce="dbd851222e9ec5cc7c99d0bdeb21e57d",uri="sip:officesip.local",qop=auth,response="27bc75e2c507597049bf9c59f1363d34",algorithm=MD5,opaque="00000001",cnonce=n5uldz1rmczv,nc=00000001

bnf from rfc3261:

cnonce            =  "cnonce" EQUAL cnonce-value
cnonce-value      =  nonce-value
nonce-value         =  quoted-string

Unchecked "enable video" behavior

Is this the expected behavior for JsSIP with "enable video" disabled? Shouldn't it be just "a=group:BUNDLE audio" ?

I'm testing this with Chrome 24-dev, connecting to an Asterisk server (I know that is not supposed to work, but that is not the issue here). I'm not even sure if this is an issue with JsSIP or Chrome, i'll dig the code to see if there is anything I can change and make it not send the video part.

-------- LOG --------
INVITE sip:[email protected] SIP/2.0
Route: sip:172.20.31.134:8088;transport=ws;lr
Via: SIP/2.0/TCP 8.248.110.15;branch=z9hG4bK1121105
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=jc8rszwiei
Call-ID: h7gqncsv4176n4gqfr
CSeq: 4714 INVITE
Contact: sip:[email protected];transport=ws;ob
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Content-Type: application/sdp
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0
Content-Length: 1818

v=0
o=- 2695534749 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
m=audio 60931 RTP/SAVPF 103 104 0 8 106 105 13 126
c=IN IP4 172.20.31.136
a=rtcp:60931 IN IP4 172.20.31.136
a=candidate:3557374235 1 udp 2113937151 172.20.31.136 60931 typ host generation 0
a=candidate:3557374235 2 udp 2113937151 172.20.31.136 60931 typ host generation 0
a=candidate:2592785899 1 tcp 1509957375 172.20.31.136 55497 typ host generation 0
a=candidate:2592785899 2 tcp 1509957375 172.20.31.136 55497 typ host generation 0
a=ice-ufrag:SNmuGIpNWRy31h+r
a=ice-pwd:3KiDyetIwkDrsFYvxHQIKItC
a=ice-options:google-ice
a=sendrecv
a=mid:audio
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:+TjSR/QcvYlC8hshAzzIop6ZFvZW5QrFGaQXoL6F
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=ssrc:3972141561 cname:Am89W2qvTZWO0pO3
a=ssrc:3972141561 mslabel:JeoAMKtPk6skEyKcq2ZT0YfCKrc6uarKavYi
a=ssrc:3972141561 label:JeoAMKtPk6skEyKcq2ZT0YfCKrc6uarKavYi00
m=video 60931 RTP/SAVPF 100 101 102
c=IN IP4 172.20.31.136
a=rtcp:60931 IN IP4 172.20.31.136
a=candidate:3557374235 1 udp 2113937151 172.20.31.136 60931 typ host generation 0
a=candidate:3557374235 2 udp 2113937151 172.20.31.136 60931 typ host generation 0
a=candidate:2592785899 1 tcp 1509957375 172.20.31.136 55497 typ host generation 0
a=candidate:2592785899 2 tcp 1509957375 172.20.31.136 55497 typ host generation 0
a=ice-ufrag:SNmuGIpNWRy31h+r
a=ice-pwd:3KiDyetIwkDrsFYvxHQIKItC
a=ice-options:google-ice
a=sendrecv
a=mid:video
a=rtcp-mux
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:+TjSR/QcvYlC8hshAzzIop6ZFvZW5QrFGaQXoL6F
a=rtpmap:100 VP8/90000
a=rtpmap:101 red/90000
a=rtpmap:102 ulpfec/90000
<------------->

BYE Authorization

  1. jssip does NOT resend BYE when server reply 401

  2. not a bug, but... jssip does not include Authorization in each request by default. So it send each message twice (w/o Authorization and w/ Authorization after 401 response) if server require authorization for each message.

JsSIP | TRANSPORT | Sending WebSocket message: 

BYE sip:[email protected];transport=ws SIP/2.0
Route: <sip:i251771653.invalid;lr>
Via: SIP/2.0/TCP 4.139.140.101;branch=z9hG4bK4445037
Max-Forwards: 69
To: sip:[email protected];tag=a09zy28bf0
From: sip:[email protected];tag=bpynh07jl0
Call-ID: 0bfvo8e27dnweivji3so
CSeq: 4979 BYE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.2.0
Content-Length: 0


 jssip-0.2.0.js:541
JsSIP | INVITE SESSION | Closing Invite Session 0bfvo8e27dnweivji3sobpynh07jl0 jssip-0.2.0.js:2836
JsSIP | MEDIA SESSION | Closing peerConnection jssip-0.2.0.js:3908
JsSIP | DIALOG | dialog state: 0bfvo8e27dnweivji3sobpynh07jl0a09zy28bf0 deleted jssip-0.2.0.js:2167
JsSIP | EVENT EMITTER | Emitting event: ended jssip-0.2.0.js:170
Status changed to: closed jssip-0.2.0.js:3902
ICE state is: closed jssip-0.2.0.js:3903
JsSIP | TRANSPORT | Received WebSocket message: 

SIP/2.0 401 Unauthorized
Via: SIP/2.0/TCP 4.139.140.101;branch=z9hG4bK4445037
To:  sip:[email protected];tag=a09zy28bf0
From:  sip:[email protected];tag=bpynh07jl0
Call-ID: 0bfvo8e27dnweivji3so
CSeq: 4979 BYE
x-Error-Details: No auth header
WWW-Authenticate: Digest realm="officesip.local",nonce="87ecb9522aa8577886c9a21f4973ed0f",qop="auth",algorithm=MD5,stale=false,opaque="00000015"
Content-Length: 0

problem when using webrtc2sip as a proxy

I try to change the proxy from your proxy to my webrc2sip, and it failed.
jssip works fine with kamailio and asterisk with websocket support.

I made small change in line 4949 of jssip-0.1.0.js so WS uri can be something like this ws://my.domain.com:4062. It is needed when using webrtc2sip and kamailio.

The webrtc2sip proxy works fine with sipml5.

This is error message from javascript console.

JsSIP | EVENT EMITTER | Adding event: message jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: call jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: registrationFailure jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: deregister jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: register jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: disconnect jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | Adding event: connect jssip-0.1.0.js:51
JsSIP | EVENT EMITTER | new Listener added to event: register jssip-0.1.0.js:47
JsSIP | EVENT EMITTER | new Listener added to event: deregister jssip-0.1.0.js:47
JsSIP | EVENT EMITTER | new Listener added to event: registrationFailure jssip-0.1.0.js:47
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://my.domain.com:4062 jssip-0.1.0.js:528
JsSIP | TRANSPORT | WebSocket connected: ws://my.domain.com:4062 jssip-0.1.0.js:564
JsSIP | UA | connection status set to: 0 jssip-0.1.0.js:4603
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:my.domain.com SIP/2.0
Route: sip:my.domain.com:4062;transport=ws;lr
Via: SIP/2.0/TCP f0s46bql3b0a.invalid;branch=z9hG4bK7065402
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=kgova95fec
Call-ID: 2bqe48kr848nz5mi
CSeq: 81 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:df9cc2bb-04c7-41cf-aff5-c9d48d012005";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:493
JsSIP | EVENT EMITTER | Emitting event: connect jssip-0.1.0.js:169
JsSIP | TRANSPORT | WebSocket disconnected: code=1006 jssip-0.1.0.js:581
JsSIP | TRANSPORT | ERROR: abrupt disconection jssip-0.1.0.js:584
JsSIP | UA | connection status set to: 1 jssip-0.1.0.js:4549
JsSIP | TRANSACTION | Transport Error ocurred. Deleting non invite client transaction: z9hG4bK7065402 jssip-0.1.0.js:1409
JsSIP | EVENT EMITTER | Emitting event: registrationFailure jssip-0.1.0.js:169
JsSIP | TRANSPORT | Trying to reconnect to: ws://my.domain.com:4062. Reconnection attempt number 1 jssip-0.1.0.js:678
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://my.domain.com:4062 jssip-0.1.0.js:528
JsSIP | TRANSPORT | WebSocket connected: ws://my.domain.com:4062 jssip-0.1.0.js:564
JsSIP | UA | connection status set to: 0 jssip-0.1.0.js:4603
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:my.domain.com SIP/2.0
Route: sip:my.domain.com:4062;transport=ws;lr
Via: SIP/2.0/TCP f0s46bql3b0a.invalid;branch=z9hG4bK8884138
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=rdnu23cr1p
Call-ID: 2bqe48kr848nz5mi
CSeq: 82 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:df9cc2bb-04c7-41cf-aff5-c9d48d012005";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:493
JsSIP | EVENT EMITTER | Emitting event: connect jssip-0.1.0.js:169
JsSIP | TRANSPORT | WebSocket disconnected: code=1006 jssip-0.1.0.js:581
JsSIP | TRANSPORT | ERROR: abrupt disconection jssip-0.1.0.js:584
JsSIP | UA | connection status set to: 1 jssip-0.1.0.js:4549
JsSIP | TRANSACTION | Transport Error ocurred. Deleting non invite client transaction: z9hG4bK8884138 jssip-0.1.0.js:1409
JsSIP | EVENT EMITTER | Emitting event: registrationFailure jssip-0.1.0.js:169
JsSIP | TRANSPORT | Trying to reconnect to: ws://my.domain.com:4062. Reconnection attempt number 1 jssip-0.1.0.js:678
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://my.domain.com:4062 jssip-0.1.0.js:528
JsSIP | TRANSPORT | WebSocket connected: ws://my.domain.com:4062 jssip-0.1.0.js:564
JsSIP | UA | connection status set to: 0 jssip-0.1.0.js:4603
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:my.domain.com SIP/2.0
Route: sip:my.domain.com:4062;transport=ws;lr
Via: SIP/2.0/TCP f0s46bql3b0a.invalid;branch=z9hG4bK7110621
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=v5tlabcy0y
Call-ID: 2bqe48kr848nz5mi
CSeq: 83 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:df9cc2bb-04c7-41cf-aff5-c9d48d012005";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:493
JsSIP | EVENT EMITTER | Emitting event: connect jssip-0.1.0.js:169
JsSIP | TRANSPORT | WebSocket disconnected: code=1006 jssip-0.1.0.js:581
JsSIP | TRANSPORT | ERROR: abrupt disconection jssip-0.1.0.js:584
JsSIP | UA | connection status set to: 1 jssip-0.1.0.js:4549
JsSIP | TRANSACTION | Transport Error ocurred. Deleting non invite client transaction: z9hG4bK7110621 jssip-0.1.0.js:1409
JsSIP | EVENT EMITTER | Emitting event: registrationFailure jssip-0.1.0.js:169
JsSIP | TRANSPORT | Trying to reconnect to: ws://my.domain.com:4062. Reconnection attempt number 1 jssip-0.1.0.js:678
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://my.domain.com:4062 jssip-0.1.0.js:528
JsSIP | TRANSPORT | WebSocket connected: ws://my.domain.com:4062 jssip-0.1.0.js:564
JsSIP | UA | connection status set to: 0 jssip-0.1.0.js:4603
JsSIP | TRANSPORT | Sending WebSocket message:

REGISTER sip:my.domain.com SIP/2.0
Route: sip:my.domain.com:4062;transport=ws;lr
Via: SIP/2.0/TCP f0s46bql3b0a.invalid;branch=z9hG4bK9329872
Max-Forwards: 69
To: sip:[email protected]
From: sip:[email protected];tag=8hm7v8wpes
Call-ID: 2bqe48kr848nz5mi
CSeq: 84 REGISTER
Contact: sip:[email protected];transport=ws;reg-id=1;+sip.instance="urn:uuid:df9cc2bb-04c7-41cf-aff5-c9d48d012005";expires=120
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, MESSAGE, SUBSCRIBE
Supported: path, outbound, gruu
User-Agent: JsSIP 0.1.0

jssip-0.1.0.js:493
JsSIP | EVENT EMITTER | Emitting event: connect jssip-0.1.0.js:169
JsSIP | TRANSPORT | WebSocket disconnected: code=1006 jssip-0.1.0.js:581
JsSIP | TRANSPORT | ERROR: abrupt disconection jssip-0.1.0.js:584
JsSIP | UA | connection status set to: 1 jssip-0.1.0.js:4549
JsSIP | TRANSACTION | Transport Error ocurred. Deleting non invite client transaction: z9hG4bK9329872 jssip-0.1.0.js:1409
JsSIP | EVENT EMITTER | Emitting event: registrationFailure jssip-0.1.0.js:169
JsSIP | TRANSPORT | Trying to reconnect to: ws://my.domain.com:4062. Reconnection attempt number 1 jssip-0.1.0.js:678
JsSIP | TRANSPORT | Connecting to WebSocket URI ws://my.domain.com:4062 jssip-0.1.0.js:528
JsSIP | TRANSPORT | WebSocket connected: ws://my.domain.com:4062 jssip-0.1.0.js:564
JsSIP | UA | connection status set to: 0 jssip-0.1.0.js:4603
JsSIP | TRANSPORT | Sending WebSocket message:

WebSocket field in Demo registration doesn't override the default

I tried out your demo and noticed that when I put in my ws:// url into your textbox, the system still tried to connect to YOUR WebSocket server.

In the console log, in the Network tab in Chrome, you can see the ws url to tryit.jssip.net:10080

I had to go into /demos/tryit/js/init.js on line 7 and hard-code my own WS url in place of yours.

Make the 'instance_id' UA configuration parameter public

Be able to set a custom URN for the +sip.instance header param of the REGISTER. Currently a random value like "urn:uuid:9374a213-94d6-40b3-8016-81a87e585e5b" is generated. JsSIP must allow using a provided value.

urn:  "uuid:123-123-123-123"

So the param would become:

+sip.instance="<urn:uuid:123-123-123-123>"

Reorganize grammar/

Right now this directory includes 2 files: the generated grammar file and its minified form. We should only keep the minified form here and add a src/ subdirectory with the actual source used to generate the grammar.

Also, since it includes grammar from other RFCs, the resulting file should be named grammar.js, which is always minified.

Unit Testing

JsSIP is a fairly complex project, using unit testing would make it easier to change and evolve the project. There are quite a few node.js unit testing frameworks.

NodeUnite seems nice: https://github.com/caolan/nodeunit

Add TURN support

Add turn server, user, and password configuration parameters for RTCPeerConnection

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.