@jetstart/core 1.1.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +10 -1
- package/dist/server/index.js.map +1 -1
- package/dist/utils/logger.d.ts +6 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +37 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/session.d.ts +1 -0
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +18 -3
- package/dist/utils/session.js.map +1 -1
- package/dist/websocket/handler.d.ts +1 -1
- package/dist/websocket/handler.d.ts.map +1 -1
- package/dist/websocket/handler.js +7 -5
- package/dist/websocket/handler.js.map +1 -1
- package/dist/websocket/manager.d.ts +17 -1
- package/dist/websocket/manager.d.ts.map +1 -1
- package/dist/websocket/manager.js +58 -10
- package/dist/websocket/manager.js.map +1 -1
- package/package.json +2 -2
- package/src/server/index.ts +10 -1
- package/src/utils/logger.ts +42 -6
- package/src/utils/session.ts +19 -2
- package/src/websocket/handler.ts +8 -5
- package/src/websocket/manager.ts +69 -12
package/dist/server/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Main Server Entry Point
|
|
3
3
|
* Starts HTTP and WebSocket servers
|
|
4
4
|
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
5
6
|
import { ServerSession } from '../types';
|
|
6
7
|
export interface ServerConfig {
|
|
7
8
|
httpPort?: number;
|
|
@@ -11,7 +12,7 @@ export interface ServerConfig {
|
|
|
11
12
|
projectPath?: string;
|
|
12
13
|
projectName?: string;
|
|
13
14
|
}
|
|
14
|
-
export declare class JetStartServer {
|
|
15
|
+
export declare class JetStartServer extends EventEmitter {
|
|
15
16
|
private httpServer;
|
|
16
17
|
private wsServer;
|
|
17
18
|
private wsHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,MAAM,CAAmD;IACjE,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,MAAM,GAAE,YAAiB;IAsB/B,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAiF/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,UAAU,IAAI,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,mBAAmB;YAuCb,aAAa;IAwC3B;;OAEG;IACH,OAAO,CAAC,cAAc;CAiCvB"}
|
package/dist/server/index.js
CHANGED
|
@@ -40,6 +40,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
40
40
|
exports.JetStartServer = void 0;
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const os = __importStar(require("os"));
|
|
43
|
+
const events_1 = require("events");
|
|
43
44
|
const http_1 = require("./http");
|
|
44
45
|
const websocket_1 = require("../websocket");
|
|
45
46
|
const logger_1 = require("../utils/logger");
|
|
@@ -48,7 +49,7 @@ const session_1 = require("../utils/session");
|
|
|
48
49
|
const build_1 = require("../build");
|
|
49
50
|
const dsl_parser_1 = require("../build/dsl-parser");
|
|
50
51
|
const gradle_injector_1 = require("../build/gradle-injector");
|
|
51
|
-
class JetStartServer {
|
|
52
|
+
class JetStartServer extends events_1.EventEmitter {
|
|
52
53
|
httpServer;
|
|
53
54
|
wsServer;
|
|
54
55
|
wsHandler = null;
|
|
@@ -59,6 +60,7 @@ class JetStartServer {
|
|
|
59
60
|
buildMutex = false; // Prevent concurrent builds
|
|
60
61
|
latestApkPath = null; // Store latest built APK path
|
|
61
62
|
constructor(config = {}) {
|
|
63
|
+
super();
|
|
62
64
|
const bindHost = config.host || '0.0.0.0';
|
|
63
65
|
const displayHost = config.displayHost || bindHost;
|
|
64
66
|
this.config = {
|
|
@@ -168,6 +170,8 @@ class JetStartServer {
|
|
|
168
170
|
if (this.wsHandler && this.currentSession) {
|
|
169
171
|
this.wsHandler.sendBuildStart(this.currentSession.id);
|
|
170
172
|
}
|
|
173
|
+
// Re-emit for external listeners (e.g., dev command)
|
|
174
|
+
this.emit('build:start');
|
|
171
175
|
});
|
|
172
176
|
this.buildService.on('build:complete', (result) => {
|
|
173
177
|
(0, logger_1.success)(`Build completed in ${result.buildTime}ms`);
|
|
@@ -179,14 +183,19 @@ class JetStartServer {
|
|
|
179
183
|
this.wsHandler.sendBuildComplete(this.currentSession.id, downloadUrl);
|
|
180
184
|
(0, logger_1.log)(`APK download URL: ${downloadUrl}`);
|
|
181
185
|
}
|
|
186
|
+
// Re-emit for external listeners (e.g., dev command) with result
|
|
187
|
+
this.emit('build:complete', result);
|
|
182
188
|
});
|
|
183
189
|
this.buildService.on('build:error', (errorMsg, details) => {
|
|
184
190
|
(0, logger_1.error)(`Build failed: ${errorMsg}`);
|
|
185
191
|
// TODO: Send build-error message via WebSocket
|
|
192
|
+
// Re-emit for external listeners
|
|
193
|
+
this.emit('build:error', errorMsg, details);
|
|
186
194
|
});
|
|
187
195
|
this.buildService.on('watch:change', (files) => {
|
|
188
196
|
// This event is just for logging/monitoring
|
|
189
197
|
// Actual build logic is handled in startWatching callback
|
|
198
|
+
this.emit('watch:change', files);
|
|
190
199
|
});
|
|
191
200
|
}
|
|
192
201
|
async handleRebuild() {
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,2CAA6B;AAC7B,uCAAyB;AACzB,iCAA0C;AAC1C,4CAAqD;AAErD,4CAAsD;AACtD,6CAAsE;AACtE,8CAAkD;AAClD,oCAAwC;AAExC,oDAAgD;AAChD,8DAAmE;AAWnE,MAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logger Utility
|
|
3
|
-
* Colored logging for Core
|
|
3
|
+
* Colored logging for Core with log level support
|
|
4
|
+
*
|
|
5
|
+
* Environment Variables:
|
|
6
|
+
* - JETSTART_LOG_LEVEL: error | warn | info | debug (default: info)
|
|
7
|
+
* - DEBUG: Set to enable all debug logs
|
|
4
8
|
*/
|
|
5
9
|
export declare function log(message: string): void;
|
|
6
10
|
export declare function success(message: string): void;
|
|
7
11
|
export declare function error(message: string): void;
|
|
8
12
|
export declare function warn(message: string): void;
|
|
9
13
|
export declare function debug(message: string): void;
|
|
14
|
+
export declare function verbose(message: string): void;
|
|
10
15
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAIlC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAItC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAIpC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAInC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAIpC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAGtC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Logger Utility
|
|
4
|
-
* Colored logging for Core
|
|
4
|
+
* Colored logging for Core with log level support
|
|
5
|
+
*
|
|
6
|
+
* Environment Variables:
|
|
7
|
+
* - JETSTART_LOG_LEVEL: error | warn | info | debug (default: info)
|
|
8
|
+
* - DEBUG: Set to enable all debug logs
|
|
5
9
|
*/
|
|
6
10
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
11
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -12,22 +16,49 @@ exports.success = success;
|
|
|
12
16
|
exports.error = error;
|
|
13
17
|
exports.warn = warn;
|
|
14
18
|
exports.debug = debug;
|
|
19
|
+
exports.verbose = verbose;
|
|
15
20
|
const chalk_1 = __importDefault(require("chalk"));
|
|
21
|
+
const LOG_LEVELS = {
|
|
22
|
+
error: 0,
|
|
23
|
+
warn: 1,
|
|
24
|
+
info: 2,
|
|
25
|
+
debug: 3,
|
|
26
|
+
};
|
|
27
|
+
function getLogLevel() {
|
|
28
|
+
const level = process.env.JETSTART_LOG_LEVEL?.toLowerCase();
|
|
29
|
+
return LOG_LEVELS[level] !== undefined ? level : 'info';
|
|
30
|
+
}
|
|
31
|
+
function shouldLog(level) {
|
|
32
|
+
const currentLevel = getLogLevel();
|
|
33
|
+
return LOG_LEVELS[level] <= LOG_LEVELS[currentLevel];
|
|
34
|
+
}
|
|
16
35
|
function log(message) {
|
|
17
|
-
|
|
36
|
+
if (shouldLog('info')) {
|
|
37
|
+
console.log(chalk_1.default.cyan('[Core]'), message);
|
|
38
|
+
}
|
|
18
39
|
}
|
|
19
40
|
function success(message) {
|
|
20
|
-
|
|
41
|
+
if (shouldLog('info')) {
|
|
42
|
+
console.log(chalk_1.default.green('✔'), chalk_1.default.cyan('[Core]'), message);
|
|
43
|
+
}
|
|
21
44
|
}
|
|
22
45
|
function error(message) {
|
|
23
|
-
|
|
46
|
+
if (shouldLog('error')) {
|
|
47
|
+
console.error(chalk_1.default.red('✖'), chalk_1.default.cyan('[Core]'), message);
|
|
48
|
+
}
|
|
24
49
|
}
|
|
25
50
|
function warn(message) {
|
|
26
|
-
|
|
51
|
+
if (shouldLog('warn')) {
|
|
52
|
+
console.log(chalk_1.default.yellow('⚠'), chalk_1.default.cyan('[Core]'), message);
|
|
53
|
+
}
|
|
27
54
|
}
|
|
28
55
|
function debug(message) {
|
|
29
|
-
if (process.env.DEBUG) {
|
|
56
|
+
if (process.env.DEBUG || shouldLog('debug')) {
|
|
30
57
|
console.log(chalk_1.default.gray('[DEBUG]'), chalk_1.default.cyan('[Core]'), message);
|
|
31
58
|
}
|
|
32
59
|
}
|
|
60
|
+
function verbose(message) {
|
|
61
|
+
// Only log if DEBUG is set or log level is debug
|
|
62
|
+
debug(message);
|
|
63
|
+
}
|
|
33
64
|
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;AAuBH,kBAIC;AAED,0BAIC;AAED,sBAIC;AAED,oBAIC;AAED,sBAIC;AAED,0BAGC;AAtDD,kDAA0B;AAI1B,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,EAAc,CAAC;IACxE,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC;IACnC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,GAAG,CAAC,OAAe;IACjC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,OAAe;IACnC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAgB,IAAI,CAAC,OAAe;IAClC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAgB,KAAK,CAAC,OAAe;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe;IACrC,iDAAiD;IACjD,KAAK,CAAC,OAAO,CAAC,CAAC;AACjB,CAAC"}
|
package/dist/utils/session.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAyC;IAEnD,aAAa,CAAC,IAAI,EAAE;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,aAAa,CAAC;IAc1B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC,sBAAsB,IAAI,IAAI;IAU9B,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAyC;IAEnD,aAAa,CAAC,IAAI,EAAE;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,aAAa,CAAC;IAc1B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOvC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC,sBAAsB,IAAI,IAAI;IAU9B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,aAAa;CAStB"}
|
package/dist/utils/session.js
CHANGED
|
@@ -5,13 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.SessionManager = void 0;
|
|
8
|
-
const uuid_1 = require("uuid");
|
|
9
8
|
const shared_1 = require("@jetstart/shared");
|
|
10
9
|
class SessionManager {
|
|
11
10
|
sessions = new Map();
|
|
12
11
|
async createSession(data) {
|
|
13
12
|
const session = {
|
|
14
|
-
id:
|
|
13
|
+
id: this.generateShortId(),
|
|
15
14
|
token: this.generateToken(),
|
|
16
15
|
projectName: data.projectName,
|
|
17
16
|
projectPath: data.projectPath,
|
|
@@ -41,8 +40,24 @@ class SessionManager {
|
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
}
|
|
43
|
+
generateShortId() {
|
|
44
|
+
// Generate a short random ID (8 chars) for QR code efficiency
|
|
45
|
+
// Use base62 (alphanumeric) for better QR code density
|
|
46
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
47
|
+
let result = '';
|
|
48
|
+
for (let i = 0; i < 8; i++) {
|
|
49
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
44
53
|
generateToken() {
|
|
45
|
-
|
|
54
|
+
// Generate a short random token (12 chars) for QR code efficiency
|
|
55
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
56
|
+
let result = '';
|
|
57
|
+
for (let i = 0; i < 12; i++) {
|
|
58
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
46
61
|
}
|
|
47
62
|
}
|
|
48
63
|
exports.SessionManager = SessionManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,6CAAwD;AAExD,MAAa,cAAc;IACjB,QAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEzD,KAAK,CAAC,aAAa,CAAC,IAGnB;QACC,MAAM,OAAO,GAAkB;YAC7B,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE;YAC1B,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,sBAAsB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACpD,IAAI,GAAG,GAAG,OAAO,CAAC,YAAY,GAAG,6BAAoB,EAAE,CAAC;gBACtD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,8DAA8D;QAC9D,uDAAuD;QACvD,MAAM,KAAK,GAAG,gEAAgE,CAAC;QAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa;QACnB,kEAAkE;QAClE,MAAM,KAAK,GAAG,gEAAgE,CAAC;QAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAjED,wCAiEC"}
|
|
@@ -17,7 +17,7 @@ export declare class WebSocketHandler {
|
|
|
17
17
|
sendBuildStart(sessionId: string): void;
|
|
18
18
|
sendBuildComplete(sessionId: string, apkUrl: string): void;
|
|
19
19
|
/**
|
|
20
|
-
* Send UI update (DSL-based hot reload)
|
|
20
|
+
* Send UI update (DSL-based hot reload) - SECURE, session-isolated
|
|
21
21
|
*/
|
|
22
22
|
sendUIUpdate(sessionId: string, dslContent: string, screens?: string[]): void;
|
|
23
23
|
private generateHash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/websocket/handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,iBAAiB;IAH3B,OAAO,CAAC,iBAAiB,CAAC,CAA8B;gBAG9C,iBAAiB,EAAE,iBAAiB,EAC5C,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAK/D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAenD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/websocket/handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,iBAAiB;IAH3B,OAAO,CAAC,iBAAiB,CAAC,CAA8B;gBAG9C,iBAAiB,EAAE,iBAAiB,EAC5C,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAK/D,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAenD,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,gBAAgB;IAKxB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUvC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAqB1D;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAe7E,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -50,6 +50,8 @@ class WebSocketHandler {
|
|
|
50
50
|
}
|
|
51
51
|
handleConnect(clientId, message) {
|
|
52
52
|
(0, logger_1.log)(`Client connecting with session: ${message.sessionId}`);
|
|
53
|
+
// Associate this client with the session for isolation
|
|
54
|
+
this.connectionManager.setClientSession(clientId, message.sessionId);
|
|
53
55
|
// Send connected confirmation
|
|
54
56
|
const response = {
|
|
55
57
|
type: 'core:connected',
|
|
@@ -74,7 +76,7 @@ class WebSocketHandler {
|
|
|
74
76
|
timestamp: Date.now(),
|
|
75
77
|
sessionId,
|
|
76
78
|
};
|
|
77
|
-
this.connectionManager.
|
|
79
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
78
80
|
}
|
|
79
81
|
sendBuildComplete(sessionId, apkUrl) {
|
|
80
82
|
const message = {
|
|
@@ -93,10 +95,10 @@ class WebSocketHandler {
|
|
|
93
95
|
},
|
|
94
96
|
downloadUrl: apkUrl,
|
|
95
97
|
};
|
|
96
|
-
this.connectionManager.
|
|
98
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
97
99
|
}
|
|
98
100
|
/**
|
|
99
|
-
* Send UI update (DSL-based hot reload)
|
|
101
|
+
* Send UI update (DSL-based hot reload) - SECURE, session-isolated
|
|
100
102
|
*/
|
|
101
103
|
sendUIUpdate(sessionId, dslContent, screens) {
|
|
102
104
|
const message = {
|
|
@@ -107,9 +109,9 @@ class WebSocketHandler {
|
|
|
107
109
|
screens,
|
|
108
110
|
hash: this.generateHash(dslContent),
|
|
109
111
|
};
|
|
110
|
-
(0, logger_1.log)(`Sending UI update: ${dslContent.length} bytes`);
|
|
112
|
+
(0, logger_1.log)(`Sending UI update to session ${sessionId}: ${dslContent.length} bytes`);
|
|
111
113
|
(0, logger_1.log)(`DSL Content: ${dslContent}`);
|
|
112
|
-
this.connectionManager.
|
|
114
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
113
115
|
}
|
|
114
116
|
generateHash(content) {
|
|
115
117
|
// Simple hash for caching (in production, use crypto.createHash)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/websocket/handler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAWH,4CAAyD;AAEzD,MAAa,gBAAgB;IAIjB;IAHF,iBAAiB,CAA+B;IAExD,YACU,iBAAoC,EAC5C,OAA6D;QADrD,sBAAiB,GAAjB,iBAAiB,CAAmB;QAG5C,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,CAAC;IACtD,CAAC;IAED,aAAa,CAAC,QAAgB,EAAE,IAAY;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,IAAA,YAAG,EAAC,yBAAyB,QAAQ,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1D,8BAA8B;YAC9B,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;QAEH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAA,cAAQ,EAAC,gCAAgC,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAkB;QACxC,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAEO,mBAAmB,CAAC,QAAgB,EAAE,OAAsB;QAClE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,gBAAgB;gBACnB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,eAAe;gBAClB,IAAA,YAAG,EAAC,UAAU,QAAQ,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,YAAY;gBACf,0BAA0B;gBAC1B,MAAM;YACR,KAAK,kBAAkB;gBACrB,uBAAuB;gBACvB,MAAM;YACR,KAAK,mBAAmB;gBACtB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACzC,MAAM;QACV,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,OAAmD;QACzF,IAAA,YAAG,EAAC,mCAAmC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAE5D,8BAA8B;QAC9B,MAAM,QAAQ,GAAyB;YACrC,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,WAAW,EAAE,aAAa,EAAE,2CAA2C;SACxE,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAExD,uCAAuC;QACvC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAA,YAAG,EAAC,yCAAyC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAgB,EAAE,OAAsD;QAC/F,IAAA,YAAG,EAAC,yBAAyB,OAAO,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,2BAA2B;IAC3B,cAAc,CAAC,SAAiB;QAC9B,MAAM,OAAO,GAA0B;YACrC,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;SACV,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/websocket/handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Connection Manager
|
|
3
|
-
* Manages WebSocket connections
|
|
3
|
+
* Manages WebSocket connections with session isolation
|
|
4
4
|
*/
|
|
5
5
|
import { WebSocket } from 'ws';
|
|
6
6
|
import { CoreMessage } from '@jetstart/shared';
|
|
@@ -9,8 +9,24 @@ export declare class ConnectionManager {
|
|
|
9
9
|
addConnection(ws: WebSocket): string;
|
|
10
10
|
removeConnection(id: string): void;
|
|
11
11
|
getConnection(id: string): WebSocket | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Associate a client with a session for isolation
|
|
14
|
+
*/
|
|
15
|
+
setClientSession(clientId: string, sessionId: string): void;
|
|
12
16
|
sendToClient(clientId: string, message: CoreMessage): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Broadcast to all clients (UNSAFE - use broadcastToSession instead)
|
|
19
|
+
* @deprecated Use broadcastToSession for session isolation
|
|
20
|
+
*/
|
|
13
21
|
broadcast(message: CoreMessage): void;
|
|
22
|
+
/**
|
|
23
|
+
* Broadcast to all clients in a specific session (SECURE)
|
|
24
|
+
*/
|
|
25
|
+
broadcastToSession(sessionId: string, message: CoreMessage): void;
|
|
26
|
+
/**
|
|
27
|
+
* Broadcast to ALL clients regardless of session (use with caution)
|
|
28
|
+
*/
|
|
29
|
+
private broadcastToAll;
|
|
14
30
|
getConnectionCount(): number;
|
|
15
31
|
}
|
|
16
32
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/websocket/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/websocket/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAA4C;IAE/D,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM;IAMpC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIlC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIhD;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAU3D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO;IAgB7D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKrC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAwBjE;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB,kBAAkB,IAAI,MAAM;CAG7B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Connection Manager
|
|
4
|
-
* Manages WebSocket connections
|
|
4
|
+
* Manages WebSocket connections with session isolation
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.ConnectionManager = void 0;
|
|
@@ -11,22 +11,34 @@ class ConnectionManager {
|
|
|
11
11
|
connections = new Map();
|
|
12
12
|
addConnection(ws) {
|
|
13
13
|
const id = (0, uuid_1.v4)();
|
|
14
|
-
this.connections.set(id, ws);
|
|
14
|
+
this.connections.set(id, { ws, sessionId: undefined });
|
|
15
15
|
return id;
|
|
16
16
|
}
|
|
17
17
|
removeConnection(id) {
|
|
18
18
|
this.connections.delete(id);
|
|
19
19
|
}
|
|
20
20
|
getConnection(id) {
|
|
21
|
-
return this.connections.get(id);
|
|
21
|
+
return this.connections.get(id)?.ws;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Associate a client with a session for isolation
|
|
25
|
+
*/
|
|
26
|
+
setClientSession(clientId, sessionId) {
|
|
27
|
+
const connection = this.connections.get(clientId);
|
|
28
|
+
if (connection) {
|
|
29
|
+
connection.sessionId = sessionId;
|
|
30
|
+
if (process.env.DEBUG) {
|
|
31
|
+
console.log(`[ConnectionManager] Client ${clientId} joined session ${sessionId}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
22
34
|
}
|
|
23
35
|
sendToClient(clientId, message) {
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
36
|
+
const connection = this.connections.get(clientId);
|
|
37
|
+
if (!connection || connection.ws.readyState !== ws_1.WebSocket.OPEN) {
|
|
26
38
|
return false;
|
|
27
39
|
}
|
|
28
40
|
try {
|
|
29
|
-
ws.send(JSON.stringify(message));
|
|
41
|
+
connection.ws.send(JSON.stringify(message));
|
|
30
42
|
return true;
|
|
31
43
|
}
|
|
32
44
|
catch (err) {
|
|
@@ -34,14 +46,50 @@ class ConnectionManager {
|
|
|
34
46
|
return false;
|
|
35
47
|
}
|
|
36
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Broadcast to all clients (UNSAFE - use broadcastToSession instead)
|
|
51
|
+
* @deprecated Use broadcastToSession for session isolation
|
|
52
|
+
*/
|
|
37
53
|
broadcast(message) {
|
|
54
|
+
console.warn('[ConnectionManager] WARNING: Using unsafe broadcast() - use broadcastToSession() instead');
|
|
55
|
+
this.broadcastToAll(message);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Broadcast to all clients in a specific session (SECURE)
|
|
59
|
+
*/
|
|
60
|
+
broadcastToSession(sessionId, message) {
|
|
61
|
+
const data = JSON.stringify(message);
|
|
62
|
+
let sentCount = 0;
|
|
63
|
+
this.connections.forEach((connection, clientId) => {
|
|
64
|
+
// Only send to clients in the same session
|
|
65
|
+
if (connection.sessionId === sessionId && connection.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
66
|
+
try {
|
|
67
|
+
connection.ws.send(data);
|
|
68
|
+
sentCount++;
|
|
69
|
+
if (process.env.DEBUG) {
|
|
70
|
+
console.log(`[ConnectionManager] Sent ${message.type} to client ${clientId} in session ${sessionId.slice(0, 8)}...`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error(`Failed to send to ${clientId}:`, err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
if (process.env.DEBUG) {
|
|
79
|
+
console.log(`[ConnectionManager] Broadcasted ${message.type} to ${sentCount} clients in session ${sessionId.slice(0, 8)}...`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Broadcast to ALL clients regardless of session (use with caution)
|
|
84
|
+
*/
|
|
85
|
+
broadcastToAll(message) {
|
|
38
86
|
const data = JSON.stringify(message);
|
|
39
|
-
const connectionCount = Array.from(this.connections.values()).filter(
|
|
87
|
+
const connectionCount = Array.from(this.connections.values()).filter(c => c.ws.readyState === ws_1.WebSocket.OPEN).length;
|
|
40
88
|
console.log(`[ConnectionManager] Broadcasting ${message.type} to ${connectionCount} connected clients`);
|
|
41
|
-
this.connections.forEach((
|
|
42
|
-
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
89
|
+
this.connections.forEach((connection, clientId) => {
|
|
90
|
+
if (connection.ws.readyState === ws_1.WebSocket.OPEN) {
|
|
43
91
|
try {
|
|
44
|
-
ws.send(data);
|
|
92
|
+
connection.ws.send(data);
|
|
45
93
|
console.log(`[ConnectionManager] Sent ${message.type} to client ${clientId}`);
|
|
46
94
|
}
|
|
47
95
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/websocket/manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,2BAA+B;AAC/B,+BAAoC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/websocket/manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jetstart/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Build server and orchestration for JetStart",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"homepage": "https://github.com/dev-phantom/jetstart#readme",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@jetstart/shared": "^1.
|
|
36
|
+
"@jetstart/shared": "^1.4.0",
|
|
37
37
|
"express": "^4.18.2",
|
|
38
38
|
"ws": "^8.14.2",
|
|
39
39
|
"chokidar": "^3.5.3",
|
package/src/server/index.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
import * as os from 'os';
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
8
9
|
import { createHttpServer } from './http';
|
|
9
10
|
import { createWebSocketServer } from '../websocket';
|
|
10
11
|
import { WebSocketHandler } from '../websocket/handler';
|
|
@@ -25,7 +26,7 @@ export interface ServerConfig {
|
|
|
25
26
|
projectName?: string;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
export class JetStartServer {
|
|
29
|
+
export class JetStartServer extends EventEmitter {
|
|
29
30
|
private httpServer: any;
|
|
30
31
|
private wsServer: any;
|
|
31
32
|
private wsHandler: WebSocketHandler | null = null;
|
|
@@ -37,6 +38,7 @@ export class JetStartServer {
|
|
|
37
38
|
private latestApkPath: string | null = null; // Store latest built APK path
|
|
38
39
|
|
|
39
40
|
constructor(config: ServerConfig = {}) {
|
|
41
|
+
super();
|
|
40
42
|
const bindHost = config.host || '0.0.0.0';
|
|
41
43
|
const displayHost = config.displayHost || bindHost;
|
|
42
44
|
|
|
@@ -167,6 +169,8 @@ export class JetStartServer {
|
|
|
167
169
|
if (this.wsHandler && this.currentSession) {
|
|
168
170
|
this.wsHandler.sendBuildStart(this.currentSession.id);
|
|
169
171
|
}
|
|
172
|
+
// Re-emit for external listeners (e.g., dev command)
|
|
173
|
+
this.emit('build:start');
|
|
170
174
|
});
|
|
171
175
|
|
|
172
176
|
this.buildService.on('build:complete', (result) => {
|
|
@@ -180,16 +184,21 @@ export class JetStartServer {
|
|
|
180
184
|
this.wsHandler.sendBuildComplete(this.currentSession.id, downloadUrl);
|
|
181
185
|
log(`APK download URL: ${downloadUrl}`);
|
|
182
186
|
}
|
|
187
|
+
// Re-emit for external listeners (e.g., dev command) with result
|
|
188
|
+
this.emit('build:complete', result);
|
|
183
189
|
});
|
|
184
190
|
|
|
185
191
|
this.buildService.on('build:error', (errorMsg, details) => {
|
|
186
192
|
error(`Build failed: ${errorMsg}`);
|
|
187
193
|
// TODO: Send build-error message via WebSocket
|
|
194
|
+
// Re-emit for external listeners
|
|
195
|
+
this.emit('build:error', errorMsg, details);
|
|
188
196
|
});
|
|
189
197
|
|
|
190
198
|
this.buildService.on('watch:change', (files) => {
|
|
191
199
|
// This event is just for logging/monitoring
|
|
192
200
|
// Actual build logic is handled in startWatching callback
|
|
201
|
+
this.emit('watch:change', files);
|
|
193
202
|
});
|
|
194
203
|
}
|
|
195
204
|
|
package/src/utils/logger.ts
CHANGED
|
@@ -1,28 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logger Utility
|
|
3
|
-
* Colored logging for Core
|
|
3
|
+
* Colored logging for Core with log level support
|
|
4
|
+
*
|
|
5
|
+
* Environment Variables:
|
|
6
|
+
* - JETSTART_LOG_LEVEL: error | warn | info | debug (default: info)
|
|
7
|
+
* - DEBUG: Set to enable all debug logs
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import chalk from 'chalk';
|
|
7
11
|
|
|
12
|
+
type LogLevel = 'error' | 'warn' | 'info' | 'debug';
|
|
13
|
+
|
|
14
|
+
const LOG_LEVELS: Record<LogLevel, number> = {
|
|
15
|
+
error: 0,
|
|
16
|
+
warn: 1,
|
|
17
|
+
info: 2,
|
|
18
|
+
debug: 3,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function getLogLevel(): LogLevel {
|
|
22
|
+
const level = process.env.JETSTART_LOG_LEVEL?.toLowerCase() as LogLevel;
|
|
23
|
+
return LOG_LEVELS[level] !== undefined ? level : 'info';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function shouldLog(level: LogLevel): boolean {
|
|
27
|
+
const currentLevel = getLogLevel();
|
|
28
|
+
return LOG_LEVELS[level] <= LOG_LEVELS[currentLevel];
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
export function log(message: string) {
|
|
9
|
-
|
|
32
|
+
if (shouldLog('info')) {
|
|
33
|
+
console.log(chalk.cyan('[Core]'), message);
|
|
34
|
+
}
|
|
10
35
|
}
|
|
11
36
|
|
|
12
37
|
export function success(message: string) {
|
|
13
|
-
|
|
38
|
+
if (shouldLog('info')) {
|
|
39
|
+
console.log(chalk.green('✔'), chalk.cyan('[Core]'), message);
|
|
40
|
+
}
|
|
14
41
|
}
|
|
15
42
|
|
|
16
43
|
export function error(message: string) {
|
|
17
|
-
|
|
44
|
+
if (shouldLog('error')) {
|
|
45
|
+
console.error(chalk.red('✖'), chalk.cyan('[Core]'), message);
|
|
46
|
+
}
|
|
18
47
|
}
|
|
19
48
|
|
|
20
49
|
export function warn(message: string) {
|
|
21
|
-
|
|
50
|
+
if (shouldLog('warn')) {
|
|
51
|
+
console.log(chalk.yellow('⚠'), chalk.cyan('[Core]'), message);
|
|
52
|
+
}
|
|
22
53
|
}
|
|
23
54
|
|
|
24
55
|
export function debug(message: string) {
|
|
25
|
-
if (process.env.DEBUG) {
|
|
56
|
+
if (process.env.DEBUG || shouldLog('debug')) {
|
|
26
57
|
console.log(chalk.gray('[DEBUG]'), chalk.cyan('[Core]'), message);
|
|
27
58
|
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function verbose(message: string) {
|
|
62
|
+
// Only log if DEBUG is set or log level is debug
|
|
63
|
+
debug(message);
|
|
28
64
|
}
|
package/src/utils/session.ts
CHANGED
|
@@ -15,7 +15,7 @@ export class SessionManager {
|
|
|
15
15
|
projectPath: string;
|
|
16
16
|
}): Promise<ServerSession> {
|
|
17
17
|
const session: ServerSession = {
|
|
18
|
-
id:
|
|
18
|
+
id: this.generateShortId(),
|
|
19
19
|
token: this.generateToken(),
|
|
20
20
|
projectName: data.projectName,
|
|
21
21
|
projectPath: data.projectPath,
|
|
@@ -52,7 +52,24 @@ export class SessionManager {
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
private generateShortId(): string {
|
|
56
|
+
// Generate a short random ID (8 chars) for QR code efficiency
|
|
57
|
+
// Use base62 (alphanumeric) for better QR code density
|
|
58
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
59
|
+
let result = '';
|
|
60
|
+
for (let i = 0; i < 8; i++) {
|
|
61
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
55
66
|
private generateToken(): string {
|
|
56
|
-
|
|
67
|
+
// Generate a short random token (12 chars) for QR code efficiency
|
|
68
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
69
|
+
let result = '';
|
|
70
|
+
for (let i = 0; i < 12; i++) {
|
|
71
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
57
74
|
}
|
|
58
75
|
}
|
package/src/websocket/handler.ts
CHANGED
|
@@ -66,6 +66,9 @@ export class WebSocketHandler {
|
|
|
66
66
|
private handleConnect(clientId: string, message: ClientMessage & { type: 'client:connect' }): void {
|
|
67
67
|
log(`Client connecting with session: ${message.sessionId}`);
|
|
68
68
|
|
|
69
|
+
// Associate this client with the session for isolation
|
|
70
|
+
this.connectionManager.setClientSession(clientId, message.sessionId);
|
|
71
|
+
|
|
69
72
|
// Send connected confirmation
|
|
70
73
|
const response: CoreConnectedMessage = {
|
|
71
74
|
type: 'core:connected',
|
|
@@ -95,7 +98,7 @@ export class WebSocketHandler {
|
|
|
95
98
|
sessionId,
|
|
96
99
|
};
|
|
97
100
|
|
|
98
|
-
this.connectionManager.
|
|
101
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
sendBuildComplete(sessionId: string, apkUrl: string): void {
|
|
@@ -116,11 +119,11 @@ export class WebSocketHandler {
|
|
|
116
119
|
downloadUrl: apkUrl,
|
|
117
120
|
};
|
|
118
121
|
|
|
119
|
-
this.connectionManager.
|
|
122
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
120
123
|
}
|
|
121
124
|
|
|
122
125
|
/**
|
|
123
|
-
* Send UI update (DSL-based hot reload)
|
|
126
|
+
* Send UI update (DSL-based hot reload) - SECURE, session-isolated
|
|
124
127
|
*/
|
|
125
128
|
sendUIUpdate(sessionId: string, dslContent: string, screens?: string[]): void {
|
|
126
129
|
const message: CoreUIUpdateMessage = {
|
|
@@ -132,9 +135,9 @@ export class WebSocketHandler {
|
|
|
132
135
|
hash: this.generateHash(dslContent),
|
|
133
136
|
};
|
|
134
137
|
|
|
135
|
-
log(`Sending UI update: ${dslContent.length} bytes`);
|
|
138
|
+
log(`Sending UI update to session ${sessionId}: ${dslContent.length} bytes`);
|
|
136
139
|
log(`DSL Content: ${dslContent}`);
|
|
137
|
-
this.connectionManager.
|
|
140
|
+
this.connectionManager.broadcastToSession(sessionId, message);
|
|
138
141
|
}
|
|
139
142
|
|
|
140
143
|
private generateHash(content: string): string {
|
package/src/websocket/manager.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Connection Manager
|
|
3
|
-
* Manages WebSocket connections
|
|
3
|
+
* Manages WebSocket connections with session isolation
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { WebSocket } from 'ws';
|
|
7
7
|
import { v4 as uuidv4 } from 'uuid';
|
|
8
8
|
import { CoreMessage } from '@jetstart/shared';
|
|
9
9
|
|
|
10
|
+
interface ClientConnection {
|
|
11
|
+
ws: WebSocket;
|
|
12
|
+
sessionId?: string; // Session ID for isolation
|
|
13
|
+
}
|
|
14
|
+
|
|
10
15
|
export class ConnectionManager {
|
|
11
|
-
private connections: Map<string,
|
|
16
|
+
private connections: Map<string, ClientConnection> = new Map();
|
|
12
17
|
|
|
13
18
|
addConnection(ws: WebSocket): string {
|
|
14
19
|
const id = uuidv4();
|
|
15
|
-
this.connections.set(id, ws);
|
|
20
|
+
this.connections.set(id, { ws, sessionId: undefined });
|
|
16
21
|
return id;
|
|
17
22
|
}
|
|
18
23
|
|
|
@@ -21,18 +26,31 @@ export class ConnectionManager {
|
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
getConnection(id: string): WebSocket | undefined {
|
|
24
|
-
return this.connections.get(id);
|
|
29
|
+
return this.connections.get(id)?.ws;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Associate a client with a session for isolation
|
|
34
|
+
*/
|
|
35
|
+
setClientSession(clientId: string, sessionId: string): void {
|
|
36
|
+
const connection = this.connections.get(clientId);
|
|
37
|
+
if (connection) {
|
|
38
|
+
connection.sessionId = sessionId;
|
|
39
|
+
if (process.env.DEBUG) {
|
|
40
|
+
console.log(`[ConnectionManager] Client ${clientId} joined session ${sessionId}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
25
43
|
}
|
|
26
44
|
|
|
27
45
|
sendToClient(clientId: string, message: CoreMessage): boolean {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (!
|
|
46
|
+
const connection = this.connections.get(clientId);
|
|
47
|
+
|
|
48
|
+
if (!connection || connection.ws.readyState !== WebSocket.OPEN) {
|
|
31
49
|
return false;
|
|
32
50
|
}
|
|
33
51
|
|
|
34
52
|
try {
|
|
35
|
-
ws.send(JSON.stringify(message));
|
|
53
|
+
connection.ws.send(JSON.stringify(message));
|
|
36
54
|
return true;
|
|
37
55
|
} catch (err) {
|
|
38
56
|
console.error(`Failed to send message to ${clientId}:`, err);
|
|
@@ -40,15 +58,54 @@ export class ConnectionManager {
|
|
|
40
58
|
}
|
|
41
59
|
}
|
|
42
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Broadcast to all clients (UNSAFE - use broadcastToSession instead)
|
|
63
|
+
* @deprecated Use broadcastToSession for session isolation
|
|
64
|
+
*/
|
|
43
65
|
broadcast(message: CoreMessage): void {
|
|
66
|
+
console.warn('[ConnectionManager] WARNING: Using unsafe broadcast() - use broadcastToSession() instead');
|
|
67
|
+
this.broadcastToAll(message);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Broadcast to all clients in a specific session (SECURE)
|
|
72
|
+
*/
|
|
73
|
+
broadcastToSession(sessionId: string, message: CoreMessage): void {
|
|
74
|
+
const data = JSON.stringify(message);
|
|
75
|
+
let sentCount = 0;
|
|
76
|
+
|
|
77
|
+
this.connections.forEach((connection, clientId) => {
|
|
78
|
+
// Only send to clients in the same session
|
|
79
|
+
if (connection.sessionId === sessionId && connection.ws.readyState === WebSocket.OPEN) {
|
|
80
|
+
try {
|
|
81
|
+
connection.ws.send(data);
|
|
82
|
+
sentCount++;
|
|
83
|
+
if (process.env.DEBUG) {
|
|
84
|
+
console.log(`[ConnectionManager] Sent ${message.type} to client ${clientId} in session ${sessionId.slice(0, 8)}...`);
|
|
85
|
+
}
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.error(`Failed to send to ${clientId}:`, err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
if (process.env.DEBUG) {
|
|
93
|
+
console.log(`[ConnectionManager] Broadcasted ${message.type} to ${sentCount} clients in session ${sessionId.slice(0, 8)}...`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Broadcast to ALL clients regardless of session (use with caution)
|
|
99
|
+
*/
|
|
100
|
+
private broadcastToAll(message: CoreMessage): void {
|
|
44
101
|
const data = JSON.stringify(message);
|
|
45
|
-
const connectionCount = Array.from(this.connections.values()).filter(
|
|
102
|
+
const connectionCount = Array.from(this.connections.values()).filter(c => c.ws.readyState === WebSocket.OPEN).length;
|
|
46
103
|
console.log(`[ConnectionManager] Broadcasting ${message.type} to ${connectionCount} connected clients`);
|
|
47
104
|
|
|
48
|
-
this.connections.forEach((
|
|
49
|
-
if (ws.readyState === WebSocket.OPEN) {
|
|
105
|
+
this.connections.forEach((connection, clientId) => {
|
|
106
|
+
if (connection.ws.readyState === WebSocket.OPEN) {
|
|
50
107
|
try {
|
|
51
|
-
ws.send(data);
|
|
108
|
+
connection.ws.send(data);
|
|
52
109
|
console.log(`[ConnectionManager] Sent ${message.type} to client ${clientId}`);
|
|
53
110
|
} catch (err) {
|
|
54
111
|
console.error(`Failed to broadcast to ${clientId}:`, err);
|