@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.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/dist/src/builder/media-builder.d.ts +221 -0
  4. package/dist/src/builder/media-builder.d.ts.map +1 -0
  5. package/dist/src/builder/media-builder.js +385 -0
  6. package/dist/src/builder/session-builder.d.ts +195 -0
  7. package/dist/src/builder/session-builder.d.ts.map +1 -0
  8. package/dist/src/builder/session-builder.js +366 -0
  9. package/dist/src/index.d.ts +67 -0
  10. package/dist/src/index.d.ts.map +1 -0
  11. package/dist/src/index.js +250 -0
  12. package/dist/src/parser/attribute-parser.d.ts +100 -0
  13. package/dist/src/parser/attribute-parser.d.ts.map +1 -0
  14. package/dist/src/parser/attribute-parser.js +217 -0
  15. package/dist/src/parser/field-parser.d.ts +124 -0
  16. package/dist/src/parser/field-parser.d.ts.map +1 -0
  17. package/dist/src/parser/field-parser.js +335 -0
  18. package/dist/src/parser/media-parser.d.ts +45 -0
  19. package/dist/src/parser/media-parser.d.ts.map +1 -0
  20. package/dist/src/parser/media-parser.js +157 -0
  21. package/dist/src/parser/primitive-parser.d.ts +138 -0
  22. package/dist/src/parser/primitive-parser.d.ts.map +1 -0
  23. package/dist/src/parser/primitive-parser.js +316 -0
  24. package/dist/src/parser/scanner.d.ts +142 -0
  25. package/dist/src/parser/scanner.d.ts.map +1 -0
  26. package/dist/src/parser/scanner.js +284 -0
  27. package/dist/src/parser/session-parser.d.ts +35 -0
  28. package/dist/src/parser/session-parser.d.ts.map +1 -0
  29. package/dist/src/parser/session-parser.js +207 -0
  30. package/dist/src/parser/time-parser.d.ts +74 -0
  31. package/dist/src/parser/time-parser.d.ts.map +1 -0
  32. package/dist/src/parser/time-parser.js +168 -0
  33. package/dist/src/serializer/attribute-serializer.d.ts +18 -0
  34. package/dist/src/serializer/attribute-serializer.d.ts.map +1 -0
  35. package/dist/src/serializer/attribute-serializer.js +34 -0
  36. package/dist/src/serializer/field-serializer.d.ts +112 -0
  37. package/dist/src/serializer/field-serializer.d.ts.map +1 -0
  38. package/dist/src/serializer/field-serializer.js +212 -0
  39. package/dist/src/serializer/media-serializer.d.ts +31 -0
  40. package/dist/src/serializer/media-serializer.d.ts.map +1 -0
  41. package/dist/src/serializer/media-serializer.js +83 -0
  42. package/dist/src/serializer/session-serializer.d.ts +29 -0
  43. package/dist/src/serializer/session-serializer.d.ts.map +1 -0
  44. package/dist/src/serializer/session-serializer.js +99 -0
  45. package/dist/src/serializer/time-serializer.d.ts +46 -0
  46. package/dist/src/serializer/time-serializer.d.ts.map +1 -0
  47. package/dist/src/serializer/time-serializer.js +86 -0
  48. package/dist/src/types/attributes.d.ts +318 -0
  49. package/dist/src/types/attributes.d.ts.map +1 -0
  50. package/dist/src/types/attributes.js +225 -0
  51. package/dist/src/types/errors.d.ts +129 -0
  52. package/dist/src/types/errors.d.ts.map +1 -0
  53. package/dist/src/types/errors.js +186 -0
  54. package/dist/src/types/fields.d.ts +100 -0
  55. package/dist/src/types/fields.d.ts.map +1 -0
  56. package/dist/src/types/fields.js +48 -0
  57. package/dist/src/types/media.d.ts +148 -0
  58. package/dist/src/types/media.d.ts.map +1 -0
  59. package/dist/src/types/media.js +137 -0
  60. package/dist/src/types/network.d.ts +136 -0
  61. package/dist/src/types/network.d.ts.map +1 -0
  62. package/dist/src/types/network.js +130 -0
  63. package/dist/src/types/primitives.d.ts +193 -0
  64. package/dist/src/types/primitives.d.ts.map +1 -0
  65. package/dist/src/types/primitives.js +195 -0
  66. package/dist/src/types/session.d.ts +122 -0
  67. package/dist/src/types/session.d.ts.map +1 -0
  68. package/dist/src/types/session.js +81 -0
  69. package/dist/src/types/time.d.ts +129 -0
  70. package/dist/src/types/time.d.ts.map +1 -0
  71. package/dist/src/types/time.js +84 -0
  72. package/dist/src/utils/address-parser.d.ts +100 -0
  73. package/dist/src/utils/address-parser.d.ts.map +1 -0
  74. package/dist/src/utils/address-parser.js +338 -0
  75. package/dist/src/utils/format-validators.d.ts +77 -0
  76. package/dist/src/utils/format-validators.d.ts.map +1 -0
  77. package/dist/src/utils/format-validators.js +504 -0
  78. package/dist/src/utils/line-reader.d.ts +84 -0
  79. package/dist/src/utils/line-reader.d.ts.map +1 -0
  80. package/dist/src/utils/line-reader.js +169 -0
  81. package/dist/src/utils/time-converter.d.ts +99 -0
  82. package/dist/src/utils/time-converter.d.ts.map +1 -0
  83. package/dist/src/utils/time-converter.js +195 -0
  84. package/dist/src/validator/media-validator.d.ts +27 -0
  85. package/dist/src/validator/media-validator.d.ts.map +1 -0
  86. package/dist/src/validator/media-validator.js +241 -0
  87. package/dist/src/validator/semantic-validator.d.ts +47 -0
  88. package/dist/src/validator/semantic-validator.d.ts.map +1 -0
  89. package/dist/src/validator/semantic-validator.js +207 -0
  90. package/dist/src/validator/session-validator.d.ts +36 -0
  91. package/dist/src/validator/session-validator.d.ts.map +1 -0
  92. package/dist/src/validator/session-validator.js +280 -0
  93. package/dist/tests/integration/round-trip.test.d.ts +5 -0
  94. package/dist/tests/integration/round-trip.test.d.ts.map +1 -0
  95. package/dist/tests/integration/round-trip.test.js +320 -0
  96. package/dist/tests/integration/voip-examples.test.d.ts +5 -0
  97. package/dist/tests/integration/voip-examples.test.d.ts.map +1 -0
  98. package/dist/tests/integration/voip-examples.test.js +361 -0
  99. package/dist/tests/unit/builder/media-builder.test.d.ts +5 -0
  100. package/dist/tests/unit/builder/media-builder.test.d.ts.map +1 -0
  101. package/dist/tests/unit/builder/media-builder.test.js +524 -0
  102. package/dist/tests/unit/builder/session-builder.test.d.ts +5 -0
  103. package/dist/tests/unit/builder/session-builder.test.d.ts.map +1 -0
  104. package/dist/tests/unit/builder/session-builder.test.js +367 -0
  105. package/dist/tests/unit/parser/attribute-parser.test.d.ts +5 -0
  106. package/dist/tests/unit/parser/attribute-parser.test.d.ts.map +1 -0
  107. package/dist/tests/unit/parser/attribute-parser.test.js +319 -0
  108. package/dist/tests/unit/parser/field-parser.test.d.ts +5 -0
  109. package/dist/tests/unit/parser/field-parser.test.d.ts.map +1 -0
  110. package/dist/tests/unit/parser/field-parser.test.js +355 -0
  111. package/dist/tests/unit/parser/media-parser.test.d.ts +5 -0
  112. package/dist/tests/unit/parser/media-parser.test.d.ts.map +1 -0
  113. package/dist/tests/unit/parser/media-parser.test.js +241 -0
  114. package/dist/tests/unit/parser/primitive-parser.test.d.ts +5 -0
  115. package/dist/tests/unit/parser/primitive-parser.test.d.ts.map +1 -0
  116. package/dist/tests/unit/parser/primitive-parser.test.js +261 -0
  117. package/dist/tests/unit/parser/scanner.test.d.ts +5 -0
  118. package/dist/tests/unit/parser/scanner.test.d.ts.map +1 -0
  119. package/dist/tests/unit/parser/scanner.test.js +241 -0
  120. package/dist/tests/unit/parser/session-parser.test.d.ts +5 -0
  121. package/dist/tests/unit/parser/session-parser.test.d.ts.map +1 -0
  122. package/dist/tests/unit/parser/session-parser.test.js +346 -0
  123. package/dist/tests/unit/parser/time-parser.test.d.ts +5 -0
  124. package/dist/tests/unit/parser/time-parser.test.d.ts.map +1 -0
  125. package/dist/tests/unit/parser/time-parser.test.js +173 -0
  126. package/dist/tests/unit/serializer/attribute-serializer.test.d.ts +5 -0
  127. package/dist/tests/unit/serializer/attribute-serializer.test.d.ts.map +1 -0
  128. package/dist/tests/unit/serializer/attribute-serializer.test.js +78 -0
  129. package/dist/tests/unit/serializer/field-serializer.test.d.ts +5 -0
  130. package/dist/tests/unit/serializer/field-serializer.test.d.ts.map +1 -0
  131. package/dist/tests/unit/serializer/field-serializer.test.js +159 -0
  132. package/dist/tests/unit/serializer/media-serializer.test.d.ts +5 -0
  133. package/dist/tests/unit/serializer/media-serializer.test.d.ts.map +1 -0
  134. package/dist/tests/unit/serializer/media-serializer.test.js +155 -0
  135. package/dist/tests/unit/serializer/session-serializer.test.d.ts +5 -0
  136. package/dist/tests/unit/serializer/session-serializer.test.d.ts.map +1 -0
  137. package/dist/tests/unit/serializer/session-serializer.test.js +317 -0
  138. package/dist/tests/unit/serializer/time-serializer.test.d.ts +5 -0
  139. package/dist/tests/unit/serializer/time-serializer.test.d.ts.map +1 -0
  140. package/dist/tests/unit/serializer/time-serializer.test.js +115 -0
  141. package/dist/tests/unit/types/errors.test.d.ts +5 -0
  142. package/dist/tests/unit/types/errors.test.d.ts.map +1 -0
  143. package/dist/tests/unit/types/errors.test.js +127 -0
  144. package/dist/tests/unit/types/network.test.d.ts +5 -0
  145. package/dist/tests/unit/types/network.test.d.ts.map +1 -0
  146. package/dist/tests/unit/types/network.test.js +132 -0
  147. package/dist/tests/unit/types/primitives.test.d.ts +5 -0
  148. package/dist/tests/unit/types/primitives.test.d.ts.map +1 -0
  149. package/dist/tests/unit/types/primitives.test.js +108 -0
  150. package/dist/tests/unit/utils/address-parser.test.d.ts +5 -0
  151. package/dist/tests/unit/utils/address-parser.test.d.ts.map +1 -0
  152. package/dist/tests/unit/utils/address-parser.test.js +203 -0
  153. package/dist/tests/unit/utils/format-validators.test.d.ts +5 -0
  154. package/dist/tests/unit/utils/format-validators.test.d.ts.map +1 -0
  155. package/dist/tests/unit/utils/format-validators.test.js +224 -0
  156. package/dist/tests/unit/utils/line-reader.test.d.ts +5 -0
  157. package/dist/tests/unit/utils/line-reader.test.d.ts.map +1 -0
  158. package/dist/tests/unit/utils/line-reader.test.js +157 -0
  159. package/dist/tests/unit/utils/time-converter.test.d.ts +5 -0
  160. package/dist/tests/unit/utils/time-converter.test.d.ts.map +1 -0
  161. package/dist/tests/unit/utils/time-converter.test.js +190 -0
  162. package/dist/tests/unit/validator/media-validator.test.d.ts +5 -0
  163. package/dist/tests/unit/validator/media-validator.test.d.ts.map +1 -0
  164. package/dist/tests/unit/validator/media-validator.test.js +313 -0
  165. package/dist/tests/unit/validator/semantic-validator.test.d.ts +5 -0
  166. package/dist/tests/unit/validator/semantic-validator.test.d.ts.map +1 -0
  167. package/dist/tests/unit/validator/semantic-validator.test.js +262 -0
  168. package/dist/tests/unit/validator/session-validator.test.d.ts +5 -0
  169. package/dist/tests/unit/validator/session-validator.test.d.ts.map +1 -0
  170. package/dist/tests/unit/validator/session-validator.test.js +447 -0
  171. 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":"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"}
@@ -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
+ }