| 56 | } |
| 57 | |
| 58 | handleEvent(eventName: string, data: any) { |
| 59 | const handlers = this.eventHandlers.get(eventName) |
| 60 | |
| 61 | if (!handlers?.length) { |
| 62 | logger.warn( |
| 63 | `No handlers registered for event "${eventName}". Did you forget to call .on("${eventName}", handler)?` |
| 64 | ) |
| 65 | return |
| 66 | } |
| 67 | |
| 68 | let validatedData = data |
| 69 | if (this.incomingSchema) { |
| 70 | try { |
| 71 | validatedData = this.incomingSchema.parse(data) |
| 72 | } catch (err) { |
| 73 | if (err instanceof z.ZodError) { |
| 74 | logger.error(`Invalid incoming event data for "${eventName}":`, { |
| 75 | errors: err.errors |
| 76 | .map((e) => `${e.path.join(".")}: ${e.message}`) |
| 77 | .join(", "), |
| 78 | data: JSON.stringify(data, null, 2), |
| 79 | }) |
| 80 | } else { |
| 81 | logger.error(`Error validating incoming event "${eventName}":`, err) |
| 82 | } |
| 83 | return |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | let hasErrors = false |
| 88 | handlers.forEach((handler, index) => { |
| 89 | try { |
| 90 | handler(validatedData) |
| 91 | } catch (err) { |
| 92 | hasErrors = true |
| 93 | const error = err instanceof Error ? err : new Error(String(err)) |
| 94 | logger.error( |
| 95 | `Error in handler ${index + 1}/${handlers.length} for event "${eventName}":`, |
| 96 | { |
| 97 | error: error.message, |
| 98 | stack: error.stack, |
| 99 | data: JSON.stringify(validatedData, null, 2), |
| 100 | } |
| 101 | ) |
| 102 | } |
| 103 | }) |
| 104 | |
| 105 | if (hasErrors) { |
| 106 | throw new Error( |
| 107 | `One or more handlers failed for event "${eventName}". Check logs for details.` |
| 108 | ) |
| 109 | } |
| 110 | } |
| 111 | |
| 112 | off(event: string, callback?: (data: any) => any) { |
| 113 | if (!callback) { |