@furo/open-models 1.16.3 → 1.17.0

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.
@@ -2,10 +2,11 @@
2
2
  * To set the API OPTIONS you should update this const, before you create new services
3
3
  */
4
4
  export const API_OPTIONS = {
5
- serverAddr: '',
6
- ApiBaseURL: '/api',
7
- headers: new Headers({ 'Content-Type': 'application/json' }),
5
+ serverAddr: "",
6
+ ApiBaseURL: "/api",
7
+ headers: new Headers({ "Content-Type": "application/json" }),
8
8
  // timeout: 3000
9
- PreserveProtoNames: false,
9
+ UseProtoNames: true, // server uses proto names
10
+ UseProtoNamesForQueryParams: true,
10
11
  };
11
12
  //# sourceMappingURL=API_OPTIONS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"API_OPTIONS.js","sourceRoot":"","sources":["../src/API_OPTIONS.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC5D,gBAAgB;IAChB,kBAAkB,EAAE,KAAK;CAC1B,CAAC","sourcesContent":["import type { IApiOptions } from './Fetcher';\n\n/**\n * To set the API OPTIONS you should update this const, before you create new services\n */\nexport const API_OPTIONS: IApiOptions = {\n serverAddr: '',\n ApiBaseURL: '/api',\n headers: new Headers({ 'Content-Type': 'application/json' }),\n // timeout: 3000\n PreserveProtoNames: false,\n};\n"]}
1
+ {"version":3,"file":"API_OPTIONS.js","sourceRoot":"","sources":["../src/API_OPTIONS.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC5D,gBAAgB;IAChB,aAAa,EAAE,IAAI,EAAE,0BAA0B;IAC/C,2BAA2B,EAAE,IAAI;CAClC,CAAC","sourcesContent":["import type { IApiOptions } from './Fetcher';\n\n/**\n * To set the API OPTIONS you should update this const, before you create new services\n */\nexport const API_OPTIONS: IApiOptions = {\n serverAddr: \"\",\n ApiBaseURL: \"/api\",\n headers: new Headers({ \"Content-Type\": \"application/json\" }),\n // timeout: 3000\n UseProtoNames: true, // server uses proto names\n UseProtoNamesForQueryParams: true,\n};\n"]}
package/dist/Fetcher.d.ts CHANGED
@@ -3,7 +3,8 @@ export interface IApiOptions {
3
3
  ApiBaseURL: string;
4
4
  headers?: Headers;
5
5
  timeout?: number;
6
- PreserveProtoNames: boolean;
6
+ UseProtoNames: boolean;
7
+ UseProtoNamesForQueryParams: boolean;
7
8
  }
8
9
  interface Handlers<REQ, RES> {
9
10
  /**
package/dist/Fetcher.js CHANGED
@@ -255,7 +255,7 @@ export class Fetcher {
255
255
  r.json()
256
256
  .then(json => {
257
257
  // convert to literal type when needed
258
- resolve(this.API_OPTIONS.PreserveProtoNames ? deepProtoNameToJsonName(json) : json);
258
+ resolve(this.API_OPTIONS.UseProtoNames ? deepProtoNameToJsonName(json) : json);
259
259
  })
260
260
  .catch((err) => {
261
261
  // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers
@@ -263,7 +263,7 @@ export class Fetcher {
263
263
  });
264
264
  });
265
265
  this.responseHandler.set("application/x-ndjson", r => {
266
- const preserveProtoNames = this.API_OPTIONS.PreserveProtoNames;
266
+ const preserveProtoNames = this.API_OPTIONS.UseProtoNames;
267
267
  const reader = r.body?.getReader();
268
268
  if (!reader) {
269
269
  throw new Error("NDJSON response has no readable body");
@@ -397,18 +397,18 @@ export class Fetcher {
397
397
  keysForBodyOrQueryParams.forEach(key => {
398
398
  if (Array.isArray(rqo[key])) {
399
399
  rqo[key].forEach(e => {
400
- params.push(`${this.API_OPTIONS.PreserveProtoNames ? jsonNameToProtoName(key) : key}=${String(e)}`);
400
+ params.push(`${this.API_OPTIONS.UseProtoNames ? jsonNameToProtoName(key) : key}=${String(e)}`);
401
401
  });
402
402
  }
403
403
  else {
404
- params.push(`${this.API_OPTIONS.PreserveProtoNames ? jsonNameToProtoName(key) : key}=${String(rqo[key])}`);
404
+ params.push(`${this.API_OPTIONS.UseProtoNames ? jsonNameToProtoName(key) : key}=${String(rqo[key])}`);
405
405
  }
406
406
  });
407
407
  if (params.length) {
408
408
  evaluatedPath = `${evaluatedPath}?${params.join("&")}`;
409
409
  }
410
410
  if (bodyField !== undefined) {
411
- evaluatedBody = JSON.stringify(this.API_OPTIONS.PreserveProtoNames ? deepJsonNameToProtoName(rqo[bodyField]) : rqo[bodyField]);
411
+ evaluatedBody = JSON.stringify(this.API_OPTIONS.UseProtoNames ? deepJsonNameToProtoName(rqo[bodyField]) : rqo[bodyField]);
412
412
  }
413
413
  }
414
414
  evaluatedPath = `${this.API_OPTIONS.serverAddr}${this.API_OPTIONS.ApiBaseURL}${evaluatedPath}`;
@@ -1 +1 @@
1
- {"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../src/Fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepJsonNameToProtoName, deepProtoNameToJsonName, jsonNameToProtoName, protoNameToJsonName } from \"./Mapper\";\n\nexport interface IApiOptions {\n // leave empty to connect to the same host which delivers your files, otherwise set something like http://localhost:3000\n serverAddr: string;\n ApiBaseURL: string;\n headers?: Headers;\n timeout?: number;\n PreserveProtoNames: boolean;\n}\n\ninterface Handlers<REQ, RES> {\n /**\n * The `onResponse` handler is triggered, when we have a successful response.\n * @param response\n * @param serverResponse\n */\n onResponse?: (response: RES, serverResponse: Response) => void;\n\n /**\n * The `onResponseError` handler is triggered on any received status >=400.\n * @param parsedResponse - The parsed response body from the server.\n * @param serverResponse\n */\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n\n /**\n * The `onRequestStarted` handler is triggered, whenever a request is started.\n * @param req - The request object\n */\n onRequestStarted?: (req: REQ) => void;\n\n /**\n * The `onRequestFinished` handler is triggered, whenever a request is finished or aborted.\n * @param req - The request object\n */\n onRequestFinished?: (req: REQ) => void;\n\n /**\n * The `onRequestAborted` handler is triggered, whenever a request is aborted.\n * An abort can be triggered by\n * - calling `abortPendingRequest`.\n * - triggering the request again, while you have a pending request.\n * - by reaching the request timeout.\n *\n * The timeout can be set in the OPEN_MODELS_OPTIONS, the default is 600s aka 5min.\n *\n * @param req\n */\n onRequestAborted?: (req: REQ) => void;\n\n /**\n * The `onResponseRaw` handler is triggered, when we have a successful response.\n *\n * @param serverResponse\n */\n onResponseRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onResponseErrorRaw` handler is triggered on any 400\n * @param serverResponse\n */\n onResponseErrorRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n /**\n * The `onParseError` handler is triggered, when the content of the error could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onFatalError` handler is triggered when nothing could be caught with the cather.\n * This should not happen.\n * @param error\n */\n onFatalError?: (error: unknown) => void;\n}\n\nexport class Fetcher<REQ, RES> {\n public timeout: number;\n\n /**\n * Contains the response from the last request. Also on errors.\n */\n public lastResponse: Response | undefined;\n\n /**\n * Indicator for a pending request. Maybe you are also interested on the `onRequestStarted` and `onRequestFinished` callback methods.\n */\n public isLoading = false;\n\n private path: string;\n\n private requestInit: RequestInit;\n\n private method: string;\n\n private responseHandler: Map<string, (r: Response) => void> = new Map<string, (r: Response) => void>();\n\n private abortController: AbortController;\n\n private timeoutId: ReturnType<typeof setTimeout> | number | undefined;\n\n private bodyField: keyof REQ | \"*\" | undefined;\n\n private API_OPTIONS: IApiOptions;\n\n /**\n *\n * @param options\n * @param method\n * @param path\n * @param bodyField\n */\n constructor(\n options: IApiOptions,\n // method\n method: string,\n // options path\n path: string,\n bodyField?: keyof REQ | \"*\"\n ) {\n this.API_OPTIONS = options;\n this.path = path;\n this.bodyField = bodyField;\n this.method = method;\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n redirect: \"follow\",\n };\n\n this.timeout = this.API_OPTIONS.timeout ?? 300000; // chrome default timeout\n }\n\n public setRequestOptions(ri: RequestInit) {\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n headers: this.API_OPTIONS.headers,\n signal,\n ...ri,\n };\n }\n\n /**\n * setHandlers let you bind all handlers at once.\n * @param handlers\n */\n public setHandlers(handlers: Handlers<REQ, RES>) {\n this.onResponse = handlers.onResponse;\n this.onResponseError = handlers.onResponseError;\n this.onRequestStarted = handlers.onRequestStarted;\n this.onRequestFinished = handlers.onRequestFinished;\n this.onRequestAborted = handlers.onRequestAborted;\n this.onResponseRaw = handlers.onResponseRaw;\n this.onResponseErrorRaw = handlers.onResponseErrorRaw;\n this.onResponseParseError = handlers.onResponseParseError;\n this.onResponseErrorParseError = handlers.onResponseErrorParseError;\n this.onFatalError = handlers.onFatalError;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public abortPendingRequest(reason: any): void {\n if (!this.isLoading) {\n return;\n }\n clearTimeout(this.timeoutId);\n this.isLoading = false;\n this.abortController.abort(reason);\n\n if (this.onRequestAborted) {\n this.onRequestAborted(reason as REQ);\n }\n }\n\n public invoke(rqo: REQ, options?: RequestInit): Promise<RES> {\n return new Promise((resolve, reject) => {\n // abort old request if it is still running\n if (this.isLoading) {\n this.abortPendingRequest(\"invoke triggered before response\");\n }\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n };\n\n if (options) {\n this.setRequestOptions(options);\n }\n\n this.isLoading = true;\n\n const { evaluatedPath, evaluatedBody } = this.buildPathAndBodyfield(this.path, this.bodyField, rqo);\n if (evaluatedBody) {\n this.requestInit.body = evaluatedBody;\n }\n\n clearTimeout(this.timeoutId);\n const request = new Request(evaluatedPath, this.requestInit);\n this.timeoutId = setTimeout(() => {\n this.abortController.abort(`Timeout of ${String(this.timeout)}ms reached`);\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n\n console.error(`RequestService fetch aborted: Timeout of ${String(this.timeout)}ms reached`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(rqo);\n }, this.timeout);\n\n if (this.onRequestStarted) {\n this.onRequestStarted(rqo);\n }\n\n fetch(request)\n .then(response => {\n this._reworkRequest(response)\n .then(data => {\n resolve(data);\n })\n .catch(reject);\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n })\n .catch((err: unknown) => {\n this.isLoading = false;\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n console.error(\"RequestService fetch aborted: \", err);\n } else {\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n if (this.onFatalError) {\n this.onFatalError(err);\n }\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n }\n\n /**\n * Succeeded is true if the request succeeded. The request succeeded if it\n * loaded without error, wasn't aborted, and the status code is ≥ 200, and\n * < 300, or if the status code is 0.\n */\n\n /**\n * Errorhandling according to Google rest-api-v3 Status Codes\n * (https://developers.google.com/maps-booking/reference/rest-api-v3/status_codes)\n *\n * Dispatches event `response-error` and a specific error event with status code\n * @private\n */\n _reworkRequest(response: Response): Promise<RES> {\n return new Promise((resolve, reject) => {\n /**\n * Status code 0 is accepted as a success because some schemes - e.g.,\n * file:// - don't provide status codes.\n */\n this.isLoading = false;\n clearTimeout(this.timeoutId);\n const status = response.status;\n\n if (status === 0 || (status >= 200 && status < 300)) {\n /**\n * Loaded without error, fires event `response` with full response object\n */\n this.lastResponse = response;\n\n if (this.onResponseRaw) {\n this.onResponseRaw(response);\n }\n\n /**\n * parses response object according to response heaader informationen `content-type`\n * you will find the supported content-types in the declaration area\n */\n\n this._parseResponse(response)\n .then(r => {\n resolve(r as RES);\n if (this.onResponse) {\n this.onResponse(r as RES, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseParseError) {\n this.onResponseParseError(error, response);\n }\n });\n } else {\n /**\n * Error detected\n */\n this.lastResponse = response;\n if (this.onResponseErrorRaw) {\n this.onResponseErrorRaw(response);\n }\n\n /**\n * parses response object according to response heaader `content-type`\n */\n this._parseResponse(response)\n .then(r => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(r);\n if (this.onResponseError) {\n this.onResponseError(r, response);\n }\n })\n /**\n * error parsing is not possible, empty response\n * the dispatched event will have the raw error object in the event detail\n */\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseErrorParseError) {\n this.onResponseErrorParseError(error, response);\n }\n });\n }\n });\n }\n\n /**\n * parses response object according to lastRequest header informationen `content-type`\n * you will find the supported content-types in the declaration area\n * response Fetch API response object [https://developer.mozilla.org/en-US/docs/Web/API/Response]\n * Default response handler is json!\n * @param response\n * @private\n */\n\n _parseResponse(response: Response) {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (response) {\n this.responseHandler.set(\"text/plain\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"text/html\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/json\", r => {\n r.json()\n .then(json => {\n // convert to literal type when needed\n resolve(this.API_OPTIONS.PreserveProtoNames ? deepProtoNameToJsonName(json) : json);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/x-ndjson\", r => {\n const preserveProtoNames = this.API_OPTIONS.PreserveProtoNames;\n\n const reader = r.body?.getReader();\n if (!reader) {\n throw new Error(\"NDJSON response has no readable body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n // Async generator that yields parsed NDJSON objects.\n const iterator = {\n async *[Symbol.asyncIterator](): AsyncGenerator<RES> {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop exits via break on done\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Split the buffer into lines. The last line may be incomplete.\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") {\n continue; // skip empty lines\n }\n\n // Parse the JSON line and yield the result.\n let parsed: RES;\n try {\n parsed = JSON.parse(trimmed) as RES;\n } catch {\n // If parsing fails, we can choose to throw, skip, or yield an error object.\n // Here we simply rethrow to fail fast.\n throw new Error(`Failed to parse NDJSON line: ${trimmed}`);\n }\n\n yield preserveProtoNames ? (deepProtoNameToJsonName(parsed) as RES) : parsed;\n }\n }\n\n // Emit any remaining data after the last chunk.\n if (buffer.trim() !== \"\") {\n try {\n yield JSON.parse(buffer.trim()) as RES;\n } catch {\n throw new Error(`Failed to parse final NDJSON line: ${buffer.trim()}`);\n }\n }\n },\n };\n\n // Return the async iterator that satisfies the Symbol.asyncIterator contract.\n // as unknown as AsyncIterable<RES>\n resolve(iterator);\n });\n\n this.responseHandler.set(\"application/octet-stream\", r => {\n r.arrayBuffer()\n .then(buffer => {\n resolve(buffer);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/pdf\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"image/jpeg\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n const contentType = response.headers.get(\"content-type\");\n let handler = contentType?.split(\";\")[0].trim();\n handler ??= \"application/json\";\n let typeHandler = this.responseHandler.get(handler);\n\n if (typeHandler === undefined) {\n console.error(\"No parser for\", handler);\n typeHandler = this.responseHandler.get(\"application/json\");\n }\n\n if (typeHandler) {\n typeHandler(response);\n }\n } else {\n reject(new Error(\"no response\"));\n }\n });\n }\n\n private buildPathAndBodyfield(\n path: string,\n bodyField: keyof REQ | \"*\" | undefined,\n rqo: REQ\n ): {\n evaluatedPath: string;\n evaluatedBody: string | undefined;\n } {\n // use the rules specified here https://docs.solo.io/gloo-edge/latest/reference/api/github.com/solo-io/solo-kit/api/external/google/api/http.proto.sk/\n // find all fields in path\n let evaluatedPath = path;\n let evaluatedBody;\n\n const keysForBodyOrQueryParams = new Map<string, keyof REQ>();\n Object.keys(rqo as object).forEach(key => {\n keysForBodyOrQueryParams.set(key, key as keyof REQ);\n });\n\n const fields = [...path.matchAll(/\\{([^}]+)}/g)];\n // replace url templates with values\n // /v1/cube/{id} => /v1/cube/12\n fields.forEach(field => {\n const rqoKey = protoNameToJsonName(field[1]) as keyof REQ;\n const rqoValue = rqo[rqoKey];\n evaluatedPath = evaluatedPath.replace(field[0], String(rqoValue));\n keysForBodyOrQueryParams.delete(rqoKey as string);\n });\n\n if (bodyField === \"*\") {\n // build body object\n const body: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n body[key as string] = rqo[key];\n });\n evaluatedBody = JSON.stringify(body);\n } else {\n // build query params\n const params: string[] = [];\n if (bodyField !== undefined) {\n keysForBodyOrQueryParams.delete(bodyField as string);\n }\n keysForBodyOrQueryParams.forEach(key => {\n if (Array.isArray(rqo[key])) {\n (rqo[key] as unknown[]).forEach(e => {\n params.push(`${this.API_OPTIONS.PreserveProtoNames ? jsonNameToProtoName(key as string) : (key as string)}=${String(e)}`);\n });\n } else {\n params.push(`${this.API_OPTIONS.PreserveProtoNames ? jsonNameToProtoName(key as string) : (key as string)}=${String(rqo[key])}`);\n }\n });\n if (params.length) {\n evaluatedPath = `${evaluatedPath}?${params.join(\"&\")}`;\n }\n\n if (bodyField !== undefined) {\n evaluatedBody = JSON.stringify(this.API_OPTIONS.PreserveProtoNames ? deepJsonNameToProtoName(rqo[bodyField]) : rqo[bodyField]);\n }\n }\n\n evaluatedPath = `${this.API_OPTIONS.serverAddr}${this.API_OPTIONS.ApiBaseURL}${evaluatedPath}`;\n\n return {\n evaluatedPath,\n evaluatedBody,\n };\n }\n\n /**\n * The `onResponse` handler is triggered, when we have a successful response.\n * @param response\n * @param serverResponse\n */\n onResponse?: (response: RES, serverResponse: Response) => void;\n\n /**\n * The `onResponseError` handler is triggered on any received status >=400.\n * @param parsedResponse - The parsed response body from the server.\n * @param serverResponse\n */\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n\n /**\n * The `onRequestStarted` handler is triggered, whenever a request is started.\n * @param req - The request object\n */\n onRequestStarted?: (req: REQ) => void;\n\n /**\n * The `onRequestFinished` handler is triggered, whenever a request is finished or aborted.\n * @param req - The request object\n */\n onRequestFinished?: (req: REQ) => void;\n\n /**\n * The `onRequestAborted` handler is triggered, whenever a request is aborted.\n * An abort can be triggered by\n * - calling `abortPendingRequest`.\n * - triggering the request again, while you have a pending request.\n * - by reaching the request timeout.\n *\n * The timeout can be set in the OPEN_MODELS_OPTIONS, the default is 600s aka 5min.\n *\n * @param req\n */\n onRequestAborted?: (req: REQ) => void;\n\n /**\n * The `onResponseRaw` handler is triggered, when we have a successful response.\n *\n * @param serverResponse\n */\n onResponseRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onResponseErrorRaw` handler is triggered on any 400\n * @param serverResponse\n */\n onResponseErrorRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content of the error could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onFatalError` handler is triggered when nothing could be caught with the cather.\n * This should not happen.\n * @param error\n */\n onFatalError?: (error: unknown) => void;\n}\n"]}
1
+ {"version":3,"file":"Fetcher.js","sourceRoot":"","sources":["../src/Fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepJsonNameToProtoName, deepProtoNameToJsonName, jsonNameToProtoName, protoNameToJsonName } from \"./Mapper\";\n\nexport interface IApiOptions {\n // leave empty to connect to the same host which delivers your files, otherwise set something like http://localhost:3000\n serverAddr: string;\n ApiBaseURL: string;\n headers?: Headers;\n timeout?: number;\n UseProtoNames: boolean; // server uses proto names on the transport layer\n UseProtoNamesForQueryParams: boolean;\n}\n\ninterface Handlers<REQ, RES> {\n /**\n * The `onResponse` handler is triggered, when we have a successful response.\n * @param response\n * @param serverResponse\n */\n onResponse?: (response: RES, serverResponse: Response) => void;\n\n /**\n * The `onResponseError` handler is triggered on any received status >=400.\n * @param parsedResponse - The parsed response body from the server.\n * @param serverResponse\n */\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n\n /**\n * The `onRequestStarted` handler is triggered, whenever a request is started.\n * @param req - The request object\n */\n onRequestStarted?: (req: REQ) => void;\n\n /**\n * The `onRequestFinished` handler is triggered, whenever a request is finished or aborted.\n * @param req - The request object\n */\n onRequestFinished?: (req: REQ) => void;\n\n /**\n * The `onRequestAborted` handler is triggered, whenever a request is aborted.\n * An abort can be triggered by\n * - calling `abortPendingRequest`.\n * - triggering the request again, while you have a pending request.\n * - by reaching the request timeout.\n *\n * The timeout can be set in the OPEN_MODELS_OPTIONS, the default is 600s aka 5min.\n *\n * @param req\n */\n onRequestAborted?: (req: REQ) => void;\n\n /**\n * The `onResponseRaw` handler is triggered, when we have a successful response.\n *\n * @param serverResponse\n */\n onResponseRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onResponseErrorRaw` handler is triggered on any 400\n * @param serverResponse\n */\n onResponseErrorRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n /**\n * The `onParseError` handler is triggered, when the content of the error could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onFatalError` handler is triggered when nothing could be caught with the cather.\n * This should not happen.\n * @param error\n */\n onFatalError?: (error: unknown) => void;\n}\n\nexport class Fetcher<REQ, RES> {\n public timeout: number;\n\n /**\n * Contains the response from the last request. Also on errors.\n */\n public lastResponse: Response | undefined;\n\n /**\n * Indicator for a pending request. Maybe you are also interested on the `onRequestStarted` and `onRequestFinished` callback methods.\n */\n public isLoading = false;\n\n private path: string;\n\n private requestInit: RequestInit;\n\n private method: string;\n\n private responseHandler: Map<string, (r: Response) => void> = new Map<string, (r: Response) => void>();\n\n private abortController: AbortController;\n\n private timeoutId: ReturnType<typeof setTimeout> | number | undefined;\n\n private bodyField: keyof REQ | \"*\" | undefined;\n\n private API_OPTIONS: IApiOptions;\n\n /**\n *\n * @param options\n * @param method\n * @param path\n * @param bodyField\n */\n constructor(\n options: IApiOptions,\n // method\n method: string,\n // options path\n path: string,\n bodyField?: keyof REQ | \"*\"\n ) {\n this.API_OPTIONS = options;\n this.path = path;\n this.bodyField = bodyField;\n this.method = method;\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n redirect: \"follow\",\n };\n\n this.timeout = this.API_OPTIONS.timeout ?? 300000; // chrome default timeout\n }\n\n public setRequestOptions(ri: RequestInit) {\n const { signal } = this.abortController;\n this.requestInit = {\n method: this.method,\n headers: this.API_OPTIONS.headers,\n signal,\n ...ri,\n };\n }\n\n /**\n * setHandlers let you bind all handlers at once.\n * @param handlers\n */\n public setHandlers(handlers: Handlers<REQ, RES>) {\n this.onResponse = handlers.onResponse;\n this.onResponseError = handlers.onResponseError;\n this.onRequestStarted = handlers.onRequestStarted;\n this.onRequestFinished = handlers.onRequestFinished;\n this.onRequestAborted = handlers.onRequestAborted;\n this.onResponseRaw = handlers.onResponseRaw;\n this.onResponseErrorRaw = handlers.onResponseErrorRaw;\n this.onResponseParseError = handlers.onResponseParseError;\n this.onResponseErrorParseError = handlers.onResponseErrorParseError;\n this.onFatalError = handlers.onFatalError;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public abortPendingRequest(reason: any): void {\n if (!this.isLoading) {\n return;\n }\n clearTimeout(this.timeoutId);\n this.isLoading = false;\n this.abortController.abort(reason);\n\n if (this.onRequestAborted) {\n this.onRequestAborted(reason as REQ);\n }\n }\n\n public invoke(rqo: REQ, options?: RequestInit): Promise<RES> {\n return new Promise((resolve, reject) => {\n // abort old request if it is still running\n if (this.isLoading) {\n this.abortPendingRequest(\"invoke triggered before response\");\n }\n\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n this.requestInit = {\n method: this.method,\n signal,\n headers: this.API_OPTIONS.headers,\n };\n\n if (options) {\n this.setRequestOptions(options);\n }\n\n this.isLoading = true;\n\n const { evaluatedPath, evaluatedBody } = this.buildPathAndBodyfield(this.path, this.bodyField, rqo);\n if (evaluatedBody) {\n this.requestInit.body = evaluatedBody;\n }\n\n clearTimeout(this.timeoutId);\n const request = new Request(evaluatedPath, this.requestInit);\n this.timeoutId = setTimeout(() => {\n this.abortController.abort(`Timeout of ${String(this.timeout)}ms reached`);\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n\n console.error(`RequestService fetch aborted: Timeout of ${String(this.timeout)}ms reached`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(rqo);\n }, this.timeout);\n\n if (this.onRequestStarted) {\n this.onRequestStarted(rqo);\n }\n\n fetch(request)\n .then(response => {\n this._reworkRequest(response)\n .then(data => {\n resolve(data);\n })\n .catch(reject);\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n })\n .catch((err: unknown) => {\n this.isLoading = false;\n\n if (err instanceof Error && err.name === \"AbortError\") {\n if (this.onRequestAborted) {\n this.onRequestAborted(rqo);\n }\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n console.error(\"RequestService fetch aborted: \", err);\n } else {\n if (this.onRequestFinished) {\n this.onRequestFinished(rqo);\n }\n\n if (this.onFatalError) {\n this.onFatalError(err);\n }\n }\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n }\n\n /**\n * Succeeded is true if the request succeeded. The request succeeded if it\n * loaded without error, wasn't aborted, and the status code is ≥ 200, and\n * < 300, or if the status code is 0.\n */\n\n /**\n * Errorhandling according to Google rest-api-v3 Status Codes\n * (https://developers.google.com/maps-booking/reference/rest-api-v3/status_codes)\n *\n * Dispatches event `response-error` and a specific error event with status code\n * @private\n */\n _reworkRequest(response: Response): Promise<RES> {\n return new Promise((resolve, reject) => {\n /**\n * Status code 0 is accepted as a success because some schemes - e.g.,\n * file:// - don't provide status codes.\n */\n this.isLoading = false;\n clearTimeout(this.timeoutId);\n const status = response.status;\n\n if (status === 0 || (status >= 200 && status < 300)) {\n /**\n * Loaded without error, fires event `response` with full response object\n */\n this.lastResponse = response;\n\n if (this.onResponseRaw) {\n this.onResponseRaw(response);\n }\n\n /**\n * parses response object according to response heaader informationen `content-type`\n * you will find the supported content-types in the declaration area\n */\n\n this._parseResponse(response)\n .then(r => {\n resolve(r as RES);\n if (this.onResponse) {\n this.onResponse(r as RES, response);\n }\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseParseError) {\n this.onResponseParseError(error, response);\n }\n });\n } else {\n /**\n * Error detected\n */\n this.lastResponse = response;\n if (this.onResponseErrorRaw) {\n this.onResponseErrorRaw(response);\n }\n\n /**\n * parses response object according to response heaader `content-type`\n */\n this._parseResponse(response)\n .then(r => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(r);\n if (this.onResponseError) {\n this.onResponseError(r, response);\n }\n })\n /**\n * error parsing is not possible, empty response\n * the dispatched event will have the raw error object in the event detail\n */\n .catch((error: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(error);\n if (this.onResponseErrorParseError) {\n this.onResponseErrorParseError(error, response);\n }\n });\n }\n });\n }\n\n /**\n * parses response object according to lastRequest header informationen `content-type`\n * you will find the supported content-types in the declaration area\n * response Fetch API response object [https://developer.mozilla.org/en-US/docs/Web/API/Response]\n * Default response handler is json!\n * @param response\n * @private\n */\n\n _parseResponse(response: Response) {\n return new Promise((resolve, reject) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- runtime data may not match types (REST API input)\n if (response) {\n this.responseHandler.set(\"text/plain\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"text/html\", r => {\n r.text()\n .then(text => {\n resolve(text);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/json\", r => {\n r.json()\n .then(json => {\n // convert to literal type when needed\n resolve(this.API_OPTIONS.UseProtoNames ? deepProtoNameToJsonName(json) : json);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n this.responseHandler.set(\"application/x-ndjson\", r => {\n const preserveProtoNames = this.API_OPTIONS.UseProtoNames;\n\n const reader = r.body?.getReader();\n if (!reader) {\n throw new Error(\"NDJSON response has no readable body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n // Async generator that yields parsed NDJSON objects.\n const iterator = {\n async *[Symbol.asyncIterator](): AsyncGenerator<RES> {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- loop exits via break on done\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Split the buffer into lines. The last line may be incomplete.\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === \"\") {\n continue; // skip empty lines\n }\n\n // Parse the JSON line and yield the result.\n let parsed: RES;\n try {\n parsed = JSON.parse(trimmed) as RES;\n } catch {\n // If parsing fails, we can choose to throw, skip, or yield an error object.\n // Here we simply rethrow to fail fast.\n throw new Error(`Failed to parse NDJSON line: ${trimmed}`);\n }\n\n yield preserveProtoNames ? (deepProtoNameToJsonName(parsed) as RES) : parsed;\n }\n }\n\n // Emit any remaining data after the last chunk.\n if (buffer.trim() !== \"\") {\n try {\n yield JSON.parse(buffer.trim()) as RES;\n } catch {\n throw new Error(`Failed to parse final NDJSON line: ${buffer.trim()}`);\n }\n }\n },\n };\n\n // Return the async iterator that satisfies the Symbol.asyncIterator contract.\n // as unknown as AsyncIterable<RES>\n resolve(iterator);\n });\n\n this.responseHandler.set(\"application/octet-stream\", r => {\n r.arrayBuffer()\n .then(buffer => {\n resolve(buffer);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"application/pdf\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n this.responseHandler.set(\"image/jpeg\", r => {\n r.blob()\n .then(blob => {\n resolve(blob);\n })\n .catch((err: unknown) => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors -- changing rejection types would break downstream error handlers\n reject(err);\n });\n });\n\n const contentType = response.headers.get(\"content-type\");\n let handler = contentType?.split(\";\")[0].trim();\n handler ??= \"application/json\";\n let typeHandler = this.responseHandler.get(handler);\n\n if (typeHandler === undefined) {\n console.error(\"No parser for\", handler);\n typeHandler = this.responseHandler.get(\"application/json\");\n }\n\n if (typeHandler) {\n typeHandler(response);\n }\n } else {\n reject(new Error(\"no response\"));\n }\n });\n }\n\n private buildPathAndBodyfield(\n path: string,\n bodyField: keyof REQ | \"*\" | undefined,\n rqo: REQ\n ): {\n evaluatedPath: string;\n evaluatedBody: string | undefined;\n } {\n // use the rules specified here https://docs.solo.io/gloo-edge/latest/reference/api/github.com/solo-io/solo-kit/api/external/google/api/http.proto.sk/\n // find all fields in path\n let evaluatedPath = path;\n let evaluatedBody;\n\n const keysForBodyOrQueryParams = new Map<string, keyof REQ>();\n Object.keys(rqo as object).forEach(key => {\n keysForBodyOrQueryParams.set(key, key as keyof REQ);\n });\n\n const fields = [...path.matchAll(/\\{([^}]+)}/g)];\n // replace url templates with values\n // /v1/cube/{id} => /v1/cube/12\n fields.forEach(field => {\n const rqoKey = protoNameToJsonName(field[1]) as keyof REQ;\n const rqoValue = rqo[rqoKey];\n evaluatedPath = evaluatedPath.replace(field[0], String(rqoValue));\n keysForBodyOrQueryParams.delete(rqoKey as string);\n });\n\n if (bodyField === \"*\") {\n // build body object\n const body: Record<string, unknown> = {};\n keysForBodyOrQueryParams.forEach(key => {\n body[key as string] = rqo[key];\n });\n evaluatedBody = JSON.stringify(body);\n } else {\n // build query params\n const params: string[] = [];\n if (bodyField !== undefined) {\n keysForBodyOrQueryParams.delete(bodyField as string);\n }\n keysForBodyOrQueryParams.forEach(key => {\n if (Array.isArray(rqo[key])) {\n (rqo[key] as unknown[]).forEach(e => {\n params.push(`${this.API_OPTIONS.UseProtoNames ? jsonNameToProtoName(key as string) : (key as string)}=${String(e)}`);\n });\n } else {\n params.push(`${this.API_OPTIONS.UseProtoNames ? jsonNameToProtoName(key as string) : (key as string)}=${String(rqo[key])}`);\n }\n });\n if (params.length) {\n evaluatedPath = `${evaluatedPath}?${params.join(\"&\")}`;\n }\n\n if (bodyField !== undefined) {\n evaluatedBody = JSON.stringify(this.API_OPTIONS.UseProtoNames ? deepJsonNameToProtoName(rqo[bodyField]) : rqo[bodyField]);\n }\n }\n\n evaluatedPath = `${this.API_OPTIONS.serverAddr}${this.API_OPTIONS.ApiBaseURL}${evaluatedPath}`;\n\n return {\n evaluatedPath,\n evaluatedBody,\n };\n }\n\n /**\n * The `onResponse` handler is triggered, when we have a successful response.\n * @param response\n * @param serverResponse\n */\n onResponse?: (response: RES, serverResponse: Response) => void;\n\n /**\n * The `onResponseError` handler is triggered on any received status >=400.\n * @param parsedResponse - The parsed response body from the server.\n * @param serverResponse\n */\n onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;\n\n /**\n * The `onRequestStarted` handler is triggered, whenever a request is started.\n * @param req - The request object\n */\n onRequestStarted?: (req: REQ) => void;\n\n /**\n * The `onRequestFinished` handler is triggered, whenever a request is finished or aborted.\n * @param req - The request object\n */\n onRequestFinished?: (req: REQ) => void;\n\n /**\n * The `onRequestAborted` handler is triggered, whenever a request is aborted.\n * An abort can be triggered by\n * - calling `abortPendingRequest`.\n * - triggering the request again, while you have a pending request.\n * - by reaching the request timeout.\n *\n * The timeout can be set in the OPEN_MODELS_OPTIONS, the default is 600s aka 5min.\n *\n * @param req\n */\n onRequestAborted?: (req: REQ) => void;\n\n /**\n * The `onResponseRaw` handler is triggered, when we have a successful response.\n *\n * @param serverResponse\n */\n onResponseRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onResponseErrorRaw` handler is triggered on any 400\n * @param serverResponse\n */\n onResponseErrorRaw?: (serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onParseError` handler is triggered, when the content of the error could not be parsed, according to the `content-type` header of the response.\n *\n * @param error\n * @param serverResponse\n */\n onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;\n\n /**\n * The `onFatalError` handler is triggered when nothing could be caught with the cather.\n * This should not happen.\n * @param error\n */\n onFatalError?: (error: unknown) => void;\n}\n"]}
@@ -0,0 +1,58 @@
1
+ import { FieldNode } from "./FieldNode.js";
2
+ export interface IApiOptions {
3
+ serverAddr: string;
4
+ ApiBaseURL: string;
5
+ headers?: Headers;
6
+ timeout?: number;
7
+ UseProtoNames: boolean;
8
+ UseProtoNamesForQueryParams: boolean;
9
+ }
10
+ interface Handlers<REQ, RES> {
11
+ onResponse?: (response: RES, serverResponse: Response) => void;
12
+ onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;
13
+ onRequestStarted?: (req: REQ) => void;
14
+ onRequestFinished?: (req: REQ) => void;
15
+ onRequestAborted?: (req: REQ) => void;
16
+ onResponseRaw?: (serverResponse: Response) => void;
17
+ onResponseErrorRaw?: (serverResponse: Response) => void;
18
+ onResponseParseError?: (error: unknown, serverResponse: Response) => void;
19
+ onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;
20
+ onFatalError?: (error: unknown) => void;
21
+ }
22
+ type FieldNodeConstructor = new (initData?: any, parent?: FieldNode, parentAttributeName?: string) => FieldNode;
23
+ export declare class StrictFetcher<REQ, RES> {
24
+ timeout: number;
25
+ lastResponse: Response | undefined;
26
+ isLoading: boolean;
27
+ private path;
28
+ private requestInit;
29
+ private method;
30
+ private responseHandler;
31
+ private abortController;
32
+ private timeoutId;
33
+ private bodyField;
34
+ private API_OPTIONS;
35
+ private ReqType;
36
+ private ResType;
37
+ private reqProtoNameMap;
38
+ private reqFieldConstructorMap;
39
+ constructor(options: IApiOptions, method: string, path: string, ReqType: FieldNodeConstructor, ResType: FieldNodeConstructor, bodyField?: keyof REQ | "*");
40
+ setRequestOptions(ri: RequestInit): void;
41
+ setHandlers(handlers: Handlers<REQ, RES>): void;
42
+ abortPendingRequest(reason: any): void;
43
+ invoke(rqo: REQ, options?: RequestInit): Promise<RES>;
44
+ _reworkRequest(response: Response): Promise<RES>;
45
+ _parseResponse(response: Response): Promise<unknown>;
46
+ private buildPathAndBodyfield;
47
+ onResponse?: (response: RES, serverResponse: Response) => void;
48
+ onResponseError?: (parsedResponse: unknown, serverResponse: Response) => void;
49
+ onRequestStarted?: (req: REQ) => void;
50
+ onRequestFinished?: (req: REQ) => void;
51
+ onRequestAborted?: (req: REQ) => void;
52
+ onResponseRaw?: (serverResponse: Response) => void;
53
+ onResponseErrorRaw?: (serverResponse: Response) => void;
54
+ onResponseParseError?: (error: unknown, serverResponse: Response) => void;
55
+ onResponseErrorParseError?: (error: unknown, serverResponse: Response) => void;
56
+ onFatalError?: (error: unknown) => void;
57
+ }
58
+ export {};