@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.
@@ -64,29 +64,55 @@ var SubscriptionSet = class {
64
64
  };
65
65
 
66
66
  // src/debounce.ts
67
- var debounce = (cb, delay = 100) => {
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), delay);
87
+ t = setTimeout(() => cb(...args), delay2);
72
88
  };
73
89
  };
74
- var throttle = (cb, delay = 100) => {
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 >= delay) {
94
+ if (now - lastCall >= delay2) {
79
95
  cb(...args);
80
96
  lastCall = now;
81
97
  }
82
98
  };
83
99
  };
84
- var debounceAndThrottle = (cb, delay = 100) => {
85
- const debounced = debounce(cb, delay);
86
- const throttled = throttle(cb, delay);
100
+ var debounceAndThrottle = (cb, delay2 = 100) => {
101
+ let timeout2;
102
+ let lastCall = 0;
87
103
  return (...args) => {
88
- debounced(...args);
89
- throttled(...args);
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, this._observers = /* @__PURE__ */ new Set(), this._completed = new Trigger(), this._handlers = {
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, this._cancelled = false;
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 delay = this._lastUpdateTime + TIME_PERIOD / this._params.maxFrequency - now;
1532
- if (delay > 0) {
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
- }, delay);
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,