77606da2c9
Brought up the real UHPPOTE controller (serial 225088491, fw 09120) end to end and recorded a procurement-level blocker. Verified on hardware: - discovery (LAN scan), host-commanded openDoor on doors 1 & 2 (physically actuated; reason="remote open door"), and live button capture (reason="push button ok"). Driver/networking fixes (packages/devices/src/drivers/access-uhppote.ts): - broadcast to subnet-directed address (lib doesn't enable SO_BROADCAST for the global 255.255.255.255 -> EACCES); - Config broadcast must match the target's subnet for unicast reply routing (fixes the health-check timeout: 5s -> 24ms ready); - discover across all local subnets, dedupe by serial; - serialize all controller I/O (concurrent calls collided on UDP :60001). Server/UX: - load .env via node --env-file-if-exists (vars weren't being read before); - SETUP_AUTH_BYPASS hardened: env-gated, dev + loopback only, fails closed otherwise; surfaced as catalog.authBypass so the wizard drops the token field; - .env.example documents all vars; inline favicon stops a 404. - apps/server/scripts/: uhppote-listen (live events, restores prior listener) and uhppote-relay (guarded door-open test). BLOCKER (wiki/decisions/access-controller-button-flow.md): the controller's push-button input auto-opens the relay in firmware with no report-without-open mode, so ticket-first entry (button -> print -> open, fail-closed) is impossible as wired. UHPPOTE can't do it on that input; ZKTeco *might* via a programmable aux input + PULL SDK but that's unverified and needs a new driver. Entry-lane hardware decision paused to focus on the business side. wiki: access-controller-button-flow (blocker), zkteco-controller (stub + assessment), uhppote-controller callout, index + log.
31 lines
794 B
JSON
31 lines
794 B
JSON
{
|
|
"name": "@parking/server",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"build": "tsc -b",
|
|
"dev": "node --env-file-if-exists=.env --watch --experimental-strip-types src/index.ts",
|
|
"start": "node --env-file-if-exists=.env dist/index.js",
|
|
"typecheck": "tsc --noEmit",
|
|
"lint": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@fastify/cors": "11.2.0",
|
|
"@fastify/jwt": "10.1.0",
|
|
"@fastify/static": "9.1.3",
|
|
"@parking/db": "workspace:*",
|
|
"@parking/devices": "workspace:*",
|
|
"@parking/shared": "workspace:*",
|
|
"bcrypt": "6.0.0",
|
|
"fastify": "5.8.5",
|
|
"fastify-plugin": "6.0.0",
|
|
"uhppoted": "0.9.0"
|
|
},
|
|
"devDependencies": {
|
|
"@types/bcrypt": "6.0.0",
|
|
"@types/node": "25.9.3",
|
|
"typescript": "6.0.3"
|
|
}
|
|
}
|