@dxos/async 0.5.4 → 0.5.5-main.23d7ea6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/async",
3
- "version": "0.5.4",
3
+ "version": "0.5.5-main.23d7ea6",
4
4
  "description": "Async utilities.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -18,12 +18,12 @@
18
18
  "dependencies": {
19
19
  "zen-observable": "^0.10.0",
20
20
  "zen-push": "^0.3.1",
21
- "@dxos/context": "0.5.4",
22
- "@dxos/debug": "0.5.4",
23
- "@dxos/invariant": "0.5.4",
24
- "@dxos/log": "0.5.4",
25
- "@dxos/node-std": "0.5.4",
26
- "@dxos/util": "0.5.4"
21
+ "@dxos/context": "0.5.5-main.23d7ea6",
22
+ "@dxos/debug": "0.5.5-main.23d7ea6",
23
+ "@dxos/log": "0.5.5-main.23d7ea6",
24
+ "@dxos/invariant": "0.5.5-main.23d7ea6",
25
+ "@dxos/util": "0.5.5-main.23d7ea6",
26
+ "@dxos/node-std": "0.5.5-main.23d7ea6"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/zen-observable": "^0.8.3"
@@ -2,12 +2,15 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import { expect } from 'chai';
5
+ import chai, { expect } from 'chai';
6
+ import chaiAsPromised from 'chai-as-promised';
6
7
 
7
8
  import { describe, test } from '@dxos/test';
8
9
 
9
10
  import { sleep } from './timeout';
10
- import { Trigger, trigger } from './trigger';
11
+ import { Trigger, TriggerState, trigger } from './trigger';
12
+
13
+ chai.use(chaiAsPromised);
11
14
 
12
15
  describe('trigger', () => {
13
16
  test('trigger', async () => {
@@ -27,4 +30,32 @@ describe('trigger', () => {
27
30
  trigger.reset();
28
31
  await sleep(10);
29
32
  });
33
+
34
+ test('states are set correctly', async () => {
35
+ const trigger = new Trigger<string>();
36
+
37
+ expect(trigger.state).to.equal(TriggerState.WAITING);
38
+
39
+ {
40
+ const promise = trigger.wait();
41
+ trigger.wake('test');
42
+ expect(await promise).to.equal('test');
43
+ expect(trigger.state).to.equal(TriggerState.RESOLVED);
44
+ }
45
+
46
+ {
47
+ trigger.reset();
48
+ expect(trigger.state).to.equal(TriggerState.WAITING);
49
+ }
50
+
51
+ {
52
+ const error = new Error('Test error');
53
+ const promise = trigger.wait();
54
+ trigger.throw(error);
55
+ await expect(promise).to.be.rejectedWith(error);
56
+ expect(trigger.state).to.equal(TriggerState.REJECTED);
57
+ trigger.reset();
58
+ expect(trigger.state).to.equal(TriggerState.WAITING);
59
+ }
60
+ });
30
61
  });
package/src/trigger.ts CHANGED
@@ -31,12 +31,19 @@ export type TriggerOptions = {
31
31
  autoReset: boolean;
32
32
  };
33
33
 
34
+ export enum TriggerState {
35
+ WAITING = 'WAITING',
36
+ RESOLVED = 'RESOLVED',
37
+ REJECTED = 'REJECTED',
38
+ }
39
+
34
40
  /**
35
41
  * Enables blocked listeners to be awakened with optional timeouts.
36
42
  *
37
43
  * Has two states:
38
44
  * - WAITING: promise is in pending state and will be resolved once `wake()` is called.
39
- * - READY: promise is already resolved, and all calls to `wait()` resolve immediately.
45
+ * - RESOLVED: promise is already resolved, and all calls to `wait()` resolve immediately.
46
+ * - REJECTED: promise is rejected, and all calls to `wait()` return rejected promise.
40
47
  *
41
48
  * Trigger starts in WAITING state initially.
42
49
  * Use `reset()` to switch resolved trigger back to WAITING state.
@@ -45,11 +52,16 @@ export class Trigger<T = void> {
45
52
  private _promise!: Promise<T>;
46
53
  private _resolve!: (value: T | PromiseLike<T>) => void;
47
54
  private _reject!: (error: Error) => void;
55
+ private _state: TriggerState = TriggerState.WAITING;
48
56
 
49
57
  constructor(private _options: TriggerOptions = { autoReset: false }) {
50
58
  this.reset();
51
59
  }
52
60
 
61
+ get state() {
62
+ return this._state;
63
+ }
64
+
53
65
  /**
54
66
  * Wait until wake is called, with optional timeout.
55
67
  */
@@ -66,6 +78,7 @@ export class Trigger<T = void> {
66
78
  * NOOP if the trigger is already resolved.
67
79
  */
68
80
  wake(value: T) {
81
+ this._state = TriggerState.RESOLVED;
69
82
  this._resolve(value);
70
83
  if (this._options.autoReset) {
71
84
  return this.reset();
@@ -78,6 +91,7 @@ export class Trigger<T = void> {
78
91
  * Reset promise (new waiters will wait).
79
92
  */
80
93
  reset() {
94
+ this._state = TriggerState.WAITING;
81
95
  this._promise = new Promise<T>((resolve, reject) => {
82
96
  this._resolve = resolve;
83
97
  this._reject = reject;
@@ -92,6 +106,7 @@ export class Trigger<T = void> {
92
106
  * NOOP if the trigger is already resolved.
93
107
  */
94
108
  throw(error: Error) {
109
+ this._state = TriggerState.REJECTED;
95
110
  this._reject(error);
96
111
  if (this._options.autoReset) {
97
112
  return this.reset();