fix(03): WR-05 use resolved realpath for direct-run guard
This commit is contained in:
+23
-1
@@ -1,3 +1,5 @@
|
|||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
|
import { realpathSync } from 'node:fs'
|
||||||
import { serve } from '@hono/node-server'
|
import { serve } from '@hono/node-server'
|
||||||
import { serveStatic } from '@hono/node-server/serve-static'
|
import { serveStatic } from '@hono/node-server/serve-static'
|
||||||
import { Hono } from 'hono'
|
import { Hono } from 'hono'
|
||||||
@@ -75,8 +77,28 @@ startOutboxWorker()
|
|||||||
app.use('/*', serveStatic({ root: './public' }))
|
app.use('/*', serveStatic({ root: './public' }))
|
||||||
app.get('*', serveStatic({ path: './public/index.html' }))
|
app.get('*', serveStatic({ path: './public/index.html' }))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True only when this module is the process entrypoint (run directly), not when it
|
||||||
|
* is imported (e.g. by route tests that import `app`).
|
||||||
|
*
|
||||||
|
* WR-05: the previous basename-tail comparison
|
||||||
|
* import.meta.url.endsWith(process.argv[1].replace(/^.*\//, ''))
|
||||||
|
* was fragile — a symlinked entrypoint or a differently-located file sharing the same
|
||||||
|
* basename could make it mis-fire (start the server during an unrelated import, or fail
|
||||||
|
* to start it in production). Compare fully-resolved real paths instead. realpathSync
|
||||||
|
* resolves symlinks on argv[1]; fileURLToPath turns the module URL into a real path.
|
||||||
|
*/
|
||||||
|
function isMainModule(): boolean {
|
||||||
|
if (!process.argv[1]) return false
|
||||||
|
try {
|
||||||
|
return fileURLToPath(import.meta.url) === realpathSync(process.argv[1])
|
||||||
|
} catch {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Only start the HTTP server when this module is run directly (not imported in tests)
|
// Only start the HTTP server when this module is run directly (not imported in tests)
|
||||||
if (process.argv[1] && import.meta.url.endsWith(process.argv[1].replace(/^.*\//, ''))) {
|
if (isMainModule()) {
|
||||||
serve({ fetch: app.fetch, port: 3000 }, (info) => {
|
serve({ fetch: app.fetch, port: 3000 }, (info) => {
|
||||||
console.log(`FamilySync API running on http://localhost:${info.port}`)
|
console.log(`FamilySync API running on http://localhost:${info.port}`)
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user