import type http from 'node:http'; export function sendJson(res: http.ServerResponse, statusCode: number, payload: unknown) { res.statusCode = statusCode; res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.end(JSON.stringify(payload)); } export function isCallbackAuthorized(req: http.IncomingMessage, authToken: string) { if (!authToken) { return true; } const headerToken = req.headers['x-callback-token']; const authHeader = req.headers.authorization; const bearerToken = typeof authHeader === 'string' && authHeader.startsWith('Bearer ') ? authHeader.slice('Bearer '.length) : null; return headerToken === authToken || bearerToken === authToken; } export function readRequestBody(req: http.IncomingMessage, maxBytes: number) { return new Promise((resolve, reject) => { const chunks: Buffer[] = []; let total = 0; req.on('data', (chunk: Buffer) => { total += chunk.length; if (total > maxBytes) { reject(new Error(`Payload too large (>${maxBytes} bytes)`)); req.destroy(); return; } chunks.push(chunk); }); req.on('end', () => { resolve(Buffer.concat(chunks).toString('utf8')); }); req.on('error', (error: Error) => { reject(error); }); }); }