@noxfly/noxus 2.4.0 → 2.5.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/child.js +115 -10
- package/dist/child.mjs +115 -10
- package/dist/main.d.mts +72 -21
- package/dist/main.d.ts +72 -21
- package/dist/main.js +160 -381
- package/dist/main.mjs +161 -379
- package/dist/renderer.d.mts +112 -1
- package/dist/renderer.d.ts +112 -1
- package/dist/renderer.js +40 -2
- package/dist/renderer.mjs +39 -2
- package/dist/{index-BxWQVi6C.d.ts → request-CdpZ9qZL.d.ts} +1 -87
- package/dist/{index-DQBQQfMw.d.mts → request-Dx_5Prte.d.mts} +1 -87
- package/package.json +1 -1
- package/src/DI/injector-explorer.ts +49 -4
- package/src/app.ts +37 -0
- package/src/bootstrap.ts +18 -3
- package/src/index.ts +1 -0
- package/src/main.ts +0 -3
- package/src/router.ts +99 -6
package/dist/renderer.d.mts
CHANGED
|
@@ -1,2 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
import { I as IRendererEventMessage, a as IResponse, b as IRequest, c as IBatchRequestItem, d as IBatchResponsePayload } from './request-Dx_5Prte.mjs';
|
|
2
|
+
export { A as AtomicHttpMethod, H as HttpMethod, e as IBatchRequestPayload, f as RENDERER_EVENT_TYPE, R as Request, g as createRendererEventMessage, i as isRendererEventMessage } from './request-Dx_5Prte.mjs';
|
|
2
3
|
import './app-injector-B3MvgV3k.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @copyright 2025 NoxFly
|
|
7
|
+
* @license MIT
|
|
8
|
+
* @author NoxFly
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Lightweight event registry to help renderer processes subscribe to
|
|
12
|
+
* push messages sent by the main process through Noxus.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
type RendererEventHandler<TPayload = unknown> = (payload: TPayload) => void;
|
|
16
|
+
interface RendererEventSubscription {
|
|
17
|
+
unsubscribe(): void;
|
|
18
|
+
}
|
|
19
|
+
declare class RendererEventRegistry {
|
|
20
|
+
private readonly listeners;
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
subscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): RendererEventSubscription;
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
unsubscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): void;
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
clear(eventName?: string): void;
|
|
33
|
+
/**
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
dispatch<TPayload>(message: IRendererEventMessage<TPayload>): void;
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
tryDispatchFromMessageEvent(event: MessageEvent): boolean;
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
hasHandlers(eventName: string): boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
interface IPortRequester {
|
|
49
|
+
requestPort(): void;
|
|
50
|
+
}
|
|
51
|
+
interface RendererClientOptions {
|
|
52
|
+
bridge?: IPortRequester | null;
|
|
53
|
+
bridgeName?: string | string[];
|
|
54
|
+
initMessageType?: string;
|
|
55
|
+
windowRef?: Window;
|
|
56
|
+
generateRequestId?: () => string;
|
|
57
|
+
}
|
|
58
|
+
interface PendingRequest<T = unknown> {
|
|
59
|
+
resolve: (value: T) => void;
|
|
60
|
+
reject: (reason: IResponse<T>) => void;
|
|
61
|
+
request: IRequest;
|
|
62
|
+
submittedAt: number;
|
|
63
|
+
}
|
|
64
|
+
declare class NoxRendererClient {
|
|
65
|
+
readonly events: RendererEventRegistry;
|
|
66
|
+
protected readonly pendingRequests: Map<string, PendingRequest<unknown>>;
|
|
67
|
+
protected requestPort: MessagePort | undefined;
|
|
68
|
+
protected socketPort: MessagePort | undefined;
|
|
69
|
+
protected senderId: number | undefined;
|
|
70
|
+
private readonly bridge;
|
|
71
|
+
private readonly initMessageType;
|
|
72
|
+
private readonly windowRef;
|
|
73
|
+
private readonly generateRequestId;
|
|
74
|
+
private isReady;
|
|
75
|
+
private setupPromise;
|
|
76
|
+
private setupResolve;
|
|
77
|
+
private setupReject;
|
|
78
|
+
constructor(options?: RendererClientOptions);
|
|
79
|
+
setup(): Promise<void>;
|
|
80
|
+
dispose(): void;
|
|
81
|
+
request<TResponse, TBody = unknown>(request: Omit<IRequest<TBody>, 'requestId' | 'senderId'>): Promise<TResponse>;
|
|
82
|
+
batch(requests: Omit<IBatchRequestItem<unknown>, 'requestId'>[]): Promise<IBatchResponsePayload>;
|
|
83
|
+
getSenderId(): number | undefined;
|
|
84
|
+
private readonly onWindowMessage;
|
|
85
|
+
private readonly onSocketMessage;
|
|
86
|
+
private readonly onRequestMessage;
|
|
87
|
+
protected onRequestCompleted(pending: PendingRequest, response: IResponse): void;
|
|
88
|
+
private attachRequestPort;
|
|
89
|
+
private attachSocketPort;
|
|
90
|
+
private validateReady;
|
|
91
|
+
private createErrorResponse;
|
|
92
|
+
private resetSetupState;
|
|
93
|
+
isElectronEnvironment(): boolean;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
interface NoxusPreloadAPI extends IPortRequester {
|
|
98
|
+
}
|
|
99
|
+
interface NoxusPreloadOptions {
|
|
100
|
+
exposeAs?: string;
|
|
101
|
+
initMessageType?: string;
|
|
102
|
+
requestChannel?: string;
|
|
103
|
+
responseChannel?: string;
|
|
104
|
+
targetWindow?: Window;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Exposes a minimal bridge in the isolated preload context so renderer processes
|
|
108
|
+
* can request the two MessagePorts required by Noxus. The bridge forwards both
|
|
109
|
+
* request/response and socket ports to the renderer via window.postMessage.
|
|
110
|
+
*/
|
|
111
|
+
declare function exposeNoxusBridge(options?: NoxusPreloadOptions): NoxusPreloadAPI;
|
|
112
|
+
|
|
113
|
+
export { IBatchRequestItem, IBatchResponsePayload, type IPortRequester, IRendererEventMessage, IRequest, IResponse, NoxRendererClient, type NoxusPreloadAPI, type NoxusPreloadOptions, type RendererClientOptions, type RendererEventHandler, RendererEventRegistry, type RendererEventSubscription, exposeNoxusBridge };
|
package/dist/renderer.d.ts
CHANGED
|
@@ -1,2 +1,113 @@
|
|
|
1
|
-
|
|
1
|
+
import { I as IRendererEventMessage, a as IResponse, b as IRequest, c as IBatchRequestItem, d as IBatchResponsePayload } from './request-CdpZ9qZL.js';
|
|
2
|
+
export { A as AtomicHttpMethod, H as HttpMethod, e as IBatchRequestPayload, f as RENDERER_EVENT_TYPE, R as Request, g as createRendererEventMessage, i as isRendererEventMessage } from './request-CdpZ9qZL.js';
|
|
2
3
|
import './app-injector-B3MvgV3k.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @copyright 2025 NoxFly
|
|
7
|
+
* @license MIT
|
|
8
|
+
* @author NoxFly
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Lightweight event registry to help renderer processes subscribe to
|
|
12
|
+
* push messages sent by the main process through Noxus.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
type RendererEventHandler<TPayload = unknown> = (payload: TPayload) => void;
|
|
16
|
+
interface RendererEventSubscription {
|
|
17
|
+
unsubscribe(): void;
|
|
18
|
+
}
|
|
19
|
+
declare class RendererEventRegistry {
|
|
20
|
+
private readonly listeners;
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
subscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): RendererEventSubscription;
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
*/
|
|
28
|
+
unsubscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): void;
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
*/
|
|
32
|
+
clear(eventName?: string): void;
|
|
33
|
+
/**
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
dispatch<TPayload>(message: IRendererEventMessage<TPayload>): void;
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
*/
|
|
40
|
+
tryDispatchFromMessageEvent(event: MessageEvent): boolean;
|
|
41
|
+
/**
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
hasHandlers(eventName: string): boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
interface IPortRequester {
|
|
49
|
+
requestPort(): void;
|
|
50
|
+
}
|
|
51
|
+
interface RendererClientOptions {
|
|
52
|
+
bridge?: IPortRequester | null;
|
|
53
|
+
bridgeName?: string | string[];
|
|
54
|
+
initMessageType?: string;
|
|
55
|
+
windowRef?: Window;
|
|
56
|
+
generateRequestId?: () => string;
|
|
57
|
+
}
|
|
58
|
+
interface PendingRequest<T = unknown> {
|
|
59
|
+
resolve: (value: T) => void;
|
|
60
|
+
reject: (reason: IResponse<T>) => void;
|
|
61
|
+
request: IRequest;
|
|
62
|
+
submittedAt: number;
|
|
63
|
+
}
|
|
64
|
+
declare class NoxRendererClient {
|
|
65
|
+
readonly events: RendererEventRegistry;
|
|
66
|
+
protected readonly pendingRequests: Map<string, PendingRequest<unknown>>;
|
|
67
|
+
protected requestPort: MessagePort | undefined;
|
|
68
|
+
protected socketPort: MessagePort | undefined;
|
|
69
|
+
protected senderId: number | undefined;
|
|
70
|
+
private readonly bridge;
|
|
71
|
+
private readonly initMessageType;
|
|
72
|
+
private readonly windowRef;
|
|
73
|
+
private readonly generateRequestId;
|
|
74
|
+
private isReady;
|
|
75
|
+
private setupPromise;
|
|
76
|
+
private setupResolve;
|
|
77
|
+
private setupReject;
|
|
78
|
+
constructor(options?: RendererClientOptions);
|
|
79
|
+
setup(): Promise<void>;
|
|
80
|
+
dispose(): void;
|
|
81
|
+
request<TResponse, TBody = unknown>(request: Omit<IRequest<TBody>, 'requestId' | 'senderId'>): Promise<TResponse>;
|
|
82
|
+
batch(requests: Omit<IBatchRequestItem<unknown>, 'requestId'>[]): Promise<IBatchResponsePayload>;
|
|
83
|
+
getSenderId(): number | undefined;
|
|
84
|
+
private readonly onWindowMessage;
|
|
85
|
+
private readonly onSocketMessage;
|
|
86
|
+
private readonly onRequestMessage;
|
|
87
|
+
protected onRequestCompleted(pending: PendingRequest, response: IResponse): void;
|
|
88
|
+
private attachRequestPort;
|
|
89
|
+
private attachSocketPort;
|
|
90
|
+
private validateReady;
|
|
91
|
+
private createErrorResponse;
|
|
92
|
+
private resetSetupState;
|
|
93
|
+
isElectronEnvironment(): boolean;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
interface NoxusPreloadAPI extends IPortRequester {
|
|
98
|
+
}
|
|
99
|
+
interface NoxusPreloadOptions {
|
|
100
|
+
exposeAs?: string;
|
|
101
|
+
initMessageType?: string;
|
|
102
|
+
requestChannel?: string;
|
|
103
|
+
responseChannel?: string;
|
|
104
|
+
targetWindow?: Window;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Exposes a minimal bridge in the isolated preload context so renderer processes
|
|
108
|
+
* can request the two MessagePorts required by Noxus. The bridge forwards both
|
|
109
|
+
* request/response and socket ports to the renderer via window.postMessage.
|
|
110
|
+
*/
|
|
111
|
+
declare function exposeNoxusBridge(options?: NoxusPreloadOptions): NoxusPreloadAPI;
|
|
112
|
+
|
|
113
|
+
export { IBatchRequestItem, IBatchResponsePayload, type IPortRequester, IRendererEventMessage, IRequest, IResponse, NoxRendererClient, type NoxusPreloadAPI, type NoxusPreloadOptions, type RendererClientOptions, type RendererEventHandler, RendererEventRegistry, type RendererEventSubscription, exposeNoxusBridge };
|
package/dist/renderer.js
CHANGED
|
@@ -33,6 +33,7 @@ __export(src_exports, {
|
|
|
33
33
|
RendererEventRegistry: () => RendererEventRegistry,
|
|
34
34
|
Request: () => Request,
|
|
35
35
|
createRendererEventMessage: () => createRendererEventMessage,
|
|
36
|
+
exposeNoxusBridge: () => exposeNoxusBridge,
|
|
36
37
|
isRendererEventMessage: () => isRendererEventMessage
|
|
37
38
|
});
|
|
38
39
|
module.exports = __toCommonJS(src_exports);
|
|
@@ -217,6 +218,42 @@ function isRendererEventMessage(value) {
|
|
|
217
218
|
}
|
|
218
219
|
__name(isRendererEventMessage, "isRendererEventMessage");
|
|
219
220
|
|
|
221
|
+
// src/preload-bridge.ts
|
|
222
|
+
var import_renderer = require("electron/renderer");
|
|
223
|
+
var DEFAULT_EXPOSE_NAME = "noxus";
|
|
224
|
+
var DEFAULT_INIT_EVENT = "init-port";
|
|
225
|
+
var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
|
|
226
|
+
var DEFAULT_RESPONSE_CHANNEL = "port";
|
|
227
|
+
function exposeNoxusBridge(options = {}) {
|
|
228
|
+
const { exposeAs = DEFAULT_EXPOSE_NAME, initMessageType = DEFAULT_INIT_EVENT, requestChannel = DEFAULT_REQUEST_CHANNEL, responseChannel = DEFAULT_RESPONSE_CHANNEL, targetWindow = window } = options;
|
|
229
|
+
const api = {
|
|
230
|
+
requestPort: /* @__PURE__ */ __name(() => {
|
|
231
|
+
import_renderer.ipcRenderer.send(requestChannel);
|
|
232
|
+
import_renderer.ipcRenderer.once(responseChannel, (event, message) => {
|
|
233
|
+
const ports = (event.ports ?? []).filter((port) => port !== void 0);
|
|
234
|
+
if (ports.length === 0) {
|
|
235
|
+
console.error("[Noxus] No MessagePort received from main process.");
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
for (const port of ports) {
|
|
239
|
+
try {
|
|
240
|
+
port.start();
|
|
241
|
+
} catch (error) {
|
|
242
|
+
console.error("[Noxus] Failed to start MessagePort.", error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
targetWindow.postMessage({
|
|
246
|
+
type: initMessageType,
|
|
247
|
+
senderId: message?.senderId
|
|
248
|
+
}, "*", ports);
|
|
249
|
+
});
|
|
250
|
+
}, "requestPort")
|
|
251
|
+
};
|
|
252
|
+
import_renderer.contextBridge.exposeInMainWorld(exposeAs, api);
|
|
253
|
+
return api;
|
|
254
|
+
}
|
|
255
|
+
__name(exposeNoxusBridge, "exposeNoxusBridge");
|
|
256
|
+
|
|
220
257
|
// src/renderer-events.ts
|
|
221
258
|
var _RendererEventRegistry = class _RendererEventRegistry {
|
|
222
259
|
constructor() {
|
|
@@ -298,7 +335,7 @@ __name(_RendererEventRegistry, "RendererEventRegistry");
|
|
|
298
335
|
var RendererEventRegistry = _RendererEventRegistry;
|
|
299
336
|
|
|
300
337
|
// src/renderer-client.ts
|
|
301
|
-
var
|
|
338
|
+
var DEFAULT_INIT_EVENT2 = "init-port";
|
|
302
339
|
var DEFAULT_BRIDGE_NAMES = [
|
|
303
340
|
"noxus",
|
|
304
341
|
"ipcRenderer"
|
|
@@ -420,7 +457,7 @@ var _NoxRendererClient = class _NoxRendererClient {
|
|
|
420
457
|
this.windowRef = options.windowRef ?? window;
|
|
421
458
|
const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
|
|
422
459
|
this.bridge = resolvedBridge ?? null;
|
|
423
|
-
this.initMessageType = options.initMessageType ??
|
|
460
|
+
this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
|
|
424
461
|
this.generateRequestId = options.generateRequestId ?? defaultRequestId;
|
|
425
462
|
}
|
|
426
463
|
async setup() {
|
|
@@ -549,6 +586,7 @@ var NoxRendererClient = _NoxRendererClient;
|
|
|
549
586
|
RendererEventRegistry,
|
|
550
587
|
Request,
|
|
551
588
|
createRendererEventMessage,
|
|
589
|
+
exposeNoxusBridge,
|
|
552
590
|
isRendererEventMessage
|
|
553
591
|
});
|
|
554
592
|
/**
|
package/dist/renderer.mjs
CHANGED
|
@@ -188,6 +188,42 @@ function isRendererEventMessage(value) {
|
|
|
188
188
|
}
|
|
189
189
|
__name(isRendererEventMessage, "isRendererEventMessage");
|
|
190
190
|
|
|
191
|
+
// src/preload-bridge.ts
|
|
192
|
+
import { contextBridge, ipcRenderer } from "electron/renderer";
|
|
193
|
+
var DEFAULT_EXPOSE_NAME = "noxus";
|
|
194
|
+
var DEFAULT_INIT_EVENT = "init-port";
|
|
195
|
+
var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
|
|
196
|
+
var DEFAULT_RESPONSE_CHANNEL = "port";
|
|
197
|
+
function exposeNoxusBridge(options = {}) {
|
|
198
|
+
const { exposeAs = DEFAULT_EXPOSE_NAME, initMessageType = DEFAULT_INIT_EVENT, requestChannel = DEFAULT_REQUEST_CHANNEL, responseChannel = DEFAULT_RESPONSE_CHANNEL, targetWindow = window } = options;
|
|
199
|
+
const api = {
|
|
200
|
+
requestPort: /* @__PURE__ */ __name(() => {
|
|
201
|
+
ipcRenderer.send(requestChannel);
|
|
202
|
+
ipcRenderer.once(responseChannel, (event, message) => {
|
|
203
|
+
const ports = (event.ports ?? []).filter((port) => port !== void 0);
|
|
204
|
+
if (ports.length === 0) {
|
|
205
|
+
console.error("[Noxus] No MessagePort received from main process.");
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
for (const port of ports) {
|
|
209
|
+
try {
|
|
210
|
+
port.start();
|
|
211
|
+
} catch (error) {
|
|
212
|
+
console.error("[Noxus] Failed to start MessagePort.", error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
targetWindow.postMessage({
|
|
216
|
+
type: initMessageType,
|
|
217
|
+
senderId: message?.senderId
|
|
218
|
+
}, "*", ports);
|
|
219
|
+
});
|
|
220
|
+
}, "requestPort")
|
|
221
|
+
};
|
|
222
|
+
contextBridge.exposeInMainWorld(exposeAs, api);
|
|
223
|
+
return api;
|
|
224
|
+
}
|
|
225
|
+
__name(exposeNoxusBridge, "exposeNoxusBridge");
|
|
226
|
+
|
|
191
227
|
// src/renderer-events.ts
|
|
192
228
|
var _RendererEventRegistry = class _RendererEventRegistry {
|
|
193
229
|
constructor() {
|
|
@@ -269,7 +305,7 @@ __name(_RendererEventRegistry, "RendererEventRegistry");
|
|
|
269
305
|
var RendererEventRegistry = _RendererEventRegistry;
|
|
270
306
|
|
|
271
307
|
// src/renderer-client.ts
|
|
272
|
-
var
|
|
308
|
+
var DEFAULT_INIT_EVENT2 = "init-port";
|
|
273
309
|
var DEFAULT_BRIDGE_NAMES = [
|
|
274
310
|
"noxus",
|
|
275
311
|
"ipcRenderer"
|
|
@@ -391,7 +427,7 @@ var _NoxRendererClient = class _NoxRendererClient {
|
|
|
391
427
|
this.windowRef = options.windowRef ?? window;
|
|
392
428
|
const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
|
|
393
429
|
this.bridge = resolvedBridge ?? null;
|
|
394
|
-
this.initMessageType = options.initMessageType ??
|
|
430
|
+
this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
|
|
395
431
|
this.generateRequestId = options.generateRequestId ?? defaultRequestId;
|
|
396
432
|
}
|
|
397
433
|
async setup() {
|
|
@@ -519,6 +555,7 @@ export {
|
|
|
519
555
|
RendererEventRegistry,
|
|
520
556
|
Request,
|
|
521
557
|
createRendererEventMessage,
|
|
558
|
+
exposeNoxusBridge,
|
|
522
559
|
isRendererEventMessage
|
|
523
560
|
};
|
|
524
561
|
/**
|
|
@@ -164,90 +164,4 @@ interface IRendererEventMessage<TPayload = unknown> {
|
|
|
164
164
|
declare function createRendererEventMessage<TPayload = unknown>(event: string, payload?: TPayload): IRendererEventMessage<TPayload>;
|
|
165
165
|
declare function isRendererEventMessage(value: unknown): value is IRendererEventMessage;
|
|
166
166
|
|
|
167
|
-
|
|
168
|
-
* Lightweight event registry to help renderer processes subscribe to
|
|
169
|
-
* push messages sent by the main process through Noxus.
|
|
170
|
-
*/
|
|
171
|
-
|
|
172
|
-
type RendererEventHandler<TPayload = unknown> = (payload: TPayload) => void;
|
|
173
|
-
interface RendererEventSubscription {
|
|
174
|
-
unsubscribe(): void;
|
|
175
|
-
}
|
|
176
|
-
declare class RendererEventRegistry {
|
|
177
|
-
private readonly listeners;
|
|
178
|
-
/**
|
|
179
|
-
*
|
|
180
|
-
*/
|
|
181
|
-
subscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): RendererEventSubscription;
|
|
182
|
-
/**
|
|
183
|
-
*
|
|
184
|
-
*/
|
|
185
|
-
unsubscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): void;
|
|
186
|
-
/**
|
|
187
|
-
*
|
|
188
|
-
*/
|
|
189
|
-
clear(eventName?: string): void;
|
|
190
|
-
/**
|
|
191
|
-
*
|
|
192
|
-
*/
|
|
193
|
-
dispatch<TPayload>(message: IRendererEventMessage<TPayload>): void;
|
|
194
|
-
/**
|
|
195
|
-
*
|
|
196
|
-
*/
|
|
197
|
-
tryDispatchFromMessageEvent(event: MessageEvent): boolean;
|
|
198
|
-
/**
|
|
199
|
-
*
|
|
200
|
-
*/
|
|
201
|
-
hasHandlers(eventName: string): boolean;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
interface IPortRequester {
|
|
206
|
-
requestPort(): void;
|
|
207
|
-
}
|
|
208
|
-
interface RendererClientOptions {
|
|
209
|
-
bridge?: IPortRequester | null;
|
|
210
|
-
bridgeName?: string | string[];
|
|
211
|
-
initMessageType?: string;
|
|
212
|
-
windowRef?: Window;
|
|
213
|
-
generateRequestId?: () => string;
|
|
214
|
-
}
|
|
215
|
-
interface PendingRequest<T = unknown> {
|
|
216
|
-
resolve: (value: T) => void;
|
|
217
|
-
reject: (reason: IResponse<T>) => void;
|
|
218
|
-
request: IRequest;
|
|
219
|
-
submittedAt: number;
|
|
220
|
-
}
|
|
221
|
-
declare class NoxRendererClient {
|
|
222
|
-
readonly events: RendererEventRegistry;
|
|
223
|
-
protected readonly pendingRequests: Map<string, PendingRequest<unknown>>;
|
|
224
|
-
protected requestPort: MessagePort | undefined;
|
|
225
|
-
protected socketPort: MessagePort | undefined;
|
|
226
|
-
protected senderId: number | undefined;
|
|
227
|
-
private readonly bridge;
|
|
228
|
-
private readonly initMessageType;
|
|
229
|
-
private readonly windowRef;
|
|
230
|
-
private readonly generateRequestId;
|
|
231
|
-
private isReady;
|
|
232
|
-
private setupPromise;
|
|
233
|
-
private setupResolve;
|
|
234
|
-
private setupReject;
|
|
235
|
-
constructor(options?: RendererClientOptions);
|
|
236
|
-
setup(): Promise<void>;
|
|
237
|
-
dispose(): void;
|
|
238
|
-
request<TResponse, TBody = unknown>(request: Omit<IRequest<TBody>, 'requestId' | 'senderId'>): Promise<TResponse>;
|
|
239
|
-
batch(requests: Omit<IBatchRequestItem<unknown>, 'requestId'>[]): Promise<IBatchResponsePayload>;
|
|
240
|
-
getSenderId(): number | undefined;
|
|
241
|
-
private readonly onWindowMessage;
|
|
242
|
-
private readonly onSocketMessage;
|
|
243
|
-
private readonly onRequestMessage;
|
|
244
|
-
protected onRequestCompleted(pending: PendingRequest, response: IResponse): void;
|
|
245
|
-
private attachRequestPort;
|
|
246
|
-
private attachSocketPort;
|
|
247
|
-
private validateReady;
|
|
248
|
-
private createErrorResponse;
|
|
249
|
-
private resetSetupState;
|
|
250
|
-
isElectronEnvironment(): boolean;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export { Authorize as A, Delete as D, Get as G, type HttpMethod as H, type IResponse as I, NoxRendererClient as N, Post as P, Request as R, type IGuard as a, type IPortRequester as b, getGuardForControllerAction as c, type IRouteMetadata as d, type AtomicHttpMethod as e, getRouteMetadata as f, getGuardForController as g, Put as h, Patch as i, ROUTE_METADATA_KEY as j, type IRequest as k, type IBatchRequestItem as l, type IBatchRequestPayload as m, type IBatchResponsePayload as n, RENDERER_EVENT_TYPE as o, type IRendererEventMessage as p, createRendererEventMessage as q, isRendererEventMessage as r, type RendererEventHandler as s, type RendererEventSubscription as t, RendererEventRegistry as u, type RendererClientOptions as v };
|
|
167
|
+
export { type AtomicHttpMethod as A, Delete as D, Get as G, type HttpMethod as H, type IRendererEventMessage as I, Post as P, Request as R, type IResponse as a, type IRequest as b, type IBatchRequestItem as c, type IBatchResponsePayload as d, type IBatchRequestPayload as e, RENDERER_EVENT_TYPE as f, createRendererEventMessage as g, type IGuard as h, isRendererEventMessage as i, Authorize as j, getGuardForController as k, getGuardForControllerAction as l, type IRouteMetadata as m, getRouteMetadata as n, Put as o, Patch as p, ROUTE_METADATA_KEY as q };
|
|
@@ -164,90 +164,4 @@ interface IRendererEventMessage<TPayload = unknown> {
|
|
|
164
164
|
declare function createRendererEventMessage<TPayload = unknown>(event: string, payload?: TPayload): IRendererEventMessage<TPayload>;
|
|
165
165
|
declare function isRendererEventMessage(value: unknown): value is IRendererEventMessage;
|
|
166
166
|
|
|
167
|
-
|
|
168
|
-
* Lightweight event registry to help renderer processes subscribe to
|
|
169
|
-
* push messages sent by the main process through Noxus.
|
|
170
|
-
*/
|
|
171
|
-
|
|
172
|
-
type RendererEventHandler<TPayload = unknown> = (payload: TPayload) => void;
|
|
173
|
-
interface RendererEventSubscription {
|
|
174
|
-
unsubscribe(): void;
|
|
175
|
-
}
|
|
176
|
-
declare class RendererEventRegistry {
|
|
177
|
-
private readonly listeners;
|
|
178
|
-
/**
|
|
179
|
-
*
|
|
180
|
-
*/
|
|
181
|
-
subscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): RendererEventSubscription;
|
|
182
|
-
/**
|
|
183
|
-
*
|
|
184
|
-
*/
|
|
185
|
-
unsubscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): void;
|
|
186
|
-
/**
|
|
187
|
-
*
|
|
188
|
-
*/
|
|
189
|
-
clear(eventName?: string): void;
|
|
190
|
-
/**
|
|
191
|
-
*
|
|
192
|
-
*/
|
|
193
|
-
dispatch<TPayload>(message: IRendererEventMessage<TPayload>): void;
|
|
194
|
-
/**
|
|
195
|
-
*
|
|
196
|
-
*/
|
|
197
|
-
tryDispatchFromMessageEvent(event: MessageEvent): boolean;
|
|
198
|
-
/**
|
|
199
|
-
*
|
|
200
|
-
*/
|
|
201
|
-
hasHandlers(eventName: string): boolean;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
interface IPortRequester {
|
|
206
|
-
requestPort(): void;
|
|
207
|
-
}
|
|
208
|
-
interface RendererClientOptions {
|
|
209
|
-
bridge?: IPortRequester | null;
|
|
210
|
-
bridgeName?: string | string[];
|
|
211
|
-
initMessageType?: string;
|
|
212
|
-
windowRef?: Window;
|
|
213
|
-
generateRequestId?: () => string;
|
|
214
|
-
}
|
|
215
|
-
interface PendingRequest<T = unknown> {
|
|
216
|
-
resolve: (value: T) => void;
|
|
217
|
-
reject: (reason: IResponse<T>) => void;
|
|
218
|
-
request: IRequest;
|
|
219
|
-
submittedAt: number;
|
|
220
|
-
}
|
|
221
|
-
declare class NoxRendererClient {
|
|
222
|
-
readonly events: RendererEventRegistry;
|
|
223
|
-
protected readonly pendingRequests: Map<string, PendingRequest<unknown>>;
|
|
224
|
-
protected requestPort: MessagePort | undefined;
|
|
225
|
-
protected socketPort: MessagePort | undefined;
|
|
226
|
-
protected senderId: number | undefined;
|
|
227
|
-
private readonly bridge;
|
|
228
|
-
private readonly initMessageType;
|
|
229
|
-
private readonly windowRef;
|
|
230
|
-
private readonly generateRequestId;
|
|
231
|
-
private isReady;
|
|
232
|
-
private setupPromise;
|
|
233
|
-
private setupResolve;
|
|
234
|
-
private setupReject;
|
|
235
|
-
constructor(options?: RendererClientOptions);
|
|
236
|
-
setup(): Promise<void>;
|
|
237
|
-
dispose(): void;
|
|
238
|
-
request<TResponse, TBody = unknown>(request: Omit<IRequest<TBody>, 'requestId' | 'senderId'>): Promise<TResponse>;
|
|
239
|
-
batch(requests: Omit<IBatchRequestItem<unknown>, 'requestId'>[]): Promise<IBatchResponsePayload>;
|
|
240
|
-
getSenderId(): number | undefined;
|
|
241
|
-
private readonly onWindowMessage;
|
|
242
|
-
private readonly onSocketMessage;
|
|
243
|
-
private readonly onRequestMessage;
|
|
244
|
-
protected onRequestCompleted(pending: PendingRequest, response: IResponse): void;
|
|
245
|
-
private attachRequestPort;
|
|
246
|
-
private attachSocketPort;
|
|
247
|
-
private validateReady;
|
|
248
|
-
private createErrorResponse;
|
|
249
|
-
private resetSetupState;
|
|
250
|
-
isElectronEnvironment(): boolean;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
export { Authorize as A, Delete as D, Get as G, type HttpMethod as H, type IResponse as I, NoxRendererClient as N, Post as P, Request as R, type IGuard as a, type IPortRequester as b, getGuardForControllerAction as c, type IRouteMetadata as d, type AtomicHttpMethod as e, getRouteMetadata as f, getGuardForController as g, Put as h, Patch as i, ROUTE_METADATA_KEY as j, type IRequest as k, type IBatchRequestItem as l, type IBatchRequestPayload as m, type IBatchResponsePayload as n, RENDERER_EVENT_TYPE as o, type IRendererEventMessage as p, createRendererEventMessage as q, isRendererEventMessage as r, type RendererEventHandler as s, type RendererEventSubscription as t, RendererEventRegistry as u, type RendererClientOptions as v };
|
|
167
|
+
export { type AtomicHttpMethod as A, Delete as D, Get as G, type HttpMethod as H, type IRendererEventMessage as I, Post as P, Request as R, type IResponse as a, type IRequest as b, type IBatchRequestItem as c, type IBatchResponsePayload as d, type IBatchRequestPayload as e, RENDERER_EVENT_TYPE as f, createRendererEventMessage as g, type IGuard as h, isRendererEventMessage as i, Authorize as j, getGuardForController as k, getGuardForControllerAction as l, type IRouteMetadata as m, getRouteMetadata as n, Put as o, Patch as p, ROUTE_METADATA_KEY as q };
|
package/package.json
CHANGED
|
@@ -26,17 +26,23 @@ interface PendingRegistration {
|
|
|
26
26
|
export class InjectorExplorer {
|
|
27
27
|
private static readonly pending: PendingRegistration[] = [];
|
|
28
28
|
private static processed = false;
|
|
29
|
+
private static accumulating = false;
|
|
29
30
|
|
|
30
31
|
/**
|
|
31
32
|
* Enqueues a class for deferred registration.
|
|
32
33
|
* Called by the @Injectable decorator at import time.
|
|
33
34
|
*
|
|
34
|
-
* If {@link processPending} has already been called (i.e. after bootstrap)
|
|
35
|
-
*
|
|
36
|
-
* (e.g. middlewares loaded after bootstrap)
|
|
35
|
+
* If {@link processPending} has already been called (i.e. after bootstrap)
|
|
36
|
+
* and accumulation mode is not active, the class is registered immediately
|
|
37
|
+
* so that late dynamic imports (e.g. middlewares loaded after bootstrap)
|
|
38
|
+
* work correctly.
|
|
39
|
+
*
|
|
40
|
+
* When accumulation mode is active (between {@link beginAccumulate} and
|
|
41
|
+
* {@link flushAccumulated}), classes are queued instead — preserving the
|
|
42
|
+
* two-phase binding/resolution guarantee for lazy-loaded modules.
|
|
37
43
|
*/
|
|
38
44
|
public static enqueue(target: Type<unknown>, lifetime: Lifetime): void {
|
|
39
|
-
if(InjectorExplorer.processed) {
|
|
45
|
+
if(InjectorExplorer.processed && !InjectorExplorer.accumulating) {
|
|
40
46
|
InjectorExplorer.registerImmediate(target, lifetime);
|
|
41
47
|
return;
|
|
42
48
|
}
|
|
@@ -44,6 +50,45 @@ export class InjectorExplorer {
|
|
|
44
50
|
InjectorExplorer.pending.push({ target, lifetime });
|
|
45
51
|
}
|
|
46
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Enters accumulation mode. While active, all decorated classes discovered
|
|
55
|
+
* via dynamic imports are queued in {@link pending} rather than registered
|
|
56
|
+
* immediately. Call {@link flushAccumulated} to process them with the
|
|
57
|
+
* full two-phase (bind-then-resolve) guarantee.
|
|
58
|
+
*/
|
|
59
|
+
public static beginAccumulate(): void {
|
|
60
|
+
InjectorExplorer.accumulating = true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Exits accumulation mode and processes every class queued since
|
|
65
|
+
* {@link beginAccumulate} was called. Uses the same two-phase strategy
|
|
66
|
+
* as {@link processPending} (register all bindings first, then resolve
|
|
67
|
+
* singletons / controllers) so import ordering within a lazy batch
|
|
68
|
+
* does not cause resolution failures.
|
|
69
|
+
*/
|
|
70
|
+
public static flushAccumulated(): void {
|
|
71
|
+
InjectorExplorer.accumulating = false;
|
|
72
|
+
|
|
73
|
+
const queue = [...InjectorExplorer.pending];
|
|
74
|
+
InjectorExplorer.pending.length = 0;
|
|
75
|
+
|
|
76
|
+
// Phase 1: register all bindings without instantiation
|
|
77
|
+
for(const { target, lifetime } of queue) {
|
|
78
|
+
if(!RootInjector.bindings.has(target)) {
|
|
79
|
+
RootInjector.bindings.set(target, {
|
|
80
|
+
implementation: target,
|
|
81
|
+
lifetime
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Phase 2: resolve singletons, register controllers, log modules
|
|
87
|
+
for(const { target, lifetime } of queue) {
|
|
88
|
+
InjectorExplorer.processRegistration(target, lifetime);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
47
92
|
/**
|
|
48
93
|
* Processes all pending registrations in two phases:
|
|
49
94
|
* 1. Register all bindings (no instantiation) so every dependency is known.
|