Files
tiennm99bot/renderer/scripts/api-smoke.js
T
tiennm99 97d8aeaadf feat(gacha): add /api/gacha wish animation rendered as MP4
A meteor coloured by rarity falls across a night sky, lands in a white
flash, and the label is revealed with its stars popping in. The caller
picks the result and rarity; the route only draws it. Renders as silent
H.264 so Telegram plays it as an animation without GIF banding, and
shares the render slots with /api/gif.
2026-10-01 11:43:42 +07:00

71 lines
1.7 KiB
JavaScript

import {buildServer} from '../src/server.js';
const config = {
apiToken: 'smoke-token',
host: '127.0.0.1',
maxConcurrentRenders: 1,
maxOptionChars: 40,
maxOptions: 32,
port: 0,
requiresApiToken: true,
renderTimeoutMs: 30000,
};
const app = await buildServer({config, warmRemotionBundle: true});
try {
const response = await app.inject({
method: 'POST',
url: '/api/gif',
headers: {
authorization: 'Bearer smoke-token',
},
payload: {
durationMs: 3000,
fps: 12,
holdMs: 500,
options: ['alice', 'bob', 'carol', 'dave'],
size: 384,
theme: 'classic',
winnerIndex: 2,
},
});
if (response.statusCode !== 200) {
throw new Error(`Expected 200, got ${response.statusCode}: ${response.body}`);
}
const magic = response.rawPayload.subarray(0, 6).toString();
if (magic !== 'GIF89a') {
throw new Error(`Expected GIF89a header, got ${magic}`);
}
if (response.headers['x-wheel-winner-index'] !== '2') {
throw new Error(`Expected winner index 2, got ${response.headers['x-wheel-winner-index']}`);
}
console.log(`api-smoke: ${response.rawPayload.byteLength} bytes`);
const gacha = await app.inject({
method: 'POST',
url: '/api/gacha',
headers: {
authorization: 'Bearer smoke-token',
},
payload: {label: 'Pizza', rarity: 5},
});
if (gacha.statusCode !== 200) {
throw new Error(`Expected gacha 200, got ${gacha.statusCode}: ${gacha.body}`);
}
const box = gacha.rawPayload.subarray(4, 8).toString();
if (box !== 'ftyp') {
throw new Error(`Expected MP4 ftyp box, got ${box}`);
}
console.log(`api-smoke gacha: ${gacha.rawPayload.byteLength} bytes`);
} finally {
await app.close();
}