← Files BranchaARCHIVED FILE

skills/brancha/app/src/server/http/body.ts

1.01 KB · Oct 3, 2026 · 06:30 UTC

↓ Download file

import type { IncomingMessage } from 'node:http';
import { HttpError } from './errors.js';

const MAX_BODY_BYTES = 10 * 1024 * 1024;

export function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>> {
  return new Promise((resolve, reject) => {
    let data = '';
    let size = 0;

    req.on('data', (chunk: Buffer) => {
      size += chunk.length;
      if (size > MAX_BODY_BYTES) {
        reject(new HttpError(413, 'request body too large', 'BODY_TOO_LARGE'));
        req.destroy();
        return;
      }
      data += chunk;
    });
    req.on('end', () => {
      try {
        const value = data ? JSON.parse(data) as unknown : {};
        if (!value || typeof value !== 'object' || Array.isArray(value)) {
          reject(new HttpError(400, 'JSON object required', 'INVALID_BODY'));
          return;
        }
        resolve(value as Record<string, unknown>);
      } catch {
        reject(new HttpError(400, 'invalid JSON', 'INVALID_JSON'));
      }
    });
    req.on('error', reject);
  });
}

SHA-256: 35c5aabcb4111e91d8bf33f2cdcf29dd9c987f8a4503d9cf1c81256b8e67b1c8