a427be9b6f
Prevents a 404 (e.g. /manifest.json fetched before deploy) from being cached on a device and persisting after the file exists — the cause of the manifest 404 on mobile but not desktop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
31 lines
952 B
JavaScript
31 lines
952 B
JavaScript
// Small HTTP helpers shared across the server.
|
|
const now = () => Date.now();
|
|
|
|
const json = (res, code, body) => {
|
|
// no-store: API/JSON responses (and 404s) must never be cached — a cached 404 for an asset
|
|
// like /manifest.json would otherwise persist on a device even after the file is deployed.
|
|
res.writeHead(code, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
|
|
res.end(JSON.stringify(body));
|
|
};
|
|
|
|
function readBody(req) {
|
|
return new Promise((resolve) => {
|
|
let data = '';
|
|
req.on('data', (c) => (data += c));
|
|
req.on('end', () => {
|
|
try { resolve(data ? JSON.parse(data) : {}); } catch { resolve({}); }
|
|
});
|
|
});
|
|
}
|
|
|
|
function parseCookies(req) {
|
|
const out = {};
|
|
(req.headers.cookie || '').split(';').forEach((c) => {
|
|
const [k, ...v] = c.trim().split('=');
|
|
if (k) out[k] = decodeURIComponent(v.join('='));
|
|
});
|
|
return out;
|
|
}
|
|
|
|
module.exports = { now, json, readBody, parseCookies };
|