@catbee/utils 0.0.8-rc.0 → 0.0.8-rc.2
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/README.md +25 -1
- package/build/esm/config.d.ts +0 -1
- package/build/esm/config.js +6 -7
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.js +0 -1
- package/build/esm/servers/server.builder.d.ts +0 -1
- package/build/esm/servers/server.builder.js +99 -147
- package/build/esm/servers/server.d.ts +0 -1
- package/build/esm/servers/server.js +591 -876
- package/build/esm/types/api-response.d.ts +0 -1
- package/build/esm/types/api-response.js +0 -1
- package/build/esm/types/index.d.ts +0 -1
- package/build/esm/types/index.js +0 -1
- package/build/esm/types/server.d.ts +0 -1
- package/build/esm/types/server.js +0 -1
- package/build/esm/utils/array.utils.d.ts +0 -1
- package/build/esm/utils/array.utils.js +48 -86
- package/build/esm/utils/async.utils.d.ts +0 -1
- package/build/esm/utils/async.utils.js +247 -524
- package/build/esm/utils/cache.utils.d.ts +0 -1
- package/build/esm/utils/cache.utils.js +96 -301
- package/build/esm/utils/context-store.utils.d.ts +0 -1
- package/build/esm/utils/context-store.utils.js +62 -79
- package/build/esm/utils/crypto.utils.d.ts +0 -1
- package/build/esm/utils/crypto.utils.js +78 -175
- package/build/esm/utils/date.utils.d.ts +0 -1
- package/build/esm/utils/date.utils.js +47 -53
- package/build/esm/utils/decorators.utils.d.ts +201 -5
- package/build/esm/utils/decorators.utils.js +632 -285
- package/build/esm/utils/dir.utils.d.ts +0 -1
- package/build/esm/utils/dir.utils.js +264 -786
- package/build/esm/utils/env.utils.d.ts +0 -1
- package/build/esm/utils/env.utils.js +180 -271
- package/build/esm/utils/exception.utils.d.ts +0 -1
- package/build/esm/utils/exception.utils.js +112 -289
- package/build/esm/utils/fs.utils.d.ts +0 -1
- package/build/esm/utils/fs.utils.js +169 -401
- package/build/esm/utils/http-status-codes.d.ts +0 -1
- package/build/esm/utils/http-status-codes.js +0 -1
- package/build/esm/utils/id.utils.d.ts +0 -1
- package/build/esm/utils/id.utils.js +5 -9
- package/build/esm/utils/logger.utils.d.ts +0 -1
- package/build/esm/utils/logger.utils.js +34 -71
- package/build/esm/utils/middleware.utils.d.ts +0 -1
- package/build/esm/utils/middleware.utils.js +65 -155
- package/build/esm/utils/obj.utils.d.ts +0 -1
- package/build/esm/utils/obj.utils.js +69 -176
- package/build/esm/utils/performance.utils.d.ts +0 -1
- package/build/esm/utils/performance.utils.js +92 -195
- package/build/esm/utils/request.utils.d.ts +0 -1
- package/build/esm/utils/request.utils.js +41 -74
- package/build/esm/utils/response.utils.d.ts +0 -1
- package/build/esm/utils/response.utils.js +84 -107
- package/build/esm/utils/stream.utils.d.ts +0 -1
- package/build/esm/utils/stream.utils.js +38 -113
- package/build/esm/utils/string.utils.d.ts +0 -1
- package/build/esm/utils/string.utils.js +6 -11
- package/build/esm/utils/type.utils.d.ts +0 -1
- package/build/esm/utils/type.utils.js +8 -12
- package/build/esm/utils/url.utils.d.ts +0 -1
- package/build/esm/utils/url.utils.js +49 -127
- package/build/esm/utils/validate.utils.d.ts +0 -1
- package/build/esm/utils/validate.utils.js +23 -40
- package/package.json +3 -33
- package/build/esm/config.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/servers/server.builder.js.map +0 -1
- package/build/esm/servers/server.js.map +0 -1
- package/build/esm/types/api-response.js.map +0 -1
- package/build/esm/types/index.js.map +0 -1
- package/build/esm/types/server.js.map +0 -1
- package/build/esm/utils/array.utils.js.map +0 -1
- package/build/esm/utils/async.utils.js.map +0 -1
- package/build/esm/utils/cache.utils.js.map +0 -1
- package/build/esm/utils/context-store.utils.js.map +0 -1
- package/build/esm/utils/crypto.utils.js.map +0 -1
- package/build/esm/utils/date.utils.js.map +0 -1
- package/build/esm/utils/decorators.utils.js.map +0 -1
- package/build/esm/utils/dir.utils.js.map +0 -1
- package/build/esm/utils/env.utils.js.map +0 -1
- package/build/esm/utils/exception.utils.js.map +0 -1
- package/build/esm/utils/fs.utils.js.map +0 -1
- package/build/esm/utils/http-status-codes.js.map +0 -1
- package/build/esm/utils/id.utils.js.map +0 -1
- package/build/esm/utils/logger.utils.js.map +0 -1
- package/build/esm/utils/middleware.utils.js.map +0 -1
- package/build/esm/utils/obj.utils.js.map +0 -1
- package/build/esm/utils/performance.utils.js.map +0 -1
- package/build/esm/utils/request.utils.js.map +0 -1
- package/build/esm/utils/response.utils.js.map +0 -1
- package/build/esm/utils/stream.utils.js.map +0 -1
- package/build/esm/utils/string.utils.js.map +0 -1
- package/build/esm/utils/type.utils.js.map +0 -1
- package/build/esm/utils/url.utils.js.map +0 -1
- package/build/esm/utils/validate.utils.js.map +0 -1
- package/build/esnext/config.d.ts +0 -122
- package/build/esnext/config.js +0 -133
- package/build/esnext/config.js.map +0 -1
- package/build/esnext/index.d.ts +0 -27
- package/build/esnext/index.js +0 -50
- package/build/esnext/index.js.map +0 -1
- package/build/esnext/servers/server.builder.d.ts +0 -508
- package/build/esnext/servers/server.builder.js +0 -657
- package/build/esnext/servers/server.builder.js.map +0 -1
- package/build/esnext/servers/server.d.ts +0 -256
- package/build/esnext/servers/server.js +0 -955
- package/build/esnext/servers/server.js.map +0 -1
- package/build/esnext/types/api-response.d.ts +0 -152
- package/build/esnext/types/api-response.js +0 -34
- package/build/esnext/types/api-response.js.map +0 -1
- package/build/esnext/types/index.d.ts +0 -125
- package/build/esnext/types/index.js +0 -25
- package/build/esnext/types/index.js.map +0 -1
- package/build/esnext/types/server.d.ts +0 -268
- package/build/esnext/types/server.js +0 -25
- package/build/esnext/types/server.js.map +0 -1
- package/build/esnext/utils/array.utils.d.ts +0 -168
- package/build/esnext/utils/array.utils.js +0 -345
- package/build/esnext/utils/array.utils.js.map +0 -1
- package/build/esnext/utils/async.utils.d.ts +0 -265
- package/build/esnext/utils/async.utils.js +0 -620
- package/build/esnext/utils/async.utils.js.map +0 -1
- package/build/esnext/utils/cache.utils.d.ts +0 -153
- package/build/esnext/utils/cache.utils.js +0 -293
- package/build/esnext/utils/cache.utils.js.map +0 -1
- package/build/esnext/utils/context-store.utils.d.ts +0 -189
- package/build/esnext/utils/context-store.utils.js +0 -289
- package/build/esnext/utils/context-store.utils.js.map +0 -1
- package/build/esnext/utils/crypto.utils.d.ts +0 -160
- package/build/esnext/utils/crypto.utils.js +0 -276
- package/build/esnext/utils/crypto.utils.js.map +0 -1
- package/build/esnext/utils/date.utils.d.ts +0 -159
- package/build/esnext/utils/date.utils.js +0 -384
- package/build/esnext/utils/date.utils.js.map +0 -1
- package/build/esnext/utils/decorators.utils.d.ts +0 -315
- package/build/esnext/utils/decorators.utils.js +0 -504
- package/build/esnext/utils/decorators.utils.js.map +0 -1
- package/build/esnext/utils/dir.utils.d.ts +0 -196
- package/build/esnext/utils/dir.utils.js +0 -477
- package/build/esnext/utils/dir.utils.js.map +0 -1
- package/build/esnext/utils/env.utils.d.ts +0 -377
- package/build/esnext/utils/env.utils.js +0 -785
- package/build/esnext/utils/env.utils.js.map +0 -1
- package/build/esnext/utils/exception.utils.d.ts +0 -230
- package/build/esnext/utils/exception.utils.js +0 -381
- package/build/esnext/utils/exception.utils.js.map +0 -1
- package/build/esnext/utils/fs.utils.d.ts +0 -164
- package/build/esnext/utils/fs.utils.js +0 -349
- package/build/esnext/utils/fs.utils.js.map +0 -1
- package/build/esnext/utils/http-status-codes.d.ts +0 -266
- package/build/esnext/utils/http-status-codes.js +0 -295
- package/build/esnext/utils/http-status-codes.js.map +0 -1
- package/build/esnext/utils/id.utils.d.ts +0 -36
- package/build/esnext/utils/id.utils.js +0 -84
- package/build/esnext/utils/id.utils.js.map +0 -1
- package/build/esnext/utils/logger.utils.d.ts +0 -160
- package/build/esnext/utils/logger.utils.js +0 -300
- package/build/esnext/utils/logger.utils.js.map +0 -1
- package/build/esnext/utils/middleware.utils.d.ts +0 -100
- package/build/esnext/utils/middleware.utils.js +0 -236
- package/build/esnext/utils/middleware.utils.js.map +0 -1
- package/build/esnext/utils/obj.utils.d.ts +0 -124
- package/build/esnext/utils/obj.utils.js +0 -413
- package/build/esnext/utils/obj.utils.js.map +0 -1
- package/build/esnext/utils/performance.utils.d.ts +0 -136
- package/build/esnext/utils/performance.utils.js +0 -271
- package/build/esnext/utils/performance.utils.js.map +0 -1
- package/build/esnext/utils/request.utils.d.ts +0 -86
- package/build/esnext/utils/request.utils.js +0 -186
- package/build/esnext/utils/request.utils.js.map +0 -1
- package/build/esnext/utils/response.utils.d.ts +0 -163
- package/build/esnext/utils/response.utils.js +0 -247
- package/build/esnext/utils/response.utils.js.map +0 -1
- package/build/esnext/utils/stream.utils.d.ts +0 -88
- package/build/esnext/utils/stream.utils.js +0 -210
- package/build/esnext/utils/stream.utils.js.map +0 -1
- package/build/esnext/utils/string.utils.d.ts +0 -93
- package/build/esnext/utils/string.utils.js +0 -165
- package/build/esnext/utils/string.utils.js.map +0 -1
- package/build/esnext/utils/type.utils.d.ts +0 -90
- package/build/esnext/utils/type.utils.js +0 -187
- package/build/esnext/utils/type.utils.js.map +0 -1
- package/build/esnext/utils/url.utils.d.ts +0 -141
- package/build/esnext/utils/url.utils.js +0 -304
- package/build/esnext/utils/url.utils.js.map +0 -1
- package/build/esnext/utils/validate.utils.d.ts +0 -177
- package/build/esnext/utils/validate.utils.js +0 -320
- package/build/esnext/utils/validate.utils.js.map +0 -1
- package/build/src/config.d.ts +0 -122
- package/build/src/config.js +0 -138
- package/build/src/config.js.map +0 -1
- package/build/src/index.d.ts +0 -27
- package/build/src/index.js +0 -69
- package/build/src/index.js.map +0 -1
- package/build/src/servers/server.builder.d.ts +0 -508
- package/build/src/servers/server.builder.js +0 -661
- package/build/src/servers/server.builder.js.map +0 -1
- package/build/src/servers/server.d.ts +0 -256
- package/build/src/servers/server.js +0 -962
- package/build/src/servers/server.js.map +0 -1
- package/build/src/types/api-response.d.ts +0 -152
- package/build/src/types/api-response.js +0 -37
- package/build/src/types/api-response.js.map +0 -1
- package/build/src/types/index.d.ts +0 -125
- package/build/src/types/index.js +0 -26
- package/build/src/types/index.js.map +0 -1
- package/build/src/types/server.d.ts +0 -268
- package/build/src/types/server.js +0 -26
- package/build/src/types/server.js.map +0 -1
- package/build/src/utils/array.utils.d.ts +0 -168
- package/build/src/utils/array.utils.js +0 -364
- package/build/src/utils/array.utils.js.map +0 -1
- package/build/src/utils/async.utils.d.ts +0 -265
- package/build/src/utils/async.utils.js +0 -641
- package/build/src/utils/async.utils.js.map +0 -1
- package/build/src/utils/cache.utils.d.ts +0 -153
- package/build/src/utils/cache.utils.js +0 -297
- package/build/src/utils/cache.utils.js.map +0 -1
- package/build/src/utils/context-store.utils.d.ts +0 -189
- package/build/src/utils/context-store.utils.js +0 -296
- package/build/src/utils/context-store.utils.js.map +0 -1
- package/build/src/utils/crypto.utils.d.ts +0 -160
- package/build/src/utils/crypto.utils.js +0 -293
- package/build/src/utils/crypto.utils.js.map +0 -1
- package/build/src/utils/date.utils.d.ts +0 -159
- package/build/src/utils/date.utils.js +0 -396
- package/build/src/utils/date.utils.js.map +0 -1
- package/build/src/utils/decorators.utils.d.ts +0 -315
- package/build/src/utils/decorators.utils.js +0 -516
- package/build/src/utils/decorators.utils.js.map +0 -1
- package/build/src/utils/dir.utils.d.ts +0 -196
- package/build/src/utils/dir.utils.js +0 -501
- package/build/src/utils/dir.utils.js.map +0 -1
- package/build/src/utils/env.utils.d.ts +0 -377
- package/build/src/utils/env.utils.js +0 -789
- package/build/src/utils/env.utils.js.map +0 -1
- package/build/src/utils/exception.utils.d.ts +0 -230
- package/build/src/utils/exception.utils.js +0 -407
- package/build/src/utils/exception.utils.js.map +0 -1
- package/build/src/utils/fs.utils.d.ts +0 -164
- package/build/src/utils/fs.utils.js +0 -372
- package/build/src/utils/fs.utils.js.map +0 -1
- package/build/src/utils/http-status-codes.d.ts +0 -266
- package/build/src/utils/http-status-codes.js +0 -298
- package/build/src/utils/http-status-codes.js.map +0 -1
- package/build/src/utils/id.utils.d.ts +0 -36
- package/build/src/utils/id.utils.js +0 -91
- package/build/src/utils/id.utils.js.map +0 -1
- package/build/src/utils/logger.utils.d.ts +0 -160
- package/build/src/utils/logger.utils.js +0 -346
- package/build/src/utils/logger.utils.js.map +0 -1
- package/build/src/utils/middleware.utils.d.ts +0 -100
- package/build/src/utils/middleware.utils.js +0 -244
- package/build/src/utils/middleware.utils.js.map +0 -1
- package/build/src/utils/obj.utils.d.ts +0 -124
- package/build/src/utils/obj.utils.js +0 -429
- package/build/src/utils/obj.utils.js.map +0 -1
- package/build/src/utils/performance.utils.d.ts +0 -136
- package/build/src/utils/performance.utils.js +0 -278
- package/build/src/utils/performance.utils.js.map +0 -1
- package/build/src/utils/request.utils.d.ts +0 -86
- package/build/src/utils/request.utils.js +0 -195
- package/build/src/utils/request.utils.js.map +0 -1
- package/build/src/utils/response.utils.d.ts +0 -163
- package/build/src/utils/response.utils.js +0 -260
- package/build/src/utils/response.utils.js.map +0 -1
- package/build/src/utils/stream.utils.d.ts +0 -88
- package/build/src/utils/stream.utils.js +0 -218
- package/build/src/utils/stream.utils.js.map +0 -1
- package/build/src/utils/string.utils.d.ts +0 -93
- package/build/src/utils/string.utils.js +0 -179
- package/build/src/utils/string.utils.js.map +0 -1
- package/build/src/utils/type.utils.d.ts +0 -90
- package/build/src/utils/type.utils.js +0 -196
- package/build/src/utils/type.utils.js.map +0 -1
- package/build/src/utils/url.utils.d.ts +0 -141
- package/build/src/utils/url.utils.js +0 -317
- package/build/src/utils/url.utils.js.map +0 -1
- package/build/src/utils/validate.utils.d.ts +0 -177
- package/build/src/utils/validate.utils.js +0 -345
- package/build/src/utils/validate.utils.js.map +0 -1
|
@@ -21,93 +21,6 @@
|
|
|
21
21
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
22
|
* SOFTWARE.
|
|
23
23
|
*/
|
|
24
|
-
var __extends = (this && this.__extends) || (function () {
|
|
25
|
-
var extendStatics = function (d, b) {
|
|
26
|
-
extendStatics = Object.setPrototypeOf ||
|
|
27
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
28
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
29
|
-
return extendStatics(d, b);
|
|
30
|
-
};
|
|
31
|
-
return function (d, b) {
|
|
32
|
-
if (typeof b !== "function" && b !== null)
|
|
33
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
34
|
-
extendStatics(d, b);
|
|
35
|
-
function __() { this.constructor = d; }
|
|
36
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
40
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
41
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
42
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
43
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
44
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
45
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
49
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
50
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
51
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
52
|
-
function step(op) {
|
|
53
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
54
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
55
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
56
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
57
|
-
switch (op[0]) {
|
|
58
|
-
case 0: case 1: t = op; break;
|
|
59
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
60
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
61
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
62
|
-
default:
|
|
63
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
64
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
65
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
66
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
67
|
-
if (t[2]) _.ops.pop();
|
|
68
|
-
_.trys.pop(); continue;
|
|
69
|
-
}
|
|
70
|
-
op = body.call(thisArg, _);
|
|
71
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
72
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
76
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
77
|
-
if (!m) return o;
|
|
78
|
-
var i = m.call(o), r, ar = [], e;
|
|
79
|
-
try {
|
|
80
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
81
|
-
}
|
|
82
|
-
catch (error) { e = { error: error }; }
|
|
83
|
-
finally {
|
|
84
|
-
try {
|
|
85
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
86
|
-
}
|
|
87
|
-
finally { if (e) throw e.error; }
|
|
88
|
-
}
|
|
89
|
-
return ar;
|
|
90
|
-
};
|
|
91
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
92
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
93
|
-
if (ar || !(i in from)) {
|
|
94
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
95
|
-
ar[i] = from[i];
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
99
|
-
};
|
|
100
|
-
var __values = (this && this.__values) || function(o) {
|
|
101
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
102
|
-
if (m) return m.call(o);
|
|
103
|
-
if (o && typeof o.length === "number") return {
|
|
104
|
-
next: function () {
|
|
105
|
-
if (o && i >= o.length) o = void 0;
|
|
106
|
-
return { value: o && o[i++], done: !o };
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
110
|
-
};
|
|
111
24
|
import { getLogger } from './logger.utils';
|
|
112
25
|
/**
|
|
113
26
|
* Delays execution for a specified number of milliseconds.
|
|
@@ -116,7 +29,7 @@ import { getLogger } from './logger.utils';
|
|
|
116
29
|
* @returns {Promise<void>} A Promise that resolves after the given time.
|
|
117
30
|
*/
|
|
118
31
|
export function sleep(ms) {
|
|
119
|
-
return new Promise(
|
|
32
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
120
33
|
}
|
|
121
34
|
/**
|
|
122
35
|
* Creates a debounced version of a function that delays its execution.
|
|
@@ -128,31 +41,27 @@ export function sleep(ms) {
|
|
|
128
41
|
* @returns {T & { cancel: () => void; flush: () => void }} A debounced function.
|
|
129
42
|
*/
|
|
130
43
|
export function debounce(fn, delay) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
function debounced() {
|
|
134
|
-
var args = [];
|
|
135
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
136
|
-
args[_i] = arguments[_i];
|
|
137
|
-
}
|
|
44
|
+
let timer = null;
|
|
45
|
+
let pendingArgs = null;
|
|
46
|
+
function debounced(...args) {
|
|
138
47
|
pendingArgs = args;
|
|
139
48
|
if (timer)
|
|
140
49
|
clearTimeout(timer);
|
|
141
|
-
timer = setTimeout(
|
|
142
|
-
fn
|
|
50
|
+
timer = setTimeout(() => {
|
|
51
|
+
fn(...pendingArgs);
|
|
143
52
|
timer = null;
|
|
144
53
|
}, delay);
|
|
145
54
|
}
|
|
146
|
-
debounced.cancel =
|
|
55
|
+
debounced.cancel = () => {
|
|
147
56
|
if (timer)
|
|
148
57
|
clearTimeout(timer);
|
|
149
58
|
timer = null;
|
|
150
59
|
pendingArgs = null;
|
|
151
60
|
};
|
|
152
|
-
debounced.flush =
|
|
61
|
+
debounced.flush = () => {
|
|
153
62
|
if (timer) {
|
|
154
63
|
clearTimeout(timer);
|
|
155
|
-
fn
|
|
64
|
+
fn(...pendingArgs);
|
|
156
65
|
timer = null;
|
|
157
66
|
pendingArgs = null;
|
|
158
67
|
}
|
|
@@ -169,40 +78,35 @@ export function debounce(fn, delay) {
|
|
|
169
78
|
* @param {{ leading?: boolean, trailing?: boolean }} [opts] - Options for leading/trailing edge throttling.
|
|
170
79
|
* @returns {(...args: Parameters<T>) => void} A throttled function.
|
|
171
80
|
*/
|
|
172
|
-
export function throttle(fn, limit, opts
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
183
|
-
args[_i] = arguments[_i];
|
|
184
|
-
}
|
|
185
|
-
var now = Date.now();
|
|
186
|
-
var _a = opts.leading, leading = _a === void 0 ? true : _a, _b = opts.trailing, trailing = _b === void 0 ? false : _b;
|
|
81
|
+
export function throttle(fn, limit, opts = {
|
|
82
|
+
leading: true,
|
|
83
|
+
trailing: false
|
|
84
|
+
}) {
|
|
85
|
+
let lastCall = 0;
|
|
86
|
+
let timer = null;
|
|
87
|
+
let savedArgs = null;
|
|
88
|
+
return function (...args) {
|
|
89
|
+
const now = Date.now();
|
|
90
|
+
const { leading = true, trailing = false } = opts;
|
|
187
91
|
if (!lastCall && !leading)
|
|
188
92
|
lastCall = now;
|
|
189
|
-
|
|
93
|
+
const remaining = limit - (now - lastCall);
|
|
190
94
|
if (remaining <= 0) {
|
|
191
95
|
if (timer) {
|
|
192
96
|
clearTimeout(timer);
|
|
193
97
|
timer = null;
|
|
194
98
|
}
|
|
195
99
|
lastCall = now;
|
|
196
|
-
fn
|
|
100
|
+
fn(...args);
|
|
197
101
|
}
|
|
198
102
|
else if (trailing) {
|
|
199
103
|
savedArgs = args;
|
|
200
104
|
if (!timer) {
|
|
201
|
-
timer = setTimeout(
|
|
105
|
+
timer = setTimeout(() => {
|
|
202
106
|
lastCall = leading ? Date.now() : 0;
|
|
203
107
|
timer = null;
|
|
204
108
|
if (savedArgs)
|
|
205
|
-
fn
|
|
109
|
+
fn(...savedArgs);
|
|
206
110
|
}, remaining);
|
|
207
111
|
}
|
|
208
112
|
}
|
|
@@ -220,41 +124,20 @@ export function throttle(fn, limit, opts) {
|
|
|
220
124
|
* @returns {Promise<T>} The result of the async function if successful.
|
|
221
125
|
* @throws {*} The last encountered error if all retries fail.
|
|
222
126
|
*/
|
|
223
|
-
export function retry(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
case 2:
|
|
238
|
-
_a.trys.push([2, 4, , 6]);
|
|
239
|
-
return [4 /*yield*/, fn()];
|
|
240
|
-
case 3: return [2 /*return*/, _a.sent()];
|
|
241
|
-
case 4:
|
|
242
|
-
e_1 = _a.sent();
|
|
243
|
-
if (i === retries - 1)
|
|
244
|
-
throw e_1;
|
|
245
|
-
if (onRetry)
|
|
246
|
-
onRetry(e_1, i + 1);
|
|
247
|
-
return [4 /*yield*/, sleep(backoff ? delay * Math.pow(2, i) : delay)];
|
|
248
|
-
case 5:
|
|
249
|
-
_a.sent();
|
|
250
|
-
return [3 /*break*/, 6];
|
|
251
|
-
case 6:
|
|
252
|
-
i++;
|
|
253
|
-
return [3 /*break*/, 1];
|
|
254
|
-
case 7: throw new Error('Retry failed'); // should never reach here
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
});
|
|
127
|
+
export async function retry(fn, retries = 3, delay = 500, backoff = false, onRetry) {
|
|
128
|
+
for (let i = 0; i < retries; i++) {
|
|
129
|
+
try {
|
|
130
|
+
return await fn();
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
if (i === retries - 1)
|
|
134
|
+
throw e;
|
|
135
|
+
if (onRetry)
|
|
136
|
+
onRetry(e, i + 1);
|
|
137
|
+
await sleep(backoff ? delay * Math.pow(2, i) : delay);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
throw new Error('Retry failed'); // should never reach here
|
|
258
141
|
}
|
|
259
142
|
/**
|
|
260
143
|
* Wraps a promise and rejects it if it doesn't resolve within the specified timeout.
|
|
@@ -265,16 +148,15 @@ export function retry(fn_1) {
|
|
|
265
148
|
* @param {string} [message="Operation timed out"] - Optional timeout message.
|
|
266
149
|
* @returns {Promise<T>} A promise that resolves or rejects within the timeout.
|
|
267
150
|
*/
|
|
268
|
-
export function withTimeout(promise, ms, message) {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
var timeoutHandle = setTimeout(function () { return reject(new Error(message)); }, ms);
|
|
151
|
+
export function withTimeout(promise, ms, message = 'Operation timed out') {
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
const timeoutHandle = setTimeout(() => reject(new Error(message)), ms);
|
|
272
154
|
promise
|
|
273
|
-
.then(
|
|
155
|
+
.then(result => {
|
|
274
156
|
clearTimeout(timeoutHandle);
|
|
275
157
|
resolve(result);
|
|
276
158
|
})
|
|
277
|
-
.catch(
|
|
159
|
+
.catch(err => {
|
|
278
160
|
clearTimeout(timeoutHandle);
|
|
279
161
|
reject(err);
|
|
280
162
|
});
|
|
@@ -291,30 +173,14 @@ export function withTimeout(promise, ms, message) {
|
|
|
291
173
|
* @param {number} limit - Number of tasks to run in parallel per batch.
|
|
292
174
|
* @returns {Promise<T[]>} A promise that resolves to an array of resolved values.
|
|
293
175
|
*/
|
|
294
|
-
export function runInBatches(tasks, limit) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
_a.label = 1;
|
|
303
|
-
case 1:
|
|
304
|
-
if (!(i < tasks.length)) return [3 /*break*/, 4];
|
|
305
|
-
batch = tasks.slice(i, i + limit);
|
|
306
|
-
return [4 /*yield*/, Promise.all(batch.map(function (fn) { return fn(); }))];
|
|
307
|
-
case 2:
|
|
308
|
-
batchResults = _a.sent();
|
|
309
|
-
results.push.apply(results, __spreadArray([], __read(batchResults), false));
|
|
310
|
-
_a.label = 3;
|
|
311
|
-
case 3:
|
|
312
|
-
i += limit;
|
|
313
|
-
return [3 /*break*/, 1];
|
|
314
|
-
case 4: return [2 /*return*/, results];
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
});
|
|
176
|
+
export async function runInBatches(tasks, limit) {
|
|
177
|
+
const results = [];
|
|
178
|
+
for (let i = 0; i < tasks.length; i += limit) {
|
|
179
|
+
const batch = tasks.slice(i, i + limit);
|
|
180
|
+
const batchResults = await Promise.all(batch.map(fn => fn()));
|
|
181
|
+
results.push(...batchResults);
|
|
182
|
+
}
|
|
183
|
+
return results;
|
|
318
184
|
}
|
|
319
185
|
/**
|
|
320
186
|
* Wraps a function and ensures it is only called once at a time.
|
|
@@ -327,28 +193,18 @@ export function runInBatches(tasks, limit) {
|
|
|
327
193
|
* @param {boolean} [drop=false] - If true, new calls while one is pending are rejected.
|
|
328
194
|
* @returns {(...args: TArgs) => Promise<TResult>} A wrapped function with singleton behavior.
|
|
329
195
|
*/
|
|
330
|
-
export function singletonAsync(fn, drop) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
337
|
-
args[_i] = arguments[_i];
|
|
338
|
-
}
|
|
339
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
340
|
-
return __generator(this, function (_a) {
|
|
341
|
-
if (!promise) {
|
|
342
|
-
promise = fn.apply(void 0, __spreadArray([], __read(args), false)).finally(function () {
|
|
343
|
-
promise = null;
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
else if (drop) {
|
|
347
|
-
return [2 /*return*/, Promise.reject(new Error('Busy: function already running'))];
|
|
348
|
-
}
|
|
349
|
-
return [2 /*return*/, promise];
|
|
196
|
+
export function singletonAsync(fn, drop = false) {
|
|
197
|
+
let promise = null;
|
|
198
|
+
return async (...args) => {
|
|
199
|
+
if (!promise) {
|
|
200
|
+
promise = fn(...args).finally(() => {
|
|
201
|
+
promise = null;
|
|
350
202
|
});
|
|
351
|
-
}
|
|
203
|
+
}
|
|
204
|
+
else if (drop) {
|
|
205
|
+
return Promise.reject(new Error('Busy: function already running'));
|
|
206
|
+
}
|
|
207
|
+
return promise;
|
|
352
208
|
};
|
|
353
209
|
}
|
|
354
210
|
/**
|
|
@@ -358,12 +214,8 @@ export function singletonAsync(fn, drop) {
|
|
|
358
214
|
* @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.
|
|
359
215
|
* @returns {Promise<PromiseSettledResult<T>[]>} Results including status and value/reason.
|
|
360
216
|
*/
|
|
361
|
-
export function settleAll(tasks) {
|
|
362
|
-
return
|
|
363
|
-
return __generator(this, function (_a) {
|
|
364
|
-
return [2 /*return*/, Promise.allSettled(tasks.map(function (task) { return task(); }))];
|
|
365
|
-
});
|
|
366
|
-
});
|
|
217
|
+
export async function settleAll(tasks) {
|
|
218
|
+
return Promise.allSettled(tasks.map(task => task()));
|
|
367
219
|
}
|
|
368
220
|
/**
|
|
369
221
|
* A simple task queue that executes async tasks with a concurrency limit.
|
|
@@ -374,20 +226,20 @@ export function settleAll(tasks) {
|
|
|
374
226
|
* Enqueue function plus queue controls.
|
|
375
227
|
*/
|
|
376
228
|
export function createTaskQueue(limit) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
229
|
+
const queue = [];
|
|
230
|
+
let activeCount = 0;
|
|
231
|
+
let paused = false;
|
|
232
|
+
const state = {
|
|
381
233
|
/**
|
|
382
234
|
* Pause task processing.
|
|
383
235
|
*/
|
|
384
|
-
pause
|
|
236
|
+
pause() {
|
|
385
237
|
paused = true;
|
|
386
238
|
},
|
|
387
239
|
/**
|
|
388
240
|
* Resume task processing.
|
|
389
241
|
*/
|
|
390
|
-
resume
|
|
242
|
+
resume() {
|
|
391
243
|
paused = false;
|
|
392
244
|
next();
|
|
393
245
|
},
|
|
@@ -406,12 +258,12 @@ export function createTaskQueue(limit) {
|
|
|
406
258
|
return paused;
|
|
407
259
|
}
|
|
408
260
|
};
|
|
409
|
-
|
|
261
|
+
const next = () => {
|
|
410
262
|
if (paused || queue.length === 0 || activeCount >= limit)
|
|
411
263
|
return;
|
|
412
|
-
|
|
264
|
+
const task = queue.shift();
|
|
413
265
|
activeCount++;
|
|
414
|
-
task().finally(
|
|
266
|
+
task().finally(() => {
|
|
415
267
|
activeCount--;
|
|
416
268
|
next();
|
|
417
269
|
});
|
|
@@ -423,42 +275,27 @@ export function createTaskQueue(limit) {
|
|
|
423
275
|
* @param {() => Promise<T>} taskFn - The async task function.
|
|
424
276
|
* @returns {Promise<T>} Promise resolving when task completes.
|
|
425
277
|
*/
|
|
426
|
-
|
|
427
|
-
return
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
_a.trys.push([0, 2, , 3]);
|
|
437
|
-
return [4 /*yield*/, taskFn()];
|
|
438
|
-
case 1:
|
|
439
|
-
result = _a.sent();
|
|
440
|
-
resolve(result);
|
|
441
|
-
return [3 /*break*/, 3];
|
|
442
|
-
case 2:
|
|
443
|
-
err_1 = _a.sent();
|
|
444
|
-
reject(err_1);
|
|
445
|
-
return [3 /*break*/, 3];
|
|
446
|
-
case 3: return [2 /*return*/];
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
}); });
|
|
450
|
-
next();
|
|
451
|
-
})];
|
|
278
|
+
const enqueue = async function (taskFn) {
|
|
279
|
+
return new Promise((resolve, reject) => {
|
|
280
|
+
queue.push(async () => {
|
|
281
|
+
try {
|
|
282
|
+
const result = await taskFn();
|
|
283
|
+
resolve(result);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
reject(err);
|
|
287
|
+
}
|
|
452
288
|
});
|
|
289
|
+
next();
|
|
453
290
|
});
|
|
454
291
|
};
|
|
455
292
|
enqueue.pause = state.pause;
|
|
456
293
|
enqueue.resume = state.resume;
|
|
457
294
|
Object.defineProperty(enqueue, 'length', {
|
|
458
|
-
get:
|
|
295
|
+
get: () => queue.length
|
|
459
296
|
});
|
|
460
297
|
Object.defineProperty(enqueue, 'isPaused', {
|
|
461
|
-
get:
|
|
298
|
+
get: () => paused
|
|
462
299
|
});
|
|
463
300
|
return enqueue;
|
|
464
301
|
}
|
|
@@ -470,45 +307,12 @@ export function createTaskQueue(limit) {
|
|
|
470
307
|
* @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.
|
|
471
308
|
* @returns {Promise<T[]>} Array of resolved values.
|
|
472
309
|
*/
|
|
473
|
-
export function runInSeries(tasks) {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
case 0:
|
|
480
|
-
results = [];
|
|
481
|
-
_d.label = 1;
|
|
482
|
-
case 1:
|
|
483
|
-
_d.trys.push([1, 6, 7, 8]);
|
|
484
|
-
tasks_1 = __values(tasks), tasks_1_1 = tasks_1.next();
|
|
485
|
-
_d.label = 2;
|
|
486
|
-
case 2:
|
|
487
|
-
if (!!tasks_1_1.done) return [3 /*break*/, 5];
|
|
488
|
-
task = tasks_1_1.value;
|
|
489
|
-
_b = (_a = results).push;
|
|
490
|
-
return [4 /*yield*/, task()];
|
|
491
|
-
case 3:
|
|
492
|
-
_b.apply(_a, [_d.sent()]);
|
|
493
|
-
_d.label = 4;
|
|
494
|
-
case 4:
|
|
495
|
-
tasks_1_1 = tasks_1.next();
|
|
496
|
-
return [3 /*break*/, 2];
|
|
497
|
-
case 5: return [3 /*break*/, 8];
|
|
498
|
-
case 6:
|
|
499
|
-
e_2_1 = _d.sent();
|
|
500
|
-
e_2 = { error: e_2_1 };
|
|
501
|
-
return [3 /*break*/, 8];
|
|
502
|
-
case 7:
|
|
503
|
-
try {
|
|
504
|
-
if (tasks_1_1 && !tasks_1_1.done && (_c = tasks_1.return)) _c.call(tasks_1);
|
|
505
|
-
}
|
|
506
|
-
finally { if (e_2) throw e_2.error; }
|
|
507
|
-
return [7 /*endfinally*/];
|
|
508
|
-
case 8: return [2 /*return*/, results];
|
|
509
|
-
}
|
|
510
|
-
});
|
|
511
|
-
});
|
|
310
|
+
export async function runInSeries(tasks) {
|
|
311
|
+
const results = [];
|
|
312
|
+
for (const task of tasks) {
|
|
313
|
+
results.push(await task());
|
|
314
|
+
}
|
|
315
|
+
return results;
|
|
512
316
|
}
|
|
513
317
|
/**
|
|
514
318
|
* Memoizes an async function, caching results for repeated calls with identical arguments.
|
|
@@ -522,36 +326,21 @@ export function runInSeries(tasks) {
|
|
|
522
326
|
* @param {(args: Args) => string} [options.keyFn] - Custom key generator function
|
|
523
327
|
* @returns {(...args: Args) => Promise<T>} Memoized function
|
|
524
328
|
*/
|
|
525
|
-
export function memoizeAsync(fn, options) {
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
329
|
+
export function memoizeAsync(fn, options = {}) {
|
|
330
|
+
const cache = new Map();
|
|
331
|
+
const { ttl, keyFn = JSON.stringify } = options;
|
|
332
|
+
return async function (...args) {
|
|
333
|
+
const key = keyFn(args);
|
|
334
|
+
const cached = cache.get(key);
|
|
335
|
+
if (cached && (!ttl || Date.now() < cached.expires)) {
|
|
336
|
+
return cached.value;
|
|
533
337
|
}
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
case 0:
|
|
539
|
-
key = keyFn(args);
|
|
540
|
-
cached = cache.get(key);
|
|
541
|
-
if (cached && (!ttl || Date.now() < cached.expires)) {
|
|
542
|
-
return [2 /*return*/, cached.value];
|
|
543
|
-
}
|
|
544
|
-
return [4 /*yield*/, fn.apply(void 0, __spreadArray([], __read(args), false))];
|
|
545
|
-
case 1:
|
|
546
|
-
result = _a.sent();
|
|
547
|
-
cache.set(key, {
|
|
548
|
-
value: result,
|
|
549
|
-
expires: ttl ? Date.now() + ttl : Infinity
|
|
550
|
-
});
|
|
551
|
-
return [2 /*return*/, result];
|
|
552
|
-
}
|
|
553
|
-
});
|
|
338
|
+
const result = await fn(...args);
|
|
339
|
+
cache.set(key, {
|
|
340
|
+
value: result,
|
|
341
|
+
expires: ttl ? Date.now() + ttl : Infinity
|
|
554
342
|
});
|
|
343
|
+
return result;
|
|
555
344
|
};
|
|
556
345
|
}
|
|
557
346
|
/**
|
|
@@ -563,17 +352,16 @@ export function memoizeAsync(fn, options) {
|
|
|
563
352
|
* @param {any} [abortValue] - Value to use when rejecting on abort
|
|
564
353
|
* @returns {Promise<T>} Promise that rejects if the signal is aborted
|
|
565
354
|
*/
|
|
566
|
-
export function abortable(promise, signal, abortValue) {
|
|
567
|
-
if (abortValue === void 0) { abortValue = new Error('Operation aborted'); }
|
|
355
|
+
export function abortable(promise, signal, abortValue = new Error('Operation aborted')) {
|
|
568
356
|
if (signal.aborted) {
|
|
569
357
|
return Promise.reject(abortValue);
|
|
570
358
|
}
|
|
571
359
|
return Promise.race([
|
|
572
360
|
promise,
|
|
573
|
-
new Promise(
|
|
574
|
-
|
|
361
|
+
new Promise((_, reject) => {
|
|
362
|
+
const abort = () => reject(abortValue);
|
|
575
363
|
signal.addEventListener('abort', abort, { once: true });
|
|
576
|
-
promise.finally(
|
|
364
|
+
promise.finally(() => signal.removeEventListener('abort', abort));
|
|
577
365
|
})
|
|
578
366
|
]);
|
|
579
367
|
}
|
|
@@ -586,9 +374,9 @@ export function abortable(promise, signal, abortValue) {
|
|
|
586
374
|
* Tuple of [promise, resolve, reject]
|
|
587
375
|
*/
|
|
588
376
|
export function createDeferred() {
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
377
|
+
let resolve;
|
|
378
|
+
let reject;
|
|
379
|
+
const promise = new Promise((res, rej) => {
|
|
592
380
|
resolve = res;
|
|
593
381
|
reject = rej;
|
|
594
382
|
});
|
|
@@ -603,20 +391,9 @@ export function createDeferred() {
|
|
|
603
391
|
* @returns {(input: any) => Promise<T>} Composed function
|
|
604
392
|
*/
|
|
605
393
|
export function waterfall(fns) {
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
return __generator(this, function (_a) {
|
|
610
|
-
return [2 /*return*/, fns.reduce(function (acc, fn) { return __awaiter(_this, void 0, void 0, function () { var _a; return __generator(this, function (_b) {
|
|
611
|
-
switch (_b.label) {
|
|
612
|
-
case 0:
|
|
613
|
-
_a = fn;
|
|
614
|
-
return [4 /*yield*/, acc];
|
|
615
|
-
case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent()])];
|
|
616
|
-
}
|
|
617
|
-
}); }); }, Promise.resolve(initialValue))];
|
|
618
|
-
});
|
|
619
|
-
}); };
|
|
394
|
+
return async (initialValue) => {
|
|
395
|
+
return fns.reduce(async (acc, fn) => fn(await acc), Promise.resolve(initialValue));
|
|
396
|
+
};
|
|
620
397
|
}
|
|
621
398
|
/**
|
|
622
399
|
* Creates a rate limiter that ensures functions aren't called more than
|
|
@@ -629,40 +406,26 @@ export function waterfall(fns) {
|
|
|
629
406
|
* @returns {(...args: any[]) => Promise<T>} Rate limited function
|
|
630
407
|
*/
|
|
631
408
|
export function rateLimit(fn, maxCalls, interval) {
|
|
632
|
-
|
|
633
|
-
return function () {
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
409
|
+
const calls = [];
|
|
410
|
+
return async function (...args) {
|
|
411
|
+
const now = Date.now();
|
|
412
|
+
calls.splice(0, calls.length, ...calls.filter(time => now - time < interval));
|
|
413
|
+
if (calls.length >= maxCalls) {
|
|
414
|
+
const oldestCall = calls[0];
|
|
415
|
+
const delay = interval - (now - oldestCall);
|
|
416
|
+
await sleep(Math.max(1, delay));
|
|
417
|
+
// Remove potentially stale entries after sleep
|
|
418
|
+
const currentTime = Date.now();
|
|
419
|
+
calls.splice(0, calls.length, ...calls.filter(time => currentTime - time < interval));
|
|
420
|
+
// If still at limit after sleep, wait for another cycle
|
|
421
|
+
if (calls.length >= maxCalls) {
|
|
422
|
+
const nextDelay = interval - (currentTime - calls[0]);
|
|
423
|
+
await sleep(Math.max(1, nextDelay));
|
|
424
|
+
calls.splice(0, calls.length, ...calls.filter(time => Date.now() - time < interval));
|
|
425
|
+
}
|
|
637
426
|
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
return __generator(this, function (_a) {
|
|
641
|
-
switch (_a.label) {
|
|
642
|
-
case 0:
|
|
643
|
-
now = Date.now();
|
|
644
|
-
calls.splice.apply(calls, __spreadArray([0, calls.length], __read(calls.filter(function (time) { return now - time < interval; })), false));
|
|
645
|
-
if (!(calls.length >= maxCalls)) return [3 /*break*/, 3];
|
|
646
|
-
oldestCall = calls[0];
|
|
647
|
-
delay = interval - (now - oldestCall);
|
|
648
|
-
return [4 /*yield*/, sleep(Math.max(1, delay))];
|
|
649
|
-
case 1:
|
|
650
|
-
_a.sent();
|
|
651
|
-
currentTime_1 = Date.now();
|
|
652
|
-
calls.splice.apply(calls, __spreadArray([0, calls.length], __read(calls.filter(function (time) { return currentTime_1 - time < interval; })), false));
|
|
653
|
-
if (!(calls.length >= maxCalls)) return [3 /*break*/, 3];
|
|
654
|
-
nextDelay = interval - (currentTime_1 - calls[0]);
|
|
655
|
-
return [4 /*yield*/, sleep(Math.max(1, nextDelay))];
|
|
656
|
-
case 2:
|
|
657
|
-
_a.sent();
|
|
658
|
-
calls.splice.apply(calls, __spreadArray([0, calls.length], __read(calls.filter(function (time) { return Date.now() - time < interval; })), false));
|
|
659
|
-
_a.label = 3;
|
|
660
|
-
case 3:
|
|
661
|
-
calls.push(Date.now());
|
|
662
|
-
return [2 /*return*/, fn.apply(void 0, __spreadArray([], __read(args), false))];
|
|
663
|
-
}
|
|
664
|
-
});
|
|
665
|
-
});
|
|
427
|
+
calls.push(Date.now());
|
|
428
|
+
return fn(...args);
|
|
666
429
|
};
|
|
667
430
|
}
|
|
668
431
|
/**
|
|
@@ -699,17 +462,12 @@ export function rateLimit(fn, maxCalls, interval) {
|
|
|
699
462
|
* }
|
|
700
463
|
* ```
|
|
701
464
|
*/
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
var _this = _super.call(this, message) || this;
|
|
707
|
-
_this.name = 'CircuitBreakerOpenError';
|
|
708
|
-
return _this;
|
|
465
|
+
export class CircuitBreakerOpenError extends Error {
|
|
466
|
+
constructor(message = 'Circuit breaker is open') {
|
|
467
|
+
super(message);
|
|
468
|
+
this.name = 'CircuitBreakerOpenError';
|
|
709
469
|
}
|
|
710
|
-
|
|
711
|
-
}(Error));
|
|
712
|
-
export { CircuitBreakerOpenError };
|
|
470
|
+
}
|
|
713
471
|
/**
|
|
714
472
|
* Circuit breaker states
|
|
715
473
|
*/
|
|
@@ -719,71 +477,54 @@ export var CircuitBreakerState;
|
|
|
719
477
|
CircuitBreakerState["OPEN"] = "OPEN";
|
|
720
478
|
CircuitBreakerState["HALF_OPEN"] = "HALF_OPEN";
|
|
721
479
|
})(CircuitBreakerState || (CircuitBreakerState = {}));
|
|
722
|
-
export function circuitBreaker(fn, options) {
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
480
|
+
export function circuitBreaker(fn, options = {}) {
|
|
481
|
+
const { failureThreshold = 5, resetTimeout = 10000, successThreshold = 1, onOpen, onClose, onHalfOpen } = options;
|
|
482
|
+
let state = CircuitBreakerState.CLOSED;
|
|
483
|
+
let failureCount = 0;
|
|
484
|
+
let successCount = 0;
|
|
485
|
+
let nextAttempt = Date.now();
|
|
486
|
+
return async function (...args) {
|
|
487
|
+
if (state === CircuitBreakerState.OPEN) {
|
|
488
|
+
if (Date.now() < nextAttempt) {
|
|
489
|
+
throw new CircuitBreakerOpenError();
|
|
490
|
+
}
|
|
491
|
+
// Move to half-open state
|
|
492
|
+
state = CircuitBreakerState.HALF_OPEN;
|
|
493
|
+
if (onHalfOpen)
|
|
494
|
+
onHalfOpen();
|
|
733
495
|
}
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
if (onHalfOpen)
|
|
746
|
-
onHalfOpen();
|
|
747
|
-
}
|
|
748
|
-
_a.label = 1;
|
|
749
|
-
case 1:
|
|
750
|
-
_a.trys.push([1, 3, , 4]);
|
|
751
|
-
return [4 /*yield*/, fn.apply(void 0, __spreadArray([], __read(args), false))];
|
|
752
|
-
case 2:
|
|
753
|
-
result = _a.sent();
|
|
754
|
-
// On success in half-open state
|
|
755
|
-
if (state === CircuitBreakerState.HALF_OPEN) {
|
|
756
|
-
successCount++;
|
|
757
|
-
if (successCount >= successThreshold) {
|
|
758
|
-
successCount = 0;
|
|
759
|
-
failureCount = 0;
|
|
760
|
-
state = CircuitBreakerState.CLOSED;
|
|
761
|
-
if (onClose)
|
|
762
|
-
onClose();
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
else {
|
|
766
|
-
// Reset failure count on success in closed state
|
|
767
|
-
failureCount = 0;
|
|
768
|
-
}
|
|
769
|
-
return [2 /*return*/, result];
|
|
770
|
-
case 3:
|
|
771
|
-
error_1 = _a.sent();
|
|
772
|
-
// Track failures
|
|
773
|
-
failureCount++;
|
|
774
|
-
// Check if we need to open the circuit
|
|
775
|
-
if ((state === CircuitBreakerState.CLOSED || state === CircuitBreakerState.HALF_OPEN) &&
|
|
776
|
-
failureCount >= failureThreshold) {
|
|
777
|
-
state = CircuitBreakerState.OPEN;
|
|
778
|
-
nextAttempt = Date.now() + resetTimeout;
|
|
779
|
-
if (onOpen)
|
|
780
|
-
onOpen();
|
|
781
|
-
}
|
|
782
|
-
throw error_1;
|
|
783
|
-
case 4: return [2 /*return*/];
|
|
496
|
+
try {
|
|
497
|
+
const result = await fn(...args);
|
|
498
|
+
// On success in half-open state
|
|
499
|
+
if (state === CircuitBreakerState.HALF_OPEN) {
|
|
500
|
+
successCount++;
|
|
501
|
+
if (successCount >= successThreshold) {
|
|
502
|
+
successCount = 0;
|
|
503
|
+
failureCount = 0;
|
|
504
|
+
state = CircuitBreakerState.CLOSED;
|
|
505
|
+
if (onClose)
|
|
506
|
+
onClose();
|
|
784
507
|
}
|
|
785
|
-
}
|
|
786
|
-
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
// Reset failure count on success in closed state
|
|
511
|
+
failureCount = 0;
|
|
512
|
+
}
|
|
513
|
+
return result;
|
|
514
|
+
}
|
|
515
|
+
catch (error) {
|
|
516
|
+
// Track failures
|
|
517
|
+
failureCount++;
|
|
518
|
+
// Check if we need to open the circuit
|
|
519
|
+
if ((state === CircuitBreakerState.CLOSED || state === CircuitBreakerState.HALF_OPEN) &&
|
|
520
|
+
failureCount >= failureThreshold) {
|
|
521
|
+
state = CircuitBreakerState.OPEN;
|
|
522
|
+
nextAttempt = Date.now() + resetTimeout;
|
|
523
|
+
if (onOpen)
|
|
524
|
+
onOpen();
|
|
525
|
+
}
|
|
526
|
+
throw error;
|
|
527
|
+
}
|
|
787
528
|
};
|
|
788
529
|
}
|
|
789
530
|
/**
|
|
@@ -809,88 +550,70 @@ export function circuitBreaker(fn, options) {
|
|
|
809
550
|
* );
|
|
810
551
|
* ```
|
|
811
552
|
*/
|
|
812
|
-
export function runWithConcurrency(
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
849
|
-
reject(new Error('Aborted'));
|
|
850
|
-
return [2 /*return*/];
|
|
851
|
-
}
|
|
852
|
-
// Store result and update counters
|
|
853
|
-
results[currentTaskIndex] = result;
|
|
854
|
-
completed++;
|
|
855
|
-
// Call progress callback if provided
|
|
856
|
-
if (onProgress) {
|
|
857
|
-
try {
|
|
858
|
-
onProgress(completed, totalTasks);
|
|
859
|
-
}
|
|
860
|
-
catch (err) {
|
|
861
|
-
getLogger().error({ err: err }, 'Error in onProgress callback');
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
return [3 /*break*/, 4];
|
|
865
|
-
case 3:
|
|
866
|
-
error_2 = _a.sent();
|
|
867
|
-
reject(error_2);
|
|
868
|
-
return [2 /*return*/];
|
|
869
|
-
case 4:
|
|
870
|
-
// Check if all tasks are completed
|
|
871
|
-
if (completed === totalTasks) {
|
|
872
|
-
resolve(results);
|
|
873
|
-
return [2 /*return*/];
|
|
874
|
-
}
|
|
875
|
-
// Process next task
|
|
876
|
-
processNext();
|
|
877
|
-
return [2 /*return*/];
|
|
878
|
-
}
|
|
879
|
-
});
|
|
880
|
-
}); };
|
|
881
|
-
// Start initial batch of tasks
|
|
882
|
-
var initialBatch = Math.min(concurrency, totalTasks);
|
|
883
|
-
for (var i = 0; i < initialBatch; i++) {
|
|
884
|
-
processNext();
|
|
553
|
+
export async function runWithConcurrency(tasks, options = {}) {
|
|
554
|
+
const { concurrency = 3, onProgress, signal } = options;
|
|
555
|
+
const results = [];
|
|
556
|
+
const totalTasks = tasks.length;
|
|
557
|
+
let completed = 0;
|
|
558
|
+
// If no tasks, return empty array
|
|
559
|
+
if (totalTasks === 0)
|
|
560
|
+
return results;
|
|
561
|
+
// Check if execution is already aborted
|
|
562
|
+
if (signal?.aborted) {
|
|
563
|
+
throw new Error('Aborted');
|
|
564
|
+
}
|
|
565
|
+
return new Promise((resolve, reject) => {
|
|
566
|
+
let taskIndex = 0;
|
|
567
|
+
// Process next task function
|
|
568
|
+
const processNext = async () => {
|
|
569
|
+
// Get current task index and increment
|
|
570
|
+
const currentTaskIndex = taskIndex++;
|
|
571
|
+
// Skip if we've processed all tasks
|
|
572
|
+
if (currentTaskIndex >= totalTasks)
|
|
573
|
+
return;
|
|
574
|
+
try {
|
|
575
|
+
// Run the task
|
|
576
|
+
const result = await tasks[currentTaskIndex]();
|
|
577
|
+
// Check if aborted during task execution
|
|
578
|
+
if (signal?.aborted) {
|
|
579
|
+
reject(new Error('Aborted'));
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
// Store result and update counters
|
|
583
|
+
results[currentTaskIndex] = result;
|
|
584
|
+
completed++;
|
|
585
|
+
// Call progress callback if provided
|
|
586
|
+
if (onProgress) {
|
|
587
|
+
try {
|
|
588
|
+
onProgress(completed, totalTasks);
|
|
885
589
|
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
signal.addEventListener('abort', function () {
|
|
889
|
-
reject(new Error('Aborted'));
|
|
890
|
-
}, { once: true });
|
|
590
|
+
catch (err) {
|
|
591
|
+
getLogger().error({ err }, 'Error in onProgress callback');
|
|
891
592
|
}
|
|
892
|
-
}
|
|
893
|
-
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
reject(error);
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
// Check if all tasks are completed
|
|
600
|
+
if (completed === totalTasks) {
|
|
601
|
+
resolve(results);
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
// Process next task
|
|
605
|
+
processNext();
|
|
606
|
+
};
|
|
607
|
+
// Start initial batch of tasks
|
|
608
|
+
const initialBatch = Math.min(concurrency, totalTasks);
|
|
609
|
+
for (let i = 0; i < initialBatch; i++) {
|
|
610
|
+
processNext();
|
|
611
|
+
}
|
|
612
|
+
// Set up abort handler
|
|
613
|
+
if (signal) {
|
|
614
|
+
signal.addEventListener('abort', () => {
|
|
615
|
+
reject(new Error('Aborted'));
|
|
616
|
+
}, { once: true });
|
|
617
|
+
}
|
|
894
618
|
});
|
|
895
619
|
}
|
|
896
|
-
//# sourceMappingURL=async.utils.js.map
|