@dxos/async 0.8.4-main.f5c0578 → 0.8.4-main.fbb7a13
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/lib/browser/index.mjs +142 -52
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +142 -52
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/cleanup.d.ts +1 -0
- package/dist/types/src/cleanup.d.ts.map +1 -1
- package/dist/types/src/debounce.d.ts +15 -0
- package/dist/types/src/debounce.d.ts.map +1 -1
- package/dist/types/src/persistent-lifecycle.d.ts +2 -2
- package/dist/types/src/persistent-lifecycle.d.ts.map +1 -1
- package/dist/types/src/task-scheduling.d.ts +28 -0
- package/dist/types/src/task-scheduling.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -7
- package/src/cleanup.ts +1 -0
- package/src/debounce.ts +52 -4
- package/src/persistent-lifecycle.ts +2 -2
- package/src/task-scheduling.ts +93 -0
|
@@ -64,29 +64,55 @@ var SubscriptionSet = class {
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
// src/debounce.ts
|
|
67
|
-
var
|
|
67
|
+
var delay = (cb, delay2 = 100) => {
|
|
68
|
+
let pending = false;
|
|
69
|
+
return (...args) => {
|
|
70
|
+
if (pending) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
pending = true;
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
try {
|
|
76
|
+
cb(...args);
|
|
77
|
+
} finally {
|
|
78
|
+
pending = false;
|
|
79
|
+
}
|
|
80
|
+
}, delay2);
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
var debounce = (cb, delay2 = 100) => {
|
|
68
84
|
let t;
|
|
69
85
|
return (...args) => {
|
|
70
86
|
clearTimeout(t);
|
|
71
|
-
t = setTimeout(() => cb(...args),
|
|
87
|
+
t = setTimeout(() => cb(...args), delay2);
|
|
72
88
|
};
|
|
73
89
|
};
|
|
74
|
-
var throttle = (cb,
|
|
90
|
+
var throttle = (cb, delay2 = 100) => {
|
|
75
91
|
let lastCall = 0;
|
|
76
92
|
return (...args) => {
|
|
77
93
|
const now = Date.now();
|
|
78
|
-
if (now - lastCall >=
|
|
94
|
+
if (now - lastCall >= delay2) {
|
|
79
95
|
cb(...args);
|
|
80
96
|
lastCall = now;
|
|
81
97
|
}
|
|
82
98
|
};
|
|
83
99
|
};
|
|
84
|
-
var debounceAndThrottle = (cb,
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
var debounceAndThrottle = (cb, delay2 = 100) => {
|
|
101
|
+
let timeout2;
|
|
102
|
+
let lastCall = 0;
|
|
87
103
|
return (...args) => {
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
const delta = now - lastCall;
|
|
106
|
+
clearTimeout(timeout2);
|
|
107
|
+
if (delta >= delay2) {
|
|
108
|
+
cb(...args);
|
|
109
|
+
lastCall = now;
|
|
110
|
+
} else {
|
|
111
|
+
timeout2 = setTimeout(() => {
|
|
112
|
+
cb(...args);
|
|
113
|
+
lastCall = Date.now();
|
|
114
|
+
}, delay2 - delta);
|
|
115
|
+
}
|
|
90
116
|
};
|
|
91
117
|
};
|
|
92
118
|
|
|
@@ -451,12 +477,11 @@ var EventListener = class {
|
|
|
451
477
|
once;
|
|
452
478
|
weak;
|
|
453
479
|
callback;
|
|
454
|
-
_clearDispose;
|
|
480
|
+
_clearDispose = void 0;
|
|
455
481
|
constructor(event, listener, ctx, once, weak) {
|
|
456
482
|
this.ctx = ctx;
|
|
457
483
|
this.once = once;
|
|
458
484
|
this.weak = weak;
|
|
459
|
-
this._clearDispose = void 0;
|
|
460
485
|
this._clearDispose = ctx.onDispose(() => {
|
|
461
486
|
event._removeListener(this);
|
|
462
487
|
});
|
|
@@ -629,23 +654,22 @@ var trigger = (timeout2) => {
|
|
|
629
654
|
resolver
|
|
630
655
|
];
|
|
631
656
|
};
|
|
632
|
-
var TriggerState = /* @__PURE__ */ function(TriggerState2) {
|
|
657
|
+
var TriggerState = /* @__PURE__ */ (function(TriggerState2) {
|
|
633
658
|
TriggerState2["WAITING"] = "WAITING";
|
|
634
659
|
TriggerState2["RESOLVED"] = "RESOLVED";
|
|
635
660
|
TriggerState2["REJECTED"] = "REJECTED";
|
|
636
661
|
return TriggerState2;
|
|
637
|
-
}({});
|
|
662
|
+
})({});
|
|
638
663
|
var Trigger = class {
|
|
639
664
|
_options;
|
|
640
665
|
_promise;
|
|
641
666
|
_resolve;
|
|
642
667
|
_reject;
|
|
643
|
-
_state;
|
|
668
|
+
_state = "WAITING";
|
|
644
669
|
constructor(_options = {
|
|
645
670
|
autoReset: false
|
|
646
671
|
}) {
|
|
647
672
|
this._options = _options;
|
|
648
|
-
this._state = "WAITING";
|
|
649
673
|
this.reset();
|
|
650
674
|
}
|
|
651
675
|
get state() {
|
|
@@ -755,23 +779,11 @@ var latch = ({ count = 1, timeout: timeout2 } = {}) => {
|
|
|
755
779
|
// src/observable.ts
|
|
756
780
|
var MulticastObservable = class _MulticastObservable extends Observable {
|
|
757
781
|
_value;
|
|
758
|
-
_observers;
|
|
782
|
+
_observers = /* @__PURE__ */ new Set();
|
|
759
783
|
_observable;
|
|
760
|
-
_completed;
|
|
784
|
+
_completed = new Trigger();
|
|
761
785
|
constructor(subscriber, _value) {
|
|
762
|
-
super((observer) => this._subscribe(observer)), this._value = _value
|
|
763
|
-
next: (value) => {
|
|
764
|
-
this._value = value;
|
|
765
|
-
this._observers.forEach((observer) => observer.next?.(value));
|
|
766
|
-
},
|
|
767
|
-
error: (err) => {
|
|
768
|
-
this._observers.forEach((observer) => observer.error?.(err));
|
|
769
|
-
},
|
|
770
|
-
complete: () => {
|
|
771
|
-
this._completed.wake();
|
|
772
|
-
this._observers.forEach((observer) => observer.complete?.());
|
|
773
|
-
}
|
|
774
|
-
};
|
|
786
|
+
super((observer) => this._subscribe(observer)), this._value = _value;
|
|
775
787
|
this._observable = typeof subscriber === "function" ? new Observable(subscriber) : subscriber;
|
|
776
788
|
this._observable.subscribe(this._handlers);
|
|
777
789
|
}
|
|
@@ -855,7 +867,19 @@ var MulticastObservable = class _MulticastObservable extends Observable {
|
|
|
855
867
|
this._observers.delete(observer);
|
|
856
868
|
};
|
|
857
869
|
}
|
|
858
|
-
_handlers
|
|
870
|
+
_handlers = {
|
|
871
|
+
next: (value) => {
|
|
872
|
+
this._value = value;
|
|
873
|
+
this._observers.forEach((observer) => observer.next?.(value));
|
|
874
|
+
},
|
|
875
|
+
error: (err) => {
|
|
876
|
+
this._observers.forEach((observer) => observer.error?.(err));
|
|
877
|
+
},
|
|
878
|
+
complete: () => {
|
|
879
|
+
this._completed.wake();
|
|
880
|
+
this._observers.forEach((observer) => observer.complete?.());
|
|
881
|
+
}
|
|
882
|
+
};
|
|
859
883
|
};
|
|
860
884
|
var EMPTY_OBSERVABLE = MulticastObservable.of(null);
|
|
861
885
|
|
|
@@ -888,9 +912,9 @@ var ObservableProvider = class {
|
|
|
888
912
|
};
|
|
889
913
|
var CancellableObservableProvider = class extends ObservableProvider {
|
|
890
914
|
_handleCancel;
|
|
891
|
-
_cancelled;
|
|
915
|
+
_cancelled = false;
|
|
892
916
|
constructor(_handleCancel) {
|
|
893
|
-
super(), this._handleCancel = _handleCancel
|
|
917
|
+
super(), this._handleCancel = _handleCancel;
|
|
894
918
|
}
|
|
895
919
|
get cancelled() {
|
|
896
920
|
return this._cancelled;
|
|
@@ -1002,15 +1026,12 @@ if (enabled) {
|
|
|
1002
1026
|
var DeferredTask = class {
|
|
1003
1027
|
_ctx;
|
|
1004
1028
|
_callback;
|
|
1005
|
-
_scheduled;
|
|
1006
|
-
_currentTask;
|
|
1007
|
-
_nextTask;
|
|
1029
|
+
_scheduled = false;
|
|
1030
|
+
_currentTask = null;
|
|
1031
|
+
_nextTask = new Trigger();
|
|
1008
1032
|
constructor(_ctx, _callback) {
|
|
1009
1033
|
this._ctx = _ctx;
|
|
1010
1034
|
this._callback = _callback;
|
|
1011
|
-
this._scheduled = false;
|
|
1012
|
-
this._currentTask = null;
|
|
1013
|
-
this._nextTask = new Trigger();
|
|
1014
1035
|
}
|
|
1015
1036
|
get scheduled() {
|
|
1016
1037
|
return this._scheduled;
|
|
@@ -1051,6 +1072,78 @@ var DeferredTask = class {
|
|
|
1051
1072
|
await this._currentTask;
|
|
1052
1073
|
}
|
|
1053
1074
|
};
|
|
1075
|
+
var AsyncTask = class {
|
|
1076
|
+
#callback;
|
|
1077
|
+
#ctx = void 0;
|
|
1078
|
+
#scheduled = false;
|
|
1079
|
+
#currentTask = null;
|
|
1080
|
+
#nextTask = new Trigger();
|
|
1081
|
+
constructor(callback) {
|
|
1082
|
+
this.#callback = callback;
|
|
1083
|
+
}
|
|
1084
|
+
get scheduled() {
|
|
1085
|
+
return this.#scheduled;
|
|
1086
|
+
}
|
|
1087
|
+
/**
|
|
1088
|
+
* Context of the resource that owns the task.
|
|
1089
|
+
* When the context is disposed, the task is cancelled and cannot be scheduled again.
|
|
1090
|
+
*/
|
|
1091
|
+
// TODO(dmaretskyi): We don't really need to pass ctx in here, since close will also signal dispose.
|
|
1092
|
+
open(ctx) {
|
|
1093
|
+
this.#ctx = ctx;
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Closes the task and waits for it to finish if it is running.
|
|
1097
|
+
*/
|
|
1098
|
+
async close() {
|
|
1099
|
+
this.#ctx = void 0;
|
|
1100
|
+
await this.join();
|
|
1101
|
+
}
|
|
1102
|
+
[Symbol.asyncDispose]() {
|
|
1103
|
+
return this.close();
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Schedule the task to run asynchronously.
|
|
1107
|
+
*/
|
|
1108
|
+
schedule() {
|
|
1109
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1110
|
+
throw new Error("AsyncTask not open");
|
|
1111
|
+
}
|
|
1112
|
+
if (this.#scheduled) {
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
scheduleTask(this.#ctx, async () => {
|
|
1116
|
+
await this.#currentTask;
|
|
1117
|
+
if (!this.#ctx || this.#ctx.disposed) {
|
|
1118
|
+
return;
|
|
1119
|
+
}
|
|
1120
|
+
this.#scheduled = false;
|
|
1121
|
+
const completionTrigger = this.#nextTask;
|
|
1122
|
+
this.#nextTask = new Trigger();
|
|
1123
|
+
this.#currentTask = runInContextAsync(this.#ctx, () => this.#callback()).then(() => {
|
|
1124
|
+
completionTrigger.wake();
|
|
1125
|
+
});
|
|
1126
|
+
});
|
|
1127
|
+
this.#scheduled = true;
|
|
1128
|
+
}
|
|
1129
|
+
/**
|
|
1130
|
+
* Schedule the task to run and wait for it to finish.
|
|
1131
|
+
*/
|
|
1132
|
+
async runBlocking() {
|
|
1133
|
+
if (this.#ctx?.disposed) {
|
|
1134
|
+
throw new ContextDisposedError2();
|
|
1135
|
+
}
|
|
1136
|
+
this.schedule();
|
|
1137
|
+
await this.#nextTask.wait();
|
|
1138
|
+
}
|
|
1139
|
+
/**
|
|
1140
|
+
* Waits for the current task to finish if it is running.
|
|
1141
|
+
* Does not schedule a new task.
|
|
1142
|
+
*/
|
|
1143
|
+
async join() {
|
|
1144
|
+
await this.#currentTask;
|
|
1145
|
+
}
|
|
1146
|
+
};
|
|
1054
1147
|
var runInContext = (ctx, fn) => {
|
|
1055
1148
|
try {
|
|
1056
1149
|
fn();
|
|
@@ -1447,13 +1540,11 @@ var untilError = (cb) => {
|
|
|
1447
1540
|
// src/timer.ts
|
|
1448
1541
|
var Timer = class {
|
|
1449
1542
|
_callback;
|
|
1450
|
-
_state;
|
|
1543
|
+
_state = new Event();
|
|
1451
1544
|
_timer;
|
|
1452
|
-
_count;
|
|
1545
|
+
_count = 0;
|
|
1453
1546
|
constructor(_callback) {
|
|
1454
1547
|
this._callback = _callback;
|
|
1455
|
-
this._state = new Event();
|
|
1456
|
-
this._count = 0;
|
|
1457
1548
|
}
|
|
1458
1549
|
get state() {
|
|
1459
1550
|
return this._state;
|
|
@@ -1506,16 +1597,13 @@ var UpdateScheduler = class {
|
|
|
1506
1597
|
* Promise that resolves when the callback is done.
|
|
1507
1598
|
* Never rejects.
|
|
1508
1599
|
*/
|
|
1509
|
-
_promise;
|
|
1510
|
-
_scheduled;
|
|
1511
|
-
_lastUpdateTime;
|
|
1600
|
+
_promise = null;
|
|
1601
|
+
_scheduled = false;
|
|
1602
|
+
_lastUpdateTime = -TIME_PERIOD;
|
|
1512
1603
|
constructor(_ctx, _callback, _params = {}) {
|
|
1513
1604
|
this._ctx = _ctx;
|
|
1514
1605
|
this._callback = _callback;
|
|
1515
1606
|
this._params = _params;
|
|
1516
|
-
this._promise = null;
|
|
1517
|
-
this._scheduled = false;
|
|
1518
|
-
this._lastUpdateTime = -TIME_PERIOD;
|
|
1519
1607
|
_ctx.onDispose(async () => {
|
|
1520
1608
|
await this._promise;
|
|
1521
1609
|
});
|
|
@@ -1528,13 +1616,13 @@ var UpdateScheduler = class {
|
|
|
1528
1616
|
await this._promise;
|
|
1529
1617
|
if (this._params.maxFrequency) {
|
|
1530
1618
|
const now = performance.now();
|
|
1531
|
-
const
|
|
1532
|
-
if (
|
|
1619
|
+
const delay2 = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
|
|
1620
|
+
if (delay2 > 0) {
|
|
1533
1621
|
await new Promise((resolve) => {
|
|
1534
1622
|
const timeoutId = setTimeout(() => {
|
|
1535
1623
|
clearContext();
|
|
1536
1624
|
resolve();
|
|
1537
|
-
},
|
|
1625
|
+
}, delay2);
|
|
1538
1626
|
const clearContext = this._ctx.onDispose(() => {
|
|
1539
1627
|
clearTimeout(timeoutId);
|
|
1540
1628
|
resolve();
|
|
@@ -1578,6 +1666,7 @@ var UpdateScheduler = class {
|
|
|
1578
1666
|
}
|
|
1579
1667
|
};
|
|
1580
1668
|
export {
|
|
1669
|
+
AsyncTask,
|
|
1581
1670
|
CancellableObservableProvider,
|
|
1582
1671
|
DeferredTask,
|
|
1583
1672
|
Event,
|
|
@@ -1604,6 +1693,7 @@ export {
|
|
|
1604
1693
|
combine,
|
|
1605
1694
|
debounce,
|
|
1606
1695
|
debounceAndThrottle,
|
|
1696
|
+
delay,
|
|
1607
1697
|
dumpLeaks,
|
|
1608
1698
|
interval,
|
|
1609
1699
|
latch,
|