import crypto from "crypto";
function sha256Hex(value: string) {
return crypto.createHash("sha256").update(value).digest("hex");
}
function hmacHex(secret: string, payload: string) {
return crypto.createHmac("sha256", secret).update(payload).digest("hex");
}
function parseApiKey(apiKey: string) {
const token = apiKey.startsWith("cora_org_") ? apiKey.slice("cora_org_".length) : apiKey;
const dot = token.indexOf(".");
if (dot < 0) throw new Error("Invalid API key format");
return {
keyId: token.slice(0, dot),
secret: token.slice(dot + 1),
};
}
function buildPatchHeaders(args: {
apiKey: string;
secret: string;
pathWithQuery: string;
rawBody: string;
}) {
const timestamp = Math.floor(Date.now() / 1000).toString();
const canonical = `${timestamp}.PATCH.${args.pathWithQuery}.${sha256Hex(args.rawBody)}`;
const signature = hmacHex(args.secret, canonical);
return {
Authorization: `Bearer ${args.apiKey}`,
"X-Cora-Timestamp": timestamp,
"X-Cora-Signature": signature,
"Content-Type": "application/json",
};
}