mn-ws-server 0.0.0-stage → 0.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.
@@ -0,0 +1,114 @@
1
+ import type { ServerResponse } from 'node:http';
2
+ import { WebSocket } from 'ws';
3
+ import { type AppDescriptor } from './apps.js';
4
+ import { Logger } from './logger.js';
5
+ import { Store } from './store.js';
6
+ import { AuthHub } from './auth.js';
7
+ /**
8
+ * mn-ws server —— 公网侧的 HTTP ⇄ WebSocket 桥。
9
+ *
10
+ * 一个端口同时提供:
11
+ * · HTTP 面:/health /stats /clients /auth/* 以及 /<app>/* 桥接入口
12
+ * · WS 面:/ws —— 与本机 client half 的长连接
13
+ *
14
+ * ## 三层鉴权(缺一不可)
15
+ *
16
+ * L1 通道层:谁能接入这个桥
17
+ * · 设备令牌(go-ah 统一登录签发,带 userId)→ 只能访问**自己名下**的桥
18
+ * · 静态门禁 token(MN_WS_TOKEN)→ 等价于全量访问(共享密钥,慎用)
19
+ * L2 路由层:请求的 app 必须在该桥的注册表里,且属主匹配
20
+ * L3 应用层:原始 Authorization / Cookie 原样透传给 nx,nx 自己那套鉴权照常生效
21
+ *
22
+ * ## 路由表按 app 索引
23
+ *
24
+ * bridges: Map<app, {ws, bridgeId, userId, ...}>。一个 app 同时只有一个桥
25
+ * (后来者顶替前者)—— 同一台机器跑两份 nx 是异常状态,顶替比随机命中更可预期。
26
+ */
27
+ /** server 半的构造参数。 */
28
+ export interface ServerOptions {
29
+ host?: string;
30
+ port?: number;
31
+ wsPath?: string;
32
+ token?: string;
33
+ issuer?: string;
34
+ idpClientId?: string;
35
+ loginClientId?: string;
36
+ redirectUri?: string;
37
+ jwtSecret?: string;
38
+ authEnabled?: boolean;
39
+ insecure?: boolean;
40
+ requestTimeoutMs?: number;
41
+ dataDir?: string | null;
42
+ logLevel?: string;
43
+ }
44
+ /** 一条已注册的桥。 */
45
+ interface Bridge {
46
+ ws: WebSocket;
47
+ bridgeId: string;
48
+ userId: string;
49
+ isGate: boolean;
50
+ apps: AppDescriptor[];
51
+ meta: AppDescriptor | undefined;
52
+ connectedAt: string;
53
+ ip: string | undefined;
54
+ }
55
+ /** 一条等待中的请求。 */
56
+ interface Pending {
57
+ res: ServerResponse;
58
+ timer: NodeJS.Timeout;
59
+ bridgeId: string;
60
+ app: string;
61
+ startedAt: number;
62
+ status?: number;
63
+ resHeaders?: Record<string, unknown>;
64
+ chunks?: Buffer[];
65
+ }
66
+ /** 一条 WS 连接。 */
67
+ interface PeerMeta {
68
+ peerId: string;
69
+ bridgeId: string | null;
70
+ userId: string | null;
71
+ registered: boolean;
72
+ connectedAt: string;
73
+ ip: string | undefined;
74
+ }
75
+ export declare function createServer(userConfig?: ServerOptions): {
76
+ config: {
77
+ host: string;
78
+ port: number;
79
+ wsPath: string;
80
+ token: string;
81
+ issuer: string;
82
+ idpClientId: string;
83
+ loginClientId: string;
84
+ redirectUri: string;
85
+ jwtSecret: string;
86
+ authEnabled: boolean;
87
+ insecure: boolean;
88
+ requestTimeoutMs: number;
89
+ dataDir: string | null;
90
+ logLevel: string;
91
+ };
92
+ logger: Logger;
93
+ store: Store;
94
+ auth: AuthHub;
95
+ bridges: Map<string, Bridge>;
96
+ knownApps: Set<string>;
97
+ pending: Map<string, Pending>;
98
+ peers: Map<WebSocket, PeerMeta>;
99
+ stats: {
100
+ connections: number;
101
+ requestsIn: number;
102
+ forwarded: number;
103
+ offline: number;
104
+ rejected: number;
105
+ errors: number;
106
+ bytesIn: number;
107
+ bytesOut: number;
108
+ };
109
+ listen: () => Promise<number>;
110
+ close: () => Promise<void>;
111
+ APP_HEADER: string;
112
+ };
113
+ export {};
114
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,cAAc,EAAwB,MAAM,WAAW,CAAC;AACvF,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAQhD,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qBAAqB;AACrB,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAe;AACf,UAAU,MAAM;IACd,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAED,gBAAgB;AAChB,UAAU,OAAO;IACf,GAAG,EAAE,cAAc,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,gBAAgB;AAChB,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;CACxB;AAOD,wBAAgB,YAAY,CAAC,UAAU,GAAE,aAAkB;;cAvDlD,MAAM;cACN,MAAM;gBACJ,MAAM;eACP,MAAM;gBACL,MAAM;qBACD,MAAM;uBACJ,MAAM;qBACR,MAAM;mBACR,MAAM;qBACJ,OAAO;kBACV,OAAO;0BACC,MAAM;iBACf,MAAM,GAAG,IAAI;kBACZ,MAAM;;;;;;;;;;;;;;;;;;;kBA4rBE,OAAO,CAAC,MAAM,CAAC;iBAmBV,OAAO,CAAC,IAAI,CAAC;;EAoCtC"}