@noxfly/noxus 1.1.10 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -9
- package/dist/index-5OkVPHfI.d.mts +268 -0
- package/dist/index-5OkVPHfI.d.ts +268 -0
- package/dist/{noxus.d.mts → main.d.mts} +17 -225
- package/dist/{noxus.d.ts → main.d.ts} +17 -225
- package/dist/{noxus.js → main.js} +211 -45
- package/dist/{noxus.mjs → main.mjs} +201 -40
- package/dist/renderer.d.mts +1 -0
- package/dist/renderer.d.ts +1 -0
- package/dist/renderer.js +265 -0
- package/dist/renderer.mjs +236 -0
- package/package.json +73 -48
- package/scripts/postbuild.js +10 -5
- package/src/app.ts +37 -41
- package/src/index.ts +1 -13
- package/src/main.ts +25 -0
- package/src/renderer-events.ts +110 -0
- package/src/request.ts +26 -0
- package/src/socket.ts +68 -0
- package/tsup.config.ts +2 -1
package/src/request.ts
CHANGED
|
@@ -68,3 +68,29 @@ export interface IResponse<TBody = unknown> {
|
|
|
68
68
|
export interface IBatchResponsePayload {
|
|
69
69
|
responses: IResponse[];
|
|
70
70
|
}
|
|
71
|
+
|
|
72
|
+
export const RENDERER_EVENT_TYPE = 'noxus:event';
|
|
73
|
+
|
|
74
|
+
export interface IRendererEventMessage<TPayload = unknown> {
|
|
75
|
+
type: typeof RENDERER_EVENT_TYPE;
|
|
76
|
+
event: string;
|
|
77
|
+
payload?: TPayload;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function createRendererEventMessage<TPayload = unknown>(event: string, payload?: TPayload): IRendererEventMessage<TPayload> {
|
|
81
|
+
return {
|
|
82
|
+
type: RENDERER_EVENT_TYPE,
|
|
83
|
+
event,
|
|
84
|
+
payload,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function isRendererEventMessage(value: unknown): value is IRendererEventMessage {
|
|
89
|
+
if(value === null || typeof value !== 'object') {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const possibleMessage = value as Partial<IRendererEventMessage>;
|
|
94
|
+
|
|
95
|
+
return possibleMessage.type === RENDERER_EVENT_TYPE && typeof possibleMessage.event === 'string';
|
|
96
|
+
}
|
package/src/socket.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright 2025 NoxFly
|
|
3
|
+
* @license MIT
|
|
4
|
+
* @author NoxFly
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Centralizes MessagePort storage for renderer communication and handles
|
|
9
|
+
* push-event delivery back to renderer processes.
|
|
10
|
+
*/
|
|
11
|
+
import { Injectable } from 'src/decorators/injectable.decorator';
|
|
12
|
+
import { createRendererEventMessage } from 'src/request';
|
|
13
|
+
import { Logger } from 'src/utils/logger';
|
|
14
|
+
|
|
15
|
+
@Injectable('singleton')
|
|
16
|
+
export class NoxSocket {
|
|
17
|
+
private readonly messagePorts = new Map<number, Electron.MessageChannelMain>();
|
|
18
|
+
|
|
19
|
+
public register(senderId: number, channel: Electron.MessageChannelMain): void {
|
|
20
|
+
this.messagePorts.set(senderId, channel);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public get(senderId: number): Electron.MessageChannelMain | undefined {
|
|
24
|
+
return this.messagePorts.get(senderId);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public unregister(senderId: number): void {
|
|
28
|
+
this.messagePorts.delete(senderId);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public getSenderIds(): number[] {
|
|
32
|
+
return [...this.messagePorts.keys()];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public emit<TPayload = unknown>(eventName: string, payload?: TPayload, targetSenderIds?: number[]): number {
|
|
36
|
+
const normalizedEvent = eventName.trim();
|
|
37
|
+
|
|
38
|
+
if(normalizedEvent.length === 0) {
|
|
39
|
+
throw new Error('Renderer event name must be a non-empty string.');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const recipients = targetSenderIds ?? this.getSenderIds();
|
|
43
|
+
let delivered = 0;
|
|
44
|
+
|
|
45
|
+
for(const senderId of recipients) {
|
|
46
|
+
const channel = this.messagePorts.get(senderId);
|
|
47
|
+
|
|
48
|
+
if(!channel) {
|
|
49
|
+
Logger.warn(`No message channel found for sender ID: ${senderId} while emitting "${normalizedEvent}".`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
channel.port1.postMessage(createRendererEventMessage(normalizedEvent, payload));
|
|
55
|
+
delivered++;
|
|
56
|
+
}
|
|
57
|
+
catch(error) {
|
|
58
|
+
Logger.error(`[Noxus] Failed to emit "${normalizedEvent}" to sender ${senderId}.`, error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return delivered;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public emitToRenderer<TPayload = unknown>(senderId: number, eventName: string, payload?: TPayload): boolean {
|
|
66
|
+
return this.emit(eventName, payload, [senderId]) > 0;
|
|
67
|
+
}
|
|
68
|
+
}
|