@@ -22,7 +22,8 @@ RTCSession = function(ua) {
2222 'connecting' ,
2323 'progress' ,
2424 'failed' ,
25- 'started' ,
25+ 'accepted' ,
26+ 'confirmed' ,
2627 'ended' ,
2728 'newDTMF' ,
2829 'hold' ,
@@ -310,7 +311,7 @@ RTCSession.prototype.answer = function(options) {
310311
311312 self . setInvite2xxTimer ( request , body ) ;
312313 self . setACKTimer ( ) ;
313- self . started ( 'local' ) ;
314+ self . accepted ( 'local' ) ;
314315 } ,
315316
316317 // run for reply failure callback
@@ -1107,72 +1108,136 @@ RTCSession.prototype.receiveReinvite = function(request) {
11071108 contentType = request . getHeader ( 'Content-Type' ) ,
11081109 hold = true ;
11091110
1110- if ( request . body ) {
1111- if ( contentType !== 'application/sdp' ) {
1112- this . logger . warn ( 'invalid Content-Type' ) ;
1113- request . reply ( 415 ) ;
1114- return ;
1115- }
1111+ if ( ! request . body ) {
1112+ this . logger . warn ( 're-INVITE without body not implemented' ) ;
1113+ request . reply ( 415 , 're-INVITE Without Body Not Implemented' ) ;
1114+ return ;
1115+ }
11161116
1117- sdp = JsSIP . Parser . parseSDP ( request . body ) ;
1117+ if ( contentType !== 'application/sdp' ) {
1118+ this . logger . warn ( 'invalid Content-Type' ) ;
1119+ request . reply ( 415 ) ;
1120+ return ;
1121+ }
11181122
1119- for ( idx = 0 ; idx < sdp . media . length ; idx ++ ) {
1120- direction = sdp . direction || sdp . media [ idx ] . direction || 'sendrecv' ;
1123+ sdp = JsSIP . Parser . parseSDP ( request . body ) ;
11211124
1122- if ( direction !== 'sendonly' && direction !== 'inactive' ) {
1123- hold = false ;
1124- }
1125+ for ( idx = 0 ; idx < sdp . media . length ; idx ++ ) {
1126+ direction = sdp . direction || sdp . media [ idx ] . direction || 'sendrecv' ;
1127+
1128+ if ( direction !== 'sendonly' && direction !== 'inactive' ) {
1129+ hold = false ;
11251130 }
1131+ }
11261132
1127- this . rtcMediaHandler . onMessage (
1128- 'offer' ,
1129- request . body ,
1130- /*
1131- * onSuccess
1132- * SDP Offer is valid
1133- */
1134- function ( ) {
1135- self . rtcMediaHandler . createAnswer (
1136- function ( body ) {
1137- request . reply ( 200 , null , [ 'Contact: ' + self . contact ] , body ,
1138- function ( ) {
1139- self . status = C . STATUS_WAITING_FOR_ACK ;
1140- self . setInvite2xxTimer ( request , body ) ;
1141- self . setACKTimer ( ) ;
1142-
1143- if ( self . remote_hold === true && hold === false ) {
1144- self . onunhold ( 'remote' ) ;
1145- } else if ( self . remote_hold === false && hold === true ) {
1146- self . onhold ( 'remote' ) ;
1147- }
1133+ this . rtcMediaHandler . onMessage (
1134+ 'offer' ,
1135+ request . body ,
1136+ /*
1137+ * onSuccess
1138+ * SDP Offer is valid
1139+ */
1140+ function ( ) {
1141+ self . rtcMediaHandler . createAnswer (
1142+ // onSuccess
1143+ function ( body ) {
1144+ request . reply ( 200 , null , [ 'Contact: ' + self . contact ] , body ,
1145+ function ( ) {
1146+ self . status = C . STATUS_WAITING_FOR_ACK ;
1147+ self . setInvite2xxTimer ( request , body ) ;
1148+ self . setACKTimer ( ) ;
1149+
1150+ if ( self . remote_hold === true && hold === false ) {
1151+ self . onunhold ( 'remote' ) ;
1152+ } else if ( self . remote_hold === false && hold === true ) {
1153+ self . onhold ( 'remote' ) ;
11481154 }
1149- ) ;
1150- } ,
1151- function ( ) {
1152- request . reply ( 500 ) ;
1153- }
1154- ) ;
1155- } ,
1156- /*
1157- * onFailure
1158- * Bad media description
1159- */
1160- function ( e ) {
1161- self . logger . error ( e ) ;
1162- request . reply ( 488 ) ;
1163- }
1164- ) ;
1165- }
1155+ }
1156+ ) ;
1157+ } ,
1158+ // onFailure
1159+ function ( ) {
1160+ request . reply ( 500 ) ;
1161+ }
1162+ ) ;
1163+ } ,
1164+ /*
1165+ * onFailure
1166+ * Bad media description
1167+ */
1168+ function ( e ) {
1169+ self . logger . error ( e ) ;
1170+ request . reply ( 488 ) ;
1171+ }
1172+ ) ;
11661173} ;
11671174
11681175/**
11691176 * In dialog UPDATE Reception
11701177 */
11711178
11721179RTCSession . prototype . receiveUpdate = function ( request ) {
1173- // TODO:
1180+ var
1181+ sdp , idx , direction ,
1182+ // self = this,
1183+ contentType = request . getHeader ( 'Content-Type' ) ,
1184+ hold = true ;
11741185
1175- request . reply ( 501 , "TODO" ) ;
1186+ if ( ! request . body ) {
1187+ request . reply ( 200 ) ;
1188+ return ;
1189+ }
1190+
1191+ if ( contentType !== 'application/sdp' ) {
1192+ this . logger . warn ( 'invalid Content-Type' ) ;
1193+ request . reply ( 415 ) ;
1194+ return ;
1195+ }
1196+
1197+ sdp = JsSIP . Parser . parseSDP ( request . body ) ;
1198+
1199+ for ( idx = 0 ; idx < sdp . media . length ; idx ++ ) {
1200+ direction = sdp . direction || sdp . media [ idx ] . direction || 'sendrecv' ;
1201+
1202+ if ( direction !== 'sendonly' && direction !== 'inactive' ) {
1203+ hold = false ;
1204+ }
1205+ }
1206+
1207+ this . rtcMediaHandler . onMessage (
1208+ 'offer' ,
1209+ request . body ,
1210+ /*
1211+ * onSuccess
1212+ * SDP Offer is valid
1213+ */
1214+ function ( ) {
1215+ self . rtcMediaHandler . createAnswer (
1216+ function ( body ) {
1217+ request . reply ( 200 , null , [ 'Contact: ' + self . contact ] , body ,
1218+ function ( ) {
1219+ if ( self . remote_hold === true && hold === false ) {
1220+ self . onunhold ( 'remote' ) ;
1221+ } else if ( self . remote_hold === false && hold === true ) {
1222+ self . onhold ( 'remote' ) ;
1223+ }
1224+ }
1225+ ) ;
1226+ } ,
1227+ function ( ) {
1228+ request . reply ( 500 ) ;
1229+ }
1230+ ) ;
1231+ } ,
1232+ /*
1233+ * onFailure
1234+ * Bad media description
1235+ */
1236+ function ( e ) {
1237+ self . logger . error ( e ) ;
1238+ request . reply ( 488 ) ;
1239+ }
1240+ ) ;
11761241} ;
11771242
11781243/**
@@ -1206,6 +1271,7 @@ RTCSession.prototype.receiveRequest = function(request) {
12061271 window . clearTimeout ( this . timers . ackTimer ) ;
12071272 window . clearTimeout ( this . timers . invite2xxTimer ) ;
12081273 this . status = C . STATUS_CONFIRMED ;
1274+ this . confirmed ( 'remote' , request ) ;
12091275 }
12101276 break ;
12111277 case JsSIP . C . BYE :
@@ -1531,8 +1597,11 @@ RTCSession.prototype.receiveInviteResponse = function(response) {
15311597 * SDP Answer fits with Offer. Media will start
15321598 */
15331599 function ( ) {
1534- session . sendRequest ( JsSIP . C . ACK ) ;
1535- session . started ( 'remote' , response ) ;
1600+ var ack ;
1601+
1602+ session . accepted ( 'remote' , response ) ;
1603+ ack = session . sendRequest ( JsSIP . C . ACK ) ;
1604+ session . confirmed ( 'local' , null ) ;
15361605 } ,
15371606 /*
15381607 * onFailure
@@ -1727,9 +1796,9 @@ RTCSession.prototype.progress = function(originator, response) {
17271796 } ) ;
17281797} ;
17291798
1730- RTCSession . prototype . started = function ( originator , message ) {
1799+ RTCSession . prototype . accepted = function ( originator , message ) {
17311800 var session = this ,
1732- event_name = 'started ' ;
1801+ event_name = 'accepted ' ;
17331802
17341803 session . start_time = new Date ( ) ;
17351804
@@ -1739,6 +1808,16 @@ RTCSession.prototype.started = function(originator, message) {
17391808 } ) ;
17401809} ;
17411810
1811+ RTCSession . prototype . confirmed = function ( originator , ack ) {
1812+ var session = this ,
1813+ event_name = 'confirmed' ;
1814+
1815+ session . emit ( event_name , session , {
1816+ originator : originator ,
1817+ ack : ack || null
1818+ } ) ;
1819+ } ;
1820+
17421821RTCSession . prototype . ended = function ( originator , message , cause ) {
17431822 var session = this ,
17441823 event_name = 'ended' ;
0 commit comments