@hoox-sh/hoox-shared 1.3.0 → 1.5.0

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.
Files changed (97) hide show
  1. package/README.md +6 -0
  2. package/dist/agent-config-fields.js +23 -29
  3. package/dist/analytics.d.ts +3 -4
  4. package/dist/analytics.d.ts.map +1 -1
  5. package/dist/analytics.js +56 -16
  6. package/dist/api-client.js +12 -21
  7. package/dist/colors.js +5 -21
  8. package/dist/config.js +11 -27
  9. package/dist/cron-handler.js +0 -16
  10. package/dist/d1/index.js +12 -27
  11. package/dist/d1/repository.js +7 -21
  12. package/dist/d1/schemas.js +4 -20
  13. package/dist/dashboard-manifest.d.ts +2 -1
  14. package/dist/dashboard-manifest.d.ts.map +1 -1
  15. package/dist/dashboard-manifest.js +37 -33
  16. package/dist/entitlements.d.ts +46 -0
  17. package/dist/entitlements.d.ts.map +1 -0
  18. package/dist/entitlements.js +15 -0
  19. package/dist/errors.d.ts.map +1 -1
  20. package/dist/errors.js +11 -25
  21. package/dist/exchange-client.js +2 -18
  22. package/dist/exchanges/base-exchange-client.js +0 -16
  23. package/dist/exchanges/index.js +0 -16
  24. package/dist/format-time.js +2 -18
  25. package/dist/formatters.js +12 -28
  26. package/dist/health.js +7 -21
  27. package/dist/index.d.ts +8 -4
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +3895 -3653
  30. package/dist/kill-switch.js +14 -20
  31. package/dist/kvKeys.d.ts +11 -0
  32. package/dist/kvKeys.d.ts.map +1 -1
  33. package/dist/kvKeys.js +44 -45
  34. package/dist/kvUtils.d.ts +34 -1
  35. package/dist/kvUtils.d.ts.map +1 -1
  36. package/dist/kvUtils.js +60 -23
  37. package/dist/legal.js +5 -21
  38. package/dist/middleware/auth.d.ts +6 -3
  39. package/dist/middleware/auth.d.ts.map +1 -1
  40. package/dist/middleware/auth.js +27 -29
  41. package/dist/middleware/cors.js +4 -20
  42. package/dist/middleware/index.d.ts +3 -2
  43. package/dist/middleware/index.d.ts.map +1 -1
  44. package/dist/middleware/index.js +222 -164
  45. package/dist/middleware/logger.js +13 -27
  46. package/dist/middleware/rate-limit.js +2 -18
  47. package/dist/middleware/security-headers.js +2 -18
  48. package/dist/middleware/validate.d.ts +16 -0
  49. package/dist/middleware/validate.d.ts.map +1 -1
  50. package/dist/middleware/validate.js +39 -19
  51. package/dist/middleware/wait-until.d.ts +32 -0
  52. package/dist/middleware/wait-until.d.ts.map +1 -0
  53. package/dist/middleware/wait-until.js +30 -0
  54. package/dist/operator-transport.js +13 -17
  55. package/dist/path-utils.js +15 -31
  56. package/dist/queue-handler.d.ts +6 -0
  57. package/dist/queue-handler.d.ts.map +1 -1
  58. package/dist/queue-handler.js +51 -36
  59. package/dist/router.d.ts.map +1 -1
  60. package/dist/router.js +12 -18
  61. package/dist/schemas/index.d.ts +2 -1
  62. package/dist/schemas/index.d.ts.map +1 -1
  63. package/dist/schemas/index.js +91 -38
  64. package/dist/schemas/registry.d.ts +13 -0
  65. package/dist/schemas/registry.d.ts.map +1 -1
  66. package/dist/schemas/registry.js +82 -30
  67. package/dist/schemas/types.d.ts +5 -0
  68. package/dist/schemas/types.d.ts.map +1 -1
  69. package/dist/schemas/validators.d.ts.map +1 -1
  70. package/dist/schemas/validators.js +8 -22
  71. package/dist/service-bindings.js +31 -34
  72. package/dist/session.js +2 -18
  73. package/dist/sse.js +10 -18
  74. package/dist/stores/config-store.js +8 -22
  75. package/dist/stores/service-store.js +17 -30
  76. package/dist/stores/ui-store.js +0 -16
  77. package/dist/tenant.d.ts +61 -0
  78. package/dist/tenant.d.ts.map +1 -0
  79. package/dist/tenant.js +56 -0
  80. package/dist/test-utils.js +11 -27
  81. package/dist/types.d.ts +26 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/types.js +16 -26
  84. package/dist/wizard/engine.d.ts.map +1 -1
  85. package/dist/wizard/engine.js +39 -56
  86. package/dist/wizard/index.d.ts +1 -0
  87. package/dist/wizard/index.d.ts.map +1 -1
  88. package/dist/wizard/index.js +54 -68
  89. package/dist/wizard/persistence.d.ts +4 -0
  90. package/dist/wizard/persistence.d.ts.map +1 -1
  91. package/dist/wizard/persistence.js +7 -19
  92. package/dist/wizard/presets.d.ts.map +1 -1
  93. package/dist/wizard/presets.js +16 -54
  94. package/dist/wizard/types.d.ts +6 -0
  95. package/dist/wizard/types.d.ts.map +1 -1
  96. package/dist/wizard/types.js +5 -0
  97. package/package.json +7 -2
@@ -1,21 +1,6 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
15
- };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
-
18
2
  // src/middleware/validate.ts
3
+ var DEFAULT_MAX_JSON_BODY_BYTES = 1048576;
19
4
  function validateJson(schema, data) {
20
5
  const result = schema.safeParse(data);
21
6
  if (!result.success) {
@@ -26,6 +11,39 @@ function validateJson(schema, data) {
26
11
  }
27
12
  return { ok: true, value: result.data };
28
13
  }
14
+ async function parseJsonBody(request, schema, options = {}) {
15
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_JSON_BODY_BYTES;
16
+ const contentLength = request.headers.get("content-length");
17
+ if (contentLength !== null) {
18
+ const declared = Number(contentLength);
19
+ if (Number.isFinite(declared) && declared > maxBytes) {
20
+ return {
21
+ ok: false,
22
+ error: `Request body too large (max ${maxBytes} bytes)`
23
+ };
24
+ }
25
+ }
26
+ let text;
27
+ try {
28
+ text = await request.text();
29
+ } catch {
30
+ return { ok: false, error: "Failed to read request body" };
31
+ }
32
+ const byteLength = new TextEncoder().encode(text).byteLength;
33
+ if (byteLength > maxBytes) {
34
+ return {
35
+ ok: false,
36
+ error: `Request body too large (max ${maxBytes} bytes)`
37
+ };
38
+ }
39
+ let data;
40
+ try {
41
+ data = text.length === 0 ? null : JSON.parse(text);
42
+ } catch {
43
+ return { ok: false, error: "Invalid JSON in request body" };
44
+ }
45
+ return validateJson(schema, data);
46
+ }
29
47
  async function validateJsonLegacy(request) {
30
48
  try {
31
49
  const body = await request.json();
@@ -49,8 +67,10 @@ function optionalField(body, field, defaultValue) {
49
67
  return body[field];
50
68
  }
51
69
  export {
52
- validateJsonLegacy,
53
- validateJson,
70
+ DEFAULT_MAX_JSON_BODY_BYTES,
71
+ optionalField,
72
+ parseJsonBody,
54
73
  requireField,
55
- optionalField
74
+ validateJson,
75
+ validateJsonLegacy
56
76
  };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ /**
6
+ * Production helpers around ExecutionContext / DurableObjectState.waitUntil.
7
+ *
8
+ * Floating / rejected background promises are a common Workers footgun:
9
+ * the isolate may exit before work finishes, and rejections can go unhandled.
10
+ * Always pass promises through these helpers (or await them).
11
+ *
12
+ * Never destructure `waitUntil` off `ctx` — it loses `this` and throws
13
+ * "Illegal invocation" at runtime.
14
+ *
15
+ * Accepts any object with waitUntil so the same helper works for both
16
+ * fetch ExecutionContext and DurableObjectState (DO lifecycle).
17
+ */
18
+ /** Minimal surface shared by ExecutionContext and DurableObjectState. */
19
+ export type WaitUntilHost = {
20
+ waitUntil(promise: Promise<unknown>): void;
21
+ };
22
+ /**
23
+ * Schedule background work that must not affect the HTTP response.
24
+ * Captures rejections so they never become unhandled promise rejections.
25
+ */
26
+ export declare function safeWaitUntil(ctx: WaitUntilHost, promise: Promise<unknown>, onError?: (err: unknown) => void): void;
27
+ /**
28
+ * Fan-out multiple independent background tasks via a single waitUntil.
29
+ * Uses allSettled so one failure does not cancel siblings.
30
+ */
31
+ export declare function waitUntilAll(ctx: WaitUntilHost, promises: ReadonlyArray<Promise<unknown>>, onError?: (err: unknown) => void): void;
32
+ //# sourceMappingURL=wait-until.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-until.d.ts","sourceRoot":"","sources":["../../src/middleware/wait-until.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC/B,IAAI,CAYN;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC/B,IAAI,CAsBN"}
@@ -0,0 +1,30 @@
1
+ // @bun
2
+ // src/middleware/wait-until.ts
3
+ function safeWaitUntil(ctx, promise, onError) {
4
+ ctx.waitUntil(promise.catch((err) => {
5
+ onError?.(err);
6
+ console.error(JSON.stringify({
7
+ message: "waitUntil background task failed",
8
+ error: err instanceof Error ? err.message : String(err)
9
+ }));
10
+ }));
11
+ }
12
+ function waitUntilAll(ctx, promises, onError) {
13
+ if (promises.length === 0)
14
+ return;
15
+ safeWaitUntil(ctx, Promise.allSettled(promises).then((results) => {
16
+ for (const result of results) {
17
+ if (result.status === "rejected") {
18
+ onError?.(result.reason);
19
+ console.error(JSON.stringify({
20
+ message: "waitUntilAll background task failed",
21
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason)
22
+ }));
23
+ }
24
+ }
25
+ }), onError);
26
+ }
27
+ export {
28
+ safeWaitUntil,
29
+ waitUntilAll
30
+ };
@@ -1,19 +1,15 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
2
+ var __esm = (fn, res, err) => () => {
3
+ if (fn)
4
+ try {
5
+ res = fn(fn = 0);
6
+ } catch (e) {
7
+ err = [e];
8
+ }
9
+ if (err)
10
+ throw err[0];
11
+ return res;
15
12
  };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
13
 
18
14
  // src/operator-transport.ts
19
15
  function stripTrailingSlashes(url) {
@@ -84,8 +80,8 @@ var init_operator_transport = __esm(() => {
84
80
  init_operator_transport();
85
81
 
86
82
  export {
87
- resolveOperatorTransportProfile,
88
- operatorUrl,
83
+ buildOperatorAuthHeaders,
89
84
  hasOperatorClientCredentials,
90
- buildOperatorAuthHeaders
85
+ operatorUrl,
86
+ resolveOperatorTransportProfile
91
87
  };
@@ -1,20 +1,4 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
15
- };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
-
18
2
  // src/path-utils.ts
19
3
  import {
20
4
  existsSync,
@@ -236,20 +220,20 @@ function getHooxStatePath() {
236
220
  return resolveHooxPath("data/state.json");
237
221
  }
238
222
  export {
239
- resolveHooxRuntimeRoot,
240
- resolveHooxPath,
241
- rememberMonorepoRoot,
242
- isWithinHooxHome,
243
- isHooxSetupRoot,
244
- getTuiEntryCandidates,
245
- getRememberedMonorepoRoot,
246
- getRememberedMonorepoPath,
247
- getRelativeHooxPath,
248
- getHooxWranglerPath,
249
- getHooxStatePath,
250
- getHooxRepoPath,
251
- getHooxHome,
252
- getHooxDataDir,
223
+ findHooxSetupRoot,
253
224
  getHooxConfigDir,
254
- findHooxSetupRoot
225
+ getHooxDataDir,
226
+ getHooxHome,
227
+ getHooxRepoPath,
228
+ getHooxStatePath,
229
+ getHooxWranglerPath,
230
+ getRelativeHooxPath,
231
+ getRememberedMonorepoPath,
232
+ getRememberedMonorepoRoot,
233
+ getTuiEntryCandidates,
234
+ isHooxSetupRoot,
235
+ isWithinHooxHome,
236
+ rememberMonorepoRoot,
237
+ resolveHooxPath,
238
+ resolveHooxRuntimeRoot
255
239
  };
@@ -19,6 +19,11 @@ export interface QueueHandlerOptions<T> {
19
19
  info(msg: string, data?: unknown): void;
20
20
  error(msg: string, data?: unknown): void;
21
21
  };
22
+ /**
23
+ * Max number of messages to process concurrently within a batch.
24
+ * Defaults to 1 (serial) for back-compat. Values < 1 are treated as 1.
25
+ */
26
+ concurrency?: number;
22
27
  }
23
28
  /**
24
29
  * Creates a reusable queue handler with retry + exponential backoff logic.
@@ -28,6 +33,7 @@ export interface QueueHandlerOptions<T> {
28
33
  * const handler = createQueueHandler({
29
34
  * maxRetries: 5,
30
35
  * backoffDelays: [0, 30, 60, 300, 900],
36
+ * concurrency: 4, // optional; default 1 (serial)
31
37
  * onMessage: async (msg) => {
32
38
  * await executeTask(msg);
33
39
  * },
@@ -1 +1 @@
1
- {"version":3,"file":"queue-handler.d.ts","sourceRoot":"","sources":["../src/queue-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E,sDAAsD;IACtD,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,KACjB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,KACV,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;KAC1C,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAIrD,OAAO,YAAY,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAmCrD"}
1
+ {"version":3,"file":"queue-handler.d.ts","sourceRoot":"","sources":["../src/queue-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E,sDAAsD;IACtD,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,KACjB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,KACV,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;KAC1C,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAqDrD,OAAO,YAAY,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAGrD"}
@@ -1,44 +1,59 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
15
- };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
-
18
2
  // src/queue-handler.ts
3
+ async function mapPool(items, concurrency, fn) {
4
+ if (items.length === 0)
5
+ return;
6
+ const limit = Math.min(Math.max(1, concurrency), items.length);
7
+ if (limit === 1) {
8
+ for (const item of items) {
9
+ await fn(item);
10
+ }
11
+ return;
12
+ }
13
+ let nextIndex = 0;
14
+ async function worker() {
15
+ while (true) {
16
+ const i = nextIndex++;
17
+ if (i >= items.length)
18
+ return;
19
+ await fn(items[i]);
20
+ }
21
+ }
22
+ await Promise.all(Array.from({ length: limit }, () => worker()));
23
+ }
19
24
  function createQueueHandler(options) {
20
- const { maxRetries, backoffDelays, onMessage, onRetry, onDLQ, logger } = options;
21
- return async (batch) => {
22
- for (const msg of batch.messages) {
23
- const attemptNumber = msg.attempts || 0;
24
- const logId = `[${msg.id}]`;
25
- try {
26
- logger?.info(`${logId} Processing message (attempt ${attemptNumber + 1})`);
27
- await onMessage(msg.body, attemptNumber);
28
- logger?.info(`${logId} Message processed successfully`);
29
- } catch (error) {
30
- const errorMsg = error instanceof Error ? error.message : String(error);
31
- if (attemptNumber < maxRetries) {
32
- const delaySeconds = backoffDelays[attemptNumber] ?? backoffDelays[backoffDelays.length - 1];
33
- logger?.info(`${logId} Retrying in ${delaySeconds}s (attempt ${attemptNumber + 2}/${maxRetries + 1})`);
34
- await onRetry?.(msg.body, attemptNumber, errorMsg, delaySeconds);
35
- msg.retry({ delaySeconds });
36
- } else {
37
- logger?.error(`${logId} Max retries exceeded (${maxRetries + 1} attempts), moving to DLQ`);
38
- await onDLQ?.(msg.body, attemptNumber, errorMsg);
39
- }
25
+ const {
26
+ maxRetries,
27
+ backoffDelays,
28
+ onMessage,
29
+ onRetry,
30
+ onDLQ,
31
+ logger,
32
+ concurrency: concurrencyOpt
33
+ } = options;
34
+ const concurrency = typeof concurrencyOpt === "number" && Number.isFinite(concurrencyOpt) && concurrencyOpt >= 1 ? Math.floor(concurrencyOpt) : 1;
35
+ async function processMessage(msg) {
36
+ const attemptNumber = msg.attempts || 0;
37
+ const logId = `[${msg.id}]`;
38
+ try {
39
+ logger?.info(`${logId} Processing message (attempt ${attemptNumber + 1})`);
40
+ await onMessage(msg.body, attemptNumber);
41
+ logger?.info(`${logId} Message processed successfully`);
42
+ } catch (error) {
43
+ const errorMsg = error instanceof Error ? error.message : String(error);
44
+ if (attemptNumber < maxRetries) {
45
+ const delaySeconds = backoffDelays[attemptNumber] ?? backoffDelays[backoffDelays.length - 1] ?? 0;
46
+ logger?.info(`${logId} Retrying in ${delaySeconds}s (attempt ${attemptNumber + 2}/${maxRetries + 1})`);
47
+ await onRetry?.(msg.body, attemptNumber, errorMsg, delaySeconds);
48
+ msg.retry({ delaySeconds });
49
+ } else {
50
+ logger?.error(`${logId} Max retries exceeded (${maxRetries + 1} attempts), moving to DLQ`);
51
+ await onDLQ?.(msg.body, attemptNumber, errorMsg);
40
52
  }
41
53
  }
54
+ }
55
+ return async (batch) => {
56
+ await mapPool(batch.messages, concurrency, processMessage);
42
57
  };
43
58
  }
44
59
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,wBAAgB,YAAY,CAAC,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CAsM3D"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,wBAAgB,YAAY,CAAC,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CA6M3D"}
package/dist/router.js CHANGED
@@ -1,20 +1,4 @@
1
1
  // @bun
2
- var __defProp = Object.defineProperty;
3
- var __returnValue = (v) => v;
4
- function __exportSetter(name, newValue) {
5
- this[name] = __returnValue.bind(null, newValue);
6
- }
7
- var __export = (target, all) => {
8
- for (var name in all)
9
- __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true,
12
- configurable: true,
13
- set: __exportSetter.bind(all, name)
14
- });
15
- };
16
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
17
-
18
2
  // src/router.ts
19
3
  function createRouter() {
20
4
  const routes = [];
@@ -23,7 +7,9 @@ function createRouter() {
23
7
  const regex = /:([a-zA-Z_][a-zA-Z0-9_]*)/g;
24
8
  let match;
25
9
  while ((match = regex.exec(pattern)) !== null) {
26
- params.push(match[1]);
10
+ const name = match[1];
11
+ if (name !== undefined)
12
+ params.push(name);
27
13
  }
28
14
  return params;
29
15
  }
@@ -38,7 +24,11 @@ function createRouter() {
38
24
  return null;
39
25
  const params = {};
40
26
  for (let i = 0;i < paramNames.length; i++) {
41
- params[paramNames[i]] = m[i + 1];
27
+ const key = paramNames[i];
28
+ const value = m[i + 1];
29
+ if (key !== undefined && value !== undefined) {
30
+ params[key] = value;
31
+ }
42
32
  }
43
33
  return params;
44
34
  }
@@ -57,6 +47,8 @@ function createRouter() {
57
47
  return { route: exact };
58
48
  for (let i = routes.length - 1;i >= 0; i--) {
59
49
  const route = routes[i];
50
+ if (!route)
51
+ continue;
60
52
  if (route.params && route.params.length > 0 && route.regex) {
61
53
  const matched = matchPattern(path, route.regex, route.params);
62
54
  if (matched && route.method === method) {
@@ -88,6 +80,8 @@ function createRouter() {
88
80
  let pathExists = false;
89
81
  for (let i = routes.length - 1;i >= 0; i--) {
90
82
  const r = routes[i];
83
+ if (!r)
84
+ continue;
91
85
  if (r.path === path) {
92
86
  pathExists = true;
93
87
  break;
@@ -3,6 +3,7 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
  export type { WorkerManifest, VarDef, ServiceBindingDef, InfraBindings, KVBindingDef, D1BindingDef, R2BindingDef, QueueBindingDef, VectorizeBindingDef, DOBindingDef, ValidationError, ValidationReport, } from "./types.js";
6
- export { WORKER_MANIFESTS, WORKER_NAMES, CALLED_BY } from "./registry.js";
6
+ export { WORKER_MANIFESTS, WORKER_NAMES, WORKER_CATALOG, CALLED_BY, getWorkerDefaultEnabled, } from "./registry.js";
7
+ export type { WorkerCatalogEntry } from "./registry.js";
7
8
  export { validateWranglerJsonc, validateRootSecrets, validateDevVars, validateAll, generateWranglerJsonc, generateDevVars, } from "./validators.js";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,eAAe,GAChB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EACV,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,qBAAqB,EACrB,eAAe,GAChB,MAAM,iBAAiB,CAAC"}