Skip to content

Commit 8dbf7eb

Browse files
authored
Add explicit error types for future helper (#1753)
1 parent 8777025 commit 8dbf7eb

File tree

9 files changed

+36
-29
lines changed

9 files changed

+36
-29
lines changed

.changeset/shaggy-donuts-hammer.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"livekit-client": patch
3+
---
4+
5+
Add explicit error types for future helper

src/e2ee/E2eeManager.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@ export class E2EEManager
6868

6969
private keyProvider: BaseKeyProvider;
7070

71-
private decryptDataRequests: Map<string, Future<DecryptDataResponseMessage['data']>> = new Map();
71+
private decryptDataRequests: Map<string, Future<DecryptDataResponseMessage['data'], Error>> =
72+
new Map();
7273

73-
private encryptDataRequests: Map<string, Future<EncryptDataResponseMessage['data']>> = new Map();
74+
private encryptDataRequests: Map<string, Future<EncryptDataResponseMessage['data'], Error>> =
75+
new Map();
7476

7577
private dataChannelEncryptionEnabled: boolean;
7678

@@ -322,7 +324,7 @@ export class E2EEManager
322324
participantIdentity: this.room!.localParticipant.identity,
323325
},
324326
};
325-
const future = new Future<EncryptDataResponseMessage['data']>();
327+
const future = new Future<EncryptDataResponseMessage['data'], Error>();
326328
future.onFinally = () => {
327329
this.encryptDataRequests.delete(uuid);
328330
};
@@ -351,7 +353,7 @@ export class E2EEManager
351353
keyIndex,
352354
},
353355
};
354-
const future = new Future<DecryptDataResponseMessage['data']>();
356+
const future = new Future<DecryptDataResponseMessage['data'], Error>();
355357
future.onFinally = () => {
356358
this.decryptDataRequests.delete(uuid);
357359
};

src/room/Room.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class Room extends (EventEmitter as new () => TypedEmitter<RoomEventCallbacks>)
169169
private abortController?: AbortController;
170170

171171
/** future holding client initiated connection attempt */
172-
private connectFuture?: Future<void>;
172+
private connectFuture?: Future<void, Error>;
173173

174174
private disconnectLock: Mutex;
175175

src/room/data-stream/incoming/IncomingDataStreamManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export default class IncomingDataStreamManager {
121121
}
122122

123123
let streamController: ReadableStreamDefaultController<DataStream_Chunk>;
124-
const outOfBandFailureRejectingFuture = new Future<never>();
124+
const outOfBandFailureRejectingFuture = new Future<never, Error>();
125125
outOfBandFailureRejectingFuture.promise.catch((err) => {
126126
this.log.error(err);
127127
});
@@ -178,7 +178,7 @@ export default class IncomingDataStreamManager {
178178
}
179179

180180
let streamController: ReadableStreamDefaultController<DataStream_Chunk>;
181-
const outOfBandFailureRejectingFuture = new Future<never>();
181+
const outOfBandFailureRejectingFuture = new Future<never, Error>();
182182
outOfBandFailureRejectingFuture.promise.catch((err) => {
183183
this.log.error(err);
184184
});

src/room/data-stream/incoming/StreamReader.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ abstract class BaseStreamReader<T extends BaseStreamInfo> {
1717

1818
protected bytesReceived: number;
1919

20-
protected outOfBandFailureRejectingFuture?: Future<never>;
20+
protected outOfBandFailureRejectingFuture?: Future<never, Error>;
2121

2222
get info() {
2323
return this._info;
@@ -46,7 +46,7 @@ abstract class BaseStreamReader<T extends BaseStreamInfo> {
4646
info: T,
4747
stream: ReadableStream<DataStream_Chunk>,
4848
totalByteSize?: number,
49-
outOfBandFailureRejectingFuture?: Future<never>,
49+
outOfBandFailureRejectingFuture?: Future<never, Error>,
5050
) {
5151
this.reader = stream;
5252
this.totalByteSize = totalByteSize;
@@ -80,7 +80,7 @@ export class ByteStreamReader extends BaseStreamReader<ByteStreamInfo> {
8080
[Symbol.asyncIterator]() {
8181
const reader = this.reader.getReader();
8282

83-
let rejectingSignalFuture = new Future<never>();
83+
let rejectingSignalFuture = new Future<never, Error>();
8484
let activeSignal: AbortSignal | null = null;
8585
let onAbort: (() => void) | null = null;
8686
if (this.signal) {
@@ -175,7 +175,7 @@ export class TextStreamReader extends BaseStreamReader<TextStreamInfo> {
175175
info: TextStreamInfo,
176176
stream: ReadableStream<DataStream_Chunk>,
177177
totalChunkCount?: number,
178-
outOfBandFailureRejectingFuture?: Future<never>,
178+
outOfBandFailureRejectingFuture?: Future<never, Error>,
179179
) {
180180
super(info, stream, totalChunkCount, outOfBandFailureRejectingFuture);
181181
this.receivedChunks = new Map();
@@ -213,7 +213,7 @@ export class TextStreamReader extends BaseStreamReader<TextStreamInfo> {
213213
const reader = this.reader.getReader();
214214
const decoder = new TextDecoder('utf-8', { fatal: true });
215215

216-
let rejectingSignalFuture = new Future<never>();
216+
let rejectingSignalFuture = new Future<never, Error>();
217217
let activeSignal: AbortSignal | null = null;
218218
let onAbort: (() => void) | null = null;
219219
if (this.signal) {

src/room/participant/LocalParticipant.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,11 @@ export default class LocalParticipant extends Participant {
137137

138138
private encryptionType: Encryption_Type = Encryption_Type.NONE;
139139

140-
private reconnectFuture?: Future<void>;
140+
private reconnectFuture?: Future<void, Error>;
141141

142-
private signalConnectedFuture?: Future<void>;
142+
private signalConnectedFuture?: Future<void, Error>;
143143

144-
private activeAgentFuture?: Future<RemoteParticipant>;
144+
private activeAgentFuture?: Future<RemoteParticipant, Error>;
145145

146146
private firstActiveAgent?: RemoteParticipant;
147147

@@ -262,7 +262,7 @@ export default class LocalParticipant extends Participant {
262262

263263
private handleReconnecting = () => {
264264
if (!this.reconnectFuture) {
265-
this.reconnectFuture = new Future<void>();
265+
this.reconnectFuture = new Future<void, Error>();
266266
}
267267
};
268268

@@ -275,15 +275,15 @@ export default class LocalParticipant extends Participant {
275275
private handleClosing = () => {
276276
if (this.reconnectFuture) {
277277
this.reconnectFuture.promise.catch((e) => this.log.warn(e.message, this.logContext));
278-
this.reconnectFuture?.reject?.('Got disconnected during reconnection attempt');
278+
this.reconnectFuture?.reject?.(new Error('Got disconnected during reconnection attempt'));
279279
this.reconnectFuture = undefined;
280280
}
281281
if (this.signalConnectedFuture) {
282-
this.signalConnectedFuture.reject?.('Got disconnected without signal connected');
282+
this.signalConnectedFuture.reject?.(new Error('Got disconnected without signal connected'));
283283
this.signalConnectedFuture = undefined;
284284
}
285285

286-
this.activeAgentFuture?.reject?.('Got disconnected without active agent present');
286+
this.activeAgentFuture?.reject?.(new Error('Got disconnected without active agent present'));
287287
this.activeAgentFuture = undefined;
288288
this.firstActiveAgent = undefined;
289289
};
@@ -293,7 +293,7 @@ export default class LocalParticipant extends Participant {
293293
this.updateInfo(joinResponse.participant);
294294
}
295295
if (!this.signalConnectedFuture) {
296-
this.signalConnectedFuture = new Future<void>();
296+
this.signalConnectedFuture = new Future<void, Error>();
297297
}
298298

299299
this.signalConnectedFuture.resolve?.();
@@ -926,7 +926,7 @@ export default class LocalParticipant extends Participant {
926926

927927
private waitUntilEngineConnected() {
928928
if (!this.signalConnectedFuture) {
929-
this.signalConnectedFuture = new Future<void>();
929+
this.signalConnectedFuture = new Future<void, Error>();
930930
}
931931
return this.signalConnectedFuture.promise;
932932
}
@@ -2009,7 +2009,7 @@ export default class LocalParticipant extends Participant {
20092009
if (agent) {
20102010
this.activeAgentFuture?.resolve?.(agent);
20112011
} else {
2012-
this.activeAgentFuture?.reject?.('Agent disconnected');
2012+
this.activeAgentFuture?.reject?.(new Error('Agent disconnected'));
20132013
}
20142014
this.activeAgentFuture = undefined;
20152015
}
@@ -2019,7 +2019,7 @@ export default class LocalParticipant extends Participant {
20192019
return Promise.resolve(this.firstActiveAgent);
20202020
}
20212021
if (!this.activeAgentFuture) {
2022-
this.activeAgentFuture = new Future<RemoteParticipant>();
2022+
this.activeAgentFuture = new Future<RemoteParticipant, Error>();
20232023
}
20242024
return this.activeAgentFuture.promise;
20252025
}

src/room/participant/Participant.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export default class Participant extends (EventEmitter as new () => TypedEmitter
9696

9797
protected loggerOptions?: LoggerOptions;
9898

99-
protected activeFuture?: Future<void>;
99+
protected activeFuture?: Future<void, Error>;
100100

101101
protected get logContext() {
102102
return {
@@ -195,7 +195,7 @@ export default class Participant extends (EventEmitter as new () => TypedEmitter
195195
return this.activeFuture.promise;
196196
}
197197

198-
this.activeFuture = new Future<void>();
198+
this.activeFuture = new Future<void, Error>();
199199

200200
this.once(ParticipantEvent.Active, () => {
201201
this.activeFuture?.resolve?.();

src/room/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export interface StreamController<T extends DataStream_Chunk> {
125125
startTime: number;
126126
endTime?: number;
127127
sendingParticipantIdentity: string;
128-
outOfBandFailureRejectingFuture: Future<never>;
128+
outOfBandFailureRejectingFuture: Future<never, Error>;
129129
}
130130

131131
export interface BaseStreamInfo {

src/room/utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -455,12 +455,12 @@ export function getStereoAudioStreamTrack() {
455455
return stereoTrack;
456456
}
457457

458-
export class Future<T> {
458+
export class Future<T, E extends Error> {
459459
promise: Promise<T>;
460460

461461
resolve?: (arg: T) => void;
462462

463-
reject?: (e: any) => void;
463+
reject?: (e: E) => void;
464464

465465
onFinally?: () => void;
466466

@@ -471,7 +471,7 @@ export class Future<T> {
471471
private _isResolved: boolean = false;
472472

473473
constructor(
474-
futureBase?: (resolve: (arg: T) => void, reject: (e: any) => void) => void,
474+
futureBase?: (resolve: (arg: T) => void, reject: (e: E) => void) => void,
475475
onFinally?: () => void,
476476
) {
477477
this.onFinally = onFinally;

0 commit comments

Comments
 (0)