48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
// server.ts
|
|
import https from 'https';
|
|
import fs from 'fs';
|
|
import { parse } from 'url';
|
|
import next from 'next';
|
|
import type { IncomingMessage, ServerResponse } from 'http';
|
|
|
|
const dev = process.env.NODE_ENV !== 'production';
|
|
const port = process.env.PORT ? parseInt(process.env.PORT) : 443;
|
|
const app = next({ dev });
|
|
const handle = app.getRequestHandler();
|
|
|
|
const cert = fs.readFileSync('./cert3.pem');
|
|
const key = fs.readFileSync('./privkey3.pem');
|
|
|
|
|
|
app.prepare().then(() => {
|
|
const server = https.createServer({ key, cert }, async (req: IncomingMessage, res: ServerResponse) => {
|
|
const parsedUrl = parse(req.url!, true);
|
|
|
|
// Optional: for CORS with /_next/webpack-hmr
|
|
if (req.url?.startsWith('/_next/webpack-hmr')) {
|
|
res.setHeader('Access-Control-Allow-Origin', 'https://wireless.psg.net.au');
|
|
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
|
|
}
|
|
|
|
try {
|
|
await handle(req, res, parsedUrl);
|
|
} catch (err) {
|
|
console.error('❌ Error handling request:', err);
|
|
res.statusCode = 500;
|
|
res.end('internal error');
|
|
}
|
|
});
|
|
|
|
// 🔥 THIS IS CRUCIAL
|
|
server.on('upgrade', (req, socket, head) => {
|
|
// Forward the upgrade request to Next.js' internal handler
|
|
// @ts-ignore - undocumented but works
|
|
(app as any).getRequestHandler()(req, socket, head);
|
|
});
|
|
|
|
|
|
server.listen(port, () => {
|
|
console.log(`✅ HTTPS dev server running at https://localhost:${port}`);
|
|
});
|
|
});
|