write function

String write(
  1. Map<String, dynamic> session,
  2. Map<String, dynamic>? opts
)

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';
}