@fbltd/async 1.0.36 → 1.0.39
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/dist/bin/dependency/dependency.js +17 -22
- package/dist/bin/dependency/dependency.stream.js +14 -3
- package/dist/bin/dependency/vanilla/race.stream.js +12 -4
- package/dist/bin/dependency/vanilla/reaction/reaction.js +1 -1
- package/dist/bin/index.js +1 -0
- package/dist/types/dependency/contracts.d.ts +0 -6
- package/dist/types/dependency/dependency.d.ts +1 -2
- package/dist/types/dependency/dependency.stream.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PromiseConfiguration } from "../promise-configuration.js";
|
|
2
2
|
import { baseComparer } from "./utils.js";
|
|
3
|
-
import { observationState } from "./observe.state.js";
|
|
4
3
|
import { symAI } from "../constants.js";
|
|
4
|
+
import { observationState } from "./observe.state.js";
|
|
5
5
|
export class Dependency {
|
|
6
6
|
_value;
|
|
7
7
|
reactionPromise;
|
|
@@ -38,7 +38,7 @@ export class Dependency {
|
|
|
38
38
|
return this._value;
|
|
39
39
|
}
|
|
40
40
|
get done() {
|
|
41
|
-
return this.abortPromise.isFulfilled;
|
|
41
|
+
return !this.abortPromise || this.abortPromise.isFulfilled;
|
|
42
42
|
}
|
|
43
43
|
[symAI](thisStreamConfig = {}) {
|
|
44
44
|
const externalPromises = [];
|
|
@@ -49,24 +49,19 @@ export class Dependency {
|
|
|
49
49
|
firstPromise.resolve();
|
|
50
50
|
externalPromises.push(firstPromise.promise);
|
|
51
51
|
}
|
|
52
|
-
if (thisStreamConfig.externalDispose) {
|
|
53
|
-
externalPromises.push(thisStreamConfig.externalDispose.promise);
|
|
54
|
-
}
|
|
55
52
|
const owner = this;
|
|
56
|
-
let done = false;
|
|
57
53
|
return {
|
|
58
54
|
owner,
|
|
59
|
-
dispose:
|
|
55
|
+
dispose: () => { },
|
|
60
56
|
get isDisposed() {
|
|
61
|
-
return
|
|
57
|
+
return false;
|
|
62
58
|
},
|
|
63
59
|
next: async () => {
|
|
64
60
|
await Promise.race([
|
|
65
|
-
...externalPromises,
|
|
66
61
|
owner.next(),
|
|
62
|
+
...externalPromises,
|
|
67
63
|
]);
|
|
68
|
-
if (this.done
|
|
69
|
-
done = true;
|
|
64
|
+
if (this.done) {
|
|
70
65
|
return { done: true };
|
|
71
66
|
}
|
|
72
67
|
if (firstPromise) {
|
|
@@ -101,24 +96,24 @@ export class Dependency {
|
|
|
101
96
|
* Another subscribe for current race
|
|
102
97
|
*/
|
|
103
98
|
async next() {
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
const done = { done: true };
|
|
100
|
+
const owner = this;
|
|
101
|
+
if (this.done)
|
|
102
|
+
return done;
|
|
103
|
+
await this.getOrCreateRace();
|
|
106
104
|
this._race = undefined;
|
|
107
|
-
if (this.done)
|
|
108
|
-
return
|
|
109
|
-
|
|
105
|
+
if (this.done)
|
|
106
|
+
return done;
|
|
107
|
+
this.abortPromise = new PromiseConfiguration();
|
|
110
108
|
return {
|
|
111
109
|
done: false,
|
|
112
110
|
get value() {
|
|
113
|
-
return
|
|
111
|
+
return owner.value;
|
|
114
112
|
}
|
|
115
113
|
};
|
|
116
114
|
}
|
|
117
|
-
get disposePromise() {
|
|
118
|
-
return this.abortPromise.promise;
|
|
119
|
-
}
|
|
120
115
|
dispose() {
|
|
121
|
-
this.abortPromise
|
|
122
|
-
this.reactionPromise = undefined;
|
|
116
|
+
this.abortPromise?.resolve();
|
|
117
|
+
this.abortPromise = this.reactionPromise = undefined;
|
|
123
118
|
}
|
|
124
119
|
}
|
|
@@ -10,12 +10,23 @@ export class DependencyStream {
|
|
|
10
10
|
constructor(owner) {
|
|
11
11
|
this.owner = owner;
|
|
12
12
|
this.selfDispose = new PromiseConfiguration();
|
|
13
|
-
this.iterator = owner[symAI](
|
|
13
|
+
this.iterator = owner[symAI]();
|
|
14
14
|
}
|
|
15
15
|
[symAI]() {
|
|
16
|
+
const done = { done: true };
|
|
16
17
|
return {
|
|
17
|
-
next: () => {
|
|
18
|
-
|
|
18
|
+
next: async () => {
|
|
19
|
+
if (this.selfDispose.isFulfilled)
|
|
20
|
+
return done;
|
|
21
|
+
const nextRes = this.iterator.next();
|
|
22
|
+
await Promise.race([
|
|
23
|
+
this.selfDispose.promise,
|
|
24
|
+
nextRes,
|
|
25
|
+
]);
|
|
26
|
+
if (this.selfDispose.isFulfilled)
|
|
27
|
+
return done;
|
|
28
|
+
this.selfDispose = new PromiseConfiguration();
|
|
29
|
+
return nextRes;
|
|
19
30
|
}
|
|
20
31
|
};
|
|
21
32
|
}
|
|
@@ -6,7 +6,7 @@ export function raceStream(deps) {
|
|
|
6
6
|
.entries(deps)
|
|
7
7
|
.reduce((acc, [key, dep]) => {
|
|
8
8
|
acc[0].push(key);
|
|
9
|
-
acc[1].push(dep[symAI](
|
|
9
|
+
acc[1].push(dep[symAI]());
|
|
10
10
|
return acc;
|
|
11
11
|
}, [[], []]);
|
|
12
12
|
function isDisposed() {
|
|
@@ -18,12 +18,20 @@ export function raceStream(deps) {
|
|
|
18
18
|
return isDisposed();
|
|
19
19
|
},
|
|
20
20
|
[symAI]() {
|
|
21
|
+
const done = { done: true };
|
|
21
22
|
return {
|
|
22
23
|
next: async () => {
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
if (externalDispose.isFulfilled)
|
|
25
|
+
return done;
|
|
26
|
+
const res = await Promise.race([
|
|
27
|
+
externalDispose.promise,
|
|
28
|
+
...streams.map(s => s.next())
|
|
29
|
+
]);
|
|
30
|
+
if (externalDispose.isFulfilled)
|
|
31
|
+
return done;
|
|
32
|
+
externalDispose = new PromiseConfiguration();
|
|
33
|
+
if (res.done)
|
|
25
34
|
return res;
|
|
26
|
-
}
|
|
27
35
|
const value = keys.reduce((acc, key) => {
|
|
28
36
|
acc[key] = deps[key].value;
|
|
29
37
|
return acc;
|
|
@@ -13,7 +13,7 @@ export function reaction(fn, config) {
|
|
|
13
13
|
depsArray = Array.from(deps);
|
|
14
14
|
beforeValues = depsArray.map(dep => dep.value_unsafe);
|
|
15
15
|
const promises = depsArray.map(dep => dep.next());
|
|
16
|
-
promises.push(dep.disposePromise);
|
|
16
|
+
// promises.push(dep.disposePromise as Promise<any>);
|
|
17
17
|
await Promise.race(depsArray.map(dep => dep.next()));
|
|
18
18
|
if (dep.done)
|
|
19
19
|
return { done: true };
|
package/dist/bin/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { PromiseConfiguration } from "../promise-configuration.js";
|
|
2
1
|
import { Dependency } from "./dependency.ts";
|
|
3
2
|
export interface IStreamIterator<TValue = any> {
|
|
4
3
|
owner: Dependency;
|
|
@@ -29,9 +28,4 @@ export type IThisStreamConfig = Partial<{
|
|
|
29
28
|
* stream dispose has priority over first reaction
|
|
30
29
|
*/
|
|
31
30
|
withReactionOnSubscribe: boolean;
|
|
32
|
-
/**
|
|
33
|
-
* Dispose happens anyway right after current task,
|
|
34
|
-
* wherever value of dependency was changed
|
|
35
|
-
*/
|
|
36
|
-
externalDispose: PromiseConfiguration<any>;
|
|
37
31
|
}>;
|
|
@@ -23,11 +23,10 @@ export declare class Dependency<T = any> {
|
|
|
23
23
|
*/
|
|
24
24
|
next(): Promise<{
|
|
25
25
|
done: true;
|
|
26
|
-
value
|
|
26
|
+
value: void;
|
|
27
27
|
} | {
|
|
28
28
|
done: boolean;
|
|
29
29
|
readonly value: T;
|
|
30
30
|
}>;
|
|
31
|
-
get disposePromise(): Promise<void>;
|
|
32
31
|
dispose(this: Dependency<T>): void;
|
|
33
32
|
}
|
|
@@ -3,7 +3,7 @@ import { symAI } from "../constants.ts";
|
|
|
3
3
|
import { Dependency } from "./dependency.ts";
|
|
4
4
|
export declare class DependencyStream<T = any> implements IDependencyStream {
|
|
5
5
|
readonly owner: Dependency;
|
|
6
|
-
private
|
|
6
|
+
private selfDispose;
|
|
7
7
|
private readonly iterator;
|
|
8
8
|
get isDisposed(): boolean;
|
|
9
9
|
constructor(owner: Dependency);
|
package/dist/types/index.d.ts
CHANGED