@noxfly/noxus 3.0.0-dev.0 → 3.0.0-dev.10

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 (59) hide show
  1. package/README.md +132 -16
  2. package/dist/child.d.mts +118 -4
  3. package/dist/child.d.ts +118 -4
  4. package/dist/child.js +402 -859
  5. package/dist/child.js.map +1 -0
  6. package/dist/child.mjs +389 -847
  7. package/dist/child.mjs.map +1 -0
  8. package/dist/main.d.mts +517 -25
  9. package/dist/main.d.ts +517 -25
  10. package/dist/main.js +1088 -988
  11. package/dist/main.js.map +1 -0
  12. package/dist/main.mjs +983 -884
  13. package/dist/main.mjs.map +1 -0
  14. package/dist/preload.d.mts +28 -0
  15. package/dist/preload.d.ts +28 -0
  16. package/dist/preload.js +95 -0
  17. package/dist/preload.js.map +1 -0
  18. package/dist/preload.mjs +70 -0
  19. package/dist/preload.mjs.map +1 -0
  20. package/dist/renderer.d.mts +186 -23
  21. package/dist/renderer.d.ts +186 -23
  22. package/dist/renderer.js +170 -170
  23. package/dist/renderer.js.map +1 -0
  24. package/dist/renderer.mjs +159 -157
  25. package/dist/renderer.mjs.map +1 -0
  26. package/package.json +35 -21
  27. package/.editorconfig +0 -16
  28. package/.github/copilot-instructions.md +0 -32
  29. package/.vscode/settings.json +0 -3
  30. package/eslint.config.js +0 -109
  31. package/scripts/postbuild.js +0 -31
  32. package/src/DI/app-injector.ts +0 -151
  33. package/src/DI/injector-explorer.ts +0 -143
  34. package/src/DI/token.ts +0 -53
  35. package/src/app.ts +0 -217
  36. package/src/bootstrap.ts +0 -108
  37. package/src/decorators/controller.decorator.ts +0 -58
  38. package/src/decorators/guards.decorator.ts +0 -15
  39. package/src/decorators/injectable.decorator.ts +0 -81
  40. package/src/decorators/method.decorator.ts +0 -66
  41. package/src/decorators/middleware.decorator.ts +0 -15
  42. package/src/exceptions.ts +0 -57
  43. package/src/index.ts +0 -13
  44. package/src/main.ts +0 -26
  45. package/src/non-electron-process.ts +0 -22
  46. package/src/preload-bridge.ts +0 -75
  47. package/src/renderer-client.ts +0 -338
  48. package/src/renderer-events.ts +0 -110
  49. package/src/request.ts +0 -97
  50. package/src/router.ts +0 -353
  51. package/src/routes.ts +0 -78
  52. package/src/socket.ts +0 -73
  53. package/src/utils/forward-ref.ts +0 -31
  54. package/src/utils/logger.ts +0 -430
  55. package/src/utils/radix-tree.ts +0 -210
  56. package/src/utils/types.ts +0 -21
  57. package/src/window/window-manager.ts +0 -255
  58. package/tsconfig.json +0 -29
  59. package/tsup.config.ts +0 -34
package/dist/renderer.mjs CHANGED
@@ -4,128 +4,155 @@
4
4
  * @author NoxFly
5
5
  */
6
6
  var __defProp = Object.defineProperty;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
8
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var __esm = (fn, res) => function __init() {
10
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
11
+ };
8
12
 
9
13
  // src/utils/forward-ref.ts
10
- var _ForwardReference = class _ForwardReference {
11
- constructor(forwardRefFn) {
12
- this.forwardRefFn = forwardRefFn;
14
+ var _ForwardReference, ForwardReference;
15
+ var init_forward_ref = __esm({
16
+ "src/utils/forward-ref.ts"() {
17
+ "use strict";
18
+ _ForwardReference = class _ForwardReference {
19
+ constructor(forwardRefFn) {
20
+ this.forwardRefFn = forwardRefFn;
21
+ }
22
+ };
23
+ __name(_ForwardReference, "ForwardReference");
24
+ ForwardReference = _ForwardReference;
13
25
  }
14
- };
15
- __name(_ForwardReference, "ForwardReference");
16
- var ForwardReference = _ForwardReference;
26
+ });
17
27
 
18
28
  // src/DI/token.ts
19
- var _Token = class _Token {
20
- constructor(target) {
21
- this.target = target;
22
- this.description = typeof target === "string" ? target : target.name;
23
- }
24
- toString() {
25
- return `Token(${this.description})`;
29
+ var _Token, Token;
30
+ var init_token = __esm({
31
+ "src/DI/token.ts"() {
32
+ "use strict";
33
+ _Token = class _Token {
34
+ constructor(target) {
35
+ this.target = target;
36
+ this.description = typeof target === "string" ? target : target.name;
37
+ }
38
+ toString() {
39
+ return `Token(${this.description})`;
40
+ }
41
+ };
42
+ __name(_Token, "Token");
43
+ Token = _Token;
26
44
  }
27
- };
28
- __name(_Token, "Token");
29
- var Token = _Token;
45
+ });
30
46
 
31
47
  // src/DI/app-injector.ts
32
48
  function keyOf(k) {
33
49
  return k;
34
50
  }
35
- __name(keyOf, "keyOf");
36
- var _AppInjector = class _AppInjector {
37
- constructor(name = null) {
38
- this.name = name;
39
- this.bindings = /* @__PURE__ */ new Map();
40
- this.singletons = /* @__PURE__ */ new Map();
41
- this.scoped = /* @__PURE__ */ new Map();
42
- }
43
- /**
44
- * Creates a child scope for per-request lifetime resolution.
45
- */
46
- createScope() {
47
- const scope = new _AppInjector();
48
- scope.bindings = this.bindings;
49
- scope.singletons = this.singletons;
50
- return scope;
51
- }
52
- /**
53
- * Registers a binding explicitly.
54
- */
55
- register(key, implementation, lifetime, deps = []) {
56
- const k = keyOf(key);
57
- if (!this.bindings.has(k)) {
58
- this.bindings.set(k, { lifetime, implementation, deps });
59
- }
60
- }
61
- /**
62
- * Resolves a dependency by token or class reference.
63
- */
64
- resolve(target) {
65
- if (target instanceof ForwardReference) {
66
- return this._resolveForwardRef(target);
67
- }
68
- const k = keyOf(target);
69
- const binding = this.bindings.get(k);
70
- if (!binding) {
71
- const name = target instanceof Token ? target.description : target.name ?? "unknown";
72
- throw new Error(
73
- `[Noxus DI] No binding found for "${name}".
74
- Did you forget to declare it in @Injectable({ deps }) or in bootstrapApplication({ singletons })?`
75
- );
76
- }
77
- switch (binding.lifetime) {
78
- case "transient":
79
- return this._instantiate(binding);
80
- case "scope": {
81
- if (this.scoped.has(k)) return this.scoped.get(k);
82
- const inst = this._instantiate(binding);
83
- this.scoped.set(k, inst);
84
- return inst;
51
+ var _AppInjector, AppInjector, RootInjector;
52
+ var init_app_injector = __esm({
53
+ "src/DI/app-injector.ts"() {
54
+ "use strict";
55
+ init_forward_ref();
56
+ init_token();
57
+ __name(keyOf, "keyOf");
58
+ _AppInjector = class _AppInjector {
59
+ constructor(name = null) {
60
+ this.name = name;
61
+ this.bindings = /* @__PURE__ */ new Map();
62
+ this.singletons = /* @__PURE__ */ new Map();
63
+ this.scoped = /* @__PURE__ */ new Map();
64
+ }
65
+ /**
66
+ * Creates a child scope for per-request lifetime resolution.
67
+ */
68
+ createScope() {
69
+ const scope = new _AppInjector();
70
+ scope.bindings = this.bindings;
71
+ scope.singletons = this.singletons;
72
+ return scope;
85
73
  }
86
- case "singleton": {
87
- if (this.singletons.has(k)) return this.singletons.get(k);
88
- const inst = this._instantiate(binding);
89
- this.singletons.set(k, inst);
90
- if (binding.instance === void 0) {
91
- binding.instance = inst;
74
+ /**
75
+ * Registers a binding explicitly.
76
+ */
77
+ register(key, implementation, lifetime, deps = []) {
78
+ const k = keyOf(key);
79
+ if (!this.bindings.has(k)) {
80
+ this.bindings.set(k, { lifetime, implementation, deps });
92
81
  }
93
- return inst;
94
82
  }
95
- }
96
- }
97
- // -------------------------------------------------------------------------
98
- _resolveForwardRef(ref) {
99
- return new Proxy({}, {
100
- get: /* @__PURE__ */ __name((_obj, prop, receiver) => {
101
- const realType = ref.forwardRefFn();
102
- const instance = this.resolve(realType);
103
- const value = Reflect.get(instance, prop, receiver);
104
- return typeof value === "function" ? value.bind(instance) : value;
105
- }, "get"),
106
- set: /* @__PURE__ */ __name((_obj, prop, value, receiver) => {
107
- const realType = ref.forwardRefFn();
108
- const instance = this.resolve(realType);
109
- return Reflect.set(instance, prop, value, receiver);
110
- }, "set"),
111
- getPrototypeOf: /* @__PURE__ */ __name(() => {
112
- const realType = ref.forwardRefFn();
113
- return realType.prototype;
114
- }, "getPrototypeOf")
115
- });
116
- }
117
- _instantiate(binding) {
118
- const resolvedDeps = binding.deps.map((dep) => this.resolve(dep));
119
- return new binding.implementation(...resolvedDeps);
83
+ /**
84
+ * Resolves a dependency by token or class reference.
85
+ */
86
+ resolve(target) {
87
+ if (target instanceof ForwardReference) {
88
+ return this._resolveForwardRef(target);
89
+ }
90
+ const k = keyOf(target);
91
+ if (this.singletons.has(k)) {
92
+ return this.singletons.get(k);
93
+ }
94
+ const binding = this.bindings.get(k);
95
+ if (!binding) {
96
+ const name = target instanceof Token ? target.description : target.name ?? "unknown";
97
+ throw new Error(
98
+ `[Noxus DI] No binding found for "${name}".
99
+ Did you forget to declare it in @Injectable({ deps }) or in bootstrapApplication({ singletons })?`
100
+ );
101
+ }
102
+ switch (binding.lifetime) {
103
+ case "transient":
104
+ return this._instantiate(binding);
105
+ case "scope": {
106
+ if (this.scoped.has(k)) return this.scoped.get(k);
107
+ const inst = this._instantiate(binding);
108
+ this.scoped.set(k, inst);
109
+ return inst;
110
+ }
111
+ case "singleton": {
112
+ if (this.singletons.has(k)) return this.singletons.get(k);
113
+ const inst = this._instantiate(binding);
114
+ this.singletons.set(k, inst);
115
+ if (binding.instance === void 0) {
116
+ binding.instance = inst;
117
+ }
118
+ return inst;
119
+ }
120
+ }
121
+ }
122
+ // -------------------------------------------------------------------------
123
+ _resolveForwardRef(ref) {
124
+ let resolved;
125
+ return new Proxy({}, {
126
+ get: /* @__PURE__ */ __name((_obj, prop, receiver) => {
127
+ resolved ?? (resolved = this.resolve(ref.forwardRefFn()));
128
+ const value = Reflect.get(resolved, prop, receiver);
129
+ return typeof value === "function" ? value.bind(resolved) : value;
130
+ }, "get"),
131
+ set: /* @__PURE__ */ __name((_obj, prop, value, receiver) => {
132
+ resolved ?? (resolved = this.resolve(ref.forwardRefFn()));
133
+ return Reflect.set(resolved, prop, value, receiver);
134
+ }, "set"),
135
+ getPrototypeOf: /* @__PURE__ */ __name(() => {
136
+ resolved ?? (resolved = this.resolve(ref.forwardRefFn()));
137
+ return Object.getPrototypeOf(resolved);
138
+ }, "getPrototypeOf")
139
+ });
140
+ }
141
+ _instantiate(binding) {
142
+ const resolvedDeps = binding.deps.map((dep) => this.resolve(dep));
143
+ return new binding.implementation(...resolvedDeps);
144
+ }
145
+ };
146
+ __name(_AppInjector, "AppInjector");
147
+ AppInjector = _AppInjector;
148
+ RootInjector = new AppInjector("root");
120
149
  }
121
- };
122
- __name(_AppInjector, "AppInjector");
123
- var AppInjector = _AppInjector;
124
- var RootInjector = new AppInjector("root");
150
+ });
125
151
 
126
- // src/request.ts
152
+ // src/internal/request.ts
153
+ init_app_injector();
127
154
  var _Request = class _Request {
128
- constructor(event, senderId, id, method, path, body) {
155
+ constructor(event, senderId, id, method, path, body, query) {
129
156
  this.event = event;
130
157
  this.senderId = senderId;
131
158
  this.id = id;
@@ -135,6 +162,7 @@ var _Request = class _Request {
135
162
  this.context = RootInjector.createScope();
136
163
  this.params = {};
137
164
  this.path = path.replace(/^\/|\/$/g, "");
165
+ this.query = query ?? {};
138
166
  }
139
167
  };
140
168
  __name(_Request, "Request");
@@ -157,53 +185,7 @@ function isRendererEventMessage(value) {
157
185
  }
158
186
  __name(isRendererEventMessage, "isRendererEventMessage");
159
187
 
160
- // src/preload-bridge.ts
161
- import { contextBridge, ipcRenderer } from "electron/renderer";
162
- var DEFAULT_EXPOSE_NAME = "noxus";
163
- var DEFAULT_INIT_EVENT = "init-port";
164
- var DEFAULT_REQUEST_CHANNEL = "gimme-my-port";
165
- var DEFAULT_RESPONSE_CHANNEL = "port";
166
- function exposeNoxusBridge(options = {}) {
167
- const {
168
- exposeAs = DEFAULT_EXPOSE_NAME,
169
- initMessageType = DEFAULT_INIT_EVENT,
170
- requestChannel = DEFAULT_REQUEST_CHANNEL,
171
- responseChannel = DEFAULT_RESPONSE_CHANNEL,
172
- targetWindow = window
173
- } = options;
174
- const api = {
175
- requestPort: /* @__PURE__ */ __name(() => {
176
- ipcRenderer.send(requestChannel);
177
- ipcRenderer.once(responseChannel, (event, message) => {
178
- const ports = (event.ports ?? []).filter((port) => port !== void 0);
179
- if (ports.length === 0) {
180
- console.error("[Noxus] No MessagePort received from main process.");
181
- return;
182
- }
183
- for (const port of ports) {
184
- try {
185
- port.start();
186
- } catch (error) {
187
- console.error("[Noxus] Failed to start MessagePort.", error);
188
- }
189
- }
190
- targetWindow.postMessage(
191
- {
192
- type: initMessageType,
193
- senderId: message?.senderId
194
- },
195
- "*",
196
- ports
197
- );
198
- });
199
- }, "requestPort")
200
- };
201
- contextBridge.exposeInMainWorld(exposeAs, api);
202
- return api;
203
- }
204
- __name(exposeNoxusBridge, "exposeNoxusBridge");
205
-
206
- // src/renderer-events.ts
188
+ // src/internal/renderer-events.ts
207
189
  var _RendererEventRegistry = class _RendererEventRegistry {
208
190
  constructor() {
209
191
  this.listeners = /* @__PURE__ */ new Map();
@@ -283,8 +265,8 @@ var _RendererEventRegistry = class _RendererEventRegistry {
283
265
  __name(_RendererEventRegistry, "RendererEventRegistry");
284
266
  var RendererEventRegistry = _RendererEventRegistry;
285
267
 
286
- // src/renderer-client.ts
287
- var DEFAULT_INIT_EVENT2 = "init-port";
268
+ // src/internal/renderer-client.ts
269
+ var DEFAULT_INIT_EVENT = "init-port";
288
270
  var DEFAULT_BRIDGE_NAMES = ["noxus", "ipcRenderer"];
289
271
  function defaultRequestId() {
290
272
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
@@ -383,6 +365,9 @@ var _NoxRendererClient = class _NoxRendererClient {
383
365
  console.error(`[Noxus] No pending handler found for request ${response.requestId}.`);
384
366
  return;
385
367
  }
368
+ if (pending.timer !== void 0) {
369
+ clearTimeout(pending.timer);
370
+ }
386
371
  this.pendingRequests.delete(response.requestId);
387
372
  this.onRequestCompleted(pending, response);
388
373
  if (response.status >= 400) {
@@ -394,8 +379,10 @@ var _NoxRendererClient = class _NoxRendererClient {
394
379
  this.windowRef = options.windowRef ?? window;
395
380
  const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);
396
381
  this.bridge = resolvedBridge ?? null;
397
- this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT2;
382
+ this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT;
398
383
  this.generateRequestId = options.generateRequestId ?? defaultRequestId;
384
+ this.requestTimeout = options.requestTimeout ?? 1e4;
385
+ this.enableLogging = options.enableLogging ?? true;
399
386
  }
400
387
  async setup() {
401
388
  if (this.isReady) {
@@ -423,9 +410,14 @@ var _NoxRendererClient = class _NoxRendererClient {
423
410
  this.socketPort = void 0;
424
411
  this.senderId = void 0;
425
412
  this.isReady = false;
413
+ for (const pending of this.pendingRequests.values()) {
414
+ if (pending.timer !== void 0) {
415
+ clearTimeout(pending.timer);
416
+ }
417
+ }
426
418
  this.pendingRequests.clear();
427
419
  }
428
- async request(request) {
420
+ async request(request, options) {
429
421
  const senderId = this.senderId;
430
422
  const requestId = this.generateRequestId();
431
423
  if (senderId === void 0) {
@@ -440,6 +432,7 @@ var _NoxRendererClient = class _NoxRendererClient {
440
432
  senderId,
441
433
  ...request
442
434
  };
435
+ const effectiveTimeout = options?.timeout ?? this.requestTimeout;
443
436
  return new Promise((resolve, reject) => {
444
437
  const pending = {
445
438
  resolve,
@@ -447,6 +440,12 @@ var _NoxRendererClient = class _NoxRendererClient {
447
440
  request: message,
448
441
  submittedAt: Date.now()
449
442
  };
443
+ if (effectiveTimeout > 0) {
444
+ pending.timer = setTimeout(() => {
445
+ this.pendingRequests.delete(message.requestId);
446
+ reject(this.createErrorResponse(message.requestId, `Request timed out after ${effectiveTimeout}ms`));
447
+ }, effectiveTimeout);
448
+ }
450
449
  this.pendingRequests.set(message.requestId, pending);
451
450
  this.requestPort.postMessage(message);
452
451
  });
@@ -464,6 +463,9 @@ var _NoxRendererClient = class _NoxRendererClient {
464
463
  return this.senderId;
465
464
  }
466
465
  onRequestCompleted(pending, response) {
466
+ if (!this.enableLogging) {
467
+ return;
468
+ }
467
469
  if (typeof console.groupCollapsed === "function") {
468
470
  console.groupCollapsed(`${response.status} ${pending.request.method} /${pending.request.path}`);
469
471
  }
@@ -522,7 +524,6 @@ export {
522
524
  RendererEventRegistry,
523
525
  Request,
524
526
  createRendererEventMessage,
525
- exposeNoxusBridge,
526
527
  isRendererEventMessage
527
528
  };
528
529
  /**
@@ -535,6 +536,7 @@ export {
535
536
  * @license MIT
536
537
  * @author NoxFly
537
538
  *
538
- * Entry point for renderer process and preload consumers.
539
+ * Entry point for renderer web consumers (Angular, React, Vue, Vanilla...).
540
+ * No Electron imports — safe to bundle with any web bundler.
539
541
  */
540
542
  //# sourceMappingURL=renderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/forward-ref.ts","../src/DI/token.ts","../src/DI/app-injector.ts","../src/internal/request.ts","../src/internal/renderer-events.ts","../src/internal/renderer-client.ts"],"sourcesContent":["/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * A function that returns a type.\r\n * Used for forward references to types that are not yet defined.\r\n */\r\nexport interface ForwardRefFn<T = any> {\r\n (): Type<T>;\r\n}\r\n\r\n/**\r\n * A wrapper class for forward referenced types.\r\n */\r\nexport class ForwardReference<T = any> {\r\n constructor(public readonly forwardRefFn: ForwardRefFn<T>) {}\r\n}\r\n\r\n/**\r\n * Creates a forward reference to a type.\r\n * @param fn A function that returns the type.\r\n * @returns A ForwardReference instance.\r\n */\r\nexport function forwardRef<T = any>(fn: ForwardRefFn<T>): ForwardReference<T> {\r\n return new ForwardReference(fn);\r\n}\r\n","/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\nimport { Type } from '../utils/types';\r\n\r\n/**\r\n * A DI token uniquely identifies a dependency.\r\n * It can wrap a class (Type<T>) or be a named symbol token.\r\n *\r\n * Using tokens instead of reflect-metadata means dependencies are\r\n * declared explicitly — no magic type inference, no emitDecoratorMetadata.\r\n *\r\n * @example\r\n * // Class token (most common)\r\n * const MY_SERVICE = token(MyService);\r\n *\r\n * // Named symbol token (for interfaces or non-class values)\r\n * const DB_URL = token<string>('DB_URL');\r\n */\r\nexport class Token<T> {\r\n public readonly description: string;\r\n\r\n constructor(\r\n public readonly target: Type<T> | string,\r\n ) {\r\n this.description = typeof target === 'string' ? target : target.name;\r\n }\r\n\r\n public toString(): string {\r\n return `Token(${this.description})`;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a DI token for a class type or a named value.\r\n *\r\n * @example\r\n * export const MY_SERVICE = token(MyService);\r\n * export const DB_URL = token<string>('DB_URL');\r\n */\r\nexport function token<T>(target: Type<T> | string): Token<T> {\r\n return new Token<T>(target);\r\n}\r\n\r\n/**\r\n * The key used to look up a class token in the registry.\r\n * For class tokens, the key is the class constructor itself.\r\n * For named tokens, the key is the Token instance.\r\n */\r\nexport type TokenKey<T = unknown> = Type<T> | Token<T>;\r\n","/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\nimport { ForwardReference } from '../utils/forward-ref';\r\nimport { Type } from '../utils/types';\r\nimport { Token, TokenKey } from './token';\r\n\r\n/**\r\n * Lifetime of a binding in the DI container.\r\n * - singleton: created once, shared for the lifetime of the app.\r\n * - scope: created once per request scope.\r\n * - transient: new instance every time it is resolved.\r\n */\r\nexport type Lifetime = 'singleton' | 'scope' | 'transient';\r\n\r\n/**\r\n * Internal representation of a registered binding.\r\n */\r\nexport interface IBinding<T = unknown> {\r\n lifetime: Lifetime;\r\n implementation: Type<T>;\r\n /** Explicit constructor dependencies, declared by the class itself. */\r\n deps: ReadonlyArray<TokenKey>;\r\n instance?: T;\r\n}\r\n\r\nfunction keyOf<T>(k: TokenKey<T>): Type<T> | Token<T> {\r\n return k;\r\n}\r\n\r\n/**\r\n * AppInjector is the core DI container.\r\n * It no longer uses reflect-metadata — all dependency information\r\n * comes from explicitly declared `deps` arrays on each binding.\r\n */\r\nexport class AppInjector {\r\n public readonly bindings = new Map<Type<unknown> | Token<unknown>, IBinding<unknown>>();\r\n public readonly singletons = new Map<Type<unknown> | Token<unknown>, unknown>();\r\n public readonly scoped = new Map<Type<unknown> | Token<unknown>, unknown>();\r\n\r\n constructor(public readonly name: string | null = null) {}\r\n\r\n /**\r\n * Creates a child scope for per-request lifetime resolution.\r\n */\r\n public createScope(): AppInjector {\r\n const scope = new AppInjector();\r\n (scope as any).bindings = this.bindings;\r\n (scope as any).singletons = this.singletons;\r\n return scope;\r\n }\r\n\r\n /**\r\n * Registers a binding explicitly.\r\n */\r\n public register<T>(\r\n key: TokenKey<T>,\r\n implementation: Type<T>,\r\n lifetime: Lifetime,\r\n deps: ReadonlyArray<TokenKey> = [],\r\n ): void {\r\n const k = keyOf(key) as TokenKey<unknown>;\r\n if (!this.bindings.has(k)) {\r\n this.bindings.set(k, { lifetime, implementation: implementation as Type<unknown>, deps });\r\n }\r\n }\r\n\r\n /**\r\n * Resolves a dependency by token or class reference.\r\n */\r\n public resolve<T>(target: TokenKey<T> | ForwardReference<T>): T {\r\n if (target instanceof ForwardReference) {\r\n return this._resolveForwardRef(target);\r\n }\r\n\r\n const k = keyOf(target) as TokenKey<unknown>;\r\n\r\n if (this.singletons.has(k)) {\r\n return this.singletons.get(k) as T;\r\n }\r\n\r\n const binding = this.bindings.get(k);\r\n\r\n if (!binding) {\r\n const name = target instanceof Token\r\n ? target.description\r\n : (target as Type<unknown>).name\r\n ?? 'unknown';\r\n\r\n throw new Error(\r\n `[Noxus DI] No binding found for \"${name}\".\\n`\r\n + `Did you forget to declare it in @Injectable({ deps }) or in bootstrapApplication({ singletons })?`,\r\n );\r\n }\r\n\r\n switch (binding.lifetime) {\r\n case 'transient':\r\n return this._instantiate(binding) as T;\r\n\r\n case 'scope': {\r\n if (this.scoped.has(k)) return this.scoped.get(k) as T;\r\n const inst = this._instantiate(binding);\r\n this.scoped.set(k, inst);\r\n return inst as T;\r\n }\r\n\r\n case 'singleton': {\r\n if (this.singletons.has(k)) return this.singletons.get(k) as T;\r\n const inst = this._instantiate(binding);\r\n this.singletons.set(k, inst);\r\n if (binding.instance === undefined) {\r\n (binding as IBinding<unknown>).instance = inst as unknown;\r\n }\r\n return inst as T;\r\n }\r\n }\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n\r\n private _resolveForwardRef<T>(ref: ForwardReference<T>): T {\r\n let resolved: T | undefined;\r\n return new Proxy({} as object, {\r\n get: (_obj, prop, receiver) => {\r\n resolved ??= this.resolve(ref.forwardRefFn()) as T;\r\n const value = Reflect.get(resolved as object, prop, receiver);\r\n return typeof value === 'function' ? (value as Function).bind(resolved) : value;\r\n },\r\n set: (_obj, prop, value, receiver) => {\r\n resolved ??= this.resolve(ref.forwardRefFn()) as T;\r\n return Reflect.set(resolved as object, prop, value, receiver);\r\n },\r\n getPrototypeOf: () => {\r\n resolved ??= this.resolve(ref.forwardRefFn()) as T;\r\n return Object.getPrototypeOf(resolved);\r\n },\r\n }) as T;\r\n }\r\n\r\n private _instantiate<T>(binding: IBinding<T>): T {\r\n const resolvedDeps = binding.deps.map((dep) => this.resolve(dep));\r\n return new binding.implementation(...resolvedDeps) as T;\r\n }\r\n}\r\n\r\n/**\r\n * The global root injector. All singletons live here.\r\n */\r\nexport const RootInjector = new AppInjector('root');\r\n\r\n/**\r\n * Resets the root injector to a clean state.\r\n * **Intended for testing only** — clears all bindings, singletons, and scoped instances\r\n * so that each test can start from a fresh DI container without restarting the process.\r\n */\r\nexport function resetRootInjector(): void {\r\n RootInjector.bindings.clear();\r\n RootInjector.singletons.clear();\r\n RootInjector.scoped.clear();\r\n // Lazy import to avoid circular dependency (InjectorExplorer → app-injector → InjectorExplorer)\r\n const { InjectorExplorer } = require('./injector-explorer') as typeof import('./injector-explorer');\r\n InjectorExplorer.reset();\r\n}\r\n\r\n/**\r\n * Convenience function: resolve a token from the root injector.\r\n */\r\nexport function inject<T>(t: TokenKey<T> | ForwardReference<T>): T {\r\n return RootInjector.resolve(t);\r\n}\r\n","/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\n\r\nimport { AtomicHttpMethod, HttpMethod } from '../decorators/method.decorator';\r\nimport { AppInjector, RootInjector } from '../DI/app-injector';\r\n\r\n/**\r\n * The Request class represents an HTTP request in the Noxus framework.\r\n * It encapsulates the request data, including the event, ID, method, path, and body.\r\n * It also provides a context for dependency injection through the AppInjector.\r\n */\r\nexport class Request {\r\n public readonly context: AppInjector = RootInjector.createScope();\r\n\r\n public readonly params: Record<string, string> = {};\r\n public readonly query: Record<string, unknown>;\r\n\r\n constructor(\r\n public readonly event: Electron.MessageEvent,\r\n public readonly senderId: number,\r\n public readonly id: string,\r\n public readonly method: HttpMethod,\r\n public readonly path: string,\r\n public readonly body: unknown,\r\n query?: Record<string, unknown>,\r\n ) {\r\n this.path = path.replace(/^\\/|\\/$/g, '');\r\n this.query = query ?? {};\r\n }\r\n}\r\n\r\n/**\r\n * The IRequest interface defines the structure of a request object.\r\n * It includes properties for the sender ID, request ID, path, method, and an optional body.\r\n * This interface is used to standardize the request data across the application.\r\n */\r\nexport interface IRequest<TBody = unknown> {\r\n senderId: number;\r\n requestId: string;\r\n path: string;\r\n method: HttpMethod;\r\n body?: TBody;\r\n query?: Record<string, unknown>;\r\n}\r\n\r\nexport interface IBatchRequestItem<TBody = unknown> {\r\n requestId?: string;\r\n path: string;\r\n method: AtomicHttpMethod;\r\n body?: TBody;\r\n query?: Record<string, unknown>;\r\n}\r\n\r\nexport interface IBatchRequestPayload {\r\n requests: IBatchRequestItem[];\r\n}\r\n\r\n/**\r\n * Creates a Request object from the IPC event data.\r\n * This function extracts the necessary information from the IPC event and constructs a Request instance.\r\n */\r\nexport interface IResponse<TBody = unknown> {\r\n requestId: string;\r\n status: number;\r\n body?: TBody;\r\n error?: string;\r\n stack?: string;\r\n}\r\n\r\nexport interface IBatchResponsePayload {\r\n responses: IResponse[];\r\n}\r\n\r\nexport const RENDERER_EVENT_TYPE = 'noxus:event';\r\n\r\nexport interface IRendererEventMessage<TPayload = unknown> {\r\n type: typeof RENDERER_EVENT_TYPE;\r\n event: string;\r\n payload?: TPayload;\r\n}\r\n\r\nexport function createRendererEventMessage<TPayload = unknown>(event: string, payload?: TPayload): IRendererEventMessage<TPayload> {\r\n return {\r\n type: RENDERER_EVENT_TYPE,\r\n event,\r\n payload,\r\n };\r\n}\r\n\r\nexport function isRendererEventMessage(value: unknown): value is IRendererEventMessage {\r\n if(value === null || typeof value !== 'object') {\r\n return false;\r\n }\r\n\r\n const possibleMessage = value as Partial<IRendererEventMessage>;\r\n\r\n return possibleMessage.type === RENDERER_EVENT_TYPE && typeof possibleMessage.event === 'string';\r\n}\r\n","/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\n/**\r\n * Lightweight event registry to help renderer processes subscribe to\r\n * push messages sent by the main process through Noxus.\r\n */\r\nimport { IRendererEventMessage, isRendererEventMessage } from './request';\r\n\r\nexport type RendererEventHandler<TPayload = unknown> = (payload: TPayload) => void;\r\n\r\nexport interface RendererEventSubscription {\r\n unsubscribe(): void;\r\n}\r\n\r\nexport class RendererEventRegistry {\r\n private readonly listeners = new Map<string, Set<RendererEventHandler>>();\r\n\r\n /**\r\n *\r\n */\r\n public subscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): RendererEventSubscription {\r\n const normalizedEventName = eventName.trim();\r\n\r\n if(normalizedEventName.length === 0) {\r\n throw new Error('Renderer event name must be a non-empty string.');\r\n }\r\n\r\n const handlers = this.listeners.get(normalizedEventName) ?? new Set<RendererEventHandler>();\r\n\r\n handlers.add(handler as RendererEventHandler);\r\n this.listeners.set(normalizedEventName, handlers);\r\n\r\n return {\r\n unsubscribe: () => this.unsubscribe(normalizedEventName, handler as RendererEventHandler),\r\n };\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public unsubscribe<TPayload>(eventName: string, handler: RendererEventHandler<TPayload>): void {\r\n const handlers = this.listeners.get(eventName);\r\n\r\n if(!handlers) {\r\n return;\r\n }\r\n\r\n handlers.delete(handler as RendererEventHandler);\r\n\r\n if(handlers.size === 0) {\r\n this.listeners.delete(eventName);\r\n }\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public clear(eventName?: string): void {\r\n if(eventName) {\r\n this.listeners.delete(eventName);\r\n return;\r\n }\r\n\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public dispatch<TPayload>(message: IRendererEventMessage<TPayload>): void {\r\n const handlers = this.listeners.get(message.event);\r\n\r\n if(!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n handlers.forEach((handler) => {\r\n try {\r\n handler(message.payload as TPayload);\r\n }\r\n catch(error) {\r\n console.error(`[Noxus] Renderer event handler for \"${message.event}\" threw an error.`, error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public tryDispatchFromMessageEvent(event: MessageEvent): boolean {\r\n if(!isRendererEventMessage(event.data)) {\r\n return false;\r\n }\r\n\r\n this.dispatch(event.data);\r\n return true;\r\n }\r\n\r\n /**\r\n *\r\n */\r\n public hasHandlers(eventName: string): boolean {\r\n const handlers = this.listeners.get(eventName);\r\n return !!handlers && handlers.size > 0;\r\n }\r\n}\r\n","/**\r\n * @copyright 2025 NoxFly\r\n * @license MIT\r\n * @author NoxFly\r\n */\r\n\r\nimport { IBatchRequestItem, IBatchResponsePayload, IRequest, IResponse } from './request';\r\nimport { RendererEventRegistry } from './renderer-events';\r\n\r\nexport interface IPortRequester {\r\n requestPort(): void;\r\n}\r\n\r\n/**\r\n * Per-request options that can override global client defaults.\r\n */\r\nexport interface RequestOptions {\r\n /**\r\n * Timeout in milliseconds for this specific request.\r\n * Overrides the global `requestTimeout` set on the client.\r\n * Set to 0 to disable timeout for this request.\r\n */\r\n timeout?: number;\r\n}\r\n\r\nexport interface RendererClientOptions {\r\n bridge?: IPortRequester | null;\r\n bridgeName?: string | string[];\r\n initMessageType?: string;\r\n windowRef?: Window;\r\n generateRequestId?: () => string;\r\n /**\r\n * Timeout in milliseconds for IPC requests.\r\n * If the main process does not respond within this duration,\r\n * the request Promise is rejected and the pending entry cleaned up.\r\n * Defaults to 10 000 ms. Set to 0 to disable.\r\n */\r\n requestTimeout?: number;\r\n /** @default true */\r\n enableLogging?: boolean;\r\n}\r\n\r\ninterface PendingRequest<T = unknown> {\r\n resolve: (value: T) => void;\r\n reject: (reason: IResponse<T>) => void;\r\n request: IRequest;\r\n submittedAt: number;\r\n timer?: ReturnType<typeof setTimeout>;\r\n}\r\n\r\nconst DEFAULT_INIT_EVENT = 'init-port';\r\nconst DEFAULT_BRIDGE_NAMES = ['noxus', 'ipcRenderer'];\r\n\r\nfunction defaultRequestId(): string {\r\n if(typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return crypto.randomUUID();\r\n }\r\n\r\n return `${Date.now().toString(16)}-${Math.floor(Math.random() * 1e8).toString(16)}`;\r\n}\r\n\r\nfunction normalizeBridgeNames(preferred?: string | string[]): string[] {\r\n const names: string[] = [];\r\n\r\n const add = (name: string | undefined): void => {\r\n if(!name)\r\n return;\r\n\r\n if(!names.includes(name)) {\r\n names.push(name);\r\n }\r\n };\r\n\r\n if(Array.isArray(preferred)) {\r\n for(const name of preferred) {\r\n add(name);\r\n }\r\n }\r\n else {\r\n add(preferred);\r\n }\r\n\r\n for(const fallback of DEFAULT_BRIDGE_NAMES) {\r\n add(fallback);\r\n }\r\n\r\n return names;\r\n}\r\n\r\nfunction resolveBridgeFromWindow(windowRef: Window, preferred?: string | string[]): IPortRequester | null {\r\n const names = normalizeBridgeNames(preferred);\r\n const globalRef = windowRef as unknown as Record<string, unknown> | null | undefined;\r\n\r\n if(!globalRef) {\r\n return null;\r\n }\r\n\r\n for(const name of names) {\r\n const candidate = globalRef[name];\r\n\r\n if(candidate && typeof (candidate as IPortRequester).requestPort === 'function') {\r\n return candidate as IPortRequester;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport class NoxRendererClient {\r\n public readonly events = new RendererEventRegistry();\r\n\r\n protected readonly pendingRequests = new Map<string, PendingRequest>();\r\n\r\n protected requestPort: MessagePort | undefined;\r\n protected socketPort: MessagePort | undefined;\r\n protected senderId: number | undefined;\r\n\r\n private readonly bridge: IPortRequester | null;\r\n private readonly initMessageType: string;\r\n private readonly windowRef: Window;\r\n private readonly generateRequestId: () => string;\r\n private readonly requestTimeout: number;\r\n\r\n private isReady = false;\r\n private setupPromise: Promise<void> | undefined;\r\n private setupResolve: (() => void) | undefined;\r\n private setupReject: ((reason: Error) => void) | undefined;\r\n\r\n private enableLogging: boolean;\r\n\r\n constructor(options: RendererClientOptions = {}) {\r\n this.windowRef = options.windowRef ?? window;\r\n const resolvedBridge = options.bridge ?? resolveBridgeFromWindow(this.windowRef, options.bridgeName);\r\n this.bridge = resolvedBridge ?? null;\r\n this.initMessageType = options.initMessageType ?? DEFAULT_INIT_EVENT;\r\n this.generateRequestId = options.generateRequestId ?? defaultRequestId;\r\n this.requestTimeout = options.requestTimeout ?? 10_000;\r\n this.enableLogging = options.enableLogging ?? true;\r\n }\r\n\r\n public async setup(): Promise<void> {\r\n if(this.isReady) {\r\n return Promise.resolve();\r\n }\r\n\r\n if(this.setupPromise) {\r\n return this.setupPromise;\r\n }\r\n\r\n if(!this.bridge || typeof this.bridge.requestPort !== 'function') {\r\n throw new Error('[Noxus] Renderer bridge is missing requestPort().');\r\n }\r\n\r\n this.setupPromise = new Promise<void>((resolve, reject) => {\r\n this.setupResolve = resolve;\r\n this.setupReject = reject;\r\n });\r\n\r\n this.windowRef.addEventListener('message', this.onWindowMessage);\r\n this.bridge.requestPort();\r\n\r\n return this.setupPromise;\r\n }\r\n\r\n public dispose(): void {\r\n this.windowRef.removeEventListener('message', this.onWindowMessage);\r\n\r\n this.requestPort?.close();\r\n this.socketPort?.close();\r\n\r\n this.requestPort = undefined;\r\n this.socketPort = undefined;\r\n this.senderId = undefined;\r\n this.isReady = false;\r\n\r\n for(const pending of this.pendingRequests.values()) {\r\n if(pending.timer !== undefined) {\r\n clearTimeout(pending.timer);\r\n }\r\n }\r\n\r\n this.pendingRequests.clear();\r\n }\r\n\r\n public async request<TResponse, TBody = unknown>(\r\n request: Omit<IRequest<TBody>, 'requestId' | 'senderId'>,\r\n options?: RequestOptions,\r\n ): Promise<TResponse> {\r\n const senderId = this.senderId;\r\n const requestId = this.generateRequestId();\r\n\r\n if(senderId === undefined) {\r\n return Promise.reject(this.createErrorResponse(requestId, 'MessagePort is not available'));\r\n }\r\n\r\n const readinessError = this.validateReady(requestId);\r\n\r\n if(readinessError) {\r\n return Promise.reject(readinessError as IResponse<TResponse>);\r\n }\r\n\r\n const message: IRequest<TBody> = {\r\n requestId,\r\n senderId,\r\n ...request,\r\n };\r\n\r\n const effectiveTimeout = options?.timeout ?? this.requestTimeout;\r\n\r\n return new Promise<TResponse>((resolve, reject) => {\r\n const pending: PendingRequest<TResponse> = {\r\n resolve,\r\n reject: (response: IResponse<TResponse>) => reject(response),\r\n request: message,\r\n submittedAt: Date.now(),\r\n };\r\n\r\n if(effectiveTimeout > 0) {\r\n pending.timer = setTimeout(() => {\r\n this.pendingRequests.delete(message.requestId);\r\n reject(this.createErrorResponse<TResponse>(message.requestId, `Request timed out after ${effectiveTimeout}ms`) as IResponse<TResponse>);\r\n }, effectiveTimeout);\r\n }\r\n\r\n this.pendingRequests.set(message.requestId, pending as PendingRequest);\r\n\r\n this.requestPort!.postMessage(message);\r\n });\r\n }\r\n\r\n public async batch(requests: Omit<IBatchRequestItem<unknown>, 'requestId'>[]): Promise<IBatchResponsePayload> {\r\n return this.request<IBatchResponsePayload>({\r\n method: 'BATCH',\r\n path: '',\r\n body: {\r\n requests,\r\n },\r\n });\r\n }\r\n\r\n public getSenderId(): number | undefined {\r\n return this.senderId;\r\n }\r\n\r\n private readonly onWindowMessage = (event: MessageEvent): void => {\r\n if(event.data?.type !== this.initMessageType) {\r\n return;\r\n }\r\n\r\n if(!Array.isArray(event.ports) || event.ports.length < 2) {\r\n const error = new Error('[Noxus] Renderer expected two MessagePorts (request + socket).');\r\n\r\n console.error(error);\r\n this.setupReject?.(error);\r\n this.resetSetupState();\r\n return;\r\n }\r\n\r\n this.windowRef.removeEventListener('message', this.onWindowMessage);\r\n\r\n this.requestPort = event.ports[0];\r\n this.socketPort = event.ports[1];\r\n this.senderId = event.data.senderId;\r\n\r\n if(this.requestPort === undefined || this.socketPort === undefined) {\r\n const error = new Error('[Noxus] Renderer failed to receive valid MessagePorts.');\r\n console.error(error);\r\n this.setupReject?.(error);\r\n this.resetSetupState();\r\n return;\r\n }\r\n\r\n this.attachRequestPort(this.requestPort);\r\n this.attachSocketPort(this.socketPort);\r\n\r\n this.isReady = true;\r\n this.setupResolve?.();\r\n this.resetSetupState(true);\r\n };\r\n\r\n private readonly onSocketMessage = (event: MessageEvent): void => {\r\n if(this.events.tryDispatchFromMessageEvent(event)) {\r\n return;\r\n }\r\n\r\n console.warn('[Noxus] Received a socket message that is not a renderer event payload.', event.data);\r\n };\r\n\r\n private readonly onRequestMessage = (event: MessageEvent): void => {\r\n if(this.events.tryDispatchFromMessageEvent(event)) {\r\n return;\r\n }\r\n\r\n const response: IResponse = event.data;\r\n\r\n if(!response || typeof response.requestId !== 'string') {\r\n console.error('[Noxus] Renderer received an invalid response payload.', response);\r\n return;\r\n }\r\n\r\n const pending = this.pendingRequests.get(response.requestId);\r\n\r\n if(!pending) {\r\n console.error(`[Noxus] No pending handler found for request ${response.requestId}.`);\r\n return;\r\n }\r\n\r\n if(pending.timer !== undefined) {\r\n clearTimeout(pending.timer);\r\n }\r\n\r\n this.pendingRequests.delete(response.requestId);\r\n\r\n this.onRequestCompleted(pending, response);\r\n\r\n if(response.status >= 400) {\r\n pending.reject(response as IResponse<any>);\r\n return;\r\n }\r\n\r\n pending.resolve(response.body as unknown);\r\n };\r\n\r\n protected onRequestCompleted(pending: PendingRequest, response: IResponse): void {\r\n if(!this.enableLogging) {\r\n return;\r\n }\r\n\r\n if(typeof console.groupCollapsed === 'function') {\r\n console.groupCollapsed(`${response.status} ${pending.request.method} /${pending.request.path}`);\r\n }\r\n\r\n if(response.error) {\r\n console.error('error message:', response.error);\r\n }\r\n\r\n if(response.body !== undefined) {\r\n console.info('response:', response.body);\r\n }\r\n\r\n console.info('request:', pending.request);\r\n console.info(`Request duration: ${Date.now() - pending.submittedAt} ms`);\r\n\r\n if(typeof console.groupCollapsed === 'function') {\r\n console.groupEnd();\r\n }\r\n }\r\n\r\n private attachRequestPort(port: MessagePort): void {\r\n port.onmessage = this.onRequestMessage;\r\n port.start();\r\n }\r\n\r\n private attachSocketPort(port: MessagePort): void {\r\n port.onmessage = this.onSocketMessage;\r\n port.start();\r\n }\r\n\r\n private validateReady(requestId: string): IResponse | undefined {\r\n if(!this.isElectronEnvironment()) {\r\n return this.createErrorResponse(requestId, 'Not running in Electron environment');\r\n }\r\n\r\n if(!this.requestPort) {\r\n return this.createErrorResponse(requestId, 'MessagePort is not available');\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private createErrorResponse<T>(requestId: string, message: string): IResponse<T> {\r\n return {\r\n status: 500,\r\n requestId,\r\n error: message,\r\n };\r\n }\r\n\r\n private resetSetupState(success = false): void {\r\n if(!success) {\r\n this.setupPromise = undefined;\r\n }\r\n\r\n this.setupResolve = undefined;\r\n this.setupReject = undefined;\r\n }\r\n\r\n public isElectronEnvironment(): boolean {\r\n return typeof window !== 'undefined' && /Electron/.test(window.navigator.userAgent);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,38 +1,60 @@
1
1
  {
2
2
  "name": "@noxfly/noxus",
3
- "version": "3.0.0-dev.0",
3
+ "version": "3.0.0-dev.10",
4
+ "author": "NoxFly",
5
+ "license": "MIT",
6
+ "description": "Lightweight HTTP-like IPC framework for Electron with standalone controllers, explicit DI, and lazy route loading. No reflect-metadata required.",
7
+ "homepage": "https://github.com/NoxFly/noxus",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/NoxFly/noxus.git"
11
+ },
12
+ "files": ["dist"],
4
13
  "main": "dist/main.js",
5
14
  "module": "dist/main.mjs",
6
15
  "types": "dist/main.d.ts",
7
16
  "exports": {
8
17
  ".": {
9
18
  "browser": {
10
- "types": "./dist/renderer.d.ts",
11
- "import": "./dist/renderer.mjs",
19
+ "types": "./dist/renderer.d.ts",
20
+ "import": "./dist/renderer.mjs",
12
21
  "require": "./dist/renderer.js"
13
22
  },
14
23
  "default": {
15
- "types": "./dist/child.d.ts",
16
- "import": "./dist/child.mjs",
24
+ "types": "./dist/child.d.ts",
25
+ "import": "./dist/child.mjs",
17
26
  "require": "./dist/child.js"
18
27
  }
19
28
  },
29
+ "./main": {
30
+ "types": "./dist/main.d.ts",
31
+ "import": "./dist/main.mjs",
32
+ "require": "./dist/main.js"
33
+ },
20
34
  "./renderer": {
21
- "types": "./dist/renderer.d.ts",
22
- "import": "./dist/renderer.mjs",
35
+ "types": "./dist/renderer.d.ts",
36
+ "import": "./dist/renderer.mjs",
23
37
  "require": "./dist/renderer.js"
24
38
  },
25
- "./main": {
26
- "types": "./dist/main.d.ts",
27
- "import": "./dist/main.mjs",
28
- "require": "./dist/main.js"
39
+ "./preload": {
40
+ "types": "./dist/preload.d.ts",
41
+ "import": "./dist/preload.mjs",
42
+ "require": "./dist/preload.js"
29
43
  },
30
44
  "./child": {
31
- "types": "./dist/child.d.ts",
32
- "import": "./dist/child.mjs",
45
+ "types": "./dist/child.d.ts",
46
+ "import": "./dist/child.mjs",
33
47
  "require": "./dist/child.js"
34
48
  }
35
49
  },
50
+ "typesVersions": {
51
+ "*": {
52
+ "main": ["./dist/main.d.ts"],
53
+ "renderer": ["./dist/renderer.d.ts"],
54
+ "preload": ["./dist/preload.d.ts"],
55
+ "child": ["./dist/child.d.ts"]
56
+ }
57
+ },
36
58
  "scripts": {
37
59
  "build": "tsup",
38
60
  "prepublishOnly": "npm run build",
@@ -51,14 +73,6 @@
51
73
  "standalone",
52
74
  "lazy-loading"
53
75
  ],
54
- "author": "NoxFly",
55
- "license": "MIT",
56
- "description": "Lightweight HTTP-like IPC framework for Electron with standalone controllers, explicit DI, and lazy route loading. No reflect-metadata required.",
57
- "homepage": "https://github.com/NoxFly/noxus",
58
- "repository": {
59
- "type": "git",
60
- "url": "git+https://github.com/NoxFly/noxus.git"
61
- },
62
76
  "engines": {
63
77
  "node": ">= 20"
64
78
  },
package/.editorconfig DELETED
@@ -1,16 +0,0 @@
1
- # Editor configuration, see https://editorconfig.org
2
- root = true
3
-
4
- [*]
5
- charset = utf-8
6
- indent_style = space
7
- indent_size = 4
8
- insert_final_newline = true
9
- trim_trailing_whitespace = true
10
-
11
- [*.ts]
12
- quote_type = single
13
-
14
- [*.md]
15
- max_line_length = off
16
- trim_trailing_whitespace = false
@@ -1,32 +0,0 @@
1
- # Copilot Instructions
2
- ## Core Architecture
3
- - bootstrapApplication in [src/bootstrap.ts](src/bootstrap.ts) waits for Electron app readiness, resolves NoxApp via DI, and returns a configured instance.
4
- - [src/app.ts](src/app.ts) wires ipcMain events, spawns paired request/socket MessageChannels per renderer, and delegates handling to Router and NoxSocket.
5
- - Package exports are split between renderer and main targets in [package.json](package.json); import Electron main APIs from @noxfly/noxus/main and renderer helpers from @noxfly/noxus or @noxfly/noxus/renderer.
6
- - Dependency injection centers on RootInjector in [src/DI/app-injector.ts](src/DI/app-injector.ts); @Injectable triggers auto-registration through [src/DI/injector-explorer.ts](src/DI/injector-explorer.ts) and supports singleton, scope, and transient lifetimes.
7
- - Modules decorated via [src/decorators/module.decorator.ts](src/decorators/module.decorator.ts) compose providers, controllers, and nested modules; bootstrapApplication rejects roots lacking Module metadata.
8
- ## Request Lifecycle
9
- - Request objects from [src/request.ts](src/request.ts) wrap Electron MessageEvents and spawn per-request DI scopes on Request.context.
10
- - Router in [src/router.ts](src/router.ts) indexes routes in a radix tree, merges controller-level and method-level decorators, and enforces root middlewares, route middlewares, then guards before invoking controller actions.
11
- - ResponseException subclasses in [src/exceptions.ts](src/exceptions.ts) propagate status codes; throwing one short-circuits the pipeline so Router returns a structured error payload.
12
- - Batch requests use HTTP method BATCH and normalization logic in Router.handleBatch; payloads must satisfy IBatchRequestPayload to fan out atomic subrequests.
13
- ## Communication Channels
14
- - ipcMain listens for gimme-my-port and posts two transferable ports back to the renderer: index 0 carries request/response traffic, index 1 is reserved for socket-style push messages.
15
- - NoxSocket in [src/socket.ts](src/socket.ts) maps sender IDs to {request, socket} channels and emits renderer events exclusively through channels.socket.port1.
16
- - Renderer helpers in [src/renderer-events.ts](src/renderer-events.ts) expose RendererEventRegistry.tryDispatchFromMessageEvent to route push events; the preload script must start both ports and hand the second to this registry.
17
- - Renderer-facing bootstrap lives in [src/renderer-client.ts](src/renderer-client.ts); NoxRendererClient requests ports, wires request/socket handlers, tracks pending promises, and surfaces RendererEventRegistry for push consumption.
18
- - Preload scripts should call exposeNoxusBridge from [src/preload-bridge.ts](src/preload-bridge.ts) to publish window.noxus.requestPort; the helper sends 'gimme-my-port' and forwards both transferable ports with the configured init message.
19
- - When adjusting preload or renderer glue, ensure window.postMessage('init-port', ...) forwards both ports so the socket channel stays alive alongside the request channel.
20
- ## Decorator Conventions
21
- - Controller paths omit leading/trailing slashes; method decorators (Get, Post, etc.) auto-trim segments via [src/decorators/method.decorator.ts](src/decorators/method.decorator.ts).
22
- - Guards registered through Authorize in [src/decorators/guards.decorator.ts](src/decorators/guards.decorator.ts) aggregate at controller and action scope; they must resolve truthy or Router throws UnauthorizedException.
23
- - Injectable lifetimes default to scope; use singleton for app-wide utilities (window managers, sockets) and transient for short-lived resources.
24
- ## Logging and Utilities
25
- - Logger in [src/utils/logger.ts](src/utils/logger.ts) standardizes color-coded log, warn, error, and comment output; use it when extending framework behavior.
26
- - Path resolution relies on RadixTree from [src/utils/radix-tree.ts](src/utils/radix-tree.ts); normalize controller and route paths to avoid duplicate slashes.
27
- - Request.params are filled by Router.extractParams; controllers read route params directly from Request without decorator helpers yet.
28
- ## Build and Tooling
29
- - Run npm run build to invoke tsup with dual ESM/CJS outputs configured in [tsup.config.ts](tsup.config.ts); the postbuild script at [scripts/postbuild.js](scripts/postbuild.js) deduplicates license banners.
30
- - Node 20 or newer is required; reflect-metadata is a peer dependency so host apps must install and import it before using decorators.
31
- - Source uses baseUrl ./ with tsc-alias, so prefer absolute imports like src/module/file when editing framework code to match existing style.
32
- - Dist artifacts live under dist/ and are published outputs; regenerate them via the build script rather than editing directly.
@@ -1,3 +0,0 @@
1
- {
2
- "typescript.tsdk": "node_modules\\typescript\\lib"
3
- }