diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index 7318d6628..896a00559 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -15,6 +15,7 @@ import { } from "@earendil-works/pi-protocol"; import { Connection } from "./connection.ts"; import { PiDisconnectedError, PiServerError, PiSessionDetachedError, toError } from "./errors.ts"; +import { createPromiseResolvers } from "./promise.ts"; import { ClientState } from "./state.ts"; import type { ConnectionState, @@ -191,7 +192,7 @@ export class PiClient { #request(command: TCommand): Promise> { if (!this.connected) return Promise.reject(new PiDisconnectedError()); const id = `request-${++this.#requestSequence}`; - const { promise, resolve, reject } = Promise.withResolvers(); + const { promise, resolve, reject } = createPromiseResolvers(); this.#pendingRequests.set(id, { command, resolve, reject }); let frame: Uint8Array; try { diff --git a/packages/client/src/connection.ts b/packages/client/src/connection.ts index 8a6d7b904..db4cd62e8 100644 --- a/packages/client/src/connection.ts +++ b/packages/client/src/connection.ts @@ -8,6 +8,7 @@ import { type ServerSnapshot, } from "@earendil-works/pi-protocol"; import { PiDisconnectedError, PiServerError, toDisconnectedError, toError } from "./errors.ts"; +import { createPromiseResolvers, type PromiseResolvers } from "./promise.ts"; import type { ByteTransport, ByteTransportFactory, ByteTransportHandlers } from "./transport.ts"; import type { ConnectionState, ConnectionStateChange } from "./types.ts"; @@ -21,11 +22,11 @@ type ActiveConnection = { type ConnectionLifecycle = | { state: "disconnected" } - | ({ state: "connecting"; handshake: PromiseWithResolvers } & ActiveConnection) + | ({ state: "connecting"; handshake: PromiseResolvers } & ActiveConnection) | ({ state: "connected"; transport: ByteTransport; - handshake: PromiseWithResolvers | undefined; + handshake: PromiseResolvers | undefined; } & ActiveConnection); interface ConnectionOptions { @@ -68,7 +69,7 @@ export class Connection { return Promise.reject(new PiDisconnectedError(`PiClient is already ${this.#lifecycle.state}`)); } const id = ++this.#sequence; - const handshake = Promise.withResolvers(); + const handshake = createPromiseResolvers(); this.#lifecycle = { state: "connecting", id, diff --git a/packages/client/src/promise.ts b/packages/client/src/promise.ts new file mode 100644 index 000000000..7de268060 --- /dev/null +++ b/packages/client/src/promise.ts @@ -0,0 +1,15 @@ +export interface PromiseResolvers { + promise: Promise; + resolve(value: T | PromiseLike): void; + reject(reason?: unknown): void; +} + +export function createPromiseResolvers(): PromiseResolvers { + let resolve!: PromiseResolvers["resolve"]; + let reject!: PromiseResolvers["reject"]; + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise; + reject = rejectPromise; + }); + return { promise, resolve, reject }; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 2f338f058..57e97d6e3 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2022", "module": "Node16", - "lib": ["ES2024"], + "lib": ["ES2022"], "strict": true, "erasableSyntaxOnly": true, "esModuleInterop": true,