diff --git a/src/plugin/settings.ts b/src/plugin/settings.ts index 1fbd45f..f2163cd 100644 --- a/src/plugin/settings.ts +++ b/src/plugin/settings.ts @@ -1,4 +1,5 @@ import type { IDisposable, JsonObject } from "@elgato/utils"; +import { withResolvers } from "@elgato/utils"; import { randomUUID } from "node:crypto"; import type { DidReceiveGlobalSettings, DidReceiveSettings } from "../api/index.js"; @@ -8,6 +9,8 @@ import { ActionEvent } from "./events/action-event.js"; import { DidReceiveGlobalSettingsEvent, type DidReceiveSettingsEvent } from "./events/index.js"; import { requiresVersion } from "./validation.js"; +const REQUEST_TIMEOUT = 15 * 1000; // 15s + let __useExperimentalMessageIdentifiers = false; export const settings = { @@ -41,14 +44,29 @@ export const settings = { * @returns Promise containing the plugin's global settings. */ getGlobalSettings: (): Promise => { - return new Promise((resolve) => { - connection.once("didReceiveGlobalSettings", (ev: DidReceiveGlobalSettings) => resolve(ev.payload.settings)); - connection.send({ - event: "getGlobalSettings", - context: connection.registrationParameters.pluginUUID, - id: randomUUID(), - }); + const id = randomUUID(); + const { promise, resolve, reject } = withResolvers(); + + const timeoutId = setTimeout(() => { + listener.dispose(); + reject(new Error("getGlobalSettings timed out")); + }, REQUEST_TIMEOUT); + + const listener = connection.disposableOn("didReceiveGlobalSettings", (ev: DidReceiveGlobalSettings): void => { + if (ev.id === id) { + clearTimeout(timeoutId); + listener.dispose(); + resolve(ev.payload.settings); + } + }); + + connection.send({ + event: "getGlobalSettings", + context: connection.registrationParameters.pluginUUID, + id, }); + + return promise; }, /**