@agentdance/node-webrtc-sdp 1.0.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.
@@ -0,0 +1,9 @@
1
+ import type { SessionDescription } from './types.js';
2
+ export interface CreateOfferOptions {
3
+ audio?: boolean;
4
+ video?: boolean;
5
+ data?: boolean;
6
+ }
7
+ export declare function createOffer(options?: CreateOfferOptions): SessionDescription;
8
+ export declare function createAnswer(offer: SessionDescription): SessionDescription;
9
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAoB,MAAM,YAAY,CAAC;AAuEvE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,kBAAkB,CA2ChF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAwC1E"}
@@ -0,0 +1,151 @@
1
+ let sessionIdCounter = BigInt(Date.now()) * BigInt(1000);
2
+ function nextSessionId() {
3
+ sessionIdCounter += BigInt(1);
4
+ return sessionIdCounter.toString();
5
+ }
6
+ function baseMedia(type, protocol, payloadTypes) {
7
+ return {
8
+ type,
9
+ port: 9,
10
+ protocol,
11
+ payloadTypes,
12
+ rtpMaps: [],
13
+ fmtps: [],
14
+ rtcpFbs: [],
15
+ candidates: [],
16
+ ssrcs: [],
17
+ ssrcGroups: [],
18
+ extmaps: [],
19
+ connection: { networkType: 'IN', addressType: 'IP4', address: '0.0.0.0' },
20
+ rtcpMux: true,
21
+ };
22
+ }
23
+ function audioMedia() {
24
+ const m = baseMedia('audio', 'UDP/TLS/RTP/SAVPF', [111]);
25
+ m.rtpMaps = [{ payloadType: 111, encoding: 'opus', clockRate: 48000, encodingParams: '2' }];
26
+ m.fmtps = [{ payloadType: 111, parameters: 'minptime=10;useinbandfec=1' }];
27
+ m.rtcpFbs = [{ payloadType: 111, type: 'transport-cc' }];
28
+ m.direction = 'sendrecv';
29
+ m.mid = '0';
30
+ return m;
31
+ }
32
+ function videoMedia() {
33
+ const m = baseMedia('video', 'UDP/TLS/RTP/SAVPF', [96, 97]);
34
+ m.rtpMaps = [
35
+ { payloadType: 96, encoding: 'VP8', clockRate: 90000 },
36
+ { payloadType: 97, encoding: 'rtx', clockRate: 90000 },
37
+ ];
38
+ m.fmtps = [{ payloadType: 97, parameters: 'apt=96' }];
39
+ m.rtcpFbs = [
40
+ { payloadType: 96, type: 'goog-remb' },
41
+ { payloadType: 96, type: 'transport-cc' },
42
+ { payloadType: 96, type: 'ccm', parameter: 'fir' },
43
+ { payloadType: 96, type: 'nack' },
44
+ { payloadType: 96, type: 'nack', parameter: 'pli' },
45
+ ];
46
+ m.direction = 'sendrecv';
47
+ m.rtcpRsize = true;
48
+ m.mid = '1';
49
+ return m;
50
+ }
51
+ function dataMedia() {
52
+ const m = baseMedia('application', 'UDP/DTLS/SCTP', [5000]);
53
+ m.payloadTypes = [];
54
+ // For data channels we use the "webrtc-datachannel" fmt instead of payload types
55
+ m.sctpPort = 5000;
56
+ m.maxMessageSize = 262144;
57
+ m.mid = '2';
58
+ return m;
59
+ }
60
+ export function createOffer(options = {}) {
61
+ const { audio = true, video = true, data = false } = options;
62
+ const mediaDescriptions = [];
63
+ const mids = [];
64
+ if (audio) {
65
+ const m = audioMedia();
66
+ m.setup = 'actpass';
67
+ mediaDescriptions.push(m);
68
+ if (m.mid !== undefined)
69
+ mids.push(m.mid);
70
+ }
71
+ if (video) {
72
+ const m = videoMedia();
73
+ m.setup = 'actpass';
74
+ mediaDescriptions.push(m);
75
+ if (m.mid !== undefined)
76
+ mids.push(m.mid);
77
+ }
78
+ if (data) {
79
+ const m = dataMedia();
80
+ m.setup = 'actpass';
81
+ mediaDescriptions.push(m);
82
+ if (m.mid !== undefined)
83
+ mids.push(m.mid);
84
+ }
85
+ return {
86
+ version: 0,
87
+ origin: {
88
+ username: '-',
89
+ sessionId: nextSessionId(),
90
+ sessionVersion: 2,
91
+ networkType: 'IN',
92
+ addressType: 'IP4',
93
+ unicastAddress: '127.0.0.1',
94
+ },
95
+ sessionName: '-',
96
+ timing: { startTime: 0, stopTime: 0 },
97
+ groups: mids.length > 0 ? [{ semantic: 'BUNDLE', mids }] : [],
98
+ msidSemantic: 'WMS',
99
+ mediaDescriptions,
100
+ };
101
+ }
102
+ export function createAnswer(offer) {
103
+ const mediaDescriptions = offer.mediaDescriptions.map((offered) => {
104
+ const flippedDirection = flipDirection(offered.direction);
105
+ const m = {
106
+ ...offered,
107
+ rtpMaps: [...offered.rtpMaps],
108
+ fmtps: [...offered.fmtps],
109
+ rtcpFbs: [...offered.rtcpFbs],
110
+ candidates: [],
111
+ ssrcs: [],
112
+ ssrcGroups: [],
113
+ extmaps: [...offered.extmaps],
114
+ setup: offered.setup === 'actpass' ? 'passive' : 'active',
115
+ };
116
+ if (flippedDirection !== undefined) {
117
+ m.direction = flippedDirection;
118
+ }
119
+ else {
120
+ delete m.direction;
121
+ }
122
+ return m;
123
+ });
124
+ return {
125
+ version: 0,
126
+ origin: {
127
+ username: '-',
128
+ sessionId: nextSessionId(),
129
+ sessionVersion: 2,
130
+ networkType: 'IN',
131
+ addressType: 'IP4',
132
+ unicastAddress: '127.0.0.1',
133
+ },
134
+ sessionName: '-',
135
+ timing: { startTime: 0, stopTime: 0 },
136
+ groups: offer.groups.map((g) => ({ ...g, mids: [...g.mids] })),
137
+ ...(offer.msidSemantic !== undefined ? { msidSemantic: offer.msidSemantic } : {}),
138
+ mediaDescriptions,
139
+ };
140
+ }
141
+ function flipDirection(dir) {
142
+ switch (dir) {
143
+ case 'sendonly':
144
+ return 'recvonly';
145
+ case 'recvonly':
146
+ return 'sendonly';
147
+ default:
148
+ return dir; // sendrecv / inactive / undefined stay the same
149
+ }
150
+ }
151
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { SessionDescription, Origin, Timing, Group, MediaDescription, Direction, RtpMap, Fmtp, RtcpFb, IceCandidate, Fingerprint, Connection, Bandwidth, Ssrc, SsrcGroup, Extmap, RtcpAttr, } from './types.js';
2
+ export { parse, parseCandidate } from './parser.js';
3
+ export { serialize, serializeCandidate } from './serializer.js';
4
+ export { createOffer, createAnswer } from './helpers.js';
5
+ export type { CreateOfferOptions } from './helpers.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,MAAM,EACN,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,SAAS,EACT,MAAM,EACN,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,IAAI,EACJ,SAAS,EACT,MAAM,EACN,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { parse, parseCandidate } from './parser.js';
2
+ export { serialize, serializeCandidate } from './serializer.js';
3
+ export { createOffer, createAnswer } from './helpers.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SessionDescription, IceCandidate } from './types.js';
2
+ /**
3
+ * Parse the *value* of a candidate attribute (the part after "a=candidate:" or
4
+ * a bare "candidate:" prefix is also accepted for convenience).
5
+ */
6
+ export declare function parseCandidate(line: string): IceCandidate;
7
+ export declare function parse(sdp: string): SessionDescription;
8
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAUlB,YAAY,EAOb,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAmEzD;AAuJD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAqOrD"}
package/dist/parser.js ADDED
@@ -0,0 +1,434 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Candidate line parser (exported for standalone use)
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * Parse the *value* of a candidate attribute (the part after "a=candidate:" or
6
+ * a bare "candidate:" prefix is also accepted for convenience).
7
+ */
8
+ export function parseCandidate(line) {
9
+ // Strip optional "a=candidate:" or "candidate:" prefix
10
+ const value = line
11
+ .replace(/^a=candidate:/i, '')
12
+ .replace(/^candidate:/i, '');
13
+ const parts = value.trim().split(/\s+/);
14
+ if (parts.length < 8) {
15
+ throw new Error(`Invalid candidate line: ${line}`);
16
+ }
17
+ const foundation = parts[0];
18
+ const component = parseInt(parts[1], 10);
19
+ const transport = parts[2];
20
+ const priority = parseInt(parts[3], 10);
21
+ const address = parts[4];
22
+ const port = parseInt(parts[5], 10);
23
+ // parts[6] === 'typ'
24
+ const type = parts[7];
25
+ const candidate = {
26
+ foundation,
27
+ component,
28
+ transport,
29
+ priority,
30
+ address,
31
+ port,
32
+ type,
33
+ };
34
+ // Parse extension fields that come in key/value pairs after the type
35
+ let i = 8;
36
+ while (i < parts.length - 1) {
37
+ const key = parts[i];
38
+ const val = parts[i + 1];
39
+ i += 2;
40
+ switch (key.toLowerCase()) {
41
+ case 'raddr':
42
+ candidate.relatedAddress = val;
43
+ break;
44
+ case 'rport':
45
+ candidate.relatedPort = parseInt(val, 10);
46
+ break;
47
+ case 'tcptype':
48
+ candidate.tcpType = val;
49
+ break;
50
+ case 'generation':
51
+ candidate.generation = parseInt(val, 10);
52
+ break;
53
+ case 'ufrag':
54
+ candidate.ufrag = val;
55
+ break;
56
+ case 'network-id':
57
+ candidate.networkId = parseInt(val, 10);
58
+ break;
59
+ case 'network-cost':
60
+ candidate.networkCost = parseInt(val, 10);
61
+ break;
62
+ default: {
63
+ if (!candidate.extensions)
64
+ candidate.extensions = {};
65
+ candidate.extensions[key] = val;
66
+ }
67
+ }
68
+ }
69
+ return candidate;
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Helpers
73
+ // ---------------------------------------------------------------------------
74
+ function parseOrigin(value) {
75
+ const parts = value.split(' ');
76
+ if (parts.length < 6)
77
+ throw new Error(`Invalid origin line: ${value}`);
78
+ return {
79
+ username: parts[0],
80
+ sessionId: parts[1],
81
+ sessionVersion: parseInt(parts[2], 10),
82
+ networkType: parts[3],
83
+ addressType: parts[4],
84
+ unicastAddress: parts[5],
85
+ };
86
+ }
87
+ function parseTiming(value) {
88
+ const parts = value.split(' ');
89
+ return {
90
+ startTime: parseInt(parts[0] ?? '0', 10),
91
+ stopTime: parseInt(parts[1] ?? '0', 10),
92
+ };
93
+ }
94
+ function parseConnection(value) {
95
+ const parts = value.split(' ');
96
+ return {
97
+ networkType: parts[0],
98
+ addressType: parts[1],
99
+ address: parts[2],
100
+ };
101
+ }
102
+ function parseBandwidth(value) {
103
+ const idx = value.indexOf(':');
104
+ return {
105
+ type: value.substring(0, idx),
106
+ bandwidth: parseInt(value.substring(idx + 1), 10),
107
+ };
108
+ }
109
+ function parseRtpMap(value) {
110
+ // e.g. "111 opus/48000/2"
111
+ const spaceIdx = value.indexOf(' ');
112
+ const payloadType = parseInt(value.substring(0, spaceIdx), 10);
113
+ const rest = value.substring(spaceIdx + 1);
114
+ const slashParts = rest.split('/');
115
+ const encoding = slashParts[0];
116
+ const clockRate = parseInt(slashParts[1] ?? '0', 10);
117
+ const encodingParams = slashParts[2];
118
+ const result = { payloadType, encoding, clockRate };
119
+ if (encodingParams !== undefined)
120
+ result.encodingParams = encodingParams;
121
+ return result;
122
+ }
123
+ function parseFmtp(value) {
124
+ const spaceIdx = value.indexOf(' ');
125
+ const payloadType = parseInt(value.substring(0, spaceIdx), 10);
126
+ const parameters = value.substring(spaceIdx + 1);
127
+ return { payloadType, parameters };
128
+ }
129
+ function parseRtcpFb(value) {
130
+ // e.g. "111 transport-cc" or "96 ccm fir"
131
+ const parts = value.split(' ');
132
+ const payloadType = parseInt(parts[0], 10);
133
+ const type = parts[1];
134
+ const parameter = parts.length > 2 ? parts.slice(2).join(' ') : undefined;
135
+ const result = { payloadType, type };
136
+ if (parameter !== undefined)
137
+ result.parameter = parameter;
138
+ return result;
139
+ }
140
+ function parseSsrc(value) {
141
+ // e.g. "1234567890 cname:some-cname" or "1234567890 msid:stream1 audio1"
142
+ const spaceIdx = value.indexOf(' ');
143
+ const id = parseInt(value.substring(0, spaceIdx), 10);
144
+ const rest = value.substring(spaceIdx + 1);
145
+ const colonIdx = rest.indexOf(':');
146
+ if (colonIdx === -1) {
147
+ return { id, attribute: rest };
148
+ }
149
+ const attribute = rest.substring(0, colonIdx);
150
+ const val = rest.substring(colonIdx + 1);
151
+ const result = { id, attribute };
152
+ if (val !== '')
153
+ result.value = val;
154
+ return result;
155
+ }
156
+ function parseSsrcGroup(value) {
157
+ // e.g. "FID 2222222222 3333333333"
158
+ const parts = value.split(' ');
159
+ const semantic = parts[0];
160
+ const ssrcIds = parts.slice(1).map((s) => parseInt(s, 10));
161
+ return { semantic, ssrcIds };
162
+ }
163
+ function parseExtmap(value) {
164
+ // e.g. "1 urn:ietf:params:rtp-hdrext:ssrc-audio-level"
165
+ // "2/sendrecv urn:... some attributes"
166
+ const parts = value.split(' ');
167
+ const idPart = parts[0];
168
+ const uri = parts[1];
169
+ const attributes = parts.length > 2 ? parts.slice(2).join(' ') : undefined;
170
+ let id;
171
+ let direction;
172
+ const slashIdx = idPart.indexOf('/');
173
+ if (slashIdx !== -1) {
174
+ id = parseInt(idPart.substring(0, slashIdx), 10);
175
+ direction = idPart.substring(slashIdx + 1);
176
+ }
177
+ else {
178
+ id = parseInt(idPart, 10);
179
+ }
180
+ const result = { id, uri };
181
+ if (direction !== undefined)
182
+ result.direction = direction;
183
+ if (attributes !== undefined)
184
+ result.attributes = attributes;
185
+ return result;
186
+ }
187
+ function parseRtcpAttr(value) {
188
+ // e.g. "9 IN IP4 0.0.0.0" or just "9"
189
+ const parts = value.split(' ');
190
+ const port = parseInt(parts[0], 10);
191
+ const result = { port };
192
+ if (parts.length >= 4) {
193
+ result.networkType = parts[1];
194
+ result.addressType = parts[2];
195
+ result.address = parts[3];
196
+ }
197
+ return result;
198
+ }
199
+ function parseGroup(value) {
200
+ // e.g. "BUNDLE 0 1"
201
+ const parts = value.split(' ');
202
+ return {
203
+ semantic: parts[0],
204
+ mids: parts.slice(1),
205
+ };
206
+ }
207
+ // ---------------------------------------------------------------------------
208
+ // Main parser
209
+ // ---------------------------------------------------------------------------
210
+ export function parse(sdp) {
211
+ const lines = sdp.replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n');
212
+ // Defaults / placeholders
213
+ let version = 0;
214
+ let origin = {
215
+ username: '-',
216
+ sessionId: '0',
217
+ sessionVersion: 0,
218
+ networkType: 'IN',
219
+ addressType: 'IP4',
220
+ unicastAddress: '127.0.0.1',
221
+ };
222
+ let sessionName = '-';
223
+ let timing = { startTime: 0, stopTime: 0 };
224
+ const groups = [];
225
+ let msidSemantic;
226
+ const mediaDescriptions = [];
227
+ let currentMedia = null;
228
+ for (const rawLine of lines) {
229
+ const line = rawLine.trim();
230
+ if (line === '')
231
+ continue;
232
+ const typeChar = line[0];
233
+ if (line[1] !== '=')
234
+ continue; // malformed — skip
235
+ const value = line.substring(2);
236
+ if (currentMedia === null) {
237
+ // Session-level parsing
238
+ switch (typeChar) {
239
+ case 'v':
240
+ version = parseInt(value, 10);
241
+ break;
242
+ case 'o':
243
+ origin = parseOrigin(value);
244
+ break;
245
+ case 's':
246
+ sessionName = value;
247
+ break;
248
+ case 't':
249
+ timing = parseTiming(value);
250
+ break;
251
+ case 'c':
252
+ // session-level connection — we'll attach to first media or ignore
253
+ break;
254
+ case 'a': {
255
+ const eqIdx = value.indexOf(':');
256
+ const attrName = eqIdx === -1 ? value : value.substring(0, eqIdx);
257
+ const attrVal = eqIdx === -1 ? '' : value.substring(eqIdx + 1);
258
+ switch (attrName) {
259
+ case 'group':
260
+ groups.push(parseGroup(attrVal));
261
+ break;
262
+ case 'msid-semantic':
263
+ msidSemantic = attrVal.trim();
264
+ break;
265
+ // extmap-allow-mixed is a session-level attr we just ignore for the model
266
+ }
267
+ break;
268
+ }
269
+ case 'm': {
270
+ // Start a new media section
271
+ // "audio 9 UDP/TLS/RTP/SAVPF 111 63 9 0 8 13 110 126"
272
+ const mParts = value.split(' ');
273
+ const mType = mParts[0];
274
+ const mPort = parseInt(mParts[1], 10);
275
+ const mProtocol = mParts[2];
276
+ const payloadTypes = mParts
277
+ .slice(3)
278
+ .map((s) => parseInt(s, 10))
279
+ .filter((n) => !isNaN(n));
280
+ currentMedia = {
281
+ type: mType,
282
+ port: mPort,
283
+ protocol: mProtocol,
284
+ payloadTypes,
285
+ rtpMaps: [],
286
+ fmtps: [],
287
+ rtcpFbs: [],
288
+ candidates: [],
289
+ ssrcs: [],
290
+ ssrcGroups: [],
291
+ extmaps: [],
292
+ };
293
+ mediaDescriptions.push(currentMedia);
294
+ break;
295
+ }
296
+ }
297
+ }
298
+ else {
299
+ // Media-level parsing
300
+ switch (typeChar) {
301
+ case 'm': {
302
+ // Start another media section
303
+ const mParts = value.split(' ');
304
+ const mType = mParts[0];
305
+ const mPort = parseInt(mParts[1], 10);
306
+ const mProtocol = mParts[2];
307
+ const payloadTypes = mParts
308
+ .slice(3)
309
+ .map((s) => parseInt(s, 10))
310
+ .filter((n) => !isNaN(n));
311
+ currentMedia = {
312
+ type: mType,
313
+ port: mPort,
314
+ protocol: mProtocol,
315
+ payloadTypes,
316
+ rtpMaps: [],
317
+ fmtps: [],
318
+ rtcpFbs: [],
319
+ candidates: [],
320
+ ssrcs: [],
321
+ ssrcGroups: [],
322
+ extmaps: [],
323
+ };
324
+ mediaDescriptions.push(currentMedia);
325
+ break;
326
+ }
327
+ case 'c':
328
+ currentMedia.connection = parseConnection(value);
329
+ break;
330
+ case 'b':
331
+ currentMedia.bandwidth = parseBandwidth(value);
332
+ break;
333
+ case 'a': {
334
+ const eqIdx = value.indexOf(':');
335
+ const attrName = eqIdx === -1 ? value : value.substring(0, eqIdx);
336
+ const attrVal = eqIdx === -1 ? '' : value.substring(eqIdx + 1);
337
+ switch (attrName) {
338
+ case 'rtpmap':
339
+ currentMedia.rtpMaps.push(parseRtpMap(attrVal));
340
+ break;
341
+ case 'fmtp':
342
+ currentMedia.fmtps.push(parseFmtp(attrVal));
343
+ break;
344
+ case 'rtcp-fb':
345
+ currentMedia.rtcpFbs.push(parseRtcpFb(attrVal));
346
+ break;
347
+ case 'candidate':
348
+ currentMedia.candidates.push(parseCandidate(attrVal));
349
+ break;
350
+ case 'ice-ufrag':
351
+ currentMedia.iceUfrag = attrVal;
352
+ break;
353
+ case 'ice-pwd':
354
+ currentMedia.icePwd = attrVal;
355
+ break;
356
+ case 'ice-options':
357
+ currentMedia.iceOptions = attrVal;
358
+ break;
359
+ case 'ice-gathering-state':
360
+ currentMedia.iceGatheringState = attrVal;
361
+ break;
362
+ case 'fingerprint': {
363
+ const spaceIdx = attrVal.indexOf(' ');
364
+ currentMedia.fingerprint = {
365
+ algorithm: attrVal.substring(0, spaceIdx),
366
+ value: attrVal.substring(spaceIdx + 1),
367
+ };
368
+ break;
369
+ }
370
+ case 'setup':
371
+ currentMedia.setup = attrVal;
372
+ break;
373
+ case 'mid':
374
+ currentMedia.mid = attrVal;
375
+ break;
376
+ case 'sendrecv':
377
+ case 'sendonly':
378
+ case 'recvonly':
379
+ case 'inactive':
380
+ currentMedia.direction = attrName;
381
+ break;
382
+ case 'rtcp':
383
+ currentMedia.rtcp = parseRtcpAttr(attrVal);
384
+ break;
385
+ case 'rtcp-mux':
386
+ currentMedia.rtcpMux = true;
387
+ break;
388
+ case 'rtcp-rsize':
389
+ currentMedia.rtcpRsize = true;
390
+ break;
391
+ case 'ssrc':
392
+ currentMedia.ssrcs.push(parseSsrc(attrVal));
393
+ break;
394
+ case 'ssrc-group':
395
+ currentMedia.ssrcGroups.push(parseSsrcGroup(attrVal));
396
+ break;
397
+ case 'msid':
398
+ currentMedia.msid = attrVal;
399
+ break;
400
+ case 'extmap':
401
+ currentMedia.extmaps.push(parseExtmap(attrVal));
402
+ break;
403
+ case 'sctp-port':
404
+ currentMedia.sctpPort = parseInt(attrVal, 10);
405
+ break;
406
+ case 'max-message-size':
407
+ currentMedia.maxMessageSize = parseInt(attrVal, 10);
408
+ break;
409
+ case 'end-of-candidates':
410
+ currentMedia.endOfCandidates = true;
411
+ break;
412
+ // group / msid-semantic can also appear at media level in some implementations
413
+ case 'group':
414
+ // media-level group — ignore for now (unusual)
415
+ break;
416
+ }
417
+ break;
418
+ }
419
+ }
420
+ }
421
+ }
422
+ const result = {
423
+ version,
424
+ origin,
425
+ sessionName,
426
+ timing,
427
+ groups,
428
+ mediaDescriptions,
429
+ };
430
+ if (msidSemantic !== undefined)
431
+ result.msidSemantic = msidSemantic;
432
+ return result;
433
+ }
434
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}