ba8bfc3f46
User-facing - New post-login home (/home): chat rail + Share/Connect (embedded) + Meeting; login lives here when logged out - Landing: "Log in with BizGaze" + no-login screen share - Console replaced by a role-scoped Dashboard (/dashboard): admins see all team sessions, others see only their own; stats + CSV/PDF export - Recordings saved as MP4 (H.264/AAC) with WebM fallback; old .webm still downloadable - Fix: duplicate "Sign in" on the login card Auth / integration - BizGaze as identity provider: /api/login validates against BIZGAZE_LOGIN_URL (env-gated) and provisions a local user - Phase 2 start: /api/v1 alias for all /api routes; Authorization: Bearer accepted across HTTP + WS; login returns a token (for native desktop/mobile clients) Backend refactor (Phase 1, behavior-preserving) - Split server.js into config/lib/session/presence/routes/static/signaling + repos (data-access) + bizgaze (service) - All SQL behind repos.js, tenant-scoped (tenantId == team_id for now) - e2e updated to current flow (21/21 pass before and after) Docs: ARCHITECTURE.md (target architecture + phased plan), CLAUDE.md repo layout, .env.example BIZGAZE_LOGIN_URL Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
29 lines
733 B
JavaScript
29 lines
733 B
JavaScript
// Small HTTP helpers shared across the server.
|
|
const now = () => Date.now();
|
|
|
|
const json = (res, code, body) => {
|
|
res.writeHead(code, { 'Content-Type': 'application/json' });
|
|
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 };
|