aws-runtime-bridge 1.0.3 → 1.1.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 (142) hide show
  1. package/dist/adapter/adapter.test.js +4 -4
  2. package/dist/adapter/types.d.ts.map +1 -1
  3. package/dist/adapter/types.js +0 -7
  4. package/dist/adapter/types.test.js +5 -53
  5. package/dist/middleware/auth.d.ts.map +1 -1
  6. package/dist/middleware/auth.js +4 -0
  7. package/dist/routes/instance.d.ts.map +1 -1
  8. package/dist/routes/instance.js +36 -0
  9. package/dist/routes/runtime-binding.d.ts.map +1 -1
  10. package/dist/routes/runtime-binding.js +45 -0
  11. package/dist/routes/sessions.js +1 -1
  12. package/dist/routes/terminal.d.ts.map +1 -1
  13. package/dist/routes/terminal.js +48 -14
  14. package/dist/routes/terminal.test.js +6 -2
  15. package/dist/services/agent-process-manager.js +4 -4
  16. package/dist/services/auto-register.d.ts +9 -0
  17. package/dist/services/auto-register.d.ts.map +1 -1
  18. package/dist/services/auto-register.js +190 -32
  19. package/dist/services/aws-client-agent-mcp.test.js +3 -0
  20. package/dist/services/mcp-launch-binding-queue.d.ts +36 -0
  21. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -0
  22. package/dist/services/mcp-launch-binding-queue.js +92 -0
  23. package/dist/services/mcp-launch-binding-queue.test.d.ts +2 -0
  24. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +1 -0
  25. package/dist/services/mcp-launch-binding-queue.test.js +107 -0
  26. package/dist/services/orphan-monitor.js +1 -1
  27. package/dist/services/process-detector.d.ts +1 -1
  28. package/dist/services/process-detector.d.ts.map +1 -1
  29. package/dist/services/process-detector.js +2 -11
  30. package/dist/services/process-registry.d.ts +1 -0
  31. package/dist/services/process-registry.d.ts.map +1 -1
  32. package/dist/services/process-registry.js +129 -108
  33. package/dist/services/terminal-persistence.d.ts.map +1 -1
  34. package/dist/services/terminal-persistence.js +47 -37
  35. package/dist/services/terminal-persistence.test.js +47 -1
  36. package/dist/utils/file-utils.d.ts +3 -0
  37. package/dist/utils/file-utils.d.ts.map +1 -1
  38. package/dist/utils/file-utils.js +32 -0
  39. package/package/aws-client-agent-mcp/README.md +288 -288
  40. package/package.json +76 -76
  41. package/dist/routes/aws-mcp.d.ts +0 -10
  42. package/dist/routes/aws-mcp.d.ts.map +0 -1
  43. package/dist/routes/aws-mcp.js +0 -74
  44. package/dist/routes/aws-mcp.test.d.ts +0 -2
  45. package/dist/routes/aws-mcp.test.d.ts.map +0 -1
  46. package/dist/routes/aws-mcp.test.js +0 -42
  47. package/dist/routes/memory.d.ts +0 -13
  48. package/dist/routes/memory.d.ts.map +0 -1
  49. package/dist/routes/memory.js +0 -429
  50. package/dist/services/aws-mcp-http.d.ts +0 -11
  51. package/dist/services/aws-mcp-http.d.ts.map +0 -1
  52. package/dist/services/aws-mcp-http.js +0 -225
  53. package/dist/services/aws-mcp-http.test.d.ts +0 -2
  54. package/dist/services/aws-mcp-http.test.d.ts.map +0 -1
  55. package/dist/services/aws-mcp-http.test.js +0 -27
  56. package/dist/services/easytier-manager.d.ts +0 -106
  57. package/dist/services/easytier-manager.d.ts.map +0 -1
  58. package/dist/services/easytier-manager.js +0 -331
  59. package/dist/services/easytier-manager.test.d.ts +0 -5
  60. package/dist/services/easytier-manager.test.d.ts.map +0 -1
  61. package/dist/services/easytier-manager.test.js +0 -98
  62. package/dist/services/memory-service.d.ts +0 -195
  63. package/dist/services/memory-service.d.ts.map +0 -1
  64. package/dist/services/memory-service.js +0 -650
  65. package/dist/services/session-lookup.d.ts +0 -20
  66. package/dist/services/session-lookup.d.ts.map +0 -1
  67. package/dist/services/session-lookup.js +0 -43
  68. package/dist/services/user-api-key-service.d.ts +0 -28
  69. package/dist/services/user-api-key-service.d.ts.map +0 -1
  70. package/dist/services/user-api-key-service.js +0 -75
  71. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts +0 -38
  72. package/node_modules/@cc-switch/sdk/dist/adapters/common.d.ts.map +0 -1
  73. package/node_modules/@cc-switch/sdk/dist/adapters/common.js +0 -47
  74. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts +0 -5
  75. package/node_modules/@cc-switch/sdk/dist/adapters/index.d.ts.map +0 -1
  76. package/node_modules/@cc-switch/sdk/dist/adapters/index.js +0 -28
  77. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts +0 -10
  78. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  79. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claude.js +0 -39
  80. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  81. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  82. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-claudecode.js +0 -40
  83. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  84. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  85. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.js +0 -63
  86. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  87. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  88. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-opencode.test.js +0 -86
  89. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  90. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  91. package/node_modules/@cc-switch/sdk/dist/adapters/mcp-placeholder.js +0 -14
  92. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts +0 -10
  93. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  94. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claude.js +0 -51
  95. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  96. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  97. package/node_modules/@cc-switch/sdk/dist/adapters/skill-claudecode.js +0 -51
  98. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts +0 -10
  99. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  100. package/node_modules/@cc-switch/sdk/dist/adapters/skill-opencode.js +0 -51
  101. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  102. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  103. package/node_modules/@cc-switch/sdk/dist/adapters/skill-placeholder.js +0 -14
  104. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts +0 -78
  105. package/node_modules/@cc-switch/sdk/dist/services/instance-service.d.ts.map +0 -1
  106. package/node_modules/@cc-switch/sdk/dist/services/instance-service.js +0 -180
  107. package/package/cc-switch-sdk/dist/adapters/common.d.ts +0 -38
  108. package/package/cc-switch-sdk/dist/adapters/common.d.ts.map +0 -1
  109. package/package/cc-switch-sdk/dist/adapters/common.js +0 -47
  110. package/package/cc-switch-sdk/dist/adapters/index.d.ts +0 -5
  111. package/package/cc-switch-sdk/dist/adapters/index.d.ts.map +0 -1
  112. package/package/cc-switch-sdk/dist/adapters/index.js +0 -28
  113. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts +0 -10
  114. package/package/cc-switch-sdk/dist/adapters/mcp-claude.d.ts.map +0 -1
  115. package/package/cc-switch-sdk/dist/adapters/mcp-claude.js +0 -39
  116. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts +0 -10
  117. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.d.ts.map +0 -1
  118. package/package/cc-switch-sdk/dist/adapters/mcp-claudecode.js +0 -40
  119. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts +0 -18
  120. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.d.ts.map +0 -1
  121. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.js +0 -63
  122. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts +0 -2
  123. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.d.ts.map +0 -1
  124. package/package/cc-switch-sdk/dist/adapters/mcp-opencode.test.js +0 -86
  125. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts +0 -9
  126. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.d.ts.map +0 -1
  127. package/package/cc-switch-sdk/dist/adapters/mcp-placeholder.js +0 -14
  128. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts +0 -10
  129. package/package/cc-switch-sdk/dist/adapters/skill-claude.d.ts.map +0 -1
  130. package/package/cc-switch-sdk/dist/adapters/skill-claude.js +0 -51
  131. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts +0 -10
  132. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.d.ts.map +0 -1
  133. package/package/cc-switch-sdk/dist/adapters/skill-claudecode.js +0 -51
  134. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts +0 -10
  135. package/package/cc-switch-sdk/dist/adapters/skill-opencode.d.ts.map +0 -1
  136. package/package/cc-switch-sdk/dist/adapters/skill-opencode.js +0 -51
  137. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts +0 -9
  138. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.d.ts.map +0 -1
  139. package/package/cc-switch-sdk/dist/adapters/skill-placeholder.js +0 -14
  140. package/package/cc-switch-sdk/dist/services/instance-service.d.ts +0 -78
  141. package/package/cc-switch-sdk/dist/services/instance-service.d.ts.map +0 -1
  142. package/package/cc-switch-sdk/dist/services/instance-service.js +0 -180
@@ -1,27 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { injectAwsMcpContext, mapAwsMcpToolName, normalizeAwsMcpArgs } from './aws-mcp-http.js';
3
- describe('aws mcp http service helpers', () => {
4
- it('maps public aws-mcp tool names to scheduler tool names', () => {
5
- expect(mapAwsMcpToolName('get_colleague')).toBe('discover_colleague');
6
- expect(mapAwsMcpToolName('get_group_rooms')).toBe('discover_group_rooms');
7
- expect(mapAwsMcpToolName('send_group')).toBe('send_group_message');
8
- expect(mapAwsMcpToolName('send_private')).toBe('send_dm');
9
- expect(mapAwsMcpToolName('my_task')).toBe('my_task');
10
- });
11
- it('normalizes non-object args to an empty object', () => {
12
- expect(normalizeAwsMcpArgs(undefined)).toEqual({});
13
- expect(normalizeAwsMcpArgs(null)).toEqual({});
14
- expect(normalizeAwsMcpArgs([])).toEqual({});
15
- expect(normalizeAwsMcpArgs({ content: 'hello' })).toEqual({ content: 'hello' });
16
- });
17
- it('injects bridge-bound agent context and converts waitReply for send_private', () => {
18
- const args = injectAwsMcpContext('send_private', { targetId: 'agent-2', content: 'ping', waitReply: true }, { agentId: 'agent-1', workspacePath: '/workspace/demo' });
19
- expect(args).toEqual({
20
- agentId: 'agent-1',
21
- workspacePath: '/workspace/demo',
22
- targetId: 'agent-2',
23
- content: 'ping',
24
- requireReply: true,
25
- });
26
- });
27
- });
@@ -1,106 +0,0 @@
1
- /**
2
- * EasyTier 网络管理服务
3
- *
4
- * 管理 EasyTier 组网流程,支持:
5
- * 1. 启动 EasyTier 节点(DHCP 模式自动获取虚拟 IP)
6
- * 2. 监控网络状态
7
- * 3. 获取分配的虚拟 IP
8
- */
9
- /**
10
- * EasyTier 配置
11
- */
12
- export interface EasyTierConfig {
13
- /** 是否启用 EasyTier 组网 */
14
- enabled: boolean;
15
- /** 网络名称 */
16
- networkName: string;
17
- /** 网络密钥 */
18
- networkSecret: string;
19
- /** 初始连接节点 (格式: tcp://ip:port 或 udp://ip:port) */
20
- peers: string[];
21
- /** 公共共享节点 */
22
- externalNodes: string[];
23
- /** EasyTier 可执行文件路径 */
24
- executablePath?: string;
25
- /** RPC 端口 (用于查询状态) */
26
- rpcPort: number;
27
- /** 监听端口 */
28
- listenPort: number;
29
- /** 等待网络就绪超时 (毫秒) */
30
- readyTimeout: number;
31
- /** 网络就绪检查间隔 (毫秒) */
32
- readyCheckInterval: number;
33
- }
34
- /**
35
- * 网络状态
36
- */
37
- export interface NetworkStatus {
38
- /** 是否已连接 */
39
- connected: boolean;
40
- /** 本地虚拟 IPv4 地址 */
41
- ipv4?: string;
42
- /** 本地虚拟 IPv6 地址 */
43
- ipv6?: string;
44
- /** 节点 ID */
45
- nodeId?: string;
46
- /** 已连接的 peer 数量 */
47
- peerCount: number;
48
- /** peer 列表 */
49
- peers: PeerInfo[];
50
- }
51
- /**
52
- * Peer 信息
53
- */
54
- export interface PeerInfo {
55
- /** peer ID */
56
- peerId: string;
57
- /** 虚拟 IP */
58
- ipv4: string;
59
- /** 主机名 */
60
- hostname: string;
61
- /** 延迟 (ms) */
62
- latencyMs?: number;
63
- /** 连接协议 */
64
- tunnelProto?: string;
65
- }
66
- /**
67
- * 初始化配置
68
- */
69
- export declare function initEasyTierConfig(customConfig?: Partial<EasyTierConfig>): EasyTierConfig;
70
- /**
71
- * 获取当前配置
72
- */
73
- export declare function getEasyTierConfig(): EasyTierConfig;
74
- /**
75
- * 启动 EasyTier 节点
76
- *
77
- * 使用 DHCP 模式自动获取虚拟 IP
78
- */
79
- export declare function startEasyTier(): Promise<boolean>;
80
- /**
81
- * 停止 EasyTier 节点
82
- */
83
- export declare function stopEasyTier(): Promise<void>;
84
- /**
85
- * 查询网络状态 (通过 RPC)
86
- */
87
- export declare function queryNetworkStatus(): Promise<NetworkStatus>;
88
- /**
89
- * 等待网络就绪
90
- *
91
- * 返回分配的虚拟 IP
92
- */
93
- export declare function waitForNetworkReady(): Promise<string | null>;
94
- /**
95
- * 获取当前网络状态
96
- */
97
- export declare function getNetworkStatus(): NetworkStatus;
98
- /**
99
- * 获取虚拟 IP
100
- */
101
- export declare function getVirtualIp(): string | undefined;
102
- /**
103
- * 检查 EasyTier 是否可用
104
- */
105
- export declare function isEasyTierAvailable(): boolean;
106
- //# sourceMappingURL=easytier-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"easytier-manager.d.ts","sourceRoot":"","sources":["../../src/services/easytier-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAyID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAezF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAkFtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8BlD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,CAAC,CA4CjE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkClE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAG7C"}
@@ -1,331 +0,0 @@
1
- /**
2
- * EasyTier 网络管理服务
3
- *
4
- * 管理 EasyTier 组网流程,支持:
5
- * 1. 启动 EasyTier 节点(DHCP 模式自动获取虚拟 IP)
6
- * 2. 监控网络状态
7
- * 3. 获取分配的虚拟 IP
8
- */
9
- import fs from 'node:fs';
10
- import os from 'node:os';
11
- import path from 'node:path';
12
- import { spawn, execSync } from 'node:child_process';
13
- import axios from 'axios';
14
- import { logger } from '../utils/logger.js';
15
- // 默认配置
16
- const DEFAULT_CONFIG = {
17
- enabled: false,
18
- networkName: 'aws-bridge-network',
19
- networkSecret: 'aws-bridge-secret',
20
- peers: [],
21
- externalNodes: ['tcp://public.easytier.top:11010'],
22
- rpcPort: 15888,
23
- listenPort: 11010,
24
- readyTimeout: 60000, // 60 秒
25
- readyCheckInterval: 2000, // 2 秒
26
- };
27
- let config;
28
- let easytierProcess = null;
29
- let networkStatus = { connected: false, peerCount: 0, peers: [] };
30
- /**
31
- * 从环境变量加载配置
32
- */
33
- function loadConfigFromEnv() {
34
- const envConfig = {};
35
- if (process.env.AWS_EASYTIER_ENABLED === 'true') {
36
- envConfig.enabled = true;
37
- }
38
- if (process.env.AWS_EASYTIER_NETWORK_NAME) {
39
- envConfig.networkName = process.env.AWS_EASYTIER_NETWORK_NAME;
40
- }
41
- if (process.env.AWS_EASYTIER_NETWORK_SECRET) {
42
- envConfig.networkSecret = process.env.AWS_EASYTIER_NETWORK_SECRET;
43
- }
44
- if (process.env.AWS_EASYTIER_PEERS) {
45
- envConfig.peers = process.env.AWS_EASYTIER_PEERS.split(',').map(p => p.trim()).filter(Boolean);
46
- }
47
- if (process.env.AWS_EASYTIER_EXTERNAL_NODES) {
48
- envConfig.externalNodes = process.env.AWS_EASYTIER_EXTERNAL_NODES.split(',').map(p => p.trim()).filter(Boolean);
49
- }
50
- if (process.env.AWS_EASYTIER_EXECUTABLE_PATH) {
51
- envConfig.executablePath = process.env.AWS_EASYTIER_EXECUTABLE_PATH;
52
- }
53
- if (process.env.AWS_EASYTIER_RPC_PORT) {
54
- envConfig.rpcPort = parseInt(process.env.AWS_EASYTIER_RPC_PORT, 10);
55
- }
56
- if (process.env.AWS_EASYTIER_LISTEN_PORT) {
57
- envConfig.listenPort = parseInt(process.env.AWS_EASYTIER_LISTEN_PORT, 10);
58
- }
59
- if (process.env.AWS_EASYTIER_READY_TIMEOUT) {
60
- envConfig.readyTimeout = parseInt(process.env.AWS_EASYTIER_READY_TIMEOUT, 10);
61
- }
62
- return envConfig;
63
- }
64
- /**
65
- * 查找 EasyTier 可执行文件
66
- */
67
- function findEasyTierExecutable() {
68
- // 1. 检查环境变量指定的路径
69
- if (process.env.AWS_EASYTIER_EXECUTABLE_PATH) {
70
- if (fs.existsSync(process.env.AWS_EASYTIER_EXECUTABLE_PATH)) {
71
- return process.env.AWS_EASYTIER_EXECUTABLE_PATH;
72
- }
73
- }
74
- // 2. 检查常见位置
75
- const possiblePaths = [];
76
- if (process.platform === 'win32') {
77
- // Windows
78
- possiblePaths.push(path.join(os.homedir(), 'easytier', 'easytier-core.exe'), path.join('C:', 'Program Files', 'easytier', 'easytier-core.exe'), 'easytier-core.exe' // PATH
79
- );
80
- }
81
- else {
82
- // Linux/macOS
83
- possiblePaths.push('/usr/local/bin/easytier-core', '/usr/bin/easytier-core', path.join(os.homedir(), '.local', 'bin', 'easytier-core'), path.join(os.homedir(), 'easytier', 'easytier-core'), 'easytier-core' // PATH
84
- );
85
- }
86
- for (const p of possiblePaths) {
87
- try {
88
- if (fs.existsSync(p)) {
89
- return p;
90
- }
91
- }
92
- catch {
93
- // 忽略错误,继续尝试下一个
94
- }
95
- }
96
- // 3. 尝试从 PATH 查找
97
- try {
98
- const result = execSync(process.platform === 'win32' ? 'where easytier-core' : 'which easytier-core', {
99
- encoding: 'utf8',
100
- timeout: 5000
101
- });
102
- const found = result.trim().split('\n')[0];
103
- if (found && fs.existsSync(found)) {
104
- return found;
105
- }
106
- }
107
- catch {
108
- // 未找到
109
- }
110
- return null;
111
- }
112
- /**
113
- * 初始化配置
114
- */
115
- export function initEasyTierConfig(customConfig) {
116
- const envConfig = loadConfigFromEnv();
117
- config = {
118
- ...DEFAULT_CONFIG,
119
- ...envConfig,
120
- ...customConfig,
121
- };
122
- // 自动查找可执行文件
123
- if (!config.executablePath) {
124
- config.executablePath = findEasyTierExecutable() || undefined;
125
- }
126
- return config;
127
- }
128
- /**
129
- * 获取当前配置
130
- */
131
- export function getEasyTierConfig() {
132
- if (!config) {
133
- initEasyTierConfig();
134
- }
135
- return config;
136
- }
137
- /**
138
- * 启动 EasyTier 节点
139
- *
140
- * 使用 DHCP 模式自动获取虚拟 IP
141
- */
142
- export async function startEasyTier() {
143
- if (!config) {
144
- initEasyTierConfig();
145
- }
146
- if (!config.enabled) {
147
- logger.info('[EasyTier] EasyTier 组网未启用');
148
- return false;
149
- }
150
- if (easytierProcess) {
151
- logger.warn('[EasyTier] EasyTier 已在运行中');
152
- return true;
153
- }
154
- // 检查可执行文件
155
- const executable = config.executablePath || findEasyTierExecutable();
156
- if (!executable) {
157
- logger.error('[EasyTier] 未找到 easytier-core 可执行文件');
158
- logger.error('[EasyTier] 请安装 EasyTier 或设置 AWS_EASYTIER_EXECUTABLE_PATH 环境变量');
159
- return false;
160
- }
161
- logger.info(`[EasyTier] 使用可执行文件: ${executable}`);
162
- // 构建命令参数
163
- const args = [];
164
- // DHCP 模式 (自动获取虚拟 IP)
165
- args.push('-d');
166
- // 网络名称和密钥
167
- args.push('--network-name', config.networkName);
168
- args.push('--network-secret', config.networkSecret);
169
- // RPC 端口 (用于状态查询)
170
- args.push('--rpc-portal', `127.0.0.1:${config.rpcPort}`);
171
- // 监听端口
172
- args.push('-l', `tcp://0.0.0.0:${config.listenPort}`);
173
- // 初始连接节点
174
- for (const peer of config.peers) {
175
- args.push('-p', peer);
176
- }
177
- // 公共共享节点
178
- for (const external of config.externalNodes) {
179
- args.push('-e', external);
180
- }
181
- // 后台运行
182
- args.push('--daemon');
183
- logger.info(`[EasyTier] 启动参数: ${args.join(' ')}`);
184
- try {
185
- easytierProcess = spawn(executable, args, {
186
- stdio: 'ignore',
187
- detached: true,
188
- });
189
- easytierProcess.on('error', (err) => {
190
- logger.error(`[EasyTier] 进程错误: ${err.message}`);
191
- easytierProcess = null;
192
- });
193
- easytierProcess.on('exit', (code, signal) => {
194
- logger.info(`[EasyTier] 进程退出: code=${code}, signal=${signal}`);
195
- easytierProcess = null;
196
- });
197
- // 等待进程启动
198
- await new Promise(resolve => setTimeout(resolve, 2000));
199
- logger.info('[EasyTier] EasyTier 已启动');
200
- return true;
201
- }
202
- catch (error) {
203
- const err = error;
204
- logger.error(`[EasyTier] 启动失败: ${err.message}`);
205
- return false;
206
- }
207
- }
208
- /**
209
- * 停止 EasyTier 节点
210
- */
211
- export async function stopEasyTier() {
212
- if (!easytierProcess) {
213
- return;
214
- }
215
- try {
216
- // 尝试优雅关闭
217
- easytierProcess.kill('SIGTERM');
218
- // 等待进程退出
219
- await new Promise((resolve) => {
220
- const timeout = setTimeout(() => {
221
- if (easytierProcess) {
222
- easytierProcess.kill('SIGKILL');
223
- }
224
- resolve();
225
- }, 5000);
226
- easytierProcess?.on('exit', () => {
227
- clearTimeout(timeout);
228
- resolve();
229
- });
230
- });
231
- easytierProcess = null;
232
- logger.info('[EasyTier] EasyTier 已停止');
233
- }
234
- catch (error) {
235
- const err = error;
236
- logger.error(`[EasyTier] 停止失败: ${err.message}`);
237
- }
238
- }
239
- /**
240
- * 查询网络状态 (通过 RPC)
241
- */
242
- export async function queryNetworkStatus() {
243
- if (!config) {
244
- initEasyTierConfig();
245
- }
246
- const rpcUrl = `http://127.0.0.1:${config.rpcPort}`;
247
- try {
248
- // 查询节点信息
249
- const nodeResponse = await axios.get(`${rpcUrl}/api/v1/node`, {
250
- timeout: 5000,
251
- });
252
- // 查询 peer 列表
253
- const peerResponse = await axios.get(`${rpcUrl}/api/v1/peer`, {
254
- timeout: 5000,
255
- });
256
- const nodeData = nodeResponse.data;
257
- const peerData = peerResponse.data;
258
- const peers = (peerData.peers || []).map((p) => ({
259
- peerId: p.peer_id || p.peerId || '',
260
- ipv4: p.ipv4 || '',
261
- hostname: p.hostname || '',
262
- latencyMs: p.lat_ms || p.latencyMs,
263
- tunnelProto: p.tunnel_proto || p.tunnelProto,
264
- }));
265
- networkStatus = {
266
- connected: true,
267
- ipv4: nodeData?.ipv4,
268
- ipv6: nodeData?.ipv6,
269
- nodeId: nodeData?.node_id || nodeData?.nodeId,
270
- peerCount: peers.length,
271
- peers,
272
- };
273
- return networkStatus;
274
- }
275
- catch {
276
- // 网络未就绪或 RPC 不可用
277
- networkStatus = { connected: false, peerCount: 0, peers: [] };
278
- return networkStatus;
279
- }
280
- }
281
- /**
282
- * 等待网络就绪
283
- *
284
- * 返回分配的虚拟 IP
285
- */
286
- export async function waitForNetworkReady() {
287
- if (!config) {
288
- initEasyTierConfig();
289
- }
290
- if (!config.enabled) {
291
- logger.info('[EasyTier] EasyTier 未启用,跳过网络就绪等待');
292
- return null;
293
- }
294
- const startTime = Date.now();
295
- const timeout = config.readyTimeout;
296
- const interval = config.readyCheckInterval;
297
- logger.info(`[EasyTier] 等待网络就绪 (超时: ${timeout / 1000}s)...`);
298
- while (Date.now() - startTime < timeout) {
299
- const status = await queryNetworkStatus();
300
- if (status.connected && status.ipv4) {
301
- logger.info(`[EasyTier] ✓ 网络已就绪`);
302
- logger.info(`[EasyTier] 虚拟 IP: ${status.ipv4}`);
303
- logger.info(`[EasyTier] 节点 ID: ${status.nodeId}`);
304
- logger.info(`[EasyTier] 已连接 Peer 数量: ${status.peerCount}`);
305
- return status.ipv4;
306
- }
307
- // 等待后重试
308
- await new Promise(resolve => setTimeout(resolve, interval));
309
- }
310
- logger.error(`[EasyTier] ✗ 等待网络就绪超时 (${timeout / 1000}s)`);
311
- return null;
312
- }
313
- /**
314
- * 获取当前网络状态
315
- */
316
- export function getNetworkStatus() {
317
- return { ...networkStatus };
318
- }
319
- /**
320
- * 获取虚拟 IP
321
- */
322
- export function getVirtualIp() {
323
- return networkStatus.ipv4;
324
- }
325
- /**
326
- * 检查 EasyTier 是否可用
327
- */
328
- export function isEasyTierAvailable() {
329
- const executable = findEasyTierExecutable();
330
- return executable !== null;
331
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * EasyTier Manager 测试
3
- */
4
- export {};
5
- //# sourceMappingURL=easytier-manager.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"easytier-manager.test.d.ts","sourceRoot":"","sources":["../../src/services/easytier-manager.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,98 +0,0 @@
1
- /**
2
- * EasyTier Manager 测试
3
- */
4
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
- import { initEasyTierConfig, getEasyTierConfig, isEasyTierAvailable, } from './easytier-manager.js';
6
- // Mock child_process
7
- vi.mock('node:child_process', () => ({
8
- spawn: vi.fn(() => ({
9
- on: vi.fn(),
10
- kill: vi.fn(),
11
- })),
12
- execSync: vi.fn((cmd) => {
13
- if (cmd.includes('which') || cmd.includes('where')) {
14
- return '/usr/bin/easytier-core';
15
- }
16
- return '';
17
- }),
18
- }));
19
- // Mock fs
20
- vi.mock('node:fs', () => {
21
- const existsSync = vi.fn((path) => {
22
- if (path.includes('easytier-core')) {
23
- return true;
24
- }
25
- return false;
26
- });
27
- return {
28
- default: { existsSync },
29
- existsSync,
30
- };
31
- });
32
- describe('EasyTier Manager', () => {
33
- beforeEach(() => {
34
- // 重置环境变量
35
- delete process.env.AWS_EASYTIER_ENABLED;
36
- delete process.env.AWS_EASYTIER_NETWORK_NAME;
37
- delete process.env.AWS_EASYTIER_NETWORK_SECRET;
38
- delete process.env.AWS_EASYTIER_PEERS;
39
- delete process.env.AWS_EASYTIER_RPC_PORT;
40
- delete process.env.AWS_EASYTIER_EXECUTABLE_PATH;
41
- });
42
- afterEach(() => {
43
- vi.clearAllMocks();
44
- });
45
- describe('initEasyTierConfig', () => {
46
- it('should return default config when no env vars set', () => {
47
- const config = initEasyTierConfig();
48
- expect(config.enabled).toBe(false);
49
- expect(config.networkName).toBe('aws-bridge-network');
50
- expect(config.networkSecret).toBe('aws-bridge-secret');
51
- expect(config.rpcPort).toBe(15888);
52
- expect(config.listenPort).toBe(11010);
53
- });
54
- it('should load config from environment variables', () => {
55
- process.env.AWS_EASYTIER_ENABLED = 'true';
56
- process.env.AWS_EASYTIER_NETWORK_NAME = 'test-network';
57
- process.env.AWS_EASYTIER_NETWORK_SECRET = 'test-secret';
58
- process.env.AWS_EASYTIER_RPC_PORT = '12345';
59
- const config = initEasyTierConfig();
60
- expect(config.enabled).toBe(true);
61
- expect(config.networkName).toBe('test-network');
62
- expect(config.networkSecret).toBe('test-secret');
63
- expect(config.rpcPort).toBe(12345);
64
- });
65
- it('should parse peers from environment', () => {
66
- process.env.AWS_EASYTIER_PEERS = 'tcp://1.2.3.4:11010, udp://5.6.7.8:11010';
67
- const config = initEasyTierConfig();
68
- expect(config.peers).toHaveLength(2);
69
- expect(config.peers).toContain('tcp://1.2.3.4:11010');
70
- expect(config.peers).toContain('udp://5.6.7.8:11010');
71
- });
72
- it('should merge custom config', () => {
73
- const config = initEasyTierConfig({
74
- enabled: true,
75
- networkName: 'custom-network',
76
- readyTimeout: 120000,
77
- });
78
- expect(config.enabled).toBe(true);
79
- expect(config.networkName).toBe('custom-network');
80
- expect(config.readyTimeout).toBe(120000);
81
- });
82
- });
83
- describe('getEasyTierConfig', () => {
84
- it('should return initialized config', () => {
85
- initEasyTierConfig({ enabled: true });
86
- const config = getEasyTierConfig();
87
- expect(config.enabled).toBe(true);
88
- });
89
- });
90
- describe('isEasyTierAvailable', () => {
91
- it('should return true when executable is found', () => {
92
- process.env.AWS_EASYTIER_EXECUTABLE_PATH = '/usr/bin/easytier-core';
93
- const available = isEasyTierAvailable();
94
- // 显式路径存在时,应判定为可用
95
- expect(available).toBe(true);
96
- });
97
- });
98
- });