@noxfly/noxus 1.1.10 → 1.2.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/README.md +69 -9
- package/dist/index-5OkVPHfI.d.mts +268 -0
- package/dist/index-5OkVPHfI.d.ts +268 -0
- package/dist/{noxus.d.mts → main.d.mts} +17 -225
- package/dist/{noxus.d.ts → main.d.ts} +17 -225
- package/dist/{noxus.js → main.js} +211 -45
- package/dist/{noxus.mjs → main.mjs} +201 -40
- package/dist/renderer.d.mts +1 -0
- package/dist/renderer.d.ts +1 -0
- package/dist/renderer.js +265 -0
- package/dist/renderer.mjs +236 -0
- package/package.json +73 -48
- package/scripts/postbuild.js +10 -5
- package/src/app.ts +37 -41
- package/src/index.ts +1 -13
- package/src/main.ts +25 -0
- package/src/renderer-events.ts +110 -0
- package/src/request.ts +26 -0
- package/src/socket.ts +68 -0
- package/tsup.config.ts +2 -1
|
@@ -643,6 +643,23 @@ var _Request = class _Request {
|
|
|
643
643
|
};
|
|
644
644
|
__name(_Request, "Request");
|
|
645
645
|
var Request = _Request;
|
|
646
|
+
var RENDERER_EVENT_TYPE = "noxus:event";
|
|
647
|
+
function createRendererEventMessage(event, payload) {
|
|
648
|
+
return {
|
|
649
|
+
type: RENDERER_EVENT_TYPE,
|
|
650
|
+
event,
|
|
651
|
+
payload
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
__name(createRendererEventMessage, "createRendererEventMessage");
|
|
655
|
+
function isRendererEventMessage(value) {
|
|
656
|
+
if (value === null || typeof value !== "object") {
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
const possibleMessage = value;
|
|
660
|
+
return possibleMessage.type === RENDERER_EVENT_TYPE && typeof possibleMessage.event === "string";
|
|
661
|
+
}
|
|
662
|
+
__name(isRendererEventMessage, "isRendererEventMessage");
|
|
646
663
|
|
|
647
664
|
// src/utils/radix-tree.ts
|
|
648
665
|
var _a;
|
|
@@ -1161,6 +1178,8 @@ Router = _ts_decorate([
|
|
|
1161
1178
|
|
|
1162
1179
|
// src/app.ts
|
|
1163
1180
|
import { app, BrowserWindow, ipcMain, MessageChannelMain } from "electron/main";
|
|
1181
|
+
|
|
1182
|
+
// src/socket.ts
|
|
1164
1183
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
1165
1184
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1166
1185
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1168,16 +1187,98 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
1168
1187
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1169
1188
|
}
|
|
1170
1189
|
__name(_ts_decorate2, "_ts_decorate");
|
|
1190
|
+
var _NoxSocket = class _NoxSocket {
|
|
1191
|
+
constructor() {
|
|
1192
|
+
__publicField(this, "messagePorts", /* @__PURE__ */ new Map());
|
|
1193
|
+
}
|
|
1194
|
+
register(senderId, channel) {
|
|
1195
|
+
this.messagePorts.set(senderId, channel);
|
|
1196
|
+
}
|
|
1197
|
+
get(senderId) {
|
|
1198
|
+
return this.messagePorts.get(senderId);
|
|
1199
|
+
}
|
|
1200
|
+
unregister(senderId) {
|
|
1201
|
+
this.messagePorts.delete(senderId);
|
|
1202
|
+
}
|
|
1203
|
+
getSenderIds() {
|
|
1204
|
+
return [
|
|
1205
|
+
...this.messagePorts.keys()
|
|
1206
|
+
];
|
|
1207
|
+
}
|
|
1208
|
+
emit(eventName, payload, targetSenderIds) {
|
|
1209
|
+
const normalizedEvent = eventName.trim();
|
|
1210
|
+
if (normalizedEvent.length === 0) {
|
|
1211
|
+
throw new Error("Renderer event name must be a non-empty string.");
|
|
1212
|
+
}
|
|
1213
|
+
const recipients = targetSenderIds ?? this.getSenderIds();
|
|
1214
|
+
let delivered = 0;
|
|
1215
|
+
for (const senderId of recipients) {
|
|
1216
|
+
const channel = this.messagePorts.get(senderId);
|
|
1217
|
+
if (!channel) {
|
|
1218
|
+
Logger.warn(`No message channel found for sender ID: ${senderId} while emitting "${normalizedEvent}".`);
|
|
1219
|
+
continue;
|
|
1220
|
+
}
|
|
1221
|
+
try {
|
|
1222
|
+
channel.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
|
|
1223
|
+
delivered++;
|
|
1224
|
+
} catch (error) {
|
|
1225
|
+
Logger.error(`[Noxus] Failed to emit "${normalizedEvent}" to sender ${senderId}.`, error);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
return delivered;
|
|
1229
|
+
}
|
|
1230
|
+
emitToRenderer(senderId, eventName, payload) {
|
|
1231
|
+
return this.emit(eventName, payload, [
|
|
1232
|
+
senderId
|
|
1233
|
+
]) > 0;
|
|
1234
|
+
}
|
|
1235
|
+
};
|
|
1236
|
+
__name(_NoxSocket, "NoxSocket");
|
|
1237
|
+
var NoxSocket = _NoxSocket;
|
|
1238
|
+
NoxSocket = _ts_decorate2([
|
|
1239
|
+
Injectable("singleton")
|
|
1240
|
+
], NoxSocket);
|
|
1241
|
+
|
|
1242
|
+
// src/app.ts
|
|
1243
|
+
function _ts_decorate3(decorators, target, key, desc) {
|
|
1244
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1245
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1246
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1247
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1248
|
+
}
|
|
1249
|
+
__name(_ts_decorate3, "_ts_decorate");
|
|
1171
1250
|
function _ts_metadata(k, v) {
|
|
1172
1251
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
1173
1252
|
}
|
|
1174
1253
|
__name(_ts_metadata, "_ts_metadata");
|
|
1175
1254
|
var _NoxApp = class _NoxApp {
|
|
1176
|
-
constructor(router) {
|
|
1255
|
+
constructor(router, socket) {
|
|
1177
1256
|
__publicField(this, "router");
|
|
1178
|
-
__publicField(this, "
|
|
1257
|
+
__publicField(this, "socket");
|
|
1179
1258
|
__publicField(this, "app");
|
|
1259
|
+
__publicField(this, "onRendererMessage", /* @__PURE__ */ __name(async (event) => {
|
|
1260
|
+
const { senderId, requestId, path, method, body } = event.data;
|
|
1261
|
+
const channel = this.socket.get(senderId);
|
|
1262
|
+
if (!channel) {
|
|
1263
|
+
Logger.error(`No message channel found for sender ID: ${senderId}`);
|
|
1264
|
+
return;
|
|
1265
|
+
}
|
|
1266
|
+
try {
|
|
1267
|
+
const request = new Request(event, requestId, method, path, body);
|
|
1268
|
+
const response = await this.router.handle(request);
|
|
1269
|
+
channel.port1.postMessage(response);
|
|
1270
|
+
} catch (err) {
|
|
1271
|
+
const response = {
|
|
1272
|
+
requestId,
|
|
1273
|
+
status: 500,
|
|
1274
|
+
body: null,
|
|
1275
|
+
error: err.message || "Internal Server Error"
|
|
1276
|
+
};
|
|
1277
|
+
channel.port1.postMessage(response);
|
|
1278
|
+
}
|
|
1279
|
+
}, "onRendererMessage"));
|
|
1180
1280
|
this.router = router;
|
|
1281
|
+
this.socket = socket;
|
|
1181
1282
|
}
|
|
1182
1283
|
/**
|
|
1183
1284
|
* Initializes the NoxApp instance.
|
|
@@ -1199,44 +1300,19 @@ var _NoxApp = class _NoxApp {
|
|
|
1199
1300
|
*/
|
|
1200
1301
|
giveTheRendererAPort(event) {
|
|
1201
1302
|
const senderId = event.sender.id;
|
|
1202
|
-
if (this.
|
|
1303
|
+
if (this.socket.get(senderId)) {
|
|
1203
1304
|
this.shutdownChannel(senderId);
|
|
1204
1305
|
}
|
|
1205
1306
|
const channel = new MessageChannelMain();
|
|
1206
|
-
|
|
1207
|
-
channel.port1.on("message", this.onRendererMessage.bind(this));
|
|
1307
|
+
channel.port1.on("message", this.onRendererMessage);
|
|
1208
1308
|
channel.port1.start();
|
|
1309
|
+
this.socket.register(senderId, channel);
|
|
1209
1310
|
event.sender.postMessage("port", {
|
|
1210
1311
|
senderId
|
|
1211
1312
|
}, [
|
|
1212
1313
|
channel.port2
|
|
1213
1314
|
]);
|
|
1214
1315
|
}
|
|
1215
|
-
/**
|
|
1216
|
-
* Electron specific message handling.
|
|
1217
|
-
* Replaces HTTP calls by using Electron's IPC mechanism.
|
|
1218
|
-
*/
|
|
1219
|
-
async onRendererMessage(event) {
|
|
1220
|
-
const { senderId, requestId, path, method, body } = event.data;
|
|
1221
|
-
const channel = this.messagePorts.get(senderId);
|
|
1222
|
-
if (!channel) {
|
|
1223
|
-
Logger.error(`No message channel found for sender ID: ${senderId}`);
|
|
1224
|
-
return;
|
|
1225
|
-
}
|
|
1226
|
-
try {
|
|
1227
|
-
const request = new Request(event, requestId, method, path, body);
|
|
1228
|
-
const response = await this.router.handle(request);
|
|
1229
|
-
channel.port1.postMessage(response);
|
|
1230
|
-
} catch (err) {
|
|
1231
|
-
const response = {
|
|
1232
|
-
requestId,
|
|
1233
|
-
status: 500,
|
|
1234
|
-
body: null,
|
|
1235
|
-
error: err.message || "Internal Server Error"
|
|
1236
|
-
};
|
|
1237
|
-
channel.port1.postMessage(response);
|
|
1238
|
-
}
|
|
1239
|
-
}
|
|
1240
1316
|
/**
|
|
1241
1317
|
* MacOS specific behavior.
|
|
1242
1318
|
*/
|
|
@@ -1253,25 +1329,24 @@ var _NoxApp = class _NoxApp {
|
|
|
1253
1329
|
* @param remove - Whether to remove the channel from the messagePorts map.
|
|
1254
1330
|
*/
|
|
1255
1331
|
shutdownChannel(channelSenderId) {
|
|
1256
|
-
const channel = this.
|
|
1332
|
+
const channel = this.socket.get(channelSenderId);
|
|
1257
1333
|
if (!channel) {
|
|
1258
1334
|
Logger.warn(`No message channel found for sender ID: ${channelSenderId}`);
|
|
1259
1335
|
return;
|
|
1260
1336
|
}
|
|
1261
|
-
channel.port1.off("message", this.onRendererMessage
|
|
1337
|
+
channel.port1.off("message", this.onRendererMessage);
|
|
1262
1338
|
channel.port1.close();
|
|
1263
1339
|
channel.port2.close();
|
|
1264
|
-
this.
|
|
1340
|
+
this.socket.unregister(channelSenderId);
|
|
1265
1341
|
}
|
|
1266
1342
|
/**
|
|
1267
1343
|
* Handles the application shutdown process.
|
|
1268
1344
|
* This method is called when all windows are closed, and it cleans up the message channels
|
|
1269
1345
|
*/
|
|
1270
1346
|
async onAllWindowsClosed() {
|
|
1271
|
-
this.
|
|
1347
|
+
for (const senderId of this.socket.getSenderIds()) {
|
|
1272
1348
|
this.shutdownChannel(senderId);
|
|
1273
|
-
}
|
|
1274
|
-
this.messagePorts.clear();
|
|
1349
|
+
}
|
|
1275
1350
|
Logger.info("All windows closed, shutting down application...");
|
|
1276
1351
|
await this.app?.dispose();
|
|
1277
1352
|
if (process.platform !== "darwin") {
|
|
@@ -1310,11 +1385,12 @@ var _NoxApp = class _NoxApp {
|
|
|
1310
1385
|
};
|
|
1311
1386
|
__name(_NoxApp, "NoxApp");
|
|
1312
1387
|
var NoxApp = _NoxApp;
|
|
1313
|
-
NoxApp =
|
|
1388
|
+
NoxApp = _ts_decorate3([
|
|
1314
1389
|
Injectable("singleton"),
|
|
1315
1390
|
_ts_metadata("design:type", Function),
|
|
1316
1391
|
_ts_metadata("design:paramtypes", [
|
|
1317
|
-
typeof Router === "undefined" ? Object : Router
|
|
1392
|
+
typeof Router === "undefined" ? Object : Router,
|
|
1393
|
+
typeof NoxSocket === "undefined" ? Object : NoxSocket
|
|
1318
1394
|
])
|
|
1319
1395
|
], NoxApp);
|
|
1320
1396
|
|
|
@@ -1330,6 +1406,86 @@ async function bootstrapApplication(rootModule) {
|
|
|
1330
1406
|
return noxApp;
|
|
1331
1407
|
}
|
|
1332
1408
|
__name(bootstrapApplication, "bootstrapApplication");
|
|
1409
|
+
|
|
1410
|
+
// src/renderer-events.ts
|
|
1411
|
+
var _RendererEventRegistry = class _RendererEventRegistry {
|
|
1412
|
+
constructor() {
|
|
1413
|
+
__publicField(this, "listeners", /* @__PURE__ */ new Map());
|
|
1414
|
+
}
|
|
1415
|
+
/**
|
|
1416
|
+
*
|
|
1417
|
+
*/
|
|
1418
|
+
subscribe(eventName, handler) {
|
|
1419
|
+
const normalizedEventName = eventName.trim();
|
|
1420
|
+
if (normalizedEventName.length === 0) {
|
|
1421
|
+
throw new Error("Renderer event name must be a non-empty string.");
|
|
1422
|
+
}
|
|
1423
|
+
const handlers = this.listeners.get(normalizedEventName) ?? /* @__PURE__ */ new Set();
|
|
1424
|
+
handlers.add(handler);
|
|
1425
|
+
this.listeners.set(normalizedEventName, handlers);
|
|
1426
|
+
return {
|
|
1427
|
+
unsubscribe: /* @__PURE__ */ __name(() => this.unsubscribe(normalizedEventName, handler), "unsubscribe")
|
|
1428
|
+
};
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
*
|
|
1432
|
+
*/
|
|
1433
|
+
unsubscribe(eventName, handler) {
|
|
1434
|
+
const handlers = this.listeners.get(eventName);
|
|
1435
|
+
if (!handlers) {
|
|
1436
|
+
return;
|
|
1437
|
+
}
|
|
1438
|
+
handlers.delete(handler);
|
|
1439
|
+
if (handlers.size === 0) {
|
|
1440
|
+
this.listeners.delete(eventName);
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
/**
|
|
1444
|
+
*
|
|
1445
|
+
*/
|
|
1446
|
+
clear(eventName) {
|
|
1447
|
+
if (eventName) {
|
|
1448
|
+
this.listeners.delete(eventName);
|
|
1449
|
+
return;
|
|
1450
|
+
}
|
|
1451
|
+
this.listeners.clear();
|
|
1452
|
+
}
|
|
1453
|
+
/**
|
|
1454
|
+
*
|
|
1455
|
+
*/
|
|
1456
|
+
dispatch(message) {
|
|
1457
|
+
const handlers = this.listeners.get(message.event);
|
|
1458
|
+
if (!handlers || handlers.size === 0) {
|
|
1459
|
+
return;
|
|
1460
|
+
}
|
|
1461
|
+
handlers.forEach((handler) => {
|
|
1462
|
+
try {
|
|
1463
|
+
handler(message.payload);
|
|
1464
|
+
} catch (error) {
|
|
1465
|
+
console.error(`[Noxus] Renderer event handler for "${message.event}" threw an error.`, error);
|
|
1466
|
+
}
|
|
1467
|
+
});
|
|
1468
|
+
}
|
|
1469
|
+
/**
|
|
1470
|
+
*
|
|
1471
|
+
*/
|
|
1472
|
+
tryDispatchFromMessageEvent(event) {
|
|
1473
|
+
if (!isRendererEventMessage(event.data)) {
|
|
1474
|
+
return false;
|
|
1475
|
+
}
|
|
1476
|
+
this.dispatch(event.data);
|
|
1477
|
+
return true;
|
|
1478
|
+
}
|
|
1479
|
+
/**
|
|
1480
|
+
*
|
|
1481
|
+
*/
|
|
1482
|
+
hasHandlers(eventName) {
|
|
1483
|
+
const handlers = this.listeners.get(eventName);
|
|
1484
|
+
return !!handlers && handlers.size > 0;
|
|
1485
|
+
}
|
|
1486
|
+
};
|
|
1487
|
+
__name(_RendererEventRegistry, "RendererEventRegistry");
|
|
1488
|
+
var RendererEventRegistry = _RendererEventRegistry;
|
|
1333
1489
|
export {
|
|
1334
1490
|
AppInjector,
|
|
1335
1491
|
Authorize,
|
|
@@ -1359,11 +1515,14 @@ export {
|
|
|
1359
1515
|
NotFoundException,
|
|
1360
1516
|
NotImplementedException,
|
|
1361
1517
|
NoxApp,
|
|
1518
|
+
NoxSocket,
|
|
1362
1519
|
Patch,
|
|
1363
1520
|
PaymentRequiredException,
|
|
1364
1521
|
Post,
|
|
1365
1522
|
Put,
|
|
1523
|
+
RENDERER_EVENT_TYPE,
|
|
1366
1524
|
ROUTE_METADATA_KEY,
|
|
1525
|
+
RendererEventRegistry,
|
|
1367
1526
|
Request,
|
|
1368
1527
|
RequestTimeoutException,
|
|
1369
1528
|
ResponseException,
|
|
@@ -1376,6 +1535,7 @@ export {
|
|
|
1376
1535
|
UseMiddlewares,
|
|
1377
1536
|
VariantAlsoNegotiatesException,
|
|
1378
1537
|
bootstrapApplication,
|
|
1538
|
+
createRendererEventMessage,
|
|
1379
1539
|
getControllerMetadata,
|
|
1380
1540
|
getGuardForController,
|
|
1381
1541
|
getGuardForControllerAction,
|
|
@@ -1384,11 +1544,12 @@ export {
|
|
|
1384
1544
|
getMiddlewaresForControllerAction,
|
|
1385
1545
|
getModuleMetadata,
|
|
1386
1546
|
getRouteMetadata,
|
|
1387
|
-
inject
|
|
1547
|
+
inject,
|
|
1548
|
+
isRendererEventMessage
|
|
1388
1549
|
};
|
|
1389
1550
|
/**
|
|
1390
1551
|
* @copyright 2025 NoxFly
|
|
1391
1552
|
* @license MIT
|
|
1392
1553
|
* @author NoxFly
|
|
1393
1554
|
*/
|
|
1394
|
-
//# sourceMappingURL=
|
|
1555
|
+
//# sourceMappingURL=main.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { o as IBatchRequestItem, p as IBatchRequestPayload, q as IBatchResponsePayload, s as IRendererEventMessage, n as IRequest, I as IResponse, r as RENDERER_EVENT_TYPE, v as RendererEventHandler, x as RendererEventRegistry, w as RendererEventSubscription, R as Request, t as createRendererEventMessage, u as isRendererEventMessage } from './index-5OkVPHfI.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { o as IBatchRequestItem, p as IBatchRequestPayload, q as IBatchResponsePayload, s as IRendererEventMessage, n as IRequest, I as IResponse, r as RENDERER_EVENT_TYPE, v as RendererEventHandler, x as RendererEventRegistry, w as RendererEventSubscription, R as Request, t as createRendererEventMessage, u as isRendererEventMessage } from './index-5OkVPHfI.js';
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright 2025 NoxFly
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @author NoxFly
|
|
5
|
+
*/
|
|
6
|
+
"use strict";
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
13
|
+
var __export = (target, all) => {
|
|
14
|
+
for (var name in all)
|
|
15
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
16
|
+
};
|
|
17
|
+
var __copyProps = (to, from, except, desc) => {
|
|
18
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
19
|
+
for (let key of __getOwnPropNames(from))
|
|
20
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
21
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
22
|
+
}
|
|
23
|
+
return to;
|
|
24
|
+
};
|
|
25
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
26
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
27
|
+
|
|
28
|
+
// src/index.ts
|
|
29
|
+
var src_exports = {};
|
|
30
|
+
__export(src_exports, {
|
|
31
|
+
RENDERER_EVENT_TYPE: () => RENDERER_EVENT_TYPE,
|
|
32
|
+
RendererEventRegistry: () => RendererEventRegistry,
|
|
33
|
+
Request: () => Request,
|
|
34
|
+
createRendererEventMessage: () => createRendererEventMessage,
|
|
35
|
+
isRendererEventMessage: () => isRendererEventMessage
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(src_exports);
|
|
38
|
+
|
|
39
|
+
// src/request.ts
|
|
40
|
+
var import_reflect_metadata2 = require("reflect-metadata");
|
|
41
|
+
|
|
42
|
+
// src/DI/app-injector.ts
|
|
43
|
+
var import_reflect_metadata = require("reflect-metadata");
|
|
44
|
+
|
|
45
|
+
// src/exceptions.ts
|
|
46
|
+
var _ResponseException = class _ResponseException extends Error {
|
|
47
|
+
constructor(statusOrMessage, message) {
|
|
48
|
+
let statusCode;
|
|
49
|
+
if (typeof statusOrMessage === "number") {
|
|
50
|
+
statusCode = statusOrMessage;
|
|
51
|
+
} else if (typeof statusOrMessage === "string") {
|
|
52
|
+
message = statusOrMessage;
|
|
53
|
+
}
|
|
54
|
+
super(message ?? "");
|
|
55
|
+
__publicField(this, "status", 0);
|
|
56
|
+
if (statusCode !== void 0) {
|
|
57
|
+
this.status = statusCode;
|
|
58
|
+
}
|
|
59
|
+
this.name = this.constructor.name.replace(/([A-Z])/g, " $1");
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
__name(_ResponseException, "ResponseException");
|
|
63
|
+
var ResponseException = _ResponseException;
|
|
64
|
+
var _InternalServerException = class _InternalServerException extends ResponseException {
|
|
65
|
+
constructor() {
|
|
66
|
+
super(...arguments);
|
|
67
|
+
__publicField(this, "status", 500);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
__name(_InternalServerException, "InternalServerException");
|
|
71
|
+
var InternalServerException = _InternalServerException;
|
|
72
|
+
|
|
73
|
+
// src/DI/app-injector.ts
|
|
74
|
+
var _AppInjector = class _AppInjector {
|
|
75
|
+
constructor(name = null) {
|
|
76
|
+
__publicField(this, "name");
|
|
77
|
+
__publicField(this, "bindings", /* @__PURE__ */ new Map());
|
|
78
|
+
__publicField(this, "singletons", /* @__PURE__ */ new Map());
|
|
79
|
+
__publicField(this, "scoped", /* @__PURE__ */ new Map());
|
|
80
|
+
this.name = name;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Typically used to create a dependency injection scope
|
|
84
|
+
* at the "scope" level (i.e., per-request lifetime).
|
|
85
|
+
*
|
|
86
|
+
* SHOULD NOT BE USED by anything else than the framework itself.
|
|
87
|
+
*/
|
|
88
|
+
createScope() {
|
|
89
|
+
const scope = new _AppInjector();
|
|
90
|
+
scope.bindings = this.bindings;
|
|
91
|
+
scope.singletons = this.singletons;
|
|
92
|
+
return scope;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Called when resolving a dependency,
|
|
96
|
+
* i.e., retrieving the instance of a given class.
|
|
97
|
+
*/
|
|
98
|
+
resolve(target) {
|
|
99
|
+
const binding = this.bindings.get(target);
|
|
100
|
+
if (!binding) throw new InternalServerException(`Failed to resolve a dependency injection : No binding for type ${target.name}.
|
|
101
|
+
Did you forget to use @Injectable() decorator ?`);
|
|
102
|
+
switch (binding.lifetime) {
|
|
103
|
+
case "transient":
|
|
104
|
+
return this.instantiate(binding.implementation);
|
|
105
|
+
case "scope": {
|
|
106
|
+
if (this.scoped.has(target)) {
|
|
107
|
+
return this.scoped.get(target);
|
|
108
|
+
}
|
|
109
|
+
const instance = this.instantiate(binding.implementation);
|
|
110
|
+
this.scoped.set(target, instance);
|
|
111
|
+
return instance;
|
|
112
|
+
}
|
|
113
|
+
case "singleton": {
|
|
114
|
+
if (binding.instance === void 0 && this.name === "root") {
|
|
115
|
+
binding.instance = this.instantiate(binding.implementation);
|
|
116
|
+
this.singletons.set(target, binding.instance);
|
|
117
|
+
}
|
|
118
|
+
return binding.instance;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
*
|
|
124
|
+
*/
|
|
125
|
+
instantiate(target) {
|
|
126
|
+
const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
|
|
127
|
+
const params = paramTypes.map((p) => this.resolve(p));
|
|
128
|
+
return new target(...params);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
__name(_AppInjector, "AppInjector");
|
|
132
|
+
var AppInjector = _AppInjector;
|
|
133
|
+
var RootInjector = new AppInjector("root");
|
|
134
|
+
|
|
135
|
+
// src/request.ts
|
|
136
|
+
var _Request = class _Request {
|
|
137
|
+
constructor(event, id, method, path, body) {
|
|
138
|
+
__publicField(this, "event");
|
|
139
|
+
__publicField(this, "id");
|
|
140
|
+
__publicField(this, "method");
|
|
141
|
+
__publicField(this, "path");
|
|
142
|
+
__publicField(this, "body");
|
|
143
|
+
__publicField(this, "context", RootInjector.createScope());
|
|
144
|
+
__publicField(this, "params", {});
|
|
145
|
+
this.event = event;
|
|
146
|
+
this.id = id;
|
|
147
|
+
this.method = method;
|
|
148
|
+
this.path = path;
|
|
149
|
+
this.body = body;
|
|
150
|
+
this.path = path.replace(/^\/|\/$/g, "");
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
__name(_Request, "Request");
|
|
154
|
+
var Request = _Request;
|
|
155
|
+
var RENDERER_EVENT_TYPE = "noxus:event";
|
|
156
|
+
function createRendererEventMessage(event, payload) {
|
|
157
|
+
return {
|
|
158
|
+
type: RENDERER_EVENT_TYPE,
|
|
159
|
+
event,
|
|
160
|
+
payload
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
__name(createRendererEventMessage, "createRendererEventMessage");
|
|
164
|
+
function isRendererEventMessage(value) {
|
|
165
|
+
if (value === null || typeof value !== "object") {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
const possibleMessage = value;
|
|
169
|
+
return possibleMessage.type === RENDERER_EVENT_TYPE && typeof possibleMessage.event === "string";
|
|
170
|
+
}
|
|
171
|
+
__name(isRendererEventMessage, "isRendererEventMessage");
|
|
172
|
+
|
|
173
|
+
// src/renderer-events.ts
|
|
174
|
+
var _RendererEventRegistry = class _RendererEventRegistry {
|
|
175
|
+
constructor() {
|
|
176
|
+
__publicField(this, "listeners", /* @__PURE__ */ new Map());
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
*
|
|
180
|
+
*/
|
|
181
|
+
subscribe(eventName, handler) {
|
|
182
|
+
const normalizedEventName = eventName.trim();
|
|
183
|
+
if (normalizedEventName.length === 0) {
|
|
184
|
+
throw new Error("Renderer event name must be a non-empty string.");
|
|
185
|
+
}
|
|
186
|
+
const handlers = this.listeners.get(normalizedEventName) ?? /* @__PURE__ */ new Set();
|
|
187
|
+
handlers.add(handler);
|
|
188
|
+
this.listeners.set(normalizedEventName, handlers);
|
|
189
|
+
return {
|
|
190
|
+
unsubscribe: /* @__PURE__ */ __name(() => this.unsubscribe(normalizedEventName, handler), "unsubscribe")
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
*
|
|
195
|
+
*/
|
|
196
|
+
unsubscribe(eventName, handler) {
|
|
197
|
+
const handlers = this.listeners.get(eventName);
|
|
198
|
+
if (!handlers) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
handlers.delete(handler);
|
|
202
|
+
if (handlers.size === 0) {
|
|
203
|
+
this.listeners.delete(eventName);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
*
|
|
208
|
+
*/
|
|
209
|
+
clear(eventName) {
|
|
210
|
+
if (eventName) {
|
|
211
|
+
this.listeners.delete(eventName);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
this.listeners.clear();
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
*
|
|
218
|
+
*/
|
|
219
|
+
dispatch(message) {
|
|
220
|
+
const handlers = this.listeners.get(message.event);
|
|
221
|
+
if (!handlers || handlers.size === 0) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
handlers.forEach((handler) => {
|
|
225
|
+
try {
|
|
226
|
+
handler(message.payload);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
console.error(`[Noxus] Renderer event handler for "${message.event}" threw an error.`, error);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
*
|
|
234
|
+
*/
|
|
235
|
+
tryDispatchFromMessageEvent(event) {
|
|
236
|
+
if (!isRendererEventMessage(event.data)) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
this.dispatch(event.data);
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
*
|
|
244
|
+
*/
|
|
245
|
+
hasHandlers(eventName) {
|
|
246
|
+
const handlers = this.listeners.get(eventName);
|
|
247
|
+
return !!handlers && handlers.size > 0;
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
__name(_RendererEventRegistry, "RendererEventRegistry");
|
|
251
|
+
var RendererEventRegistry = _RendererEventRegistry;
|
|
252
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
253
|
+
0 && (module.exports = {
|
|
254
|
+
RENDERER_EVENT_TYPE,
|
|
255
|
+
RendererEventRegistry,
|
|
256
|
+
Request,
|
|
257
|
+
createRendererEventMessage,
|
|
258
|
+
isRendererEventMessage
|
|
259
|
+
});
|
|
260
|
+
/**
|
|
261
|
+
* @copyright 2025 NoxFly
|
|
262
|
+
* @license MIT
|
|
263
|
+
* @author NoxFly
|
|
264
|
+
*/
|
|
265
|
+
//# sourceMappingURL=renderer.js.map
|