@bleedingdev/modern-js-create-request 3.5.0-ultramodern.4 → 3.5.0-ultramodern.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/browser.js +32 -232
- package/dist/cjs/node.js +34 -266
- package/dist/cjs/policyCore.js +1 -4
- package/dist/cjs/requestFactory.js +316 -0
- package/dist/cjs/transport.js +12 -3
- package/dist/esm/browser.mjs +16 -208
- package/dist/esm/node.mjs +13 -237
- package/dist/esm/policyCore.mjs +2 -2
- package/dist/esm/requestFactory.mjs +277 -0
- package/dist/esm/transport.mjs +12 -3
- package/dist/esm-node/browser.mjs +16 -208
- package/dist/esm-node/node.mjs +13 -237
- package/dist/esm-node/policyCore.mjs +2 -2
- package/dist/esm-node/requestFactory.mjs +278 -0
- package/dist/esm-node/transport.mjs +12 -3
- package/dist/types/browser.d.ts +1 -4
- package/dist/types/node.d.ts +1 -5
- package/dist/types/policyCore.d.ts +2 -2
- package/dist/types/requestFactory.d.ts +28 -0
- package/dist/types/types.d.ts +1 -1
- package/package.json +8 -9
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { compile } from "path-to-regexp";
|
|
3
|
+
import { stringify } from "qs";
|
|
4
|
+
import { IdentityBindingViolationError, ProducerDomainNotConfiguredError, TRACEPARENT_HEADER, attachOperationContextHeaders, buildEnvelopeHeaderValue, deleteHeader, extractPathParamNames, firstHeaderValue, isEmptyDomain, isSecuredRequestId, parseTraceparentValue, readHeader, resolveConfiguredRequest, toOrigin, writeHeader } from "./policyCore.mjs";
|
|
5
|
+
import { executeWithResilience } from "./transport.mjs";
|
|
6
|
+
import { BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS, BFF_ENVELOPE_HEADER, BFF_OPERATION_CONTEXT_DETAIL_HEADER, BFF_OPERATION_CONTEXT_HEADER } from "./types.mjs";
|
|
7
|
+
import { getUploadPayload } from "./utiles.mjs";
|
|
8
|
+
const OPERATION_CONTEXT_DETAIL_HEADER = BFF_OPERATION_CONTEXT_DETAIL_HEADER;
|
|
9
|
+
const createRequestFactory = (environment)=>{
|
|
10
|
+
const isServerTarget = 'server' === environment.target;
|
|
11
|
+
const realRequest = new Map();
|
|
12
|
+
const realAllowedHeaders = new Map();
|
|
13
|
+
const realResolveHeaders = new Map();
|
|
14
|
+
const realRequireEnvelope = new Map();
|
|
15
|
+
const realAllowCrossOriginEnvelope = new Map();
|
|
16
|
+
const realTransportResilience = new Map();
|
|
17
|
+
const realIdentityBinding = new Map();
|
|
18
|
+
const realOperationContract = new Map();
|
|
19
|
+
const domainMap = new Map();
|
|
20
|
+
const attachEnvelopeHeaderIfRequired = (headers, requestId, url, incomingHeaders)=>{
|
|
21
|
+
const shouldRequireEnvelope = realRequireEnvelope.get(requestId) ?? isSecuredRequestId(requestId);
|
|
22
|
+
if (!shouldRequireEnvelope) return;
|
|
23
|
+
headers[BFF_ENVELOPE_HEADER] = buildEnvelopeHeaderValue({
|
|
24
|
+
requestId,
|
|
25
|
+
target: environment.target,
|
|
26
|
+
sourceOrigin: environment.resolveSourceOrigin(incomingHeaders),
|
|
27
|
+
targetOrigin: toOrigin(url),
|
|
28
|
+
traceContext: parseTraceparentValue(readHeader(headers, TRACEPARENT_HEADER)),
|
|
29
|
+
allowCrossOriginEnvelope: realAllowCrossOriginEnvelope.get(requestId)
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const attachSecuredOperationHeaders = (headers, requestId, method, path, operationContext)=>{
|
|
33
|
+
if (!isSecuredRequestId(requestId)) return;
|
|
34
|
+
attachOperationContextHeaders({
|
|
35
|
+
headers,
|
|
36
|
+
requestId,
|
|
37
|
+
target: environment.target,
|
|
38
|
+
method,
|
|
39
|
+
path,
|
|
40
|
+
operationContext,
|
|
41
|
+
operationContract: realOperationContract.get(requestId),
|
|
42
|
+
operationContextHeader: BFF_OPERATION_CONTEXT_HEADER,
|
|
43
|
+
operationContextDetailHeader: OPERATION_CONTEXT_DETAIL_HEADER
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const applyIdentityAndForwardedHeaders = (headers, requestId, incomingHeaders)=>{
|
|
47
|
+
const identityBinding = realIdentityBinding.get(requestId);
|
|
48
|
+
const identityBindingEnabled = identityBinding?.enabled ?? isSecuredRequestId(requestId);
|
|
49
|
+
const identityBindingStrict = identityBinding?.strict ?? isSecuredRequestId(requestId);
|
|
50
|
+
const protectedIdentityHeaders = (identityBinding?.protectedHeaders || BFF_DEFAULT_PROTECTED_IDENTITY_HEADERS).map((header)=>header.toLowerCase());
|
|
51
|
+
const targetAllowedHeaders = realAllowedHeaders.get(requestId) || [];
|
|
52
|
+
const forwardedHeaders = {};
|
|
53
|
+
if (isServerTarget) {
|
|
54
|
+
for (const key of targetAllowedHeaders)if (void 0 !== incomingHeaders[key]) forwardedHeaders[key] = incomingHeaders[key];
|
|
55
|
+
}
|
|
56
|
+
if (identityBindingEnabled) {
|
|
57
|
+
const derivedIdentityHeaders = {};
|
|
58
|
+
if (isServerTarget) for (const header of protectedIdentityHeaders){
|
|
59
|
+
const incomingHeaderValue = readHeader(incomingHeaders, header);
|
|
60
|
+
if (void 0 !== incomingHeaderValue) writeHeader(derivedIdentityHeaders, header, incomingHeaderValue);
|
|
61
|
+
}
|
|
62
|
+
const customDerivedHeaders = identityBinding?.deriveHeaders?.({
|
|
63
|
+
requestId,
|
|
64
|
+
target: environment.target,
|
|
65
|
+
incomingHeaders: isServerTarget ? {
|
|
66
|
+
...incomingHeaders
|
|
67
|
+
} : {},
|
|
68
|
+
protectedHeaders: [
|
|
69
|
+
...protectedIdentityHeaders
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
if (customDerivedHeaders && 'object' == typeof customDerivedHeaders) for (const header of protectedIdentityHeaders){
|
|
73
|
+
const customValue = readHeader(customDerivedHeaders, header);
|
|
74
|
+
if (void 0 !== customValue) writeHeader(derivedIdentityHeaders, header, customValue);
|
|
75
|
+
}
|
|
76
|
+
for (const header of protectedIdentityHeaders){
|
|
77
|
+
const attemptedValue = readHeader(headers, header);
|
|
78
|
+
if (void 0 === attemptedValue) continue;
|
|
79
|
+
const violation = {
|
|
80
|
+
requestId,
|
|
81
|
+
target: environment.target,
|
|
82
|
+
header,
|
|
83
|
+
attemptedValue,
|
|
84
|
+
derivedValue: readHeader(derivedIdentityHeaders, header),
|
|
85
|
+
reason: 'client_override_blocked'
|
|
86
|
+
};
|
|
87
|
+
identityBinding?.onViolation?.(violation);
|
|
88
|
+
if (identityBindingStrict) throw new IdentityBindingViolationError(violation);
|
|
89
|
+
deleteHeader(headers, header);
|
|
90
|
+
}
|
|
91
|
+
Object.keys(derivedIdentityHeaders).forEach((header)=>{
|
|
92
|
+
isServerTarget ? writeHeader(forwardedHeaders, header, derivedIdentityHeaders[header]) : writeHeader(headers, header, derivedIdentityHeaders[header]);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (isServerTarget) {
|
|
96
|
+
const resolveHeaders = realResolveHeaders.get(requestId);
|
|
97
|
+
if (resolveHeaders) {
|
|
98
|
+
const resolvedHeaders = resolveHeaders({
|
|
99
|
+
requestId,
|
|
100
|
+
allowedHeaders: targetAllowedHeaders,
|
|
101
|
+
incomingHeaders: {
|
|
102
|
+
...forwardedHeaders
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
if (resolvedHeaders && 'object' == typeof resolvedHeaders) {
|
|
106
|
+
for (const key of targetAllowedHeaders)if (void 0 !== resolvedHeaders[key]) {
|
|
107
|
+
if (identityBindingEnabled && protectedIdentityHeaders.includes(key.toLowerCase())) {
|
|
108
|
+
writeHeader(forwardedHeaders, key.toLowerCase(), resolvedHeaders[key]);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
forwardedHeaders[key] = resolvedHeaders[key];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (isServerTarget) return {
|
|
117
|
+
...headers,
|
|
118
|
+
...forwardedHeaders
|
|
119
|
+
};
|
|
120
|
+
return headers;
|
|
121
|
+
};
|
|
122
|
+
const configure = (options)=>{
|
|
123
|
+
const { request, interceptor, allowedHeaders, resolveHeaders, transport, requireEnvelope, allowCrossOriginEnvelope, identityBinding, operationContract, setDomain, requestId = 'default' } = options;
|
|
124
|
+
const hasExistingDomain = domainMap.has(requestId);
|
|
125
|
+
if ('default' !== requestId && !setDomain && !hasExistingDomain) throw new ProducerDomainNotConfiguredError(requestId);
|
|
126
|
+
let configuredRequest = request || environment.originFetch;
|
|
127
|
+
if (interceptor && !request) configuredRequest = interceptor(environment.getFetch());
|
|
128
|
+
if (Array.isArray(allowedHeaders)) realAllowedHeaders.set(requestId, allowedHeaders);
|
|
129
|
+
if (isServerTarget && 'function' == typeof resolveHeaders) realResolveHeaders.set(requestId, resolveHeaders);
|
|
130
|
+
if (transport && 'object' == typeof transport) realTransportResilience.set(requestId, transport);
|
|
131
|
+
if (identityBinding && 'object' == typeof identityBinding) realIdentityBinding.set(requestId, identityBinding);
|
|
132
|
+
if (operationContract && 'object' == typeof operationContract) realOperationContract.set(requestId, operationContract);
|
|
133
|
+
if ('boolean' == typeof requireEnvelope) realRequireEnvelope.set(requestId, requireEnvelope);
|
|
134
|
+
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
|
+
}
|
|
143
|
+
realRequest.set(requestId, configuredRequest);
|
|
144
|
+
};
|
|
145
|
+
const createRequest = (...args)=>{
|
|
146
|
+
const options = 'object' == typeof args[0] && null !== args[0] ? args[0] : {
|
|
147
|
+
path: args[0],
|
|
148
|
+
method: args[1],
|
|
149
|
+
port: args[2],
|
|
150
|
+
httpMethodDecider: args[3],
|
|
151
|
+
fetch: args[4],
|
|
152
|
+
requestId: args[5],
|
|
153
|
+
operationContext: args[6]
|
|
154
|
+
};
|
|
155
|
+
const { path, method, port, httpMethodDecider = 'functionName', fetch = environment.originFetch, requestId = 'default', operationContext } = options;
|
|
156
|
+
const getFinalPath = compile(path, {
|
|
157
|
+
encode: encodeURIComponent
|
|
158
|
+
});
|
|
159
|
+
const keyNames = extractPathParamNames(path);
|
|
160
|
+
const send = (...senderArgs)=>{
|
|
161
|
+
const fetcher = resolveConfiguredRequest(realRequest, requestId, fetch);
|
|
162
|
+
const incomingHeaders = environment.readIncomingHeaders();
|
|
163
|
+
let body;
|
|
164
|
+
let headers;
|
|
165
|
+
let url;
|
|
166
|
+
if ('inputParams' === httpMethodDecider) {
|
|
167
|
+
const configDomain = domainMap.get(requestId);
|
|
168
|
+
if ('default' !== requestId && isEmptyDomain(configDomain)) throw new ProducerDomainNotConfiguredError(requestId);
|
|
169
|
+
url = environment.resolveRequestUrl({
|
|
170
|
+
configDomain,
|
|
171
|
+
port,
|
|
172
|
+
path
|
|
173
|
+
});
|
|
174
|
+
body = environment.createInputParamsBody(senderArgs);
|
|
175
|
+
headers = {
|
|
176
|
+
'Content-Type': 'application/json'
|
|
177
|
+
};
|
|
178
|
+
} else {
|
|
179
|
+
const payload = 'object' == typeof senderArgs[senderArgs.length - 1] ? senderArgs[senderArgs.length - 1] : {};
|
|
180
|
+
payload.params = payload.params || {};
|
|
181
|
+
const requestParams = senderArgs[0];
|
|
182
|
+
if ('object' == typeof requestParams && requestParams.params) {
|
|
183
|
+
const { params } = requestParams;
|
|
184
|
+
keyNames.forEach((keyName)=>{
|
|
185
|
+
payload.params[keyName] = params[keyName];
|
|
186
|
+
});
|
|
187
|
+
} else keyNames.forEach((keyName, index)=>{
|
|
188
|
+
payload.params[keyName] = senderArgs[index];
|
|
189
|
+
});
|
|
190
|
+
const plainPath = getFinalPath(payload.params);
|
|
191
|
+
const finalPath = payload.query ? `${plainPath}?${stringify(payload.query)}` : plainPath;
|
|
192
|
+
headers = payload.headers ? {
|
|
193
|
+
...payload.headers
|
|
194
|
+
} : {};
|
|
195
|
+
headers = applyIdentityAndForwardedHeaders(headers, requestId, incomingHeaders);
|
|
196
|
+
if (payload.data) {
|
|
197
|
+
headers['Content-Type'] = 'application/json';
|
|
198
|
+
body = 'object' == typeof payload.data ? JSON.stringify(payload.data) : payload.body;
|
|
199
|
+
} else if (payload.body) {
|
|
200
|
+
headers['Content-Type'] = 'text/plain';
|
|
201
|
+
body = payload.body;
|
|
202
|
+
} else if (payload.formData) body = payload.formData;
|
|
203
|
+
else if (payload.formUrlencoded) {
|
|
204
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
205
|
+
body = !isServerTarget && "u" > typeof URLSearchParams && payload.formUrlencoded instanceof URLSearchParams ? payload.formUrlencoded : 'object' == typeof payload.formUrlencoded ? stringify(payload.formUrlencoded) : payload.formUrlencoded;
|
|
206
|
+
}
|
|
207
|
+
const configDomain = domainMap.get(requestId);
|
|
208
|
+
if ('default' !== requestId && isEmptyDomain(configDomain)) throw new ProducerDomainNotConfiguredError(requestId);
|
|
209
|
+
url = environment.resolveRequestUrl({
|
|
210
|
+
configDomain,
|
|
211
|
+
port,
|
|
212
|
+
path: finalPath
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
if (!isServerTarget) writeHeader(headers, 'accept', "application/json,*/*;q=0.8");
|
|
216
|
+
if (isServerTarget) {
|
|
217
|
+
if (void 0 === readHeader(headers, TRACEPARENT_HEADER)) {
|
|
218
|
+
const incomingTraceparent = firstHeaderValue(readHeader(incomingHeaders, TRACEPARENT_HEADER));
|
|
219
|
+
if ('string' == typeof incomingTraceparent) writeHeader(headers, TRACEPARENT_HEADER, incomingTraceparent);
|
|
220
|
+
}
|
|
221
|
+
if (void 0 === readHeader(headers, TRACEPARENT_HEADER) && operationContext?.traceparent) writeHeader(headers, TRACEPARENT_HEADER, operationContext.traceparent);
|
|
222
|
+
}
|
|
223
|
+
attachEnvelopeHeaderIfRequired(headers, requestId, url, incomingHeaders);
|
|
224
|
+
attachSecuredOperationHeaders(headers, requestId, method, path, operationContext);
|
|
225
|
+
if ('get' === method.toLowerCase()) body = void 0;
|
|
226
|
+
if (isServerTarget) writeHeader(headers, 'accept', "application/json,*/*;q=0.8");
|
|
227
|
+
return executeWithResilience({
|
|
228
|
+
requestId,
|
|
229
|
+
target: environment.target,
|
|
230
|
+
method,
|
|
231
|
+
url,
|
|
232
|
+
init: {
|
|
233
|
+
method,
|
|
234
|
+
body,
|
|
235
|
+
headers
|
|
236
|
+
},
|
|
237
|
+
fetcher: fetcher,
|
|
238
|
+
transport: realTransportResilience.get(requestId)
|
|
239
|
+
});
|
|
240
|
+
};
|
|
241
|
+
const sender = isServerTarget ? send : async (...senderArgs)=>send(...senderArgs);
|
|
242
|
+
return sender;
|
|
243
|
+
};
|
|
244
|
+
const createUploader = ({ path, domain, requestId = 'default', operationContext })=>{
|
|
245
|
+
const getUploadPath = isServerTarget ? void 0 : compile(path, {
|
|
246
|
+
encode: encodeURIComponent
|
|
247
|
+
});
|
|
248
|
+
const sender = (...args)=>{
|
|
249
|
+
const fetcher = resolveConfiguredRequest(realRequest, requestId, environment.originFetch);
|
|
250
|
+
const { body, headers: uploadHeaders, params } = getUploadPayload(args);
|
|
251
|
+
const headers = {
|
|
252
|
+
...uploadHeaders
|
|
253
|
+
};
|
|
254
|
+
const finalPath = getUploadPath ? getUploadPath(params) : path;
|
|
255
|
+
const configDomain = domainMap.get(requestId);
|
|
256
|
+
const finalURL = environment.resolveUploadUrl({
|
|
257
|
+
configDomain,
|
|
258
|
+
domain,
|
|
259
|
+
path: finalPath
|
|
260
|
+
});
|
|
261
|
+
const incomingHeaders = environment.readIncomingHeaders();
|
|
262
|
+
attachEnvelopeHeaderIfRequired(headers, requestId, finalURL, incomingHeaders);
|
|
263
|
+
attachSecuredOperationHeaders(headers, requestId, 'POST', path, operationContext);
|
|
264
|
+
return fetcher(finalURL, {
|
|
265
|
+
method: 'POST',
|
|
266
|
+
body,
|
|
267
|
+
headers
|
|
268
|
+
});
|
|
269
|
+
};
|
|
270
|
+
return sender;
|
|
271
|
+
};
|
|
272
|
+
return {
|
|
273
|
+
configure,
|
|
274
|
+
createRequest,
|
|
275
|
+
createUploader
|
|
276
|
+
};
|
|
277
|
+
};
|
|
278
|
+
export { createRequestFactory };
|
|
@@ -11,6 +11,14 @@ const DEFAULT_RETRYABLE_STATUS_CODES = [
|
|
|
11
11
|
const DEFAULT_BASE_DELAY_MS = 100;
|
|
12
12
|
const DEFAULT_MAX_DELAY_MS = 1000;
|
|
13
13
|
const DEFAULT_JITTER_RATIO = 0.1;
|
|
14
|
+
const DEFAULT_RETRYABLE_METHODS = new Set([
|
|
15
|
+
'DELETE',
|
|
16
|
+
'GET',
|
|
17
|
+
'HEAD',
|
|
18
|
+
'OPTIONS',
|
|
19
|
+
'PUT',
|
|
20
|
+
'TRACE'
|
|
21
|
+
]);
|
|
14
22
|
const createTimeoutError = (timeoutMs)=>{
|
|
15
23
|
const error = new Error(`Request timed out after ${timeoutMs}ms`);
|
|
16
24
|
error.name = 'TimeoutError';
|
|
@@ -30,7 +38,7 @@ const toStatusCode = (error)=>{
|
|
|
30
38
|
const isRetryableNetworkError = (error)=>{
|
|
31
39
|
if (!error || 'object' != typeof error) return false;
|
|
32
40
|
const name = error.name;
|
|
33
|
-
if ('
|
|
41
|
+
if ('FetchError' === name || 'TimeoutError' === name || 'TypeError' === name) return true;
|
|
34
42
|
const code = error.code;
|
|
35
43
|
return 'ECONNRESET' === code || 'ETIMEDOUT' === code || 'ECONNREFUSED' === code || 'EPIPE' === code;
|
|
36
44
|
};
|
|
@@ -40,7 +48,8 @@ const normalizeJitterRatio = (value)=>{
|
|
|
40
48
|
if ('number' != typeof value || !Number.isFinite(value)) return DEFAULT_JITTER_RATIO;
|
|
41
49
|
return Math.max(0, Math.min(1, value));
|
|
42
50
|
};
|
|
43
|
-
const shouldRetryWithDefaults = (statusCode, error, retryableStatusCodes)=>{
|
|
51
|
+
const shouldRetryWithDefaults = (method, statusCode, error, retryableStatusCodes)=>{
|
|
52
|
+
if (!DEFAULT_RETRYABLE_METHODS.has(method.toUpperCase())) return false;
|
|
44
53
|
if ('number' == typeof statusCode) return retryableStatusCodes.includes(statusCode);
|
|
45
54
|
return isRetryableNetworkError(error);
|
|
46
55
|
};
|
|
@@ -50,7 +59,7 @@ const shouldRetry = (retryOptions, context, retryableStatusCodes)=>{
|
|
|
50
59
|
} catch (error) {
|
|
51
60
|
return false;
|
|
52
61
|
}
|
|
53
|
-
return shouldRetryWithDefaults(context.statusCode, context.error, retryableStatusCodes);
|
|
62
|
+
return shouldRetryWithDefaults(context.method, context.statusCode, context.error, retryableStatusCodes);
|
|
54
63
|
};
|
|
55
64
|
const getBackoffMs = (retryOptions, attempt)=>{
|
|
56
65
|
const baseDelayMs = normalizePositiveNumber(retryOptions?.baseDelayMs, DEFAULT_BASE_DELAY_MS);
|
package/dist/types/browser.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import type { IOptions, RequestCreator, UploadCreator } from './types';
|
|
2
1
|
export { CrossOriginEnvelopePolicyError, IdentityBindingViolationError, OperationContractViolationError, ProducerClientNotInitializedError, ProducerDomainNotConfiguredError, } from './policyCore';
|
|
3
|
-
export declare const configure: (options: IOptions) => void;
|
|
4
|
-
export declare const createRequest: RequestCreator;
|
|
5
|
-
export declare const createUploader: UploadCreator;
|
|
2
|
+
export declare const configure: (options: import("./types").IOptions<typeof fetch>) => void, createRequest: import("./types").RequestCreator<typeof fetch>, createUploader: import("./types").UploadCreator;
|
|
6
3
|
export * from './requestContext';
|
|
7
4
|
export * from './traceparent';
|
|
8
5
|
export * from './types';
|
package/dist/types/node.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import type { IOptions, RequestCreator, UploadCreator } from './types';
|
|
2
1
|
export { CrossOriginEnvelopePolicyError, IdentityBindingViolationError, OperationContractViolationError, ProducerClientNotInitializedError, ProducerDomainNotConfiguredError, } from './policyCore';
|
|
3
|
-
|
|
4
|
-
export declare const configure: (options: IOptions<Fetch>) => void;
|
|
5
|
-
export declare const createRequest: RequestCreator<Fetch>;
|
|
6
|
-
export declare const createUploader: UploadCreator;
|
|
2
|
+
export declare const configure: (options: import("./types").IOptions<typeof fetch>) => void, createRequest: import("./types").RequestCreator<typeof fetch>, createUploader: import("./types").UploadCreator;
|
|
7
3
|
export * from './requestContext';
|
|
8
4
|
export * from './traceparent';
|
|
9
5
|
export * from './types';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { IdentityBindingViolation, OperationContext, OperationContractOptions, OperationContractViolation, TransportTarget } from './types';
|
|
2
2
|
export declare const TRACEPARENT_HEADER = "traceparent";
|
|
3
|
-
export declare const isStrictDefaultRequestIdEnabled: () => boolean;
|
|
4
3
|
export declare const isSecuredRequestId: (requestId: string) => boolean;
|
|
5
4
|
export declare const isEmptyDomain: (domain?: string) => boolean;
|
|
6
5
|
export declare const firstHeaderValue: (value: unknown) => any;
|
|
@@ -28,7 +27,7 @@ export declare const buildOperationContext: ({ requestId, method, path, operatio
|
|
|
28
27
|
traceId?: string | undefined;
|
|
29
28
|
spanId?: string | undefined;
|
|
30
29
|
};
|
|
31
|
-
|
|
30
|
+
type OperationContextPayload = ReturnType<typeof buildOperationContext>;
|
|
32
31
|
export declare class ProducerClientNotInitializedError extends Error {
|
|
33
32
|
readonly code = "BFF_PRODUCER_CLIENT_NOT_INITIALIZED";
|
|
34
33
|
constructor(requestId: string);
|
|
@@ -106,3 +105,4 @@ export declare const attachOperationContextHeaders: ({ headers, requestId, targe
|
|
|
106
105
|
traceId?: string | undefined;
|
|
107
106
|
spanId?: string | undefined;
|
|
108
107
|
};
|
|
108
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { IOptions, RequestCreator, TransportTarget, UploadCreator } from './types';
|
|
2
|
+
type HeaderMap = Record<string, any>;
|
|
3
|
+
type RequestUrlOptions = {
|
|
4
|
+
configDomain: string | undefined;
|
|
5
|
+
path: string;
|
|
6
|
+
port: number;
|
|
7
|
+
};
|
|
8
|
+
type UploadUrlOptions = {
|
|
9
|
+
configDomain: string | undefined;
|
|
10
|
+
domain: string | undefined;
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
type RequestFactoryEnvironment<F> = {
|
|
14
|
+
target: TransportTarget;
|
|
15
|
+
getFetch: () => F;
|
|
16
|
+
originFetch: F;
|
|
17
|
+
readIncomingHeaders: () => HeaderMap;
|
|
18
|
+
resolveSourceOrigin: (incomingHeaders: HeaderMap) => string | undefined;
|
|
19
|
+
createInputParamsBody: (args: any[]) => any;
|
|
20
|
+
resolveRequestUrl: (options: RequestUrlOptions) => string;
|
|
21
|
+
resolveUploadUrl: (options: UploadUrlOptions) => string;
|
|
22
|
+
};
|
|
23
|
+
export declare const createRequestFactory: <F>(environment: RequestFactoryEnvironment<F>) => {
|
|
24
|
+
configure: (options: IOptions<F>) => void;
|
|
25
|
+
createRequest: RequestCreator<F>;
|
|
26
|
+
createUploader: UploadCreator;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { HttpMethodDecider } from '@modern-js/types';
|
|
2
1
|
export declare const BFF_ENVELOPE_HEADER = "x-modernjs-bff-envelope";
|
|
3
2
|
export declare const BFF_OPERATION_CONTEXT_HEADER = "x-operation-id";
|
|
4
3
|
export declare const BFF_OPERATION_CONTEXT_DETAIL_HEADER = "x-modernjs-bff-operation-context";
|
|
@@ -17,6 +16,7 @@ export type BFFRequestPayload = {
|
|
|
17
16
|
export type Sender<F = typeof fetch> = ((...args: any[]) => Promise<any>) & {
|
|
18
17
|
fetch?: F;
|
|
19
18
|
};
|
|
19
|
+
export type HttpMethodDecider = 'functionName' | 'inputParams';
|
|
20
20
|
export type ResolveHeadersOptions = {
|
|
21
21
|
requestId: string;
|
|
22
22
|
allowedHeaders: string[];
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.5.0-ultramodern.
|
|
20
|
+
"version": "3.5.0-ultramodern.41",
|
|
21
21
|
"modern:source": "./src/node.ts",
|
|
22
22
|
"types": "./dist/types/browser.d.ts",
|
|
23
23
|
"main": "./dist/cjs/node.js",
|
|
@@ -62,18 +62,17 @@
|
|
|
62
62
|
"encoding": "^0.1.13",
|
|
63
63
|
"path-to-regexp": "^8.4.2",
|
|
64
64
|
"qs": "^6.15.3",
|
|
65
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.
|
|
66
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.
|
|
65
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.41",
|
|
66
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.41"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@rslib/core": "0.23.
|
|
70
|
-
"@types/node": "^26.
|
|
69
|
+
"@rslib/core": "0.23.2",
|
|
70
|
+
"@types/node": "^26.1.1",
|
|
71
71
|
"@types/qs": "^6.15.1",
|
|
72
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
73
|
-
"happy-dom": "^20.10.6",
|
|
72
|
+
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
74
73
|
"nock": "^14.0.16",
|
|
75
|
-
"typescript": "^
|
|
76
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.
|
|
74
|
+
"typescript": "^7.0.2",
|
|
75
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.41",
|
|
77
76
|
"@scripts/rstest-config": "2.66.0"
|
|
78
77
|
},
|
|
79
78
|
"sideEffects": false,
|