import { createHmac, timingSafeEqual } from "crypto";

const REQUEST_SIGNATURE_HEADER = "x-aiwebcommand-signature";

function safeEqual(left: string, right: string) {
  const leftBuffer = Buffer.from(left);
  const rightBuffer = Buffer.from(right);

  if (leftBuffer.length !== rightBuffer.length) {
    return false;
  }

  return timingSafeEqual(leftBuffer, rightBuffer);
}

export function createRequestSignature(rawBody: string, secret: string) {
  return createHmac("sha256", secret).update(rawBody, "utf8").digest("base64");
}

export function isRequestSignatureValid(rawBody: string, signature: string, secret: string) {
  return safeEqual(signature, createRequestSignature(rawBody, secret));
}

export function isSignedRequestAuthorized(request: Request, rawBody: string, secret: string) {
  const signature = request.headers.get(REQUEST_SIGNATURE_HEADER);
  return !!signature && isRequestSignatureValid(rawBody, signature, secret);
}
