@stacksjs/http 0.75.423 → 0.75.431

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { retryAfterMilliseconds } from './retry-after';
1
2
  /**
2
3
  * `fetch` wrapper with one budget for requests and retry waits. Honors
3
4
  * numeric and HTTP-date `Retry-After` on 429/503 responses.
@@ -99,3 +100,4 @@ export declare enum Response {
99
100
  HTTP_NOT_EXTENDED = 510,
100
101
  HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511,
101
102
  }
103
+ export { retryAfterMilliseconds } from './retry-after';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var m;((T)=>{T[T.HTTP_CONTINUE=100]="HTTP_CONTINUE";T[T.HTTP_SWITCHING_PROTOCOLS=101]="HTTP_SWITCHING_PROTOCOLS";T[T.HTTP_OK=200]="HTTP_OK";T[T.HTTP_CREATED=201]="HTTP_CREATED";T[T.HTTP_ACCEPTED=202]="HTTP_ACCEPTED";T[T.HTTP_NON_AUTHORITATIVE_INFORMATION=203]="HTTP_NON_AUTHORITATIVE_INFORMATION";T[T.HTTP_NO_CONTENT=204]="HTTP_NO_CONTENT";T[T.HTTP_RESET_CONTENT=205]="HTTP_RESET_CONTENT";T[T.HTTP_PARTIAL_CONTENT=206]="HTTP_PARTIAL_CONTENT";T[T.HTTP_MULTIPLE_CHOICES=300]="HTTP_MULTIPLE_CHOICES";T[T.HTTP_MOVED_PERMANENTLY=301]="HTTP_MOVED_PERMANENTLY";T[T.HTTP_FOUND=302]="HTTP_FOUND";T[T.HTTP_SEE_OTHER=303]="HTTP_SEE_OTHER";T[T.HTTP_NOT_MODIFIED=304]="HTTP_NOT_MODIFIED";T[T.HTTP_USE_PROXY=305]="HTTP_USE_PROXY";T[T.HTTP_UNUSED=306]="HTTP_UNUSED";T[T.HTTP_TEMPORARY_REDIRECT=307]="HTTP_TEMPORARY_REDIRECT";T[T.HTTP_PERMANENT_REDIRECT=308]="HTTP_PERMANENT_REDIRECT";T[T.HTTP_BAD_REQUEST=400]="HTTP_BAD_REQUEST";T[T.HTTP_UNAUTHORIZED=401]="HTTP_UNAUTHORIZED";T[T.HTTP_PAYMENT_REQUIRED=402]="HTTP_PAYMENT_REQUIRED";T[T.HTTP_FORBIDDEN=403]="HTTP_FORBIDDEN";T[T.HTTP_NOT_FOUND=404]="HTTP_NOT_FOUND";T[T.HTTP_METHOD_NOT_ALLOWED=405]="HTTP_METHOD_NOT_ALLOWED";T[T.HTTP_NOT_ACCEPTABLE=406]="HTTP_NOT_ACCEPTABLE";T[T.HTTP_PROXY_AUTHENTICATION_REQUIRED=407]="HTTP_PROXY_AUTHENTICATION_REQUIRED";T[T.HTTP_REQUEST_TIMEOUT=408]="HTTP_REQUEST_TIMEOUT";T[T.HTTP_CONFLICT=409]="HTTP_CONFLICT";T[T.HTTP_GONE=410]="HTTP_GONE";T[T.HTTP_LENGTH_REQUIRED=411]="HTTP_LENGTH_REQUIRED";T[T.HTTP_PRECONDITION_FAILED=412]="HTTP_PRECONDITION_FAILED";T[T.HTTP_REQUEST_ENTITY_TOO_LARGE=413]="HTTP_REQUEST_ENTITY_TOO_LARGE";T[T.HTTP_REQUEST_URI_TOO_LONG=414]="HTTP_REQUEST_URI_TOO_LONG";T[T.HTTP_UNSUPPORTED_MEDIA_TYPE=415]="HTTP_UNSUPPORTED_MEDIA_TYPE";T[T.HTTP_REQUESTED_RANGE_NOT_SATISFIABLE=416]="HTTP_REQUESTED_RANGE_NOT_SATISFIABLE";T[T.HTTP_EXPECTATION_FAILED=417]="HTTP_EXPECTATION_FAILED";T[T.HTTP_I_AM_A_TEAPOT=418]="HTTP_I_AM_A_TEAPOT";T[T.HTTP_MISDIRECTED_REQUEST=421]="HTTP_MISDIRECTED_REQUEST";T[T.HTTP_UNPROCESSABLE_ENTITY=422]="HTTP_UNPROCESSABLE_ENTITY";T[T.HTTP_LOCKED=423]="HTTP_LOCKED";T[T.HTTP_FAILED_DEPENDENCY=424]="HTTP_FAILED_DEPENDENCY";T[T.HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL=425]="HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL";T[T.HTTP_UPGRADE_REQUIRED=426]="HTTP_UPGRADE_REQUIRED";T[T.HTTP_PRECONDITION_REQUIRED=428]="HTTP_PRECONDITION_REQUIRED";T[T.HTTP_TOO_MANY_REQUESTS=429]="HTTP_TOO_MANY_REQUESTS";T[T.HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE=431]="HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE";T[T.HTTP_UNAVAILABLE_FOR_LEGAL_REASONS=451]="HTTP_UNAVAILABLE_FOR_LEGAL_REASONS";T[T.HTTP_INTERNAL_SERVER_ERROR=500]="HTTP_INTERNAL_SERVER_ERROR";T[T.HTTP_NOT_IMPLEMENTED=501]="HTTP_NOT_IMPLEMENTED";T[T.HTTP_BAD_GATEWAY=502]="HTTP_BAD_GATEWAY";T[T.HTTP_SERVICE_UNAVAILABLE=503]="HTTP_SERVICE_UNAVAILABLE";T[T.HTTP_GATEWAY_TIMEOUT=504]="HTTP_GATEWAY_TIMEOUT";T[T.HTTP_VERSION_NOT_SUPPORTED=505]="HTTP_VERSION_NOT_SUPPORTED";T[T.HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL=506]="HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL";T[T.HTTP_INSUFFICIENT_STORAGE=507]="HTTP_INSUFFICIENT_STORAGE";T[T.HTTP_LOOP_DETECTED=508]="HTTP_LOOP_DETECTED";T[T.HTTP_NOT_EXTENDED=510]="HTTP_NOT_EXTENDED";T[T.HTTP_NETWORK_AUTHENTICATION_REQUIRED=511]="HTTP_NETWORK_AUTHENTICATION_REQUIRED"})(m||={});async function c(E,_={}){let{timeoutMs:t=30000,retry:O=0,...r}=_;if(!Number.isFinite(t)||t<=0||t>2147483647)throw RangeError("timeoutMs must be positive and within the platform timer range");if(!Number.isSafeInteger(O)||O<0)throw RangeError("retry must be a non-negative safe integer");let P=new AbortController,H=r.signal??(E instanceof Request?E.signal:void 0),I=H?AbortSignal.any([H,P.signal]):P.signal,S=!(r.body instanceof ReadableStream)&&!(E instanceof Request&&E.body!==null),U=setTimeout(()=>P.abort(Error(`Request timed out after ${t}ms`)),t);try{for(let a=0;;a++){I.throwIfAborted();let A=await fetch(E,{...r,signal:I});if(!S||![429,503].includes(A.status)||a>=O)return A;let N=A.headers.get("retry-after")?.trim(),i=N&&/^\d+(?:\.\d+)?$/.test(N)?Number(N):NaN,D=N&&/^[a-z]{3}(?:[a-z]*,| )/i.test(N)?Date.parse(N):NaN,L=Number.isFinite(i)?i*1000:Number.isFinite(D)?Math.max(0,D-Date.now()):Math.min(2**a*1000,30000);await A.body?.cancel(),await C(L,I)}}finally{clearTimeout(U)}}function C(E,_){return _.throwIfAborted(),new Promise((t,O)=>{let r=()=>{clearTimeout(H),_.removeEventListener("abort",P)},P=()=>{r(),O(_.reason)},H=setTimeout(()=>{r(),t()},Math.min(E,2147483647));if(_.addEventListener("abort",P,{once:!0}),_.aborted)P()})}export{m as Response,c as fetchWithBudget};
2
+ function I(r,_=Date.now()){let E=r?.trim();if(!E||!Number.isFinite(_))return null;if(/^\d+(?:\.\d+)?$/.test(E)){let t=Number(E)*1000;return Number.isFinite(t)&&t<=Number.MAX_SAFE_INTEGER?Math.ceil(t):null}if(!/^(?:[a-z]{3}, \d{2} [a-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT|[a-z]+, \d{2}-[a-z]{3}-\d{2} \d{2}:\d{2}:\d{2} GMT|[a-z]{3} [a-z]{3} [ \d]\d \d{2}:\d{2}:\d{2} \d{4})$/i.test(E))return null;let P=Date.parse(E);return Number.isFinite(P)?Math.max(0,P-_):null}var u;((T)=>{T[T.HTTP_CONTINUE=100]="HTTP_CONTINUE";T[T.HTTP_SWITCHING_PROTOCOLS=101]="HTTP_SWITCHING_PROTOCOLS";T[T.HTTP_OK=200]="HTTP_OK";T[T.HTTP_CREATED=201]="HTTP_CREATED";T[T.HTTP_ACCEPTED=202]="HTTP_ACCEPTED";T[T.HTTP_NON_AUTHORITATIVE_INFORMATION=203]="HTTP_NON_AUTHORITATIVE_INFORMATION";T[T.HTTP_NO_CONTENT=204]="HTTP_NO_CONTENT";T[T.HTTP_RESET_CONTENT=205]="HTTP_RESET_CONTENT";T[T.HTTP_PARTIAL_CONTENT=206]="HTTP_PARTIAL_CONTENT";T[T.HTTP_MULTIPLE_CHOICES=300]="HTTP_MULTIPLE_CHOICES";T[T.HTTP_MOVED_PERMANENTLY=301]="HTTP_MOVED_PERMANENTLY";T[T.HTTP_FOUND=302]="HTTP_FOUND";T[T.HTTP_SEE_OTHER=303]="HTTP_SEE_OTHER";T[T.HTTP_NOT_MODIFIED=304]="HTTP_NOT_MODIFIED";T[T.HTTP_USE_PROXY=305]="HTTP_USE_PROXY";T[T.HTTP_UNUSED=306]="HTTP_UNUSED";T[T.HTTP_TEMPORARY_REDIRECT=307]="HTTP_TEMPORARY_REDIRECT";T[T.HTTP_PERMANENT_REDIRECT=308]="HTTP_PERMANENT_REDIRECT";T[T.HTTP_BAD_REQUEST=400]="HTTP_BAD_REQUEST";T[T.HTTP_UNAUTHORIZED=401]="HTTP_UNAUTHORIZED";T[T.HTTP_PAYMENT_REQUIRED=402]="HTTP_PAYMENT_REQUIRED";T[T.HTTP_FORBIDDEN=403]="HTTP_FORBIDDEN";T[T.HTTP_NOT_FOUND=404]="HTTP_NOT_FOUND";T[T.HTTP_METHOD_NOT_ALLOWED=405]="HTTP_METHOD_NOT_ALLOWED";T[T.HTTP_NOT_ACCEPTABLE=406]="HTTP_NOT_ACCEPTABLE";T[T.HTTP_PROXY_AUTHENTICATION_REQUIRED=407]="HTTP_PROXY_AUTHENTICATION_REQUIRED";T[T.HTTP_REQUEST_TIMEOUT=408]="HTTP_REQUEST_TIMEOUT";T[T.HTTP_CONFLICT=409]="HTTP_CONFLICT";T[T.HTTP_GONE=410]="HTTP_GONE";T[T.HTTP_LENGTH_REQUIRED=411]="HTTP_LENGTH_REQUIRED";T[T.HTTP_PRECONDITION_FAILED=412]="HTTP_PRECONDITION_FAILED";T[T.HTTP_REQUEST_ENTITY_TOO_LARGE=413]="HTTP_REQUEST_ENTITY_TOO_LARGE";T[T.HTTP_REQUEST_URI_TOO_LONG=414]="HTTP_REQUEST_URI_TOO_LONG";T[T.HTTP_UNSUPPORTED_MEDIA_TYPE=415]="HTTP_UNSUPPORTED_MEDIA_TYPE";T[T.HTTP_REQUESTED_RANGE_NOT_SATISFIABLE=416]="HTTP_REQUESTED_RANGE_NOT_SATISFIABLE";T[T.HTTP_EXPECTATION_FAILED=417]="HTTP_EXPECTATION_FAILED";T[T.HTTP_I_AM_A_TEAPOT=418]="HTTP_I_AM_A_TEAPOT";T[T.HTTP_MISDIRECTED_REQUEST=421]="HTTP_MISDIRECTED_REQUEST";T[T.HTTP_UNPROCESSABLE_ENTITY=422]="HTTP_UNPROCESSABLE_ENTITY";T[T.HTTP_LOCKED=423]="HTTP_LOCKED";T[T.HTTP_FAILED_DEPENDENCY=424]="HTTP_FAILED_DEPENDENCY";T[T.HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL=425]="HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL";T[T.HTTP_UPGRADE_REQUIRED=426]="HTTP_UPGRADE_REQUIRED";T[T.HTTP_PRECONDITION_REQUIRED=428]="HTTP_PRECONDITION_REQUIRED";T[T.HTTP_TOO_MANY_REQUESTS=429]="HTTP_TOO_MANY_REQUESTS";T[T.HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE=431]="HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE";T[T.HTTP_UNAVAILABLE_FOR_LEGAL_REASONS=451]="HTTP_UNAVAILABLE_FOR_LEGAL_REASONS";T[T.HTTP_INTERNAL_SERVER_ERROR=500]="HTTP_INTERNAL_SERVER_ERROR";T[T.HTTP_NOT_IMPLEMENTED=501]="HTTP_NOT_IMPLEMENTED";T[T.HTTP_BAD_GATEWAY=502]="HTTP_BAD_GATEWAY";T[T.HTTP_SERVICE_UNAVAILABLE=503]="HTTP_SERVICE_UNAVAILABLE";T[T.HTTP_GATEWAY_TIMEOUT=504]="HTTP_GATEWAY_TIMEOUT";T[T.HTTP_VERSION_NOT_SUPPORTED=505]="HTTP_VERSION_NOT_SUPPORTED";T[T.HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL=506]="HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL";T[T.HTTP_INSUFFICIENT_STORAGE=507]="HTTP_INSUFFICIENT_STORAGE";T[T.HTTP_LOOP_DETECTED=508]="HTTP_LOOP_DETECTED";T[T.HTTP_NOT_EXTENDED=510]="HTTP_NOT_EXTENDED";T[T.HTTP_NETWORK_AUTHENTICATION_REQUIRED=511]="HTTP_NETWORK_AUTHENTICATION_REQUIRED"})(u||={});async function U(r,_={}){let{timeoutMs:E=30000,retry:P=0,...t}=_;if(!Number.isFinite(E)||E<=0||E>2147483647)throw RangeError("timeoutMs must be positive and within the platform timer range");if(!Number.isSafeInteger(P)||P<0)throw RangeError("retry must be a non-negative safe integer");let i=new AbortController,N=t.signal??(r instanceof Request?r.signal:void 0),A=N?AbortSignal.any([N,i.signal]):i.signal,a=!(t.body instanceof ReadableStream)&&!(r instanceof Request&&r.body!==null),D=setTimeout(()=>i.abort(Error(`Request timed out after ${E}ms`)),E);try{for(let H=0;;H++){A.throwIfAborted();let O=await fetch(r,{...t,signal:A});if(!a||![429,503].includes(O.status)||H>=P)return O;let l=I(O.headers.get("retry-after"))??Math.min(2**H*1000,30000);await O.body?.cancel(),await d(l,A)}}finally{clearTimeout(D)}}function d(r,_){return _.throwIfAborted(),new Promise((E,P)=>{let t=()=>{clearTimeout(N),_.removeEventListener("abort",i)},i=()=>{t(),P(_.reason)},N=setTimeout(()=>{t(),E()},Math.min(r,2147483647));if(_.addEventListener("abort",i,{once:!0}),_.aborted)i()})}export{u as Response,U as fetchWithBudget,I as retryAfterMilliseconds};
@@ -0,0 +1,2 @@
1
+ /** Parse HTTP Retry-After into a non-negative delay; malformed values have no deadline. */
2
+ export declare function retryAfterMilliseconds(value: string | null | undefined, now?: unknown): number | null;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/http",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.423",
5
+ "version": "0.75.431",
6
6
  "description": "Stacks HTTP methods.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [