openclaw-event-server-plugin 1.0.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 (209) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +473 -0
  3. package/config.example.json +203 -0
  4. package/dist/broadcast/index.d.ts +3 -0
  5. package/dist/broadcast/index.d.ts.map +1 -0
  6. package/dist/broadcast/index.js +19 -0
  7. package/dist/broadcast/index.js.map +1 -0
  8. package/dist/broadcast/queue.d.ts +63 -0
  9. package/dist/broadcast/queue.d.ts.map +1 -0
  10. package/dist/broadcast/queue.js +259 -0
  11. package/dist/broadcast/queue.js.map +1 -0
  12. package/dist/broadcast/webhook.d.ts +30 -0
  13. package/dist/broadcast/webhook.d.ts.map +1 -0
  14. package/dist/broadcast/webhook.js +184 -0
  15. package/dist/broadcast/webhook.js.map +1 -0
  16. package/dist/broadcast/websocketServer.d.ts +90 -0
  17. package/dist/broadcast/websocketServer.d.ts.map +1 -0
  18. package/dist/broadcast/websocketServer.js +403 -0
  19. package/dist/broadcast/websocketServer.js.map +1 -0
  20. package/dist/config/config-types.d.ts +280 -0
  21. package/dist/config/config-types.d.ts.map +1 -0
  22. package/dist/config/config-types.js +3 -0
  23. package/dist/config/config-types.js.map +1 -0
  24. package/dist/config/default-config.d.ts +3 -0
  25. package/dist/config/default-config.d.ts.map +1 -0
  26. package/dist/config/default-config.js +136 -0
  27. package/dist/config/default-config.js.map +1 -0
  28. package/dist/config/env.d.ts +6 -0
  29. package/dist/config/env.d.ts.map +1 -0
  30. package/dist/config/env.js +160 -0
  31. package/dist/config/env.js.map +1 -0
  32. package/dist/config/event-types.d.ts +5 -0
  33. package/dist/config/event-types.d.ts.map +1 -0
  34. package/dist/config/event-types.js +54 -0
  35. package/dist/config/event-types.js.map +1 -0
  36. package/dist/config/handler.d.ts +9 -0
  37. package/dist/config/handler.d.ts.map +1 -0
  38. package/dist/config/handler.js +17 -0
  39. package/dist/config/handler.js.map +1 -0
  40. package/dist/config/helpers.d.ts +5 -0
  41. package/dist/config/helpers.d.ts.map +1 -0
  42. package/dist/config/helpers.js +40 -0
  43. package/dist/config/helpers.js.map +1 -0
  44. package/dist/config/index.d.ts +3 -0
  45. package/dist/config/index.d.ts.map +1 -0
  46. package/dist/config/index.js +19 -0
  47. package/dist/config/index.js.map +1 -0
  48. package/dist/config/merge.d.ts +6 -0
  49. package/dist/config/merge.d.ts.map +1 -0
  50. package/dist/config/merge.js +108 -0
  51. package/dist/config/merge.js.map +1 -0
  52. package/dist/config/schema-hook-bridge.d.ts +594 -0
  53. package/dist/config/schema-hook-bridge.d.ts.map +1 -0
  54. package/dist/config/schema-hook-bridge.js +423 -0
  55. package/dist/config/schema-hook-bridge.js.map +1 -0
  56. package/dist/config/schema.d.ts +915 -0
  57. package/dist/config/schema.d.ts.map +1 -0
  58. package/dist/config/schema.js +323 -0
  59. package/dist/config/schema.js.map +1 -0
  60. package/dist/config/types.d.ts +9 -0
  61. package/dist/config/types.d.ts.map +1 -0
  62. package/dist/config/types.js +28 -0
  63. package/dist/config/types.js.map +1 -0
  64. package/dist/config/validate-hook-bridge.d.ts +3 -0
  65. package/dist/config/validate-hook-bridge.d.ts.map +1 -0
  66. package/dist/config/validate-hook-bridge.js +246 -0
  67. package/dist/config/validate-hook-bridge.js.map +1 -0
  68. package/dist/config/validate.d.ts +17 -0
  69. package/dist/config/validate.d.ts.map +1 -0
  70. package/dist/config/validate.js +194 -0
  71. package/dist/config/validate.js.map +1 -0
  72. package/dist/events/index.d.ts +4 -0
  73. package/dist/events/index.d.ts.map +1 -0
  74. package/dist/events/index.js +20 -0
  75. package/dist/events/index.js.map +1 -0
  76. package/dist/events/redaction.d.ts +5 -0
  77. package/dist/events/redaction.d.ts.map +1 -0
  78. package/dist/events/redaction.js +46 -0
  79. package/dist/events/redaction.js.map +1 -0
  80. package/dist/events/signing.d.ts +8 -0
  81. package/dist/events/signing.d.ts.map +1 -0
  82. package/dist/events/signing.js +35 -0
  83. package/dist/events/signing.js.map +1 -0
  84. package/dist/events/types.d.ts +125 -0
  85. package/dist/events/types.d.ts.map +1 -0
  86. package/dist/events/types.js +9 -0
  87. package/dist/events/types.js.map +1 -0
  88. package/dist/hooks/agent-hooks.d.ts +59 -0
  89. package/dist/hooks/agent-hooks.d.ts.map +1 -0
  90. package/dist/hooks/agent-hooks.js +116 -0
  91. package/dist/hooks/agent-hooks.js.map +1 -0
  92. package/dist/hooks/command-hooks.d.ts +13 -0
  93. package/dist/hooks/command-hooks.d.ts.map +1 -0
  94. package/dist/hooks/command-hooks.js +26 -0
  95. package/dist/hooks/command-hooks.js.map +1 -0
  96. package/dist/hooks/event-factory.d.ts +21 -0
  97. package/dist/hooks/event-factory.d.ts.map +1 -0
  98. package/dist/hooks/event-factory.js +31 -0
  99. package/dist/hooks/event-factory.js.map +1 -0
  100. package/dist/hooks/gateway-hooks.d.ts +14 -0
  101. package/dist/hooks/gateway-hooks.d.ts.map +1 -0
  102. package/dist/hooks/gateway-hooks.js +43 -0
  103. package/dist/hooks/gateway-hooks.js.map +1 -0
  104. package/dist/hooks/index.d.ts +10 -0
  105. package/dist/hooks/index.d.ts.map +1 -0
  106. package/dist/hooks/index.js +26 -0
  107. package/dist/hooks/index.js.map +1 -0
  108. package/dist/hooks/message-hooks.d.ts +33 -0
  109. package/dist/hooks/message-hooks.d.ts.map +1 -0
  110. package/dist/hooks/message-hooks.js +208 -0
  111. package/dist/hooks/message-hooks.js.map +1 -0
  112. package/dist/hooks/session-hooks.d.ts +89 -0
  113. package/dist/hooks/session-hooks.d.ts.map +1 -0
  114. package/dist/hooks/session-hooks.js +253 -0
  115. package/dist/hooks/session-hooks.js.map +1 -0
  116. package/dist/hooks/status-reducer.d.ts +30 -0
  117. package/dist/hooks/status-reducer.d.ts.map +1 -0
  118. package/dist/hooks/status-reducer.js +157 -0
  119. package/dist/hooks/status-reducer.js.map +1 -0
  120. package/dist/hooks/subagent-hooks.d.ts +37 -0
  121. package/dist/hooks/subagent-hooks.d.ts.map +1 -0
  122. package/dist/hooks/subagent-hooks.js +79 -0
  123. package/dist/hooks/subagent-hooks.js.map +1 -0
  124. package/dist/hooks/subagent-tracker.d.ts +33 -0
  125. package/dist/hooks/subagent-tracker.d.ts.map +1 -0
  126. package/dist/hooks/subagent-tracker.js +73 -0
  127. package/dist/hooks/subagent-tracker.js.map +1 -0
  128. package/dist/hooks/tool-hooks.d.ts +132 -0
  129. package/dist/hooks/tool-hooks.d.ts.map +1 -0
  130. package/dist/hooks/tool-hooks.js +215 -0
  131. package/dist/hooks/tool-hooks.js.map +1 -0
  132. package/dist/index.d.ts +929 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +236 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/logging/event-file-logger.d.ts +21 -0
  137. package/dist/logging/event-file-logger.d.ts.map +1 -0
  138. package/dist/logging/event-file-logger.js +167 -0
  139. package/dist/logging/event-file-logger.js.map +1 -0
  140. package/dist/logging/index.d.ts +3 -0
  141. package/dist/logging/index.d.ts.map +1 -0
  142. package/dist/logging/index.js +19 -0
  143. package/dist/logging/index.js.map +1 -0
  144. package/dist/logging/runtime-logger.d.ts +12 -0
  145. package/dist/logging/runtime-logger.d.ts.map +1 -0
  146. package/dist/logging/runtime-logger.js +45 -0
  147. package/dist/logging/runtime-logger.js.map +1 -0
  148. package/dist/runtime/hook-bridge-actions.d.ts +9 -0
  149. package/dist/runtime/hook-bridge-actions.d.ts.map +1 -0
  150. package/dist/runtime/hook-bridge-actions.js +248 -0
  151. package/dist/runtime/hook-bridge-actions.js.map +1 -0
  152. package/dist/runtime/hook-bridge-dispatch-engine.d.ts +42 -0
  153. package/dist/runtime/hook-bridge-dispatch-engine.d.ts.map +1 -0
  154. package/dist/runtime/hook-bridge-dispatch-engine.js +233 -0
  155. package/dist/runtime/hook-bridge-dispatch-engine.js.map +1 -0
  156. package/dist/runtime/hook-bridge-tool-guard.d.ts +16 -0
  157. package/dist/runtime/hook-bridge-tool-guard.d.ts.map +1 -0
  158. package/dist/runtime/hook-bridge-tool-guard.js +236 -0
  159. package/dist/runtime/hook-bridge-tool-guard.js.map +1 -0
  160. package/dist/runtime/hook-bridge-utils.d.ts +11 -0
  161. package/dist/runtime/hook-bridge-utils.d.ts.map +1 -0
  162. package/dist/runtime/hook-bridge-utils.js +116 -0
  163. package/dist/runtime/hook-bridge-utils.js.map +1 -0
  164. package/dist/runtime/hook-bridge.d.ts +33 -0
  165. package/dist/runtime/hook-bridge.d.ts.map +1 -0
  166. package/dist/runtime/hook-bridge.js +359 -0
  167. package/dist/runtime/hook-bridge.js.map +1 -0
  168. package/dist/runtime/internal-handlers.d.ts +20 -0
  169. package/dist/runtime/internal-handlers.d.ts.map +1 -0
  170. package/dist/runtime/internal-handlers.js +225 -0
  171. package/dist/runtime/internal-handlers.js.map +1 -0
  172. package/dist/runtime/register-gateway-hooks.d.ts +4 -0
  173. package/dist/runtime/register-gateway-hooks.d.ts.map +1 -0
  174. package/dist/runtime/register-gateway-hooks.js +27 -0
  175. package/dist/runtime/register-gateway-hooks.js.map +1 -0
  176. package/dist/runtime/register-session-hooks.d.ts +4 -0
  177. package/dist/runtime/register-session-hooks.d.ts.map +1 -0
  178. package/dist/runtime/register-session-hooks.js +88 -0
  179. package/dist/runtime/register-session-hooks.js.map +1 -0
  180. package/dist/runtime/register-subagent-hooks.d.ts +4 -0
  181. package/dist/runtime/register-subagent-hooks.d.ts.map +1 -0
  182. package/dist/runtime/register-subagent-hooks.js +143 -0
  183. package/dist/runtime/register-subagent-hooks.js.map +1 -0
  184. package/dist/runtime/register-tool-hooks.d.ts +4 -0
  185. package/dist/runtime/register-tool-hooks.d.ts.map +1 -0
  186. package/dist/runtime/register-tool-hooks.js +348 -0
  187. package/dist/runtime/register-tool-hooks.js.map +1 -0
  188. package/dist/runtime/runtime-events.d.ts +14 -0
  189. package/dist/runtime/runtime-events.d.ts.map +1 -0
  190. package/dist/runtime/runtime-events.js +166 -0
  191. package/dist/runtime/runtime-events.js.map +1 -0
  192. package/dist/runtime/typed-hooks.d.ts +9 -0
  193. package/dist/runtime/typed-hooks.d.ts.map +1 -0
  194. package/dist/runtime/typed-hooks.js +14 -0
  195. package/dist/runtime/typed-hooks.js.map +1 -0
  196. package/dist/runtime/types.d.ts +91 -0
  197. package/dist/runtime/types.d.ts.map +1 -0
  198. package/dist/runtime/types.js +3 -0
  199. package/dist/runtime/types.js.map +1 -0
  200. package/dist/runtime/utils.d.ts +47 -0
  201. package/dist/runtime/utils.d.ts.map +1 -0
  202. package/dist/runtime/utils.js +166 -0
  203. package/dist/runtime/utils.js.map +1 -0
  204. package/dist/tools/replay-tool-guard.d.ts +3 -0
  205. package/dist/tools/replay-tool-guard.d.ts.map +1 -0
  206. package/dist/tools/replay-tool-guard.js +96 -0
  207. package/dist/tools/replay-tool-guard.js.map +1 -0
  208. package/openclaw.plugin.json +847 -0
  209. package/package.json +63 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * WebSocket Broadcast Server
3
+ *
4
+ * Dumb broadcaster - emits all events to connected clients.
5
+ * No filtering, no transformation, no knowledge of consumers.
6
+ */
7
+ interface WebSocketServerOptions {
8
+ port?: number;
9
+ host?: string;
10
+ path?: string;
11
+ fallbackPorts?: number[];
12
+ requireAuth?: boolean;
13
+ authToken?: string;
14
+ allowedOrigins?: string[];
15
+ allowedIps?: string[];
16
+ }
17
+ export declare class BroadcastWebSocketServer {
18
+ private wss;
19
+ private port;
20
+ private host;
21
+ private path;
22
+ private readonly configuredPorts;
23
+ private readonly requireAuth;
24
+ private readonly authToken?;
25
+ private readonly allowedOrigins;
26
+ private readonly allowedIps;
27
+ private candidatePorts;
28
+ private clients;
29
+ private isRunning;
30
+ private startupGeneration;
31
+ constructor(options?: WebSocketServerOptions);
32
+ /**
33
+ * Start the WebSocket broadcast server
34
+ */
35
+ start(): void;
36
+ private tryStartNextPort;
37
+ /**
38
+ * Handle a new client connection
39
+ */
40
+ private handleConnection;
41
+ /**
42
+ * Broadcast an event to all connected clients
43
+ */
44
+ broadcast(event: unknown): void;
45
+ /**
46
+ * Send a message to a specific client
47
+ */
48
+ private sendToClient;
49
+ /**
50
+ * Stop the WebSocket server
51
+ */
52
+ stop(): Promise<void>;
53
+ /**
54
+ * Get the number of connected clients
55
+ */
56
+ getClientCount(): number;
57
+ /**
58
+ * Check if the server is running
59
+ */
60
+ isServerRunning(): boolean;
61
+ /**
62
+ * Get active server port
63
+ */
64
+ getPort(): number;
65
+ /**
66
+ * Generate a unique client ID for logging
67
+ */
68
+ private generateClientId;
69
+ private authorizeRequest;
70
+ private normalizeIp;
71
+ private extractToken;
72
+ }
73
+ /**
74
+ * Get or create the broadcast server instance
75
+ */
76
+ export declare function getBroadcastServer(options?: WebSocketServerOptions): BroadcastWebSocketServer;
77
+ /**
78
+ * Start the broadcast server (singleton)
79
+ */
80
+ export declare function startBroadcastServer(options?: WebSocketServerOptions): BroadcastWebSocketServer;
81
+ /**
82
+ * Broadcast an event to all connected clients
83
+ */
84
+ export declare function broadcastEvent(event: unknown): void;
85
+ /**
86
+ * Stop the broadcast server (singleton)
87
+ */
88
+ export declare function stopBroadcastServer(): Promise<void>;
89
+ export {};
90
+ //# sourceMappingURL=websocketServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketServer.d.ts","sourceRoot":"","sources":["../../src/broadcast/websocketServer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAqBD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,iBAAiB,CAAK;gBAElB,OAAO,GAAE,sBAA2B;IAchD;;OAEG;IACI,KAAK,IAAI,IAAI;IAgBpB,OAAO,CAAC,gBAAgB;IA2ExB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAsCtC;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC5B;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B;;OAEG;IACI,eAAe,IAAI,OAAO;IAIjC;;OAEG;IACI,OAAO,IAAI,MAAM;IAIxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;CAmBrB;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,wBAAwB,CAK7F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,wBAAwB,CAI/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAMnD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKzD"}
@@ -0,0 +1,403 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocket Broadcast Server
4
+ *
5
+ * Dumb broadcaster - emits all events to connected clients.
6
+ * No filtering, no transformation, no knowledge of consumers.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.BroadcastWebSocketServer = void 0;
43
+ exports.getBroadcastServer = getBroadcastServer;
44
+ exports.startBroadcastServer = startBroadcastServer;
45
+ exports.broadcastEvent = broadcastEvent;
46
+ exports.stopBroadcastServer = stopBroadcastServer;
47
+ const ws_1 = __importStar(require("ws"));
48
+ const logging_1 = require("../logging");
49
+ const DEFAULT_PORT = 9011;
50
+ function isAddressInUseError(error) {
51
+ if (typeof error !== 'object' || error === null) {
52
+ return false;
53
+ }
54
+ const err = error;
55
+ return err.code === 'EADDRINUSE' || String(err.message ?? '').includes('EADDRINUSE');
56
+ }
57
+ function toPayload(event) {
58
+ if (typeof event === 'object' && event !== null) {
59
+ return { ...event };
60
+ }
61
+ return {
62
+ event,
63
+ };
64
+ }
65
+ class BroadcastWebSocketServer {
66
+ wss = null;
67
+ port;
68
+ host;
69
+ path;
70
+ configuredPorts;
71
+ requireAuth;
72
+ authToken;
73
+ allowedOrigins;
74
+ allowedIps;
75
+ candidatePorts = [];
76
+ clients = new Set();
77
+ isRunning = false;
78
+ startupGeneration = 0;
79
+ constructor(options = {}) {
80
+ this.port = options.port ?? DEFAULT_PORT;
81
+ this.host = options.host ?? '127.0.0.1';
82
+ this.path = options.path ?? '/';
83
+ this.requireAuth = options.requireAuth ?? false;
84
+ this.authToken = options.authToken;
85
+ this.allowedOrigins = new Set(options.allowedOrigins ?? []);
86
+ this.allowedIps = new Set(options.allowedIps ?? []);
87
+ const fallbackPorts = options.fallbackPorts ?? [];
88
+ this.configuredPorts = [this.port, ...fallbackPorts].filter((value, index, arr) => arr.indexOf(value) === index);
89
+ }
90
+ /**
91
+ * Start the WebSocket broadcast server
92
+ */
93
+ start() {
94
+ const logger = (0, logging_1.getRuntimeLogger)();
95
+ if (this.isRunning) {
96
+ logger.info('[WebSocketServer] Already running, skipping startup');
97
+ return;
98
+ }
99
+ if (this.wss) {
100
+ logger.info('[WebSocketServer] Startup already in progress, skipping duplicate start');
101
+ return;
102
+ }
103
+ this.candidatePorts = [...this.configuredPorts];
104
+ this.startupGeneration += 1;
105
+ this.tryStartNextPort(this.startupGeneration);
106
+ }
107
+ tryStartNextPort(generation) {
108
+ const logger = (0, logging_1.getRuntimeLogger)();
109
+ if (generation !== this.startupGeneration) {
110
+ return;
111
+ }
112
+ const nextPort = this.candidatePorts.shift();
113
+ if (nextPort === undefined) {
114
+ logger.error('[WebSocketServer] No available ports left for startup');
115
+ this.isRunning = false;
116
+ return;
117
+ }
118
+ this.port = nextPort;
119
+ try {
120
+ const server = new ws_1.WebSocketServer({
121
+ port: this.port,
122
+ host: this.host,
123
+ path: this.path,
124
+ });
125
+ this.wss = server;
126
+ server.on('listening', () => {
127
+ if (generation !== this.startupGeneration || this.wss !== server) {
128
+ server.close();
129
+ return;
130
+ }
131
+ this.isRunning = true;
132
+ logger.info(`[WebSocketServer] Broadcasting on ws://${this.host}:${this.port}${this.path}`);
133
+ });
134
+ server.on('connection', (ws, request) => {
135
+ this.handleConnection(ws, request);
136
+ });
137
+ server.on('error', (error) => {
138
+ if (generation !== this.startupGeneration || this.wss !== server) {
139
+ return;
140
+ }
141
+ if (isAddressInUseError(error)) {
142
+ logger.warn(`[WebSocketServer] Port ${this.port} in use, trying fallback port...`);
143
+ this.wss = null;
144
+ server.close();
145
+ this.tryStartNextPort(generation);
146
+ return;
147
+ }
148
+ logger.error('[WebSocketServer] Server error:', error.message);
149
+ this.isRunning = false;
150
+ });
151
+ server.on('close', () => {
152
+ logger.info('[WebSocketServer] Server closed');
153
+ if (this.wss === server) {
154
+ this.wss = null;
155
+ this.isRunning = false;
156
+ this.clients.clear();
157
+ }
158
+ });
159
+ }
160
+ catch (error) {
161
+ if (isAddressInUseError(error)) {
162
+ logger.warn(`[WebSocketServer] Port ${this.port} in use, trying fallback port...`);
163
+ this.wss?.close();
164
+ this.wss = null;
165
+ this.tryStartNextPort(generation);
166
+ return;
167
+ }
168
+ logger.error('[WebSocketServer] Failed to start:', (0, logging_1.getErrorMessage)(error));
169
+ throw error;
170
+ }
171
+ }
172
+ /**
173
+ * Handle a new client connection
174
+ */
175
+ handleConnection(ws, request) {
176
+ const logger = (0, logging_1.getRuntimeLogger)();
177
+ const auth = this.authorizeRequest(request);
178
+ if (!auth.allowed) {
179
+ logger.warn(`[WebSocketServer] Rejected client connection: ${auth.reason}`);
180
+ ws.close(4003, 'Unauthorized');
181
+ return;
182
+ }
183
+ const clientId = this.generateClientId();
184
+ logger.info(`[WebSocketServer] Client connected: ${clientId}`);
185
+ this.clients.add(ws);
186
+ ws.on('pong', () => {
187
+ // Client is alive
188
+ });
189
+ ws.on('close', () => {
190
+ logger.info(`[WebSocketServer] Client disconnected: ${clientId}`);
191
+ this.clients.delete(ws);
192
+ });
193
+ ws.on('error', (error) => {
194
+ logger.error(`[WebSocketServer] Client error (${clientId}):`, error.message);
195
+ this.clients.delete(ws);
196
+ try {
197
+ ws.terminate();
198
+ }
199
+ catch {
200
+ // ignore cleanup errors
201
+ }
202
+ });
203
+ // Send welcome message
204
+ this.sendToClient(ws, {
205
+ type: 'welcome',
206
+ message: 'Connected to OpenClaw Event Server broadcast',
207
+ timestamp: new Date().toISOString(),
208
+ });
209
+ }
210
+ /**
211
+ * Broadcast an event to all connected clients
212
+ */
213
+ broadcast(event) {
214
+ const logger = (0, logging_1.getRuntimeLogger)();
215
+ if (!this.isRunning || !this.wss) {
216
+ logger.warn('[WebSocketServer] Not running, skipping broadcast');
217
+ return;
218
+ }
219
+ const payload = {
220
+ ...toPayload(event),
221
+ broadcastAt: new Date().toISOString(),
222
+ };
223
+ const data = JSON.stringify(payload);
224
+ let sentCount = 0;
225
+ let errorCount = 0;
226
+ this.clients.forEach((client) => {
227
+ if (client.readyState === ws_1.default.OPEN) {
228
+ try {
229
+ client.send(data);
230
+ sentCount++;
231
+ }
232
+ catch (error) {
233
+ logger.error('[WebSocketServer] Failed to send to client:', (0, logging_1.getErrorMessage)(error));
234
+ errorCount++;
235
+ }
236
+ }
237
+ });
238
+ if (sentCount > 0) {
239
+ const eventType = readEventType(payload);
240
+ logger.info(`[WebSocketServer] Broadcast to ${sentCount} client(s): ${eventType}`);
241
+ }
242
+ if (errorCount > 0) {
243
+ logger.warn(`[WebSocketServer] Failed to send to ${errorCount} client(s)`);
244
+ }
245
+ }
246
+ /**
247
+ * Send a message to a specific client
248
+ */
249
+ sendToClient(ws, message) {
250
+ if (ws.readyState === ws_1.default.OPEN) {
251
+ ws.send(JSON.stringify(message));
252
+ }
253
+ }
254
+ /**
255
+ * Stop the WebSocket server
256
+ */
257
+ stop() {
258
+ const logger = (0, logging_1.getRuntimeLogger)();
259
+ return new Promise((resolve) => {
260
+ if (!this.wss) {
261
+ resolve();
262
+ return;
263
+ }
264
+ const server = this.wss;
265
+ this.startupGeneration += 1;
266
+ this.wss = null;
267
+ logger.info('[WebSocketServer] Stopping server...');
268
+ // Close all client connections
269
+ this.clients.forEach((client) => {
270
+ client.close(1000, 'Server shutting down');
271
+ });
272
+ this.clients.clear();
273
+ // Close the server
274
+ try {
275
+ server.close(() => {
276
+ this.isRunning = false;
277
+ logger.info('[WebSocketServer] Server stopped');
278
+ resolve();
279
+ });
280
+ }
281
+ catch {
282
+ this.isRunning = false;
283
+ resolve();
284
+ }
285
+ });
286
+ }
287
+ /**
288
+ * Get the number of connected clients
289
+ */
290
+ getClientCount() {
291
+ return this.clients.size;
292
+ }
293
+ /**
294
+ * Check if the server is running
295
+ */
296
+ isServerRunning() {
297
+ return this.isRunning;
298
+ }
299
+ /**
300
+ * Get active server port
301
+ */
302
+ getPort() {
303
+ return this.port;
304
+ }
305
+ /**
306
+ * Generate a unique client ID for logging
307
+ */
308
+ generateClientId() {
309
+ return `client-${Math.random().toString(36).substring(2, 9)}`;
310
+ }
311
+ authorizeRequest(request) {
312
+ const origin = request.headers.origin;
313
+ if (this.allowedOrigins.size > 0 && (!origin || !this.allowedOrigins.has(origin))) {
314
+ return { allowed: false, reason: 'origin not allowed' };
315
+ }
316
+ const remoteIp = this.normalizeIp(request.socket.remoteAddress);
317
+ if (this.allowedIps.size > 0 && (!remoteIp || !this.allowedIps.has(remoteIp))) {
318
+ return { allowed: false, reason: 'ip not allowed' };
319
+ }
320
+ if (!this.requireAuth) {
321
+ return { allowed: true };
322
+ }
323
+ if (!this.authToken || this.authToken.trim() === '') {
324
+ return { allowed: false, reason: 'auth token missing on server' };
325
+ }
326
+ const token = this.extractToken(request);
327
+ if (!token || token !== this.authToken) {
328
+ return { allowed: false, reason: 'invalid auth token' };
329
+ }
330
+ return { allowed: true };
331
+ }
332
+ normalizeIp(value) {
333
+ if (!value) {
334
+ return undefined;
335
+ }
336
+ if (value.startsWith('::ffff:')) {
337
+ return value.slice('::ffff:'.length);
338
+ }
339
+ return value;
340
+ }
341
+ extractToken(request) {
342
+ const headerToken = request.headers['x-event-plugin-token'];
343
+ if (typeof headerToken === 'string' && headerToken.trim() !== '') {
344
+ return headerToken.trim();
345
+ }
346
+ const authHeader = request.headers.authorization;
347
+ if (typeof authHeader === 'string' && authHeader.startsWith('Bearer ')) {
348
+ return authHeader.slice('Bearer '.length).trim();
349
+ }
350
+ try {
351
+ const parsed = new URL(request.url ?? '', 'ws://localhost');
352
+ const token = parsed.searchParams.get('token');
353
+ return token && token.trim() !== '' ? token.trim() : undefined;
354
+ }
355
+ catch {
356
+ return undefined;
357
+ }
358
+ }
359
+ }
360
+ exports.BroadcastWebSocketServer = BroadcastWebSocketServer;
361
+ function readEventType(payload) {
362
+ return typeof payload.type === 'string' ? payload.type : 'event';
363
+ }
364
+ // Singleton instance
365
+ let broadcastServer = null;
366
+ /**
367
+ * Get or create the broadcast server instance
368
+ */
369
+ function getBroadcastServer(options) {
370
+ if (!broadcastServer) {
371
+ broadcastServer = new BroadcastWebSocketServer(options);
372
+ }
373
+ return broadcastServer;
374
+ }
375
+ /**
376
+ * Start the broadcast server (singleton)
377
+ */
378
+ function startBroadcastServer(options) {
379
+ const server = getBroadcastServer(options);
380
+ server.start();
381
+ return server;
382
+ }
383
+ /**
384
+ * Broadcast an event to all connected clients
385
+ */
386
+ function broadcastEvent(event) {
387
+ if (broadcastServer) {
388
+ broadcastServer.broadcast(event);
389
+ }
390
+ else {
391
+ (0, logging_1.getRuntimeLogger)().warn('[WebSocketServer] No server instance, cannot broadcast');
392
+ }
393
+ }
394
+ /**
395
+ * Stop the broadcast server (singleton)
396
+ */
397
+ async function stopBroadcastServer() {
398
+ if (broadcastServer) {
399
+ await broadcastServer.stop();
400
+ broadcastServer = null;
401
+ }
402
+ }
403
+ //# sourceMappingURL=websocketServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketServer.js","sourceRoot":"","sources":["../../src/broadcast/websocketServer.ts"],"names":[],"mappings":"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"}