diff options
author | 2021-10-25 00:29:37 +0200 | |
---|---|---|
committer | 2021-10-31 19:26:11 +0100 | |
commit | dcbfeece5e559b60a615f0aa9b933b202d34bf8b (patch) | |
tree | afdacff7492284f5f8cc147c4b84e4ba5db259b3 /language-web/src/main/js/editor/PendingRequest.ts | |
parent | test(web): more websocket integration tests (diff) | |
download | refinery-dcbfeece5e559b60a615f0aa9b933b202d34bf8b.tar.gz refinery-dcbfeece5e559b60a615f0aa9b933b202d34bf8b.tar.zst refinery-dcbfeece5e559b60a615f0aa9b933b202d34bf8b.zip |
feat(web): add xtext websocket client
Diffstat (limited to 'language-web/src/main/js/editor/PendingRequest.ts')
-rw-r--r-- | language-web/src/main/js/editor/PendingRequest.ts | 47 |
1 files changed, 47 insertions, 0 deletions
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 @@ | |||
1 | import { getLogger } from '../logging'; | ||
2 | |||
3 | const REQUEST_TIMEOUT_MS = 1000; | ||
4 | |||
5 | const log = getLogger('PendingRequest'); | ||
6 | |||
7 | export class PendingRequest { | ||
8 | private readonly resolveCallback: (value: unknown) => void; | ||
9 | |||
10 | private readonly rejectCallback: (reason?: unknown) => void; | ||
11 | |||
12 | private resolved = false; | ||
13 | |||
14 | private timeoutId: NodeJS.Timeout; | ||
15 | |||
16 | constructor(resolve: (value: unknown) => void, reject: (reason?: unknown) => void) { | ||
17 | this.resolveCallback = resolve; | ||
18 | this.rejectCallback = reject; | ||
19 | this.timeoutId = setTimeout(() => { | ||
20 | if (!this.resolved) { | ||
21 | this.reject(new Error('Request timed out')); | ||
22 | } | ||
23 | }, REQUEST_TIMEOUT_MS); | ||
24 | } | ||
25 | |||
26 | resolve(value: unknown): void { | ||
27 | if (this.resolved) { | ||
28 | log.warn('Trying to resolve already resolved promise'); | ||
29 | return; | ||
30 | } | ||
31 | this.markResolved(); | ||
32 | this.resolveCallback(value); | ||
33 | } | ||
34 | |||
35 | reject(reason?: unknown): void { | ||
36 | if (this.resolved) { | ||
37 | log.warn('Trying to reject already resolved promise'); | ||
38 | } | ||
39 | this.markResolved(); | ||
40 | this.rejectCallback(reason); | ||
41 | } | ||
42 | |||
43 | private markResolved() { | ||
44 | this.resolved = true; | ||
45 | clearTimeout(this.timeoutId); | ||
46 | } | ||
47 | } | ||