-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathdev-server.js
More file actions
117 lines (106 loc) · 4.36 KB
/
Copy pathdev-server.js
File metadata and controls
117 lines (106 loc) · 4.36 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* Standalone dev server — runs the Express + SQLite backend WITHOUT Electron.
* Mocks only the Electron APIs used by db.ts and server.ts.
* Usage: node dev-server.js
*/
// Load .env before anything else
const fs = require('fs');
const envPath = require('path').join(__dirname, '.env');
if (fs.existsSync(envPath)) {
for (const line of fs.readFileSync(envPath, 'utf8').split('\n')) {
const match = line.match(/^\s*([^#=\s]+)\s*=\s*(.*)$/);
if (!match) continue;
let value = match[2].trim();
if (value.startsWith('"') && value.endsWith('"')) {
try { value = JSON.parse(value); } catch { value = value.slice(1, -1); }
} else if (value.startsWith("'") && value.endsWith("'")) {
value = value.slice(1, -1);
} else {
value = value.replace(/\s+#.*$/, '').trim();
}
process.env[match[1]] = value;
}
console.log('[DevServer] Loaded .env');
}
const path = require('path');
const os = require('os');
// ── Mock Electron's `app` module ──────────────────────────────────────────────
const mockApp = {
isPackaged: false,
getPath: (name) => {
if (name === 'userData') return path.join(__dirname);
if (name === 'documents') return os.homedir();
return os.tmpdir();
},
getVersion: () => require('./package.json').version,
getName: () => 'Flo (dev)',
};
require('module').Module._resolveFilename = (function (original) {
return function (request, ...args) {
if (request === 'electron') {
return __filename; // will be intercepted below
}
return original.call(this, request, ...args);
};
})(require('module').Module._resolveFilename);
// Intercept `require('electron')` before any dist file loads it
const Module = require('module');
const originalLoad = Module._load;
Module._load = function (request, parent, isMain) {
if (request === 'electron') {
return {
app: mockApp,
// Stub anything else that might be imported at module level
BrowserWindow: class {},
ipcMain: { handle: () => {}, on: () => {} },
dialog: {},
shell: {},
Menu: { buildFromTemplate: () => ({}), setApplicationMenu: () => {} },
Tray: class {},
nativeImage: { createFromPath: () => ({ resize: () => ({}) }) },
};
}
return originalLoad.call(this, request, parent, isMain);
};
// ── Now load and start the compiled backend ───────────────────────────────────
const { initDatabase } = require('./dist/db');
const { closeDatabase } = require('./dist/db');
const { startServer, getServerPort } = require('./dist/server');
const { startKdsServer, stopKdsServer } = require('./dist/kds-server');
const { stopServer, getKdsPort } = require('./dist/kds-server');
let shuttingDown = false;
async function shutdown(exitCode = 0) {
if (shuttingDown) return;
shuttingDown = true;
try { await Promise.resolve(stopServer()); } catch (err) { console.error('[DevServer] Main server shutdown failed:', err); exitCode = 1; }
try { await Promise.resolve(stopKdsServer()); } catch (err) { console.error('[DevServer] KDS server shutdown failed:', err); exitCode = 1; }
try { closeDatabase(); } catch (err) { console.error('[DevServer] Database shutdown failed:', err); exitCode = 1; }
Module._load = originalLoad;
process.exit(exitCode);
}
process.once('SIGINT', () => void shutdown(0));
process.once('SIGTERM', () => void shutdown(0));
process.once('uncaughtException', (err) => {
console.error('[DevServer] Uncaught exception:', err);
void shutdown(1);
});
process.once('unhandledRejection', (err) => {
console.error('[DevServer] Unhandled rejection:', err);
void shutdown(1);
});
(async () => {
try {
console.log('[DevServer] Initializing database...');
initDatabase();
console.log('[DevServer] Starting Express server & KDS server...');
await startServer();
await startKdsServer();
console.log(`[DevServer] ✅ Main API running on http://localhost:${getServerPort()}`);
console.log(`[DevServer] ✅ KDS Server running on http://localhost:${getKdsPort()}`);
console.log('[DevServer] Frontend dev server: http://localhost:3000');
console.log('[DevServer] API health: http://localhost:3001/api/health');
} catch (err) {
console.error('[DevServer] Failed to start:', err);
await shutdown(1);
}
})();