From dcbfeece5e559b60a615f0aa9b933b202d34bf8b Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 25 Oct 2021 00:29:37 +0200 Subject: feat(web): add xtext websocket client --- language-web/src/main/js/editor/PendingRequest.ts | 47 +++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 language-web/src/main/js/editor/PendingRequest.ts (limited to 'language-web/src/main/js/editor/PendingRequest.ts') diff --git a/language-web/src/main/js/editor/PendingRequest.ts b/language-web/src/main/js/editor/PendingRequest.ts new file mode 100644 index 00000000..784f06ec --- /dev/null +++ b/language-web/src/main/js/editor/PendingRequest.ts @@ -0,0 +1,47 @@ +import { getLogger } from '../logging'; + +const REQUEST_TIMEOUT_MS = 1000; + +const log = getLogger('PendingRequest'); + +export class PendingRequest { + private readonly resolveCallback: (value: unknown) => void; + + private readonly rejectCallback: (reason?: unknown) => void; + + private resolved = false; + + private timeoutId: NodeJS.Timeout; + + constructor(resolve: (value: unknown) => void, reject: (reason?: unknown) => void) { + this.resolveCallback = resolve; + this.rejectCallback = reject; + this.timeoutId = setTimeout(() => { + if (!this.resolved) { + this.reject(new Error('Request timed out')); + } + }, REQUEST_TIMEOUT_MS); + } + + resolve(value: unknown): void { + if (this.resolved) { + log.warn('Trying to resolve already resolved promise'); + return; + } + this.markResolved(); + this.resolveCallback(value); + } + + reject(reason?: unknown): void { + if (this.resolved) { + log.warn('Trying to reject already resolved promise'); + } + this.markResolved(); + this.rejectCallback(reason); + } + + private markResolved() { + this.resolved = true; + clearTimeout(this.timeoutId); + } +} -- cgit v1.2.3-54-g00ecf