@noxfly/noxus 1.2.0 → 2.0.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/.github/copilot-instructions.md +32 -0
- package/README.md +36 -127
- package/dist/{index-5OkVPHfI.d.mts → index-CI3OMzNR.d.mts} +52 -2
- package/dist/{index-5OkVPHfI.d.ts → index-CI3OMzNR.d.ts} +52 -2
- package/dist/main.d.mts +34 -14
- package/dist/main.d.ts +34 -14
- package/dist/main.js +342 -31
- package/dist/main.mjs +339 -31
- package/dist/renderer.d.mts +1 -1
- package/dist/renderer.d.ts +1 -1
- package/dist/renderer.js +251 -1
- package/dist/renderer.mjs +250 -1
- package/package.json +1 -1
- package/src/DI/injector-explorer.ts +1 -1
- package/src/app.ts +24 -15
- package/src/decorators/injectable.decorator.ts +6 -17
- package/src/decorators/injectable.metadata.ts +15 -0
- package/src/index.ts +1 -0
- package/src/main.ts +3 -0
- package/src/preload-bridge.ts +75 -0
- package/src/renderer-client.ts +338 -0
- package/src/request.ts +1 -0
- package/src/router.ts +1 -1
- package/src/socket.ts +14 -9
package/dist/main.js
CHANGED
|
@@ -56,6 +56,7 @@ __export(main_exports, {
|
|
|
56
56
|
NotFoundException: () => NotFoundException,
|
|
57
57
|
NotImplementedException: () => NotImplementedException,
|
|
58
58
|
NoxApp: () => NoxApp,
|
|
59
|
+
NoxRendererClient: () => NoxRendererClient,
|
|
59
60
|
NoxSocket: () => NoxSocket,
|
|
60
61
|
Patch: () => Patch,
|
|
61
62
|
PaymentRequiredException: () => PaymentRequiredException,
|
|
@@ -77,6 +78,7 @@ __export(main_exports, {
|
|
|
77
78
|
VariantAlsoNegotiatesException: () => VariantAlsoNegotiatesException,
|
|
78
79
|
bootstrapApplication: () => bootstrapApplication,
|
|
79
80
|
createRendererEventMessage: () => createRendererEventMessage,
|
|
81
|
+
exposeNoxusBridge: () => exposeNoxusBridge,
|
|
80
82
|
getControllerMetadata: () => getControllerMetadata,
|
|
81
83
|
getGuardForController: () => getGuardForController,
|
|
82
84
|
getGuardForControllerAction: () => getGuardForControllerAction,
|
|
@@ -85,6 +87,7 @@ __export(main_exports, {
|
|
|
85
87
|
getMiddlewaresForControllerAction: () => getMiddlewaresForControllerAction,
|
|
86
88
|
getModuleMetadata: () => getModuleMetadata,
|
|
87
89
|
getRouteMetadata: () => getRouteMetadata,
|
|
90
|
+
hasInjectableMetadata: () => hasInjectableMetadata,
|
|
88
91
|
inject: () => inject,
|
|
89
92
|
isRendererEventMessage: () => isRendererEventMessage
|
|
90
93
|
});
|
|
@@ -397,6 +400,21 @@ function getGuardForControllerAction(controllerName, actionName) {
|
|
|
397
400
|
__name(getGuardForControllerAction, "getGuardForControllerAction");
|
|
398
401
|
var authorizations = /* @__PURE__ */ new Map();
|
|
399
402
|
|
|
403
|
+
// src/decorators/injectable.metadata.ts
|
|
404
|
+
var INJECTABLE_METADATA_KEY = Symbol("INJECTABLE_METADATA_KEY");
|
|
405
|
+
function defineInjectableMetadata(target, lifetime) {
|
|
406
|
+
Reflect.defineMetadata(INJECTABLE_METADATA_KEY, lifetime, target);
|
|
407
|
+
}
|
|
408
|
+
__name(defineInjectableMetadata, "defineInjectableMetadata");
|
|
409
|
+
function getInjectableMetadata(target) {
|
|
410
|
+
return Reflect.getMetadata(INJECTABLE_METADATA_KEY, target);
|
|
411
|
+
}
|
|
412
|
+
__name(getInjectableMetadata, "getInjectableMetadata");
|
|
413
|
+
function hasInjectableMetadata(target) {
|
|
414
|
+
return Reflect.hasMetadata(INJECTABLE_METADATA_KEY, target);
|
|
415
|
+
}
|
|
416
|
+
__name(hasInjectableMetadata, "hasInjectableMetadata");
|
|
417
|
+
|
|
400
418
|
// src/decorators/method.decorator.ts
|
|
401
419
|
function createRouteDecorator(verb) {
|
|
402
420
|
return (path) => {
|
|
@@ -644,16 +662,11 @@ function Injectable(lifetime = "scope") {
|
|
|
644
662
|
if (typeof target !== "function" || !target.prototype) {
|
|
645
663
|
throw new Error(`@Injectable can only be used on classes, not on ${typeof target}`);
|
|
646
664
|
}
|
|
647
|
-
|
|
665
|
+
defineInjectableMetadata(target, lifetime);
|
|
648
666
|
InjectorExplorer.register(target, lifetime);
|
|
649
667
|
};
|
|
650
668
|
}
|
|
651
669
|
__name(Injectable, "Injectable");
|
|
652
|
-
function getInjectableMetadata(target) {
|
|
653
|
-
return Reflect.getMetadata(INJECTABLE_METADATA_KEY, target);
|
|
654
|
-
}
|
|
655
|
-
__name(getInjectableMetadata, "getInjectableMetadata");
|
|
656
|
-
var INJECTABLE_METADATA_KEY = Symbol("INJECTABLE_METADATA_KEY");
|
|
657
670
|
|
|
658
671
|
// src/decorators/controller.decorator.ts
|
|
659
672
|
function Controller(path) {
|
|
@@ -707,8 +720,9 @@ var middlewares = /* @__PURE__ */ new Map();
|
|
|
707
720
|
// src/request.ts
|
|
708
721
|
var import_reflect_metadata2 = require("reflect-metadata");
|
|
709
722
|
var _Request = class _Request {
|
|
710
|
-
constructor(event, id, method, path, body) {
|
|
723
|
+
constructor(event, senderId, id, method, path, body) {
|
|
711
724
|
__publicField(this, "event");
|
|
725
|
+
__publicField(this, "senderId");
|
|
712
726
|
__publicField(this, "id");
|
|
713
727
|
__publicField(this, "method");
|
|
714
728
|
__publicField(this, "path");
|
|
@@ -716,6 +730,7 @@ var _Request = class _Request {
|
|
|
716
730
|
__publicField(this, "context", RootInjector.createScope());
|
|
717
731
|
__publicField(this, "params", {});
|
|
718
732
|
this.event = event;
|
|
733
|
+
this.senderId = senderId;
|
|
719
734
|
this.id = id;
|
|
720
735
|
this.method = method;
|
|
721
736
|
this.path = path;
|
|
@@ -1051,7 +1066,7 @@ var _Router = class _Router {
|
|
|
1051
1066
|
const batchResponses = [];
|
|
1052
1067
|
for (const [index, item] of payload.requests.entries()) {
|
|
1053
1068
|
const subRequestId = item.requestId ?? `${request.id}:${index}`;
|
|
1054
|
-
const atomicRequest = new Request(request.event, subRequestId, item.method, item.path, item.body);
|
|
1069
|
+
const atomicRequest = new Request(request.event, request.senderId, subRequestId, item.method, item.path, item.body);
|
|
1055
1070
|
batchResponses.push(await this.handleAtomic(atomicRequest));
|
|
1056
1071
|
}
|
|
1057
1072
|
response.body.responses = batchResponses;
|
|
@@ -1271,20 +1286,23 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
1271
1286
|
__name(_ts_decorate2, "_ts_decorate");
|
|
1272
1287
|
var _NoxSocket = class _NoxSocket {
|
|
1273
1288
|
constructor() {
|
|
1274
|
-
__publicField(this, "
|
|
1289
|
+
__publicField(this, "channels", /* @__PURE__ */ new Map());
|
|
1275
1290
|
}
|
|
1276
|
-
register(senderId,
|
|
1277
|
-
this.
|
|
1291
|
+
register(senderId, requestChannel, socketChannel) {
|
|
1292
|
+
this.channels.set(senderId, {
|
|
1293
|
+
request: requestChannel,
|
|
1294
|
+
socket: socketChannel
|
|
1295
|
+
});
|
|
1278
1296
|
}
|
|
1279
1297
|
get(senderId) {
|
|
1280
|
-
return this.
|
|
1298
|
+
return this.channels.get(senderId);
|
|
1281
1299
|
}
|
|
1282
1300
|
unregister(senderId) {
|
|
1283
|
-
this.
|
|
1301
|
+
this.channels.delete(senderId);
|
|
1284
1302
|
}
|
|
1285
1303
|
getSenderIds() {
|
|
1286
1304
|
return [
|
|
1287
|
-
...this.
|
|
1305
|
+
...this.channels.keys()
|
|
1288
1306
|
];
|
|
1289
1307
|
}
|
|
1290
1308
|
emit(eventName, payload, targetSenderIds) {
|
|
@@ -1295,13 +1313,13 @@ var _NoxSocket = class _NoxSocket {
|
|
|
1295
1313
|
const recipients = targetSenderIds ?? this.getSenderIds();
|
|
1296
1314
|
let delivered = 0;
|
|
1297
1315
|
for (const senderId of recipients) {
|
|
1298
|
-
const channel = this.
|
|
1316
|
+
const channel = this.channels.get(senderId);
|
|
1299
1317
|
if (!channel) {
|
|
1300
1318
|
Logger.warn(`No message channel found for sender ID: ${senderId} while emitting "${normalizedEvent}".`);
|
|
1301
1319
|
continue;
|
|
1302
1320
|
}
|
|
1303
1321
|
try {
|
|
1304
|
-
channel.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
|
|
1322
|
+
channel.socket.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
|
|
1305
1323
|
delivered++;
|
|
1306
1324
|
} catch (error) {
|
|
1307
1325
|
Logger.error(`[Noxus] Failed to emit "${normalizedEvent}" to sender ${senderId}.`, error);
|
|
@@ -1338,17 +1356,20 @@ var _NoxApp = class _NoxApp {
|
|
|
1338
1356
|
__publicField(this, "router");
|
|
1339
1357
|
__publicField(this, "socket");
|
|
1340
1358
|
__publicField(this, "app");
|
|
1359
|
+
/**
|
|
1360
|
+
*
|
|
1361
|
+
*/
|
|
1341
1362
|
__publicField(this, "onRendererMessage", /* @__PURE__ */ __name(async (event) => {
|
|
1342
1363
|
const { senderId, requestId, path, method, body } = event.data;
|
|
1343
|
-
const
|
|
1344
|
-
if (!
|
|
1364
|
+
const channels = this.socket.get(senderId);
|
|
1365
|
+
if (!channels) {
|
|
1345
1366
|
Logger.error(`No message channel found for sender ID: ${senderId}`);
|
|
1346
1367
|
return;
|
|
1347
1368
|
}
|
|
1348
1369
|
try {
|
|
1349
|
-
const request = new Request(event, requestId, method, path, body);
|
|
1370
|
+
const request = new Request(event, senderId, requestId, method, path, body);
|
|
1350
1371
|
const response = await this.router.handle(request);
|
|
1351
|
-
|
|
1372
|
+
channels.request.port1.postMessage(response);
|
|
1352
1373
|
} catch (err) {
|
|
1353
1374
|
const response = {
|
|
1354
1375
|
requestId,
|
|
@@ -1356,7 +1377,7 @@ var _NoxApp = class _NoxApp {
|
|
|
1356
1377
|
body: null,
|
|
1357
1378
|
error: err.message || "Internal Server Error"
|
|
1358
1379
|
};
|
|
1359
|
-
|
|
1380
|
+
channels.request.port1.postMessage(response);
|
|
1360
1381
|
}
|
|
1361
1382
|
}, "onRendererMessage"));
|
|
1362
1383
|
this.router = router;
|
|
@@ -1385,14 +1406,17 @@ var _NoxApp = class _NoxApp {
|
|
|
1385
1406
|
if (this.socket.get(senderId)) {
|
|
1386
1407
|
this.shutdownChannel(senderId);
|
|
1387
1408
|
}
|
|
1388
|
-
const
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1409
|
+
const requestChannel = new import_main.MessageChannelMain();
|
|
1410
|
+
const socketChannel = new import_main.MessageChannelMain();
|
|
1411
|
+
requestChannel.port1.on("message", this.onRendererMessage);
|
|
1412
|
+
requestChannel.port1.start();
|
|
1413
|
+
socketChannel.port1.start();
|
|
1414
|
+
this.socket.register(senderId, requestChannel, socketChannel);
|
|
1392
1415
|
event.sender.postMessage("port", {
|
|
1393
1416
|
senderId
|
|
1394
1417
|
}, [
|
|
1395
|
-
|
|
1418
|
+
requestChannel.port2,
|
|
1419
|
+
socketChannel.port2
|
|
1396
1420
|
]);
|
|
1397
1421
|
}
|
|
1398
1422
|
/**
|
|
@@ -1411,14 +1435,16 @@ var _NoxApp = class _NoxApp {
|
|
|
1411
1435
|
* @param remove - Whether to remove the channel from the messagePorts map.
|
|
1412
1436
|
*/
|
|
1413
1437
|
shutdownChannel(channelSenderId) {
|
|
1414
|
-
const
|
|
1415
|
-
if (!
|
|
1438
|
+
const channels = this.socket.get(channelSenderId);
|
|
1439
|
+
if (!channels) {
|
|
1416
1440
|
Logger.warn(`No message channel found for sender ID: ${channelSenderId}`);
|
|
1417
1441
|
return;
|
|
1418
1442
|
}
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1443
|
+
channels.request.port1.off("message", this.onRendererMessage);
|
|
1444
|
+
channels.request.port1.close();
|
|
1445
|
+
channels.request.port2.close();
|
|
1446
|
+
channels.socket.port1.close();
|
|
1447
|
+
channels.socket.port2.close();
|
|
1422
1448
|
this.socket.unregister(channelSenderId);
|
|
1423
1449
|
}
|
|
1424
1450
|
/**
|
|
@@ -1489,6 +1515,42 @@ async function bootstrapApplication(rootModule) {
|
|
|
1489
1515
|
}
|
|
1490
1516
|
__name(bootstrapApplication, "bootstrapApplication");
|
|
1491
1517
|
|
|
1518
|
+
// src/preload-bridge.ts
|
|
1519
|
+
var import_renderer = require("electron/renderer");
|
|
1520
|
+
var DEFAULT_EXPOSE_NAME = "noxus";
|
|
1521
|
+
var DEFAULT_INIT_EVENT = "init-port";
|
|
1522
|
+
var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
|
|
1523
|
+
var DEFAULT_RESPONSE_CHANNEL = "port";
|
|
1524
|
+
function exposeNoxusBridge(options = {}) {
|
|
1525
|
+
const { exposeAs = DEFAULT_EXPOSE_NAME, initMessageType = DEFAULT_INIT_EVENT, requestChannel = DEFAULT_REQUEST_CHANNEL, responseChannel = DEFAULT_RESPONSE_CHANNEL, targetWindow = window } = options;
|
|
1526
|
+
const api = {
|
|
1527
|
+
requestPort: /* @__PURE__ */ __name(() => {
|
|
1528
|
+
import_renderer.ipcRenderer.send(requestChannel);
|
|
1529
|
+
import_renderer.ipcRenderer.once(responseChannel, (event, message) => {
|
|
1530
|
+
const ports = (event.ports ?? []).filter((port) => port !== void 0);
|
|
1531
|
+
if (ports.length === 0) {
|
|
1532
|
+
console.error("[Noxus] No MessagePort received from main process.");
|
|
1533
|
+
return;
|
|
1534
|
+
}
|
|
1535
|
+
for (const port of ports) {
|
|
1536
|
+
try {
|
|
1537
|
+
port.start();
|
|
1538
|
+
} catch (error) {
|
|
1539
|
+
console.error("[Noxus] Failed to start MessagePort.", error);
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
targetWindow.postMessage({
|
|
1543
|
+
type: initMessageType,
|
|
1544
|
+
senderId: message?.senderId
|
|
1545
|
+
}, "*", ports);
|
|
1546
|
+
});
|
|
1547
|
+
}, "requestPort")
|
|
1548
|
+
};
|
|
1549
|
+
import_renderer.contextBridge.exposeInMainWorld(exposeAs, api);
|
|
1550
|
+
return api;
|
|
1551
|
+
}
|
|
1552
|
+
__name(exposeNoxusBridge, "exposeNoxusBridge");
|
|
1553
|
+
|
|
1492
1554
|
// src/renderer-events.ts
|
|
1493
1555
|
var _RendererEventRegistry = class _RendererEventRegistry {
|
|
1494
1556
|
constructor() {
|
|
@@ -1568,6 +1630,252 @@ var _RendererEventRegistry = class _RendererEventRegistry {
|
|
|
1568
1630
|
};
|
|
1569
1631
|
__name(_RendererEventRegistry, "RendererEventRegistry");
|
|
1570
1632
|
var RendererEventRegistry = _RendererEventRegistry;
|
|
1633
|
+
|
|
1634
|
+
// src/renderer-client.ts
|
|
1635
|
+
var DEFAULT_INIT_EVENT2 = "init-port";
|
|
1636
|
+
var DEFAULT_BRIDGE_NAMES = [
|
|
1637
|
+
"noxus",
|
|
1638
|
+
"ipcRenderer"
|
|
1639
|
+
];
|
|
1640
|
+
function defaultRequestId() {
|
|
1641
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
1642
|
+
return crypto.randomUUID();
|
|
1643
|
+
}
|
|
1644
|
+
return `${Date.now().toString(16)}-${Math.floor(Math.random() * 1e8).toString(16)}`;
|
|
1645
|
+
}
|
|
1646
|
+
__name(defaultRequestId, "defaultRequestId");
|
|
1647
|
+
function normalizeBridgeNames(preferred) {
|
|
1648
|
+
const names = [];
|
|
1649
|
+
const add = /* @__PURE__ */ __name((name) => {
|
|
1650
|
+
if (!name) return;
|
|
1651
|
+
if (!names.includes(name)) {
|
|
1652
|
+
names.push(name);
|
|
1653
|
+
}
|
|
1654
|
+
}, "add");
|
|
1655
|
+
if (Array.isArray(preferred)) {
|
|
1656
|
+
for (const name of preferred) {
|
|
1657
|
+
add(name);
|
|
1658
|
+
}
|
|
1659
|
+
} else {
|
|
1660
|
+
add(preferred);
|
|
1661
|
+
}
|
|
1662
|
+
for (const fallback of DEFAULT_BRIDGE_NAMES) {
|
|
1663
|
+
add(fallback);
|
|
1664
|
+
}
|
|
1665
|
+
return names;
|
|
1666
|
+
}
|
|
1667
|
+
__name(normalizeBridgeNames, "normalizeBridgeNames");
|
|
1668
|
+
function resolveBridgeFromWindow(windowRef, preferred) {
|
|
1669
|
+
const names = normalizeBridgeNames(preferred);
|
|
1670
|
+
const globalRef = windowRef;
|
|
1671
|
+
if (!globalRef) {
|
|
1672
|
+
return null;
|
|
1673
|
+
}
|
|
1674
|
+
for (const name of names) {
|
|
1675
|
+
const candidate = globalRef[name];
|
|
1676
|
+
if (candidate && typeof candidate.requestPort === "function") {
|
|
1677
|
+
return candidate;
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
return null;
|
|
1681
|
+
}
|
|
1682
|
+
__name(resolveBridgeFromWindow, "resolveBridgeFromWindow");
|
|
1683
|
+
var _NoxRendererClient = class _NoxRendererClient {
|
|
1684
|
+
constructor(options = {}) {
|
|
1685
|
+
__publicField(this, "events", new RendererEventRegistry());
|
|
1686
|
+
__publicField(this, "pendingRequests", /* @__PURE__ */ new Map());
|
|
1687
|
+
__publicField(this, "requestPort");
|
|
1688
|
+
__publicField(this, "socketPort");
|
|
1689
|
+
__publicField(this, "senderId");
|
|
1690
|
+
__publicField(this, "bridge");
|
|
1691
|
+
__publicField(this, "initMessageType");
|
|
1692
|
+
__publicField(this, "windowRef");
|
|
1693
|
+
__publicField(this, "generateRequestId");
|
|
1694
|
+
__publicField(this, "isReady", false);
|
|
1695
|
+
__publicField(this, "setupPromise");
|
|
1696
|
+
__publicField(this, "setupResolve");
|
|
1697
|
+
__publicField(this, "setupReject");
|
|
1698
|
+
__publicField(this, "onWindowMessage", /* @__PURE__ */ __name((event) => {
|
|
1699
|
+
if (event.data?.type !== this.initMessageType) {
|
|
1700
|
+
return;
|
|
1701
|
+
}
|
|
1702
|
+
if (!Array.isArray(event.ports) || event.ports.length < 2) {
|
|
1703
|
+
const error = new Error("[Noxus] Renderer expected two MessagePorts (request + socket).");
|
|
1704
|
+
console.error(error);
|
|
1705
|
+
this.setupReject?.(error);
|
|
1706
|
+
this.resetSetupState();
|
|
1707
|
+
return;
|
|
1708
|
+
}
|
|
1709
|
+
this.windowRef.removeEventListener("message", this.onWindowMessage);
|
|
1710
|
+
this.requestPort = event.ports[0];
|
|
1711
|
+
this.socketPort = event.ports[1];
|
|
1712
|
+
this.senderId = event.data.senderId;
|
|
1713
|
+
if (this.requestPort === void 0 || this.socketPort === void 0) {
|
|
1714
|
+
const error = new Error("[Noxus] Renderer failed to receive valid MessagePorts.");
|
|
1715
|
+
console.error(error);
|
|
1716
|
+
this.setupReject?.(error);
|
|
1717
|
+
this.resetSetupState();
|
|
1718
|
+
return;
|
|
1719
|
+
}
|
|
1720
|
+
this.attachRequestPort(this.requestPort);
|
|
1721
|
+
this.attachSocketPort(this.socketPort);
|
|
1722
|
+
this.isReady = true;
|
|
1723
|
+
this.setupResolve?.();
|
|
1724
|
+
this.resetSetupState(true);
|
|
1725
|
+
}, "onWindowMessage"));
|
|
1726
|
+
__publicField(this, "onSocketMessage", /* @__PURE__ */ __name((event) => {
|
|
1727
|
+
if (this.events.tryDispatchFromMessageEvent(event)) {
|
|
1728
|
+
return;
|
|
1729
|
+
}
|
|
1730
|
+
console.warn("[Noxus] Received a socket message that is not a renderer event payload.", event.data);
|
|
1731
|
+
}, "onSocketMessage"));
|
|
1732
|
+
__publicField(this, "onRequestMessage", /* @__PURE__ */ __name((event) => {
|
|
1733
|
+
if (this.events.tryDispatchFromMessageEvent(event)) {
|
|
1734
|
+
return;
|
|
1735
|
+
}
|
|
1736
|
+
const response = event.data;
|
|
1737
|
+
if (!response || typeof response.requestId !== "string") {
|
|
1738
|
+
console.error("[Noxus] Renderer received an invalid response payload.", response);
|
|
1739
|
+
return;
|
|
1740
|
+
}
|
|
1741
|
+
const pending = this.pendingRequests.get(response.requestId);
|
|
1742
|
+
if (!pending) {
|
|
1743
|
+
console.error(`[Noxus] No pending handler found for request ${response.requestId}.`);
|
|
1744
|
+
return;
|
|
1745
|
+
}
|
|
1746
|
+
this.pendingRequests.delete(response.requestId);
|
|
1747
|
+
this.onRequestCompleted(pending, response);
|
|
1748
|
+
if (response.status >= 400) {
|
|
1749
|
+
pending.reject(response);
|
|
1750
|
+
return;
|
|
1751
|
+
}
|
|
1752
|
+
pending.resolve(response.body);
|
|
1753
|
+
}, "onRequestMessage"));
|
|
1754
|
+
this.windowRef = options.windowRef ?? window;
|
|
1755
|
+
const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
|
|
1756
|
+
this.bridge = resolvedBridge ?? null;
|
|
1757
|
+
this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
|
|
1758
|
+
this.generateRequestId = options.generateRequestId ?? defaultRequestId;
|
|
1759
|
+
}
|
|
1760
|
+
async setup() {
|
|
1761
|
+
if (this.isReady) {
|
|
1762
|
+
return Promise.resolve();
|
|
1763
|
+
}
|
|
1764
|
+
if (this.setupPromise) {
|
|
1765
|
+
return this.setupPromise;
|
|
1766
|
+
}
|
|
1767
|
+
if (!this.bridge || typeof this.bridge.requestPort !== "function") {
|
|
1768
|
+
throw new Error("[Noxus] Renderer bridge is missing requestPort().");
|
|
1769
|
+
}
|
|
1770
|
+
this.setupPromise = new Promise((resolve, reject) => {
|
|
1771
|
+
this.setupResolve = resolve;
|
|
1772
|
+
this.setupReject = reject;
|
|
1773
|
+
});
|
|
1774
|
+
this.windowRef.addEventListener("message", this.onWindowMessage);
|
|
1775
|
+
this.bridge.requestPort();
|
|
1776
|
+
return this.setupPromise;
|
|
1777
|
+
}
|
|
1778
|
+
dispose() {
|
|
1779
|
+
this.windowRef.removeEventListener("message", this.onWindowMessage);
|
|
1780
|
+
this.requestPort?.close();
|
|
1781
|
+
this.socketPort?.close();
|
|
1782
|
+
this.requestPort = void 0;
|
|
1783
|
+
this.socketPort = void 0;
|
|
1784
|
+
this.senderId = void 0;
|
|
1785
|
+
this.isReady = false;
|
|
1786
|
+
this.pendingRequests.clear();
|
|
1787
|
+
}
|
|
1788
|
+
async request(request) {
|
|
1789
|
+
const senderId = this.senderId;
|
|
1790
|
+
const requestId = this.generateRequestId();
|
|
1791
|
+
if (senderId === void 0) {
|
|
1792
|
+
return Promise.reject(this.createErrorResponse(requestId, "MessagePort is not available"));
|
|
1793
|
+
}
|
|
1794
|
+
const readinessError = this.validateReady(requestId);
|
|
1795
|
+
if (readinessError) {
|
|
1796
|
+
return Promise.reject(readinessError);
|
|
1797
|
+
}
|
|
1798
|
+
const message = {
|
|
1799
|
+
requestId,
|
|
1800
|
+
senderId,
|
|
1801
|
+
...request
|
|
1802
|
+
};
|
|
1803
|
+
return new Promise((resolve, reject) => {
|
|
1804
|
+
const pending = {
|
|
1805
|
+
resolve,
|
|
1806
|
+
reject: /* @__PURE__ */ __name((response) => reject(response), "reject"),
|
|
1807
|
+
request: message,
|
|
1808
|
+
submittedAt: Date.now()
|
|
1809
|
+
};
|
|
1810
|
+
this.pendingRequests.set(message.requestId, pending);
|
|
1811
|
+
this.requestPort.postMessage(message);
|
|
1812
|
+
});
|
|
1813
|
+
}
|
|
1814
|
+
async batch(requests) {
|
|
1815
|
+
return this.request({
|
|
1816
|
+
method: "BATCH",
|
|
1817
|
+
path: "",
|
|
1818
|
+
body: {
|
|
1819
|
+
requests
|
|
1820
|
+
}
|
|
1821
|
+
});
|
|
1822
|
+
}
|
|
1823
|
+
getSenderId() {
|
|
1824
|
+
return this.senderId;
|
|
1825
|
+
}
|
|
1826
|
+
onRequestCompleted(pending, response) {
|
|
1827
|
+
if (typeof console.groupCollapsed === "function") {
|
|
1828
|
+
console.groupCollapsed(`${response.status} ${pending.request.method} /${pending.request.path}`);
|
|
1829
|
+
}
|
|
1830
|
+
if (response.error) {
|
|
1831
|
+
console.error("error message:", response.error);
|
|
1832
|
+
}
|
|
1833
|
+
if (response.body !== void 0) {
|
|
1834
|
+
console.info("response:", response.body);
|
|
1835
|
+
}
|
|
1836
|
+
console.info("request:", pending.request);
|
|
1837
|
+
console.info(`Request duration: ${Date.now() - pending.submittedAt} ms`);
|
|
1838
|
+
if (typeof console.groupCollapsed === "function") {
|
|
1839
|
+
console.groupEnd();
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
attachRequestPort(port) {
|
|
1843
|
+
port.onmessage = this.onRequestMessage;
|
|
1844
|
+
port.start();
|
|
1845
|
+
}
|
|
1846
|
+
attachSocketPort(port) {
|
|
1847
|
+
port.onmessage = this.onSocketMessage;
|
|
1848
|
+
port.start();
|
|
1849
|
+
}
|
|
1850
|
+
validateReady(requestId) {
|
|
1851
|
+
if (!this.isElectronEnvironment()) {
|
|
1852
|
+
return this.createErrorResponse(requestId, "Not running in Electron environment");
|
|
1853
|
+
}
|
|
1854
|
+
if (!this.requestPort) {
|
|
1855
|
+
return this.createErrorResponse(requestId, "MessagePort is not available");
|
|
1856
|
+
}
|
|
1857
|
+
return void 0;
|
|
1858
|
+
}
|
|
1859
|
+
createErrorResponse(requestId, message) {
|
|
1860
|
+
return {
|
|
1861
|
+
status: 500,
|
|
1862
|
+
requestId,
|
|
1863
|
+
error: message
|
|
1864
|
+
};
|
|
1865
|
+
}
|
|
1866
|
+
resetSetupState(success = false) {
|
|
1867
|
+
if (!success) {
|
|
1868
|
+
this.setupPromise = void 0;
|
|
1869
|
+
}
|
|
1870
|
+
this.setupResolve = void 0;
|
|
1871
|
+
this.setupReject = void 0;
|
|
1872
|
+
}
|
|
1873
|
+
isElectronEnvironment() {
|
|
1874
|
+
return typeof window !== "undefined" && /Electron/.test(window.navigator.userAgent);
|
|
1875
|
+
}
|
|
1876
|
+
};
|
|
1877
|
+
__name(_NoxRendererClient, "NoxRendererClient");
|
|
1878
|
+
var NoxRendererClient = _NoxRendererClient;
|
|
1571
1879
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1572
1880
|
0 && (module.exports = {
|
|
1573
1881
|
AppInjector,
|
|
@@ -1598,6 +1906,7 @@ var RendererEventRegistry = _RendererEventRegistry;
|
|
|
1598
1906
|
NotFoundException,
|
|
1599
1907
|
NotImplementedException,
|
|
1600
1908
|
NoxApp,
|
|
1909
|
+
NoxRendererClient,
|
|
1601
1910
|
NoxSocket,
|
|
1602
1911
|
Patch,
|
|
1603
1912
|
PaymentRequiredException,
|
|
@@ -1619,6 +1928,7 @@ var RendererEventRegistry = _RendererEventRegistry;
|
|
|
1619
1928
|
VariantAlsoNegotiatesException,
|
|
1620
1929
|
bootstrapApplication,
|
|
1621
1930
|
createRendererEventMessage,
|
|
1931
|
+
exposeNoxusBridge,
|
|
1622
1932
|
getControllerMetadata,
|
|
1623
1933
|
getGuardForController,
|
|
1624
1934
|
getGuardForControllerAction,
|
|
@@ -1627,6 +1937,7 @@ var RendererEventRegistry = _RendererEventRegistry;
|
|
|
1627
1937
|
getMiddlewaresForControllerAction,
|
|
1628
1938
|
getModuleMetadata,
|
|
1629
1939
|
getRouteMetadata,
|
|
1940
|
+
hasInjectableMetadata,
|
|
1630
1941
|
inject,
|
|
1631
1942
|
isRendererEventMessage
|
|
1632
1943
|
});
|