import { sha256 } from './crypto.ts' export const equal = (a: ArrayBuffer, b: ArrayBuffer) => { if (a === b) { return true } if (a.byteLength !== b.byteLength) { return false } const va = new DataView(a) const vb = new DataView(b) let i = va.byteLength while (i--) { if (va.getUint8(i) !== vb.getUint8(i)) { return false } } return true } export const timingSafeEqual = async ( a: string | object | boolean, b: string | object | boolean, hashFunction?: Function ) => { if (!hashFunction) { hashFunction = sha256 } const sa = await hashFunction(a) const sb = await hashFunction(b) if (!sa || !sb) { return false } return sa === sb && a === b } export const bufferToString = (buffer: ArrayBuffer): string => { if (buffer instanceof ArrayBuffer) { const enc = new TextDecoder('utf-8') return enc.decode(buffer) } return buffer } export const bufferToFormData = (arrayBuffer: ArrayBuffer, contentType: string) => { const response = new Response(arrayBuffer, { headers: { 'Content-Type': contentType, }, }) return response.formData() }