@bleedingdev/modern-js-bff-effect 3.8.3-ultramodern.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.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/cjs/data-platform/batch/protocol.js +130 -0
  4. package/dist/cjs/data-platform/batch/queue.js +623 -0
  5. package/dist/cjs/data-platform/batch/request.js +121 -0
  6. package/dist/cjs/data-platform/batch/response.js +65 -0
  7. package/dist/cjs/data-platform/batch/telemetry.js +71 -0
  8. package/dist/cjs/data-platform/batch/url.js +69 -0
  9. package/dist/cjs/data-platform/batch-transport.js +59 -0
  10. package/dist/cjs/data-platform/codec.js +155 -0
  11. package/dist/cjs/data-platform/index.js +124 -0
  12. package/dist/cjs/data-platform/invalidation.js +61 -0
  13. package/dist/cjs/data-platform/trace.js +73 -0
  14. package/dist/cjs/data-platform/types.js +48 -0
  15. package/dist/cjs/data-platform/validation.js +178 -0
  16. package/dist/cjs/effect/context.js +59 -0
  17. package/dist/cjs/effect/dispatch.js +101 -0
  18. package/dist/cjs/effect/edge-context.js +61 -0
  19. package/dist/cjs/effect/edge-dispatcher.js +354 -0
  20. package/dist/cjs/effect/edge.js +62 -0
  21. package/dist/cjs/effect/endpoint-contracts.js +121 -0
  22. package/dist/cjs/effect/entry-shape-registry.js +31 -0
  23. package/dist/cjs/effect/entry-shape.js +113 -0
  24. package/dist/cjs/effect/handler/batch-handler.js +270 -0
  25. package/dist/cjs/effect/handler/batch.js +170 -0
  26. package/dist/cjs/effect/handler/definition.js +99 -0
  27. package/dist/cjs/effect/handler/envelope.js +104 -0
  28. package/dist/cjs/effect/handler/http.js +107 -0
  29. package/dist/cjs/effect/handler/openapi.js +58 -0
  30. package/dist/cjs/effect/handler/routing.js +100 -0
  31. package/dist/cjs/effect/handler/rpc.js +63 -0
  32. package/dist/cjs/effect/handler/types.js +43 -0
  33. package/dist/cjs/effect/handler.js +173 -0
  34. package/dist/cjs/effect/index.js +137 -0
  35. package/dist/cjs/effect/module.js +118 -0
  36. package/dist/cjs/effect/operation-context.js +116 -0
  37. package/dist/cjs/effect/rpcSerialization.js +54 -0
  38. package/dist/cjs/effect-client/batch.js +73 -0
  39. package/dist/cjs/effect-client/envelope.js +145 -0
  40. package/dist/cjs/effect-client/guards.js +44 -0
  41. package/dist/cjs/effect-client/index.js +208 -0
  42. package/dist/cjs/effect-client/request-context.js +64 -0
  43. package/dist/cjs/effect-client/request.js +66 -0
  44. package/dist/cjs/effect-client/runtime.js +100 -0
  45. package/dist/cjs/effect-client/types.js +18 -0
  46. package/dist/cjs/headers.js +46 -0
  47. package/dist/cjs/index.js +83 -0
  48. package/dist/esm/data-platform/batch/protocol.mjs +71 -0
  49. package/dist/esm/data-platform/batch/queue.mjs +582 -0
  50. package/dist/esm/data-platform/batch/request.mjs +68 -0
  51. package/dist/esm/data-platform/batch/response.mjs +24 -0
  52. package/dist/esm/data-platform/batch/telemetry.mjs +27 -0
  53. package/dist/esm/data-platform/batch/url.mjs +25 -0
  54. package/dist/esm/data-platform/batch-transport.mjs +12 -0
  55. package/dist/esm/data-platform/codec.mjs +90 -0
  56. package/dist/esm/data-platform/index.mjs +7 -0
  57. package/dist/esm/data-platform/invalidation.mjs +20 -0
  58. package/dist/esm/data-platform/trace.mjs +29 -0
  59. package/dist/esm/data-platform/types.mjs +4 -0
  60. package/dist/esm/data-platform/validation.mjs +128 -0
  61. package/dist/esm/effect/context.mjs +12 -0
  62. package/dist/esm/effect/dispatch.mjs +63 -0
  63. package/dist/esm/effect/edge-context.mjs +14 -0
  64. package/dist/esm/effect/edge-dispatcher.mjs +115 -0
  65. package/dist/esm/effect/edge.mjs +1 -0
  66. package/dist/esm/effect/endpoint-contracts.mjs +68 -0
  67. package/dist/esm/effect/entry-shape-registry.mjs +17 -0
  68. package/dist/esm/effect/entry-shape.mjs +51 -0
  69. package/dist/esm/effect/handler/batch-handler.mjs +232 -0
  70. package/dist/esm/effect/handler/batch.mjs +105 -0
  71. package/dist/esm/effect/handler/definition.mjs +58 -0
  72. package/dist/esm/effect/handler/envelope.mjs +63 -0
  73. package/dist/esm/effect/handler/http.mjs +69 -0
  74. package/dist/esm/effect/handler/openapi.mjs +20 -0
  75. package/dist/esm/effect/handler/routing.mjs +50 -0
  76. package/dist/esm/effect/handler/rpc.mjs +22 -0
  77. package/dist/esm/effect/handler/types.mjs +5 -0
  78. package/dist/esm/effect/handler.mjs +13 -0
  79. package/dist/esm/effect/index.mjs +7 -0
  80. package/dist/esm/effect/module.mjs +80 -0
  81. package/dist/esm/effect/operation-context.mjs +75 -0
  82. package/dist/esm/effect/rpcSerialization.mjs +16 -0
  83. package/dist/esm/effect-client/batch.mjs +35 -0
  84. package/dist/esm/effect-client/envelope.mjs +104 -0
  85. package/dist/esm/effect-client/guards.mjs +3 -0
  86. package/dist/esm/effect-client/index.mjs +110 -0
  87. package/dist/esm/effect-client/request-context.mjs +23 -0
  88. package/dist/esm/effect-client/request.mjs +28 -0
  89. package/dist/esm/effect-client/runtime.mjs +62 -0
  90. package/dist/esm/effect-client/types.mjs +0 -0
  91. package/dist/esm/headers.mjs +8 -0
  92. package/dist/esm/index.mjs +4 -0
  93. package/dist/esm/rslib-runtime.mjs +18 -0
  94. package/dist/esm-node/data-platform/batch/protocol.mjs +72 -0
  95. package/dist/esm-node/data-platform/batch/queue.mjs +583 -0
  96. package/dist/esm-node/data-platform/batch/request.mjs +69 -0
  97. package/dist/esm-node/data-platform/batch/response.mjs +25 -0
  98. package/dist/esm-node/data-platform/batch/telemetry.mjs +28 -0
  99. package/dist/esm-node/data-platform/batch/url.mjs +26 -0
  100. package/dist/esm-node/data-platform/batch-transport.mjs +13 -0
  101. package/dist/esm-node/data-platform/codec.mjs +91 -0
  102. package/dist/esm-node/data-platform/index.mjs +8 -0
  103. package/dist/esm-node/data-platform/invalidation.mjs +21 -0
  104. package/dist/esm-node/data-platform/trace.mjs +30 -0
  105. package/dist/esm-node/data-platform/types.mjs +5 -0
  106. package/dist/esm-node/data-platform/validation.mjs +129 -0
  107. package/dist/esm-node/effect/context.mjs +13 -0
  108. package/dist/esm-node/effect/dispatch.mjs +64 -0
  109. package/dist/esm-node/effect/edge-context.mjs +15 -0
  110. package/dist/esm-node/effect/edge-dispatcher.mjs +116 -0
  111. package/dist/esm-node/effect/edge.mjs +2 -0
  112. package/dist/esm-node/effect/endpoint-contracts.mjs +69 -0
  113. package/dist/esm-node/effect/entry-shape-registry.mjs +18 -0
  114. package/dist/esm-node/effect/entry-shape.mjs +63 -0
  115. package/dist/esm-node/effect/handler/batch-handler.mjs +233 -0
  116. package/dist/esm-node/effect/handler/batch.mjs +106 -0
  117. package/dist/esm-node/effect/handler/definition.mjs +59 -0
  118. package/dist/esm-node/effect/handler/envelope.mjs +64 -0
  119. package/dist/esm-node/effect/handler/http.mjs +70 -0
  120. package/dist/esm-node/effect/handler/openapi.mjs +21 -0
  121. package/dist/esm-node/effect/handler/routing.mjs +51 -0
  122. package/dist/esm-node/effect/handler/rpc.mjs +23 -0
  123. package/dist/esm-node/effect/handler/types.mjs +6 -0
  124. package/dist/esm-node/effect/handler.mjs +14 -0
  125. package/dist/esm-node/effect/index.mjs +8 -0
  126. package/dist/esm-node/effect/module.mjs +81 -0
  127. package/dist/esm-node/effect/operation-context.mjs +76 -0
  128. package/dist/esm-node/effect/rpcSerialization.mjs +17 -0
  129. package/dist/esm-node/effect-client/batch.mjs +36 -0
  130. package/dist/esm-node/effect-client/envelope.mjs +105 -0
  131. package/dist/esm-node/effect-client/guards.mjs +4 -0
  132. package/dist/esm-node/effect-client/index.mjs +111 -0
  133. package/dist/esm-node/effect-client/request-context.mjs +24 -0
  134. package/dist/esm-node/effect-client/request.mjs +29 -0
  135. package/dist/esm-node/effect-client/runtime.mjs +63 -0
  136. package/dist/esm-node/effect-client/types.mjs +1 -0
  137. package/dist/esm-node/headers.mjs +9 -0
  138. package/dist/esm-node/index.mjs +5 -0
  139. package/dist/esm-node/rslib-runtime.mjs +19 -0
  140. package/dist/types/data-platform/batch/protocol.d.ts +9 -0
  141. package/dist/types/data-platform/batch/queue.d.ts +47 -0
  142. package/dist/types/data-platform/batch/request.d.ts +19 -0
  143. package/dist/types/data-platform/batch/response.d.ts +3 -0
  144. package/dist/types/data-platform/batch/telemetry.d.ts +4 -0
  145. package/dist/types/data-platform/batch/url.d.ts +4 -0
  146. package/dist/types/data-platform/batch-transport.d.ts +3 -0
  147. package/dist/types/data-platform/codec.d.ts +17 -0
  148. package/dist/types/data-platform/index.d.ts +8 -0
  149. package/dist/types/data-platform/invalidation.d.ts +8 -0
  150. package/dist/types/data-platform/trace.d.ts +4 -0
  151. package/dist/types/data-platform/types.d.ts +151 -0
  152. package/dist/types/data-platform/validation.d.ts +29 -0
  153. package/dist/types/effect/context.d.ts +5 -0
  154. package/dist/types/effect/dispatch.d.ts +13 -0
  155. package/dist/types/effect/edge-context.d.ts +5 -0
  156. package/dist/types/effect/edge-dispatcher.d.ts +37 -0
  157. package/dist/types/effect/edge.d.ts +1 -0
  158. package/dist/types/effect/endpoint-contracts.d.ts +67 -0
  159. package/dist/types/effect/entry-shape.d.ts +32 -0
  160. package/dist/types/effect/handler/batch-handler.d.ts +11 -0
  161. package/dist/types/effect/handler/batch.d.ts +15 -0
  162. package/dist/types/effect/handler/definition.d.ts +7 -0
  163. package/dist/types/effect/handler/envelope.d.ts +13 -0
  164. package/dist/types/effect/handler/http.d.ts +15 -0
  165. package/dist/types/effect/handler/openapi.d.ts +4 -0
  166. package/dist/types/effect/handler/routing.d.ts +5 -0
  167. package/dist/types/effect/handler/rpc.d.ts +7 -0
  168. package/dist/types/effect/handler/types.d.ts +153 -0
  169. package/dist/types/effect/handler.d.ts +13 -0
  170. package/dist/types/effect/index.d.ts +6 -0
  171. package/dist/types/effect/module.d.ts +36 -0
  172. package/dist/types/effect/operation-context.d.ts +15 -0
  173. package/dist/types/effect/rpcSerialization.d.ts +3 -0
  174. package/dist/types/effect-client/batch.d.ts +2 -0
  175. package/dist/types/effect-client/envelope.d.ts +15 -0
  176. package/dist/types/effect-client/guards.d.ts +2 -0
  177. package/dist/types/effect-client/index.d.ts +58 -0
  178. package/dist/types/effect-client/request-context.d.ts +3 -0
  179. package/dist/types/effect-client/request.d.ts +1 -0
  180. package/dist/types/effect-client/runtime.d.ts +5 -0
  181. package/dist/types/effect-client/types.d.ts +68 -0
  182. package/dist/types/headers.d.ts +1 -0
  183. package/dist/types/index.d.ts +3 -0
  184. package/package.json +164 -0
  185. package/src/data-platform/batch/protocol.ts +112 -0
  186. package/src/data-platform/batch/queue.ts +876 -0
  187. package/src/data-platform/batch/request.ts +130 -0
  188. package/src/data-platform/batch/response.ts +74 -0
  189. package/src/data-platform/batch/telemetry.ts +47 -0
  190. package/src/data-platform/batch/url.ts +54 -0
  191. package/src/data-platform/batch-transport.ts +22 -0
  192. package/src/data-platform/codec.ts +145 -0
  193. package/src/data-platform/index.ts +63 -0
  194. package/src/data-platform/invalidation.ts +57 -0
  195. package/src/data-platform/trace.ts +49 -0
  196. package/src/data-platform/types.ts +186 -0
  197. package/src/data-platform/validation.ts +303 -0
  198. package/src/effect/context.ts +37 -0
  199. package/src/effect/dispatch.ts +132 -0
  200. package/src/effect/edge-context.ts +51 -0
  201. package/src/effect/edge-dispatcher.ts +310 -0
  202. package/src/effect/edge.ts +1 -0
  203. package/src/effect/endpoint-contracts.ts +191 -0
  204. package/src/effect/entry-shape-registry.cjs +16 -0
  205. package/src/effect/entry-shape-registry.d.cts +6 -0
  206. package/src/effect/entry-shape.ts +155 -0
  207. package/src/effect/handler/batch-handler.ts +475 -0
  208. package/src/effect/handler/batch.ts +182 -0
  209. package/src/effect/handler/definition.ts +121 -0
  210. package/src/effect/handler/envelope.ts +133 -0
  211. package/src/effect/handler/http.ts +133 -0
  212. package/src/effect/handler/openapi.ts +45 -0
  213. package/src/effect/handler/routing.ts +91 -0
  214. package/src/effect/handler/rpc.ts +45 -0
  215. package/src/effect/handler/types.ts +255 -0
  216. package/src/effect/handler.ts +33 -0
  217. package/src/effect/index.ts +22 -0
  218. package/src/effect/module.ts +186 -0
  219. package/src/effect/operation-context.ts +144 -0
  220. package/src/effect/rpcSerialization.ts +20 -0
  221. package/src/effect-client/batch.ts +50 -0
  222. package/src/effect-client/envelope.ts +238 -0
  223. package/src/effect-client/guards.ts +6 -0
  224. package/src/effect-client/index.ts +325 -0
  225. package/src/effect-client/request-context.ts +54 -0
  226. package/src/effect-client/request.ts +51 -0
  227. package/src/effect-client/runtime.ts +122 -0
  228. package/src/effect-client/types.ts +84 -0
  229. package/src/headers.ts +7 -0
  230. package/src/index.ts +3 -0
@@ -0,0 +1,623 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ BatchBucketRegistry: ()=>BatchBucketRegistry,
32
+ createBatchTransportQueue: ()=>createBatchTransportQueue
33
+ });
34
+ const external_codec_js_namespaceObject = require("../codec.js");
35
+ const external_types_js_namespaceObject = require("../types.js");
36
+ const external_protocol_js_namespaceObject = require("./protocol.js");
37
+ const external_request_js_namespaceObject = require("./request.js");
38
+ const external_response_js_namespaceObject = require("./response.js");
39
+ const external_telemetry_js_namespaceObject = require("./telemetry.js");
40
+ const external_url_js_namespaceObject = require("./url.js");
41
+ const SAFE_REPLAY_METHODS = new Set([
42
+ 'GET',
43
+ 'HEAD'
44
+ ]);
45
+ const abortReason = (signal)=>signal.reason ?? new DOMException('The request was aborted', 'AbortError');
46
+ const createRequestLifetime = (sourceSignal, timeoutMs)=>{
47
+ const controller = new AbortController();
48
+ let timedOut = false;
49
+ let timeoutHandle = null;
50
+ const abortFromSource = ()=>{
51
+ if (sourceSignal) controller.abort(abortReason(sourceSignal));
52
+ };
53
+ if (sourceSignal?.aborted) abortFromSource();
54
+ else if (sourceSignal) sourceSignal.addEventListener('abort', abortFromSource, {
55
+ once: true
56
+ });
57
+ if (!controller.signal.aborted && timeoutMs && timeoutMs > 0) timeoutHandle = setTimeout(()=>{
58
+ timedOut = true;
59
+ controller.abort(new DOMException('The batched request timed out', 'TimeoutError'));
60
+ }, timeoutMs);
61
+ return {
62
+ signal: controller.signal,
63
+ get timedOut () {
64
+ return timedOut;
65
+ },
66
+ dispose () {
67
+ if (null !== timeoutHandle) {
68
+ clearTimeout(timeoutHandle);
69
+ timeoutHandle = null;
70
+ }
71
+ sourceSignal?.removeEventListener('abort', abortFromSource);
72
+ }
73
+ };
74
+ };
75
+ const runWithSignal = (signal, operation)=>{
76
+ if (signal.aborted) return Promise.reject(abortReason(signal));
77
+ return new Promise((resolve, reject)=>{
78
+ const onAbort = ()=>{
79
+ signal.removeEventListener('abort', onAbort);
80
+ reject(abortReason(signal));
81
+ };
82
+ signal.addEventListener('abort', onAbort, {
83
+ once: true
84
+ });
85
+ let pending;
86
+ try {
87
+ pending = operation();
88
+ } catch (error) {
89
+ signal.removeEventListener('abort', onAbort);
90
+ reject(error);
91
+ return;
92
+ }
93
+ pending.then((value)=>{
94
+ signal.removeEventListener('abort', onAbort);
95
+ resolve(value);
96
+ }, (error)=>{
97
+ signal.removeEventListener('abort', onAbort);
98
+ reject(error);
99
+ });
100
+ });
101
+ };
102
+ class BatchBucketRegistry {
103
+ get size() {
104
+ return this.buckets.size;
105
+ }
106
+ get(bucketKey) {
107
+ return this.buckets.get(bucketKey);
108
+ }
109
+ ensure(bucketKey) {
110
+ const existing = this.buckets.get(bucketKey);
111
+ if (existing) return existing;
112
+ const next = {
113
+ items: [],
114
+ bytes: 0,
115
+ batchId: (0, external_request_js_namespaceObject.createBatchId)(),
116
+ sentAt: Date.now(),
117
+ timer: null,
118
+ flushing: false
119
+ };
120
+ this.buckets.set(bucketKey, next);
121
+ return next;
122
+ }
123
+ releaseIfIdle(bucketKey, bucket) {
124
+ if (this.buckets.get(bucketKey) !== bucket || bucket.flushing || null !== bucket.timer || bucket.items.length > 0) return false;
125
+ return this.buckets.delete(bucketKey);
126
+ }
127
+ constructor(){
128
+ this.buckets = new Map();
129
+ }
130
+ }
131
+ function createBatchTransportQueue({ options, baseFetch, bucketRegistry }) {
132
+ const flushIntervalMs = Math.max(0, options.flushIntervalMs ?? 8);
133
+ const maxBatchSize = Math.max(1, options.maxBatchSize ?? 16);
134
+ const maxBatchBytes = Math.max(1024, options.maxBatchBytes ?? 65536);
135
+ const requestTimeoutMs = options.requestTimeoutMs;
136
+ const allowedMethods = new Set((options.allowedMethods && options.allowedMethods.length > 0 ? options.allowedMethods : [
137
+ 'GET'
138
+ ]).map((method)=>method.toUpperCase()));
139
+ const onEvent = options.onEvent;
140
+ const buckets = bucketRegistry ?? new BatchBucketRegistry();
141
+ const pendingByKey = new Map();
142
+ const disabledEndpoints = new Set();
143
+ let nextItemId = 0;
144
+ const createPayload = (bucket, items)=>({
145
+ protocolVersion: 2,
146
+ batchId: bucket.batchId,
147
+ sentAt: bucket.sentAt,
148
+ items: items.map((item)=>item.item)
149
+ });
150
+ const measurePayload = (bucket, items)=>(0, external_request_js_namespaceObject.measureTextBytes)(JSON.stringify(createPayload(bucket, items)));
151
+ const rotatePayloadIdentity = (bucket)=>{
152
+ bucket.batchId = (0, external_request_js_namespaceObject.createBatchId)();
153
+ bucket.sentAt = Date.now();
154
+ };
155
+ const settleRequest = (request, settlement)=>{
156
+ if ('settled' === request.phase) return false;
157
+ request.phase = 'settled';
158
+ request.lifetime.signal.removeEventListener('abort', request.abortListener);
159
+ request.lifetime.dispose();
160
+ if (pendingByKey.get(request.key) === request) pendingByKey.delete(request.key);
161
+ if ('resolve' === settlement.type) request.resolve(settlement.value);
162
+ else request.reject(settlement.reason);
163
+ return true;
164
+ };
165
+ const removeQueuedRequest = (request)=>{
166
+ const bucket = buckets.get(request.bucketKey);
167
+ if (!bucket) return;
168
+ const index = bucket.items.indexOf(request);
169
+ if (-1 === index) return;
170
+ bucket.items.splice(index, 1);
171
+ bucket.bytes = measurePayload(bucket, bucket.items);
172
+ if (0 === bucket.items.length && bucket.timer) {
173
+ clearTimeout(bucket.timer);
174
+ bucket.timer = null;
175
+ }
176
+ buckets.releaseIfIdle(request.bucketKey, bucket);
177
+ };
178
+ const abortQueuedRequest = (request)=>{
179
+ if ('settled' === request.phase) return;
180
+ if ('queued' === request.phase) removeQueuedRequest(request);
181
+ const abortBatchIfUnused = request.abortBatchIfUnused;
182
+ settleRequest(request, {
183
+ type: 'reject',
184
+ reason: abortReason(request.lifetime.signal)
185
+ });
186
+ abortBatchIfUnused?.();
187
+ };
188
+ const runSingle = (request)=>runWithSignal(request.lifetime.signal, async ()=>{
189
+ const response = await baseFetch(request.requestInput, request.requestInit);
190
+ return (0, external_response_js_namespaceObject.parseResponseLikeCreateRequest)(response);
191
+ });
192
+ const settleRequests = async (items, runner)=>{
193
+ await Promise.all(items.map(async (item)=>{
194
+ if ('settled' === item.phase) return;
195
+ try {
196
+ const value = await runner(item);
197
+ settleRequest(item, {
198
+ type: 'resolve',
199
+ value
200
+ });
201
+ } catch (error) {
202
+ settleRequest(item, {
203
+ type: 'reject',
204
+ reason: error
205
+ });
206
+ }
207
+ }));
208
+ };
209
+ const runAfterAmbiguousBatch = (request, reason)=>{
210
+ if (!SAFE_REPLAY_METHODS.has(request.item.method)) throw new Error(`Batch result is unknown for ${request.item.method}; automatic replay is disabled (${reason}).`);
211
+ return runSingle(request);
212
+ };
213
+ const settleAmbiguousBatchRequests = (items, reason)=>settleRequests(items, (request)=>runAfterAmbiguousBatch(request, reason));
214
+ const flushBucket = async (bucketKey)=>{
215
+ const bucket = buckets.get(bucketKey);
216
+ if (!bucket || bucket.flushing) return;
217
+ if (bucket.timer) {
218
+ clearTimeout(bucket.timer);
219
+ bucket.timer = null;
220
+ }
221
+ if (0 === bucket.items.length) return void buckets.releaseIfIdle(bucketKey, bucket);
222
+ bucket.flushing = true;
223
+ const items = bucket.items;
224
+ for (const item of items)item.phase = 'flushing';
225
+ const payloadIdentity = {
226
+ batchId: bucket.batchId,
227
+ sentAt: bucket.sentAt
228
+ };
229
+ bucket.items = [];
230
+ bucket.bytes = 0;
231
+ rotatePayloadIdentity(bucket);
232
+ const firstItem = items[0];
233
+ if (!firstItem) {
234
+ bucket.flushing = false;
235
+ buckets.releaseIfIdle(bucketKey, bucket);
236
+ return;
237
+ }
238
+ const endpoint = firstItem.endpoint;
239
+ if (1 === items.length || disabledEndpoints.has(endpoint)) {
240
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
241
+ type: disabledEndpoints.has(endpoint) ? 'fallback' : 'flush',
242
+ endpoint,
243
+ size: items.length,
244
+ reason: disabledEndpoints.has(endpoint) ? 'batch-disabled' : void 0
245
+ });
246
+ await settleRequests(items, runSingle);
247
+ bucket.flushing = false;
248
+ if (bucket.items.length > 0 && !bucket.timer) flushBucket(bucketKey);
249
+ buckets.releaseIfIdle(bucketKey, bucket);
250
+ return;
251
+ }
252
+ const payload = createPayload(payloadIdentity, items);
253
+ const batchId = payload.batchId;
254
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
255
+ type: 'flush',
256
+ endpoint,
257
+ batchId,
258
+ size: items.length
259
+ });
260
+ const payloadJson = JSON.stringify(payload);
261
+ const traceparent = items.find((item)=>'string' == typeof item.item.headers?.traceparent)?.item.headers?.traceparent || void 0;
262
+ const authorization = firstItem.authorization;
263
+ const cookie = firstItem.cookie;
264
+ const requestInit = {
265
+ method: 'POST',
266
+ credentials: firstItem.credentials,
267
+ headers: {
268
+ accept: 'application/json, */*;q=0.8',
269
+ 'content-type': 'application/json; charset=utf-8',
270
+ [external_types_js_namespaceObject.DEFAULT_DATA_BATCH_HEADER]: '2',
271
+ ...traceparent ? {
272
+ traceparent
273
+ } : {},
274
+ ...'string' == typeof authorization ? {
275
+ authorization
276
+ } : {},
277
+ ...'string' == typeof cookie ? {
278
+ cookie
279
+ } : {}
280
+ },
281
+ body: payloadJson
282
+ };
283
+ const controller = new AbortController();
284
+ let abortedBecauseUnused = false;
285
+ const abortBatchIfUnused = ()=>{
286
+ if (!controller.signal.aborted && items.every((item)=>'settled' === item.phase)) {
287
+ abortedBecauseUnused = true;
288
+ controller.abort(items.find((item)=>item.lifetime.timedOut) ? new DOMException('The batch timed out', 'TimeoutError') : new DOMException('Every batched request was aborted', 'AbortError'));
289
+ }
290
+ };
291
+ for (const item of items)item.abortBatchIfUnused = abortBatchIfUnused;
292
+ requestInit.signal = controller.signal;
293
+ try {
294
+ const response = await runWithSignal(controller.signal, ()=>baseFetch(endpoint, requestInit));
295
+ if (!response.ok) {
296
+ if (404 === response.status || 405 === response.status) {
297
+ disabledEndpoints.add(endpoint);
298
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
299
+ type: 'disable',
300
+ endpoint,
301
+ batchId,
302
+ reason: `batch-endpoint-unavailable-${String(response.status)}`
303
+ });
304
+ } else (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
305
+ type: 'fallback',
306
+ endpoint,
307
+ batchId,
308
+ size: items.length,
309
+ reason: `batch-response-${String(response.status)}`
310
+ });
311
+ await settleAmbiguousBatchRequests(items, `batch-response-${String(response.status)}`);
312
+ bucket.flushing = false;
313
+ return;
314
+ }
315
+ const result = await runWithSignal(controller.signal, async ()=>response.json());
316
+ if (!(0, external_response_js_namespaceObject.isBatchResponsePayload)(result)) {
317
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
318
+ type: 'fallback',
319
+ endpoint,
320
+ batchId,
321
+ size: items.length,
322
+ reason: 'invalid-batch-response'
323
+ });
324
+ await settleAmbiguousBatchRequests(items, 'invalid-batch-response');
325
+ bucket.flushing = false;
326
+ return;
327
+ }
328
+ if (result.batchId !== batchId) {
329
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
330
+ type: 'fallback',
331
+ endpoint,
332
+ batchId,
333
+ size: items.length,
334
+ reason: 'mismatched-batch-id'
335
+ });
336
+ await settleAmbiguousBatchRequests(items, 'mismatched-batch-id');
337
+ bucket.flushing = false;
338
+ return;
339
+ }
340
+ const itemMap = new Map();
341
+ for (const item of result.items)itemMap.set(item.id, item);
342
+ await settleRequests(items, async (request)=>{
343
+ const resultItem = itemMap.get(request.item.id);
344
+ if (!resultItem) return runAfterAmbiguousBatch(request, 'missing-batch-result');
345
+ const reconstructedBody = resultItem.body ? (0, external_protocol_js_namespaceObject.decodeBatchBody)(resultItem.body) : null;
346
+ const reconstructedResponse = new Response((0, external_protocol_js_namespaceObject.isNullBodyStatus)(resultItem.status) ? null : reconstructedBody, {
347
+ status: resultItem.status,
348
+ headers: resultItem.headers
349
+ });
350
+ return (0, external_response_js_namespaceObject.parseResponseLikeCreateRequest)(reconstructedResponse);
351
+ });
352
+ } catch {
353
+ if (abortedBecauseUnused) {
354
+ if (items.some((item)=>item.lifetime.timedOut)) (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
355
+ type: 'fallback',
356
+ endpoint,
357
+ batchId,
358
+ size: items.length,
359
+ reason: 'batch-timeout'
360
+ });
361
+ return;
362
+ }
363
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
364
+ type: 'fallback',
365
+ endpoint,
366
+ batchId,
367
+ size: items.length,
368
+ reason: 'batch-transport-error'
369
+ });
370
+ await settleAmbiguousBatchRequests(items, 'batch-transport-error');
371
+ } finally{
372
+ for (const item of items)item.abortBatchIfUnused = void 0;
373
+ bucket.flushing = false;
374
+ if (bucket.items.length > 0 && !bucket.timer) flushBucket(bucketKey);
375
+ buckets.releaseIfIdle(bucketKey, bucket);
376
+ }
377
+ };
378
+ const pendingReadPromises = new Map();
379
+ const normalizeRequest = (input, init)=>{
380
+ const sourceRequest = "u" > typeof Request && input instanceof Request ? input : void 0;
381
+ const initDefinesSignal = void 0 !== init && 'signal' in init;
382
+ const initDefinesBody = void 0 !== init && 'body' in init;
383
+ const initSnapshot = init ? {
384
+ ...init
385
+ } : void 0;
386
+ const getInitValue = (key)=>{
387
+ if (!init) return;
388
+ return Object.prototype.hasOwnProperty.call(initSnapshot, key) ? initSnapshot?.[key] : init[key];
389
+ };
390
+ const method = (0, external_request_js_namespaceObject.normalizeMethod)(getInitValue('method') ?? sourceRequest?.method);
391
+ const headers = (0, external_request_js_namespaceObject.toHeaderRecord)(getInitValue('headers') ?? sourceRequest?.headers);
392
+ const credentials = getInitValue('credentials') ?? sourceRequest?.credentials ?? 'same-origin';
393
+ const initBody = getInitValue('body');
394
+ const body = initBody ?? null;
395
+ const initSignal = initDefinesSignal ? getInitValue('signal') : void 0;
396
+ const sourceSignal = initDefinesSignal ? initSignal ?? void 0 : sourceRequest?.signal;
397
+ const requestUrl = (0, external_url_js_namespaceObject.toAbsoluteUrl)(input);
398
+ const endpoint = (0, external_url_js_namespaceObject.normalizeBatchEndpoint)(requestUrl, options.endpoint).toString();
399
+ return {
400
+ requestUrl,
401
+ endpoint,
402
+ method,
403
+ headers,
404
+ credentials,
405
+ body,
406
+ hasOpaqueSourceBody: void 0 === initBody && void 0 !== sourceRequest && null !== sourceRequest.body,
407
+ requestInput: sourceRequest ?? requestUrl.toString(),
408
+ requestInit: {
409
+ ...initSnapshot,
410
+ method,
411
+ headers,
412
+ credentials,
413
+ ...initDefinesBody ? {
414
+ body: initBody
415
+ } : {},
416
+ ...initDefinesSignal ? {
417
+ signal: initSignal
418
+ } : {}
419
+ },
420
+ sourceSignal
421
+ };
422
+ };
423
+ const getPendingReadKey = (request)=>{
424
+ if (!SAFE_REPLAY_METHODS.has(request.method) || void 0 !== request.sourceSignal || null !== request.body || request.hasOpaqueSourceBody || disabledEndpoints.has(request.endpoint) || !(0, external_request_js_namespaceObject.shouldBatchRequest)({
425
+ method: request.method,
426
+ body: void 0,
427
+ headers: request.headers,
428
+ allowedMethods,
429
+ batchEndpoint: request.endpoint,
430
+ requestUrl: request.requestUrl
431
+ })) return;
432
+ const itemHeaders = {
433
+ ...request.headers
434
+ };
435
+ delete itemHeaders.authorization;
436
+ delete itemHeaders.cookie;
437
+ const bucketKey = (0, external_codec_js_namespaceObject.stableStringify)({
438
+ endpoint: request.endpoint,
439
+ authorization: request.headers.authorization ?? null,
440
+ cookie: request.headers.cookie ?? null,
441
+ credentials: request.credentials
442
+ });
443
+ return (0, external_codec_js_namespaceObject.stableStringify)({
444
+ bucketKey,
445
+ path: `${request.requestUrl.pathname}${request.requestUrl.search}`,
446
+ method: request.method,
447
+ headers: itemHeaders,
448
+ body: null
449
+ });
450
+ };
451
+ const enqueue = async (request)=>{
452
+ const preparedBody = await (0, external_request_js_namespaceObject.toRequestBody)(request.body);
453
+ const hasOpaqueBody = !preparedBody.batchable || request.hasOpaqueSourceBody;
454
+ if (disabledEndpoints.has(request.endpoint) || !(0, external_request_js_namespaceObject.shouldBatchRequest)({
455
+ method: request.method,
456
+ body: hasOpaqueBody ? '[opaque request body]' : void 0,
457
+ headers: request.headers,
458
+ allowedMethods,
459
+ batchEndpoint: request.endpoint,
460
+ requestUrl: request.requestUrl
461
+ })) return baseFetch(request.requestInput, request.requestInit).then(external_response_js_namespaceObject.parseResponseLikeCreateRequest);
462
+ const itemId = `${Date.now().toString(36)}_${nextItemId.toString(36)}_${Math.random().toString(16).slice(2, 8)}`;
463
+ nextItemId += 1;
464
+ const itemHeaders = {
465
+ ...request.headers
466
+ };
467
+ delete itemHeaders.authorization;
468
+ delete itemHeaders.cookie;
469
+ if (preparedBody.body && preparedBody.inferredContentType && !itemHeaders['content-type']) itemHeaders['content-type'] = preparedBody.inferredContentType;
470
+ const item = {
471
+ id: itemId,
472
+ path: `${request.requestUrl.pathname}${request.requestUrl.search}`,
473
+ method: request.method,
474
+ headers: itemHeaders,
475
+ ...preparedBody.body ? {
476
+ body: preparedBody.body
477
+ } : {}
478
+ };
479
+ const bucketKey = (0, external_codec_js_namespaceObject.stableStringify)({
480
+ endpoint: request.endpoint,
481
+ authorization: request.headers.authorization ?? null,
482
+ cookie: request.headers.cookie ?? null,
483
+ credentials: request.credentials
484
+ });
485
+ const key = (0, external_codec_js_namespaceObject.stableStringify)({
486
+ bucketKey,
487
+ path: item.path,
488
+ method: item.method,
489
+ headers: item.headers,
490
+ body: item.body ?? null
491
+ });
492
+ const canSharePending = SAFE_REPLAY_METHODS.has(request.method) && void 0 === request.sourceSignal;
493
+ const existing = canSharePending ? pendingByKey.get(key) : void 0;
494
+ if (existing) return existing.promise;
495
+ const lifetime = createRequestLifetime(request.sourceSignal, requestTimeoutMs);
496
+ request.requestInit.signal = lifetime.signal;
497
+ const deferred = Promise.withResolvers();
498
+ const queued = {
499
+ key,
500
+ bucketKey,
501
+ endpoint: request.endpoint,
502
+ requestInput: request.requestInput,
503
+ requestInit: request.requestInit,
504
+ authorization: request.headers.authorization,
505
+ cookie: request.headers.cookie,
506
+ credentials: request.credentials,
507
+ item,
508
+ lifetime,
509
+ phase: 'queued',
510
+ promise: deferred.promise,
511
+ abortListener: ()=>abortQueuedRequest(queued),
512
+ resolve: deferred.resolve,
513
+ reject: deferred.reject
514
+ };
515
+ lifetime.signal.addEventListener('abort', queued.abortListener, {
516
+ once: true
517
+ });
518
+ if (lifetime.signal.aborted) {
519
+ abortQueuedRequest(queued);
520
+ return queued.promise;
521
+ }
522
+ if (canSharePending) pendingByKey.set(key, queued);
523
+ const bucket = buckets.ensure(bucketKey);
524
+ const singletonBytes = measurePayload(bucket, [
525
+ queued
526
+ ]);
527
+ if (singletonBytes > maxBatchBytes) {
528
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
529
+ type: 'fallback',
530
+ endpoint: request.endpoint,
531
+ size: 1,
532
+ reason: 'batch-item-too-large'
533
+ });
534
+ queued.phase = 'flushing';
535
+ settleRequests([
536
+ queued
537
+ ], runSingle);
538
+ buckets.releaseIfIdle(bucketKey, bucket);
539
+ return queued.promise;
540
+ }
541
+ const candidateItems = [
542
+ ...bucket.items,
543
+ queued
544
+ ];
545
+ const candidateBytes = measurePayload(bucket, candidateItems);
546
+ if (bucket.items.length > 0 && candidateBytes > maxBatchBytes) {
547
+ if (bucket.flushing) {
548
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
549
+ type: 'fallback',
550
+ endpoint: request.endpoint,
551
+ size: 1,
552
+ reason: 'batch-capacity-during-flush'
553
+ });
554
+ queued.phase = 'flushing';
555
+ settleRequests([
556
+ queued
557
+ ], runSingle);
558
+ return queued.promise;
559
+ }
560
+ flushBucket(bucketKey);
561
+ if (measurePayload(bucket, [
562
+ queued
563
+ ]) > maxBatchBytes) {
564
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
565
+ type: 'fallback',
566
+ endpoint: request.endpoint,
567
+ size: 1,
568
+ reason: 'batch-item-too-large'
569
+ });
570
+ queued.phase = 'flushing';
571
+ settleRequests([
572
+ queued
573
+ ], runSingle);
574
+ return queued.promise;
575
+ }
576
+ }
577
+ bucket.items.push(queued);
578
+ bucket.bytes = measurePayload(bucket, bucket.items);
579
+ (0, external_telemetry_js_namespaceObject.emitDataBatchTransportEvent)(onEvent, {
580
+ type: 'enqueue',
581
+ endpoint: request.endpoint,
582
+ size: bucket.items.length
583
+ });
584
+ if (bucket.items.length >= maxBatchSize || bucket.bytes >= maxBatchBytes) {
585
+ flushBucket(bucketKey);
586
+ return queued.promise;
587
+ }
588
+ if (!bucket.timer) bucket.timer = setTimeout(()=>{
589
+ bucket.timer = null;
590
+ flushBucket(bucketKey);
591
+ }, flushIntervalMs);
592
+ return queued.promise;
593
+ };
594
+ return (input, init)=>{
595
+ let request;
596
+ try {
597
+ request = normalizeRequest(input, init);
598
+ } catch (error) {
599
+ return Promise.reject(error);
600
+ }
601
+ const pendingReadKey = getPendingReadKey(request);
602
+ const existing = pendingReadKey ? pendingReadPromises.get(pendingReadKey) : void 0;
603
+ if (existing) return existing;
604
+ const pending = enqueue(request);
605
+ if (pendingReadKey) {
606
+ pendingReadPromises.set(pendingReadKey, pending);
607
+ const clearPendingRead = ()=>{
608
+ if (pendingReadPromises.get(pendingReadKey) === pending) pendingReadPromises.delete(pendingReadKey);
609
+ };
610
+ pending.then(clearPendingRead, clearPendingRead);
611
+ }
612
+ return pending;
613
+ };
614
+ }
615
+ exports.BatchBucketRegistry = __webpack_exports__.BatchBucketRegistry;
616
+ exports.createBatchTransportQueue = __webpack_exports__.createBatchTransportQueue;
617
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
618
+ "BatchBucketRegistry",
619
+ "createBatchTransportQueue"
620
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
621
+ Object.defineProperty(exports, '__esModule', {
622
+ value: true
623
+ });