Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ build/app.dill
.dart_tool/pub/bin/test/test.dart.snapshot.dart2
.packages
pubspec.lock
.dart_tool
30 changes: 16 additions & 14 deletions lib/src/grammar.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'dart:core';

var grammar = {
var grammar = <String, dynamic>{
'v': [
{'name': 'version', 'reg': r'^\d$'}
],
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -154,7 +156,7 @@ var grammar = {
return (o['sessionConfig'] != null)
? 'crypto:%d %s %s %s'
: 'crypto:%d %s %s';
}
}as dynamic
},
{
// a=setup:actpass
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -286,8 +288,8 @@ var grammar = {
str += ':%s';
}
}
return str;
}
return str ;
} as dynamic
},
{
// a=ssrc-group:FEC 1 2
Expand Down Expand Up @@ -332,7 +334,7 @@ var grammar = {
return (o['maxMessageSize'] != null)
? 'sctpmap:%s %s %s'
: 'sctpmap:%s %s';
}
}as dynamic
},
{
// a=x-google-flag:conference
Expand All @@ -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]
Expand All @@ -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
Expand All @@ -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)
Expand Down
38 changes: 23 additions & 15 deletions lib/src/parser.dart
Original file line number Diff line number Diff line change
@@ -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<RegExpMatch> match,
Expand Down Expand Up @@ -75,11 +82,11 @@ Map<String, dynamic> 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");
}
Expand All @@ -91,13 +98,13 @@ Map<String, dynamic> 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<String, dynamic>>[];
}
Map tmp = createMap();
tmp['value'] = content;
Expand Down Expand Up @@ -125,7 +132,7 @@ Map<dynamic, dynamic> parseParams(String str) {
value = line.substring(idx + 1, line.length).trim();
}

assert(key != null);
// assert(key != null);
params[key] = toIntIfInt(value);
});
return params;
Expand All @@ -135,10 +142,11 @@ List<String> parsePayloads(str) {
return str.split(' ');
}

List<String> parseRemoteCandidates(String str) {
/// Returns a list that can contain ints, Strings.
List<dynamic> parseRemoteCandidates(String str) {
var candidates = [];
List<String> parts = List();
str.split(' ').forEach((dynamic v) {
List<dynamic> parts = <dynamic>[];
str.split(' ').forEach((String v) {
dynamic value = toIntIfInt(v);
if (value != null) {
parts.add(value);
Expand All @@ -152,12 +160,12 @@ List<String> parseRemoteCandidates(String str) {
}

List<Map<String, dynamic>> parseImageAttributes(String str) {
List<Map<String, dynamic>> attributes = List();
var attributes = <Map<String, dynamic>>[];
str.split(' ').forEach((item) {
Map<String, dynamic> params = createMap();
item.substring(1, item.length - 1).split(',').forEach((attr) {
List<String> kv = attr.split(new RegExp(r'=').pattern);
assert(kv[0] != null);
assert(kv.length >= 2);
params[kv[0]] = toIntIfInt(kv[1]);
});
attributes.add(params);
Expand All @@ -170,9 +178,9 @@ Map<String, dynamic> createMap() {
}

List<dynamic> parseSimulcastStreamList(String str) {
List<dynamic> attributes = List();
List<dynamic> attributes = <dynamic>[];
str.split(';').forEach((stream) {
List scids = List();
List scids = <dynamic>[];
stream.split(',').forEach((format) {
var scid, paused = false;
if (format[0] != '~') {
Expand Down
8 changes: 4 additions & 4 deletions lib/src/writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ var defaultOuterOrder = [

var defaultInnerOrder = ['i', 'c', 'b', 'a'];

String write(Map<String, dynamic> session, Map<String, dynamic> opts) {
String write(Map<String, dynamic> session, Map<String, dynamic>? opts) {
opts = opts ?? {'outerOrder': null, 'innerOrder': null};

// ensure certain properties exist
Expand All @@ -86,7 +86,7 @@ String write(Map<String, dynamic> session, Map<String, dynamic> 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) {
Expand All @@ -99,9 +99,9 @@ String write(Map<String, dynamic> session, Map<String, dynamic> 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) {
Expand Down
7 changes: 4 additions & 3 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
name: sdp_transform
version: 0.2.0
version: 0.3.0
authors:
- cloudwebrtc <[email protected]>
- rlsutton1 <[email protected]>
- bsutton <[email protected]>
- 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
test: ^1.16.8
14 changes: 7 additions & 7 deletions test/regexp_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ basictest() {
String str = "Parse my string";
Iterable<Match> matches = exp.allMatches(str);
matches.forEach((m) {
String match = m.group(0);
String match = m.group(0)!;
print('value = ' + match);
});
}
Expand All @@ -23,9 +23,9 @@ basictest2() {
String str = "o=- 20518 0 IN IP4 203.0.113.1";
Iterable<Match> 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)!);
});
}

Expand All @@ -51,15 +51,15 @@ basictest3() {
];
Iterable<Match> 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(' +
(1 + i).toString() +
') ' +
names[i] +
' = ' +
m.group(i + 1));
m.group(i + 1)!);
});
}

Expand All @@ -85,7 +85,7 @@ basictest4() {
Iterable<Match> 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++)
Expand All @@ -95,6 +95,6 @@ basictest4() {
') ' +
names[i] +
' = ' +
m.group(i + 1));
m.group(i + 1)!);
});
}
Loading