@tomgiee/tsdp 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -39
- package/dist/src/builder/media-builder.d.ts.map +1 -1
- package/dist/src/builder/media-builder.js +5 -12
- package/dist/src/builder/session-builder.d.ts.map +1 -1
- package/dist/src/builder/session-builder.js +4 -14
- package/dist/src/index.d.ts +6 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +37 -49
- package/dist/src/parser/core.d.ts +366 -0
- package/dist/src/parser/core.d.ts.map +1 -0
- package/dist/src/parser/core.js +802 -0
- package/dist/src/parser/field-parser.d.ts +51 -8
- package/dist/src/parser/field-parser.d.ts.map +1 -1
- package/dist/src/parser/field-parser.js +91 -23
- package/dist/src/parser/media-parser.d.ts +1 -1
- package/dist/src/parser/media-parser.d.ts.map +1 -1
- package/dist/src/parser/media-parser.js +9 -15
- package/dist/src/parser/session-parser.d.ts.map +1 -1
- package/dist/src/parser/session-parser.js +16 -17
- package/dist/src/parser/time-parser.d.ts +1 -1
- package/dist/src/parser/time-parser.d.ts.map +1 -1
- package/dist/src/parser/time-parser.js +8 -8
- package/dist/src/serializer/fields.d.ts +167 -0
- package/dist/src/serializer/fields.d.ts.map +1 -0
- package/dist/src/serializer/fields.js +320 -0
- package/dist/src/serializer/media-serializer.js +6 -7
- package/dist/src/serializer/session-serializer.js +13 -15
- package/dist/src/types/attributes.d.ts.map +1 -1
- package/dist/src/types/fields.d.ts +5 -5
- package/dist/src/types/fields.d.ts.map +1 -1
- package/dist/src/types/fields.js +4 -4
- package/dist/src/types/media.d.ts +9 -10
- package/dist/src/types/media.d.ts.map +1 -1
- package/dist/src/types/media.js +2 -4
- package/dist/src/types/network.d.ts +15 -56
- package/dist/src/types/network.d.ts.map +1 -1
- package/dist/src/types/network.js +3 -34
- package/dist/src/types/primitives.d.ts +3 -147
- package/dist/src/types/primitives.d.ts.map +1 -1
- package/dist/src/types/primitives.js +2 -171
- package/dist/src/types/session.d.ts +14 -14
- package/dist/src/types/session.d.ts.map +1 -1
- package/dist/src/types/time.d.ts +4 -4
- package/dist/src/types/time.d.ts.map +1 -1
- package/dist/src/types/time.js +8 -6
- package/dist/src/utils/address-parser.d.ts +4 -4
- package/dist/src/utils/address-parser.d.ts.map +1 -1
- package/dist/src/utils/address-parser.js +9 -16
- package/dist/src/validator/validator.d.ts +94 -0
- package/dist/src/validator/validator.d.ts.map +1 -0
- package/dist/src/validator/validator.js +573 -0
- package/dist/tests/unit/parser/attribute-parser.test.js +106 -107
- package/dist/tests/unit/parser/field-parser.test.js +66 -66
- package/dist/tests/unit/parser/media-parser.test.js +38 -38
- package/dist/tests/unit/parser/primitive-parser.test.js +89 -90
- package/dist/tests/unit/parser/scanner.test.js +32 -32
- package/dist/tests/unit/parser/time-parser.test.js +22 -22
- package/dist/tests/unit/serializer/attribute-serializer.test.js +22 -22
- package/dist/tests/unit/serializer/field-serializer.test.js +57 -57
- package/dist/tests/unit/serializer/media-serializer.test.js +5 -6
- package/dist/tests/unit/serializer/session-serializer.test.js +24 -24
- package/dist/tests/unit/serializer/time-serializer.test.js +16 -16
- package/dist/tests/unit/types/network.test.js +21 -56
- package/dist/tests/unit/types/primitives.test.js +0 -39
- package/dist/tests/unit/validator/media-validator.test.js +34 -35
- package/dist/tests/unit/validator/semantic-validator.test.js +36 -37
- package/dist/tests/unit/validator/session-validator.test.js +54 -54
- package/package.json +1 -1
|
@@ -5,84 +5,57 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const network_1 = require("../../../src/types/network");
|
|
7
7
|
describe('network', () => {
|
|
8
|
-
describe('createIP4Address', () => {
|
|
9
|
-
it('should create IPv4 address', () => {
|
|
10
|
-
const addr = (0, network_1.createIP4Address)('192.168.1.1');
|
|
11
|
-
expect(addr).toBe('192.168.1.1');
|
|
12
|
-
});
|
|
13
|
-
});
|
|
14
|
-
describe('createIP6Address', () => {
|
|
15
|
-
it('should create IPv6 address', () => {
|
|
16
|
-
const addr = (0, network_1.createIP6Address)('2001:db8::1');
|
|
17
|
-
expect(addr).toBe('2001:db8::1');
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
describe('createFQDN', () => {
|
|
21
|
-
it('should create FQDN', () => {
|
|
22
|
-
const fqdn = (0, network_1.createFQDN)('example.com');
|
|
23
|
-
expect(fqdn).toBe('example.com');
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
8
|
describe('createIP4MulticastAddress', () => {
|
|
27
9
|
it('should create IPv4 multicast address', () => {
|
|
28
|
-
const
|
|
29
|
-
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
10
|
+
const multicast = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
30
11
|
expect(multicast.kind).toBe('ip4-multicast');
|
|
31
12
|
expect(multicast.address).toBe('224.0.1.1');
|
|
32
13
|
expect(multicast.ttl).toBe(127);
|
|
33
14
|
expect(multicast.numAddresses).toBeUndefined();
|
|
34
15
|
});
|
|
35
16
|
it('should create IPv4 multicast with numAddresses', () => {
|
|
36
|
-
const
|
|
37
|
-
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 32, 3);
|
|
17
|
+
const multicast = (0, network_1.createIP4MulticastAddress)('239.255.255.255', 32, 3);
|
|
38
18
|
expect(multicast.kind).toBe('ip4-multicast');
|
|
39
19
|
expect(multicast.address).toBe('239.255.255.255');
|
|
40
20
|
expect(multicast.ttl).toBe(32);
|
|
41
21
|
expect(multicast.numAddresses).toBe(3);
|
|
42
22
|
});
|
|
43
23
|
it('should throw for invalid TTL', () => {
|
|
44
|
-
|
|
45
|
-
expect(() => (0, network_1.createIP4MulticastAddress)(
|
|
46
|
-
expect(() => (0, network_1.createIP4MulticastAddress)(addr, 256)).toThrow('Invalid TTL');
|
|
24
|
+
expect(() => (0, network_1.createIP4MulticastAddress)('224.0.1.1', -1)).toThrow('Invalid TTL');
|
|
25
|
+
expect(() => (0, network_1.createIP4MulticastAddress)('224.0.1.1', 256)).toThrow('Invalid TTL');
|
|
47
26
|
});
|
|
48
27
|
it('should throw for invalid numAddresses', () => {
|
|
49
|
-
|
|
50
|
-
expect(() => (0, network_1.createIP4MulticastAddress)(
|
|
51
|
-
expect(() => (0, network_1.createIP4MulticastAddress)(addr, 127, -1)).toThrow('Invalid numAddresses');
|
|
28
|
+
expect(() => (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127, 0)).toThrow('Invalid numAddresses');
|
|
29
|
+
expect(() => (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127, -1)).toThrow('Invalid numAddresses');
|
|
52
30
|
});
|
|
53
31
|
});
|
|
54
32
|
describe('createIP6MulticastAddress', () => {
|
|
55
33
|
it('should create IPv6 multicast address', () => {
|
|
56
|
-
const
|
|
57
|
-
const multicast = (0, network_1.createIP6MulticastAddress)(addr);
|
|
34
|
+
const multicast = (0, network_1.createIP6MulticastAddress)('FF02::1');
|
|
58
35
|
expect(multicast.kind).toBe('ip6-multicast');
|
|
59
36
|
expect(multicast.address).toBe('FF02::1');
|
|
60
37
|
expect(multicast.numAddresses).toBeUndefined();
|
|
61
38
|
});
|
|
62
39
|
it('should create IPv6 multicast with numAddresses', () => {
|
|
63
|
-
const
|
|
64
|
-
const multicast = (0, network_1.createIP6MulticastAddress)(addr, 5);
|
|
40
|
+
const multicast = (0, network_1.createIP6MulticastAddress)('FF05::2', 5);
|
|
65
41
|
expect(multicast.kind).toBe('ip6-multicast');
|
|
66
42
|
expect(multicast.address).toBe('FF05::2');
|
|
67
43
|
expect(multicast.numAddresses).toBe(5);
|
|
68
44
|
});
|
|
69
45
|
it('should throw for invalid numAddresses', () => {
|
|
70
|
-
|
|
71
|
-
expect(() => (0, network_1.createIP6MulticastAddress)(addr, 0)).toThrow('Invalid numAddresses');
|
|
46
|
+
expect(() => (0, network_1.createIP6MulticastAddress)('FF02::1', 0)).toThrow('Invalid numAddresses');
|
|
72
47
|
});
|
|
73
48
|
});
|
|
74
49
|
describe('createFQDNMulticastAddress', () => {
|
|
75
50
|
it('should create FQDN multicast address', () => {
|
|
76
|
-
const
|
|
77
|
-
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn);
|
|
51
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)('multicast.example.com');
|
|
78
52
|
expect(multicast.kind).toBe('fqdn-multicast');
|
|
79
53
|
expect(multicast.address).toBe('multicast.example.com');
|
|
80
54
|
expect(multicast.ttl).toBeUndefined();
|
|
81
55
|
expect(multicast.numAddresses).toBeUndefined();
|
|
82
56
|
});
|
|
83
57
|
it('should create FQDN multicast with TTL and numAddresses', () => {
|
|
84
|
-
const
|
|
85
|
-
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn, 64, 2);
|
|
58
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)('multicast.example.com', 64, 2);
|
|
86
59
|
expect(multicast.kind).toBe('fqdn-multicast');
|
|
87
60
|
expect(multicast.address).toBe('multicast.example.com');
|
|
88
61
|
expect(multicast.ttl).toBe(64);
|
|
@@ -91,41 +64,33 @@ describe('network', () => {
|
|
|
91
64
|
});
|
|
92
65
|
describe('type guards', () => {
|
|
93
66
|
it('isMulticastAddress should detect multicast', () => {
|
|
94
|
-
const
|
|
95
|
-
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
67
|
+
const multicast = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
96
68
|
expect((0, network_1.isMulticastAddress)(multicast)).toBe(true);
|
|
97
|
-
const unicast =
|
|
69
|
+
const unicast = '192.168.1.1';
|
|
98
70
|
expect((0, network_1.isMulticastAddress)(unicast)).toBe(false);
|
|
99
71
|
});
|
|
100
72
|
it('isUnicastAddress should detect unicast', () => {
|
|
101
|
-
const unicast =
|
|
73
|
+
const unicast = '192.168.1.1';
|
|
102
74
|
expect((0, network_1.isUnicastAddress)(unicast)).toBe(true);
|
|
103
|
-
const
|
|
104
|
-
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
75
|
+
const multicast = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
105
76
|
expect((0, network_1.isUnicastAddress)(multicast)).toBe(false);
|
|
106
77
|
});
|
|
107
78
|
it('isIP4MulticastAddress should detect IPv4 multicast', () => {
|
|
108
|
-
const
|
|
109
|
-
const multicast = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
79
|
+
const multicast = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
110
80
|
expect((0, network_1.isIP4MulticastAddress)(multicast)).toBe(true);
|
|
111
|
-
const
|
|
112
|
-
const multicast6 = (0, network_1.createIP6MulticastAddress)(addr6);
|
|
81
|
+
const multicast6 = (0, network_1.createIP6MulticastAddress)('FF02::1');
|
|
113
82
|
expect((0, network_1.isIP4MulticastAddress)(multicast6)).toBe(false);
|
|
114
83
|
});
|
|
115
84
|
it('isIP6MulticastAddress should detect IPv6 multicast', () => {
|
|
116
|
-
const
|
|
117
|
-
const multicast = (0, network_1.createIP6MulticastAddress)(addr);
|
|
85
|
+
const multicast = (0, network_1.createIP6MulticastAddress)('FF02::1');
|
|
118
86
|
expect((0, network_1.isIP6MulticastAddress)(multicast)).toBe(true);
|
|
119
|
-
const
|
|
120
|
-
const multicast4 = (0, network_1.createIP4MulticastAddress)(addr4, 127);
|
|
87
|
+
const multicast4 = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
121
88
|
expect((0, network_1.isIP6MulticastAddress)(multicast4)).toBe(false);
|
|
122
89
|
});
|
|
123
90
|
it('isFQDNMulticastAddress should detect FQDN multicast', () => {
|
|
124
|
-
const
|
|
125
|
-
const multicast = (0, network_1.createFQDNMulticastAddress)(fqdn);
|
|
91
|
+
const multicast = (0, network_1.createFQDNMulticastAddress)('multicast.example.com');
|
|
126
92
|
expect((0, network_1.isFQDNMulticastAddress)(multicast)).toBe(true);
|
|
127
|
-
const
|
|
128
|
-
const multicast4 = (0, network_1.createIP4MulticastAddress)(addr, 127);
|
|
93
|
+
const multicast4 = (0, network_1.createIP4MulticastAddress)('224.0.1.1', 127);
|
|
129
94
|
expect((0, network_1.isFQDNMulticastAddress)(multicast4)).toBe(false);
|
|
130
95
|
});
|
|
131
96
|
});
|
|
@@ -5,45 +5,6 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const primitives_1 = require("../../../src/types/primitives");
|
|
7
7
|
describe('primitives', () => {
|
|
8
|
-
describe('createVersion', () => {
|
|
9
|
-
it('should create version 0', () => {
|
|
10
|
-
const version = (0, primitives_1.createVersion)(0);
|
|
11
|
-
expect(version).toBe(0);
|
|
12
|
-
});
|
|
13
|
-
it('should throw for non-zero version', () => {
|
|
14
|
-
expect(() => (0, primitives_1.createVersion)(1)).toThrow('Invalid SDP version');
|
|
15
|
-
expect(() => (0, primitives_1.createVersion)(2)).toThrow('Invalid SDP version');
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
describe('createSessionName', () => {
|
|
19
|
-
it('should create valid session name', () => {
|
|
20
|
-
const name = (0, primitives_1.createSessionName)('My Session');
|
|
21
|
-
expect(name).toBe('My Session');
|
|
22
|
-
});
|
|
23
|
-
it('should throw for empty session name', () => {
|
|
24
|
-
expect(() => (0, primitives_1.createSessionName)('')).toThrow('Session name cannot be empty');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
describe('createUsername', () => {
|
|
28
|
-
it('should create valid username', () => {
|
|
29
|
-
const username = (0, primitives_1.createUsername)('jdoe');
|
|
30
|
-
expect(username).toBe('jdoe');
|
|
31
|
-
});
|
|
32
|
-
it('should throw for empty username', () => {
|
|
33
|
-
expect(() => (0, primitives_1.createUsername)('')).toThrow('Username cannot be empty');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
describe('createNtpTime', () => {
|
|
37
|
-
it('should create valid NTP time', () => {
|
|
38
|
-
const time = (0, primitives_1.createNtpTime)(0);
|
|
39
|
-
expect(time).toBe(0);
|
|
40
|
-
const time2 = (0, primitives_1.createNtpTime)(3724394400);
|
|
41
|
-
expect(time2).toBe(3724394400);
|
|
42
|
-
});
|
|
43
|
-
it('should throw for negative time', () => {
|
|
44
|
-
expect(() => (0, primitives_1.createNtpTime)(-1)).toThrow('NTP time cannot be negative');
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
8
|
describe('createTypedTime', () => {
|
|
48
9
|
it('should create typed time with seconds', () => {
|
|
49
10
|
const time = (0, primitives_1.createTypedTime)(3600, 'seconds');
|
|
@@ -3,37 +3,36 @@
|
|
|
3
3
|
* Tests for media-validator.ts
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const validator_1 = require("../../../src/validator/validator");
|
|
7
7
|
const media_1 = require("../../../src/types/media");
|
|
8
8
|
const fields_1 = require("../../../src/types/fields");
|
|
9
|
-
const network_1 = require("../../../src/types/network");
|
|
10
9
|
const attributes_1 = require("../../../src/types/attributes");
|
|
11
10
|
describe('media-validator', () => {
|
|
12
11
|
describe('validateMediaDescription', () => {
|
|
13
12
|
describe('valid media descriptions', () => {
|
|
14
13
|
it('should validate minimal media description with session connection', () => {
|
|
15
14
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']));
|
|
16
|
-
const result = (0,
|
|
15
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
17
16
|
expect(result.valid).toBe(true);
|
|
18
17
|
expect(result.errors).toHaveLength(0);
|
|
19
18
|
});
|
|
20
19
|
it('should validate media description with own connection', () => {
|
|
21
20
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
22
|
-
connections: [(0, fields_1.createConnection)('IN', 'IP4',
|
|
21
|
+
connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.100')],
|
|
23
22
|
});
|
|
24
|
-
const result = (0,
|
|
23
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, false);
|
|
25
24
|
expect(result.valid).toBe(true);
|
|
26
25
|
});
|
|
27
26
|
it('should validate media with port range', () => {
|
|
28
27
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createPortRange)(49170, 2), 'RTP/AVP', ['0']));
|
|
29
|
-
const result = (0,
|
|
28
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
30
29
|
expect(result.valid).toBe(true);
|
|
31
30
|
});
|
|
32
31
|
it('should validate media with single direction attribute', () => {
|
|
33
32
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
34
33
|
attributes: [(0, attributes_1.createSendrecv)()],
|
|
35
34
|
});
|
|
36
|
-
const result = (0,
|
|
35
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
37
36
|
expect(result.valid).toBe(true);
|
|
38
37
|
});
|
|
39
38
|
it('should validate media with valid rtpmap', () => {
|
|
@@ -43,7 +42,7 @@ describe('media-validator', () => {
|
|
|
43
42
|
(0, attributes_1.createRtpmap)(8, 'PCMA', 8000),
|
|
44
43
|
],
|
|
45
44
|
});
|
|
46
|
-
const result = (0,
|
|
45
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
47
46
|
expect(result.valid).toBe(true);
|
|
48
47
|
});
|
|
49
48
|
it('should validate media with valid fmtp', () => {
|
|
@@ -53,26 +52,26 @@ describe('media-validator', () => {
|
|
|
53
52
|
(0, attributes_1.createFmtp)('96', 'profile-level-id=42e01f'),
|
|
54
53
|
],
|
|
55
54
|
});
|
|
56
|
-
const result = (0,
|
|
55
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
57
56
|
expect(result.valid).toBe(true);
|
|
58
57
|
});
|
|
59
58
|
it('should validate media with valid ptime', () => {
|
|
60
59
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
61
60
|
attributes: [(0, attributes_1.createPtime)(20)],
|
|
62
61
|
});
|
|
63
|
-
const result = (0,
|
|
62
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
64
63
|
expect(result.valid).toBe(true);
|
|
65
64
|
});
|
|
66
65
|
it('should validate port 0 (disabled)', () => {
|
|
67
66
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(0), 'RTP/AVP', ['0']));
|
|
68
|
-
const result = (0,
|
|
67
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
69
68
|
expect(result.valid).toBe(true);
|
|
70
69
|
});
|
|
71
70
|
});
|
|
72
71
|
describe('invalid media descriptions', () => {
|
|
73
72
|
it('should reject missing connection when no session connection', () => {
|
|
74
73
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']));
|
|
75
|
-
const result = (0,
|
|
74
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, false);
|
|
76
75
|
expect(result.valid).toBe(false);
|
|
77
76
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:5.7')).toBe(true);
|
|
78
77
|
});
|
|
@@ -88,7 +87,7 @@ describe('media-validator', () => {
|
|
|
88
87
|
bandwidths: [],
|
|
89
88
|
attributes: [],
|
|
90
89
|
};
|
|
91
|
-
const result = (0,
|
|
90
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
92
91
|
expect(result.valid).toBe(false);
|
|
93
92
|
expect(result.errors.some((e) => { var _a; return (_a = e.field) === null || _a === void 0 ? void 0 : _a.includes('port'); })).toBe(true);
|
|
94
93
|
});
|
|
@@ -104,7 +103,7 @@ describe('media-validator', () => {
|
|
|
104
103
|
bandwidths: [],
|
|
105
104
|
attributes: [],
|
|
106
105
|
};
|
|
107
|
-
const result = (0,
|
|
106
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
108
107
|
expect(result.valid).toBe(false);
|
|
109
108
|
expect(result.errors.some((e) => e.message.includes('exceeds 65535'))).toBe(true);
|
|
110
109
|
});
|
|
@@ -112,7 +111,7 @@ describe('media-validator', () => {
|
|
|
112
111
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
113
112
|
attributes: [(0, attributes_1.createRecvonly)(), (0, attributes_1.createSendrecv)()],
|
|
114
113
|
});
|
|
115
|
-
const result = (0,
|
|
114
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
116
115
|
expect(result.valid).toBe(false);
|
|
117
116
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.7')).toBe(true);
|
|
118
117
|
});
|
|
@@ -120,7 +119,7 @@ describe('media-validator', () => {
|
|
|
120
119
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
121
120
|
attributes: [(0, attributes_1.createRtpmap)(96, 'H264', 90000)], // 96 not in formats
|
|
122
121
|
});
|
|
123
|
-
const result = (0,
|
|
122
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
124
123
|
expect(result.valid).toBe(false);
|
|
125
124
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.6')).toBe(true);
|
|
126
125
|
});
|
|
@@ -128,7 +127,7 @@ describe('media-validator', () => {
|
|
|
128
127
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
129
128
|
attributes: [(0, attributes_1.createFmtp)('96', 'profile-level-id=42e01f')], // 96 not in formats
|
|
130
129
|
});
|
|
131
|
-
const result = (0,
|
|
130
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
132
131
|
expect(result.valid).toBe(false);
|
|
133
132
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.15')).toBe(true);
|
|
134
133
|
});
|
|
@@ -136,7 +135,7 @@ describe('media-validator', () => {
|
|
|
136
135
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
137
136
|
attributes: [(0, attributes_1.createValueAttribute)('ptime', '0')],
|
|
138
137
|
});
|
|
139
|
-
const result = (0,
|
|
138
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
140
139
|
expect(result.valid).toBe(false);
|
|
141
140
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.4')).toBe(true);
|
|
142
141
|
});
|
|
@@ -144,7 +143,7 @@ describe('media-validator', () => {
|
|
|
144
143
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
145
144
|
attributes: [(0, attributes_1.createValueAttribute)('maxptime', '-10')],
|
|
146
145
|
});
|
|
147
|
-
const result = (0,
|
|
146
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
148
147
|
expect(result.valid).toBe(false);
|
|
149
148
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.5')).toBe(true);
|
|
150
149
|
});
|
|
@@ -152,7 +151,7 @@ describe('media-validator', () => {
|
|
|
152
151
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['96']), {
|
|
153
152
|
attributes: [(0, attributes_1.createValueAttribute)('quality', '11')],
|
|
154
153
|
});
|
|
155
|
-
const result = (0,
|
|
154
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
156
155
|
expect(result.valid).toBe(false);
|
|
157
156
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.14')).toBe(true);
|
|
158
157
|
});
|
|
@@ -160,7 +159,7 @@ describe('media-validator', () => {
|
|
|
160
159
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['96']), {
|
|
161
160
|
attributes: [(0, attributes_1.createValueAttribute)('framerate', '0')],
|
|
162
161
|
});
|
|
163
|
-
const result = (0,
|
|
162
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
164
163
|
expect(result.valid).toBe(false);
|
|
165
164
|
expect(result.errors.some((e) => e.constraint === 'RFC8866:6.13')).toBe(true);
|
|
166
165
|
});
|
|
@@ -168,7 +167,7 @@ describe('media-validator', () => {
|
|
|
168
167
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
169
168
|
bandwidths: [{ type: 'AS', value: -1 }],
|
|
170
169
|
});
|
|
171
|
-
const result = (0,
|
|
170
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
172
171
|
expect(result.valid).toBe(false);
|
|
173
172
|
expect(result.errors.some((e) => { var _a; return (_a = e.field) === null || _a === void 0 ? void 0 : _a.includes('bandwidth'); })).toBe(true);
|
|
174
173
|
});
|
|
@@ -176,7 +175,7 @@ describe('media-validator', () => {
|
|
|
176
175
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
177
176
|
attributes: [(0, attributes_1.createValueAttribute)('cat', 'conference')],
|
|
178
177
|
});
|
|
179
|
-
const result = (0,
|
|
178
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
180
179
|
expect(result.valid).toBe(false);
|
|
181
180
|
expect(result.errors.some((e) => e.message.includes('cat') && e.message.includes('session level'))).toBe(true);
|
|
182
181
|
});
|
|
@@ -184,7 +183,7 @@ describe('media-validator', () => {
|
|
|
184
183
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
185
184
|
attributes: [(0, attributes_1.createValueAttribute)('tool', 'my-tool v1.0')],
|
|
186
185
|
});
|
|
187
|
-
const result = (0,
|
|
186
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
188
187
|
expect(result.valid).toBe(false);
|
|
189
188
|
expect(result.errors.some((e) => e.message.includes('tool') && e.message.includes('session level'))).toBe(true);
|
|
190
189
|
});
|
|
@@ -192,7 +191,7 @@ describe('media-validator', () => {
|
|
|
192
191
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
193
192
|
attributes: [(0, attributes_1.createValueAttribute)('type', 'broadcast')],
|
|
194
193
|
});
|
|
195
|
-
const result = (0,
|
|
194
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
196
195
|
expect(result.valid).toBe(false);
|
|
197
196
|
expect(result.errors.some((e) => e.message.includes('type') && e.message.includes('session level'))).toBe(true);
|
|
198
197
|
});
|
|
@@ -203,7 +202,7 @@ describe('media-validator', () => {
|
|
|
203
202
|
const md = (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
|
|
204
203
|
attributes: [(0, attributes_1.createValueAttribute)(attrName, 'test')],
|
|
205
204
|
});
|
|
206
|
-
const result = (0,
|
|
205
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
207
206
|
expect(result.valid).toBe(false);
|
|
208
207
|
expect(result.errors.some((e) => e.message.includes(attrName) && e.message.includes('session level'))).toBe(true);
|
|
209
208
|
}
|
|
@@ -217,7 +216,7 @@ describe('media-validator', () => {
|
|
|
217
216
|
(0, attributes_1.createRecvonly)(),
|
|
218
217
|
],
|
|
219
218
|
});
|
|
220
|
-
const result = (0,
|
|
219
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
221
220
|
expect(result.valid).toBe(true);
|
|
222
221
|
});
|
|
223
222
|
it('should reject duplicate rtpmap for same payload type (RFC 8866 Section 6.6)', () => {
|
|
@@ -227,7 +226,7 @@ describe('media-validator', () => {
|
|
|
227
226
|
(0, attributes_1.createRtpmap)(96, 'PCMU', 8000), // Duplicate payload type 96
|
|
228
227
|
],
|
|
229
228
|
});
|
|
230
|
-
const result = (0,
|
|
229
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
231
230
|
expect(result.valid).toBe(false);
|
|
232
231
|
expect(result.errors.some((e) => e.message.includes('duplicate rtpmap') &&
|
|
233
232
|
e.message.includes('96') &&
|
|
@@ -241,7 +240,7 @@ describe('media-validator', () => {
|
|
|
241
240
|
(0, attributes_1.createFmtp)('96', 'packetization-mode=1'), // Duplicate format 96
|
|
242
241
|
],
|
|
243
242
|
});
|
|
244
|
-
const result = (0,
|
|
243
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
245
244
|
expect(result.valid).toBe(false);
|
|
246
245
|
expect(result.errors.some((e) => e.message.includes('duplicate fmtp') &&
|
|
247
246
|
e.message.includes('96') &&
|
|
@@ -255,7 +254,7 @@ describe('media-validator', () => {
|
|
|
255
254
|
(0, attributes_1.createRtpmap)(96, 'opus', 48000),
|
|
256
255
|
],
|
|
257
256
|
});
|
|
258
|
-
const result = (0,
|
|
257
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
259
258
|
expect(result.valid).toBe(true);
|
|
260
259
|
});
|
|
261
260
|
it('should allow different formats for fmtp', () => {
|
|
@@ -267,7 +266,7 @@ describe('media-validator', () => {
|
|
|
267
266
|
(0, attributes_1.createFmtp)('97', 'max-fr=30'),
|
|
268
267
|
],
|
|
269
268
|
});
|
|
270
|
-
const result = (0,
|
|
269
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
271
270
|
expect(result.valid).toBe(true);
|
|
272
271
|
});
|
|
273
272
|
it('should detect multiple duplicate rtpmap entries', () => {
|
|
@@ -279,7 +278,7 @@ describe('media-validator', () => {
|
|
|
279
278
|
(0, attributes_1.createRtpmap)(97, 'G722', 8000), // Duplicate 97
|
|
280
279
|
],
|
|
281
280
|
});
|
|
282
|
-
const result = (0,
|
|
281
|
+
const result = (0, validator_1.validateMediaDescription)(md, 0, true);
|
|
283
282
|
expect(result.valid).toBe(false);
|
|
284
283
|
expect(result.errors.filter((e) => e.message.includes('duplicate rtpmap')).length).toBe(2);
|
|
285
284
|
});
|
|
@@ -287,7 +286,7 @@ describe('media-validator', () => {
|
|
|
287
286
|
});
|
|
288
287
|
describe('validateAllMediaDescriptions', () => {
|
|
289
288
|
it('should validate empty media list', () => {
|
|
290
|
-
const result = (0,
|
|
289
|
+
const result = (0, validator_1.validateAllMediaDescriptions)([], true);
|
|
291
290
|
expect(result.valid).toBe(true);
|
|
292
291
|
});
|
|
293
292
|
it('should validate multiple valid media descriptions', () => {
|
|
@@ -295,7 +294,7 @@ describe('media-validator', () => {
|
|
|
295
294
|
(0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0'])),
|
|
296
295
|
(0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['96'])),
|
|
297
296
|
];
|
|
298
|
-
const result = (0,
|
|
297
|
+
const result = (0, validator_1.validateAllMediaDescriptions)(mediaDescriptions, true);
|
|
299
298
|
expect(result.valid).toBe(true);
|
|
300
299
|
});
|
|
301
300
|
it('should collect errors from all media descriptions', () => {
|
|
@@ -305,7 +304,7 @@ describe('media-validator', () => {
|
|
|
305
304
|
(0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['96']), { attributes: [(0, attributes_1.createValueAttribute)('quality', '15')] } // Invalid quality
|
|
306
305
|
),
|
|
307
306
|
];
|
|
308
|
-
const result = (0,
|
|
307
|
+
const result = (0, validator_1.validateAllMediaDescriptions)(mediaDescriptions, true);
|
|
309
308
|
expect(result.valid).toBe(false);
|
|
310
309
|
expect(result.errors.length).toBeGreaterThanOrEqual(2);
|
|
311
310
|
});
|