forked from inertiajs/inertia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.ts
56 lines (44 loc) · 1.9 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { createServer, IncomingMessage } from 'http'
import * as process from 'process'
import { InertiaAppResponse, Page } from './types'
import cluster from 'node:cluster';
import { availableParallelism } from 'node:os';
type AppCallback = (page: Page) => InertiaAppResponse
type RouteHandler = (request: IncomingMessage) => Promise<unknown>
const readableToString: (readable: IncomingMessage) => Promise<string> = (readable) =>
new Promise((resolve, reject) => {
let data = ''
readable.on('data', (chunk) => (data += chunk))
readable.on('end', () => resolve(data))
readable.on('error', (err) => reject(err))
})
export default (render: AppCallback, port?: number, useCluster: boolean = false): void => {
const _port = port || 13714
const log = (message: string) => {
console.log(useCluster && !cluster.isPrimary ? `[${cluster.worker?.id ?? 'N/A'} / ${cluster.worker?.process?.pid ?? 'N/A'}] ${message}` : message)
}
if (useCluster && cluster.isPrimary) {
log('Primary Inertia SSR server process started...')
for (let i = 0; i < availableParallelism(); i++) {
cluster.fork()
}
return
}
const routes: Record<string, RouteHandler> = {
'/health': async () => ({ status: 'OK', timestamp: Date.now() }),
'/shutdown': () => process.exit(),
'/render': async (request) => render(JSON.parse(await readableToString(request))),
'/404': async () => ({ status: 'NOT_FOUND', timestamp: Date.now() }),
}
createServer(async (request, response) => {
const dispatchRoute = routes[<string>request.url] || routes['/404']
try {
response.writeHead(200, { 'Content-Type': 'application/json', Server: 'Inertia.js SSR' })
response.write(JSON.stringify(await dispatchRoute(request)))
} catch (e) {
console.error(e)
}
response.end()
}).listen(_port, () => log('Inertia SSR server started.'))
log(`Starting SSR server on port ${_port}...`)
}