import { RpcErrorTimeout } from './errors.ts';
export function fetchWithTimeout( timeout: number, ...args: Parameters<typeof fetch>) { const controller = new AbortController();
const [input, init] = args;
const timeoutId = setTimeout(() => { if (!controller.signal.aborted) { controller.abort(); } }, timeout);
const request = fetch(input as string, { ...init as unknown as any, signal: controller.signal, }).then( (res) => { clearTimeout(timeoutId); return res; }, );
const cancel = () => { clearTimeout(timeoutId); if (!controller.signal.aborted) { controller.abort(); } };
const clearFetchTimeout = () => { clearTimeout(timeoutId); };
return { request, cancel, clearFetchTimeout };}
export const withTimeout = async <T>(ms: number, prom: Promise<T>): Promise<T> => { let timeout = 0; const rejectAfterMs = new Promise((res, rej) => { timeout = setTimeout(() => rej(new RpcErrorTimeout()), ms); });
const result = await Promise.race([rejectAfterMs, prom]) as Promise<T>; clearTimeout(timeout); return result;};
export const ensureEndsWith = (s: string, suffix: string) => { if (s.endsWith(suffix)) return s; return s + suffix;};
export const ensureDoesNotEndWith = (s: string, suffix: string) => { if (s.endsWith(suffix)) return s.slice(0, -1); return s;};
export interface Deferred<T> { resolve: (value: T | PromiseLike<T>) => void; reject: (reason?: any) => void; promise: Promise<T>;}
export const makeDeferred = <T>(): Deferred<T> => { const def: any = {}; def.promise = new Promise<T>((resolve, reject) => { def.resolve = (arg: T) => { try { resolve(arg); } catch (err) { console.error(err); } }; def.reject = (arg: any) => { try { reject(arg); } catch (err) { console.error(err); } }; }); return def as Deferred<T>;};
export const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
export const randInt = (lo: number, hi: number): number => lo + Math.floor(Math.random() * (hi - lo));
export const makeId = (): string => ('' + randInt(0, 999999999999999)).padStart(15, '0');
export const setImmediate2 = (fn: any) => { Promise.resolve().then(fn);};