Skip to content

Commit 149869b

Browse files
[WIP] fixup deferred
1 parent b8749e8 commit 149869b

File tree

2 files changed

+58
-34
lines changed

2 files changed

+58
-34
lines changed

src/utils/utils.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,31 @@ export interface ParseBodyOptions {
4949
json?: boolean;
5050
}
5151

52+
export class Deferred<T = unknown> extends Promise<T> {
53+
resolve: (value: T | PromiseLike<T>) => void;
54+
reject: (reason?: unknown) => void;
55+
56+
constructor() {
57+
let res: (value: T | PromiseLike<T>) => void;
58+
let rej: (reason?: unknown) => void;
59+
60+
super((resolve, reject) => {
61+
res = resolve;
62+
rej = reject;
63+
});
64+
65+
this.resolve = res!;
66+
this.reject = rej!;
67+
}
68+
69+
/**
70+
* Automatic re-instantiation (like `.then()` chaining) needs to provide a Promise and not a Deferred.
71+
*/
72+
static get [Symbol.species]() {
73+
return Promise;
74+
}
75+
}
76+
5277
function getCallChain(depth: number = 8): string {
5378
const stack = new Error().stack?.split("\n").slice(2, depth + 2) ?? [];
5479
return stack

tests/utils/network.ts

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as fakeParameters from "mediasoup-client/lib/test/fakeParameters";
66
import * as auth from "#src/services/auth";
77
import * as http from "#src/services/http";
88
import * as resources from "#src/services/resources";
9+
import { Deferred } from "#src/utils/utils";
910
import { SfuClient, SfuClientState } from "#src/client";
1011
import { Channel } from "#src/models/channel";
1112
import type { Session } from "#src/models/session";
@@ -38,7 +39,7 @@ interface ConnectionResult {
3839
/** Client-side SFU client instance */
3940
sfuClient: SfuClient;
4041
/** Promise resolving to true when client is connected */
41-
isConnected: Promise<boolean>;
42+
isConnected: Deferred<boolean>;
4243
}
4344

4445
/**
@@ -149,39 +150,37 @@ export class LocalNetwork {
149150
};
150151

151152
// Set up authentication promise
152-
const isClientAuthenticated = new Promise<boolean>((resolve, reject) => {
153-
const handleStateChange = (event: CustomEvent) => {
154-
const { state } = event.detail;
155-
switch (state) {
156-
case SfuClientState.AUTHENTICATED:
157-
sfuClient.removeEventListener(
158-
"stateChange",
159-
handleStateChange as EventListener
160-
);
161-
resolve(true);
162-
break;
163-
case SfuClientState.CLOSED:
164-
sfuClient.removeEventListener(
165-
"stateChange",
166-
handleStateChange as EventListener
167-
);
168-
reject(new Error("client closed"));
169-
break;
170-
}
171-
};
172-
sfuClient.addEventListener("stateChange", handleStateChange as EventListener);
173-
});
174-
175-
const isConnected = new Promise<boolean>((resolve, reject) => {
176-
const connectedHandler = (event: CustomEvent) => {
177-
const { state } = event.detail;
178-
if (state === SfuClientState.CONNECTED) {
179-
sfuClient.removeEventListener("stateChange", connectedHandler as EventListener);
180-
resolve(true);
181-
}
182-
};
183-
sfuClient.addEventListener("stateChange", connectedHandler as EventListener);
184-
});
153+
const isClientAuthenticated = new Deferred<boolean>();
154+
const handleStateChange = (event: CustomEvent) => {
155+
const { state } = event.detail;
156+
switch (state) {
157+
case SfuClientState.AUTHENTICATED:
158+
sfuClient.removeEventListener(
159+
"stateChange",
160+
handleStateChange as EventListener
161+
);
162+
isClientAuthenticated.resolve(true);
163+
break;
164+
case SfuClientState.CLOSED:
165+
sfuClient.removeEventListener(
166+
"stateChange",
167+
handleStateChange as EventListener
168+
);
169+
isClientAuthenticated.reject(new Error("client closed"));
170+
break;
171+
}
172+
};
173+
sfuClient.addEventListener("stateChange", handleStateChange as EventListener);
174+
175+
const isConnected = new Deferred<boolean>();
176+
const connectedHandler = (event: CustomEvent) => {
177+
const { state } = event.detail;
178+
if (state === SfuClientState.CONNECTED) {
179+
sfuClient.removeEventListener("stateChange", connectedHandler as EventListener);
180+
isConnected.resolve(true);
181+
}
182+
};
183+
sfuClient.addEventListener("stateChange", connectedHandler as EventListener);
185184

186185
// Start connection
187186
sfuClient.connect(

0 commit comments

Comments
 (0)