@clawreach/openclaw-plugin 0.7.0 → 0.7.6

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 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAUlD,wBAAsB,eAAe,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAchE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA0DjF"}
@@ -0,0 +1,39 @@
1
+ export type ConnectionState = "connected" | "reconnecting" | "disconnected";
2
+ type EventCallback = (data: unknown) => void;
3
+ export declare class Connection {
4
+ private ws;
5
+ private state;
6
+ private listeners;
7
+ private heartbeatTimer;
8
+ private pongTimer;
9
+ private connectionCheckTimer;
10
+ private reconnectTimer;
11
+ private reconnectAttempt;
12
+ private lastConnectedAt;
13
+ private shouldReconnect;
14
+ private connectPromise;
15
+ private refreshPromise;
16
+ getState(): ConnectionState;
17
+ on(event: string, cb: EventCallback): void;
18
+ off(event: string, cb: EventCallback): void;
19
+ private emit;
20
+ connect(): Promise<void>;
21
+ private createSocket;
22
+ private authenticate;
23
+ private handleMessage;
24
+ send(type: string, data?: unknown): void;
25
+ private startHeartbeat;
26
+ private stopHeartbeat;
27
+ private startConnectionCheck;
28
+ private stopConnectionCheck;
29
+ private clearPongTimer;
30
+ private scheduleReconnect;
31
+ private cleanup;
32
+ private handleAuthFailed;
33
+ private startRefreshAndReconnect;
34
+ private setState;
35
+ disconnect(): void;
36
+ }
37
+ export declare const connection: Connection;
38
+ export {};
39
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC;AAE5E,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAe7C,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,oBAAoB,CAA+C;IAC3E,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,cAAc,CAA8B;IAEpD,QAAQ,IAAI,eAAe;IAI3B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,GAAG,IAAI;IAO1C,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,GAAG,IAAI;IAI3C,OAAO,CAAC,IAAI;IAYN,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD9B,OAAO,CAAC,YAAY;IAqCpB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,aAAa;IA8BrB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAY,GAAG,IAAI;IAsB5C,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,QAAQ;IAQhB,UAAU,IAAI,IAAI;CAenB;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -0,0 +1,372 @@
1
+ import WebSocket from "ws";
2
+ import dayjs from "dayjs";
3
+ import { v4 as uuid } from "uuid";
4
+ import { ensureFreshAuth, refreshAccessToken } from "./auth.js";
5
+ import { isNumber, isObject, isString } from "./guards.js";
6
+ import { logger } from "./logger.js";
7
+ import { store } from "./store.js";
8
+ const HEARTBEAT_INTERVAL = 30_000;
9
+ const PONG_TIMEOUT = 10_000;
10
+ const CONNECTION_CHECK_INTERVAL = 60 * 60_000;
11
+ const BACKOFF_BASE = 1_000;
12
+ const BACKOFF_MAX = 30_000;
13
+ export class Connection {
14
+ ws = null;
15
+ state = "disconnected";
16
+ listeners = new Map();
17
+ heartbeatTimer = null;
18
+ pongTimer = null;
19
+ connectionCheckTimer = null;
20
+ reconnectTimer = null;
21
+ reconnectAttempt = 0;
22
+ lastConnectedAt = null;
23
+ shouldReconnect = true;
24
+ connectPromise = null;
25
+ refreshPromise = null;
26
+ getState() {
27
+ return this.state;
28
+ }
29
+ on(event, cb) {
30
+ if (!this.listeners.has(event)) {
31
+ this.listeners.set(event, new Set());
32
+ }
33
+ this.listeners.get(event).add(cb);
34
+ }
35
+ off(event, cb) {
36
+ this.listeners.get(event)?.delete(cb);
37
+ }
38
+ emit(event, data) {
39
+ this.listeners.get(event)?.forEach((cb) => {
40
+ try {
41
+ cb(data);
42
+ }
43
+ catch (err) {
44
+ logger.error("connection", `handler error for event ${event}`, {
45
+ error: err instanceof Error ? err.message : String(err),
46
+ });
47
+ }
48
+ });
49
+ }
50
+ async connect() {
51
+ if (this.refreshPromise) {
52
+ logger.info("connection", "waiting for token refresh before connecting");
53
+ await this.refreshPromise;
54
+ }
55
+ const auth = await ensureFreshAuth();
56
+ if (!auth?.access_token) {
57
+ logger.warn("connection", "skip websocket connect because auth is missing");
58
+ this.shouldReconnect = false;
59
+ this.setState("disconnected");
60
+ return;
61
+ }
62
+ if (this.ws?.readyState === WebSocket.OPEN) {
63
+ logger.info("connection", "skip connect because websocket is already open");
64
+ return;
65
+ }
66
+ if (this.ws?.readyState === WebSocket.CONNECTING && this.connectPromise) {
67
+ logger.info("connection", "reuse in-flight websocket connect");
68
+ return this.connectPromise;
69
+ }
70
+ const settings = store.getSettings();
71
+ const wsUrl = settings.ws_url || "ws://localhost:3000/ws";
72
+ this.shouldReconnect = true;
73
+ this.startConnectionCheck();
74
+ this.setState("reconnecting");
75
+ logger.info("connection", "connecting websocket", {
76
+ ws_url: wsUrl,
77
+ reconnect_attempt: this.reconnectAttempt,
78
+ });
79
+ if (this.reconnectTimer) {
80
+ clearTimeout(this.reconnectTimer);
81
+ this.reconnectTimer = null;
82
+ }
83
+ this.connectPromise = this.createSocket(wsUrl)
84
+ .catch((err) => {
85
+ logger.error("connection", "initial connect failed", {
86
+ error: err instanceof Error ? err.message : String(err),
87
+ });
88
+ this.scheduleReconnect();
89
+ })
90
+ .finally(() => {
91
+ this.connectPromise = null;
92
+ });
93
+ return this.connectPromise;
94
+ }
95
+ createSocket(url) {
96
+ return new Promise((resolve, reject) => {
97
+ this.ws = new WebSocket(url);
98
+ this.ws.on("open", () => {
99
+ logger.info("connection", "websocket connected");
100
+ this.reconnectAttempt = 0;
101
+ this.setState("connected");
102
+ this.authenticate();
103
+ this.startHeartbeat();
104
+ resolve();
105
+ });
106
+ this.ws.on("message", (raw) => {
107
+ this.handleMessage(raw.toString());
108
+ });
109
+ this.ws.on("close", (code, reason) => {
110
+ logger.warn("connection", "websocket closed", {
111
+ code,
112
+ reason: reason.toString(),
113
+ });
114
+ this.cleanup();
115
+ if (this.shouldReconnect) {
116
+ this.scheduleReconnect();
117
+ }
118
+ });
119
+ this.ws.on("error", (err) => {
120
+ logger.error("connection", "websocket error", {
121
+ error: err.message,
122
+ });
123
+ reject(err);
124
+ });
125
+ });
126
+ }
127
+ authenticate() {
128
+ const auth = store.getAuth();
129
+ if (!auth) {
130
+ logger.warn("connection", "no auth data, skip authentication");
131
+ return;
132
+ }
133
+ logger.info("connection", "sending auth message", {
134
+ user_id: auth.user_id,
135
+ has_last_connected_at: Boolean(this.lastConnectedAt),
136
+ });
137
+ this.send("auth", {
138
+ token: auth.access_token,
139
+ client_type: "plugin",
140
+ last_connected_at: this.lastConnectedAt,
141
+ user_id: auth.user_id,
142
+ });
143
+ }
144
+ handleMessage(raw) {
145
+ try {
146
+ const parsed = JSON.parse(raw);
147
+ if (!isWsMessage(parsed)) {
148
+ logger.error("connection", "invalid websocket message envelope", { raw });
149
+ return;
150
+ }
151
+ const msg = parsed;
152
+ if (msg.type === "auth.success") {
153
+ this.lastConnectedAt = dayjs().toISOString();
154
+ logger.info("connection", "authentication succeeded", msg.data);
155
+ }
156
+ else if (msg.type === "auth.failed") {
157
+ logger.warn("connection", "authentication failed", msg.data);
158
+ this.handleAuthFailed(msg.data);
159
+ }
160
+ if (msg.type === "pong") {
161
+ this.clearPongTimer();
162
+ }
163
+ else {
164
+ logger.debug("connection", "received websocket message", {
165
+ id: msg.id,
166
+ type: msg.type,
167
+ });
168
+ }
169
+ this.emit(msg.type, msg.data);
170
+ }
171
+ catch {
172
+ logger.error("connection", "invalid incoming message", { raw });
173
+ }
174
+ }
175
+ send(type, data = {}) {
176
+ if (this.ws?.readyState === WebSocket.OPEN) {
177
+ const msg = {
178
+ id: uuid(),
179
+ type,
180
+ data,
181
+ timestamp: Date.now(),
182
+ };
183
+ this.ws.send(JSON.stringify(msg));
184
+ if (type !== "ping") {
185
+ logger.info("connection", "sent websocket message", {
186
+ id: msg.id,
187
+ type,
188
+ });
189
+ }
190
+ }
191
+ else {
192
+ logger.warn("connection", "cannot send message because websocket is not connected", {
193
+ type,
194
+ });
195
+ }
196
+ }
197
+ startHeartbeat() {
198
+ this.stopHeartbeat();
199
+ this.heartbeatTimer = setInterval(() => {
200
+ if (this.ws?.readyState === WebSocket.OPEN) {
201
+ this.clearPongTimer();
202
+ this.send("ping", {});
203
+ this.pongTimer = setTimeout(() => {
204
+ logger.warn("connection", "pong timeout, terminating websocket");
205
+ this.ws?.terminate();
206
+ }, PONG_TIMEOUT);
207
+ }
208
+ }, HEARTBEAT_INTERVAL);
209
+ }
210
+ stopHeartbeat() {
211
+ if (this.heartbeatTimer) {
212
+ clearInterval(this.heartbeatTimer);
213
+ this.heartbeatTimer = null;
214
+ }
215
+ this.clearPongTimer();
216
+ }
217
+ startConnectionCheck() {
218
+ if (this.connectionCheckTimer) {
219
+ return;
220
+ }
221
+ this.connectionCheckTimer = setInterval(() => {
222
+ const isConnected = this.ws?.readyState === WebSocket.OPEN;
223
+ if (!this.shouldReconnect || isConnected) {
224
+ return;
225
+ }
226
+ logger.warn("connection", "hourly connection check detected disconnected websocket");
227
+ void this.connect();
228
+ }, CONNECTION_CHECK_INTERVAL);
229
+ logger.info("connection", "started hourly connection check", {
230
+ interval_ms: CONNECTION_CHECK_INTERVAL,
231
+ });
232
+ }
233
+ stopConnectionCheck() {
234
+ if (this.connectionCheckTimer) {
235
+ clearInterval(this.connectionCheckTimer);
236
+ this.connectionCheckTimer = null;
237
+ logger.info("connection", "stopped hourly connection check");
238
+ }
239
+ }
240
+ clearPongTimer() {
241
+ if (this.pongTimer) {
242
+ clearTimeout(this.pongTimer);
243
+ this.pongTimer = null;
244
+ }
245
+ }
246
+ scheduleReconnect() {
247
+ if (!this.shouldReconnect) {
248
+ logger.info("connection", "skip scheduling reconnect because reconnect is disabled");
249
+ return;
250
+ }
251
+ this.setState("reconnecting");
252
+ if (this.reconnectTimer) {
253
+ clearTimeout(this.reconnectTimer);
254
+ this.reconnectTimer = null;
255
+ }
256
+ const delay = Math.min(BACKOFF_BASE * 2 ** this.reconnectAttempt, BACKOFF_MAX);
257
+ logger.warn("connection", "scheduled reconnect", {
258
+ delay_ms: delay,
259
+ attempt: this.reconnectAttempt + 1,
260
+ });
261
+ this.reconnectTimer = setTimeout(async () => {
262
+ this.reconnectAttempt++;
263
+ await this.connect();
264
+ }, delay);
265
+ }
266
+ cleanup() {
267
+ this.stopHeartbeat();
268
+ this.ws = null;
269
+ logger.debug("connection", "connection resources cleaned up");
270
+ }
271
+ handleAuthFailed(data) {
272
+ const reason = extractReason(data);
273
+ const looksExpired = /expired|token/i.test(reason);
274
+ if (looksExpired) {
275
+ logger.warn("connection", "auth failed because token looks expired, attempting refresh", {
276
+ reason,
277
+ });
278
+ this.shouldReconnect = false;
279
+ if (this.reconnectTimer) {
280
+ clearTimeout(this.reconnectTimer);
281
+ this.reconnectTimer = null;
282
+ }
283
+ this.stopHeartbeat();
284
+ this.startRefreshAndReconnect(reason);
285
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
286
+ this.ws.close(4003, "auth failed");
287
+ }
288
+ else {
289
+ this.setState("disconnected");
290
+ }
291
+ return;
292
+ }
293
+ this.shouldReconnect = false;
294
+ if (this.reconnectTimer) {
295
+ clearTimeout(this.reconnectTimer);
296
+ this.reconnectTimer = null;
297
+ }
298
+ this.stopHeartbeat();
299
+ logger.warn("connection", "disabled auto reconnect after auth failure", {
300
+ reason,
301
+ data,
302
+ });
303
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
304
+ this.ws.close(4003, "auth failed");
305
+ }
306
+ else {
307
+ this.setState("disconnected");
308
+ }
309
+ }
310
+ startRefreshAndReconnect(reason) {
311
+ if (this.refreshPromise) {
312
+ logger.info("connection", "token refresh already in progress");
313
+ return;
314
+ }
315
+ this.refreshPromise = (async () => {
316
+ const refreshed = await refreshAccessToken(`auth_failed:${reason}`);
317
+ if (!refreshed) {
318
+ logger.error("connection", "token refresh failed after auth failure", { reason });
319
+ this.setState("disconnected");
320
+ return;
321
+ }
322
+ logger.info("connection", "token refresh succeeded, reconnecting websocket", {
323
+ reason,
324
+ });
325
+ this.shouldReconnect = true;
326
+ this.refreshPromise = null;
327
+ await this.connect();
328
+ })().finally(() => {
329
+ this.refreshPromise = null;
330
+ });
331
+ }
332
+ setState(s) {
333
+ if (this.state !== s) {
334
+ this.state = s;
335
+ logger.info("connection", "connection state changed", { state: s });
336
+ this.emit("connection.state", s);
337
+ }
338
+ }
339
+ disconnect() {
340
+ this.shouldReconnect = false;
341
+ logger.info("connection", "disconnect requested by client");
342
+ if (this.reconnectTimer) {
343
+ clearTimeout(this.reconnectTimer);
344
+ this.reconnectTimer = null;
345
+ }
346
+ this.stopHeartbeat();
347
+ this.stopConnectionCheck();
348
+ if (this.ws) {
349
+ this.ws.close(1000, "client disconnect");
350
+ this.ws = null;
351
+ }
352
+ this.setState("disconnected");
353
+ }
354
+ }
355
+ export const connection = new Connection();
356
+ function isWsMessage(value) {
357
+ return (isObject(value) &&
358
+ isString(value.id) &&
359
+ isString(value.type) &&
360
+ "data" in value &&
361
+ isNumber(value.timestamp));
362
+ }
363
+ function extractReason(data) {
364
+ if (!isObject(data))
365
+ return "unknown";
366
+ if (isString(data.reason))
367
+ return data.reason;
368
+ if (isString(data.message))
369
+ return data.message;
370
+ return "unknown";
371
+ }
372
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAE1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D"}
@@ -0,0 +1,3 @@
1
+ export declare function onNewMessage(data: unknown): void;
2
+ export declare function registerChatHandlers(): void;
3
+ //# sourceMappingURL=chat.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/chat.handler.ts"],"names":[],"mappings":"AAsBA,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkBhD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,46 @@
1
+ import { connection } from "../connection.js";
2
+ import { isNumber, isObject, isString } from "../guards.js";
3
+ import { logger } from "../logger.js";
4
+ export function onNewMessage(data) {
5
+ if (!isNewMessagePayload(data)) {
6
+ logger.warn("chat", "ignored invalid chat.new_message payload", data);
7
+ return;
8
+ }
9
+ const payload = data;
10
+ const content = payload.message?.content ?? payload.content ?? "";
11
+ const sessionId = payload.session_id ?? payload.room_id ?? "unknown";
12
+ if (!content)
13
+ return;
14
+ if (payload.is_agent)
15
+ return;
16
+ logger.info("chat", "received new message", {
17
+ session_or_room_id: sessionId,
18
+ unread_count: payload.unread_count,
19
+ preview: content.slice(0, 50),
20
+ });
21
+ }
22
+ export function registerChatHandlers() {
23
+ connection.on("chat.new_message", onNewMessage);
24
+ }
25
+ function isNewMessagePayload(data) {
26
+ if (!isObject(data))
27
+ return false;
28
+ const hasDirectContent = isString(data.content);
29
+ const hasNestedContent = isObject(data.message) &&
30
+ isString(data.message.content) &&
31
+ (!("id" in data.message) || isString(data.message.id)) &&
32
+ (!("sender_id" in data.message) || isString(data.message.sender_id)) &&
33
+ (!("type" in data.message) || isString(data.message.type)) &&
34
+ (!("media_url" in data.message) ||
35
+ data.message.media_url === null ||
36
+ isString(data.message.media_url)) &&
37
+ (!("created_at" in data.message) || isString(data.message.created_at));
38
+ return ((!("room_id" in data) || isString(data.room_id)) &&
39
+ (!("session_id" in data) || isString(data.session_id)) &&
40
+ (!("sender_id" in data) || isString(data.sender_id)) &&
41
+ (!("agent_name" in data) || isString(data.agent_name)) &&
42
+ (!("is_agent" in data) || typeof data.is_agent === "boolean") &&
43
+ (!("unread_count" in data) || isNumber(data.unread_count)) &&
44
+ (hasDirectContent || hasNestedContent));
45
+ }
46
+ //# sourceMappingURL=chat.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.handler.js","sourceRoot":"","sources":["../../src/handlers/chat.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAoBtC,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,0CAA0C,EAAE,IAAI,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAyB,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;IAErE,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO;IAE7B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,sBAAsB,EAAE;QAC1C,kBAAkB,EAAE,SAAS;QAC7B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,UAAU,CAAC,EAAE,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAa;IACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAElC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,gBAAgB,GACpB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,IAAI;YAC/B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzE,OAAO,CACL,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC7D,CAAC,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,CACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function onSessionStart(data: unknown): void;
2
+ export declare function onYourTurn(data: unknown): void;
3
+ export declare function onGenerateReport(data: unknown): Promise<void>;
4
+ export declare function onSessionFailed(data: unknown): void;
5
+ export declare function onReportSaved(data: unknown): void;
6
+ export declare function registerMatchHandlers(): void;
7
+ //# sourceMappingURL=match.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.handler.d.ts","sourceRoot":"","sources":["../../src/handlers/match.handler.ts"],"names":[],"mappings":"AAqDA,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAmClD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAsC9C;AA+CD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DnE;AA4BD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAanD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAUjD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C"}