@conduit-client/service-fetch-network 3.7.0-dev2 → 3.7.0-dev3
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { RequestInterceptor } from './fetch';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for the compression interceptor.
|
|
4
|
+
*/
|
|
5
|
+
export interface CompressionInterceptorConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Compression algorithm. Currently only 'gzip' is supported.
|
|
8
|
+
*/
|
|
9
|
+
algorithm: 'gzip';
|
|
10
|
+
/**
|
|
11
|
+
* Minimum body size in bytes to trigger compression.
|
|
12
|
+
* Bodies smaller than this threshold are sent uncompressed.
|
|
13
|
+
* @default 1024
|
|
14
|
+
*/
|
|
15
|
+
threshold?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Builds a request interceptor that compresses string request bodies.
|
|
19
|
+
*
|
|
20
|
+
* The interceptor only compresses when all conditions are met:
|
|
21
|
+
* - The request has a body
|
|
22
|
+
* - The body is a string
|
|
23
|
+
* - The body size exceeds the configured threshold
|
|
24
|
+
* - The runtime supports CompressionStream
|
|
25
|
+
* - Content-Encoding is not already set
|
|
26
|
+
*
|
|
27
|
+
* If compression fails for any reason, the request is sent uncompressed.
|
|
28
|
+
*
|
|
29
|
+
* IMPORTANT: This interceptor should run LAST in the request interceptor chain,
|
|
30
|
+
* after any other interceptors that might modify the request body.
|
|
31
|
+
*
|
|
32
|
+
* @param config - Compression configuration
|
|
33
|
+
* @returns A request interceptor that compresses eligible request bodies
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildCompressionInterceptor(config: CompressionInterceptorConfig): RequestInterceptor;
|
package/dist/types/v1/index.d.ts
CHANGED
package/dist/v1/index.js
CHANGED
|
@@ -51,6 +51,52 @@ function buildServiceDescriptor(interceptors = {
|
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
let textEncoder;
|
|
55
|
+
function getTextEncoder() {
|
|
56
|
+
if (!textEncoder) {
|
|
57
|
+
if (typeof TextEncoder === "undefined") {
|
|
58
|
+
throw new Error(
|
|
59
|
+
"TextEncoder is not available in this environment. Request body compression requires TextEncoder support."
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
textEncoder = new TextEncoder();
|
|
63
|
+
}
|
|
64
|
+
return textEncoder;
|
|
65
|
+
}
|
|
66
|
+
function buildCompressionInterceptor(config) {
|
|
67
|
+
const threshold = config.threshold ?? 1024;
|
|
68
|
+
return async (args) => {
|
|
69
|
+
const [resource, options = {}] = args;
|
|
70
|
+
if (!options.body || typeof options.body !== "string") {
|
|
71
|
+
return resolvedPromiseLike(args);
|
|
72
|
+
}
|
|
73
|
+
if (typeof CompressionStream === "undefined") {
|
|
74
|
+
return resolvedPromiseLike(args);
|
|
75
|
+
}
|
|
76
|
+
const headers = new Headers(options.headers);
|
|
77
|
+
if (headers.has("Content-Encoding")) {
|
|
78
|
+
return resolvedPromiseLike(args);
|
|
79
|
+
}
|
|
80
|
+
const encodedBody = getTextEncoder().encode(options.body);
|
|
81
|
+
if (encodedBody.byteLength < threshold) {
|
|
82
|
+
return resolvedPromiseLike(args);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const stream = new Blob([encodedBody]).stream().pipeThrough(new CompressionStream(config.algorithm));
|
|
86
|
+
const compressedBody = await new Response(stream).blob();
|
|
87
|
+
headers.set("Content-Encoding", config.algorithm);
|
|
88
|
+
headers.delete("Content-Length");
|
|
89
|
+
const compressedOptions = {
|
|
90
|
+
...options,
|
|
91
|
+
body: compressedBody,
|
|
92
|
+
headers
|
|
93
|
+
};
|
|
94
|
+
return resolvedPromiseLike([resource, compressedOptions]);
|
|
95
|
+
} catch {
|
|
96
|
+
return resolvedPromiseLike(args);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
54
100
|
function setHeader(headerName, headerValue, [resource, options = {}], {
|
|
55
101
|
throwOnExisting = false,
|
|
56
102
|
errorMessage = `Unexpected ${headerName} header encountered`
|
|
@@ -174,6 +220,7 @@ function buildMockFetchService(initialResponses = []) {
|
|
|
174
220
|
};
|
|
175
221
|
}
|
|
176
222
|
export {
|
|
223
|
+
buildCompressionInterceptor,
|
|
177
224
|
buildJwtRequestHeaderInterceptor,
|
|
178
225
|
buildMockFetchService,
|
|
179
226
|
buildServiceDescriptor,
|
package/dist/v1/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/v1/fetch.ts","../../src/v1/utils.ts","../../src/v1/jwt-interceptor.ts","../../src/v1/mock-fetch.ts"],"sourcesContent":["import {\n resolvedPromiseLike,\n type NamedService,\n type ServiceDescriptor,\n} from '@conduit-client/utils';\nimport { RetryService } from '@conduit-client/service-retry/v1';\n\nexport type FetchParameters = Parameters<typeof fetch>;\nexport type FetchService = (...args: FetchParameters) => PromiseLike<Response>;\nexport type IFetchService = FetchService;\nexport type FetchServiceDescriptor = ServiceDescriptor<IFetchService, 'fetch', '1.0'>;\nexport type NamedFetchService<Name extends string = 'fetch'> = NamedService<Name, IFetchService>;\nexport type RequestInterceptor<Context = any> = (\n fetchArgs: FetchParameters,\n context?: Context\n) => PromiseLike<FetchParameters>;\nexport type RetryInterceptor<Context = any> = (\n fetchArgs: FetchParameters,\n retryService?: RetryService<Response>,\n context?: Context\n) => PromiseLike<Response>;\nexport type ResponseInterceptor<Context = any> = (\n response: Response,\n context?: Context\n) => PromiseLike<Response>;\nexport type FinallyInterceptor<Context = any> = (context?: Context) => PromiseLike<void> | void;\nexport type Interceptors<Context = any> = {\n createContext?: () => Context;\n request?: RequestInterceptor<Context>[];\n retry?: RetryInterceptor<Context>;\n response?: ResponseInterceptor<Context>[];\n finally?: FinallyInterceptor<Context>[];\n};\nexport function buildServiceDescriptor<Context = any>(\n interceptors: Interceptors<Context> = {\n request: [],\n retry: undefined,\n response: [],\n finally: [],\n },\n retryService?: RetryService<Response>\n): FetchServiceDescriptor {\n return {\n type: 'fetch',\n version: '1.0',\n service: function (...args: FetchParameters) {\n // Create context per request if factory is provided\n const context = interceptors.createContext?.();\n\n const {\n request: requestInterceptors = [],\n retry: retryInterceptor = undefined,\n response: responseInterceptors = [],\n finally: finallyInterceptors = [],\n } = interceptors;\n\n const pending = requestInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then((args) => interceptor(args, context)),\n resolvedPromiseLike(args)\n );\n\n return Promise.resolve(pending)\n .then((args) => {\n if (retryInterceptor) {\n return retryInterceptor(args, retryService, context);\n } else {\n // default retry logic\n if (retryService) {\n return retryService.applyRetry(() => fetch(...args));\n }\n return fetch(...args);\n }\n })\n .then((response) => {\n // Success path - run response interceptors\n return responseInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then((response) => interceptor(response, context)),\n resolvedPromiseLike(response)\n );\n })\n .finally(() => {\n // Always run finally interceptors for cleanup\n if (finallyInterceptors.length > 0) {\n // Run all finally interceptors sequentially\n return finallyInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then(() => interceptor(context)),\n Promise.resolve()\n );\n }\n });\n },\n };\n}\n","import { FetchParameters } from './fetch';\n\n/**\n * Generic utility function to set any header value in fetch parameters\n * @param headerName - The name of the header to set\n * @param headerValue - The value to set for the header\n * @param fetchParams - The fetch parameters [resource, options]\n * @param options - Additional options\n * @param options.throwOnExisting - If true, throws an error when the header already exists\n * @param options.errorMessage - Custom error message to use when header exists\n * @returns Modified fetch parameters with the header set\n */\nexport function setHeader<T extends string = string>(\n headerName: T,\n headerValue: string,\n [resource, options = {}]: FetchParameters,\n {\n throwOnExisting = false,\n errorMessage = `Unexpected ${headerName} header encountered`,\n }: {\n throwOnExisting?: boolean;\n errorMessage?: string;\n } = {}\n): FetchParameters {\n let hasHeaderBeenSet = false;\n\n // Handle Request instance with Headers\n if (resource instanceof Request && !options?.headers) {\n if (throwOnExisting && resource.headers.has(headerName)) {\n throw new Error(errorMessage);\n }\n resource.headers.set(headerName, headerValue);\n hasHeaderBeenSet = true;\n }\n\n // Handle options with Headers instance\n if (options?.headers instanceof Headers) {\n if (throwOnExisting && options.headers.has(headerName)) {\n throw new Error(errorMessage);\n }\n options.headers.set(headerName, headerValue);\n } else {\n // Handle options with plain object headers\n if (\n throwOnExisting &&\n options?.headers &&\n Reflect.has(options.headers as any, headerName)\n ) {\n throw new Error(errorMessage);\n }\n // Add the header if it hasn't been set on Request\n if (!hasHeaderBeenSet) {\n options.headers = {\n ...options?.headers,\n [headerName]: headerValue,\n };\n }\n }\n\n return [resource, options];\n}\n","import { resolvedPromiseLike } from '@conduit-client/utils';\nimport type { JwtManager, JwtToken } from '@conduit-client/jwt-manager';\nimport type { FetchParameters } from './fetch';\nimport { setHeader } from './utils';\n\nconst UNEXPECTED_AUTHORIZATION_HEADER_MESSAGE =\n 'Unexpected Authorization header encountered. To specify a custom Authorization header, use a Fetch service that is not configured with JwtRequestHeaderInterceptor';\n\n/**\n * Sets the Authorization header with a JWT token using the generic setHeader utility\n * @param token - The JWT token to set in the Authorization header\n * @param fetchParams - The fetch parameters [resource, options]\n * @returns Modified fetch parameters with the Authorization header set\n */\nexport function setHeaderAuthorization<T, E>(\n { token }: JwtToken<T, E>,\n fetchParams: FetchParameters\n): FetchParameters {\n const authorizationValue = `Bearer ${token}`;\n\n return setHeader('Authorization', authorizationValue, fetchParams, {\n throwOnExisting: true,\n errorMessage: UNEXPECTED_AUTHORIZATION_HEADER_MESSAGE,\n });\n}\n\nexport type JwtRequestModifier = (extraInfo: any, fetchArgs: FetchParameters) => FetchParameters;\n\nexport function buildJwtRequestHeaderInterceptor<ExtraInfo>(\n jwtManager: JwtManager<unknown, ExtraInfo>,\n jwtRequestModifier: JwtRequestModifier = (_e, fetchArgs) => fetchArgs\n) {\n return (args: FetchParameters) => {\n return resolvedPromiseLike(jwtManager.getJwt()).then((token) => {\n const fetchArgsWithRequestHeaderAuthorization = setHeaderAuthorization(token, args);\n return token.extraInfo\n ? jwtRequestModifier(token.extraInfo, fetchArgsWithRequestHeaderAuthorization)\n : fetchArgsWithRequestHeaderAuthorization;\n });\n };\n}\n","import { type FetchService } from './fetch';\nimport type { ServiceDescriptor } from '@conduit-client/utils';\n\n// AbortError class that matches the standard AbortError\nclass AbortError extends Error {\n name = 'AbortError';\n constructor(message = 'This operation was aborted') {\n super(message);\n }\n}\n\nexport type MockResponse = {\n status?: number;\n statusText?: string;\n ok?: boolean;\n body?: any;\n delay?: number; // Delay in milliseconds to simulate network latency\n};\n\nexport type MockFetchService = {\n readonly requests: Array<Parameters<FetchService>>;\n readonly availableResponses: number;\n queueResponses: (...newResponses: Array<any>) => void;\n reset: () => void;\n readonly responsesUsed: number;\n} & ((...args: any[]) => Promise<any>);\n\nexport function buildMockFetchService(\n initialResponses: Array<any> = []\n): ServiceDescriptor<MockFetchService, 'fetch', '1.0'> {\n let responses: Array<any> = [...initialResponses];\n\n const networkAdapter = (...args: any[]) => {\n // Capture the full fetch parameters for more realistic testing\n const [url, fetchOptions = {}] = args;\n\n networkAdapter.requests.push(args);\n\n // Immediate abort detection - check if signal is already aborted\n if (fetchOptions.signal?.aborted) {\n return Promise.reject(new AbortError());\n }\n\n const result = responses.shift();\n if (result === undefined) {\n throw new Error('No more mock responses queued');\n }\n networkAdapter.availableResponses = responses.length;\n networkAdapter.responsesUsed++;\n\n if (result instanceof Error) {\n return Promise.reject(result);\n }\n\n // Simulate request delay if specified\n const delay = (result as MockResponse).delay || 0;\n\n // Create a promise that handles both delay simulation and runtime abort\n return new Promise((resolve, reject) => {\n let abortHandler: (() => void) | null = null;\n\n // Set up abort listener for runtime abort detection\n if (fetchOptions.signal) {\n abortHandler = () => {\n reject(new AbortError());\n };\n fetchOptions.signal.addEventListener('abort', abortHandler);\n }\n\n const completeRequest = () => {\n // Clean up abort listener\n if (abortHandler && fetchOptions.signal) {\n fetchOptions.signal.removeEventListener('abort', abortHandler);\n }\n\n // Check one more time if aborted during delay\n if (fetchOptions.signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n // Return successful response\n resolve({\n ok: result.ok !== undefined ? result.ok : true,\n statusText: result.statusText !== undefined ? result.statusText : 'ok',\n status: result.status !== undefined ? result.status : 200,\n json: () => Promise.resolve(result.body),\n } as Response);\n };\n\n if (delay > 0) {\n setTimeout(completeRequest, delay);\n } else {\n // Always use async behavior to maintain existing test expectations\n // Even without delay, tests expect async behavior for wire adapters\n setTimeout(completeRequest, 0);\n }\n });\n };\n\n networkAdapter.requests = [] as Array<any>;\n networkAdapter.availableResponses = responses.length;\n\n networkAdapter.queueResponses = (newResponses: Array<any>) => {\n responses = responses.concat(newResponses);\n networkAdapter.availableResponses = responses.length;\n };\n\n networkAdapter.fetch = (args: any) => networkAdapter(args);\n\n networkAdapter.reset = () => {\n networkAdapter.requests = [];\n responses = [];\n networkAdapter.availableResponses = 0;\n networkAdapter.responsesUsed = 0;\n };\n\n networkAdapter.responsesUsed = 0;\n return {\n type: 'fetch',\n version: '1.0',\n service: networkAdapter as MockFetchService,\n };\n}\n"],"names":["args","response","_a"],"mappings":";;;;;;AAiCO,SAAS,uBACZ,eAAsC;AAAA,EAClC,SAAS,CAAA;AAAA,EACT,OAAO;AAAA,EACP,UAAU,CAAA;AAAA,EACV,SAAS,CAAA;AACb,GACA,cACsB;AACtB,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,YAAa,MAAuB;;AAEzC,YAAM,WAAU,kBAAa,kBAAb;AAEhB,YAAM;AAAA,QACF,SAAS,sBAAsB,CAAA;AAAA,QAC/B,OAAO,mBAAmB;AAAA,QAC1B,UAAU,uBAAuB,CAAA;AAAA,QACjC,SAAS,sBAAsB,CAAA;AAAA,MAAC,IAChC;AAEJ,YAAM,UAAU,oBAAoB;AAAA,QAChC,CAAC,iBAAiB,gBACd,gBAAgB,KAAK,CAACA,UAAS,YAAYA,OAAM,OAAO,CAAC;AAAA,QAC7D,oBAAoB,IAAI;AAAA,MAAA;AAG5B,aAAO,QAAQ,QAAQ,OAAO,EACzB,KAAK,CAACA,UAAS;AACZ,YAAI,kBAAkB;AAClB,iBAAO,iBAAiBA,OAAM,cAAc,OAAO;AAAA,QACvD,OAAO;AAEH,cAAI,cAAc;AACd,mBAAO,aAAa,WAAW,MAAM,MAAM,GAAGA,KAAI,CAAC;AAAA,UACvD;AACA,iBAAO,MAAM,GAAGA,KAAI;AAAA,QACxB;AAAA,MACJ,CAAC,EACA,KAAK,CAAC,aAAa;AAEhB,eAAO,qBAAqB;AAAA,UACxB,CAAC,iBAAiB,gBACd,gBAAgB,KAAK,CAACC,cAAa,YAAYA,WAAU,OAAO,CAAC;AAAA,UACrE,oBAAoB,QAAQ;AAAA,QAAA;AAAA,MAEpC,CAAC,EACA,QAAQ,MAAM;AAEX,YAAI,oBAAoB,SAAS,GAAG;AAEhC,iBAAO,oBAAoB;AAAA,YACvB,CAAC,iBAAiB,gBACd,gBAAgB,KAAK,MAAM,YAAY,OAAO,CAAC;AAAA,YACnD,QAAQ,QAAA;AAAA,UAAQ;AAAA,QAExB;AAAA,MACJ,CAAC;AAAA,IACT;AAAA,EAAA;AAER;ACnFO,SAAS,UACZ,YACA,aACA,CAAC,UAAU,UAAU,CAAA,CAAE,GACvB;AAAA,EACI,kBAAkB;AAAA,EAClB,eAAe,cAAc,UAAU;AAC3C,IAGI,IACW;AACf,MAAI,mBAAmB;AAGvB,MAAI,oBAAoB,WAAW,EAAC,mCAAS,UAAS;AAClD,QAAI,mBAAmB,SAAS,QAAQ,IAAI,UAAU,GAAG;AACrD,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AACA,aAAS,QAAQ,IAAI,YAAY,WAAW;AAC5C,uBAAmB;AAAA,EACvB;AAGA,OAAI,mCAAS,oBAAmB,SAAS;AACrC,QAAI,mBAAmB,QAAQ,QAAQ,IAAI,UAAU,GAAG;AACpD,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AACA,YAAQ,QAAQ,IAAI,YAAY,WAAW;AAAA,EAC/C,OAAO;AAEH,QACI,oBACA,mCAAS,YACT,QAAQ,IAAI,QAAQ,SAAgB,UAAU,GAChD;AACE,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAEA,QAAI,CAAC,kBAAkB;AACnB,cAAQ,UAAU;AAAA,QACd,GAAG,mCAAS;AAAA,QACZ,CAAC,UAAU,GAAG;AAAA,MAAA;AAAA,IAEtB;AAAA,EACJ;AAEA,SAAO,CAAC,UAAU,OAAO;AAC7B;ACvDA,MAAM,0CACF;AAQG,SAAS,uBACZ,EAAE,MAAA,GACF,aACe;AACf,QAAM,qBAAqB,UAAU,KAAK;AAE1C,SAAO,UAAU,iBAAiB,oBAAoB,aAAa;AAAA,IAC/D,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAAA,CACjB;AACL;AAIO,SAAS,iCACZ,YACA,qBAAyC,CAAC,IAAI,cAAc,WAC9D;AACE,SAAO,CAAC,SAA0B;AAC9B,WAAO,oBAAoB,WAAW,OAAA,CAAQ,EAAE,KAAK,CAAC,UAAU;AAC5D,YAAM,0CAA0C,uBAAuB,OAAO,IAAI;AAClF,aAAO,MAAM,YACP,mBAAmB,MAAM,WAAW,uCAAuC,IAC3E;AAAA,IACV,CAAC;AAAA,EACL;AACJ;ACpCA,MAAM,mBAAmB,MAAM;AAAA,EAE3B,YAAY,UAAU,8BAA8B;AAChD,UAAM,OAAO;AAFjB,SAAA,OAAO;AAAA,EAGP;AACJ;AAkBO,SAAS,sBACZ,mBAA+B,IACoB;AACnD,MAAI,YAAwB,CAAC,GAAG,gBAAgB;AAEhD,QAAM,iBAAiB,IAAI,SAAgB;;AAEvC,UAAM,CAAC,KAAK,eAAe,CAAA,CAAE,IAAI;AAEjC,mBAAe,SAAS,KAAK,IAAI;AAGjC,SAAI,kBAAa,WAAb,mBAAqB,SAAS;AAC9B,aAAO,QAAQ,OAAO,IAAI,YAAY;AAAA,IAC1C;AAEA,UAAM,SAAS,UAAU,MAAA;AACzB,QAAI,WAAW,QAAW;AACtB,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AACA,mBAAe,qBAAqB,UAAU;AAC9C,mBAAe;AAEf,QAAI,kBAAkB,OAAO;AACzB,aAAO,QAAQ,OAAO,MAAM;AAAA,IAChC;AAGA,UAAM,QAAS,OAAwB,SAAS;AAGhD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI,eAAoC;AAGxC,UAAI,aAAa,QAAQ;AACrB,uBAAe,MAAM;AACjB,iBAAO,IAAI,YAAY;AAAA,QAC3B;AACA,qBAAa,OAAO,iBAAiB,SAAS,YAAY;AAAA,MAC9D;AAEA,YAAM,kBAAkB,MAAM;;AAE1B,YAAI,gBAAgB,aAAa,QAAQ;AACrC,uBAAa,OAAO,oBAAoB,SAAS,YAAY;AAAA,QACjE;AAGA,aAAIC,MAAA,aAAa,WAAb,gBAAAA,IAAqB,SAAS;AAC9B,iBAAO,IAAI,YAAY;AACvB;AAAA,QACJ;AAGA,gBAAQ;AAAA,UACJ,IAAI,OAAO,OAAO,SAAY,OAAO,KAAK;AAAA,UAC1C,YAAY,OAAO,eAAe,SAAY,OAAO,aAAa;AAAA,UAClE,QAAQ,OAAO,WAAW,SAAY,OAAO,SAAS;AAAA,UACtD,MAAM,MAAM,QAAQ,QAAQ,OAAO,IAAI;AAAA,QAAA,CAC9B;AAAA,MACjB;AAEA,UAAI,QAAQ,GAAG;AACX,mBAAW,iBAAiB,KAAK;AAAA,MACrC,OAAO;AAGH,mBAAW,iBAAiB,CAAC;AAAA,MACjC;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,iBAAe,WAAW,CAAA;AAC1B,iBAAe,qBAAqB,UAAU;AAE9C,iBAAe,iBAAiB,CAAC,iBAA6B;AAC1D,gBAAY,UAAU,OAAO,YAAY;AACzC,mBAAe,qBAAqB,UAAU;AAAA,EAClD;AAEA,iBAAe,QAAQ,CAAC,SAAc,eAAe,IAAI;AAEzD,iBAAe,QAAQ,MAAM;AACzB,mBAAe,WAAW,CAAA;AAC1B,gBAAY,CAAA;AACZ,mBAAe,qBAAqB;AACpC,mBAAe,gBAAgB;AAAA,EACnC;AAEA,iBAAe,gBAAgB;AAC/B,SAAO;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEjB;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/v1/fetch.ts","../../src/v1/compression-interceptor.ts","../../src/v1/utils.ts","../../src/v1/jwt-interceptor.ts","../../src/v1/mock-fetch.ts"],"sourcesContent":["import {\n resolvedPromiseLike,\n type NamedService,\n type ServiceDescriptor,\n} from '@conduit-client/utils';\nimport { RetryService } from '@conduit-client/service-retry/v1';\n\nexport type FetchParameters = Parameters<typeof fetch>;\nexport type FetchService = (...args: FetchParameters) => PromiseLike<Response>;\nexport type IFetchService = FetchService;\nexport type FetchServiceDescriptor = ServiceDescriptor<IFetchService, 'fetch', '1.0'>;\nexport type NamedFetchService<Name extends string = 'fetch'> = NamedService<Name, IFetchService>;\nexport type RequestInterceptor<Context = any> = (\n fetchArgs: FetchParameters,\n context?: Context\n) => PromiseLike<FetchParameters>;\nexport type RetryInterceptor<Context = any> = (\n fetchArgs: FetchParameters,\n retryService?: RetryService<Response>,\n context?: Context\n) => PromiseLike<Response>;\nexport type ResponseInterceptor<Context = any> = (\n response: Response,\n context?: Context\n) => PromiseLike<Response>;\nexport type FinallyInterceptor<Context = any> = (context?: Context) => PromiseLike<void> | void;\nexport type Interceptors<Context = any> = {\n createContext?: () => Context;\n request?: RequestInterceptor<Context>[];\n retry?: RetryInterceptor<Context>;\n response?: ResponseInterceptor<Context>[];\n finally?: FinallyInterceptor<Context>[];\n};\nexport function buildServiceDescriptor<Context = any>(\n interceptors: Interceptors<Context> = {\n request: [],\n retry: undefined,\n response: [],\n finally: [],\n },\n retryService?: RetryService<Response>\n): FetchServiceDescriptor {\n return {\n type: 'fetch',\n version: '1.0',\n service: function (...args: FetchParameters) {\n // Create context per request if factory is provided\n const context = interceptors.createContext?.();\n\n const {\n request: requestInterceptors = [],\n retry: retryInterceptor = undefined,\n response: responseInterceptors = [],\n finally: finallyInterceptors = [],\n } = interceptors;\n\n const pending = requestInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then((args) => interceptor(args, context)),\n resolvedPromiseLike(args)\n );\n\n return Promise.resolve(pending)\n .then((args) => {\n if (retryInterceptor) {\n return retryInterceptor(args, retryService, context);\n } else {\n // default retry logic\n if (retryService) {\n return retryService.applyRetry(() => fetch(...args));\n }\n return fetch(...args);\n }\n })\n .then((response) => {\n // Success path - run response interceptors\n return responseInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then((response) => interceptor(response, context)),\n resolvedPromiseLike(response)\n );\n })\n .finally(() => {\n // Always run finally interceptors for cleanup\n if (finallyInterceptors.length > 0) {\n // Run all finally interceptors sequentially\n return finallyInterceptors.reduce(\n (previousPromise, interceptor) =>\n previousPromise.then(() => interceptor(context)),\n Promise.resolve()\n );\n }\n });\n },\n };\n}\n","import { resolvedPromiseLike } from '@conduit-client/utils';\nimport type { FetchParameters, RequestInterceptor } from './fetch';\n\nlet textEncoder: TextEncoder | undefined;\n\n/**\n * Lazily initializes and returns the TextEncoder instance.\n * This ensures the module can be imported even in environments without TextEncoder,\n * and only fails when compression is actually attempted.\n */\nfunction getTextEncoder(): TextEncoder {\n if (!textEncoder) {\n if (typeof TextEncoder === 'undefined') {\n throw new Error(\n 'TextEncoder is not available in this environment. ' +\n 'Request body compression requires TextEncoder support.'\n );\n }\n textEncoder = new TextEncoder();\n }\n return textEncoder;\n}\n\n/**\n * Configuration for the compression interceptor.\n */\nexport interface CompressionInterceptorConfig {\n /**\n * Compression algorithm. Currently only 'gzip' is supported.\n */\n algorithm: 'gzip';\n\n /**\n * Minimum body size in bytes to trigger compression.\n * Bodies smaller than this threshold are sent uncompressed.\n * @default 1024\n */\n threshold?: number;\n}\n\n/**\n * Builds a request interceptor that compresses string request bodies.\n *\n * The interceptor only compresses when all conditions are met:\n * - The request has a body\n * - The body is a string\n * - The body size exceeds the configured threshold\n * - The runtime supports CompressionStream\n * - Content-Encoding is not already set\n *\n * If compression fails for any reason, the request is sent uncompressed.\n *\n * IMPORTANT: This interceptor should run LAST in the request interceptor chain,\n * after any other interceptors that might modify the request body.\n *\n * @param config - Compression configuration\n * @returns A request interceptor that compresses eligible request bodies\n */\nexport function buildCompressionInterceptor(\n config: CompressionInterceptorConfig\n): RequestInterceptor {\n const threshold = config.threshold ?? 1024;\n\n return async (args: FetchParameters) => {\n const [resource, options = {}] = args;\n\n // Only compress string bodies\n if (!options.body || typeof options.body !== 'string') {\n return resolvedPromiseLike(args);\n }\n\n // Check if CompressionStream is available in this runtime\n if (typeof CompressionStream === 'undefined') {\n return resolvedPromiseLike(args);\n }\n\n // Normalize headers once — reuse for check and mutation\n const headers = new Headers(options.headers);\n\n // Skip if Content-Encoding is already set (don't double-encode)\n if (headers.has('Content-Encoding')) {\n return resolvedPromiseLike(args);\n }\n\n // Encode the body once and check threshold\n const encodedBody = getTextEncoder().encode(options.body);\n if (encodedBody.byteLength < threshold) {\n return resolvedPromiseLike(args);\n }\n\n try {\n // Compress the body using CompressionStream (reuse encoded bytes)\n const stream = new Blob([encodedBody])\n .stream()\n .pipeThrough(new CompressionStream(config.algorithm));\n\n const compressedBody = await new Response(stream).blob();\n\n // Set Content-Encoding and remove Content-Length (now invalid after compression)\n headers.set('Content-Encoding', config.algorithm);\n headers.delete('Content-Length');\n\n const compressedOptions: RequestInit = {\n ...options,\n body: compressedBody,\n headers,\n };\n\n return resolvedPromiseLike<FetchParameters>([resource, compressedOptions]);\n } catch {\n // If compression fails for any reason, fall back to uncompressed\n // This ensures requests are never broken by compression failures\n return resolvedPromiseLike(args);\n }\n };\n}\n","import { FetchParameters } from './fetch';\n\n/**\n * Generic utility function to set any header value in fetch parameters\n * @param headerName - The name of the header to set\n * @param headerValue - The value to set for the header\n * @param fetchParams - The fetch parameters [resource, options]\n * @param options - Additional options\n * @param options.throwOnExisting - If true, throws an error when the header already exists\n * @param options.errorMessage - Custom error message to use when header exists\n * @returns Modified fetch parameters with the header set\n */\nexport function setHeader<T extends string = string>(\n headerName: T,\n headerValue: string,\n [resource, options = {}]: FetchParameters,\n {\n throwOnExisting = false,\n errorMessage = `Unexpected ${headerName} header encountered`,\n }: {\n throwOnExisting?: boolean;\n errorMessage?: string;\n } = {}\n): FetchParameters {\n let hasHeaderBeenSet = false;\n\n // Handle Request instance with Headers\n if (resource instanceof Request && !options?.headers) {\n if (throwOnExisting && resource.headers.has(headerName)) {\n throw new Error(errorMessage);\n }\n resource.headers.set(headerName, headerValue);\n hasHeaderBeenSet = true;\n }\n\n // Handle options with Headers instance\n if (options?.headers instanceof Headers) {\n if (throwOnExisting && options.headers.has(headerName)) {\n throw new Error(errorMessage);\n }\n options.headers.set(headerName, headerValue);\n } else {\n // Handle options with plain object headers\n if (\n throwOnExisting &&\n options?.headers &&\n Reflect.has(options.headers as any, headerName)\n ) {\n throw new Error(errorMessage);\n }\n // Add the header if it hasn't been set on Request\n if (!hasHeaderBeenSet) {\n options.headers = {\n ...options?.headers,\n [headerName]: headerValue,\n };\n }\n }\n\n return [resource, options];\n}\n","import { resolvedPromiseLike } from '@conduit-client/utils';\nimport type { JwtManager, JwtToken } from '@conduit-client/jwt-manager';\nimport type { FetchParameters } from './fetch';\nimport { setHeader } from './utils';\n\nconst UNEXPECTED_AUTHORIZATION_HEADER_MESSAGE =\n 'Unexpected Authorization header encountered. To specify a custom Authorization header, use a Fetch service that is not configured with JwtRequestHeaderInterceptor';\n\n/**\n * Sets the Authorization header with a JWT token using the generic setHeader utility\n * @param token - The JWT token to set in the Authorization header\n * @param fetchParams - The fetch parameters [resource, options]\n * @returns Modified fetch parameters with the Authorization header set\n */\nexport function setHeaderAuthorization<T, E>(\n { token }: JwtToken<T, E>,\n fetchParams: FetchParameters\n): FetchParameters {\n const authorizationValue = `Bearer ${token}`;\n\n return setHeader('Authorization', authorizationValue, fetchParams, {\n throwOnExisting: true,\n errorMessage: UNEXPECTED_AUTHORIZATION_HEADER_MESSAGE,\n });\n}\n\nexport type JwtRequestModifier = (extraInfo: any, fetchArgs: FetchParameters) => FetchParameters;\n\nexport function buildJwtRequestHeaderInterceptor<ExtraInfo>(\n jwtManager: JwtManager<unknown, ExtraInfo>,\n jwtRequestModifier: JwtRequestModifier = (_e, fetchArgs) => fetchArgs\n) {\n return (args: FetchParameters) => {\n return resolvedPromiseLike(jwtManager.getJwt()).then((token) => {\n const fetchArgsWithRequestHeaderAuthorization = setHeaderAuthorization(token, args);\n return token.extraInfo\n ? jwtRequestModifier(token.extraInfo, fetchArgsWithRequestHeaderAuthorization)\n : fetchArgsWithRequestHeaderAuthorization;\n });\n };\n}\n","import { type FetchService } from './fetch';\nimport type { ServiceDescriptor } from '@conduit-client/utils';\n\n// AbortError class that matches the standard AbortError\nclass AbortError extends Error {\n name = 'AbortError';\n constructor(message = 'This operation was aborted') {\n super(message);\n }\n}\n\nexport type MockResponse = {\n status?: number;\n statusText?: string;\n ok?: boolean;\n body?: any;\n delay?: number; // Delay in milliseconds to simulate network latency\n};\n\nexport type MockFetchService = {\n readonly requests: Array<Parameters<FetchService>>;\n readonly availableResponses: number;\n queueResponses: (...newResponses: Array<any>) => void;\n reset: () => void;\n readonly responsesUsed: number;\n} & ((...args: any[]) => Promise<any>);\n\nexport function buildMockFetchService(\n initialResponses: Array<any> = []\n): ServiceDescriptor<MockFetchService, 'fetch', '1.0'> {\n let responses: Array<any> = [...initialResponses];\n\n const networkAdapter = (...args: any[]) => {\n // Capture the full fetch parameters for more realistic testing\n const [url, fetchOptions = {}] = args;\n\n networkAdapter.requests.push(args);\n\n // Immediate abort detection - check if signal is already aborted\n if (fetchOptions.signal?.aborted) {\n return Promise.reject(new AbortError());\n }\n\n const result = responses.shift();\n if (result === undefined) {\n throw new Error('No more mock responses queued');\n }\n networkAdapter.availableResponses = responses.length;\n networkAdapter.responsesUsed++;\n\n if (result instanceof Error) {\n return Promise.reject(result);\n }\n\n // Simulate request delay if specified\n const delay = (result as MockResponse).delay || 0;\n\n // Create a promise that handles both delay simulation and runtime abort\n return new Promise((resolve, reject) => {\n let abortHandler: (() => void) | null = null;\n\n // Set up abort listener for runtime abort detection\n if (fetchOptions.signal) {\n abortHandler = () => {\n reject(new AbortError());\n };\n fetchOptions.signal.addEventListener('abort', abortHandler);\n }\n\n const completeRequest = () => {\n // Clean up abort listener\n if (abortHandler && fetchOptions.signal) {\n fetchOptions.signal.removeEventListener('abort', abortHandler);\n }\n\n // Check one more time if aborted during delay\n if (fetchOptions.signal?.aborted) {\n reject(new AbortError());\n return;\n }\n\n // Return successful response\n resolve({\n ok: result.ok !== undefined ? result.ok : true,\n statusText: result.statusText !== undefined ? result.statusText : 'ok',\n status: result.status !== undefined ? result.status : 200,\n json: () => Promise.resolve(result.body),\n } as Response);\n };\n\n if (delay > 0) {\n setTimeout(completeRequest, delay);\n } else {\n // Always use async behavior to maintain existing test expectations\n // Even without delay, tests expect async behavior for wire adapters\n setTimeout(completeRequest, 0);\n }\n });\n };\n\n networkAdapter.requests = [] as Array<any>;\n networkAdapter.availableResponses = responses.length;\n\n networkAdapter.queueResponses = (newResponses: Array<any>) => {\n responses = responses.concat(newResponses);\n networkAdapter.availableResponses = responses.length;\n };\n\n networkAdapter.fetch = (args: any) => networkAdapter(args);\n\n networkAdapter.reset = () => {\n networkAdapter.requests = [];\n responses = [];\n networkAdapter.availableResponses = 0;\n networkAdapter.responsesUsed = 0;\n };\n\n networkAdapter.responsesUsed = 0;\n return {\n type: 'fetch',\n version: '1.0',\n service: networkAdapter as MockFetchService,\n };\n}\n"],"names":["args","response","_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@conduit-client/service-fetch-network",
|
|
3
|
-
"version": "3.7.0-
|
|
3
|
+
"version": "3.7.0-dev3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Luvio Network Service definition",
|
|
6
6
|
"type": "module",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"watch": "npm run build --watch"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@conduit-client/jwt-manager": "3.7.0-
|
|
35
|
-
"@conduit-client/service-retry": "3.7.0-
|
|
36
|
-
"@conduit-client/utils": "3.7.0-
|
|
34
|
+
"@conduit-client/jwt-manager": "3.7.0-dev3",
|
|
35
|
+
"@conduit-client/service-retry": "3.7.0-dev3",
|
|
36
|
+
"@conduit-client/utils": "3.7.0-dev3"
|
|
37
37
|
},
|
|
38
38
|
"volta": {
|
|
39
39
|
"extends": "../../../../package.json"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"size-limit": [
|
|
42
42
|
{
|
|
43
43
|
"path": "./dist/v1/index.js",
|
|
44
|
-
"limit": "1.
|
|
44
|
+
"limit": "1.99 kB"
|
|
45
45
|
}
|
|
46
46
|
]
|
|
47
47
|
}
|