@noxfly/noxus 2.4.0 → 3.0.0-dev.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.
Files changed (48) hide show
  1. package/README.md +403 -341
  2. package/dist/app-injector-Bz3Upc0y.d.mts +125 -0
  3. package/dist/app-injector-Bz3Upc0y.d.ts +125 -0
  4. package/dist/child.d.mts +48 -22
  5. package/dist/child.d.ts +48 -22
  6. package/dist/child.js +1114 -1239
  7. package/dist/child.mjs +1090 -1193
  8. package/dist/main.d.mts +304 -261
  9. package/dist/main.d.ts +304 -261
  10. package/dist/main.js +1473 -1873
  11. package/dist/main.mjs +1423 -1791
  12. package/dist/renderer.d.mts +113 -2
  13. package/dist/renderer.d.ts +113 -2
  14. package/dist/renderer.js +144 -132
  15. package/dist/renderer.mjs +143 -132
  16. package/dist/request-BlTtiHbi.d.ts +112 -0
  17. package/dist/request-qJ9EiDZc.d.mts +112 -0
  18. package/package.json +7 -7
  19. package/src/DI/app-injector.ts +95 -106
  20. package/src/DI/injector-explorer.ts +100 -81
  21. package/src/DI/token.ts +53 -0
  22. package/src/app.ts +141 -131
  23. package/src/bootstrap.ts +79 -40
  24. package/src/decorators/controller.decorator.ts +38 -27
  25. package/src/decorators/guards.decorator.ts +5 -64
  26. package/src/decorators/injectable.decorator.ts +68 -15
  27. package/src/decorators/method.decorator.ts +40 -81
  28. package/src/decorators/middleware.decorator.ts +5 -72
  29. package/src/index.ts +3 -0
  30. package/src/main.ts +4 -11
  31. package/src/non-electron-process.ts +0 -1
  32. package/src/preload-bridge.ts +1 -1
  33. package/src/renderer-client.ts +2 -2
  34. package/src/renderer-events.ts +1 -1
  35. package/src/request.ts +3 -3
  36. package/src/router.ts +221 -369
  37. package/src/routes.ts +78 -0
  38. package/src/socket.ts +4 -4
  39. package/src/window/window-manager.ts +255 -0
  40. package/tsconfig.json +5 -10
  41. package/tsup.config.ts +2 -2
  42. package/dist/app-injector-B3MvgV3k.d.mts +0 -95
  43. package/dist/app-injector-B3MvgV3k.d.ts +0 -95
  44. package/dist/index-BxWQVi6C.d.ts +0 -253
  45. package/dist/index-DQBQQfMw.d.mts +0 -253
  46. package/src/decorators/inject.decorator.ts +0 -24
  47. package/src/decorators/injectable.metadata.ts +0 -15
  48. package/src/decorators/module.decorator.ts +0 -75
@@ -1,2 +1,113 @@
1
- export { e as AtomicHttpMethod, H as HttpMethod, l as IBatchRequestItem, m as IBatchRequestPayload, n as IBatchResponsePayload, b as IPortRequester, p as IRendererEventMessage, k as IRequest, I as IResponse, N as NoxRendererClient, o as RENDERER_EVENT_TYPE, v as RendererClientOptions, s as RendererEventHandler, u as RendererEventRegistry, t as RendererEventSubscription, R as Request, q as createRendererEventMessage, r as isRendererEventMessage } from './index-DQBQQfMw.mjs';
2
- import './app-injector-B3MvgV3k.mjs';
1
+ import { I as IRendererEventMessage, a as IResponse, b as IRequest, c as IBatchRequestItem, d as IBatchResponsePayload } from './request-qJ9EiDZc.mjs';
2
+ export { A as AtomicHttpMethod, H as HttpMethod, e as IBatchRequestPayload, R as RENDERER_EVENT_TYPE, f as Request, g as createRendererEventMessage, i as isRendererEventMessage } from './request-qJ9EiDZc.mjs';
3
+ import './app-injector-Bz3Upc0y.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 };
@@ -1,2 +1,113 @@
1
- export { e as AtomicHttpMethod, H as HttpMethod, l as IBatchRequestItem, m as IBatchRequestPayload, n as IBatchResponsePayload, b as IPortRequester, p as IRendererEventMessage, k as IRequest, I as IResponse, N as NoxRendererClient, o as RENDERER_EVENT_TYPE, v as RendererClientOptions, s as RendererEventHandler, u as RendererEventRegistry, t as RendererEventSubscription, R as Request, q as createRendererEventMessage, r as isRendererEventMessage } from './index-BxWQVi6C.js';
2
- import './app-injector-B3MvgV3k.js';
1
+ import { I as IRendererEventMessage, a as IResponse, b as IRequest, c as IBatchRequestItem, d as IBatchResponsePayload } from './request-BlTtiHbi.js';
2
+ export { A as AtomicHttpMethod, H as HttpMethod, e as IBatchRequestPayload, R as RENDERER_EVENT_TYPE, f as Request, g as createRendererEventMessage, i as isRendererEventMessage } from './request-BlTtiHbi.js';
3
+ import './app-injector-Bz3Upc0y.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
@@ -8,7 +8,6 @@ var __defProp = Object.defineProperty;
8
8
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
9
  var __getOwnPropNames = Object.getOwnPropertyNames;
10
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
11
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
12
  var __export = (target, all) => {
14
13
  for (var name in all)
@@ -23,7 +22,6 @@ var __copyProps = (to, from, except, desc) => {
23
22
  return to;
24
23
  };
25
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
27
25
 
28
26
  // src/index.ts
29
27
  var src_exports = {};
@@ -33,72 +31,47 @@ __export(src_exports, {
33
31
  RendererEventRegistry: () => RendererEventRegistry,
34
32
  Request: () => Request,
35
33
  createRendererEventMessage: () => createRendererEventMessage,
34
+ exposeNoxusBridge: () => exposeNoxusBridge,
36
35
  isRendererEventMessage: () => isRendererEventMessage
37
36
  });
38
37
  module.exports = __toCommonJS(src_exports);
39
38
 
40
- // src/request.ts
41
- var import_reflect_metadata3 = require("reflect-metadata");
42
-
43
- // src/DI/app-injector.ts
44
- var import_reflect_metadata2 = require("reflect-metadata");
45
-
46
- // src/decorators/inject.decorator.ts
47
- var import_reflect_metadata = require("reflect-metadata");
48
- var INJECT_METADATA_KEY = "custom:inject";
49
-
50
- // src/exceptions.ts
51
- var _ResponseException = class _ResponseException extends Error {
52
- constructor(statusOrMessage, message) {
53
- let statusCode;
54
- if (typeof statusOrMessage === "number") {
55
- statusCode = statusOrMessage;
56
- } else if (typeof statusOrMessage === "string") {
57
- message = statusOrMessage;
58
- }
59
- super(message ?? "");
60
- __publicField(this, "status", 0);
61
- if (statusCode !== void 0) {
62
- this.status = statusCode;
63
- }
64
- this.name = this.constructor.name.replace(/([A-Z])/g, " $1");
65
- }
66
- };
67
- __name(_ResponseException, "ResponseException");
68
- var ResponseException = _ResponseException;
69
- var _InternalServerException = class _InternalServerException extends ResponseException {
70
- constructor() {
71
- super(...arguments);
72
- __publicField(this, "status", 500);
73
- }
74
- };
75
- __name(_InternalServerException, "InternalServerException");
76
- var InternalServerException = _InternalServerException;
77
-
78
39
  // src/utils/forward-ref.ts
79
40
  var _ForwardReference = class _ForwardReference {
80
41
  constructor(forwardRefFn) {
81
- __publicField(this, "forwardRefFn");
82
42
  this.forwardRefFn = forwardRefFn;
83
43
  }
84
44
  };
85
45
  __name(_ForwardReference, "ForwardReference");
86
46
  var ForwardReference = _ForwardReference;
87
47
 
48
+ // src/DI/token.ts
49
+ var _Token = class _Token {
50
+ constructor(target) {
51
+ this.target = target;
52
+ this.description = typeof target === "string" ? target : target.name;
53
+ }
54
+ toString() {
55
+ return `Token(${this.description})`;
56
+ }
57
+ };
58
+ __name(_Token, "Token");
59
+ var Token = _Token;
60
+
88
61
  // src/DI/app-injector.ts
62
+ function keyOf(k) {
63
+ return k;
64
+ }
65
+ __name(keyOf, "keyOf");
89
66
  var _AppInjector = class _AppInjector {
90
67
  constructor(name = null) {
91
- __publicField(this, "name");
92
- __publicField(this, "bindings", /* @__PURE__ */ new Map());
93
- __publicField(this, "singletons", /* @__PURE__ */ new Map());
94
- __publicField(this, "scoped", /* @__PURE__ */ new Map());
95
68
  this.name = name;
69
+ this.bindings = /* @__PURE__ */ new Map();
70
+ this.singletons = /* @__PURE__ */ new Map();
71
+ this.scoped = /* @__PURE__ */ new Map();
96
72
  }
97
73
  /**
98
- * Typically used to create a dependency injection scope
99
- * at the "scope" level (i.e., per-request lifetime).
100
- *
101
- * SHOULD NOT BE USED by anything else than the framework itself.
74
+ * Creates a child scope for per-request lifetime resolution.
102
75
  */
103
76
  createScope() {
104
77
  const scope = new _AppInjector();
@@ -107,70 +80,73 @@ var _AppInjector = class _AppInjector {
107
80
  return scope;
108
81
  }
109
82
  /**
110
- * Called when resolving a dependency,
111
- * i.e., retrieving the instance of a given class.
83
+ * Registers a binding explicitly.
84
+ */
85
+ register(key, implementation, lifetime, deps = []) {
86
+ const k = keyOf(key);
87
+ if (!this.bindings.has(k)) {
88
+ this.bindings.set(k, { lifetime, implementation, deps });
89
+ }
90
+ }
91
+ /**
92
+ * Resolves a dependency by token or class reference.
112
93
  */
113
94
  resolve(target) {
114
95
  if (target instanceof ForwardReference) {
115
- return new Proxy({}, {
116
- get: /* @__PURE__ */ __name((obj, prop, receiver) => {
117
- const realType = target.forwardRefFn();
118
- const instance = this.resolve(realType);
119
- const value = Reflect.get(instance, prop, receiver);
120
- return typeof value === "function" ? value.bind(instance) : value;
121
- }, "get"),
122
- set: /* @__PURE__ */ __name((obj, prop, value, receiver) => {
123
- const realType = target.forwardRefFn();
124
- const instance = this.resolve(realType);
125
- return Reflect.set(instance, prop, value, receiver);
126
- }, "set"),
127
- getPrototypeOf: /* @__PURE__ */ __name(() => {
128
- const realType = target.forwardRefFn();
129
- return realType.prototype;
130
- }, "getPrototypeOf")
131
- });
96
+ return this._resolveForwardRef(target);
132
97
  }
133
- const binding = this.bindings.get(target);
98
+ const k = keyOf(target);
99
+ const binding = this.bindings.get(k);
134
100
  if (!binding) {
135
- if (target === void 0) {
136
- throw new InternalServerException("Failed to resolve a dependency injection : Undefined target type.\nThis might be caused by a circular dependency.");
137
- }
138
- const name = target.name || "unknown";
139
- throw new InternalServerException(`Failed to resolve a dependency injection : No binding for type ${name}.
140
- Did you forget to use @Injectable() decorator ?`);
101
+ const name = target instanceof Token ? target.description : target.name ?? "unknown";
102
+ throw new Error(
103
+ `[Noxus DI] No binding found for "${name}".
104
+ Did you forget to declare it in @Injectable({ deps }) or in bootstrapApplication({ singletons })?`
105
+ );
141
106
  }
142
107
  switch (binding.lifetime) {
143
108
  case "transient":
144
- return this.instantiate(binding.implementation);
109
+ return this._instantiate(binding);
145
110
  case "scope": {
146
- if (this.scoped.has(target)) {
147
- return this.scoped.get(target);
148
- }
149
- const instance = this.instantiate(binding.implementation);
150
- this.scoped.set(target, instance);
151
- return instance;
111
+ if (this.scoped.has(k)) return this.scoped.get(k);
112
+ const inst = this._instantiate(binding);
113
+ this.scoped.set(k, inst);
114
+ return inst;
152
115
  }
153
116
  case "singleton": {
154
- if (binding.instance === void 0 && this.name === "root") {
155
- binding.instance = this.instantiate(binding.implementation);
156
- this.singletons.set(target, binding.instance);
117
+ if (this.singletons.has(k)) return this.singletons.get(k);
118
+ const inst = this._instantiate(binding);
119
+ this.singletons.set(k, inst);
120
+ if (binding.instance === void 0) {
121
+ binding.instance = inst;
157
122
  }
158
- return binding.instance;
123
+ return inst;
159
124
  }
160
125
  }
161
126
  }
162
- /**
163
- * Instantiates a class, resolving its dependencies.
164
- */
165
- instantiate(target) {
166
- const paramTypes = Reflect.getMetadata("design:paramtypes", target) || [];
167
- const injectParams = Reflect.getMetadata(INJECT_METADATA_KEY, target) || [];
168
- const params = paramTypes.map((paramType, index) => {
169
- const overrideToken = injectParams[index];
170
- const actualToken = overrideToken !== void 0 ? overrideToken : paramType;
171
- return this.resolve(actualToken);
127
+ // -------------------------------------------------------------------------
128
+ _resolveForwardRef(ref) {
129
+ return new Proxy({}, {
130
+ get: /* @__PURE__ */ __name((_obj, prop, receiver) => {
131
+ const realType = ref.forwardRefFn();
132
+ const instance = this.resolve(realType);
133
+ const value = Reflect.get(instance, prop, receiver);
134
+ return typeof value === "function" ? value.bind(instance) : value;
135
+ }, "get"),
136
+ set: /* @__PURE__ */ __name((_obj, prop, value, receiver) => {
137
+ const realType = ref.forwardRefFn();
138
+ const instance = this.resolve(realType);
139
+ return Reflect.set(instance, prop, value, receiver);
140
+ }, "set"),
141
+ getPrototypeOf: /* @__PURE__ */ __name(() => {
142
+ const realType = ref.forwardRefFn();
143
+ return realType.prototype;
144
+ }, "getPrototypeOf")
172
145
  });
173
- return new target(...params);
146
+ }
147
+ _instantiate(binding) {
148
+ const resolvedDeps = binding.deps.map((dep) => this.resolve(dep));
149
+ return new binding.implementation(...resolvedDeps);
174
150
  }
175
151
  };
176
152
  __name(_AppInjector, "AppInjector");
@@ -180,20 +156,14 @@ var RootInjector = new AppInjector("root");
180
156
  // src/request.ts
181
157
  var _Request = class _Request {
182
158
  constructor(event, senderId, id, method, path, body) {
183
- __publicField(this, "event");
184
- __publicField(this, "senderId");
185
- __publicField(this, "id");
186
- __publicField(this, "method");
187
- __publicField(this, "path");
188
- __publicField(this, "body");
189
- __publicField(this, "context", RootInjector.createScope());
190
- __publicField(this, "params", {});
191
159
  this.event = event;
192
160
  this.senderId = senderId;
193
161
  this.id = id;
194
162
  this.method = method;
195
163
  this.path = path;
196
164
  this.body = body;
165
+ this.context = RootInjector.createScope();
166
+ this.params = {};
197
167
  this.path = path.replace(/^\/|\/$/g, "");
198
168
  }
199
169
  };
@@ -217,10 +187,56 @@ function isRendererEventMessage(value) {
217
187
  }
218
188
  __name(isRendererEventMessage, "isRendererEventMessage");
219
189
 
190
+ // src/preload-bridge.ts
191
+ var import_renderer = require("electron/renderer");
192
+ var DEFAULT_EXPOSE_NAME = "noxus";
193
+ var DEFAULT_INIT_EVENT = "init-port";
194
+ var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
195
+ var DEFAULT_RESPONSE_CHANNEL = "port";
196
+ function exposeNoxusBridge(options = {}) {
197
+ const {
198
+ exposeAs = DEFAULT_EXPOSE_NAME,
199
+ initMessageType = DEFAULT_INIT_EVENT,
200
+ requestChannel = DEFAULT_REQUEST_CHANNEL,
201
+ responseChannel = DEFAULT_RESPONSE_CHANNEL,
202
+ targetWindow = window
203
+ } = options;
204
+ const api = {
205
+ requestPort: /* @__PURE__ */ __name(() => {
206
+ import_renderer.ipcRenderer.send(requestChannel);
207
+ import_renderer.ipcRenderer.once(responseChannel, (event, message) => {
208
+ const ports = (event.ports ?? []).filter((port) => port !== void 0);
209
+ if (ports.length === 0) {
210
+ console.error("[Noxus] No MessagePort received from main process.");
211
+ return;
212
+ }
213
+ for (const port of ports) {
214
+ try {
215
+ port.start();
216
+ } catch (error) {
217
+ console.error("[Noxus] Failed to start MessagePort.", error);
218
+ }
219
+ }
220
+ targetWindow.postMessage(
221
+ {
222
+ type: initMessageType,
223
+ senderId: message?.senderId
224
+ },
225
+ "*",
226
+ ports
227
+ );
228
+ });
229
+ }, "requestPort")
230
+ };
231
+ import_renderer.contextBridge.exposeInMainWorld(exposeAs, api);
232
+ return api;
233
+ }
234
+ __name(exposeNoxusBridge, "exposeNoxusBridge");
235
+
220
236
  // src/renderer-events.ts
221
237
  var _RendererEventRegistry = class _RendererEventRegistry {
222
238
  constructor() {
223
- __publicField(this, "listeners", /* @__PURE__ */ new Map());
239
+ this.listeners = /* @__PURE__ */ new Map();
224
240
  }
225
241
  /**
226
242
  *
@@ -298,11 +314,8 @@ __name(_RendererEventRegistry, "RendererEventRegistry");
298
314
  var RendererEventRegistry = _RendererEventRegistry;
299
315
 
300
316
  // src/renderer-client.ts
301
- var DEFAULT_INIT_EVENT = "init-port";
302
- var DEFAULT_BRIDGE_NAMES = [
303
- "noxus",
304
- "ipcRenderer"
305
- ];
317
+ var DEFAULT_INIT_EVENT2 = "init-port";
318
+ var DEFAULT_BRIDGE_NAMES = ["noxus", "ipcRenderer"];
306
319
  function defaultRequestId() {
307
320
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
308
321
  return crypto.randomUUID();
@@ -313,7 +326,8 @@ __name(defaultRequestId, "defaultRequestId");
313
326
  function normalizeBridgeNames(preferred) {
314
327
  const names = [];
315
328
  const add = /* @__PURE__ */ __name((name) => {
316
- if (!name) return;
329
+ if (!name)
330
+ return;
317
331
  if (!names.includes(name)) {
318
332
  names.push(name);
319
333
  }
@@ -348,20 +362,10 @@ function resolveBridgeFromWindow(windowRef, preferred) {
348
362
  __name(resolveBridgeFromWindow, "resolveBridgeFromWindow");
349
363
  var _NoxRendererClient = class _NoxRendererClient {
350
364
  constructor(options = {}) {
351
- __publicField(this, "events", new RendererEventRegistry());
352
- __publicField(this, "pendingRequests", /* @__PURE__ */ new Map());
353
- __publicField(this, "requestPort");
354
- __publicField(this, "socketPort");
355
- __publicField(this, "senderId");
356
- __publicField(this, "bridge");
357
- __publicField(this, "initMessageType");
358
- __publicField(this, "windowRef");
359
- __publicField(this, "generateRequestId");
360
- __publicField(this, "isReady", false);
361
- __publicField(this, "setupPromise");
362
- __publicField(this, "setupResolve");
363
- __publicField(this, "setupReject");
364
- __publicField(this, "onWindowMessage", /* @__PURE__ */ __name((event) => {
365
+ this.events = new RendererEventRegistry();
366
+ this.pendingRequests = /* @__PURE__ */ new Map();
367
+ this.isReady = false;
368
+ this.onWindowMessage = /* @__PURE__ */ __name((event) => {
365
369
  if (event.data?.type !== this.initMessageType) {
366
370
  return;
367
371
  }
@@ -388,14 +392,14 @@ var _NoxRendererClient = class _NoxRendererClient {
388
392
  this.isReady = true;
389
393
  this.setupResolve?.();
390
394
  this.resetSetupState(true);
391
- }, "onWindowMessage"));
392
- __publicField(this, "onSocketMessage", /* @__PURE__ */ __name((event) => {
395
+ }, "onWindowMessage");
396
+ this.onSocketMessage = /* @__PURE__ */ __name((event) => {
393
397
  if (this.events.tryDispatchFromMessageEvent(event)) {
394
398
  return;
395
399
  }
396
400
  console.warn("[Noxus] Received a socket message that is not a renderer event payload.", event.data);
397
- }, "onSocketMessage"));
398
- __publicField(this, "onRequestMessage", /* @__PURE__ */ __name((event) => {
401
+ }, "onSocketMessage");
402
+ this.onRequestMessage = /* @__PURE__ */ __name((event) => {
399
403
  if (this.events.tryDispatchFromMessageEvent(event)) {
400
404
  return;
401
405
  }
@@ -416,11 +420,11 @@ var _NoxRendererClient = class _NoxRendererClient {
416
420
  return;
417
421
  }
418
422
  pending.resolve(response.body);
419
- }, "onRequestMessage"));
423
+ }, "onRequestMessage");
420
424
  this.windowRef = options.windowRef ?? window;
421
425
  const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
422
426
  this.bridge = resolvedBridge ?? null;
423
- this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT;
427
+ this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
424
428
  this.generateRequestId = options.generateRequestId ?? defaultRequestId;
425
429
  }
426
430
  async setup() {
@@ -549,6 +553,7 @@ var NoxRendererClient = _NoxRendererClient;
549
553
  RendererEventRegistry,
550
554
  Request,
551
555
  createRendererEventMessage,
556
+ exposeNoxusBridge,
552
557
  isRendererEventMessage
553
558
  });
554
559
  /**
@@ -556,4 +561,11 @@ var NoxRendererClient = _NoxRendererClient;
556
561
  * @license MIT
557
562
  * @author NoxFly
558
563
  */
564
+ /**
565
+ * @copyright 2025 NoxFly
566
+ * @license MIT
567
+ * @author NoxFly
568
+ *
569
+ * Entry point for renderer process and preload consumers.
570
+ */
559
571
  //# sourceMappingURL=renderer.js.map