@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.
Files changed (68) hide show
  1. package/README.md +0 -39
  2. package/dist/src/builder/media-builder.d.ts.map +1 -1
  3. package/dist/src/builder/media-builder.js +5 -12
  4. package/dist/src/builder/session-builder.d.ts.map +1 -1
  5. package/dist/src/builder/session-builder.js +4 -14
  6. package/dist/src/index.d.ts +6 -10
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +37 -49
  9. package/dist/src/parser/core.d.ts +366 -0
  10. package/dist/src/parser/core.d.ts.map +1 -0
  11. package/dist/src/parser/core.js +802 -0
  12. package/dist/src/parser/field-parser.d.ts +51 -8
  13. package/dist/src/parser/field-parser.d.ts.map +1 -1
  14. package/dist/src/parser/field-parser.js +91 -23
  15. package/dist/src/parser/media-parser.d.ts +1 -1
  16. package/dist/src/parser/media-parser.d.ts.map +1 -1
  17. package/dist/src/parser/media-parser.js +9 -15
  18. package/dist/src/parser/session-parser.d.ts.map +1 -1
  19. package/dist/src/parser/session-parser.js +16 -17
  20. package/dist/src/parser/time-parser.d.ts +1 -1
  21. package/dist/src/parser/time-parser.d.ts.map +1 -1
  22. package/dist/src/parser/time-parser.js +8 -8
  23. package/dist/src/serializer/fields.d.ts +167 -0
  24. package/dist/src/serializer/fields.d.ts.map +1 -0
  25. package/dist/src/serializer/fields.js +320 -0
  26. package/dist/src/serializer/media-serializer.js +6 -7
  27. package/dist/src/serializer/session-serializer.js +13 -15
  28. package/dist/src/types/attributes.d.ts.map +1 -1
  29. package/dist/src/types/fields.d.ts +5 -5
  30. package/dist/src/types/fields.d.ts.map +1 -1
  31. package/dist/src/types/fields.js +4 -4
  32. package/dist/src/types/media.d.ts +9 -10
  33. package/dist/src/types/media.d.ts.map +1 -1
  34. package/dist/src/types/media.js +2 -4
  35. package/dist/src/types/network.d.ts +15 -56
  36. package/dist/src/types/network.d.ts.map +1 -1
  37. package/dist/src/types/network.js +3 -34
  38. package/dist/src/types/primitives.d.ts +3 -147
  39. package/dist/src/types/primitives.d.ts.map +1 -1
  40. package/dist/src/types/primitives.js +2 -171
  41. package/dist/src/types/session.d.ts +14 -14
  42. package/dist/src/types/session.d.ts.map +1 -1
  43. package/dist/src/types/time.d.ts +4 -4
  44. package/dist/src/types/time.d.ts.map +1 -1
  45. package/dist/src/types/time.js +8 -6
  46. package/dist/src/utils/address-parser.d.ts +4 -4
  47. package/dist/src/utils/address-parser.d.ts.map +1 -1
  48. package/dist/src/utils/address-parser.js +9 -16
  49. package/dist/src/validator/validator.d.ts +94 -0
  50. package/dist/src/validator/validator.d.ts.map +1 -0
  51. package/dist/src/validator/validator.js +573 -0
  52. package/dist/tests/unit/parser/attribute-parser.test.js +106 -107
  53. package/dist/tests/unit/parser/field-parser.test.js +66 -66
  54. package/dist/tests/unit/parser/media-parser.test.js +38 -38
  55. package/dist/tests/unit/parser/primitive-parser.test.js +89 -90
  56. package/dist/tests/unit/parser/scanner.test.js +32 -32
  57. package/dist/tests/unit/parser/time-parser.test.js +22 -22
  58. package/dist/tests/unit/serializer/attribute-serializer.test.js +22 -22
  59. package/dist/tests/unit/serializer/field-serializer.test.js +57 -57
  60. package/dist/tests/unit/serializer/media-serializer.test.js +5 -6
  61. package/dist/tests/unit/serializer/session-serializer.test.js +24 -24
  62. package/dist/tests/unit/serializer/time-serializer.test.js +16 -16
  63. package/dist/tests/unit/types/network.test.js +21 -56
  64. package/dist/tests/unit/types/primitives.test.js +0 -39
  65. package/dist/tests/unit/validator/media-validator.test.js +34 -35
  66. package/dist/tests/unit/validator/semantic-validator.test.js +36 -37
  67. package/dist/tests/unit/validator/session-validator.test.js +54 -54
  68. 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 addr = (0, network_1.createIP4Address)('224.0.1.1');
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 addr = (0, network_1.createIP4Address)('239.255.255.255');
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
- const addr = (0, network_1.createIP4Address)('224.0.1.1');
45
- expect(() => (0, network_1.createIP4MulticastAddress)(addr, -1)).toThrow('Invalid TTL');
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
- const addr = (0, network_1.createIP4Address)('224.0.1.1');
50
- expect(() => (0, network_1.createIP4MulticastAddress)(addr, 127, 0)).toThrow('Invalid numAddresses');
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 addr = (0, network_1.createIP6Address)('FF02::1');
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 addr = (0, network_1.createIP6Address)('FF05::2');
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
- const addr = (0, network_1.createIP6Address)('FF02::1');
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 fqdn = (0, network_1.createFQDN)('multicast.example.com');
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 fqdn = (0, network_1.createFQDN)('multicast.example.com');
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 addr = (0, network_1.createIP4Address)('224.0.1.1');
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 = (0, network_1.createIP4Address)('192.168.1.1');
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 = (0, network_1.createIP4Address)('192.168.1.1');
73
+ const unicast = '192.168.1.1';
102
74
  expect((0, network_1.isUnicastAddress)(unicast)).toBe(true);
103
- const addr = (0, network_1.createIP4Address)('224.0.1.1');
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 addr = (0, network_1.createIP4Address)('224.0.1.1');
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 addr6 = (0, network_1.createIP6Address)('FF02::1');
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 addr = (0, network_1.createIP6Address)('FF02::1');
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 addr4 = (0, network_1.createIP4Address)('224.0.1.1');
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 fqdn = (0, network_1.createFQDN)('multicast.example.com');
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 addr = (0, network_1.createIP4Address)('224.0.1.1');
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 media_validator_1 = require("../../../src/validator/media-validator");
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, media_validator_1.validateMediaDescription)(md, 0, true);
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', (0, network_1.createIP4Address)('192.168.1.100'))],
21
+ connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.100')],
23
22
  });
24
- const result = (0, media_validator_1.validateMediaDescription)(md, 0, false);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, false);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateMediaDescription)(md, 0, true);
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, media_validator_1.validateAllMediaDescriptions)([], true);
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, media_validator_1.validateAllMediaDescriptions)(mediaDescriptions, true);
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, media_validator_1.validateAllMediaDescriptions)(mediaDescriptions, true);
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
  });