livekit-client 2.17.3 → 2.18.1
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/dist/livekit-client.e2ee.worker.js +1 -1
- package/dist/livekit-client.e2ee.worker.js.map +1 -1
- package/dist/livekit-client.e2ee.worker.mjs +8 -7
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +7823 -5772
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts +12 -4
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/e2ee/constants.d.ts.map +1 -1
- package/dist/src/e2ee/types.d.ts +6 -0
- package/dist/src/e2ee/types.d.ts.map +1 -1
- package/dist/src/e2ee/utils.d.ts +2 -1
- package/dist/src/e2ee/utils.d.ts.map +1 -1
- package/dist/src/e2ee/worker/DataCryptor.d.ts.map +1 -1
- package/dist/src/e2ee/worker/FrameCryptor.d.ts.map +1 -1
- package/dist/src/index.d.ts +5 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +5 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/PCTransportManager.d.ts +1 -1
- package/dist/src/room/PCTransportManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +27 -9
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts +13 -3
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/data-stream/outgoing/OutgoingDataStreamManager.d.ts.map +1 -1
- package/dist/src/room/data-track/LocalDataTrack.d.ts +48 -0
- package/dist/src/room/data-track/LocalDataTrack.d.ts.map +1 -0
- package/dist/src/room/data-track/RemoteDataTrack.d.ts +46 -0
- package/dist/src/room/data-track/RemoteDataTrack.d.ts.map +1 -0
- package/dist/src/room/data-track/depacketizer.d.ts +6 -6
- package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
- package/dist/src/room/data-track/frame.d.ts +14 -0
- package/dist/src/room/data-track/frame.d.ts.map +1 -1
- package/dist/src/room/data-track/handle.d.ts +2 -2
- package/dist/src/room/data-track/handle.d.ts.map +1 -1
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts +104 -0
- package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts.map +1 -0
- package/dist/src/room/data-track/incoming/errors.d.ts +24 -0
- package/dist/src/room/data-track/incoming/errors.d.ts.map +1 -0
- package/dist/src/room/data-track/incoming/pipeline.d.ts +38 -0
- package/dist/src/room/data-track/incoming/pipeline.d.ts.map +1 -0
- package/dist/src/room/data-track/incoming/types.d.ts +20 -0
- package/dist/src/room/data-track/incoming/types.d.ts.map +1 -0
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +63 -28
- package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/errors.d.ts +20 -10
- package/dist/src/room/data-track/outgoing/errors.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/pipeline.d.ts +9 -8
- package/dist/src/room/data-track/outgoing/pipeline.d.ts.map +1 -1
- package/dist/src/room/data-track/outgoing/types.d.ts +16 -7
- package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/errors.d.ts +2 -4
- package/dist/src/room/data-track/packet/errors.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/extensions.d.ts +4 -4
- package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/index.d.ts +5 -5
- package/dist/src/room/data-track/packet/index.d.ts.map +1 -1
- package/dist/src/room/data-track/packet/serializable.d.ts +4 -4
- package/dist/src/room/data-track/packet/serializable.d.ts.map +1 -1
- package/dist/src/room/data-track/packetizer.d.ts +6 -6
- package/dist/src/room/data-track/packetizer.d.ts.map +1 -1
- package/dist/src/room/data-track/track-interfaces.d.ts +23 -0
- package/dist/src/room/data-track/track-interfaces.d.ts.map +1 -0
- package/dist/src/room/data-track/types.d.ts +15 -0
- package/dist/src/room/data-track/types.d.ts.map +1 -0
- package/dist/src/room/events.d.ts +24 -3
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +11 -1
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts +14 -1
- package/dist/src/room/participant/RemoteParticipant.d.ts.map +1 -1
- package/dist/src/room/token-source/TokenSource.d.ts +1 -1
- package/dist/src/room/token-source/TokenSource.d.ts.map +1 -1
- package/dist/src/room/token-source/types.d.ts +1 -0
- package/dist/src/room/token-source/types.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +2 -1
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/src/utils/abort-signal-polyfill.d.ts +13 -0
- package/dist/src/utils/abort-signal-polyfill.d.ts.map +1 -0
- package/dist/src/utils/deferrable-map.d.ts +32 -0
- package/dist/src/utils/deferrable-map.d.ts.map +1 -0
- package/dist/src/utils/subscribeToEvents.d.ts +3 -0
- package/dist/src/utils/subscribeToEvents.d.ts.map +1 -1
- package/dist/ts4.2/api/SignalClient.d.ts +12 -4
- package/dist/ts4.2/e2ee/types.d.ts +6 -0
- package/dist/ts4.2/e2ee/utils.d.ts +2 -1
- package/dist/ts4.2/index.d.ts +5 -4
- package/dist/ts4.2/room/PCTransport.d.ts +5 -0
- package/dist/ts4.2/room/PCTransportManager.d.ts +1 -1
- package/dist/ts4.2/room/RTCEngine.d.ts +27 -9
- package/dist/ts4.2/room/Room.d.ts +13 -3
- package/dist/ts4.2/room/data-track/LocalDataTrack.d.ts +48 -0
- package/dist/ts4.2/room/data-track/RemoteDataTrack.d.ts +46 -0
- package/dist/ts4.2/room/data-track/depacketizer.d.ts +6 -6
- package/dist/ts4.2/room/data-track/frame.d.ts +14 -0
- package/dist/ts4.2/room/data-track/handle.d.ts +2 -2
- package/dist/ts4.2/room/data-track/incoming/IncomingDataTrackManager.d.ts +110 -0
- package/dist/ts4.2/room/data-track/incoming/errors.d.ts +24 -0
- package/dist/ts4.2/room/data-track/incoming/pipeline.d.ts +38 -0
- package/dist/ts4.2/room/data-track/incoming/types.d.ts +20 -0
- package/dist/ts4.2/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +63 -29
- package/dist/ts4.2/room/data-track/outgoing/errors.d.ts +20 -10
- package/dist/ts4.2/room/data-track/outgoing/pipeline.d.ts +9 -8
- package/dist/ts4.2/room/data-track/outgoing/types.d.ts +16 -7
- package/dist/ts4.2/room/data-track/packet/errors.d.ts +2 -4
- package/dist/ts4.2/room/data-track/packet/extensions.d.ts +4 -4
- package/dist/ts4.2/room/data-track/packet/index.d.ts +5 -6
- package/dist/ts4.2/room/data-track/packet/serializable.d.ts +4 -4
- package/dist/ts4.2/room/data-track/packetizer.d.ts +6 -6
- package/dist/ts4.2/room/data-track/track-interfaces.d.ts +23 -0
- package/dist/ts4.2/room/data-track/types.d.ts +15 -0
- package/dist/ts4.2/room/events.d.ts +24 -3
- package/dist/ts4.2/room/participant/LocalParticipant.d.ts +11 -1
- package/dist/ts4.2/room/participant/RemoteParticipant.d.ts +14 -1
- package/dist/ts4.2/room/token-source/TokenSource.d.ts +1 -1
- package/dist/ts4.2/room/token-source/types.d.ts +1 -0
- package/dist/ts4.2/room/utils.d.ts +2 -1
- package/dist/ts4.2/utils/abort-signal-polyfill.d.ts +13 -0
- package/dist/ts4.2/utils/deferrable-map.d.ts +32 -0
- package/dist/ts4.2/utils/subscribeToEvents.d.ts +3 -0
- package/package.json +4 -2
- package/src/api/SignalClient.test.ts +9 -4
- package/src/api/SignalClient.ts +116 -9
- package/src/e2ee/constants.ts +1 -0
- package/src/e2ee/types.ts +6 -0
- package/src/e2ee/utils.ts +4 -3
- package/src/e2ee/worker/DataCryptor.ts +1 -4
- package/src/e2ee/worker/FrameCryptor.ts +1 -4
- package/src/e2ee/worker/ParticipantKeyHandler.ts +1 -1
- package/src/index.ts +6 -4
- package/src/room/PCTransport.ts +41 -1
- package/src/room/PCTransportManager.ts +1 -1
- package/src/room/RTCEngine.ts +274 -112
- package/src/room/Room.ts +152 -15
- package/src/room/data-stream/outgoing/OutgoingDataStreamManager.ts +9 -9
- package/src/room/data-track/LocalDataTrack.ts +126 -0
- package/src/room/data-track/RemoteDataTrack.ts +80 -0
- package/src/room/data-track/depacketizer.ts +23 -26
- package/src/room/data-track/frame.ts +28 -2
- package/src/room/data-track/handle.ts +2 -8
- package/src/room/data-track/incoming/IncomingDataTrackManager.test.ts +555 -0
- package/src/room/data-track/incoming/IncomingDataTrackManager.ts +589 -0
- package/src/room/data-track/incoming/errors.ts +57 -0
- package/src/room/data-track/incoming/pipeline.ts +121 -0
- package/src/room/data-track/incoming/types.ts +22 -0
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.test.ts +240 -27
- package/src/room/data-track/outgoing/OutgoingDataTrackManager.ts +165 -84
- package/src/room/data-track/outgoing/errors.ts +40 -11
- package/src/room/data-track/outgoing/pipeline.ts +25 -23
- package/src/room/data-track/outgoing/types.ts +14 -6
- package/src/room/data-track/packet/errors.ts +2 -14
- package/src/room/data-track/packet/extensions.ts +21 -26
- package/src/room/data-track/packet/index.test.ts +22 -33
- package/src/room/data-track/packet/index.ts +4 -6
- package/src/room/data-track/packet/serializable.ts +4 -4
- package/src/room/data-track/packetizer.test.ts +2 -2
- package/src/room/data-track/packetizer.ts +7 -10
- package/src/room/data-track/track-interfaces.ts +53 -0
- package/src/room/data-track/types.ts +31 -0
- package/src/room/events.ts +26 -1
- package/src/room/participant/LocalParticipant.ts +57 -6
- package/src/room/participant/RemoteParticipant.ts +26 -1
- package/src/room/token-source/TokenSource.ts +8 -2
- package/src/room/token-source/types.ts +4 -0
- package/src/room/utils.ts +5 -1
- package/src/utils/abort-signal-polyfill.ts +63 -0
- package/src/utils/deferrable-map.ts +109 -0
- package/src/utils/subscribeToEvents.ts +18 -1
- package/dist/src/room/data-track/e2ee.d.ts +0 -12
- package/dist/src/room/data-track/e2ee.d.ts.map +0 -1
- package/dist/src/room/data-track/track.d.ts +0 -30
- package/dist/src/room/data-track/track.d.ts.map +0 -1
- package/dist/src/utils/throws.d.ts +0 -36
- package/dist/src/utils/throws.d.ts.map +0 -1
- package/dist/ts4.2/room/data-track/e2ee.d.ts +0 -12
- package/dist/ts4.2/room/data-track/track.d.ts +0 -30
- package/dist/ts4.2/utils/throws.d.ts +0 -39
- package/src/room/data-track/e2ee.ts +0 -14
- package/src/room/data-track/track.ts +0 -50
- package/src/utils/throws.ts +0 -42
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { type Throws } from '@livekit/throws-transformer/throws';
|
|
1
2
|
import { LoggerNames, getLogger } from '../../logger';
|
|
2
|
-
import { type Throws } from '../../utils/throws';
|
|
3
3
|
import { LivekitReasonedError } from '../errors';
|
|
4
|
-
import { type
|
|
4
|
+
import { type DataTrackFrameInternal } from './frame';
|
|
5
5
|
import { DataTrackPacket, FrameMarker } from './packet';
|
|
6
6
|
import { DataTrackExtensions } from './packet/extensions';
|
|
7
7
|
import { U16_MAX_SIZE, WrapAroundUnsignedInt } from './utils';
|
|
@@ -21,7 +21,7 @@ type PartialFrame = {
|
|
|
21
21
|
|
|
22
22
|
/** An error indicating a frame was dropped. */
|
|
23
23
|
export class DataTrackDepacketizerDropError<
|
|
24
|
-
Reason extends DataTrackDepacketizerDropReason,
|
|
24
|
+
Reason extends DataTrackDepacketizerDropReason = DataTrackDepacketizerDropReason,
|
|
25
25
|
> extends LivekitReasonedError<Reason> {
|
|
26
26
|
readonly name = 'DataTrackDepacketizerDropError';
|
|
27
27
|
|
|
@@ -38,9 +38,9 @@ export class DataTrackDepacketizerDropError<
|
|
|
38
38
|
this.frameNumber = frameNumber;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
static interrupted(frameNumber: number) {
|
|
41
|
+
static interrupted(frameNumber: number, newFrameNumber: number) {
|
|
42
42
|
return new DataTrackDepacketizerDropError(
|
|
43
|
-
|
|
43
|
+
`Interrupted by the start of a new frame ${newFrameNumber}`,
|
|
44
44
|
DataTrackDepacketizerDropReason.Interrupted,
|
|
45
45
|
frameNumber,
|
|
46
46
|
);
|
|
@@ -94,18 +94,12 @@ export default class DataTrackDepacketizer {
|
|
|
94
94
|
/** Should be repeatedly called with received {@link DataTrackPacket}s - intermediate calls
|
|
95
95
|
* aggregate the packet's state internally, and return null.
|
|
96
96
|
*
|
|
97
|
-
* Once this method is called with the final packet to form a frame, a new {@link
|
|
97
|
+
* Once this method is called with the final packet to form a frame, a new {@link DataTrackFrameInternal}
|
|
98
98
|
* is returned.*/
|
|
99
99
|
push(
|
|
100
100
|
packet: DataTrackPacket,
|
|
101
101
|
options?: PushOptions,
|
|
102
|
-
): Throws<
|
|
103
|
-
DataTrackFrame | null,
|
|
104
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Interrupted>
|
|
105
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.BufferFull>
|
|
106
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.UnknownFrame>
|
|
107
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Incomplete>
|
|
108
|
-
> {
|
|
102
|
+
): Throws<DataTrackFrameInternal | null, DataTrackDepacketizerDropError> {
|
|
109
103
|
switch (packet.header.marker) {
|
|
110
104
|
case FrameMarker.Single:
|
|
111
105
|
return this.frameFromSingle(packet, options);
|
|
@@ -125,7 +119,7 @@ export default class DataTrackDepacketizer {
|
|
|
125
119
|
packet: DataTrackPacket,
|
|
126
120
|
options?: PushOptions,
|
|
127
121
|
): Throws<
|
|
128
|
-
|
|
122
|
+
DataTrackFrameInternal | null,
|
|
129
123
|
DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Interrupted>
|
|
130
124
|
> {
|
|
131
125
|
if (packet.header.marker !== FrameMarker.Single) {
|
|
@@ -139,7 +133,10 @@ export default class DataTrackDepacketizer {
|
|
|
139
133
|
if (options?.errorOnPartialFrames) {
|
|
140
134
|
const frameNumber = this.partial.frameNumber;
|
|
141
135
|
this.reset();
|
|
142
|
-
throw DataTrackDepacketizerDropError.interrupted(
|
|
136
|
+
throw DataTrackDepacketizerDropError.interrupted(
|
|
137
|
+
frameNumber,
|
|
138
|
+
packet.header.frameNumber.value,
|
|
139
|
+
);
|
|
143
140
|
} else {
|
|
144
141
|
log.warn(
|
|
145
142
|
`Data track frame ${this.partial.frameNumber} was interrupted by the start of a new frame, dropping.`,
|
|
@@ -167,10 +164,13 @@ export default class DataTrackDepacketizer {
|
|
|
167
164
|
if (options?.errorOnPartialFrames) {
|
|
168
165
|
const frameNumber = this.partial.frameNumber;
|
|
169
166
|
this.reset();
|
|
170
|
-
throw DataTrackDepacketizerDropError.interrupted(
|
|
167
|
+
throw DataTrackDepacketizerDropError.interrupted(
|
|
168
|
+
frameNumber,
|
|
169
|
+
packet.header.frameNumber.value,
|
|
170
|
+
);
|
|
171
171
|
} else {
|
|
172
172
|
log.warn(
|
|
173
|
-
`Data track frame ${this.partial.frameNumber} was interrupted by the start of a new frame, dropping.`,
|
|
173
|
+
`Data track frame ${this.partial.frameNumber} was interrupted by the start of a new frame ${packet.header.frameNumber.value}, dropping.`,
|
|
174
174
|
);
|
|
175
175
|
}
|
|
176
176
|
}
|
|
@@ -191,13 +191,7 @@ export default class DataTrackDepacketizer {
|
|
|
191
191
|
/** Push to the existing partial frame. */
|
|
192
192
|
private pushToPartial(
|
|
193
193
|
packet: DataTrackPacket,
|
|
194
|
-
): Throws<
|
|
195
|
-
DataTrackFrame | null,
|
|
196
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Interrupted>
|
|
197
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.UnknownFrame>
|
|
198
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.BufferFull>
|
|
199
|
-
| DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Incomplete>
|
|
200
|
-
> {
|
|
194
|
+
): Throws<DataTrackFrameInternal | null, DataTrackDepacketizerDropError> {
|
|
201
195
|
if (packet.header.marker !== FrameMarker.Inter && packet.header.marker !== FrameMarker.Final) {
|
|
202
196
|
// @throws-transformer ignore - this should be treated as a "panic" and not be caught
|
|
203
197
|
throw new Error(
|
|
@@ -213,7 +207,10 @@ export default class DataTrackDepacketizer {
|
|
|
213
207
|
if (packet.header.frameNumber.value !== this.partial.frameNumber) {
|
|
214
208
|
const frameNumber = this.partial.frameNumber;
|
|
215
209
|
this.reset();
|
|
216
|
-
throw DataTrackDepacketizerDropError.interrupted(
|
|
210
|
+
throw DataTrackDepacketizerDropError.interrupted(
|
|
211
|
+
frameNumber,
|
|
212
|
+
packet.header.frameNumber.value,
|
|
213
|
+
);
|
|
217
214
|
}
|
|
218
215
|
|
|
219
216
|
// NOTE: this check will block reprocessing packets with duplicate sequence values if the
|
|
@@ -246,7 +243,7 @@ export default class DataTrackDepacketizer {
|
|
|
246
243
|
partial: PartialFrame,
|
|
247
244
|
endSequence: number,
|
|
248
245
|
): Throws<
|
|
249
|
-
|
|
246
|
+
DataTrackFrameInternal,
|
|
250
247
|
DataTrackDepacketizerDropError<DataTrackDepacketizerDropReason.Incomplete>
|
|
251
248
|
> {
|
|
252
249
|
const received = partial.payloads.size;
|
|
@@ -1,8 +1,34 @@
|
|
|
1
|
-
import { DataTrackExtensions } from './packet/extensions';
|
|
2
|
-
import DataTrackPacketizer from './packetizer';
|
|
1
|
+
import { DataTrackExtensions, DataTrackUserTimestampExtension } from './packet/extensions';
|
|
3
2
|
|
|
4
3
|
/** A pair of payload bytes and packet extensions which can be fed into a {@link DataTrackPacketizer}. */
|
|
5
4
|
export type DataTrackFrame = {
|
|
5
|
+
payload: Uint8Array;
|
|
6
|
+
userTimestamp?: bigint;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/** An internal representation o data track frame which contains all SFU metadata. */
|
|
10
|
+
export type DataTrackFrameInternal = {
|
|
6
11
|
payload: Uint8Array;
|
|
7
12
|
extensions: DataTrackExtensions;
|
|
8
13
|
};
|
|
14
|
+
|
|
15
|
+
export const DataTrackFrameInternal = {
|
|
16
|
+
from(frame: DataTrackFrame) {
|
|
17
|
+
return {
|
|
18
|
+
payload: frame.payload,
|
|
19
|
+
extensions: new DataTrackExtensions({
|
|
20
|
+
userTimestamp: frame.userTimestamp
|
|
21
|
+
? new DataTrackUserTimestampExtension(frame.userTimestamp)
|
|
22
|
+
: undefined,
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
/** Converts from a DataTrackFrameInternal -> DataTrackFrame. Some internal information is
|
|
27
|
+
* discarded like e2ee encrption extension data. */
|
|
28
|
+
lossyIntoFrame(frame: DataTrackFrameInternal): DataTrackFrame {
|
|
29
|
+
return {
|
|
30
|
+
payload: frame.payload,
|
|
31
|
+
userTimestamp: frame.extensions.userTimestamp?.timestamp,
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Throws } from '
|
|
1
|
+
import { type Throws } from '@livekit/throws-transformer/throws';
|
|
2
2
|
import { LivekitReasonedError } from '../errors';
|
|
3
3
|
import { U16_MAX_SIZE } from './utils';
|
|
4
4
|
|
|
@@ -43,13 +43,7 @@ export class DataTrackHandleError<
|
|
|
43
43
|
|
|
44
44
|
export type DataTrackHandle = number;
|
|
45
45
|
export const DataTrackHandle = {
|
|
46
|
-
fromNumber(
|
|
47
|
-
raw: number,
|
|
48
|
-
): Throws<
|
|
49
|
-
DataTrackHandle,
|
|
50
|
-
| DataTrackHandleError<DataTrackHandleErrorReason.TooLarge>
|
|
51
|
-
| DataTrackHandleError<DataTrackHandleErrorReason.Reserved>
|
|
52
|
-
> {
|
|
46
|
+
fromNumber(raw: number): Throws<DataTrackHandle, DataTrackHandleError> {
|
|
53
47
|
if (raw === 0) {
|
|
54
48
|
throw DataTrackHandleError.reserved(raw);
|
|
55
49
|
}
|