@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
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
* Tests for semantic-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 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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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',
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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',
|
|
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',
|
|
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,
|
|
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
|
});
|