@shware/http 1.2.8 → 1.2.10

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hono/handler.ts"],"sourcesContent":["import { DetailType, Details } from '../error/detail';\nimport { Status, StatusError } from '../error/status';\nimport type { AxiosError } from 'axios';\nimport type { Context } from 'hono';\nimport type { RequestIdVariables } from 'hono/request-id';\nimport type { Bindings, HTTPResponseError } from 'hono/types';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\n\nexport type Env = {\n Variables: RequestIdVariables;\n Bindings?: Bindings;\n};\n\nexport function isAxiosError(payload: unknown): payload is AxiosError {\n return (\n payload !== null &&\n typeof payload === 'object' &&\n 'isAxiosError' in payload &&\n payload.isAxiosError === true\n );\n}\n\nexport function errorHandler<E extends Env = never>(\n error: Error | HTTPResponseError,\n c: Context<E>\n): Response | Promise<Response> {\n const requestId = c.get('requestId');\n const servingData = `${c.req.method}: ${c.req.path}`;\n const details = Details.new().requestInfo({ requestId, servingData });\n\n if (error instanceof StatusError) {\n error.body?.error?.details?.push(...details.list);\n const badRequest = error.body?.error?.details.find((d) => d.type === DetailType.BAD_REQUEST);\n if (badRequest) console.warn(servingData, badRequest);\n return c.json(error.body, error.status as ContentfulStatusCode);\n }\n\n if (error instanceof SyntaxError) {\n if (/^Cannot convert .* to a BigInt$/.test(error.message)) {\n return Status.invalidArgument(`Invalid number. ${error.message}`).response(details);\n }\n }\n\n if (isAxiosError(error)) {\n console.error({\n status: error.status,\n message: error.message,\n request: {\n method: error.config?.method,\n url: error.config?.url,\n data: error.config?.data,\n },\n response: { data: error.response?.data },\n });\n return Status.internal('Axios error').response(details);\n }\n\n console.error(`Unknown error: ${servingData}`, error);\n return Status.internal('Unknown error').response(details);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AACpC,oBAAoC;AAY7B,SAAS,aAAa,SAAyC;AACpE,SACE,YAAY,QACZ,OAAO,YAAY,YACnB,kBAAkB,WAClB,QAAQ,iBAAiB;AAE7B;AAEO,SAAS,aACd,OACA,GAC8B;AAC9B,QAAM,YAAY,EAAE,IAAI,WAAW;AACnC,QAAM,cAAc,GAAG,EAAE,IAAI,MAAM,KAAK,EAAE,IAAI,IAAI;AAClD,QAAM,UAAU,sBAAQ,IAAI,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC;AAEpE,MAAI,iBAAiB,2BAAa;AAChC,UAAM,MAAM,OAAO,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD,UAAM,aAAa,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,yBAAW,WAAW;AAC3F,QAAI,WAAY,SAAQ,KAAK,aAAa,UAAU;AACpD,WAAO,EAAE,KAAK,MAAM,MAAM,MAAM,MAA8B;AAAA,EAChE;AAEA,MAAI,iBAAiB,aAAa;AAChC,QAAI,kCAAkC,KAAK,MAAM,OAAO,GAAG;AACzD,aAAO,qBAAO,gBAAgB,mBAAmB,MAAM,OAAO,EAAE,EAAE,SAAS,OAAO;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,YAAQ,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP,QAAQ,MAAM,QAAQ;AAAA,QACtB,KAAK,MAAM,QAAQ;AAAA,QACnB,MAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,MACA,UAAU,EAAE,MAAM,MAAM,UAAU,KAAK;AAAA,IACzC,CAAC;AACD,WAAO,qBAAO,SAAS,aAAa,EAAE,SAAS,OAAO;AAAA,EACxD;AAEA,UAAQ,MAAM,kBAAkB,WAAW,IAAI,KAAK;AACpD,SAAO,qBAAO,SAAS,eAAe,EAAE,SAAS,OAAO;AAC1D;","names":[]}
1
+ {"version":3,"sources":["../../src/hono/handler.ts"],"sourcesContent":["import { DetailType, Details } from '../error/detail';\nimport { Status, StatusError } from '../error/status';\nimport type { Context } from 'hono';\nimport type { RequestIdVariables } from 'hono/request-id';\nimport type { Bindings, HTTPResponseError } from 'hono/types';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\n\nexport type Env = {\n Variables: RequestIdVariables;\n Bindings?: Bindings;\n};\n\ntype AxiosError = {\n code?: string;\n cause?: unknown;\n status?: number;\n message?: string;\n isAxiosError: boolean;\n response?: {\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n };\n config?: { url?: string; data?: unknown; method?: string; headers?: Record<string, string> };\n};\n\nexport function isAxiosError(payload: unknown): payload is AxiosError {\n return (\n payload !== null &&\n typeof payload === 'object' &&\n 'isAxiosError' in payload &&\n payload.isAxiosError === true\n );\n}\n\nexport function errorHandler<E extends Env = never>(\n error: Error | HTTPResponseError,\n c: Context<E>\n): Response | Promise<Response> {\n const requestId = c.get('requestId');\n const servingData = `${c.req.method}: ${c.req.path}`;\n const details = Details.new().requestInfo({ requestId, servingData });\n\n if (error instanceof StatusError) {\n error.body?.error?.details?.push(...details.list);\n const badRequest = error.body?.error?.details.find((d) => d.type === DetailType.BAD_REQUEST);\n if (badRequest) console.warn(servingData, badRequest);\n return c.json(error.body, error.status as ContentfulStatusCode);\n }\n\n if (error instanceof SyntaxError) {\n if (/^Cannot convert .* to a BigInt$/.test(error.message)) {\n return Status.invalidArgument(`Invalid number. ${error.message}`).response(details);\n }\n }\n\n if (isAxiosError(error)) {\n console.error({\n status: error.status,\n message: error.message,\n request: {\n method: error.config?.method,\n url: error.config?.url,\n data: error.config?.data,\n },\n response: { data: error.response?.data },\n });\n return Status.internal('Axios error').response(details);\n }\n\n console.error(`Unknown error: ${servingData}`, error);\n return Status.internal('Unknown error').response(details);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AACpC,oBAAoC;AA0B7B,SAAS,aAAa,SAAyC;AACpE,SACE,YAAY,QACZ,OAAO,YAAY,YACnB,kBAAkB,WAClB,QAAQ,iBAAiB;AAE7B;AAEO,SAAS,aACd,OACA,GAC8B;AAC9B,QAAM,YAAY,EAAE,IAAI,WAAW;AACnC,QAAM,cAAc,GAAG,EAAE,IAAI,MAAM,KAAK,EAAE,IAAI,IAAI;AAClD,QAAM,UAAU,sBAAQ,IAAI,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC;AAEpE,MAAI,iBAAiB,2BAAa;AAChC,UAAM,MAAM,OAAO,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD,UAAM,aAAa,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,yBAAW,WAAW;AAC3F,QAAI,WAAY,SAAQ,KAAK,aAAa,UAAU;AACpD,WAAO,EAAE,KAAK,MAAM,MAAM,MAAM,MAA8B;AAAA,EAChE;AAEA,MAAI,iBAAiB,aAAa;AAChC,QAAI,kCAAkC,KAAK,MAAM,OAAO,GAAG;AACzD,aAAO,qBAAO,gBAAgB,mBAAmB,MAAM,OAAO,EAAE,EAAE,SAAS,OAAO;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,YAAQ,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP,QAAQ,MAAM,QAAQ;AAAA,QACtB,KAAK,MAAM,QAAQ;AAAA,QACnB,MAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,MACA,UAAU,EAAE,MAAM,MAAM,UAAU,KAAK;AAAA,IACzC,CAAC;AACD,WAAO,qBAAO,SAAS,aAAa,EAAE,SAAS,OAAO;AAAA,EACxD;AAEA,UAAQ,MAAM,kBAAkB,WAAW,IAAI,KAAK;AACpD,SAAO,qBAAO,SAAS,eAAe,EAAE,SAAS,OAAO;AAC1D;","names":[]}
@@ -1,4 +1,3 @@
1
- import { AxiosError } from 'axios';
2
1
  import { Context } from 'hono';
3
2
  import { RequestIdVariables } from 'hono/request-id';
4
3
  import { Bindings, HTTPResponseError } from 'hono/types';
@@ -7,6 +6,25 @@ type Env = {
7
6
  Variables: RequestIdVariables;
8
7
  Bindings?: Bindings;
9
8
  };
9
+ type AxiosError = {
10
+ code?: string;
11
+ cause?: unknown;
12
+ status?: number;
13
+ message?: string;
14
+ isAxiosError: boolean;
15
+ response?: {
16
+ data: unknown;
17
+ status: number;
18
+ statusText: string;
19
+ headers: Record<string, string>;
20
+ };
21
+ config?: {
22
+ url?: string;
23
+ data?: unknown;
24
+ method?: string;
25
+ headers?: Record<string, string>;
26
+ };
27
+ };
10
28
  declare function isAxiosError(payload: unknown): payload is AxiosError;
11
29
  declare function errorHandler<E extends Env = never>(error: Error | HTTPResponseError, c: Context<E>): Response | Promise<Response>;
12
30
 
@@ -1,4 +1,3 @@
1
- import { AxiosError } from 'axios';
2
1
  import { Context } from 'hono';
3
2
  import { RequestIdVariables } from 'hono/request-id';
4
3
  import { Bindings, HTTPResponseError } from 'hono/types';
@@ -7,6 +6,25 @@ type Env = {
7
6
  Variables: RequestIdVariables;
8
7
  Bindings?: Bindings;
9
8
  };
9
+ type AxiosError = {
10
+ code?: string;
11
+ cause?: unknown;
12
+ status?: number;
13
+ message?: string;
14
+ isAxiosError: boolean;
15
+ response?: {
16
+ data: unknown;
17
+ status: number;
18
+ statusText: string;
19
+ headers: Record<string, string>;
20
+ };
21
+ config?: {
22
+ url?: string;
23
+ data?: unknown;
24
+ method?: string;
25
+ headers?: Record<string, string>;
26
+ };
27
+ };
10
28
  declare function isAxiosError(payload: unknown): payload is AxiosError;
11
29
  declare function errorHandler<E extends Env = never>(error: Error | HTTPResponseError, c: Context<E>): Response | Promise<Response>;
12
30
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hono/handler.ts"],"sourcesContent":["import { DetailType, Details } from '../error/detail';\nimport { Status, StatusError } from '../error/status';\nimport type { AxiosError } from 'axios';\nimport type { Context } from 'hono';\nimport type { RequestIdVariables } from 'hono/request-id';\nimport type { Bindings, HTTPResponseError } from 'hono/types';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\n\nexport type Env = {\n Variables: RequestIdVariables;\n Bindings?: Bindings;\n};\n\nexport function isAxiosError(payload: unknown): payload is AxiosError {\n return (\n payload !== null &&\n typeof payload === 'object' &&\n 'isAxiosError' in payload &&\n payload.isAxiosError === true\n );\n}\n\nexport function errorHandler<E extends Env = never>(\n error: Error | HTTPResponseError,\n c: Context<E>\n): Response | Promise<Response> {\n const requestId = c.get('requestId');\n const servingData = `${c.req.method}: ${c.req.path}`;\n const details = Details.new().requestInfo({ requestId, servingData });\n\n if (error instanceof StatusError) {\n error.body?.error?.details?.push(...details.list);\n const badRequest = error.body?.error?.details.find((d) => d.type === DetailType.BAD_REQUEST);\n if (badRequest) console.warn(servingData, badRequest);\n return c.json(error.body, error.status as ContentfulStatusCode);\n }\n\n if (error instanceof SyntaxError) {\n if (/^Cannot convert .* to a BigInt$/.test(error.message)) {\n return Status.invalidArgument(`Invalid number. ${error.message}`).response(details);\n }\n }\n\n if (isAxiosError(error)) {\n console.error({\n status: error.status,\n message: error.message,\n request: {\n method: error.config?.method,\n url: error.config?.url,\n data: error.config?.data,\n },\n response: { data: error.response?.data },\n });\n return Status.internal('Axios error').response(details);\n }\n\n console.error(`Unknown error: ${servingData}`, error);\n return Status.internal('Unknown error').response(details);\n}\n"],"mappings":";AAAA,SAAS,YAAY,eAAe;AACpC,SAAS,QAAQ,mBAAmB;AAY7B,SAAS,aAAa,SAAyC;AACpE,SACE,YAAY,QACZ,OAAO,YAAY,YACnB,kBAAkB,WAClB,QAAQ,iBAAiB;AAE7B;AAEO,SAAS,aACd,OACA,GAC8B;AAC9B,QAAM,YAAY,EAAE,IAAI,WAAW;AACnC,QAAM,cAAc,GAAG,EAAE,IAAI,MAAM,KAAK,EAAE,IAAI,IAAI;AAClD,QAAM,UAAU,QAAQ,IAAI,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC;AAEpE,MAAI,iBAAiB,aAAa;AAChC,UAAM,MAAM,OAAO,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD,UAAM,aAAa,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,WAAW;AAC3F,QAAI,WAAY,SAAQ,KAAK,aAAa,UAAU;AACpD,WAAO,EAAE,KAAK,MAAM,MAAM,MAAM,MAA8B;AAAA,EAChE;AAEA,MAAI,iBAAiB,aAAa;AAChC,QAAI,kCAAkC,KAAK,MAAM,OAAO,GAAG;AACzD,aAAO,OAAO,gBAAgB,mBAAmB,MAAM,OAAO,EAAE,EAAE,SAAS,OAAO;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,YAAQ,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP,QAAQ,MAAM,QAAQ;AAAA,QACtB,KAAK,MAAM,QAAQ;AAAA,QACnB,MAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,MACA,UAAU,EAAE,MAAM,MAAM,UAAU,KAAK;AAAA,IACzC,CAAC;AACD,WAAO,OAAO,SAAS,aAAa,EAAE,SAAS,OAAO;AAAA,EACxD;AAEA,UAAQ,MAAM,kBAAkB,WAAW,IAAI,KAAK;AACpD,SAAO,OAAO,SAAS,eAAe,EAAE,SAAS,OAAO;AAC1D;","names":[]}
1
+ {"version":3,"sources":["../../src/hono/handler.ts"],"sourcesContent":["import { DetailType, Details } from '../error/detail';\nimport { Status, StatusError } from '../error/status';\nimport type { Context } from 'hono';\nimport type { RequestIdVariables } from 'hono/request-id';\nimport type { Bindings, HTTPResponseError } from 'hono/types';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\n\nexport type Env = {\n Variables: RequestIdVariables;\n Bindings?: Bindings;\n};\n\ntype AxiosError = {\n code?: string;\n cause?: unknown;\n status?: number;\n message?: string;\n isAxiosError: boolean;\n response?: {\n data: unknown;\n status: number;\n statusText: string;\n headers: Record<string, string>;\n };\n config?: { url?: string; data?: unknown; method?: string; headers?: Record<string, string> };\n};\n\nexport function isAxiosError(payload: unknown): payload is AxiosError {\n return (\n payload !== null &&\n typeof payload === 'object' &&\n 'isAxiosError' in payload &&\n payload.isAxiosError === true\n );\n}\n\nexport function errorHandler<E extends Env = never>(\n error: Error | HTTPResponseError,\n c: Context<E>\n): Response | Promise<Response> {\n const requestId = c.get('requestId');\n const servingData = `${c.req.method}: ${c.req.path}`;\n const details = Details.new().requestInfo({ requestId, servingData });\n\n if (error instanceof StatusError) {\n error.body?.error?.details?.push(...details.list);\n const badRequest = error.body?.error?.details.find((d) => d.type === DetailType.BAD_REQUEST);\n if (badRequest) console.warn(servingData, badRequest);\n return c.json(error.body, error.status as ContentfulStatusCode);\n }\n\n if (error instanceof SyntaxError) {\n if (/^Cannot convert .* to a BigInt$/.test(error.message)) {\n return Status.invalidArgument(`Invalid number. ${error.message}`).response(details);\n }\n }\n\n if (isAxiosError(error)) {\n console.error({\n status: error.status,\n message: error.message,\n request: {\n method: error.config?.method,\n url: error.config?.url,\n data: error.config?.data,\n },\n response: { data: error.response?.data },\n });\n return Status.internal('Axios error').response(details);\n }\n\n console.error(`Unknown error: ${servingData}`, error);\n return Status.internal('Unknown error').response(details);\n}\n"],"mappings":";AAAA,SAAS,YAAY,eAAe;AACpC,SAAS,QAAQ,mBAAmB;AA0B7B,SAAS,aAAa,SAAyC;AACpE,SACE,YAAY,QACZ,OAAO,YAAY,YACnB,kBAAkB,WAClB,QAAQ,iBAAiB;AAE7B;AAEO,SAAS,aACd,OACA,GAC8B;AAC9B,QAAM,YAAY,EAAE,IAAI,WAAW;AACnC,QAAM,cAAc,GAAG,EAAE,IAAI,MAAM,KAAK,EAAE,IAAI,IAAI;AAClD,QAAM,UAAU,QAAQ,IAAI,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC;AAEpE,MAAI,iBAAiB,aAAa;AAChC,UAAM,MAAM,OAAO,SAAS,KAAK,GAAG,QAAQ,IAAI;AAChD,UAAM,aAAa,MAAM,MAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,WAAW;AAC3F,QAAI,WAAY,SAAQ,KAAK,aAAa,UAAU;AACpD,WAAO,EAAE,KAAK,MAAM,MAAM,MAAM,MAA8B;AAAA,EAChE;AAEA,MAAI,iBAAiB,aAAa;AAChC,QAAI,kCAAkC,KAAK,MAAM,OAAO,GAAG;AACzD,aAAO,OAAO,gBAAgB,mBAAmB,MAAM,OAAO,EAAE,EAAE,SAAS,OAAO;AAAA,IACpF;AAAA,EACF;AAEA,MAAI,aAAa,KAAK,GAAG;AACvB,YAAQ,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,QACP,QAAQ,MAAM,QAAQ;AAAA,QACtB,KAAK,MAAM,QAAQ;AAAA,QACnB,MAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,MACA,UAAU,EAAE,MAAM,MAAM,UAAU,KAAK;AAAA,IACzC,CAAC;AACD,WAAO,OAAO,SAAS,aAAa,EAAE,SAAS,OAAO;AAAA,EACxD;AAEA,UAAQ,MAAM,kBAAkB,WAAW,IAAI,KAAK;AACpD,SAAO,OAAO,SAAS,eAAe,EAAE,SAAS,OAAO;AAC1D;","names":[]}
@@ -10,5 +10,4 @@ import 'hono/types';
10
10
  import 'hono';
11
11
  import 'zod/v4/core';
12
12
  import 'zod';
13
- import 'axios';
14
13
  import 'hono/request-id';
@@ -10,5 +10,4 @@ import 'hono/types';
10
10
  import 'hono';
11
11
  import 'zod/v4/core';
12
12
  import 'zod';
13
- import 'axios';
14
13
  import 'hono/request-id';
@@ -48,7 +48,7 @@ async function fetch(input, {
48
48
  let lastResponse = null;
49
49
  while (retryCount <= retries) {
50
50
  try {
51
- const response = await global.fetch(input, init);
51
+ const response = await globalThis.fetch(input, init);
52
52
  lastResponse = response;
53
53
  if (response.ok || !retryCondition(response) || retryCount === retries) {
54
54
  return response;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/fetch.ts"],"sourcesContent":["export interface RetryOptions {\n /** The number of times to retry before failing, default: 3 */\n retries?: number;\n\n /** The delay factor in milliseconds, default: 500 */\n delayFactor?: number;\n\n /** The maximum delay in milliseconds, default: 30_000 (30s) */\n maxDelay?: number;\n\n /**\n * A callback to further control if a request should be retried.\n * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).\n */\n retryCondition?: (response: Response) => boolean;\n}\n\nfunction defaultRetryCondition(response: Response): boolean {\n return response.status === 408 || response.status === 429 || response.status >= 500;\n}\n\nfunction parseRetryAfter(response: Response | null): number | null {\n if (!response) return null;\n const header = response.headers.get('retry-after');\n if (!header) return null;\n\n // if the retry after header is a number, convert it to milliseconds\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n\n // if the retry after header is a date, get the number of milliseconds until that date\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());\n\n return null;\n}\n\nexport async function fetch(\n input: RequestInfo,\n {\n retries = 3,\n delayFactor = 500,\n maxDelay = 30_000,\n retryCondition = defaultRetryCondition,\n ...init\n }: RequestInit & RetryOptions = {}\n): Promise<Response> {\n let retryCount = 0;\n let lastError: unknown | null = null;\n let lastResponse: Response | null = null;\n\n while (retryCount <= retries) {\n try {\n const response = await global.fetch(input, init);\n lastResponse = response;\n if (response.ok || !retryCondition(response) || retryCount === retries) {\n return response;\n }\n\n const retryAfter = parseRetryAfter(response);\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n } catch (error) {\n lastError = error;\n if (retryCount === retries) throw error;\n\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n retryCount++;\n }\n\n if (lastResponse) return lastResponse;\n throw lastError ?? new Error('Fetch failed');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,sBAAsB,UAA6B;AAC1D,SAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AAClF;AAEA,SAAS,gBAAgB,UAA0C;AACjE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,OAAO,MAAM,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAG7D,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,MAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAEjE,SAAO;AACT;AAEA,eAAsB,MACpB,OACA;AAAA,EACE,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,GAAG;AACL,IAAgC,CAAC,GACd;AACnB,MAAI,aAAa;AACjB,MAAI,YAA4B;AAChC,MAAI,eAAgC;AAEpC,SAAO,cAAc,SAAS;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,MAAM,OAAO,IAAI;AAC/C,qBAAe;AACf,UAAI,SAAS,MAAM,CAAC,eAAe,QAAQ,KAAK,eAAe,SAAS;AACtE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,cAAc,QAAQ,QAAQ,QAAQ;AAC/D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,eAAe,QAAS,OAAM;AAElC,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ;AACjD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAEA;AAAA,EACF;AAEA,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,IAAI,MAAM,cAAc;AAC7C;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/fetch.ts"],"sourcesContent":["export interface RetryOptions {\n /** The number of times to retry before failing, default: 3 */\n retries?: number;\n\n /** The delay factor in milliseconds, default: 500 */\n delayFactor?: number;\n\n /** The maximum delay in milliseconds, default: 30_000 (30s) */\n maxDelay?: number;\n\n /**\n * A callback to further control if a request should be retried.\n * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).\n */\n retryCondition?: (response: Response) => boolean;\n}\n\nfunction defaultRetryCondition(response: Response): boolean {\n return response.status === 408 || response.status === 429 || response.status >= 500;\n}\n\nfunction parseRetryAfter(response: Response | null): number | null {\n if (!response) return null;\n const header = response.headers.get('retry-after');\n if (!header) return null;\n\n // if the retry after header is a number, convert it to milliseconds\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n\n // if the retry after header is a date, get the number of milliseconds until that date\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());\n\n return null;\n}\n\nexport async function fetch(\n input: RequestInfo,\n {\n retries = 3,\n delayFactor = 500,\n maxDelay = 30_000,\n retryCondition = defaultRetryCondition,\n ...init\n }: RequestInit & RetryOptions = {}\n): Promise<Response> {\n let retryCount = 0;\n let lastError: unknown | null = null;\n let lastResponse: Response | null = null;\n\n while (retryCount <= retries) {\n try {\n const response = await globalThis.fetch(input, init);\n lastResponse = response;\n if (response.ok || !retryCondition(response) || retryCount === retries) {\n return response;\n }\n\n const retryAfter = parseRetryAfter(response);\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n } catch (error) {\n lastError = error;\n if (retryCount === retries) throw error;\n\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n retryCount++;\n }\n\n if (lastResponse) return lastResponse;\n throw lastError ?? new Error('Fetch failed');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,sBAAsB,UAA6B;AAC1D,SAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AAClF;AAEA,SAAS,gBAAgB,UAA0C;AACjE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,OAAO,MAAM,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAG7D,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,MAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAEjE,SAAO;AACT;AAEA,eAAsB,MACpB,OACA;AAAA,EACE,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,GAAG;AACL,IAAgC,CAAC,GACd;AACnB,MAAI,aAAa;AACjB,MAAI,YAA4B;AAChC,MAAI,eAAgC;AAEpC,SAAO,cAAc,SAAS;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,MAAM,OAAO,IAAI;AACnD,qBAAe;AACf,UAAI,SAAS,MAAM,CAAC,eAAe,QAAQ,KAAK,eAAe,SAAS;AACtE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,cAAc,QAAQ,QAAQ,QAAQ;AAC/D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,eAAe,QAAS,OAAM;AAElC,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ;AACjD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAEA;AAAA,EACF;AAEA,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,IAAI,MAAM,cAAc;AAC7C;","names":[]}
@@ -24,7 +24,7 @@ async function fetch(input, {
24
24
  let lastResponse = null;
25
25
  while (retryCount <= retries) {
26
26
  try {
27
- const response = await global.fetch(input, init);
27
+ const response = await globalThis.fetch(input, init);
28
28
  lastResponse = response;
29
29
  if (response.ok || !retryCondition(response) || retryCount === retries) {
30
30
  return response;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/fetch.ts"],"sourcesContent":["export interface RetryOptions {\n /** The number of times to retry before failing, default: 3 */\n retries?: number;\n\n /** The delay factor in milliseconds, default: 500 */\n delayFactor?: number;\n\n /** The maximum delay in milliseconds, default: 30_000 (30s) */\n maxDelay?: number;\n\n /**\n * A callback to further control if a request should be retried.\n * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).\n */\n retryCondition?: (response: Response) => boolean;\n}\n\nfunction defaultRetryCondition(response: Response): boolean {\n return response.status === 408 || response.status === 429 || response.status >= 500;\n}\n\nfunction parseRetryAfter(response: Response | null): number | null {\n if (!response) return null;\n const header = response.headers.get('retry-after');\n if (!header) return null;\n\n // if the retry after header is a number, convert it to milliseconds\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n\n // if the retry after header is a date, get the number of milliseconds until that date\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());\n\n return null;\n}\n\nexport async function fetch(\n input: RequestInfo,\n {\n retries = 3,\n delayFactor = 500,\n maxDelay = 30_000,\n retryCondition = defaultRetryCondition,\n ...init\n }: RequestInit & RetryOptions = {}\n): Promise<Response> {\n let retryCount = 0;\n let lastError: unknown | null = null;\n let lastResponse: Response | null = null;\n\n while (retryCount <= retries) {\n try {\n const response = await global.fetch(input, init);\n lastResponse = response;\n if (response.ok || !retryCondition(response) || retryCount === retries) {\n return response;\n }\n\n const retryAfter = parseRetryAfter(response);\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n } catch (error) {\n lastError = error;\n if (retryCount === retries) throw error;\n\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n retryCount++;\n }\n\n if (lastResponse) return lastResponse;\n throw lastError ?? new Error('Fetch failed');\n}\n"],"mappings":";AAiBA,SAAS,sBAAsB,UAA6B;AAC1D,SAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AAClF;AAEA,SAAS,gBAAgB,UAA0C;AACjE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,OAAO,MAAM,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAG7D,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,MAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAEjE,SAAO;AACT;AAEA,eAAsB,MACpB,OACA;AAAA,EACE,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,GAAG;AACL,IAAgC,CAAC,GACd;AACnB,MAAI,aAAa;AACjB,MAAI,YAA4B;AAChC,MAAI,eAAgC;AAEpC,SAAO,cAAc,SAAS;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,MAAM,OAAO,IAAI;AAC/C,qBAAe;AACf,UAAI,SAAS,MAAM,CAAC,eAAe,QAAQ,KAAK,eAAe,SAAS;AACtE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,cAAc,QAAQ,QAAQ,QAAQ;AAC/D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,eAAe,QAAS,OAAM;AAElC,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ;AACjD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAEA;AAAA,EACF;AAEA,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,IAAI,MAAM,cAAc;AAC7C;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/fetch.ts"],"sourcesContent":["export interface RetryOptions {\n /** The number of times to retry before failing, default: 3 */\n retries?: number;\n\n /** The delay factor in milliseconds, default: 500 */\n delayFactor?: number;\n\n /** The maximum delay in milliseconds, default: 30_000 (30s) */\n maxDelay?: number;\n\n /**\n * A callback to further control if a request should be retried.\n * default: 408 (Request Timeout) or 429 (Too Many Requests) or 5xx (Server Error).\n */\n retryCondition?: (response: Response) => boolean;\n}\n\nfunction defaultRetryCondition(response: Response): boolean {\n return response.status === 408 || response.status === 429 || response.status >= 500;\n}\n\nfunction parseRetryAfter(response: Response | null): number | null {\n if (!response) return null;\n const header = response.headers.get('retry-after');\n if (!header) return null;\n\n // if the retry after header is a number, convert it to milliseconds\n const seconds = Number(header);\n if (!Number.isNaN(seconds)) return Math.max(0, seconds * 1000);\n\n // if the retry after header is a date, get the number of milliseconds until that date\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now());\n\n return null;\n}\n\nexport async function fetch(\n input: RequestInfo,\n {\n retries = 3,\n delayFactor = 500,\n maxDelay = 30_000,\n retryCondition = defaultRetryCondition,\n ...init\n }: RequestInit & RetryOptions = {}\n): Promise<Response> {\n let retryCount = 0;\n let lastError: unknown | null = null;\n let lastResponse: Response | null = null;\n\n while (retryCount <= retries) {\n try {\n const response = await globalThis.fetch(input, init);\n lastResponse = response;\n if (response.ok || !retryCondition(response) || retryCount === retries) {\n return response;\n }\n\n const retryAfter = parseRetryAfter(response);\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(retryAfter ?? delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n } catch (error) {\n lastError = error;\n if (retryCount === retries) throw error;\n\n const delay = delayFactor * Math.pow(2, retryCount);\n const jitter = delay * 0.25 * (Math.random() * 2 - 1); // 25% jitter\n\n const timeout = Math.min(delay + jitter, maxDelay);\n await new Promise((resolve) => setTimeout(resolve, timeout));\n }\n\n retryCount++;\n }\n\n if (lastResponse) return lastResponse;\n throw lastError ?? new Error('Fetch failed');\n}\n"],"mappings":";AAiBA,SAAS,sBAAsB,UAA6B;AAC1D,SAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AAClF;AAEA,SAAS,gBAAgB,UAA0C;AACjE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,SAAS,SAAS,QAAQ,IAAI,aAAa;AACjD,MAAI,CAAC,OAAQ,QAAO;AAGpB,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,OAAO,MAAM,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,UAAU,GAAI;AAG7D,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,MAAI,CAAC,OAAO,MAAM,MAAM,EAAG,QAAO,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;AAEjE,SAAO;AACT;AAEA,eAAsB,MACpB,OACA;AAAA,EACE,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,GAAG;AACL,IAAgC,CAAC,GACd;AACnB,MAAI,aAAa;AACjB,MAAI,YAA4B;AAChC,MAAI,eAAgC;AAEpC,SAAO,cAAc,SAAS;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,WAAW,MAAM,OAAO,IAAI;AACnD,qBAAe;AACf,UAAI,SAAS,MAAM,CAAC,eAAe,QAAQ,KAAK,eAAe,SAAS;AACtE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,gBAAgB,QAAQ;AAC3C,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,cAAc,QAAQ,QAAQ,QAAQ;AAC/D,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,kBAAY;AACZ,UAAI,eAAe,QAAS,OAAM;AAElC,YAAM,QAAQ,cAAc,KAAK,IAAI,GAAG,UAAU;AAClD,YAAM,SAAS,QAAQ,QAAQ,KAAK,OAAO,IAAI,IAAI;AAEnD,YAAM,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ;AACjD,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAEA;AAAA,EACF;AAEA,MAAI,aAAc,QAAO;AACzB,QAAM,aAAa,IAAI,MAAM,cAAc;AAC7C;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/http",
3
- "version": "1.2.8",
3
+ "version": "1.2.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {
@@ -51,15 +51,11 @@
51
51
  "zod": "^4.1.12"
52
52
  },
53
53
  "peerDependencies": {
54
- "axios": "^1.10.0",
55
- "hono": "^4.7.9",
54
+ "hono": "^4.10.4",
56
55
  "i18next": "^25.0.0",
57
56
  "react": "^19"
58
57
  },
59
58
  "peerDependenciesMeta": {
60
- "axios": {
61
- "optional": true
62
- },
63
59
  "hono": {
64
60
  "optional": true
65
61
  },