diff --git a/.gitignore b/.gitignore index faeae3a..82c57bf 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build/app.dill .dart_tool/pub/bin/test/test.dart.snapshot.dart2 .packages pubspec.lock +.dart_tool diff --git a/lib/src/grammar.dart b/lib/src/grammar.dart index 73efaad..86cabe9 100644 --- a/lib/src/grammar.dart +++ b/lib/src/grammar.dart @@ -1,6 +1,6 @@ import 'dart:core'; -var grammar = { +var grammar = { 'v': [ {'name': 'version', 'reg': r'^\d$'} ], @@ -90,8 +90,10 @@ var grammar = { 'format': (o) { return (o['encoding'] != null) ? 'rtpmap:%d %s/%s/%s' - : (o['rate'] != null) ? 'rtpmap:%d %s/%s' : 'rtpmap:%d %s'; - } + : (o['rate'] != null) + ? 'rtpmap:%d %s/%s' + : 'rtpmap:%d %s' ; + }as dynamic }, { // a=fmtp:108 profile-level-id=24;object=23;bitrate=64000 @@ -114,7 +116,7 @@ var grammar = { 'names': ['port', 'netType', 'ipVer', 'address'], 'format': (o) { return (o['address'] != null) ? 'rtcp:%d %s IP%d %s' : 'rtcp:%d'; - } + } as dynamic }, { // a=rtcp-fb:98 trr-int 100 @@ -130,7 +132,7 @@ var grammar = { 'names': ['payload', 'type', 'subtype'], 'format': (o) { return (o['subtype'] != null) ? 'rtcp-fb:%s %s %s' : 'rtcp-fb:%s %s'; - } + }as dynamic }, { // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset @@ -143,7 +145,7 @@ var grammar = { (o['direction'] != null ? '/%s' : '%v') + ' %s' + (o['config'] != null ? ' %s' : ''); - } + }as dynamic }, { // a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:32 @@ -154,7 +156,7 @@ var grammar = { return (o['sessionConfig'] != null) ? 'crypto:%d %s %s %s' : 'crypto:%d %s %s'; - } + }as dynamic }, { // a=setup:actpass @@ -254,7 +256,7 @@ var grammar = { str += (o['network-id'] != null) ? ' network-id %d' : '%v'; str += (o['network-cost'] != null) ? ' network-cost %d' : '%v'; return str; - } + }as dynamic }, { // a=end-of-candidates (keep after the candidates line for readability) @@ -286,8 +288,8 @@ var grammar = { str += ':%s'; } } - return str; - } + return str ; + } as dynamic }, { // a=ssrc-group:FEC 1 2 @@ -332,7 +334,7 @@ var grammar = { return (o['maxMessageSize'] != null) ? 'sctpmap:%s %s %s' : 'sctpmap:%s %s'; - } + }as dynamic }, { // a=x-google-flag:conference @@ -347,7 +349,7 @@ var grammar = { 'names': ['id', 'direction', 'params'], 'format': (o) { return (o['params'] != null) ? 'rid:%s %s %s' : 'rid:%s %s'; - } + }as dynamic }, { // a=imageattr:97 send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250] @@ -364,7 +366,7 @@ var grammar = { 'names': ['pt', 'dir1', 'attrs1', 'dir2', 'attrs2'], 'format': (o) { return 'imageattr:%s %s %s' + (o['dir2'] != null ? ' %s %s' : ''); - } + }as dynamic }, { // a=simulcast:send 1,2,3;~4,~5 recv 6;~7,~8 @@ -382,7 +384,7 @@ var grammar = { 'names': ['dir1', 'list1', 'dir2', 'list2'], 'format': (o) { return 'simulcast:%s %s' + (o['dir2'] != null ? ' %s %s' : ''); - } + }as dynamic }, { // old simulcast draft 03 (implemented by Firefox) diff --git a/lib/src/parser.dart b/lib/src/parser.dart index 447d3e2..1e3b3c1 100644 --- a/lib/src/parser.dart +++ b/lib/src/parser.dart @@ -1,8 +1,15 @@ import './grammar.dart' show grammar; import 'dart:convert'; -dynamic toIntIfInt(v) { - return v != null ? int.tryParse(v) != null ? int.parse(v) : v : null; +/// Tries to parse a String as an int. +/// If the [value] isn't an int then [value] is returned. +/// If [value] is a null then null is returned. +dynamic toIntIfInt(String? value) { + return value != null + ? int.tryParse(value) != null + ? int.parse(value) + : value + : null; } void attachProperties(Iterable match, @@ -75,11 +82,11 @@ Map parse(String sdp) { medias.add(media); } if (grammar[type] != null) { - for (var j = 0; j < grammar[type].length; j += 1) { - var obj = grammar[type][j]; + for (var j = 0; j < grammar[type]!.length; j += 1) { + var obj = grammar[type]![j]; if (obj['reg'] == null) { if (obj['name'] != null) { - location[obj['name']] = content; + location[obj['name']! as String] = content; } else { print("trying to add null key"); } @@ -91,13 +98,13 @@ Map parse(String sdp) { parseReg(obj, location, content); return; } - } else if (RegExp(obj['reg']).hasMatch(content)) { + } else if (RegExp(obj['reg']! as String).hasMatch(content)) { parseReg(obj, location, content); return; } } if (location['invalid'] == null) { - location['invalid'] = List(); + location['invalid'] = >[]; } Map tmp = createMap(); tmp['value'] = content; @@ -125,7 +132,7 @@ Map parseParams(String str) { value = line.substring(idx + 1, line.length).trim(); } - assert(key != null); + // assert(key != null); params[key] = toIntIfInt(value); }); return params; @@ -135,10 +142,11 @@ List parsePayloads(str) { return str.split(' '); } -List parseRemoteCandidates(String str) { +/// Returns a list that can contain ints, Strings. +List parseRemoteCandidates(String str) { var candidates = []; - List parts = List(); - str.split(' ').forEach((dynamic v) { + List parts = []; + str.split(' ').forEach((String v) { dynamic value = toIntIfInt(v); if (value != null) { parts.add(value); @@ -152,12 +160,12 @@ List parseRemoteCandidates(String str) { } List> parseImageAttributes(String str) { - List> attributes = List(); + var attributes = >[]; str.split(' ').forEach((item) { Map params = createMap(); item.substring(1, item.length - 1).split(',').forEach((attr) { List kv = attr.split(new RegExp(r'=').pattern); - assert(kv[0] != null); + assert(kv.length >= 2); params[kv[0]] = toIntIfInt(kv[1]); }); attributes.add(params); @@ -170,9 +178,9 @@ Map createMap() { } List parseSimulcastStreamList(String str) { - List attributes = List(); + List attributes = []; str.split(';').forEach((stream) { - List scids = List(); + List scids = []; stream.split(',').forEach((format) { var scid, paused = false; if (format[0] != '~') { diff --git a/lib/src/writer.dart b/lib/src/writer.dart index 4b2e39e..e8d0008 100644 --- a/lib/src/writer.dart +++ b/lib/src/writer.dart @@ -63,7 +63,7 @@ var defaultOuterOrder = [ var defaultInnerOrder = ['i', 'c', 'b', 'a']; -String write(Map session, Map opts) { +String write(Map session, Map? opts) { opts = opts ?? {'outerOrder': null, 'innerOrder': null}; // ensure certain properties exist @@ -86,7 +86,7 @@ String write(Map session, Map opts) { // loop through outerOrder for matching properties on session outerOrder.forEach((type) { - grammar[type].forEach((obj) { + 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) { @@ -99,9 +99,9 @@ String write(Map session, Map opts) { // then for each media line, follow the innerOrder session['media'].forEach((mLine) { - sdp.add(makeLine('m', grammar['m'][0], mLine)); + sdp.add(makeLine('m', grammar['m']![0], mLine)); innerOrder.forEach((type) { - grammar[type].forEach((obj) { + 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) { diff --git a/pubspec.yaml b/pubspec.yaml index 972ee53..e35d8c4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,13 +1,14 @@ name: sdp_transform -version: 0.2.0 +version: 0.3.0 authors: - cloudwebrtc - rlsutton1 +- bsutton - https://github.com/clux/sdp-transform description: Dart implementation of sdp-transform homepage: https://github.com/cloudwebrtc/dart-sdp-transform environment: - sdk: '<3.0.0' + sdk: '>=2.12.0 <3.0.0' dev_dependencies: - test: ^1.9.3 \ No newline at end of file + test: ^1.16.8 \ No newline at end of file diff --git a/test/regexp_test.dart b/test/regexp_test.dart index fb697c2..f49ebdb 100644 --- a/test/regexp_test.dart +++ b/test/regexp_test.dart @@ -13,7 +13,7 @@ basictest() { String str = "Parse my string"; Iterable matches = exp.allMatches(str); matches.forEach((m) { - String match = m.group(0); + String match = m.group(0)!; print('value = ' + match); }); } @@ -23,9 +23,9 @@ basictest2() { String str = "o=- 20518 0 IN IP4 203.0.113.1"; Iterable matches = exp.allMatches(str); matches.forEach((m) { - print('group(0) = ' + m.group(0)); + print('group(0) = ' + m.group(0)!); for (var i = 0; i < m.groupCount; i++) - print('group(' + (1 + i).toString() + ') = ' + m.group(i + 1)); + print('group(' + (1 + i).toString() + ') = ' + m.group(i + 1)!); }); } @@ -51,7 +51,7 @@ basictest3() { ]; Iterable matches = exp.allMatches(str); matches.forEach((m) { - print('group(0) = ' + m.group(0)); + print('group(0) = ' + m.group(0)!); for (var i = 0; i < m.groupCount; i++) if (m.group(i + 1) != null) print('group(' + @@ -59,7 +59,7 @@ basictest3() { ') ' + names[i] + ' = ' + - m.group(i + 1)); + m.group(i + 1)!); }); } @@ -85,7 +85,7 @@ basictest4() { Iterable matches = exp.allMatches(str); matches.forEach((m) { print('group(0) = ' + - m.group(0) + + m.group(0)! + ", groupCount = " + m.groupCount.toString()); for (var i = 0; i < m.groupCount; i++) @@ -95,6 +95,6 @@ basictest4() { ') ' + names[i] + ' = ' + - m.group(i + 1)); + m.group(i + 1)!); }); } diff --git a/test/sdp_parse_test.dart b/test/sdp_parse_test.dart index 6a1d575..168cb56 100644 --- a/test/sdp_parse_test.dart +++ b/test/sdp_parse_test.dart @@ -41,14 +41,14 @@ deepEqual(dynamic value, dynamic match, String message) {} _testAsterisk() async { String sdp = - await new File('./tests/sdp_test_data/asterisk.sdp').readAsString(); + await new File('./test/sdp_test_data/asterisk.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); } _testNormalSdp() async { String sdp = - await new File('./tests/sdp_test_data/normal.sdp').readAsString(); + await new File('./test/sdp_test_data/normal.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -205,7 +205,7 @@ _testNormalSdp() async { * ignore the name */ _testHackySdp() async { - String sdp = await new File('./tests/sdp_test_data/hacky.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/hacky.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -323,7 +323,7 @@ _testHackySdp() async { _testIceliteSdp() async { String sdp = - await new File('./tests/sdp_test_data/icelite.sdp').readAsString(); + await new File('./test/sdp_test_data/icelite.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -336,7 +336,7 @@ _testIceliteSdp() async { _testInvalidSdp() async { String sdp = - await new File('./tests/sdp_test_data/invalid.sdp').readAsString(); + await new File('./test/sdp_test_data/invalid.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -354,7 +354,7 @@ _testInvalidSdp() async { } _testJssipSdp() async { - String sdp = await new File('./tests/sdp_test_data/jssip.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/jssip.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -410,7 +410,7 @@ _testJssipSdp() async { } _testJsepSdp() async { - String sdp = await new File('./tests/sdp_test_data/jsep.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/jsep.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -441,7 +441,7 @@ _testJsepSdp() async { } _testAlacSdp() async { - String sdp = await new File('./tests/sdp_test_data/alac.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/alac.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -461,7 +461,7 @@ _testAlacSdp() async { } testOnvifSdp() async { - String sdp = await new File('./tests/sdp_test_data/onvif.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/onvif.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -500,7 +500,7 @@ testOnvifSdp() async { } _testSsrcSdp() async { - String sdp = await new File('./tests/sdp_test_data/ssrc.sdp').readAsString(); + String sdp = await new File('./test/sdp_test_data/ssrc.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -519,7 +519,7 @@ _testSsrcSdp() async { _testSimulcastSdp() async { String sdp = - await new File('./tests/sdp_test_data/simulcast.sdp').readAsString(); + await new File('./test/sdp_test_data/simulcast.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -716,7 +716,7 @@ _testSimulcastSdp() async { _testSt2202_6Sdp() async { String sdp = - await new File('./tests/sdp_test_data/st2022-6.sdp').readAsString(); + await new File('./test/sdp_test_data/st2022-6.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -736,7 +736,7 @@ _testSt2202_6Sdp() async { _testSt2110_20Sdp() async { String sdp = - await new File('./tests/sdp_test_data/st2110-20.sdp').readAsString(); + await new File('./test/sdp_test_data/st2110-20.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -774,7 +774,7 @@ _testSt2110_20Sdp() async { _testSctpDtls26Sdp() async { String sdp = - await new File('./tests/sdp_test_data/sctp-dtls-26.sdp').readAsString(); + await new File('./test/sdp_test_data/sctp-dtls-26.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -806,7 +806,7 @@ _testSctpDtls26Sdp() async { _testExtmapEncryptSdp() async { String sdp = - await new File('./tests/sdp_test_data/extmap-encrypt.sdp').readAsString(); + await new File('./test/sdp_test_data/extmap-encrypt.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -864,7 +864,7 @@ _testExtmapEncryptSdp() async { _testDanteAes67() async { String sdp = - await new File('./tests/sdp_test_data/dante-aes67.sdp').readAsString(); + await new File('./test/sdp_test_data/dante-aes67.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -900,7 +900,7 @@ _testDanteAes67() async { _testTcpActive() async { String sdp = - await new File('./tests/sdp_test_data/tcp-active.sdp').readAsString(); + await new File('./test/sdp_test_data/tcp-active.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info'); @@ -927,7 +927,7 @@ _testTcpActive() async { _testTcpPassive() async { String sdp = - await new File('./tests/sdp_test_data/tcp-passive.sdp').readAsString(); + await new File('./test/sdp_test_data/tcp-passive.sdp').readAsString(); Map session = parse(sdp + ''); ok(session, 'got session info');