keq 2.8.13 → 2.8.14

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 (108) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/esm/src/util/create-response-proxy.js +2 -2
  3. package/dist/esm/src/util/fork.js +3 -3
  4. package/dist/umd/src/util/create-response-proxy.js +2 -2
  5. package/dist/umd/src/util/fork.js +3 -3
  6. package/package.json +1 -1
  7. package/packages/cache/.turbo/turbo-build.log +1 -6
  8. package/packages/cache/dist/cache-entry/cache-entry.d.ts +1 -1
  9. package/packages/cache/dist/cache-entry/cache-entry.d.ts.map +1 -1
  10. package/packages/cache/dist/cache.d.ts +7 -1
  11. package/packages/cache/dist/cache.d.ts.map +1 -1
  12. package/packages/cache/dist/index.js +28 -8
  13. package/packages/cache/dist/index.js.map +1 -1
  14. package/packages/cache/dist/index.mjs +28 -8
  15. package/packages/cache/dist/index.mjs.map +1 -1
  16. package/packages/cache/dist/request-cache-handler/request-cache-handler.d.ts.map +1 -1
  17. package/packages/cache/dist/types/request-cache-options.d.ts +11 -0
  18. package/packages/cache/dist/types/request-cache-options.d.ts.map +1 -1
  19. package/packages/cli/.turbo/turbo-build.log +1 -17
  20. package/packages/cli/dist/cli.cjs +132 -86
  21. package/packages/cli/dist/cli.cjs.map +1 -1
  22. package/packages/cli/dist/cli.js +132 -86
  23. package/packages/cli/dist/cli.js.map +1 -1
  24. package/packages/cli/dist/compiler/compiler.d.ts.map +1 -1
  25. package/packages/cli/dist/compiler/tasks/setup/index.d.ts.map +1 -1
  26. package/packages/cli/dist/compiler/tasks/setup/utils/index.d.ts +0 -1
  27. package/packages/cli/dist/compiler/tasks/setup/utils/index.d.ts.map +1 -1
  28. package/packages/cli/dist/compiler/tasks/setup/utils/parse-runtime-config.d.ts +3 -0
  29. package/packages/cli/dist/compiler/tasks/setup/utils/parse-runtime-config.d.ts.map +1 -0
  30. package/packages/cli/dist/compiler/types/compiler-context.d.ts +1 -1
  31. package/packages/cli/dist/compiler/types/compiler-context.d.ts.map +1 -1
  32. package/packages/cli/dist/compiler/types/compiler-hooks.d.ts +2 -1
  33. package/packages/cli/dist/compiler/types/compiler-hooks.d.ts.map +1 -1
  34. package/packages/cli/dist/define-config.d.ts +3 -0
  35. package/packages/cli/dist/define-config.d.ts.map +1 -0
  36. package/packages/cli/dist/index.cjs +137 -93
  37. package/packages/cli/dist/index.cjs.map +1 -1
  38. package/packages/cli/dist/index.d.ts +2 -2
  39. package/packages/cli/dist/index.d.ts.map +1 -1
  40. package/packages/cli/dist/index.js +136 -91
  41. package/packages/cli/dist/index.js.map +1 -1
  42. package/packages/cli/dist/models/module-definition.d.ts +3 -2
  43. package/packages/cli/dist/models/module-definition.d.ts.map +1 -1
  44. package/packages/cli/dist/plugins/download-http-file/download-http-file.plugin.d.ts +2 -2
  45. package/packages/cli/dist/plugins/download-http-file/download-http-file.plugin.d.ts.map +1 -1
  46. package/packages/cli/dist/plugins/download-local-file/download-local-file.plugin.d.ts.map +1 -1
  47. package/packages/cli/dist/plugins/shaking/shaking.plugin.d.ts.map +1 -1
  48. package/packages/cli/dist/plugins.cjs +25 -12
  49. package/packages/cli/dist/plugins.cjs.map +1 -1
  50. package/packages/cli/dist/plugins.js +25 -12
  51. package/packages/cli/dist/plugins.js.map +1 -1
  52. package/packages/cli/dist/types/address.d.ts +8 -0
  53. package/packages/cli/dist/types/address.d.ts.map +1 -0
  54. package/packages/cli/dist/types/index.d.ts +2 -1
  55. package/packages/cli/dist/types/index.d.ts.map +1 -1
  56. package/packages/cli/dist/types/runtime-config.d.ts +16 -7
  57. package/packages/cli/dist/types/runtime-config.d.ts.map +1 -1
  58. package/packages/cli/dist/utils/is-valid-url.d.ts +16 -0
  59. package/packages/cli/dist/utils/is-valid-url.d.ts.map +1 -0
  60. package/packages/exception/dist/catch-exception.d.ts +4 -0
  61. package/packages/exception/dist/catch-exception.d.ts.map +1 -0
  62. package/packages/exception/dist/index.d.ts +4 -0
  63. package/packages/exception/dist/index.d.ts.map +1 -0
  64. package/packages/exception/dist/throw-exception.d.ts +5 -0
  65. package/packages/exception/dist/throw-exception.d.ts.map +1 -0
  66. package/packages/exception/dist/validate-status-code.d.ts +3 -0
  67. package/packages/exception/dist/validate-status-code.d.ts.map +1 -0
  68. package/packages/headers/.turbo/turbo-build.log +6 -4
  69. package/packages/headers/dist/index.d.ts +42 -0
  70. package/packages/headers/dist/index.d.ts.map +1 -0
  71. package/packages/keq/.turbo/turbo-build.log +6 -6
  72. package/packages/keq/dist/context/execution-context.d.ts +2 -2
  73. package/packages/keq/dist/context/execution-context.d.ts.map +1 -1
  74. package/packages/keq/dist/context/middleware-context.d.ts +1 -1
  75. package/packages/keq/dist/context/middleware-context.d.ts.map +1 -1
  76. package/packages/keq/dist/context/orchestrator-context.d.ts +2 -2
  77. package/packages/keq/dist/context/orchestrator-context.d.ts.map +1 -1
  78. package/packages/keq/dist/context/shared-context.d.ts +7 -7
  79. package/packages/keq/dist/context/shared-context.d.ts.map +1 -1
  80. package/packages/keq/dist/context/types/keq-global.d.ts +7 -2
  81. package/packages/keq/dist/context/types/keq-global.d.ts.map +1 -1
  82. package/packages/keq/dist/index.d.ts +1 -1
  83. package/packages/keq/dist/index.d.ts.map +1 -1
  84. package/packages/keq/dist/index.js +73 -61
  85. package/packages/keq/dist/index.js.map +1 -1
  86. package/packages/keq/dist/index.mjs +73 -61
  87. package/packages/keq/dist/index.mjs.map +1 -1
  88. package/packages/keq/dist/middlewares/flow-control-middleware/abort-flow-control-middleware.d.ts.map +1 -1
  89. package/packages/keq/dist/middlewares/flow-control-middleware/serial-flow-control-middleware.d.ts.map +1 -1
  90. package/packages/keq/dist/orchestrator/orchestrator.d.ts +11 -6
  91. package/packages/keq/dist/orchestrator/orchestrator.d.ts.map +1 -1
  92. package/packages/keq/dist/request/core.d.ts +1 -7
  93. package/packages/keq/dist/request/core.d.ts.map +1 -1
  94. package/packages/keq/dist/request/request.d.ts.map +1 -1
  95. package/packages/keq/dist/request-init/request-init.d.ts +1 -1
  96. package/packages/keq/dist/request-init/request-init.d.ts.map +1 -1
  97. package/packages/nestjs/.turbo/turbo-build.log +1 -6
  98. package/packages/url/.turbo/turbo-build.log +4 -2
  99. package/packages/url/dist/index.d.ts +5 -0
  100. package/packages/url/dist/index.d.ts.map +1 -0
  101. package/packages/cli/dist/compiler/tasks/setup/utils/validate-modules.d.ts +0 -2
  102. package/packages/cli/dist/compiler/tasks/setup/utils/validate-modules.d.ts.map +0 -1
  103. package/packages/cli/dist/define-keq-config.d.ts +0 -3
  104. package/packages/cli/dist/define-keq-config.d.ts.map +0 -1
  105. package/packages/keq/node_modules/.bin/tsc +0 -21
  106. package/packages/keq/node_modules/.bin/tsserver +0 -21
  107. package/packages/nestjs/node_modules/.bin/tsc +0 -21
  108. package/packages/nestjs/node_modules/.bin/tsserver +0 -21
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [2.8.14](https://github.com/keq-request/keq/compare/v2.8.13...v2.8.14) (2026-01-20)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * resolve pnpm singleton trap ([89eed47](https://github.com/keq-request/keq/commit/89eed475346262d5cad371a1aa39cf257bf2a42f))
11
+
5
12
  ### [2.8.13](https://github.com/keq-request/keq/compare/v2.8.12...v2.8.13) (2026-01-14)
6
13
 
7
14
 
@@ -1,6 +1,6 @@
1
1
  import { fork } from './fork.js';
2
- const JsonCachePropertyKey = Symbol('KeqResponseProxyJsonCachePropertyKey');
3
- const TextCachePropertyKey = Symbol('KeqResponseProxyTextCachePropertyKey');
2
+ const JsonCachePropertyKey = '__KeqProtectedProperty(response.proxy.cache.json)__';
3
+ const TextCachePropertyKey = '__KeqProtectedProperty(response.proxy.cache.text)__';
4
4
  export function createResponseProxy(response) {
5
5
  return new Proxy(response, {
6
6
  get(res, prop) {
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-return */
2
2
  import { klona } from 'klona/json';
3
- const UnWrapPropertyKey = Symbol('UnWrapPropertyKey');
3
+ const ForkedObjectBrandPropertyKey = '__KeqProtectedProperty(forked.object.brand)__';
4
4
  const ARRAY_MUTATORS = new Set([
5
5
  'push',
6
6
  'pop',
@@ -35,7 +35,7 @@ export function fork(original) {
35
35
  return new Proxy(getTarget(), {
36
36
  get(target, prop) {
37
37
  const realTarget = getTarget();
38
- if (prop === UnWrapPropertyKey)
38
+ if (prop === ForkedObjectBrandPropertyKey)
39
39
  return realTarget;
40
40
  const value = realTarget[prop];
41
41
  // return value directly if already copied
@@ -81,5 +81,5 @@ export function fork(original) {
81
81
  return createProxy();
82
82
  }
83
83
  export function unwrap(proxy) {
84
- return proxy && proxy[UnWrapPropertyKey] ? proxy[UnWrapPropertyKey] : proxy;
84
+ return proxy && proxy[ForkedObjectBrandPropertyKey] ? proxy[ForkedObjectBrandPropertyKey] : proxy;
85
85
  }
@@ -11,8 +11,8 @@
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.createResponseProxy = void 0;
13
13
  const fork_js_1 = require("./fork.js");
14
- const JsonCachePropertyKey = Symbol('KeqResponseProxyJsonCachePropertyKey');
15
- const TextCachePropertyKey = Symbol('KeqResponseProxyTextCachePropertyKey');
14
+ const JsonCachePropertyKey = '__KeqProtectedProperty(response.proxy.cache.json)__';
15
+ const TextCachePropertyKey = '__KeqProtectedProperty(response.proxy.cache.text)__';
16
16
  function createResponseProxy(response) {
17
17
  return new Proxy(response, {
18
18
  get(res, prop) {
@@ -12,7 +12,7 @@
12
12
  exports.unwrap = exports.fork = void 0;
13
13
  /* eslint-disable @typescript-eslint/no-unsafe-return */
14
14
  const json_1 = require("klona/json");
15
- const UnWrapPropertyKey = Symbol('UnWrapPropertyKey');
15
+ const ForkedObjectBrandPropertyKey = '__KeqProtectedProperty(forked.object.brand)__';
16
16
  const ARRAY_MUTATORS = new Set([
17
17
  'push',
18
18
  'pop',
@@ -47,7 +47,7 @@
47
47
  return new Proxy(getTarget(), {
48
48
  get(target, prop) {
49
49
  const realTarget = getTarget();
50
- if (prop === UnWrapPropertyKey)
50
+ if (prop === ForkedObjectBrandPropertyKey)
51
51
  return realTarget;
52
52
  const value = realTarget[prop];
53
53
  // return value directly if already copied
@@ -94,7 +94,7 @@
94
94
  }
95
95
  exports.fork = fork;
96
96
  function unwrap(proxy) {
97
- return proxy && proxy[UnWrapPropertyKey] ? proxy[UnWrapPropertyKey] : proxy;
97
+ return proxy && proxy[ForkedObjectBrandPropertyKey] ? proxy[ForkedObjectBrandPropertyKey] : proxy;
98
98
  }
99
99
  exports.unwrap = unwrap;
100
100
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keq",
3
- "version": "2.8.13",
3
+ "version": "2.8.14",
4
4
  "description": "Request API write by Typescript for flexibility, readability, and a low learning curve.",
5
5
  "keywords": [
6
6
  "request",
@@ -11,9 +11,4 @@
11
11
  CLI Cleaning output folder
12
12
  CJS Build start
13
13
  ESM Build start
14
- CJS dist/index.js 43.02 KB
15
- CJS dist/index.js.map 77.81 KB
16
- CJS ⚡️ Build success in 194ms
17
- ESM dist/index.mjs 41.10 KB
18
- ESM dist/index.mjs.map 77.05 KB
19
- ESM ⚡️ Build success in 194ms
14
+  ELIFECYCLE  Command failed.
@@ -12,6 +12,6 @@ export declare class CacheEntry {
12
12
  constructor(options: CacheEntryOptions);
13
13
  static build(options: CacheEntryBuildOptions): Promise<CacheEntry>;
14
14
  clone(): CacheEntry;
15
- assign(another: CacheEntry): CacheEntry;
15
+ assignResponseHeaders(headers: Headers): void;
16
16
  }
17
17
  //# sourceMappingURL=cache-entry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache-entry.d.ts","sourceRoot":"","sources":["../../src/cache-entry/cache-entry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAI7E,qBAAa,UAAU;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,QAAQ,CAAA;IAElB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ,SAAS,EAAE,IAAI,CAAA;gBAEH,OAAO,EAAE,iBAAiB;WAOzB,KAAK,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBxE,KAAK,IAAI,UAAU;IAUnB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;CAOxC"}
1
+ {"version":3,"file":"cache-entry.d.ts","sourceRoot":"","sources":["../../src/cache-entry/cache-entry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAA;AAI7E,qBAAa,UAAU;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,QAAQ,CAAA;IAElB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ,SAAS,EAAE,IAAI,CAAA;gBAEH,OAAO,EAAE,iBAAiB;WAOzB,KAAK,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBxE,KAAK,IAAI,UAAU;IASnB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAO9C"}
@@ -1,4 +1,5 @@
1
- import type { Keq, KeqMiddleware, KeqContext } from 'keq';
1
+ import type { queueAsPromised } from 'fastq';
2
+ import type { Keq, KeqMiddleware, KeqContext, KeqNext } from 'keq';
2
3
  import { KeqCacheStorage } from './storage/keq-cache-storage.js';
3
4
  import { KeqCacheKeyFactory, KeqCacheRule, RequestCacheOptions } from './types/index.js';
4
5
  export interface KeqCacheOptions extends Pick<RequestCacheOptions, 'serverTiming'> {
@@ -33,6 +34,11 @@ declare module 'keq' {
33
34
  context: KeqContext;
34
35
  };
35
36
  }
37
+ interface KeqGlobalCore {
38
+ cache?: Record<string, queueAsPromised<{
39
+ next: KeqNext;
40
+ }, void>>;
41
+ }
36
42
  }
37
43
  export declare function cache(options: KeqCacheOptions): KeqMiddleware;
38
44
  //# sourceMappingURL=cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAGxF,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAChF,OAAO,EAAE,eAAe,CAAA;IAExB;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAE/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;CACvB;AAGD,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAiB,oBAAoB,CAAC,EAAE;QACtC;;WAEG;QACH,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;KACpD;IAED,UAAiB,SAAS;QACxB,WAAW,EAAE;YACX,GAAG,EAAE,MAAM,CAAA;YACX,QAAQ,EAAE,QAAQ,CAAA;YAClB,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;QAED,YAAY,EAAE;YACZ,GAAG,EAAE,MAAM,CAAA;YACX,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;QAED,cAAc,EAAE;YACd,GAAG,EAAE,MAAM,CAAA;YACX,WAAW,CAAC,EAAE,QAAQ,CAAA;YACtB,WAAW,EAAE,QAAQ,CAAA;YACrB,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;KACF;CACF;AAGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CA4C7D"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAGxF,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC;IAChF,OAAO,EAAE,eAAe,CAAA;IAExB;;OAEG;IACH,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAE/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAA;CACvB;AAGD,OAAO,QAAQ,KAAK,CAAC;IACnB,UAAiB,oBAAoB,CAAC,EAAE;QACtC;;WAEG;QACH,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;KACpD;IAED,UAAiB,SAAS;QACxB,WAAW,EAAE;YACX,GAAG,EAAE,MAAM,CAAA;YACX,QAAQ,EAAE,QAAQ,CAAA;YAClB,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;QAED,YAAY,EAAE;YACZ,GAAG,EAAE,MAAM,CAAA;YACX,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;QAED,cAAc,EAAE;YACd,GAAG,EAAE,MAAM,CAAA;YACX,WAAW,CAAC,EAAE,QAAQ,CAAA;YACtB,WAAW,EAAE,QAAQ,CAAA;YACrB,OAAO,EAAE,UAAU,CAAA;SACpB,CAAA;KACF;IAED,UAAiB,aAAa;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;YAAE,IAAI,EAAE,OAAO,CAAA;SAAE,EAAE,IAAI,CAAC,CAAC,CAAA;KACjE;CACF;AAGD,wBAAgB,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAgE7D"}
@@ -46,6 +46,7 @@ module.exports = __toCommonJS(index_exports);
46
46
 
47
47
  // src/cache.ts
48
48
  var R2 = __toESM(require("ramda"));
49
+ var fastq = __toESM(require("fastq"));
49
50
 
50
51
  // src/request-cache-handler/request-cache-handler.ts
51
52
  var R = __toESM(require("ramda"));
@@ -306,12 +307,12 @@ var CacheEntry = class _CacheEntry {
306
307
  expiredAt: this.expiredAt
307
308
  });
308
309
  }
309
- assign(another) {
310
- this.key = another.key;
311
- this.response = another.response.clone();
312
- this.size = another.size;
313
- this.expiredAt = another.expiredAt;
314
- return this;
310
+ assignResponseHeaders(headers) {
311
+ this.response = new Response(this.response.body, {
312
+ status: this.response.status,
313
+ statusText: this.response.statusText,
314
+ headers
315
+ });
315
316
  }
316
317
  };
317
318
 
@@ -341,7 +342,9 @@ var RequestCacheHandler = class {
341
342
  const entry = await this.storage.get(key);
342
343
  if (entry) {
343
344
  const dur = (/* @__PURE__ */ new Date()).getTime() - startAt.getTime();
344
- entry.response.headers.append("Server-Timing", "keq-cache; dur=".concat(dur, '; desc="HIT"'));
345
+ const HeadersWithServerTiming = new Headers(entry.response.headers);
346
+ HeadersWithServerTiming.set("Server-Timing", "keq-cache; dur=".concat(dur, '; desc="HIT"'));
347
+ entry.assignResponseHeaders(HeadersWithServerTiming);
345
348
  }
346
349
  return [key, entry];
347
350
  }
@@ -396,7 +399,24 @@ function cache(options) {
396
399
  }
397
400
  const handler = new RequestCacheHandler(storage, requestCacheOptions);
398
401
  const strategy = requestCacheOptions.strategy;
399
- await strategy(handler, ctx, next);
402
+ if (requestCacheOptions.concurrent) {
403
+ await strategy(handler, ctx, next);
404
+ } else {
405
+ if (!ctx.global.core) ctx.global.core = {};
406
+ if (!ctx.global.core.cache) ctx.global.core.cache = {};
407
+ const cacheKey = handler.getRequestCacheKey(ctx);
408
+ if (!ctx.global.core.cache[cacheKey]) {
409
+ ctx.global.core.cache[cacheKey] = fastq.promise(async ({ next: next2 }) => {
410
+ await next2();
411
+ }, 1);
412
+ }
413
+ const queue = ctx.global.core.cache[cacheKey];
414
+ await queue.push({
415
+ next: async () => {
416
+ await strategy(handler, ctx, next);
417
+ }
418
+ });
419
+ }
400
420
  };
401
421
  }
402
422