Skip to content

Commit f0cc4c1

Browse files
committed
- RTCSession: instead of "started" emit "accepted" when 2XX and "confirmed" when ACK (fixes #253).
- RTCSession: accept SDP renegotiation on incoming UPDATE requests.
1 parent 65805c6 commit f0cc4c1

File tree

1 file changed

+137
-58
lines changed

1 file changed

+137
-58
lines changed

src/RTCSession.js

Lines changed: 137 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11721179
RTCSession.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+
17421821
RTCSession.prototype.ended = function(originator, message, cause) {
17431822
var session = this,
17441823
event_name = 'ended';

0 commit comments

Comments
 (0)