write function
Implementation
String write(Map<String, dynamic> session, Map<String, dynamic>? opts) {
opts = opts ?? {'outerOrder': null, 'innerOrder': null};
// ensure certain properties exist
if (session['version'] == null) {
session['version'] = 0; // 'v=0' must be there (only defined version atm)
}
if (session['name'] == null) {
session['name'] = ' '; // 's= ' must be there if no meaningful name set
}
session['media'].forEach((mLine) {
if (mLine['payloads'] == null) {
mLine['payloads'] = '';
}
});
var outerOrder = opts['souterOrder'] ?? defaultOuterOrder;
var innerOrder = opts['innerOrder'] ?? defaultInnerOrder;
var sdp = [];
// loop through outerOrder for matching properties on session
outerOrder.forEach((type) {
grammar[type]!.forEach((obj) {
if (obj['name'] != null && session[obj['name']] != null) {
sdp.add(makeLine(type, obj, session));
} else if (obj['push'] != null && session[obj['push']] != null) {
session[obj['push']].forEach((el) {
sdp.add(makeLine(type, obj, el));
});
}
});
});
// then for each media line, follow the innerOrder
session['media'].forEach((mLine) {
sdp.add(makeLine('m', grammar['m']![0], mLine));
innerOrder.forEach((type) {
grammar[type]!.forEach((obj) {
if (obj['name'] != null && mLine[obj['name']] != null) {
sdp.add(makeLine(type, obj, mLine));
} else if (obj['push'] != null && mLine[obj['push']] != null) {
mLine[obj['push']].forEach((el) {
sdp.add(makeLine(type, obj, el));
});
}
});
});
});
return sdp.join('\r\n') + '\r\n';
}