@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
@@ -3,11 +3,10 @@
3
3
  * Tests for semantic-validator.ts
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const semantic_validator_1 = require("../../../src/validator/semantic-validator");
6
+ const validator_1 = require("../../../src/validator/validator");
7
7
  const session_1 = require("../../../src/types/session");
8
8
  const fields_1 = require("../../../src/types/fields");
9
9
  const time_1 = require("../../../src/types/time");
10
- const network_1 = require("../../../src/types/network");
11
10
  const media_1 = require("../../../src/types/media");
12
11
  const attributes_1 = require("../../../src/types/attributes");
13
12
  describe('semantic-validator', () => {
@@ -15,7 +14,7 @@ describe('semantic-validator', () => {
15
14
  function createValidSession() {
16
15
  return (0, session_1.createSessionDescription)({
17
16
  version: 0,
18
- origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', (0, network_1.createIP4Address)('10.47.16.5')),
17
+ origin: (0, fields_1.createOrigin)('jdoe', '2890844526', '2890842807', 'IN', 'IP4', '10.47.16.5'),
19
18
  sessionName: 'Test Session',
20
19
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
21
20
  });
@@ -23,28 +22,28 @@ describe('semantic-validator', () => {
23
22
  describe('validateSdp', () => {
24
23
  it('should validate minimal valid session', () => {
25
24
  const session = createValidSession();
26
- const result = (0, semantic_validator_1.validateSdp)(session);
25
+ const result = (0, validator_1.validateSdp)(session);
27
26
  expect(result.valid).toBe(true);
28
27
  expect(result.errors).toHaveLength(0);
29
28
  });
30
29
  it('should validate session with media and session-level connection', () => {
31
30
  const session = (0, session_1.createSessionDescription)({
32
31
  version: 0,
33
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
32
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
34
33
  sessionName: 'Test',
35
- connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1')),
34
+ connection: (0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1'),
36
35
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
37
36
  mediaDescriptions: [
38
37
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0'])),
39
38
  ],
40
39
  });
41
- const result = (0, semantic_validator_1.validateSdp)(session);
40
+ const result = (0, validator_1.validateSdp)(session);
42
41
  expect(result.valid).toBe(true);
43
42
  });
44
43
  it('should collect errors from session and media validation', () => {
45
44
  const session = {
46
45
  version: 0,
47
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
46
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
48
47
  sessionName: '', // Invalid - empty
49
48
  emails: [],
50
49
  phones: [],
@@ -65,7 +64,7 @@ describe('semantic-validator', () => {
65
64
  },
66
65
  ],
67
66
  };
68
- const result = (0, semantic_validator_1.validateSdp)(session);
67
+ const result = (0, validator_1.validateSdp)(session);
69
68
  expect(result.valid).toBe(false);
70
69
  expect(result.errors.length).toBeGreaterThanOrEqual(2);
71
70
  });
@@ -75,39 +74,39 @@ describe('semantic-validator', () => {
75
74
  it('should pass when AS sum is within CT', () => {
76
75
  const session = (0, session_1.createSessionDescription)({
77
76
  version: 0,
78
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
77
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
79
78
  sessionName: 'Test',
80
79
  bandwidths: [(0, fields_1.createBandwidth)('CT', 1000)],
81
80
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
82
81
  mediaDescriptions: [
83
82
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
84
- connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1'))],
83
+ connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1')],
85
84
  bandwidths: [(0, fields_1.createBandwidth)('AS', 500)],
86
85
  }),
87
86
  ],
88
87
  });
89
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
88
+ const result = (0, validator_1.validateSemanticConstraints)(session);
90
89
  expect(result.valid).toBe(true);
91
90
  });
92
91
  it('should fail when AS sum exceeds CT', () => {
93
92
  const session = (0, session_1.createSessionDescription)({
94
93
  version: 0,
95
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
94
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
96
95
  sessionName: 'Test',
97
96
  bandwidths: [(0, fields_1.createBandwidth)('CT', 100)],
98
97
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
99
98
  mediaDescriptions: [
100
99
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
101
- connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1'))],
100
+ connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1')],
102
101
  bandwidths: [(0, fields_1.createBandwidth)('AS', 500)],
103
102
  }),
104
103
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('video', (0, media_1.createSimplePort)(51372), 'RTP/AVP', ['96']), {
105
- connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1'))],
104
+ connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1')],
106
105
  bandwidths: [(0, fields_1.createBandwidth)('AS', 700)],
107
106
  }),
108
107
  ],
109
108
  });
110
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
109
+ const result = (0, validator_1.validateSemanticConstraints)(session);
111
110
  expect(result.valid).toBe(false);
112
111
  expect(result.errors.some((e) => e.message.includes('AS') && e.message.includes('CT'))).toBe(true);
113
112
  });
@@ -116,9 +115,9 @@ describe('semantic-validator', () => {
116
115
  it('should pass when ptime <= maxptime', () => {
117
116
  const session = (0, session_1.createSessionDescription)({
118
117
  version: 0,
119
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
118
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
120
119
  sessionName: 'Test',
121
- connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1')),
120
+ connection: (0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1'),
122
121
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
123
122
  mediaDescriptions: [
124
123
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
@@ -129,15 +128,15 @@ describe('semantic-validator', () => {
129
128
  }),
130
129
  ],
131
130
  });
132
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
131
+ const result = (0, validator_1.validateSemanticConstraints)(session);
133
132
  expect(result.valid).toBe(true);
134
133
  });
135
134
  it('should pass when decimal ptime <= maxptime (RFC 8866 non-zero-int-or-real)', () => {
136
135
  const session = (0, session_1.createSessionDescription)({
137
136
  version: 0,
138
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
137
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
139
138
  sessionName: 'Test',
140
- connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1')),
139
+ connection: (0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1'),
141
140
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
142
141
  mediaDescriptions: [
143
142
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
@@ -148,15 +147,15 @@ describe('semantic-validator', () => {
148
147
  }),
149
148
  ],
150
149
  });
151
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
150
+ const result = (0, validator_1.validateSemanticConstraints)(session);
152
151
  expect(result.valid).toBe(true);
153
152
  });
154
153
  it('should fail when ptime > maxptime', () => {
155
154
  const session = (0, session_1.createSessionDescription)({
156
155
  version: 0,
157
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
156
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
158
157
  sessionName: 'Test',
159
- connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1')),
158
+ connection: (0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1'),
160
159
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
161
160
  mediaDescriptions: [
162
161
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
@@ -167,16 +166,16 @@ describe('semantic-validator', () => {
167
166
  }),
168
167
  ],
169
168
  });
170
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
169
+ const result = (0, validator_1.validateSemanticConstraints)(session);
171
170
  expect(result.valid).toBe(false);
172
171
  expect(result.errors.some((e) => e.message.includes('ptime') && e.message.includes('maxptime'))).toBe(true);
173
172
  });
174
173
  it('should fail when decimal ptime > maxptime', () => {
175
174
  const session = (0, session_1.createSessionDescription)({
176
175
  version: 0,
177
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
176
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
178
177
  sessionName: 'Test',
179
- connection: (0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1')),
178
+ connection: (0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1'),
180
179
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
181
180
  mediaDescriptions: [
182
181
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
@@ -187,7 +186,7 @@ describe('semantic-validator', () => {
187
186
  }),
188
187
  ],
189
188
  });
190
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
189
+ const result = (0, validator_1.validateSemanticConstraints)(session);
191
190
  expect(result.valid).toBe(false);
192
191
  expect(result.errors.some((e) => e.message.includes('ptime') && e.message.includes('maxptime'))).toBe(true);
193
192
  });
@@ -196,7 +195,7 @@ describe('semantic-validator', () => {
196
195
  it('should fail when timezone specified without repeat times', () => {
197
196
  const session = {
198
197
  version: 0,
199
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
198
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
200
199
  sessionName: 'Test',
201
200
  emails: [],
202
201
  phones: [],
@@ -211,7 +210,7 @@ describe('semantic-validator', () => {
211
210
  attributes: [],
212
211
  mediaDescriptions: [],
213
212
  };
214
- const result = (0, semantic_validator_1.validateSemanticConstraints)(session);
213
+ const result = (0, validator_1.validateSemanticConstraints)(session);
215
214
  expect(result.valid).toBe(false);
216
215
  expect(result.errors.some((e) => e.message.includes('timezone') && e.message.includes('repeat'))).toBe(true);
217
216
  });
@@ -220,41 +219,41 @@ describe('semantic-validator', () => {
220
219
  describe('validateSdp with options', () => {
221
220
  it('should validate with default options', () => {
222
221
  const session = createValidSession();
223
- const result = (0, semantic_validator_1.validateSdp)(session);
222
+ const result = (0, validator_1.validateSdp)(session);
224
223
  expect(result.valid).toBe(true);
225
224
  });
226
225
  it('should reject deprecated key field when not allowed', () => {
227
226
  const session = Object.assign(Object.assign({}, createValidSession()), { key: 'clear:testkey' });
228
- const result = (0, semantic_validator_1.validateSdp)(session, { allowDeprecatedKeyField: false });
227
+ const result = (0, validator_1.validateSdp)(session, { allowDeprecatedKeyField: false });
229
228
  expect(result.valid).toBe(false);
230
229
  expect(result.errors.some((e) => e.message.includes('deprecated'))).toBe(true);
231
230
  });
232
231
  it('should allow deprecated key field when explicitly permitted', () => {
233
232
  const session = Object.assign(Object.assign({}, createValidSession()), { key: 'clear:testkey' });
234
- const result = (0, semantic_validator_1.validateSdp)(session, { allowDeprecatedKeyField: true });
233
+ const result = (0, validator_1.validateSdp)(session, { allowDeprecatedKeyField: true });
235
234
  expect(result.valid).toBe(true);
236
235
  });
237
236
  it('should require session connection when option set', () => {
238
237
  const session = createValidSession();
239
- const result = (0, semantic_validator_1.validateSdp)(session, { requireSessionConnection: true });
238
+ const result = (0, validator_1.validateSdp)(session, { requireSessionConnection: true });
240
239
  expect(result.valid).toBe(false);
241
240
  expect(result.errors.some((e) => e.message.includes('Session-level connection'))).toBe(true);
242
241
  });
243
242
  it('should skip semantic validation when option set', () => {
244
243
  const session = (0, session_1.createSessionDescription)({
245
244
  version: 0,
246
- origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', (0, network_1.createIP4Address)('10.0.0.1')),
245
+ origin: (0, fields_1.createOrigin)('jdoe', '123', '456', 'IN', 'IP4', '10.0.0.1'),
247
246
  sessionName: 'Test',
248
247
  bandwidths: [(0, fields_1.createBandwidth)('CT', 100)],
249
248
  timeDescriptions: [(0, time_1.createTimeDescription)((0, time_1.createTiming)(0, 0))],
250
249
  mediaDescriptions: [
251
250
  (0, media_1.createMediaDescription)((0, media_1.createMedia)('audio', (0, media_1.createSimplePort)(49170), 'RTP/AVP', ['0']), {
252
- connections: [(0, fields_1.createConnection)('IN', 'IP4', (0, network_1.createIP4Address)('192.168.1.1'))],
251
+ connections: [(0, fields_1.createConnection)('IN', 'IP4', '192.168.1.1')],
253
252
  bandwidths: [(0, fields_1.createBandwidth)('AS', 500)], // Would normally exceed CT
254
253
  }),
255
254
  ],
256
255
  });
257
- const result = (0, semantic_validator_1.validateSdp)(session, { skipSemanticValidation: true });
256
+ const result = (0, validator_1.validateSdp)(session, { skipSemanticValidation: true });
258
257
  // Should pass because semantic validation is skipped
259
258
  expect(result.valid).toBe(true);
260
259
  });