// Races a promise against a timeout. Used to guard wallet interactions
// (signTypedData / switchChain) which can hang forever on mobile WalletConnect
// when the wallet app does not surface to confirm the request.
export class TimeoutError extends Error {
constructor(message: string) {
super(message);
this.name = 'TimeoutError';
}
}
export function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {
let timer: ReturnType<typeof setTimeout>;
const timeout = new Promise<never>((_, reject) => {
timer = setTimeout(() => reject(new TimeoutError(message)), ms);
});
return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
}
📜 Git History
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago