-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
85 lines (72 loc) · 3.62 KB
/
server.js
File metadata and controls
85 lines (72 loc) · 3.62 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
require('ts-node/register/transpile-only');
// Load .env.local in development (Vite handles this for the frontend automatically)
require('dotenv').config({ path: '.env.local' });
// ─── Module imports (topological order — no cycles) ───────────────────────────
const { checkEnv } = require('./server/startup');
const { registerMiddleware } = require('./server/middleware');
const { setupWebSocket } = require('./server/drone-ws');
const { setupSignalingWebSocket }= require('./server/signal-ws');
const { setupMissionWebSocket,
sendCommandToController,
broadcastMission } = require('./server/mission-ws');
const { createNms } = require('./server/rtmp');
const { startStream, stopStream,
createStreamRoutes } = require('./server/streams');
const { orchestrator,
ensureDroneReady,
createDroneRoutes } = require('./server/drone');
const { sendPushToAllSubscribed }= require('./server/notifications');
// Route factories
const { createStripeWebhookRoutes } = require('./server/routes/stripe-webhook');
const { createSignalRoutes } = require('./server/routes/signal');
const { createHealthRoutes } = require('./server/routes/health');
const { createUserSettingsRoutes } = require('./server/routes/user-settings');
const { createPushRoutes } = require('./server/routes/push');
const { createMotionWebhookRoutes } = require('./server/routes/motion-webhook');
const { createDeviceRoutes } = require('./server/routes/devices');
const { createAuditRoutes } = require('./server/routes/audit');
const { createBillingRoutes } = require('./server/routes/billing');
const { createStaticRoutes } = require('./server/routes/static');
checkEnv();
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
// ─── Route registration order matters ─────────────────────────────────────────
// 1. Stripe webhook MUST be registered before express.json() (requires raw body)
createStripeWebhookRoutes(app);
// 2. express.json() + security headers (all other routes need this)
registerMiddleware(app);
// 3. All routes
createSignalRoutes(app);
createHealthRoutes(app);
createStreamRoutes(app); // /api/streams, /api/thermal/*, /streams static serve
createDroneRoutes(app, { sendCommandToController });
// triggerDroneLaunch is a closure here to avoid motion-webhook → drone → mission-ws cycle
createMotionWebhookRoutes(app, {
triggerDroneLaunch: async (event, correlationId) => {
await ensureDroneReady();
await orchestrator.handleThreat({
id: correlationId,
location: { latitude: event.location.lat, longitude: event.location.lng },
snapshotUrl: event.snapshot_url,
threatLevel: event.threat_level,
});
},
sendPushToAllSubscribed,
});
createUserSettingsRoutes(app);
createPushRoutes(app);
createDeviceRoutes(app);
createAuditRoutes(app);
createBillingRoutes(app);
createStaticRoutes(app); // MUST be last — SPA fallback catches all unmatched paths
// ─── HTTP server + WebSockets + RTMP ─────────────────────────────────────────
const server = app.listen(port, () => {
console.log(`Server running on port ${port}`);
});
setupWebSocket(server);
setupSignalingWebSocket(server);
setupMissionWebSocket(server);
const nms = createNms({ startStream, stopStream, broadcastMission });
nms.run();
console.log('[RTMP] Ingest listening on port 1935');