@bleedingdev/modern-js-create-request 3.8.3-ultramodern.1 → 3.8.3-ultramodern.3

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.
@@ -81,8 +81,9 @@ const createRequestFactory = (environment)=>{
81
81
  const protectedIdentityHeaders = (identityBinding?.protectedHeaders || external_types_js_namespaceObject.BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS).map((header)=>header.toLowerCase());
82
82
  const targetAllowedHeaders = realAllowedHeaders.get(requestId) || [];
83
83
  const forwardedHeaders = {};
84
- if (isServerTarget) {
85
- for (const key of targetAllowedHeaders)if (void 0 !== incomingHeaders[key]) forwardedHeaders[key] = incomingHeaders[key];
84
+ if (isServerTarget) for (const key of targetAllowedHeaders){
85
+ const incomingValue = (0, external_policyCore_js_namespaceObject.readHeader)(incomingHeaders, key);
86
+ if (void 0 !== incomingValue) (0, external_policyCore_js_namespaceObject.writeHeader)(forwardedHeaders, key, incomingValue);
86
87
  }
87
88
  if (identityBindingEnabled) {
88
89
  const derivedIdentityHeaders = {};
@@ -134,21 +135,19 @@ const createRequestFactory = (environment)=>{
134
135
  ...forwardedHeaders
135
136
  }
136
137
  });
137
- if (resolvedHeaders && 'object' == typeof resolvedHeaders) {
138
- for (const key of targetAllowedHeaders)if (void 0 !== resolvedHeaders[key]) {
138
+ if (resolvedHeaders && 'object' == typeof resolvedHeaders) for (const key of targetAllowedHeaders){
139
+ const resolvedValue = (0, external_policyCore_js_namespaceObject.readHeader)(resolvedHeaders, key);
140
+ if (void 0 !== resolvedValue) {
139
141
  if (identityBindingEnabled && protectedIdentityHeaders.includes(key.toLowerCase())) {
140
- (0, external_policyCore_js_namespaceObject.writeHeader)(forwardedHeaders, key.toLowerCase(), resolvedHeaders[key]);
142
+ (0, external_policyCore_js_namespaceObject.writeHeader)(forwardedHeaders, key.toLowerCase(), resolvedValue);
141
143
  continue;
142
144
  }
143
- forwardedHeaders[key] = resolvedHeaders[key];
145
+ (0, external_policyCore_js_namespaceObject.writeHeader)(forwardedHeaders, key, resolvedValue);
144
146
  }
145
147
  }
146
148
  }
147
149
  }
148
- if (isServerTarget) return {
149
- ...headers,
150
- ...forwardedHeaders
151
- };
150
+ if (isServerTarget) for (const [header, value] of Object.entries(forwardedHeaders))(0, external_policyCore_js_namespaceObject.writeHeader)(headers, header, value);
152
151
  return headers;
153
152
  };
154
153
  const configure = (options)=>{
@@ -157,6 +156,21 @@ const createRequestFactory = (environment)=>{
157
156
  if ('default' !== requestId && !setDomain && !hasExistingDomain) throw new external_policyCore_js_namespaceObject.ProducerDomainNotConfiguredError(requestId);
158
157
  let configuredRequest = request || environment.originFetch;
159
158
  if (interceptor && !request) configuredRequest = interceptor(environment.getFetch());
159
+ let resolvedDomain;
160
+ if (setDomain) {
161
+ resolvedDomain = setDomain({
162
+ target: environment.target,
163
+ requestId
164
+ });
165
+ if ('default' !== requestId && (0, external_policyCore_js_namespaceObject.isEmptyDomain)(resolvedDomain)) throw new external_policyCore_js_namespaceObject.ProducerDomainNotConfiguredError(requestId);
166
+ }
167
+ realAllowedHeaders.delete(requestId);
168
+ realResolveHeaders.delete(requestId);
169
+ realTransportResilience.delete(requestId);
170
+ realIdentityBinding.delete(requestId);
171
+ realOperationContract.delete(requestId);
172
+ realRequireEnvelope.delete(requestId);
173
+ realAllowCrossOriginEnvelope.delete(requestId);
160
174
  if (Array.isArray(allowedHeaders)) realAllowedHeaders.set(requestId, allowedHeaders);
161
175
  if (isServerTarget && 'function' == typeof resolveHeaders) realResolveHeaders.set(requestId, resolveHeaders);
162
176
  if (transport && 'object' == typeof transport) realTransportResilience.set(requestId, transport);
@@ -164,14 +178,7 @@ const createRequestFactory = (environment)=>{
164
178
  if (operationContract && 'object' == typeof operationContract) realOperationContract.set(requestId, operationContract);
165
179
  if ('boolean' == typeof requireEnvelope) realRequireEnvelope.set(requestId, requireEnvelope);
166
180
  if ('boolean' == typeof allowCrossOriginEnvelope || 'function' == typeof allowCrossOriginEnvelope) realAllowCrossOriginEnvelope.set(requestId, allowCrossOriginEnvelope);
167
- if (setDomain) {
168
- const resolvedDomain = setDomain({
169
- target: environment.target,
170
- requestId
171
- });
172
- if ('default' !== requestId && (0, external_policyCore_js_namespaceObject.isEmptyDomain)(resolvedDomain)) throw new external_policyCore_js_namespaceObject.ProducerDomainNotConfiguredError(requestId);
173
- if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
174
- }
181
+ if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
175
182
  realRequest.set(requestId, configuredRequest);
176
183
  };
177
184
  const createRequest = (...args)=>{
@@ -208,6 +215,7 @@ const createRequestFactory = (environment)=>{
208
215
  headers = {
209
216
  'Content-Type': 'application/json'
210
217
  };
218
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
211
219
  } else {
212
220
  const payload = 'object' == typeof senderArgs[senderArgs.length - 1] ? senderArgs[senderArgs.length - 1] : {};
213
221
  payload.params = payload.params || {};
@@ -282,7 +290,7 @@ const createRequestFactory = (environment)=>{
282
290
  const sender = (...args)=>{
283
291
  const fetcher = (0, external_policyCore_js_namespaceObject.resolveConfiguredRequest)(realRequest, requestId, environment.originFetch);
284
292
  const { body, headers: uploadHeaders, params } = (0, external_utiles_js_namespaceObject.getUploadPayload)(args);
285
- const headers = {
293
+ let headers = {
286
294
  ...uploadHeaders
287
295
  };
288
296
  const finalPath = getUploadPath ? getUploadPath(params) : path;
@@ -293,12 +301,21 @@ const createRequestFactory = (environment)=>{
293
301
  path: finalPath
294
302
  });
295
303
  const incomingHeaders = environment.readIncomingHeaders();
304
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
296
305
  attachEnvelopeHeaderIfRequired(headers, requestId, finalURL, incomingHeaders);
297
306
  attachSecuredOperationHeaders(headers, requestId, 'POST', path, operationContext);
298
- return fetcher(finalURL, {
307
+ return (0, external_transport_js_namespaceObject.executeWithResilience)({
308
+ requestId,
309
+ target: environment.target,
299
310
  method: 'POST',
300
- body,
301
- headers
311
+ url: finalURL,
312
+ init: {
313
+ method: 'POST',
314
+ body,
315
+ headers
316
+ },
317
+ fetcher: fetcher,
318
+ transport: realTransportResilience.get(requestId)
302
319
  });
303
320
  };
304
321
  return sender;
@@ -52,9 +52,12 @@ const createTimeoutError = (timeoutMs)=>{
52
52
  error.name = 'TimeoutError';
53
53
  return error;
54
54
  };
55
+ const unrefTimer = (timer)=>{
56
+ if ('object' == typeof timer && null !== timer && 'unref' in timer && 'function' == typeof timer.unref) timer.unref();
57
+ };
55
58
  const wait = (ms)=>new Promise((resolve)=>{
56
59
  const timer = setTimeout(()=>resolve(), ms);
57
- if ('function' == typeof timer.unref) timer.unref();
60
+ unrefTimer(timer);
58
61
  });
59
62
  const toStatusCode = (error)=>{
60
63
  if (!error || 'object' != typeof error) return;
@@ -121,7 +124,7 @@ const withTimeout = async (promise, timeoutMs, signalBuilder)=>{
121
124
  if (controller) controller.abort();
122
125
  rejectTimeout?.(createTimeoutError(timeoutMs));
123
126
  }, timeoutMs);
124
- if ('function' == typeof timer.unref) timer.unref();
127
+ unrefTimer(timer);
125
128
  try {
126
129
  const result = await Promise.race([
127
130
  promise,
@@ -149,9 +152,14 @@ const executeWithResilience = async ({ requestId, target, method, url, init, fet
149
152
  const canUseAbortController = "u" > typeof AbortController;
150
153
  let controller;
151
154
  if (timeoutMs && canUseAbortController) controller = new AbortController();
152
- const nextInit = controller && !init.signal ? {
155
+ const callerSignal = init.signal;
156
+ const requestSignal = controller ? callerSignal && !callerSignal.aborted ? AbortSignal.any([
157
+ callerSignal,
158
+ controller.signal
159
+ ]) : callerSignal || controller.signal : callerSignal;
160
+ const nextInit = requestSignal ? {
153
161
  ...init,
154
- signal: controller.signal
162
+ signal: requestSignal
155
163
  } : init;
156
164
  try {
157
165
  const { result } = await withTimeout(fetcher(url, nextInit), timeoutMs, ()=>controller);
@@ -32,7 +32,7 @@ const getUploadPayload = (args)=>{
32
32
  const files = payload.files;
33
33
  if (!files) throw new Error('no files');
34
34
  const formdata = new FormData();
35
- for (const [key, value] of Object.entries(files))if (value instanceof FileList) for(let i = 0; i < value.length; i++){
35
+ for (const [key, value] of Object.entries(files))if ("u" > typeof FileList && value instanceof FileList) for(let i = 0; i < value.length; i++){
36
36
  const file = value.item(i);
37
37
  if (file) formdata.append(key, file);
38
38
  }
@@ -49,8 +49,9 @@ const createRequestFactory = (environment)=>{
49
49
  const protectedIdentityHeaders = (identityBinding?.protectedHeaders || BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS).map((header)=>header.toLowerCase());
50
50
  const targetAllowedHeaders = realAllowedHeaders.get(requestId) || [];
51
51
  const forwardedHeaders = {};
52
- if (isServerTarget) {
53
- for (const key of targetAllowedHeaders)if (void 0 !== incomingHeaders[key]) forwardedHeaders[key] = incomingHeaders[key];
52
+ if (isServerTarget) for (const key of targetAllowedHeaders){
53
+ const incomingValue = readHeader(incomingHeaders, key);
54
+ if (void 0 !== incomingValue) writeHeader(forwardedHeaders, key, incomingValue);
54
55
  }
55
56
  if (identityBindingEnabled) {
56
57
  const derivedIdentityHeaders = {};
@@ -101,21 +102,19 @@ const createRequestFactory = (environment)=>{
101
102
  ...forwardedHeaders
102
103
  }
103
104
  });
104
- if (resolvedHeaders && 'object' == typeof resolvedHeaders) {
105
- for (const key of targetAllowedHeaders)if (void 0 !== resolvedHeaders[key]) {
105
+ if (resolvedHeaders && 'object' == typeof resolvedHeaders) for (const key of targetAllowedHeaders){
106
+ const resolvedValue = readHeader(resolvedHeaders, key);
107
+ if (void 0 !== resolvedValue) {
106
108
  if (identityBindingEnabled && protectedIdentityHeaders.includes(key.toLowerCase())) {
107
- writeHeader(forwardedHeaders, key.toLowerCase(), resolvedHeaders[key]);
109
+ writeHeader(forwardedHeaders, key.toLowerCase(), resolvedValue);
108
110
  continue;
109
111
  }
110
- forwardedHeaders[key] = resolvedHeaders[key];
112
+ writeHeader(forwardedHeaders, key, resolvedValue);
111
113
  }
112
114
  }
113
115
  }
114
116
  }
115
- if (isServerTarget) return {
116
- ...headers,
117
- ...forwardedHeaders
118
- };
117
+ if (isServerTarget) for (const [header, value] of Object.entries(forwardedHeaders))writeHeader(headers, header, value);
119
118
  return headers;
120
119
  };
121
120
  const configure = (options)=>{
@@ -124,6 +123,21 @@ const createRequestFactory = (environment)=>{
124
123
  if ('default' !== requestId && !setDomain && !hasExistingDomain) throw new ProducerDomainNotConfiguredError(requestId);
125
124
  let configuredRequest = request || environment.originFetch;
126
125
  if (interceptor && !request) configuredRequest = interceptor(environment.getFetch());
126
+ let resolvedDomain;
127
+ if (setDomain) {
128
+ resolvedDomain = setDomain({
129
+ target: environment.target,
130
+ requestId
131
+ });
132
+ if ('default' !== requestId && isEmptyDomain(resolvedDomain)) throw new ProducerDomainNotConfiguredError(requestId);
133
+ }
134
+ realAllowedHeaders.delete(requestId);
135
+ realResolveHeaders.delete(requestId);
136
+ realTransportResilience.delete(requestId);
137
+ realIdentityBinding.delete(requestId);
138
+ realOperationContract.delete(requestId);
139
+ realRequireEnvelope.delete(requestId);
140
+ realAllowCrossOriginEnvelope.delete(requestId);
127
141
  if (Array.isArray(allowedHeaders)) realAllowedHeaders.set(requestId, allowedHeaders);
128
142
  if (isServerTarget && 'function' == typeof resolveHeaders) realResolveHeaders.set(requestId, resolveHeaders);
129
143
  if (transport && 'object' == typeof transport) realTransportResilience.set(requestId, transport);
@@ -131,14 +145,7 @@ const createRequestFactory = (environment)=>{
131
145
  if (operationContract && 'object' == typeof operationContract) realOperationContract.set(requestId, operationContract);
132
146
  if ('boolean' == typeof requireEnvelope) realRequireEnvelope.set(requestId, requireEnvelope);
133
147
  if ('boolean' == typeof allowCrossOriginEnvelope || 'function' == typeof allowCrossOriginEnvelope) realAllowCrossOriginEnvelope.set(requestId, allowCrossOriginEnvelope);
134
- if (setDomain) {
135
- const resolvedDomain = setDomain({
136
- target: environment.target,
137
- requestId
138
- });
139
- if ('default' !== requestId && isEmptyDomain(resolvedDomain)) throw new ProducerDomainNotConfiguredError(requestId);
140
- if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
141
- }
148
+ if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
142
149
  realRequest.set(requestId, configuredRequest);
143
150
  };
144
151
  const createRequest = (...args)=>{
@@ -175,6 +182,7 @@ const createRequestFactory = (environment)=>{
175
182
  headers = {
176
183
  'Content-Type': 'application/json'
177
184
  };
185
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
178
186
  } else {
179
187
  const payload = 'object' == typeof senderArgs[senderArgs.length - 1] ? senderArgs[senderArgs.length - 1] : {};
180
188
  payload.params = payload.params || {};
@@ -249,7 +257,7 @@ const createRequestFactory = (environment)=>{
249
257
  const sender = (...args)=>{
250
258
  const fetcher = resolveConfiguredRequest(realRequest, requestId, environment.originFetch);
251
259
  const { body, headers: uploadHeaders, params } = getUploadPayload(args);
252
- const headers = {
260
+ let headers = {
253
261
  ...uploadHeaders
254
262
  };
255
263
  const finalPath = getUploadPath ? getUploadPath(params) : path;
@@ -260,12 +268,21 @@ const createRequestFactory = (environment)=>{
260
268
  path: finalPath
261
269
  });
262
270
  const incomingHeaders = environment.readIncomingHeaders();
271
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
263
272
  attachEnvelopeHeaderIfRequired(headers, requestId, finalURL, incomingHeaders);
264
273
  attachSecuredOperationHeaders(headers, requestId, 'POST', path, operationContext);
265
- return fetcher(finalURL, {
274
+ return executeWithResilience({
275
+ requestId,
276
+ target: environment.target,
266
277
  method: 'POST',
267
- body,
268
- headers
278
+ url: finalURL,
279
+ init: {
280
+ method: 'POST',
281
+ body,
282
+ headers
283
+ },
284
+ fetcher: fetcher,
285
+ transport: realTransportResilience.get(requestId)
269
286
  });
270
287
  };
271
288
  return sender;
@@ -23,9 +23,12 @@ const createTimeoutError = (timeoutMs)=>{
23
23
  error.name = 'TimeoutError';
24
24
  return error;
25
25
  };
26
+ const unrefTimer = (timer)=>{
27
+ if ('object' == typeof timer && null !== timer && 'unref' in timer && 'function' == typeof timer.unref) timer.unref();
28
+ };
26
29
  const wait = (ms)=>new Promise((resolve)=>{
27
30
  const timer = setTimeout(()=>resolve(), ms);
28
- if ('function' == typeof timer.unref) timer.unref();
31
+ unrefTimer(timer);
29
32
  });
30
33
  const toStatusCode = (error)=>{
31
34
  if (!error || 'object' != typeof error) return;
@@ -92,7 +95,7 @@ const withTimeout = async (promise, timeoutMs, signalBuilder)=>{
92
95
  if (controller) controller.abort();
93
96
  rejectTimeout?.(createTimeoutError(timeoutMs));
94
97
  }, timeoutMs);
95
- if ('function' == typeof timer.unref) timer.unref();
98
+ unrefTimer(timer);
96
99
  try {
97
100
  const result = await Promise.race([
98
101
  promise,
@@ -120,9 +123,14 @@ const executeWithResilience = async ({ requestId, target, method, url, init, fet
120
123
  const canUseAbortController = "u" > typeof AbortController;
121
124
  let controller;
122
125
  if (timeoutMs && canUseAbortController) controller = new AbortController();
123
- const nextInit = controller && !init.signal ? {
126
+ const callerSignal = init.signal;
127
+ const requestSignal = controller ? callerSignal && !callerSignal.aborted ? AbortSignal.any([
128
+ callerSignal,
129
+ controller.signal
130
+ ]) : callerSignal || controller.signal : callerSignal;
131
+ const nextInit = requestSignal ? {
124
132
  ...init,
125
- signal: controller.signal
133
+ signal: requestSignal
126
134
  } : init;
127
135
  try {
128
136
  const { result } = await withTimeout(fetcher(url, nextInit), timeoutMs, ()=>controller);
@@ -3,7 +3,7 @@ const getUploadPayload = (args)=>{
3
3
  const files = payload.files;
4
4
  if (!files) throw new Error('no files');
5
5
  const formdata = new FormData();
6
- for (const [key, value] of Object.entries(files))if (value instanceof FileList) for(let i = 0; i < value.length; i++){
6
+ for (const [key, value] of Object.entries(files))if ("u" > typeof FileList && value instanceof FileList) for(let i = 0; i < value.length; i++){
7
7
  const file = value.item(i);
8
8
  if (file) formdata.append(key, file);
9
9
  }
@@ -50,8 +50,9 @@ const createRequestFactory = (environment)=>{
50
50
  const protectedIdentityHeaders = (identityBinding?.protectedHeaders || BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS).map((header)=>header.toLowerCase());
51
51
  const targetAllowedHeaders = realAllowedHeaders.get(requestId) || [];
52
52
  const forwardedHeaders = {};
53
- if (isServerTarget) {
54
- for (const key of targetAllowedHeaders)if (void 0 !== incomingHeaders[key]) forwardedHeaders[key] = incomingHeaders[key];
53
+ if (isServerTarget) for (const key of targetAllowedHeaders){
54
+ const incomingValue = readHeader(incomingHeaders, key);
55
+ if (void 0 !== incomingValue) writeHeader(forwardedHeaders, key, incomingValue);
55
56
  }
56
57
  if (identityBindingEnabled) {
57
58
  const derivedIdentityHeaders = {};
@@ -102,21 +103,19 @@ const createRequestFactory = (environment)=>{
102
103
  ...forwardedHeaders
103
104
  }
104
105
  });
105
- if (resolvedHeaders && 'object' == typeof resolvedHeaders) {
106
- for (const key of targetAllowedHeaders)if (void 0 !== resolvedHeaders[key]) {
106
+ if (resolvedHeaders && 'object' == typeof resolvedHeaders) for (const key of targetAllowedHeaders){
107
+ const resolvedValue = readHeader(resolvedHeaders, key);
108
+ if (void 0 !== resolvedValue) {
107
109
  if (identityBindingEnabled && protectedIdentityHeaders.includes(key.toLowerCase())) {
108
- writeHeader(forwardedHeaders, key.toLowerCase(), resolvedHeaders[key]);
110
+ writeHeader(forwardedHeaders, key.toLowerCase(), resolvedValue);
109
111
  continue;
110
112
  }
111
- forwardedHeaders[key] = resolvedHeaders[key];
113
+ writeHeader(forwardedHeaders, key, resolvedValue);
112
114
  }
113
115
  }
114
116
  }
115
117
  }
116
- if (isServerTarget) return {
117
- ...headers,
118
- ...forwardedHeaders
119
- };
118
+ if (isServerTarget) for (const [header, value] of Object.entries(forwardedHeaders))writeHeader(headers, header, value);
120
119
  return headers;
121
120
  };
122
121
  const configure = (options)=>{
@@ -125,6 +124,21 @@ const createRequestFactory = (environment)=>{
125
124
  if ('default' !== requestId && !setDomain && !hasExistingDomain) throw new ProducerDomainNotConfiguredError(requestId);
126
125
  let configuredRequest = request || environment.originFetch;
127
126
  if (interceptor && !request) configuredRequest = interceptor(environment.getFetch());
127
+ let resolvedDomain;
128
+ if (setDomain) {
129
+ resolvedDomain = setDomain({
130
+ target: environment.target,
131
+ requestId
132
+ });
133
+ if ('default' !== requestId && isEmptyDomain(resolvedDomain)) throw new ProducerDomainNotConfiguredError(requestId);
134
+ }
135
+ realAllowedHeaders.delete(requestId);
136
+ realResolveHeaders.delete(requestId);
137
+ realTransportResilience.delete(requestId);
138
+ realIdentityBinding.delete(requestId);
139
+ realOperationContract.delete(requestId);
140
+ realRequireEnvelope.delete(requestId);
141
+ realAllowCrossOriginEnvelope.delete(requestId);
128
142
  if (Array.isArray(allowedHeaders)) realAllowedHeaders.set(requestId, allowedHeaders);
129
143
  if (isServerTarget && 'function' == typeof resolveHeaders) realResolveHeaders.set(requestId, resolveHeaders);
130
144
  if (transport && 'object' == typeof transport) realTransportResilience.set(requestId, transport);
@@ -132,14 +146,7 @@ const createRequestFactory = (environment)=>{
132
146
  if (operationContract && 'object' == typeof operationContract) realOperationContract.set(requestId, operationContract);
133
147
  if ('boolean' == typeof requireEnvelope) realRequireEnvelope.set(requestId, requireEnvelope);
134
148
  if ('boolean' == typeof allowCrossOriginEnvelope || 'function' == typeof allowCrossOriginEnvelope) realAllowCrossOriginEnvelope.set(requestId, allowCrossOriginEnvelope);
135
- if (setDomain) {
136
- const resolvedDomain = setDomain({
137
- target: environment.target,
138
- requestId
139
- });
140
- if ('default' !== requestId && isEmptyDomain(resolvedDomain)) throw new ProducerDomainNotConfiguredError(requestId);
141
- if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
142
- }
149
+ if ('string' == typeof resolvedDomain) domainMap.set(requestId, resolvedDomain);
143
150
  realRequest.set(requestId, configuredRequest);
144
151
  };
145
152
  const createRequest = (...args)=>{
@@ -176,6 +183,7 @@ const createRequestFactory = (environment)=>{
176
183
  headers = {
177
184
  'Content-Type': 'application/json'
178
185
  };
186
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
179
187
  } else {
180
188
  const payload = 'object' == typeof senderArgs[senderArgs.length - 1] ? senderArgs[senderArgs.length - 1] : {};
181
189
  payload.params = payload.params || {};
@@ -250,7 +258,7 @@ const createRequestFactory = (environment)=>{
250
258
  const sender = (...args)=>{
251
259
  const fetcher = resolveConfiguredRequest(realRequest, requestId, environment.originFetch);
252
260
  const { body, headers: uploadHeaders, params } = getUploadPayload(args);
253
- const headers = {
261
+ let headers = {
254
262
  ...uploadHeaders
255
263
  };
256
264
  const finalPath = getUploadPath ? getUploadPath(params) : path;
@@ -261,12 +269,21 @@ const createRequestFactory = (environment)=>{
261
269
  path: finalPath
262
270
  });
263
271
  const incomingHeaders = environment.readIncomingHeaders();
272
+ headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
264
273
  attachEnvelopeHeaderIfRequired(headers, requestId, finalURL, incomingHeaders);
265
274
  attachSecuredOperationHeaders(headers, requestId, 'POST', path, operationContext);
266
- return fetcher(finalURL, {
275
+ return executeWithResilience({
276
+ requestId,
277
+ target: environment.target,
267
278
  method: 'POST',
268
- body,
269
- headers
279
+ url: finalURL,
280
+ init: {
281
+ method: 'POST',
282
+ body,
283
+ headers
284
+ },
285
+ fetcher: fetcher,
286
+ transport: realTransportResilience.get(requestId)
270
287
  });
271
288
  };
272
289
  return sender;
@@ -24,9 +24,12 @@ const createTimeoutError = (timeoutMs)=>{
24
24
  error.name = 'TimeoutError';
25
25
  return error;
26
26
  };
27
+ const unrefTimer = (timer)=>{
28
+ if ('object' == typeof timer && null !== timer && 'unref' in timer && 'function' == typeof timer.unref) timer.unref();
29
+ };
27
30
  const wait = (ms)=>new Promise((resolve)=>{
28
31
  const timer = setTimeout(()=>resolve(), ms);
29
- if ('function' == typeof timer.unref) timer.unref();
32
+ unrefTimer(timer);
30
33
  });
31
34
  const toStatusCode = (error)=>{
32
35
  if (!error || 'object' != typeof error) return;
@@ -93,7 +96,7 @@ const withTimeout = async (promise, timeoutMs, signalBuilder)=>{
93
96
  if (controller) controller.abort();
94
97
  rejectTimeout?.(createTimeoutError(timeoutMs));
95
98
  }, timeoutMs);
96
- if ('function' == typeof timer.unref) timer.unref();
99
+ unrefTimer(timer);
97
100
  try {
98
101
  const result = await Promise.race([
99
102
  promise,
@@ -121,9 +124,14 @@ const executeWithResilience = async ({ requestId, target, method, url, init, fet
121
124
  const canUseAbortController = "u" > typeof AbortController;
122
125
  let controller;
123
126
  if (timeoutMs && canUseAbortController) controller = new AbortController();
124
- const nextInit = controller && !init.signal ? {
127
+ const callerSignal = init.signal;
128
+ const requestSignal = controller ? callerSignal && !callerSignal.aborted ? AbortSignal.any([
129
+ callerSignal,
130
+ controller.signal
131
+ ]) : callerSignal || controller.signal : callerSignal;
132
+ const nextInit = requestSignal ? {
125
133
  ...init,
126
- signal: controller.signal
134
+ signal: requestSignal
127
135
  } : init;
128
136
  try {
129
137
  const { result } = await withTimeout(fetcher(url, nextInit), timeoutMs, ()=>controller);
@@ -4,7 +4,7 @@ const getUploadPayload = (args)=>{
4
4
  const files = payload.files;
5
5
  if (!files) throw new Error('no files');
6
6
  const formdata = new FormData();
7
- for (const [key, value] of Object.entries(files))if (value instanceof FileList) for(let i = 0; i < value.length; i++){
7
+ for (const [key, value] of Object.entries(files))if ("u" > typeof FileList && value instanceof FileList) for(let i = 0; i < value.length; i++){
8
8
  const file = value.item(i);
9
9
  if (file) formdata.append(key, file);
10
10
  }
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.8.3-ultramodern.1",
20
+ "version": "3.8.3-ultramodern.3",
21
21
  "modern:source": "./src/node.ts",
22
22
  "types": "./dist/types/browser.d.ts",
23
23
  "main": "./dist/cjs/node.js",
@@ -28,17 +28,27 @@
28
28
  "exports": {
29
29
  ".": {
30
30
  "types": "./dist/types/browser.d.ts",
31
- "node": "./dist/esm/node.mjs",
31
+ "node": {
32
+ "import": "./dist/esm-node/node.mjs",
33
+ "require": "./dist/cjs/node.js"
34
+ },
35
+ "import": "./dist/esm/browser.mjs",
36
+ "require": "./dist/cjs/browser.js",
32
37
  "default": "./dist/esm/browser.mjs"
33
38
  },
34
39
  "./client": {
35
40
  "types": "./dist/types/browser.d.ts",
41
+ "import": "./dist/esm/browser.mjs",
42
+ "require": "./dist/cjs/browser.js",
36
43
  "default": "./dist/esm/browser.mjs"
37
44
  },
38
45
  "./server": {
39
46
  "types": "./dist/types/node.d.ts",
40
- "require": "./dist/cjs/node.js",
41
- "default": "./dist/esm/node.mjs"
47
+ "node": {
48
+ "import": "./dist/esm-node/node.mjs",
49
+ "require": "./dist/cjs/node.js"
50
+ },
51
+ "default": "./dist/cjs/node.js"
42
52
  }
43
53
  },
44
54
  "typesVersions": {
@@ -55,15 +65,15 @@
55
65
  }
56
66
  },
57
67
  "dependencies": {
58
- "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.8.3-ultramodern.1",
59
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.3-ultramodern.1",
68
+ "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.8.3-ultramodern.3",
69
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.3-ultramodern.3",
60
70
  "@swc/helpers": "^0.5.23",
61
71
  "encoding": "^0.1.13",
62
72
  "path-to-regexp": "^8.4.2",
63
73
  "qs": "^6.15.3"
64
74
  },
65
75
  "devDependencies": {
66
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.3-ultramodern.1",
76
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.3-ultramodern.3",
67
77
  "@rslib/core": "0.23.2",
68
78
  "@scripts/rstest-config": "2.66.0",
69
79
  "@types/node": "^26.2.0",
@@ -78,7 +88,7 @@
78
88
  },
79
89
  "scripts": {
80
90
  "dev": "rslib build --watch",
81
- "build": "rslib build && pnpm -w tsgo:dts \"$PWD\"",
91
+ "build": "rslib build",
82
92
  "test": "rstest --passWithNoTests"
83
93
  }
84
94
  }