/** * embed Flock Direct 联调:POST /api/flock/quotes → 轮询 GET /api/quotes/:id * 用法: npx tsx scripts/smoke-flock-embed-direct.ts */ import { randomUUID } from "node:crypto"; const BASE = process.env.SMOKE_BASE_URL ?? "http://127.0.0.1:3000"; const TOKEN = process.env.SMOKE_HOST_TOKEN ?? "demo-host-token"; const CUSTOMER = process.env.SMOKE_CUSTOMER_ID ?? "CUST_001"; function tomorrowMmDdYyyy(): string { const d = new Date(); d.setDate(d.getDate() + 1); const mm = String(d.getMonth() + 1).padStart(2, "0"); const dd = String(d.getDate()).padStart(2, "0"); return `${mm}/${dd}/${d.getFullYear()}`; } async function main(): Promise { const requestId = randomUUID(); const body = { request_id: requestId, customer_id: CUSTOMER, flock_input: { pickup_date: tomorrowMmDdYyyy(), pickup_zip: "90001", delivery_zip: "75201", pallet_count: 6, total_weight: { value: 10000, unit: "lb" }, dimensions: { length: 48, width: 40, height: 48, unit: "in" }, }, }; console.log(`[smoke-flock] POST ${BASE}/api/flock/quotes`); const createRes = await fetch(`${BASE}/api/flock/quotes`, { method: "POST", headers: { Authorization: `Bearer ${TOKEN}`, "X-Customer-Id": CUSTOMER, "Content-Type": "application/json", }, body: JSON.stringify(body), }); const created = (await createRes.json()) as { code: number; message?: string; data?: { quote_id: string }; }; if (created.code !== 0 || !created.data?.quote_id) { console.error("[smoke-flock] create FAIL", createRes.status, created); process.exit(1); } const quoteId = created.data.quote_id; console.log(`[smoke-flock] quote_id=${quoteId} polling…`); const deadline = Date.now() + 120_000; while (Date.now() < deadline) { const getRes = await fetch(`${BASE}/api/quotes/${quoteId}`, { headers: { Authorization: `Bearer ${TOKEN}`, "X-Customer-Id": CUSTOMER, }, }); const detail = (await getRes.json()) as { code: number; message?: string; data?: { status: string; error_message?: string; flock?: { lines?: Array<{ label: string; total: number }> }; }; }; if (detail.code !== 0 || !detail.data) { console.error("[smoke-flock] get FAIL", detail); process.exit(1); } const st = detail.data.status; if (st === "processing") { await new Promise((r) => setTimeout(r, 2000)); continue; } if (st === "done") { const lines = detail.data.flock?.lines ?? []; console.log( `[smoke-flock] OK lines=${lines.length} ` + lines.map((l) => `${l.label}:$${l.total}`).join(", "), ); if (lines.length < 1) process.exit(1); return; } console.error( `[smoke-flock] status=${st} ${detail.data.error_message ?? detail.message}`, ); process.exit(1); } console.error("[smoke-flock] timeout"); process.exit(1); } main().catch((e) => { console.error(e); process.exit(1); });