@tomgiee/tsdp 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.
- package/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/src/builder/media-builder.d.ts +221 -0
- package/dist/src/builder/media-builder.d.ts.map +1 -0
- package/dist/src/builder/media-builder.js +385 -0
- package/dist/src/builder/session-builder.d.ts +195 -0
- package/dist/src/builder/session-builder.d.ts.map +1 -0
- package/dist/src/builder/session-builder.js +366 -0
- package/dist/src/index.d.ts +67 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +250 -0
- package/dist/src/parser/attribute-parser.d.ts +100 -0
- package/dist/src/parser/attribute-parser.d.ts.map +1 -0
- package/dist/src/parser/attribute-parser.js +217 -0
- package/dist/src/parser/field-parser.d.ts +124 -0
- package/dist/src/parser/field-parser.d.ts.map +1 -0
- package/dist/src/parser/field-parser.js +335 -0
- package/dist/src/parser/media-parser.d.ts +45 -0
- package/dist/src/parser/media-parser.d.ts.map +1 -0
- package/dist/src/parser/media-parser.js +157 -0
- package/dist/src/parser/primitive-parser.d.ts +138 -0
- package/dist/src/parser/primitive-parser.d.ts.map +1 -0
- package/dist/src/parser/primitive-parser.js +316 -0
- package/dist/src/parser/scanner.d.ts +142 -0
- package/dist/src/parser/scanner.d.ts.map +1 -0
- package/dist/src/parser/scanner.js +284 -0
- package/dist/src/parser/session-parser.d.ts +35 -0
- package/dist/src/parser/session-parser.d.ts.map +1 -0
- package/dist/src/parser/session-parser.js +207 -0
- package/dist/src/parser/time-parser.d.ts +74 -0
- package/dist/src/parser/time-parser.d.ts.map +1 -0
- package/dist/src/parser/time-parser.js +168 -0
- package/dist/src/serializer/attribute-serializer.d.ts +18 -0
- package/dist/src/serializer/attribute-serializer.d.ts.map +1 -0
- package/dist/src/serializer/attribute-serializer.js +34 -0
- package/dist/src/serializer/field-serializer.d.ts +112 -0
- package/dist/src/serializer/field-serializer.d.ts.map +1 -0
- package/dist/src/serializer/field-serializer.js +212 -0
- package/dist/src/serializer/media-serializer.d.ts +31 -0
- package/dist/src/serializer/media-serializer.d.ts.map +1 -0
- package/dist/src/serializer/media-serializer.js +83 -0
- package/dist/src/serializer/session-serializer.d.ts +29 -0
- package/dist/src/serializer/session-serializer.d.ts.map +1 -0
- package/dist/src/serializer/session-serializer.js +99 -0
- package/dist/src/serializer/time-serializer.d.ts +46 -0
- package/dist/src/serializer/time-serializer.d.ts.map +1 -0
- package/dist/src/serializer/time-serializer.js +86 -0
- package/dist/src/types/attributes.d.ts +318 -0
- package/dist/src/types/attributes.d.ts.map +1 -0
- package/dist/src/types/attributes.js +225 -0
- package/dist/src/types/errors.d.ts +129 -0
- package/dist/src/types/errors.d.ts.map +1 -0
- package/dist/src/types/errors.js +186 -0
- package/dist/src/types/fields.d.ts +100 -0
- package/dist/src/types/fields.d.ts.map +1 -0
- package/dist/src/types/fields.js +48 -0
- package/dist/src/types/media.d.ts +148 -0
- package/dist/src/types/media.d.ts.map +1 -0
- package/dist/src/types/media.js +137 -0
- package/dist/src/types/network.d.ts +136 -0
- package/dist/src/types/network.d.ts.map +1 -0
- package/dist/src/types/network.js +130 -0
- package/dist/src/types/primitives.d.ts +193 -0
- package/dist/src/types/primitives.d.ts.map +1 -0
- package/dist/src/types/primitives.js +195 -0
- package/dist/src/types/session.d.ts +122 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +81 -0
- package/dist/src/types/time.d.ts +129 -0
- package/dist/src/types/time.d.ts.map +1 -0
- package/dist/src/types/time.js +84 -0
- package/dist/src/utils/address-parser.d.ts +100 -0
- package/dist/src/utils/address-parser.d.ts.map +1 -0
- package/dist/src/utils/address-parser.js +338 -0
- package/dist/src/utils/format-validators.d.ts +77 -0
- package/dist/src/utils/format-validators.d.ts.map +1 -0
- package/dist/src/utils/format-validators.js +504 -0
- package/dist/src/utils/line-reader.d.ts +84 -0
- package/dist/src/utils/line-reader.d.ts.map +1 -0
- package/dist/src/utils/line-reader.js +169 -0
- package/dist/src/utils/time-converter.d.ts +99 -0
- package/dist/src/utils/time-converter.d.ts.map +1 -0
- package/dist/src/utils/time-converter.js +195 -0
- package/dist/src/validator/media-validator.d.ts +27 -0
- package/dist/src/validator/media-validator.d.ts.map +1 -0
- package/dist/src/validator/media-validator.js +241 -0
- package/dist/src/validator/semantic-validator.d.ts +47 -0
- package/dist/src/validator/semantic-validator.d.ts.map +1 -0
- package/dist/src/validator/semantic-validator.js +207 -0
- package/dist/src/validator/session-validator.d.ts +36 -0
- package/dist/src/validator/session-validator.d.ts.map +1 -0
- package/dist/src/validator/session-validator.js +280 -0
- package/dist/tests/integration/round-trip.test.d.ts +5 -0
- package/dist/tests/integration/round-trip.test.d.ts.map +1 -0
- package/dist/tests/integration/round-trip.test.js +320 -0
- package/dist/tests/integration/voip-examples.test.d.ts +5 -0
- package/dist/tests/integration/voip-examples.test.d.ts.map +1 -0
- package/dist/tests/integration/voip-examples.test.js +361 -0
- package/dist/tests/unit/builder/media-builder.test.d.ts +5 -0
- package/dist/tests/unit/builder/media-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/builder/media-builder.test.js +524 -0
- package/dist/tests/unit/builder/session-builder.test.d.ts +5 -0
- package/dist/tests/unit/builder/session-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/builder/session-builder.test.js +367 -0
- package/dist/tests/unit/parser/attribute-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/attribute-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/attribute-parser.test.js +319 -0
- package/dist/tests/unit/parser/field-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/field-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/field-parser.test.js +355 -0
- package/dist/tests/unit/parser/media-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/media-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/media-parser.test.js +241 -0
- package/dist/tests/unit/parser/primitive-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/primitive-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/primitive-parser.test.js +261 -0
- package/dist/tests/unit/parser/scanner.test.d.ts +5 -0
- package/dist/tests/unit/parser/scanner.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/scanner.test.js +241 -0
- package/dist/tests/unit/parser/session-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/session-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/session-parser.test.js +346 -0
- package/dist/tests/unit/parser/time-parser.test.d.ts +5 -0
- package/dist/tests/unit/parser/time-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/parser/time-parser.test.js +173 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/attribute-serializer.test.js +78 -0
- package/dist/tests/unit/serializer/field-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/field-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/field-serializer.test.js +159 -0
- package/dist/tests/unit/serializer/media-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/media-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/media-serializer.test.js +155 -0
- package/dist/tests/unit/serializer/session-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/session-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/session-serializer.test.js +317 -0
- package/dist/tests/unit/serializer/time-serializer.test.d.ts +5 -0
- package/dist/tests/unit/serializer/time-serializer.test.d.ts.map +1 -0
- package/dist/tests/unit/serializer/time-serializer.test.js +115 -0
- package/dist/tests/unit/types/errors.test.d.ts +5 -0
- package/dist/tests/unit/types/errors.test.d.ts.map +1 -0
- package/dist/tests/unit/types/errors.test.js +127 -0
- package/dist/tests/unit/types/network.test.d.ts +5 -0
- package/dist/tests/unit/types/network.test.d.ts.map +1 -0
- package/dist/tests/unit/types/network.test.js +132 -0
- package/dist/tests/unit/types/primitives.test.d.ts +5 -0
- package/dist/tests/unit/types/primitives.test.d.ts.map +1 -0
- package/dist/tests/unit/types/primitives.test.js +108 -0
- package/dist/tests/unit/utils/address-parser.test.d.ts +5 -0
- package/dist/tests/unit/utils/address-parser.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/address-parser.test.js +203 -0
- package/dist/tests/unit/utils/format-validators.test.d.ts +5 -0
- package/dist/tests/unit/utils/format-validators.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/format-validators.test.js +224 -0
- package/dist/tests/unit/utils/line-reader.test.d.ts +5 -0
- package/dist/tests/unit/utils/line-reader.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/line-reader.test.js +157 -0
- package/dist/tests/unit/utils/time-converter.test.d.ts +5 -0
- package/dist/tests/unit/utils/time-converter.test.d.ts.map +1 -0
- package/dist/tests/unit/utils/time-converter.test.js +190 -0
- package/dist/tests/unit/validator/media-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/media-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/media-validator.test.js +313 -0
- package/dist/tests/unit/validator/semantic-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/semantic-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/semantic-validator.test.js +262 -0
- package/dist/tests/unit/validator/session-validator.test.d.ts +5 -0
- package/dist/tests/unit/validator/session-validator.test.d.ts.map +1 -0
- package/dist/tests/unit/validator/session-validator.test.js +447 -0
- package/package.json +50 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Primitive types and enums for SDP (RFC 8866)
|
|
3
|
+
*
|
|
4
|
+
* This module defines branded primitive types to ensure type safety at compile time
|
|
5
|
+
* and enums for various SDP field values.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Position in the input text for error reporting
|
|
9
|
+
*/
|
|
10
|
+
export interface Position {
|
|
11
|
+
/** Character offset from start of input */
|
|
12
|
+
readonly offset: number;
|
|
13
|
+
/** Line number (1-indexed) */
|
|
14
|
+
readonly line: number;
|
|
15
|
+
/** Column number (1-indexed) */
|
|
16
|
+
readonly column: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Branded type to prevent mixing different string types
|
|
20
|
+
* Provides compile-time safety with no runtime overhead
|
|
21
|
+
*/
|
|
22
|
+
type Brand<T, B> = T & {
|
|
23
|
+
readonly __brand: B;
|
|
24
|
+
};
|
|
25
|
+
/** SDP version number (currently always 0) */
|
|
26
|
+
export type Version = Brand<number, 'Version'>;
|
|
27
|
+
/** Session name (required field) */
|
|
28
|
+
export type SessionName = Brand<string, 'SessionName'>;
|
|
29
|
+
/** Username for origin field */
|
|
30
|
+
export type Username = Brand<string, 'Username'>;
|
|
31
|
+
/** Session ID (NTP timestamp) */
|
|
32
|
+
export type SessionId = Brand<string, 'SessionId'>;
|
|
33
|
+
/** Session version number (NTP timestamp) */
|
|
34
|
+
export type SessionVersion = Brand<string, 'SessionVersion'>;
|
|
35
|
+
/** Session or media information text */
|
|
36
|
+
export type Information = Brand<string, 'Information'>;
|
|
37
|
+
/** URI reference */
|
|
38
|
+
export type URI = Brand<string, 'URI'>;
|
|
39
|
+
/** Email address (with optional display name) */
|
|
40
|
+
export type Email = Brand<string, 'Email'>;
|
|
41
|
+
/** Phone number (with optional display name) */
|
|
42
|
+
export type Phone = Brand<string, 'Phone'>;
|
|
43
|
+
/** Encryption key (OBSOLETE per RFC 8866) */
|
|
44
|
+
export type Key = Brand<string, 'Key'>;
|
|
45
|
+
/** Bandwidth type (CT, AS, or extension) */
|
|
46
|
+
export type BandwidthType = Brand<string, 'BandwidthType'>;
|
|
47
|
+
/** Transport protocol (RTP/AVP, RTP/SAVP, udp, etc.) */
|
|
48
|
+
export type Protocol = Brand<string, 'Protocol'>;
|
|
49
|
+
/** Media format (payload type or media subtype) */
|
|
50
|
+
export type Format = Brand<string, 'Format'>;
|
|
51
|
+
/** Attribute name */
|
|
52
|
+
export type AttributeName = Brand<string, 'AttributeName'>;
|
|
53
|
+
/** Attribute value */
|
|
54
|
+
export type AttributeValue = Brand<string, 'AttributeValue'>;
|
|
55
|
+
/** Token (sequence of token-chars: ALPHA/DIGIT/special) */
|
|
56
|
+
export type Token = Brand<string, 'Token'>;
|
|
57
|
+
/** Byte string (sequence of bytes 0x01-0x09, 0x0B-0x0C, 0x0E-0xFF) */
|
|
58
|
+
export type ByteString = Brand<string, 'ByteString'>;
|
|
59
|
+
/** Non-whitespace string (sequence of non-whitespace chars) */
|
|
60
|
+
export type NonWSString = Brand<string, 'NonWSString'>;
|
|
61
|
+
/**
|
|
62
|
+
* Network type (RFC 8866 Section 5.2)
|
|
63
|
+
* Currently only 'IN' (Internet) is defined, but extensible via IANA registration
|
|
64
|
+
*/
|
|
65
|
+
export type NetType = 'IN' | string;
|
|
66
|
+
/**
|
|
67
|
+
* Address type (RFC 8866 Section 5.2)
|
|
68
|
+
* IP4, IP6, or extension types via IANA registration
|
|
69
|
+
*/
|
|
70
|
+
export type AddrType = 'IP4' | 'IP6' | string;
|
|
71
|
+
/**
|
|
72
|
+
* Media type (RFC 8866 Section 5.14)
|
|
73
|
+
* Defines the type of media in a media description
|
|
74
|
+
*/
|
|
75
|
+
export type MediaType = 'audio' | 'video' | 'text' | 'application' | 'message' | 'image' | string;
|
|
76
|
+
/**
|
|
77
|
+
* NTP timestamp (seconds since January 1, 1900 UTC)
|
|
78
|
+
* Special value 0 means "unbounded" or "permanent"
|
|
79
|
+
*
|
|
80
|
+
* RFC 8866 uses NTP time (epoch 1900) not Unix time (epoch 1970)
|
|
81
|
+
*/
|
|
82
|
+
export type NtpTime = Brand<number, 'NtpTime'>;
|
|
83
|
+
/**
|
|
84
|
+
* Time unit for typed time values
|
|
85
|
+
*/
|
|
86
|
+
export type TimeUnit = 'days' | 'hours' | 'minutes' | 'seconds';
|
|
87
|
+
/**
|
|
88
|
+
* Typed time with unit suffix (d/h/m/s)
|
|
89
|
+
* Examples: "7d" (7 days), "3h" (3 hours), "120m" (120 minutes), "3600" (3600 seconds)
|
|
90
|
+
*/
|
|
91
|
+
export interface TypedTime {
|
|
92
|
+
readonly value: number;
|
|
93
|
+
readonly unit: TimeUnit;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if a string contains only digits (0-9)
|
|
97
|
+
*
|
|
98
|
+
* Per RFC 8866 Section 9 (Grammar):
|
|
99
|
+
* - sess-id = 1*DIGIT
|
|
100
|
+
* - sess-version = 1*DIGIT
|
|
101
|
+
*
|
|
102
|
+
* @param value - String to validate
|
|
103
|
+
* @returns true if string contains one or more digits only
|
|
104
|
+
*/
|
|
105
|
+
export declare function isNumericString(value: string): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Create a Version (currently must be 0)
|
|
108
|
+
*/
|
|
109
|
+
export declare function createVersion(value: number): Version;
|
|
110
|
+
/**
|
|
111
|
+
* Create a SessionName from a string
|
|
112
|
+
*/
|
|
113
|
+
export declare function createSessionName(value: string): SessionName;
|
|
114
|
+
/**
|
|
115
|
+
* Create a Username from a string
|
|
116
|
+
*/
|
|
117
|
+
export declare function createUsername(value: string): Username;
|
|
118
|
+
/**
|
|
119
|
+
* Create a SessionId from a string
|
|
120
|
+
*/
|
|
121
|
+
export declare function createSessionId(value: string): SessionId;
|
|
122
|
+
/**
|
|
123
|
+
* Create a SessionVersion from a string
|
|
124
|
+
*/
|
|
125
|
+
export declare function createSessionVersion(value: string): SessionVersion;
|
|
126
|
+
/**
|
|
127
|
+
* Create an Information string
|
|
128
|
+
*/
|
|
129
|
+
export declare function createInformation(value: string): Information;
|
|
130
|
+
/**
|
|
131
|
+
* Create a URI
|
|
132
|
+
*/
|
|
133
|
+
export declare function createURI(value: string): URI;
|
|
134
|
+
/**
|
|
135
|
+
* Create an Email
|
|
136
|
+
*/
|
|
137
|
+
export declare function createEmail(value: string): Email;
|
|
138
|
+
/**
|
|
139
|
+
* Create a Phone
|
|
140
|
+
*/
|
|
141
|
+
export declare function createPhone(value: string): Phone;
|
|
142
|
+
/**
|
|
143
|
+
* Create a Key (OBSOLETE but must support for compatibility)
|
|
144
|
+
*/
|
|
145
|
+
export declare function createKey(value: string): Key;
|
|
146
|
+
/**
|
|
147
|
+
* Create a BandwidthType
|
|
148
|
+
*/
|
|
149
|
+
export declare function createBandwidthType(value: string): BandwidthType;
|
|
150
|
+
/**
|
|
151
|
+
* Create a MediaType
|
|
152
|
+
*/
|
|
153
|
+
export declare function createMediaType(value: string): MediaType;
|
|
154
|
+
/**
|
|
155
|
+
* Create a Protocol
|
|
156
|
+
*/
|
|
157
|
+
export declare function createProtocol(value: string): Protocol;
|
|
158
|
+
/**
|
|
159
|
+
* Create a Format
|
|
160
|
+
*/
|
|
161
|
+
export declare function createFormat(value: string): Format;
|
|
162
|
+
/**
|
|
163
|
+
* Create an AttributeName
|
|
164
|
+
*/
|
|
165
|
+
export declare function createAttributeName(value: string): AttributeName;
|
|
166
|
+
/**
|
|
167
|
+
* Create an AttributeValue
|
|
168
|
+
*/
|
|
169
|
+
export declare function createAttributeValue(value: string): AttributeValue;
|
|
170
|
+
/**
|
|
171
|
+
* Create a Token
|
|
172
|
+
*/
|
|
173
|
+
export declare function createToken(value: string): Token;
|
|
174
|
+
/**
|
|
175
|
+
* Create a ByteString
|
|
176
|
+
*/
|
|
177
|
+
export declare function createByteString(value: string): ByteString;
|
|
178
|
+
/**
|
|
179
|
+
* Create a NonWSString
|
|
180
|
+
*/
|
|
181
|
+
export declare function createNonWSString(value: string): NonWSString;
|
|
182
|
+
/**
|
|
183
|
+
* Create an NtpTime
|
|
184
|
+
*/
|
|
185
|
+
export declare function createNtpTime(value: number): NtpTime;
|
|
186
|
+
/**
|
|
187
|
+
* Create a TypedTime
|
|
188
|
+
*
|
|
189
|
+
* Note: Value can be negative for timezone offsets
|
|
190
|
+
*/
|
|
191
|
+
export declare function createTypedTime(value: number, unit: TimeUnit): TypedTime;
|
|
192
|
+
export {};
|
|
193
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../src/types/primitives.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAMD;;;GAGG;AACH,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAE/C,8CAA8C;AAC9C,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C,oCAAoC;AACpC,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAEvD,gCAAgC;AAChC,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD,iCAAiC;AACjC,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEnD,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE7D,wCAAwC;AACxC,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAEvD,oBAAoB;AACpB,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvC,iDAAiD;AACjD,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,gDAAgD;AAChD,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,6CAA6C;AAC7C,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvC,4CAA4C;AAC5C,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE3D,wDAAwD;AACxD,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAEjD,mDAAmD;AACnD,MAAM,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE7C,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAE3D,sBAAsB;AACtB,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE7D,2DAA2D;AAC3D,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,sEAAsE;AACtE,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAErD,+DAA+D;AAC/D,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAMvD;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAM9C;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,OAAO,GACP,MAAM,GACN,aAAa,GACb,SAAS,GACT,OAAO,GACP,MAAM,CAAC;AAMX;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAaD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAK5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAKtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAExD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAElE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAE5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAE5C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAE5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAExD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAEtD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAEhE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAElE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAEhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAE1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAE5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAExE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Primitive types and enums for SDP (RFC 8866)
|
|
4
|
+
*
|
|
5
|
+
* This module defines branded primitive types to ensure type safety at compile time
|
|
6
|
+
* and enums for various SDP field values.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.isNumericString = isNumericString;
|
|
10
|
+
exports.createVersion = createVersion;
|
|
11
|
+
exports.createSessionName = createSessionName;
|
|
12
|
+
exports.createUsername = createUsername;
|
|
13
|
+
exports.createSessionId = createSessionId;
|
|
14
|
+
exports.createSessionVersion = createSessionVersion;
|
|
15
|
+
exports.createInformation = createInformation;
|
|
16
|
+
exports.createURI = createURI;
|
|
17
|
+
exports.createEmail = createEmail;
|
|
18
|
+
exports.createPhone = createPhone;
|
|
19
|
+
exports.createKey = createKey;
|
|
20
|
+
exports.createBandwidthType = createBandwidthType;
|
|
21
|
+
exports.createMediaType = createMediaType;
|
|
22
|
+
exports.createProtocol = createProtocol;
|
|
23
|
+
exports.createFormat = createFormat;
|
|
24
|
+
exports.createAttributeName = createAttributeName;
|
|
25
|
+
exports.createAttributeValue = createAttributeValue;
|
|
26
|
+
exports.createToken = createToken;
|
|
27
|
+
exports.createByteString = createByteString;
|
|
28
|
+
exports.createNonWSString = createNonWSString;
|
|
29
|
+
exports.createNtpTime = createNtpTime;
|
|
30
|
+
exports.createTypedTime = createTypedTime;
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Validation Helpers
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Regular expression for numeric strings per RFC 8866 grammar
|
|
36
|
+
* sess-id = 1*DIGIT
|
|
37
|
+
* sess-version = 1*DIGIT
|
|
38
|
+
*/
|
|
39
|
+
const NUMERIC_STRING_REGEX = /^[0-9]+$/;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a string contains only digits (0-9)
|
|
42
|
+
*
|
|
43
|
+
* Per RFC 8866 Section 9 (Grammar):
|
|
44
|
+
* - sess-id = 1*DIGIT
|
|
45
|
+
* - sess-version = 1*DIGIT
|
|
46
|
+
*
|
|
47
|
+
* @param value - String to validate
|
|
48
|
+
* @returns true if string contains one or more digits only
|
|
49
|
+
*/
|
|
50
|
+
function isNumericString(value) {
|
|
51
|
+
return value.length > 0 && NUMERIC_STRING_REGEX.test(value);
|
|
52
|
+
}
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Helper Functions for Creating Branded Types
|
|
55
|
+
// ============================================================================
|
|
56
|
+
/**
|
|
57
|
+
* Create a Version (currently must be 0)
|
|
58
|
+
*/
|
|
59
|
+
function createVersion(value) {
|
|
60
|
+
if (value !== 0) {
|
|
61
|
+
throw new Error(`Invalid SDP version: ${value}. Currently only version 0 is defined.`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a SessionName from a string
|
|
67
|
+
*/
|
|
68
|
+
function createSessionName(value) {
|
|
69
|
+
if (value.length === 0) {
|
|
70
|
+
throw new Error('Session name cannot be empty');
|
|
71
|
+
}
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a Username from a string
|
|
76
|
+
*/
|
|
77
|
+
function createUsername(value) {
|
|
78
|
+
if (value.length === 0) {
|
|
79
|
+
throw new Error('Username cannot be empty');
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a SessionId from a string
|
|
85
|
+
*/
|
|
86
|
+
function createSessionId(value) {
|
|
87
|
+
return value;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a SessionVersion from a string
|
|
91
|
+
*/
|
|
92
|
+
function createSessionVersion(value) {
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create an Information string
|
|
97
|
+
*/
|
|
98
|
+
function createInformation(value) {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a URI
|
|
103
|
+
*/
|
|
104
|
+
function createURI(value) {
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create an Email
|
|
109
|
+
*/
|
|
110
|
+
function createEmail(value) {
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a Phone
|
|
115
|
+
*/
|
|
116
|
+
function createPhone(value) {
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a Key (OBSOLETE but must support for compatibility)
|
|
121
|
+
*/
|
|
122
|
+
function createKey(value) {
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create a BandwidthType
|
|
127
|
+
*/
|
|
128
|
+
function createBandwidthType(value) {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Create a MediaType
|
|
133
|
+
*/
|
|
134
|
+
function createMediaType(value) {
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a Protocol
|
|
139
|
+
*/
|
|
140
|
+
function createProtocol(value) {
|
|
141
|
+
return value;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create a Format
|
|
145
|
+
*/
|
|
146
|
+
function createFormat(value) {
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create an AttributeName
|
|
151
|
+
*/
|
|
152
|
+
function createAttributeName(value) {
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create an AttributeValue
|
|
157
|
+
*/
|
|
158
|
+
function createAttributeValue(value) {
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create a Token
|
|
163
|
+
*/
|
|
164
|
+
function createToken(value) {
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Create a ByteString
|
|
169
|
+
*/
|
|
170
|
+
function createByteString(value) {
|
|
171
|
+
return value;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create a NonWSString
|
|
175
|
+
*/
|
|
176
|
+
function createNonWSString(value) {
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create an NtpTime
|
|
181
|
+
*/
|
|
182
|
+
function createNtpTime(value) {
|
|
183
|
+
if (value < 0) {
|
|
184
|
+
throw new Error('NTP time cannot be negative');
|
|
185
|
+
}
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a TypedTime
|
|
190
|
+
*
|
|
191
|
+
* Note: Value can be negative for timezone offsets
|
|
192
|
+
*/
|
|
193
|
+
function createTypedTime(value, unit) {
|
|
194
|
+
return { value, unit };
|
|
195
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Description type for SDP (RFC 8866)
|
|
3
|
+
*
|
|
4
|
+
* This is the main type representing a complete SDP session description.
|
|
5
|
+
*/
|
|
6
|
+
import { Version, SessionName, Information, URI, Email, Phone, Key } from './primitives';
|
|
7
|
+
import { Origin, Connection, Bandwidth } from './fields';
|
|
8
|
+
import { TimeDescription } from './time';
|
|
9
|
+
import { Attribute } from './attributes';
|
|
10
|
+
import { MediaDescription } from './media';
|
|
11
|
+
/**
|
|
12
|
+
* SessionDescription (RFC 8866)
|
|
13
|
+
*
|
|
14
|
+
* A complete SDP session description following the exact field ordering
|
|
15
|
+
* required by RFC 8866 Section 5.0.
|
|
16
|
+
*
|
|
17
|
+
* Field Ordering (MUST be in this order):
|
|
18
|
+
* 1. v= (version) [required]
|
|
19
|
+
* 2. o= (origin) [required]
|
|
20
|
+
* 3. s= (session name) [required]
|
|
21
|
+
* 4. i= (session information) [optional]
|
|
22
|
+
* 5. u= (URI) [optional]
|
|
23
|
+
* 6. e= (email) [optional, multiple]
|
|
24
|
+
* 7. p= (phone) [optional, multiple]
|
|
25
|
+
* 8. c= (connection) [optional]
|
|
26
|
+
* 9. b= (bandwidth) [optional, multiple]
|
|
27
|
+
* 10. Time descriptions [required, one or more]
|
|
28
|
+
* 11. k= (encryption key) [optional, OBSOLETE]
|
|
29
|
+
* 12. a= (attributes) [optional, multiple]
|
|
30
|
+
* 13. Media descriptions [optional, zero or more]
|
|
31
|
+
*/
|
|
32
|
+
export interface SessionDescription {
|
|
33
|
+
/**
|
|
34
|
+
* Protocol version (currently 0)
|
|
35
|
+
*/
|
|
36
|
+
readonly version: Version;
|
|
37
|
+
/**
|
|
38
|
+
* Origin of the session
|
|
39
|
+
* Contains username, session ID, version, network type, address type, and address
|
|
40
|
+
*/
|
|
41
|
+
readonly origin: Origin;
|
|
42
|
+
/**
|
|
43
|
+
* Session name (required, use " " if no meaningful name)
|
|
44
|
+
*/
|
|
45
|
+
readonly sessionName: SessionName;
|
|
46
|
+
/**
|
|
47
|
+
* Session information/title (optional)
|
|
48
|
+
*/
|
|
49
|
+
readonly sessionInformation?: Information;
|
|
50
|
+
/**
|
|
51
|
+
* URI for more information about the session (optional)
|
|
52
|
+
*/
|
|
53
|
+
readonly uri?: URI;
|
|
54
|
+
/**
|
|
55
|
+
* Email addresses for contact (optional, multiple allowed)
|
|
56
|
+
*/
|
|
57
|
+
readonly emails: readonly Email[];
|
|
58
|
+
/**
|
|
59
|
+
* Phone numbers for contact (optional, multiple allowed)
|
|
60
|
+
*/
|
|
61
|
+
readonly phones: readonly Phone[];
|
|
62
|
+
/**
|
|
63
|
+
* Connection information for the session (optional if present in all media)
|
|
64
|
+
* If omitted, each media description MUST have connection information
|
|
65
|
+
*/
|
|
66
|
+
readonly connection?: Connection;
|
|
67
|
+
/**
|
|
68
|
+
* Bandwidth information for the session (optional, multiple allowed)
|
|
69
|
+
*/
|
|
70
|
+
readonly bandwidths: readonly Bandwidth[];
|
|
71
|
+
/**
|
|
72
|
+
* Time descriptions for the session (required, at least one)
|
|
73
|
+
* Each describes start/stop times and optional repeat times
|
|
74
|
+
*/
|
|
75
|
+
readonly timeDescriptions: readonly TimeDescription[];
|
|
76
|
+
/**
|
|
77
|
+
* Encryption key (OBSOLETE per RFC 8866, but must support for compatibility)
|
|
78
|
+
*/
|
|
79
|
+
readonly key?: Key;
|
|
80
|
+
/**
|
|
81
|
+
* Session-level attributes (optional, multiple allowed)
|
|
82
|
+
*/
|
|
83
|
+
readonly attributes: readonly Attribute[];
|
|
84
|
+
/**
|
|
85
|
+
* Media descriptions (optional, zero or more)
|
|
86
|
+
* Each describes a media stream (audio, video, etc.)
|
|
87
|
+
*/
|
|
88
|
+
readonly mediaDescriptions: readonly MediaDescription[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a SessionDescription
|
|
92
|
+
*
|
|
93
|
+
* Enforces RFC 8866 requirements:
|
|
94
|
+
* - Version, origin, sessionName are required
|
|
95
|
+
* - At least one time description is required
|
|
96
|
+
*/
|
|
97
|
+
export declare function createSessionDescription(options: {
|
|
98
|
+
version: Version;
|
|
99
|
+
origin: Origin;
|
|
100
|
+
sessionName: SessionName;
|
|
101
|
+
sessionInformation?: Information;
|
|
102
|
+
uri?: URI;
|
|
103
|
+
emails?: Email[];
|
|
104
|
+
phones?: Phone[];
|
|
105
|
+
connection?: Connection;
|
|
106
|
+
bandwidths?: Bandwidth[];
|
|
107
|
+
timeDescriptions: TimeDescription[];
|
|
108
|
+
key?: Key;
|
|
109
|
+
attributes?: Attribute[];
|
|
110
|
+
mediaDescriptions?: MediaDescription[];
|
|
111
|
+
}): SessionDescription;
|
|
112
|
+
/**
|
|
113
|
+
* Create a minimal valid SessionDescription
|
|
114
|
+
*
|
|
115
|
+
* Creates a session with only the required fields:
|
|
116
|
+
* - Version 0
|
|
117
|
+
* - Origin
|
|
118
|
+
* - Session name
|
|
119
|
+
* - One time description (0 to 0 = permanent/unbounded)
|
|
120
|
+
*/
|
|
121
|
+
export declare function createMinimalSessionDescription(origin: Origin, sessionName: SessionName): SessionDescription;
|
|
122
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/types/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAW,MAAM,cAAc,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAM3C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAElC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAC;IAEtD;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAEnB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;IAE1C;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACzD;AAMD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,GAAG,kBAAkB,CAqCrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,kBAAkB,CAoBpB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Description type for SDP (RFC 8866)
|
|
4
|
+
*
|
|
5
|
+
* This is the main type representing a complete SDP session description.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createSessionDescription = createSessionDescription;
|
|
9
|
+
exports.createMinimalSessionDescription = createMinimalSessionDescription;
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Helper Functions for Creating Session Descriptions
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Create a SessionDescription
|
|
15
|
+
*
|
|
16
|
+
* Enforces RFC 8866 requirements:
|
|
17
|
+
* - Version, origin, sessionName are required
|
|
18
|
+
* - At least one time description is required
|
|
19
|
+
*/
|
|
20
|
+
function createSessionDescription(options) {
|
|
21
|
+
var _a, _b, _c, _d, _e;
|
|
22
|
+
// Validate required fields
|
|
23
|
+
if (options.timeDescriptions.length === 0) {
|
|
24
|
+
throw new Error('At least one time description is required');
|
|
25
|
+
}
|
|
26
|
+
// Validate connection requirement
|
|
27
|
+
// Connection MUST be present at session level OR in every media description
|
|
28
|
+
const hasSessionConnection = options.connection !== undefined;
|
|
29
|
+
const mediaDescriptions = (_a = options.mediaDescriptions) !== null && _a !== void 0 ? _a : [];
|
|
30
|
+
if (!hasSessionConnection && mediaDescriptions.length > 0) {
|
|
31
|
+
const allMediaHaveConnection = mediaDescriptions.every((md) => md.connections.length > 0);
|
|
32
|
+
if (!allMediaHaveConnection) {
|
|
33
|
+
throw new Error('Connection information required: must be present at session level or in every media description');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
version: options.version,
|
|
38
|
+
origin: options.origin,
|
|
39
|
+
sessionName: options.sessionName,
|
|
40
|
+
sessionInformation: options.sessionInformation,
|
|
41
|
+
uri: options.uri,
|
|
42
|
+
emails: (_b = options.emails) !== null && _b !== void 0 ? _b : [],
|
|
43
|
+
phones: (_c = options.phones) !== null && _c !== void 0 ? _c : [],
|
|
44
|
+
connection: options.connection,
|
|
45
|
+
bandwidths: (_d = options.bandwidths) !== null && _d !== void 0 ? _d : [],
|
|
46
|
+
timeDescriptions: options.timeDescriptions,
|
|
47
|
+
key: options.key,
|
|
48
|
+
attributes: (_e = options.attributes) !== null && _e !== void 0 ? _e : [],
|
|
49
|
+
mediaDescriptions: mediaDescriptions,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create a minimal valid SessionDescription
|
|
54
|
+
*
|
|
55
|
+
* Creates a session with only the required fields:
|
|
56
|
+
* - Version 0
|
|
57
|
+
* - Origin
|
|
58
|
+
* - Session name
|
|
59
|
+
* - One time description (0 to 0 = permanent/unbounded)
|
|
60
|
+
*/
|
|
61
|
+
function createMinimalSessionDescription(origin, sessionName) {
|
|
62
|
+
return {
|
|
63
|
+
version: 0,
|
|
64
|
+
origin,
|
|
65
|
+
sessionName,
|
|
66
|
+
emails: [],
|
|
67
|
+
phones: [],
|
|
68
|
+
bandwidths: [],
|
|
69
|
+
timeDescriptions: [
|
|
70
|
+
{
|
|
71
|
+
timing: {
|
|
72
|
+
startTime: 0,
|
|
73
|
+
stopTime: 0,
|
|
74
|
+
},
|
|
75
|
+
repeats: [],
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
attributes: [],
|
|
79
|
+
mediaDescriptions: [],
|
|
80
|
+
};
|
|
81
|
+
}
|