You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

30 lines
1.3 KiB

// Custom production server: wraps adapter-node's generated request handler in
// a plain http.Server so we can also intercept WebSocket upgrade requests,
// which SvelteKit itself has no hook for (see src/lib/server/core/ws-handler.ts).
//
// `.env` is not auto-loaded here (SvelteKit's own adapter-node doesn't in
// production either) — run with `node --env-file=.env server.js` locally, or
// provide OPENAI_API_KEY / REALTIME_TOKEN_SECRET via your deployment's real
// secret mechanism.
import { createServer } from 'node:http';
import { handler } from './build/handler.js';
import { DEFAULT_SESSION_DEFAULTS } from './build-server/server/core/defaults.js';
import { OpenAiRealtimeProvider } from './build-server/server/core/providers/openai.js';
import { handleRealtimeUpgrade } from './build-server/server/core/ws-handler.js';
const apiKey = process.env.OPENAI_API_KEY;
if (!apiKey) {
throw new Error('OPENAI_API_KEY is not set. See .env.example.');
}
const provider = new OpenAiRealtimeProvider({ apiKey });
const server = createServer(handler);
server.on('upgrade', (req, socket, head) => {
handleRealtimeUpgrade(req, socket, head, { provider, defaults: DEFAULT_SESSION_DEFAULTS });
});
const port = process.env.PORT ? Number(process.env.PORT) : 3000;
server.listen(port, () => {
console.log(`listening on port ${port}`);
});