@furlow/pipes 1.0.2 → 1.0.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http/index.ts","../src/websocket/index.ts","../src/webhook/index.ts","../src/mqtt/index.ts","../src/tcp/index.ts","../src/tcp/udp.ts","../src/database/index.ts","../src/file/index.ts"],"sourcesContent":["/**\n * HTTP pipe for REST API integrations\n */\n\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';\nimport type { HttpPipeConfig, Pipe, PipeResponse } from '../types.js';\n\nexport interface HttpPipeOptions {\n name: string;\n config: HttpPipeConfig;\n}\n\nexport class HttpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'http';\n private client: AxiosInstance;\n private config: HttpPipeConfig;\n private requestCount = 0;\n private windowStart = Date.now();\n\n constructor(options: HttpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n\n this.client = axios.create({\n baseURL: options.config.base_url,\n timeout: this.parseDuration(options.config.timeout ?? '30s'),\n headers: options.config.headers as Record<string, string>,\n });\n\n // Add auth interceptor\n if (options.config.auth) {\n this.client.interceptors.request.use((config) => {\n const auth = options.config.auth!;\n switch (auth.type) {\n case 'bearer':\n config.headers.Authorization = `Bearer ${auth.token}`;\n break;\n case 'basic':\n const credentials = Buffer.from(`${auth.username}:${auth.password}`).toString('base64');\n config.headers.Authorization = `Basic ${credentials}`;\n break;\n case 'header':\n const headerName = auth.header_name ?? 'Authorization';\n config.headers[headerName] = auth.token as string;\n break;\n }\n return config;\n });\n }\n }\n\n isConnected(): boolean {\n return true; // HTTP is stateless\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n path: string,\n options: {\n body?: Record<string, unknown>;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n } = {}\n ): Promise<PipeResponse<T>> {\n // Check rate limit\n if (this.config.rate_limit) {\n const now = Date.now();\n const windowMs = this.parseDuration(this.config.rate_limit.per);\n\n if (now - this.windowStart >= windowMs) {\n this.requestCount = 0;\n this.windowStart = now;\n }\n\n if (this.requestCount >= this.config.rate_limit.requests) {\n return {\n success: false,\n error: 'Rate limit exceeded',\n status: 429,\n };\n }\n\n this.requestCount++;\n }\n\n const config: AxiosRequestConfig = {\n method,\n url: path,\n data: options.body,\n headers: options.headers,\n params: options.params,\n };\n\n try {\n const response = await this.requestWithRetry(config);\n\n return {\n success: true,\n data: response.data as T,\n status: response.status,\n headers: response.headers as Record<string, string>,\n };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n return {\n success: false,\n error: error.message,\n status: error.response?.status,\n data: error.response?.data as T,\n };\n }\n\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Make a request with retry logic\n */\n private async requestWithRetry(\n config: AxiosRequestConfig,\n attempt = 0\n ): Promise<any> {\n try {\n return await this.client.request(config);\n } catch (error) {\n const maxAttempts = this.config.retry?.attempts ?? 0;\n const delay = this.parseDuration(this.config.retry?.delay ?? '1s');\n\n if (attempt < maxAttempts && axios.isAxiosError(error)) {\n // Retry on 5xx errors or network errors\n if (!error.response || error.response.status >= 500) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.requestWithRetry(config, attempt + 1);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Convenience methods\n */\n async get<T = unknown>(\n path: string,\n options?: { headers?: Record<string, string>; params?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('GET', path, options);\n }\n\n async post<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('POST', path, { body, ...options });\n }\n\n async put<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('PUT', path, { body, ...options });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('PATCH', path, { body, ...options });\n }\n\n async delete<T = unknown>(\n path: string,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 30000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create an HTTP pipe\n */\nexport function createHttpPipe(options: HttpPipeOptions): HttpPipe {\n return new HttpPipe(options);\n}\n","/**\n * WebSocket pipe for bidirectional communication\n */\n\nimport WebSocket from 'ws';\nimport type { Pipe, PipeResponse, WebSocketPipeConfig } from '../types.js';\n\nexport interface WebSocketPipeOptions {\n name: string;\n config: WebSocketPipeConfig;\n}\n\nexport type WebSocketMessageHandler = (data: unknown) => void | Promise<void>;\n\nexport class WebSocketPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'websocket';\n private ws: WebSocket | null = null;\n private config: WebSocketPipeConfig;\n private reconnectAttempts = 0;\n private reconnecting = false;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private messageHandlers: Map<string, WebSocketMessageHandler[]> = new Map();\n private connected = false;\n\n constructor(options: WebSocketPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const headers = this.config.headers as Record<string, string>;\n this.ws = new WebSocket(this.config.url, { headers });\n\n this.ws.on('open', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n this.startHeartbeat();\n resolve();\n });\n\n this.ws.on('message', (data) => {\n this.handleMessage(data);\n });\n\n this.ws.on('close', () => {\n this.connected = false;\n this.stopHeartbeat();\n this.handleDisconnect();\n });\n\n this.ws.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the server\n */\n async disconnect(): Promise<void> {\n this.stopHeartbeat();\n this.reconnecting = false;\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.connected = false;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Send a message\n */\n send(data: unknown): boolean {\n if (!this.isConnected()) {\n return false;\n }\n\n const message = typeof data === 'string' ? data : JSON.stringify(data);\n this.ws!.send(message);\n return true;\n }\n\n /**\n * Send and wait for a response (request-response pattern)\n */\n async request<T = unknown>(\n data: unknown,\n options: { timeout?: number; responseEvent?: string } = {}\n ): Promise<PipeResponse<T>> {\n const { timeout = 30000, responseEvent = 'response' } = options;\n\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n this.off(responseEvent, handler);\n resolve({ success: false, error: 'Request timeout' });\n }, timeout);\n\n const handler = (response: unknown) => {\n clearTimeout(timer);\n this.off(responseEvent, handler);\n resolve({ success: true, data: response as T });\n };\n\n this.on(responseEvent, handler);\n this.send(data);\n });\n }\n\n /**\n * Register a message handler\n */\n on(event: string, handler: WebSocketMessageHandler): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n handlers.push(handler);\n this.messageHandlers.set(event, handlers);\n }\n\n /**\n * Remove a message handler\n */\n off(event: string, handler: WebSocketMessageHandler): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event to handlers\n */\n private emit(event: string, data: unknown): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`WebSocket handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(rawData: WebSocket.RawData): void {\n let data: unknown;\n\n try {\n const str = rawData.toString();\n data = JSON.parse(str);\n } catch {\n data = rawData.toString();\n }\n\n // Emit to 'message' handlers\n this.emit('message', data);\n\n // Check for event field in JSON messages\n if (typeof data === 'object' && data !== null && 'event' in data) {\n const event = (data as { event: string }).event;\n this.emit(event, data);\n }\n }\n\n /**\n * Handle disconnection\n */\n private handleDisconnect(): void {\n if (!this.config.reconnect?.enabled || this.reconnecting) {\n return;\n }\n\n const maxAttempts = this.config.reconnect.max_attempts ?? 10;\n const delay = this.parseDuration(this.config.reconnect.delay ?? '5s');\n\n if (this.reconnectAttempts >= maxAttempts) {\n this.emit('reconnect_failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnecting = true;\n this.reconnectAttempts++;\n\n setTimeout(async () => {\n try {\n await this.connect();\n this.emit('reconnected', { attempts: this.reconnectAttempts });\n } catch {\n this.reconnecting = false;\n this.handleDisconnect();\n }\n }, delay);\n }\n\n /**\n * Start heartbeat\n */\n private startHeartbeat(): void {\n if (!this.config.heartbeat?.interval) return;\n\n const interval = this.parseDuration(this.config.heartbeat.interval);\n const message = this.config.heartbeat.message ?? 'ping';\n\n this.heartbeatInterval = setInterval(() => {\n if (this.isConnected()) {\n this.send(message);\n }\n }, interval);\n }\n\n /**\n * Stop heartbeat\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create a WebSocket pipe\n */\nexport function createWebSocketPipe(options: WebSocketPipeOptions): WebSocketPipe {\n return new WebSocketPipe(options);\n}\n","/**\n * Webhook pipe for incoming and outgoing webhooks\n */\n\nimport { createHmac } from 'node:crypto';\nimport type { Pipe, PipeResponse, WebhookPipeConfig } from '../types.js';\n\nexport interface WebhookPipeOptions {\n name: string;\n config: WebhookPipeConfig;\n}\n\nexport type WebhookHandler = (\n body: unknown,\n headers: Record<string, string>\n) => void | Promise<void>;\n\nexport class WebhookPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'webhook';\n private config: WebhookPipeConfig;\n private handlers: WebhookHandler[] = [];\n\n constructor(options: WebhookPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n isConnected(): boolean {\n return true;\n }\n\n /**\n * Get the webhook path\n */\n getPath(): string {\n return this.config.path;\n }\n\n /**\n * Get the expected method\n */\n getMethod(): string {\n return this.config.method ?? 'POST';\n }\n\n /**\n * Register a handler for incoming webhooks\n */\n onWebhook(handler: WebhookHandler): () => void {\n this.handlers.push(handler);\n return () => {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n };\n }\n\n /**\n * Handle an incoming webhook request\n */\n async handleRequest(\n body: unknown,\n headers: Record<string, string>\n ): Promise<PipeResponse> {\n // Verify signature if configured\n if (this.config.verification) {\n const valid = this.verifySignature(body, headers);\n if (!valid) {\n return { success: false, error: 'Invalid signature', status: 401 };\n }\n }\n\n // Call handlers\n for (const handler of this.handlers) {\n try {\n await handler(body, headers);\n } catch (error) {\n console.error(`Webhook handler error:`, error);\n }\n }\n\n // Check for config handlers\n if (this.config.handlers) {\n // These would be processed by the action executor\n }\n\n return { success: true, status: 200 };\n }\n\n /**\n * Verify webhook signature\n */\n private verifySignature(\n body: unknown,\n headers: Record<string, string>\n ): boolean {\n if (!this.config.verification) return true;\n\n const { type, secret, header, algorithm } = this.config.verification;\n const signatureHeader = header ?? 'x-signature';\n const receivedSignature = headers[signatureHeader.toLowerCase()];\n\n if (!receivedSignature || !secret) {\n return false;\n }\n\n const bodyString = typeof body === 'string' ? body : JSON.stringify(body);\n\n switch (type) {\n case 'hmac': {\n const algo = algorithm ?? 'sha256';\n const expectedSignature = createHmac(algo, secret)\n .update(bodyString)\n .digest('hex');\n\n // Handle both raw and prefixed signatures\n const cleanReceived = receivedSignature.replace(/^sha\\d+=/, '');\n return this.timingSafeEqual(cleanReceived, expectedSignature);\n }\n\n case 'token': {\n return receivedSignature === secret;\n }\n\n case 'signature': {\n // Custom signature verification\n // This would depend on the specific service\n return true;\n }\n\n default:\n return true;\n }\n }\n\n /**\n * Timing-safe string comparison\n */\n private timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n }\n}\n\n/**\n * Outgoing webhook sender\n */\nexport class WebhookSender {\n /**\n * Send a Discord webhook\n */\n static async sendDiscordWebhook(\n url: string,\n options: {\n content?: string;\n username?: string;\n avatar_url?: string;\n embeds?: Record<string, unknown>[];\n }\n ): Promise<PipeResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options),\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}`,\n status: response.status,\n };\n }\n\n return { success: true, status: response.status };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Send a generic webhook\n */\n static async send(\n url: string,\n body: unknown,\n options: { headers?: Record<string, string>; method?: string } = {}\n ): Promise<PipeResponse> {\n try {\n const response = await fetch(url, {\n method: options.method ?? 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: typeof body === 'string' ? body : JSON.stringify(body),\n });\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n data = await response.text();\n }\n\n return {\n success: response.ok,\n data,\n status: response.status,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n\n/**\n * Create a webhook pipe\n */\nexport function createWebhookPipe(options: WebhookPipeOptions): WebhookPipe {\n return new WebhookPipe(options);\n}\n","/**\n * MQTT pipe for IoT and real-time integrations\n */\n\nimport mqtt, { MqttClient, IClientOptions, IClientPublishOptions } from 'mqtt';\nimport type { Pipe, PipeResponse, MqttPipeConfig, MqttQoS } from '../types.js';\n\nexport interface MqttPipeOptions {\n name: string;\n config: MqttPipeConfig;\n}\n\nexport type MqttMessageHandler = (\n topic: string,\n payload: Buffer | string | Record<string, unknown>,\n packet: unknown\n) => void | Promise<void>;\n\nexport class MqttPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'mqtt';\n private client: MqttClient | null = null;\n private config: MqttPipeConfig;\n private connected = false;\n private reconnectAttempts = 0;\n private messageHandlers: Map<string, MqttMessageHandler[]> = new Map();\n private wildcardHandlers: Map<string, MqttMessageHandler[]> = new Map();\n\n constructor(options: MqttPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the MQTT broker\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const protocol = this.config.protocol ?? 'mqtt';\n const port = this.config.port ?? (protocol === 'mqtts' || protocol === 'wss' ? 8883 : 1883);\n const url = `${protocol}://${this.config.broker}:${port}`;\n\n const options: IClientOptions = {\n keepalive: this.config.keepalive ?? 60,\n clean: this.config.clean ?? true,\n reconnectPeriod: this.config.reconnect?.enabled !== false\n ? this.parseDuration(this.config.reconnect?.delay ?? '5s')\n : 0,\n };\n\n // Authentication\n if (this.config.auth) {\n if (this.config.auth.username) options.username = this.config.auth.username;\n if (this.config.auth.password) options.password = this.config.auth.password;\n if (this.config.auth.clientId) options.clientId = this.config.auth.clientId;\n }\n\n // Last Will and Testament\n if (this.config.will) {\n options.will = {\n topic: this.config.will.topic,\n payload: Buffer.from(this.config.will.payload),\n qos: this.config.will.qos ?? 0,\n retain: this.config.will.retain ?? false,\n };\n }\n\n try {\n this.client = mqtt.connect(url, options);\n\n this.client.on('connect', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.emit('connected', {});\n resolve();\n });\n\n this.client.on('message', (topic, payload, packet) => {\n this.handleMessage(topic, payload, packet);\n });\n\n this.client.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.client.on('close', () => {\n this.connected = false;\n this.emit('disconnected', {});\n });\n\n this.client.on('reconnect', () => {\n this.reconnectAttempts++;\n this.emit('reconnecting', { attempts: this.reconnectAttempts });\n });\n\n this.client.on('offline', () => {\n this.connected = false;\n this.emit('offline', {});\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the broker\n */\n async disconnect(): Promise<void> {\n return new Promise((resolve) => {\n if (this.client) {\n this.client.end(false, {}, () => {\n this.client = null;\n this.connected = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.client?.connected === true;\n }\n\n /**\n * Subscribe to a topic\n */\n async subscribe(\n topic: string,\n options: { qos?: MqttQoS } = {}\n ): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.client!.subscribe(topic, { qos: options.qos ?? 0 }, (error, granted) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true, data: granted });\n }\n });\n });\n }\n\n /**\n * Unsubscribe from a topic\n */\n async unsubscribe(topic: string): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.client!.unsubscribe(topic, {}, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Publish a message to a topic\n */\n async publish(\n topic: string,\n message: string | Buffer | Record<string, unknown>,\n options: { qos?: MqttQoS; retain?: boolean } = {}\n ): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n const payload = typeof message === 'object' && !Buffer.isBuffer(message)\n ? JSON.stringify(message)\n : message;\n\n const publishOptions: IClientPublishOptions = {\n qos: options.qos ?? 0,\n retain: options.retain ?? false,\n };\n\n return new Promise((resolve) => {\n this.client!.publish(topic, payload, publishOptions, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Register a handler for a specific topic\n * Supports MQTT wildcards: + (single level), # (multi level)\n */\n on(topic: string, handler: MqttMessageHandler): void {\n if (topic.includes('+') || topic.includes('#')) {\n // Wildcard topic - store in wildcardHandlers\n const handlers = this.wildcardHandlers.get(topic) ?? [];\n handlers.push(handler);\n this.wildcardHandlers.set(topic, handlers);\n } else {\n // Exact topic\n const handlers = this.messageHandlers.get(topic) ?? [];\n handlers.push(handler);\n this.messageHandlers.set(topic, handlers);\n }\n }\n\n /**\n * Remove a handler\n */\n off(topic: string, handler: MqttMessageHandler): void {\n const map = topic.includes('+') || topic.includes('#')\n ? this.wildcardHandlers\n : this.messageHandlers;\n\n const handlers = map.get(topic) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit to handlers\n */\n private emit(event: string, data: unknown): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(event, data as Buffer, {});\n } catch (error) {\n console.error(`MQTT handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(topic: string, payload: Buffer, packet: unknown): void {\n // Parse payload\n let parsedPayload: Buffer | string | Record<string, unknown> = payload;\n try {\n const str = payload.toString();\n parsedPayload = JSON.parse(str);\n } catch {\n parsedPayload = payload.toString();\n }\n\n // Call exact topic handlers\n const exactHandlers = this.messageHandlers.get(topic) ?? [];\n for (const handler of exactHandlers) {\n try {\n handler(topic, parsedPayload, packet);\n } catch (error) {\n console.error(`MQTT handler error for topic \"${topic}\":`, error);\n }\n }\n\n // Check wildcard handlers\n for (const [pattern, handlers] of this.wildcardHandlers) {\n if (this.topicMatches(pattern, topic)) {\n for (const handler of handlers) {\n try {\n handler(topic, parsedPayload, packet);\n } catch (error) {\n console.error(`MQTT wildcard handler error for pattern \"${pattern}\":`, error);\n }\n }\n }\n }\n\n // Emit to generic message handlers\n this.emit('message', { topic, payload: parsedPayload, packet });\n }\n\n /**\n * Check if a topic matches a pattern with MQTT wildcards\n */\n private topicMatches(pattern: string, topic: string): boolean {\n const patternParts = pattern.split('/');\n const topicParts = topic.split('/');\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n\n // Multi-level wildcard matches everything remaining\n if (patternPart === '#') {\n return true;\n }\n\n // Topic is shorter than pattern\n if (i >= topicParts.length) {\n return false;\n }\n\n // Single-level wildcard matches any single level\n if (patternPart === '+') {\n continue;\n }\n\n // Exact match required\n if (patternPart !== topicParts[i]) {\n return false;\n }\n }\n\n // Pattern and topic should be same length (unless # was used)\n return patternParts.length === topicParts.length;\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create an MQTT pipe\n */\nexport function createMqttPipe(options: MqttPipeOptions): MqttPipe {\n return new MqttPipe(options);\n}\n","/**\n * TCP pipe for raw socket communication\n */\n\nimport { Socket, createConnection, createServer, Server } from 'net';\nimport type { Pipe, PipeResponse, TcpPipeConfig } from '../types.js';\n\nexport interface TcpPipeOptions {\n name: string;\n config: TcpPipeConfig;\n}\n\nexport type TcpDataHandler = (data: Buffer | string) => void | Promise<void>;\nexport type TcpEventHandler = (data?: unknown) => void | Promise<void>;\n\nexport class TcpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'tcp';\n private socket: Socket | null = null;\n private server: Server | null = null;\n private config: TcpPipeConfig;\n private connected = false;\n private reconnectAttempts = 0;\n private reconnecting = false;\n private dataHandlers: TcpDataHandler[] = [];\n private eventHandlers: Map<string, TcpEventHandler[]> = new Map();\n\n constructor(options: TcpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to a TCP server (client mode)\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n\n this.socket.setEncoding(this.config.encoding ?? 'utf8');\n\n this.socket.on('connect', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n this.emit('connected');\n resolve();\n });\n\n this.socket.on('data', (data) => {\n this.handleData(data);\n });\n\n this.socket.on('close', () => {\n this.connected = false;\n this.emit('disconnected');\n this.handleDisconnect();\n });\n\n this.socket.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.socket.on('end', () => {\n this.connected = false;\n this.emit('end');\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Start a TCP server (server mode)\n */\n async listen(port?: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.server = createServer((socket) => {\n socket.setEncoding(this.config.encoding ?? 'utf8');\n\n socket.on('data', (data) => {\n this.handleData(data);\n });\n\n socket.on('error', (error) => {\n this.emit('client_error', error);\n });\n\n this.emit('connection', socket);\n });\n\n this.server.on('error', (error) => {\n reject(error);\n });\n\n this.server.listen(port ?? this.config.port, () => {\n this.connected = true;\n this.emit('listening');\n resolve();\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect / close\n */\n async disconnect(): Promise<void> {\n this.reconnecting = false;\n\n return new Promise((resolve) => {\n if (this.socket) {\n this.socket.end(() => {\n this.socket?.destroy();\n this.socket = null;\n this.connected = false;\n resolve();\n });\n } else if (this.server) {\n this.server.close(() => {\n this.server = null;\n this.connected = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Send data\n */\n async send(data: Buffer | string): Promise<PipeResponse> {\n if (!this.socket || !this.connected) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.socket!.write(data, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Send and wait for response (request-response pattern)\n */\n async request<T = string>(\n data: Buffer | string,\n options: { timeout?: number } = {}\n ): Promise<PipeResponse<T>> {\n const { timeout = 30000 } = options;\n\n if (!this.socket || !this.connected) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n this.offData(handler);\n resolve({ success: false, error: 'Request timeout' });\n }, timeout);\n\n const handler = (response: Buffer | string) => {\n clearTimeout(timer);\n this.offData(handler);\n resolve({ success: true, data: response as T });\n };\n\n this.onData(handler);\n this.send(data);\n });\n }\n\n /**\n * Register a data handler\n */\n onData(handler: TcpDataHandler): void {\n this.dataHandlers.push(handler);\n }\n\n /**\n * Remove a data handler\n */\n offData(handler: TcpDataHandler): void {\n const index = this.dataHandlers.indexOf(handler);\n if (index !== -1) {\n this.dataHandlers.splice(index, 1);\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: string, handler: TcpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: string, handler: TcpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`TCP handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming data\n */\n private handleData(data: Buffer | string): void {\n for (const handler of this.dataHandlers) {\n try {\n handler(data);\n } catch (error) {\n console.error('TCP data handler error:', error);\n }\n }\n this.emit('data', data);\n }\n\n /**\n * Handle disconnection with reconnect logic\n */\n private handleDisconnect(): void {\n if (!this.config.reconnect?.enabled || this.reconnecting) {\n return;\n }\n\n const maxAttempts = this.config.reconnect.max_attempts ?? 10;\n const delay = this.parseDuration(this.config.reconnect.delay ?? '5s');\n\n if (this.reconnectAttempts >= maxAttempts) {\n this.emit('reconnect_failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnecting = true;\n this.reconnectAttempts++;\n\n setTimeout(async () => {\n try {\n await this.connect();\n this.emit('reconnected', { attempts: this.reconnectAttempts });\n } catch {\n this.reconnecting = false;\n this.handleDisconnect();\n }\n }, delay);\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create a TCP pipe\n */\nexport function createTcpPipe(options: TcpPipeOptions): TcpPipe {\n return new TcpPipe(options);\n}\n\n// Re-export UDP pipe\nexport * from './udp.js';\n","/**\n * UDP pipe for datagram communication\n */\n\nimport { createSocket, Socket, RemoteInfo } from 'dgram';\nimport type { Pipe, PipeResponse, UdpPipeConfig } from '../types.js';\n\nexport interface UdpPipeOptions {\n name: string;\n config: UdpPipeConfig;\n}\n\nexport interface UdpMessage {\n data: Buffer;\n rinfo: RemoteInfo;\n}\n\nexport type UdpMessageHandler = (msg: UdpMessage) => void | Promise<void>;\nexport type UdpEventHandler = (data?: unknown) => void | Promise<void>;\n\nexport class UdpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'udp';\n private socket: Socket | null = null;\n private config: UdpPipeConfig;\n private bound = false;\n private messageHandlers: UdpMessageHandler[] = [];\n private eventHandlers: Map<string, UdpEventHandler[]> = new Map();\n\n constructor(options: UdpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Bind to a port to receive messages\n */\n async bind(port?: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = createSocket('udp4');\n\n this.socket.on('message', (msg, rinfo) => {\n this.handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', (error) => {\n if (!this.bound) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.socket.on('listening', () => {\n this.bound = true;\n const address = this.socket!.address();\n this.emit('listening', address);\n resolve();\n });\n\n // Setup broadcast if configured\n if (this.config.broadcast) {\n this.socket.setBroadcast(true);\n }\n\n // Bind to port\n const bindPort = port ?? this.config.port;\n const bindHost = this.config.host ?? '0.0.0.0';\n this.socket.bind(bindPort, bindHost, () => {\n // Join multicast group if configured\n if (this.config.multicast) {\n this.socket!.addMembership(this.config.multicast);\n }\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Close the socket\n */\n async disconnect(): Promise<void> {\n return new Promise((resolve) => {\n if (this.socket) {\n this.socket.close(() => {\n this.socket = null;\n this.bound = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if bound\n */\n isConnected(): boolean {\n return this.bound;\n }\n\n /**\n * Send data to a specific host and port\n */\n async send(\n data: Buffer | string,\n host: string,\n port: number\n ): Promise<PipeResponse> {\n if (!this.socket) {\n // Create socket if not exists (for send-only mode)\n this.socket = createSocket('udp4');\n if (this.config.broadcast) {\n this.socket.setBroadcast(true);\n }\n }\n\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n\n return new Promise((resolve) => {\n this.socket!.send(buffer, port, host, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Broadcast data to all hosts on the network\n */\n async broadcast(\n data: Buffer | string,\n port: number,\n address = '255.255.255.255'\n ): Promise<PipeResponse> {\n if (!this.socket) {\n this.socket = createSocket('udp4');\n this.socket.setBroadcast(true);\n }\n\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n\n return new Promise((resolve) => {\n this.socket!.send(buffer, port, address, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Send to multicast group\n */\n async multicast(\n data: Buffer | string,\n port: number,\n group?: string\n ): Promise<PipeResponse> {\n const multicastGroup = group ?? this.config.multicast;\n if (!multicastGroup) {\n return { success: false, error: 'No multicast group configured' };\n }\n\n return this.send(data, multicastGroup, port);\n }\n\n /**\n * Register a message handler\n */\n onMessage(handler: UdpMessageHandler): void {\n this.messageHandlers.push(handler);\n }\n\n /**\n * Remove a message handler\n */\n offMessage(handler: UdpMessageHandler): void {\n const index = this.messageHandlers.indexOf(handler);\n if (index !== -1) {\n this.messageHandlers.splice(index, 1);\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: string, handler: UdpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: string, handler: UdpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`UDP handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(data: Buffer, rinfo: RemoteInfo): void {\n const msg: UdpMessage = { data, rinfo };\n\n for (const handler of this.messageHandlers) {\n try {\n handler(msg);\n } catch (error) {\n console.error('UDP message handler error:', error);\n }\n }\n\n this.emit('message', msg);\n }\n}\n\n/**\n * Create a UDP pipe\n */\nexport function createUdpPipe(options: UdpPipeOptions): UdpPipe {\n return new UdpPipe(options);\n}\n","/**\n * Database pipe for reactive database operations\n */\n\nimport type {\n Pipe,\n PipeResponse,\n DatabasePipeConfig,\n DatabaseEvent,\n DatabaseEventType,\n} from '../types.js';\n\nexport interface DatabasePipeOptions {\n name: string;\n config: DatabasePipeConfig;\n}\n\nexport type DatabaseEventHandler = (event: DatabaseEvent) => void | Promise<void>;\n\nexport class DatabasePipe implements Pipe {\n public readonly name: string;\n public readonly type = 'database';\n private config: DatabasePipeConfig;\n private connected = false;\n private db: any = null;\n private eventHandlers: Map<string, DatabaseEventHandler[]> = new Map();\n\n constructor(options: DatabasePipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n if (this.config.adapter === 'sqlite') {\n // Dynamic import to avoid bundling issues\n const BetterSqlite3 = (await import('better-sqlite3')).default;\n const connectionString =\n typeof this.config.connection === 'string'\n ? this.config.connection\n : ':memory:';\n this.db = new BetterSqlite3(connectionString);\n } else if (this.config.adapter === 'memory') {\n // In-memory storage using a simple object\n this.db = new MemoryDatabase();\n } else {\n throw new Error(`Unsupported adapter: ${this.config.adapter}`);\n }\n\n this.connected = true;\n this.emit('connected', {\n type: 'insert',\n table: '',\n data: {},\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to connect to database: ${message}`);\n }\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n try {\n if (this.config.adapter === 'sqlite' && this.db) {\n this.db.close();\n }\n this.db = null;\n this.connected = false;\n this.emit('disconnected', {\n type: 'delete',\n table: '',\n data: {},\n });\n } catch {\n // Ignore close errors\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Execute a raw SQL query\n */\n async query<T = Record<string, unknown>[]>(\n sql: string,\n params: unknown[] = []\n ): Promise<PipeResponse<T>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n // Check if it's a SELECT query\n if (sql.trim().toUpperCase().startsWith('SELECT')) {\n const rows = stmt.all(...params);\n return { success: true, data: rows as T };\n } else {\n const result = stmt.run(...params);\n return { success: true, data: result as T };\n }\n } else if (this.config.adapter === 'memory') {\n const result = this.db.query(sql, params);\n return { success: true, data: result as T };\n }\n\n return { success: false, error: 'Unsupported adapter' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Insert a row into a table\n */\n async insert(\n table: string,\n data: Record<string, unknown>\n ): Promise<PipeResponse<{ lastInsertRowid?: number | bigint }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const columns = Object.keys(data);\n const values = Object.values(data);\n const placeholders = columns.map(() => '?').join(', ');\n const sql = `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;\n\n let result: { lastInsertRowid?: number | bigint } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...values);\n } else if (this.config.adapter === 'memory') {\n result = this.db.insert(table, data);\n }\n\n // Emit insert event\n const event: DatabaseEvent = {\n type: 'insert',\n table,\n data,\n };\n this.emit('insert', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Update rows in a table\n */\n async update(\n table: string,\n where: Record<string, unknown>,\n data: Record<string, unknown>\n ): Promise<PipeResponse<{ changes?: number }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const setClauses = Object.keys(data)\n .map((key) => `${key} = ?`)\n .join(', ');\n const whereClauses = Object.keys(where)\n .map((key) => `${key} = ?`)\n .join(' AND ');\n const sql = `UPDATE ${table} SET ${setClauses} WHERE ${whereClauses}`;\n const params = [...Object.values(data), ...Object.values(where)];\n\n let result: { changes?: number } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...params);\n } else if (this.config.adapter === 'memory') {\n result = this.db.update(table, where, data);\n }\n\n // Emit update event\n const event: DatabaseEvent = {\n type: 'update',\n table,\n data,\n oldData: where,\n };\n this.emit('update', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Delete rows from a table\n */\n async delete(\n table: string,\n where: Record<string, unknown>\n ): Promise<PipeResponse<{ changes?: number }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const whereClauses = Object.keys(where)\n .map((key) => `${key} = ?`)\n .join(' AND ');\n const sql = `DELETE FROM ${table} WHERE ${whereClauses}`;\n const params = Object.values(where);\n\n let result: { changes?: number } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...params);\n } else if (this.config.adapter === 'memory') {\n result = this.db.delete(table, where);\n }\n\n // Emit delete event\n const event: DatabaseEvent = {\n type: 'delete',\n table,\n data: where,\n };\n this.emit('delete', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: DatabaseEventType | 'change' | 'connected' | 'disconnected', handler: DatabaseEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: DatabaseEventType | 'change' | 'connected' | 'disconnected', handler: DatabaseEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data: DatabaseEvent): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Database handler error for \"${event}\":`, error);\n }\n }\n }\n}\n\n/**\n * Simple in-memory database for testing\n */\nclass MemoryDatabase {\n private tables: Map<string, Record<string, unknown>[]> = new Map();\n private autoIncrements: Map<string, number> = new Map();\n\n query(sql: string, _params: unknown[]): Record<string, unknown>[] {\n // Very basic SQL parsing for memory adapter\n const selectMatch = sql.match(/SELECT \\* FROM (\\w+)/i);\n if (selectMatch) {\n const table = selectMatch[1]!;\n return this.tables.get(table) ?? [];\n }\n return [];\n }\n\n insert(table: string, data: Record<string, unknown>): { lastInsertRowid: number } {\n if (!this.tables.has(table)) {\n this.tables.set(table, []);\n }\n\n const id = (this.autoIncrements.get(table) ?? 0) + 1;\n this.autoIncrements.set(table, id);\n\n const row = { id, ...data };\n this.tables.get(table)!.push(row);\n\n return { lastInsertRowid: id };\n }\n\n update(\n table: string,\n where: Record<string, unknown>,\n data: Record<string, unknown>\n ): { changes: number } {\n const rows = this.tables.get(table) ?? [];\n let changes = 0;\n\n for (const row of rows) {\n if (this.matchesWhere(row, where)) {\n Object.assign(row, data);\n changes++;\n }\n }\n\n return { changes };\n }\n\n delete(table: string, where: Record<string, unknown>): { changes: number } {\n const rows = this.tables.get(table) ?? [];\n const initialLength = rows.length;\n\n const remaining = rows.filter((row) => !this.matchesWhere(row, where));\n this.tables.set(table, remaining);\n\n return { changes: initialLength - remaining.length };\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n where: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(where)) {\n if (row[key] !== value) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * Create a database pipe\n */\nexport function createDatabasePipe(options: DatabasePipeOptions): DatabasePipe {\n return new DatabasePipe(options);\n}\n","/**\n * File pipe for file system watching\n */\n\nimport chokidar, { FSWatcher } from 'chokidar';\nimport type { Pipe, PipeResponse, FilePipeConfig, FileEvent, FileEventType } from '../types.js';\n\nexport interface FilePipeOptions {\n name: string;\n config: FilePipeConfig;\n}\n\nexport type FileEventHandler = (event: FileEvent) => void | Promise<void>;\n\nexport class FilePipe implements Pipe {\n public readonly name: string;\n public readonly type = 'file';\n private watcher: FSWatcher | null = null;\n private config: FilePipeConfig;\n private watching = false;\n private eventHandlers: Map<string, FileEventHandler[]> = new Map();\n\n constructor(options: FilePipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Start watching files (alias for connect)\n */\n async watch(): Promise<void> {\n return this.connect();\n }\n\n /**\n * Start watching files\n */\n async connect(): Promise<void> {\n if (this.watching) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this.watcher = chokidar.watch(this.config.paths, {\n ignored: this.config.ignore,\n persistent: this.config.persistent ?? true,\n usePolling: this.config.usePolling ?? false,\n ignoreInitial: true,\n });\n\n this.watcher.on('ready', () => {\n this.watching = true;\n resolve();\n });\n\n this.watcher.on('error', (error) => {\n if (!this.watching) {\n reject(error);\n }\n this.emit('error', {\n type: 'change',\n path: '',\n });\n });\n\n // File events\n this.watcher.on('add', (path, stats) => {\n const event: FileEvent = {\n type: 'add',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n }\n : undefined,\n };\n this.emit('add', event);\n this.emit('all', event);\n });\n\n this.watcher.on('change', (path, stats) => {\n const event: FileEvent = {\n type: 'change',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n }\n : undefined,\n };\n this.emit('change', event);\n this.emit('all', event);\n });\n\n this.watcher.on('unlink', (path) => {\n const event: FileEvent = {\n type: 'unlink',\n path,\n };\n this.emit('unlink', event);\n this.emit('all', event);\n });\n\n // Directory events\n this.watcher.on('addDir', (path, stats) => {\n const event: FileEvent = {\n type: 'addDir',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: true,\n }\n : undefined,\n };\n this.emit('addDir', event);\n this.emit('all', event);\n });\n\n this.watcher.on('unlinkDir', (path) => {\n const event: FileEvent = {\n type: 'unlinkDir',\n path,\n };\n this.emit('unlinkDir', event);\n this.emit('all', event);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop watching files\n */\n async disconnect(): Promise<void> {\n if (!this.watcher) {\n return;\n }\n\n await this.watcher.close();\n this.watcher = null;\n this.watching = false;\n }\n\n /**\n * Check if watching\n */\n isConnected(): boolean {\n return this.watching;\n }\n\n /**\n * Add paths to watch\n */\n add(paths: string | string[]): void {\n if (this.watcher) {\n this.watcher.add(paths);\n }\n }\n\n /**\n * Stop watching specific paths\n */\n unwatch(paths: string | string[]): void {\n if (this.watcher) {\n this.watcher.unwatch(paths);\n }\n }\n\n /**\n * Get watched paths\n */\n getWatched(): Record<string, string[]> {\n if (this.watcher) {\n return this.watcher.getWatched();\n }\n return {};\n }\n\n /**\n * Register an event handler\n */\n on(event: FileEventType | 'all' | 'error', handler: FileEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: FileEventType | 'all' | 'error', handler: FileEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data: FileEvent): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`File handler error for \"${event}\":`, error);\n }\n }\n }\n}\n\n/**\n * Create a file pipe\n */\nexport function createFilePipe(options: FilePipeOptions): FilePipe {\n return new FilePipe(options);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/http/index.ts","../src/websocket/index.ts","../src/webhook/index.ts","../src/mqtt/index.ts","../src/tcp/index.ts","../src/tcp/udp.ts","../src/database/index.ts","../src/file/index.ts"],"sourcesContent":["/**\n * HTTP pipe for REST API integrations\n */\n\nimport axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';\nimport type { HttpPipeConfig, Pipe, PipeResponse } from '../types.js';\n\nexport interface HttpPipeOptions {\n name: string;\n config: HttpPipeConfig;\n}\n\nexport class HttpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'http';\n private client: AxiosInstance;\n private config: HttpPipeConfig;\n private requestCount = 0;\n private windowStart = Date.now();\n\n constructor(options: HttpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n\n this.client = axios.create({\n baseURL: options.config.base_url,\n timeout: this.parseDuration(options.config.timeout ?? '30s'),\n headers: options.config.headers as Record<string, string>,\n });\n\n // Add auth interceptor\n if (options.config.auth) {\n this.client.interceptors.request.use((config) => {\n const auth = options.config.auth!;\n switch (auth.type) {\n case 'bearer':\n config.headers.Authorization = `Bearer ${auth.token}`;\n break;\n case 'basic':\n const credentials = Buffer.from(`${auth.username}:${auth.password}`).toString('base64');\n config.headers.Authorization = `Basic ${credentials}`;\n break;\n case 'header':\n const headerName = auth.header_name ?? 'Authorization';\n config.headers[headerName] = auth.token as string;\n break;\n }\n return config;\n });\n }\n }\n\n isConnected(): boolean {\n return true; // HTTP is stateless\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n path: string,\n options: {\n body?: Record<string, unknown>;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n } = {}\n ): Promise<PipeResponse<T>> {\n // Check rate limit\n if (this.config.rate_limit) {\n const now = Date.now();\n const windowMs = this.parseDuration(this.config.rate_limit.per);\n\n if (now - this.windowStart >= windowMs) {\n this.requestCount = 0;\n this.windowStart = now;\n }\n\n if (this.requestCount >= this.config.rate_limit.requests) {\n return {\n success: false,\n error: 'Rate limit exceeded',\n status: 429,\n };\n }\n\n this.requestCount++;\n }\n\n const config: AxiosRequestConfig = {\n method,\n url: path,\n data: options.body,\n headers: options.headers,\n params: options.params,\n };\n\n try {\n const response = await this.requestWithRetry(config);\n\n return {\n success: true,\n data: response.data as T,\n status: response.status,\n headers: response.headers as Record<string, string>,\n };\n } catch (error) {\n if (axios.isAxiosError(error)) {\n return {\n success: false,\n error: error.message,\n status: error.response?.status,\n data: error.response?.data as T,\n };\n }\n\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Make a request with retry logic\n */\n private async requestWithRetry(\n config: AxiosRequestConfig,\n attempt = 0\n ): Promise<any> {\n try {\n return await this.client.request(config);\n } catch (error) {\n const maxAttempts = this.config.retry?.attempts ?? 0;\n const delay = this.parseDuration(this.config.retry?.delay ?? '1s');\n\n if (attempt < maxAttempts && axios.isAxiosError(error)) {\n // Retry on 5xx errors or network errors\n if (!error.response || error.response.status >= 500) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n return this.requestWithRetry(config, attempt + 1);\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Convenience methods\n */\n async get<T = unknown>(\n path: string,\n options?: { headers?: Record<string, string>; params?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('GET', path, options);\n }\n\n async post<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('POST', path, { body, ...options });\n }\n\n async put<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('PUT', path, { body, ...options });\n }\n\n async patch<T = unknown>(\n path: string,\n body?: Record<string, unknown>,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('PATCH', path, { body, ...options });\n }\n\n async delete<T = unknown>(\n path: string,\n options?: { headers?: Record<string, string> }\n ): Promise<PipeResponse<T>> {\n return this.request<T>('DELETE', path, options);\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 30000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create an HTTP pipe\n */\nexport function createHttpPipe(options: HttpPipeOptions): HttpPipe {\n return new HttpPipe(options);\n}\n","/**\n * WebSocket pipe for bidirectional communication\n */\n\nimport WebSocket from 'ws';\nimport type { Pipe, PipeResponse, WebSocketPipeConfig } from '../types.js';\n\nexport interface WebSocketPipeOptions {\n name: string;\n config: WebSocketPipeConfig;\n}\n\nexport type WebSocketMessageHandler = (data: unknown) => void | Promise<void>;\n\nexport class WebSocketPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'websocket';\n private ws: WebSocket | null = null;\n private config: WebSocketPipeConfig;\n private reconnectAttempts = 0;\n private reconnecting = false;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private messageHandlers: Map<string, WebSocketMessageHandler[]> = new Map();\n private connected = false;\n\n constructor(options: WebSocketPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const headers = this.config.headers as Record<string, string>;\n this.ws = new WebSocket(this.config.url, { headers });\n\n this.ws.on('open', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n this.startHeartbeat();\n resolve();\n });\n\n this.ws.on('message', (data) => {\n this.handleMessage(data);\n });\n\n this.ws.on('close', () => {\n this.connected = false;\n this.stopHeartbeat();\n this.handleDisconnect();\n });\n\n this.ws.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the server\n */\n async disconnect(): Promise<void> {\n this.stopHeartbeat();\n this.reconnecting = false;\n\n // Clear any pending reconnect timer to prevent memory leaks\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.connected = false;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Send a message\n */\n send(data: unknown): boolean {\n if (!this.isConnected()) {\n return false;\n }\n\n const message = typeof data === 'string' ? data : JSON.stringify(data);\n this.ws!.send(message);\n return true;\n }\n\n /**\n * Send and wait for a response (request-response pattern)\n */\n async request<T = unknown>(\n data: unknown,\n options: { timeout?: number; responseEvent?: string } = {}\n ): Promise<PipeResponse<T>> {\n const { timeout = 30000, responseEvent = 'response' } = options;\n\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const cleanup = () => {\n this.off(responseEvent, handler);\n };\n\n const timer = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n cleanup();\n resolve({ success: false, error: 'Request timeout' });\n }, timeout);\n\n const handler = (response: unknown) => {\n if (resolved) return;\n resolved = true;\n clearTimeout(timer);\n cleanup();\n resolve({ success: true, data: response as T });\n };\n\n this.on(responseEvent, handler);\n this.send(data);\n });\n }\n\n /**\n * Register a message handler\n */\n on(event: string, handler: WebSocketMessageHandler): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n handlers.push(handler);\n this.messageHandlers.set(event, handlers);\n }\n\n /**\n * Remove a message handler\n */\n off(event: string, handler: WebSocketMessageHandler): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event to handlers\n */\n private emit(event: string, data: unknown): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n const result = handler(data);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`WebSocket async handler error for \"${event}\":`, error);\n });\n }\n } catch (error) {\n console.error(`WebSocket handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(rawData: WebSocket.RawData): void {\n let data: unknown;\n\n try {\n const str = rawData.toString();\n data = JSON.parse(str);\n } catch {\n data = rawData.toString();\n }\n\n // Emit to 'message' handlers\n this.emit('message', data);\n\n // Check for event field in JSON messages\n if (typeof data === 'object' && data !== null && 'event' in data) {\n const event = (data as { event: string }).event;\n this.emit(event, data);\n }\n }\n\n /**\n * Handle disconnection\n */\n private handleDisconnect(): void {\n if (!this.config.reconnect?.enabled || this.reconnecting) {\n return;\n }\n\n const maxAttempts = this.config.reconnect.max_attempts ?? 10;\n const delay = this.parseDuration(this.config.reconnect.delay ?? '5s');\n\n if (this.reconnectAttempts >= maxAttempts) {\n this.emit('reconnect_failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnecting = true;\n this.reconnectAttempts++;\n\n // Track the timer so it can be cleared on disconnect\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect()\n .then(() => {\n this.emit('reconnected', { attempts: this.reconnectAttempts });\n })\n .catch(() => {\n this.reconnecting = false;\n this.handleDisconnect();\n });\n }, delay);\n }\n\n /**\n * Start heartbeat\n */\n private startHeartbeat(): void {\n if (!this.config.heartbeat?.interval) return;\n\n const interval = this.parseDuration(this.config.heartbeat.interval);\n const message = this.config.heartbeat.message ?? 'ping';\n\n this.heartbeatInterval = setInterval(() => {\n if (this.isConnected()) {\n this.send(message);\n }\n }, interval);\n }\n\n /**\n * Stop heartbeat\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create a WebSocket pipe\n */\nexport function createWebSocketPipe(options: WebSocketPipeOptions): WebSocketPipe {\n return new WebSocketPipe(options);\n}\n","/**\n * Webhook pipe for incoming and outgoing webhooks\n */\n\nimport { createHmac } from 'node:crypto';\nimport type { Pipe, PipeResponse, WebhookPipeConfig } from '../types.js';\n\nexport interface WebhookPipeOptions {\n name: string;\n config: WebhookPipeConfig;\n}\n\nexport type WebhookHandler = (\n body: unknown,\n headers: Record<string, string>\n) => void | Promise<void>;\n\nexport class WebhookPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'webhook';\n private config: WebhookPipeConfig;\n private handlers: WebhookHandler[] = [];\n\n constructor(options: WebhookPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n isConnected(): boolean {\n return true;\n }\n\n /**\n * Get the webhook path\n */\n getPath(): string {\n return this.config.path;\n }\n\n /**\n * Get the expected method\n */\n getMethod(): string {\n return this.config.method ?? 'POST';\n }\n\n /**\n * Register a handler for incoming webhooks\n */\n onWebhook(handler: WebhookHandler): () => void {\n this.handlers.push(handler);\n return () => {\n const index = this.handlers.indexOf(handler);\n if (index !== -1) {\n this.handlers.splice(index, 1);\n }\n };\n }\n\n /**\n * Handle an incoming webhook request\n */\n async handleRequest(\n body: unknown,\n headers: Record<string, string>\n ): Promise<PipeResponse> {\n // Verify signature if configured\n if (this.config.verification) {\n const valid = this.verifySignature(body, headers);\n if (!valid) {\n return { success: false, error: 'Invalid signature', status: 401 };\n }\n }\n\n // Call handlers\n for (const handler of this.handlers) {\n try {\n await handler(body, headers);\n } catch (error) {\n console.error(`Webhook handler error:`, error);\n }\n }\n\n // Check for config handlers\n if (this.config.handlers) {\n // These would be processed by the action executor\n }\n\n return { success: true, status: 200 };\n }\n\n /**\n * Verify webhook signature\n */\n private verifySignature(\n body: unknown,\n headers: Record<string, string>\n ): boolean {\n if (!this.config.verification) return true;\n\n const { type, secret, header, algorithm } = this.config.verification;\n const signatureHeader = header ?? 'x-signature';\n const receivedSignature = headers[signatureHeader.toLowerCase()];\n\n if (!receivedSignature || !secret) {\n return false;\n }\n\n const bodyString = typeof body === 'string' ? body : JSON.stringify(body);\n\n switch (type) {\n case 'hmac': {\n const algo = algorithm ?? 'sha256';\n const expectedSignature = createHmac(algo, secret)\n .update(bodyString)\n .digest('hex');\n\n // Handle both raw and prefixed signatures\n const cleanReceived = receivedSignature.replace(/^sha\\d+=/, '');\n return this.timingSafeEqual(cleanReceived, expectedSignature);\n }\n\n case 'token': {\n return receivedSignature === secret;\n }\n\n case 'signature': {\n // Custom signature verification - fail closed by default\n // Requires both a header configuration and a secret to be provided\n const signatureValue = headers[signatureHeader.toLowerCase()];\n if (!signatureValue) {\n return false;\n }\n // Compare the provided signature with the secret using timing-safe comparison\n return this.timingSafeEqual(signatureValue, secret);\n }\n\n default:\n // Unknown verification type - fail closed for security\n return false;\n }\n }\n\n /**\n * Timing-safe string comparison\n */\n private timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < a.length; i++) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n }\n}\n\n/**\n * Outgoing webhook sender\n */\nexport class WebhookSender {\n /**\n * Send a Discord webhook\n */\n static async sendDiscordWebhook(\n url: string,\n options: {\n content?: string;\n username?: string;\n avatar_url?: string;\n embeds?: Record<string, unknown>[];\n }\n ): Promise<PipeResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options),\n });\n\n if (!response.ok) {\n return {\n success: false,\n error: `HTTP ${response.status}`,\n status: response.status,\n };\n }\n\n return { success: true, status: response.status };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Send a generic webhook\n */\n static async send(\n url: string,\n body: unknown,\n options: { headers?: Record<string, string>; method?: string } = {}\n ): Promise<PipeResponse> {\n try {\n const response = await fetch(url, {\n method: options.method ?? 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: typeof body === 'string' ? body : JSON.stringify(body),\n });\n\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n data = await response.text();\n }\n\n return {\n success: response.ok,\n data,\n status: response.status,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n\n/**\n * Create a webhook pipe\n */\nexport function createWebhookPipe(options: WebhookPipeOptions): WebhookPipe {\n return new WebhookPipe(options);\n}\n","/**\n * MQTT pipe for IoT and real-time integrations\n */\n\nimport mqtt, { MqttClient, IClientOptions, IClientPublishOptions } from 'mqtt';\nimport type { Pipe, PipeResponse, MqttPipeConfig, MqttQoS } from '../types.js';\n\nexport interface MqttPipeOptions {\n name: string;\n config: MqttPipeConfig;\n}\n\nexport type MqttMessageHandler = (\n topic: string,\n payload: Buffer | string | Record<string, unknown>,\n packet: unknown\n) => void | Promise<void>;\n\nexport class MqttPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'mqtt';\n private client: MqttClient | null = null;\n private config: MqttPipeConfig;\n private connected = false;\n private reconnectAttempts = 0;\n private messageHandlers: Map<string, MqttMessageHandler[]> = new Map();\n private wildcardHandlers: Map<string, MqttMessageHandler[]> = new Map();\n\n constructor(options: MqttPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the MQTT broker\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const protocol = this.config.protocol ?? 'mqtt';\n const port = this.config.port ?? (protocol === 'mqtts' || protocol === 'wss' ? 8883 : 1883);\n const url = `${protocol}://${this.config.broker}:${port}`;\n\n const options: IClientOptions = {\n keepalive: this.config.keepalive ?? 60,\n clean: this.config.clean ?? true,\n reconnectPeriod: this.config.reconnect?.enabled !== false\n ? this.parseDuration(this.config.reconnect?.delay ?? '5s')\n : 0,\n };\n\n // Authentication\n if (this.config.auth) {\n if (this.config.auth.username) options.username = this.config.auth.username;\n if (this.config.auth.password) options.password = this.config.auth.password;\n if (this.config.auth.clientId) options.clientId = this.config.auth.clientId;\n }\n\n // Last Will and Testament\n if (this.config.will) {\n options.will = {\n topic: this.config.will.topic,\n payload: Buffer.from(this.config.will.payload),\n qos: this.config.will.qos ?? 0,\n retain: this.config.will.retain ?? false,\n };\n }\n\n try {\n this.client = mqtt.connect(url, options);\n\n this.client.on('connect', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.emit('connected', {});\n resolve();\n });\n\n this.client.on('message', (topic, payload, packet) => {\n this.handleMessage(topic, payload, packet);\n });\n\n this.client.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.client.on('close', () => {\n this.connected = false;\n this.emit('disconnected', {});\n });\n\n this.client.on('reconnect', () => {\n this.reconnectAttempts++;\n this.emit('reconnecting', { attempts: this.reconnectAttempts });\n });\n\n this.client.on('offline', () => {\n this.connected = false;\n this.emit('offline', {});\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the broker\n */\n async disconnect(): Promise<void> {\n return new Promise((resolve) => {\n if (this.client) {\n this.client.end(false, {}, () => {\n this.client = null;\n this.connected = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected && this.client?.connected === true;\n }\n\n /**\n * Subscribe to a topic\n */\n async subscribe(\n topic: string,\n options: { qos?: MqttQoS } = {}\n ): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.client!.subscribe(topic, { qos: options.qos ?? 0 }, (error, granted) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true, data: granted });\n }\n });\n });\n }\n\n /**\n * Unsubscribe from a topic\n */\n async unsubscribe(topic: string): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.client!.unsubscribe(topic, {}, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Publish a message to a topic\n */\n async publish(\n topic: string,\n message: string | Buffer | Record<string, unknown>,\n options: { qos?: MqttQoS; retain?: boolean } = {}\n ): Promise<PipeResponse> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n const payload = typeof message === 'object' && !Buffer.isBuffer(message)\n ? JSON.stringify(message)\n : message;\n\n const publishOptions: IClientPublishOptions = {\n qos: options.qos ?? 0,\n retain: options.retain ?? false,\n };\n\n return new Promise((resolve) => {\n this.client!.publish(topic, payload, publishOptions, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Register a handler for a specific topic\n * Supports MQTT wildcards: + (single level), # (multi level)\n */\n on(topic: string, handler: MqttMessageHandler): void {\n if (topic.includes('+') || topic.includes('#')) {\n // Wildcard topic - store in wildcardHandlers\n const handlers = this.wildcardHandlers.get(topic) ?? [];\n handlers.push(handler);\n this.wildcardHandlers.set(topic, handlers);\n } else {\n // Exact topic\n const handlers = this.messageHandlers.get(topic) ?? [];\n handlers.push(handler);\n this.messageHandlers.set(topic, handlers);\n }\n }\n\n /**\n * Remove a handler\n */\n off(topic: string, handler: MqttMessageHandler): void {\n const map = topic.includes('+') || topic.includes('#')\n ? this.wildcardHandlers\n : this.messageHandlers;\n\n const handlers = map.get(topic) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit to handlers\n */\n private emit(event: string, data: unknown): void {\n const handlers = this.messageHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n const result = handler(event, data as Buffer, {});\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`MQTT async handler error for \"${event}\":`, error);\n });\n }\n } catch (error) {\n console.error(`MQTT handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(topic: string, payload: Buffer, packet: unknown): void {\n // Parse payload\n let parsedPayload: Buffer | string | Record<string, unknown> = payload;\n try {\n const str = payload.toString();\n parsedPayload = JSON.parse(str);\n } catch {\n parsedPayload = payload.toString();\n }\n\n // Call exact topic handlers\n const exactHandlers = this.messageHandlers.get(topic) ?? [];\n for (const handler of exactHandlers) {\n try {\n const result = handler(topic, parsedPayload, packet);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`MQTT async handler error for topic \"${topic}\":`, error);\n });\n }\n } catch (error) {\n console.error(`MQTT handler error for topic \"${topic}\":`, error);\n }\n }\n\n // Check wildcard handlers\n for (const [pattern, handlers] of this.wildcardHandlers) {\n if (this.topicMatches(pattern, topic)) {\n for (const handler of handlers) {\n try {\n const result = handler(topic, parsedPayload, packet);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`MQTT async wildcard handler error for pattern \"${pattern}\":`, error);\n });\n }\n } catch (error) {\n console.error(`MQTT wildcard handler error for pattern \"${pattern}\":`, error);\n }\n }\n }\n }\n\n // Emit to generic message handlers\n this.emit('message', { topic, payload: parsedPayload, packet });\n }\n\n /**\n * Check if a topic matches a pattern with MQTT wildcards\n */\n private topicMatches(pattern: string, topic: string): boolean {\n const patternParts = pattern.split('/');\n const topicParts = topic.split('/');\n\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n\n // Multi-level wildcard matches everything remaining\n if (patternPart === '#') {\n return true;\n }\n\n // Topic is shorter than pattern\n if (i >= topicParts.length) {\n return false;\n }\n\n // Single-level wildcard matches any single level\n if (patternPart === '+') {\n continue;\n }\n\n // Exact match required\n if (patternPart !== topicParts[i]) {\n return false;\n }\n }\n\n // Pattern and topic should be same length (unless # was used)\n return patternParts.length === topicParts.length;\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create an MQTT pipe\n */\nexport function createMqttPipe(options: MqttPipeOptions): MqttPipe {\n return new MqttPipe(options);\n}\n","/**\n * TCP pipe for raw socket communication\n */\n\nimport { Socket, createConnection, createServer, Server } from 'net';\nimport type { Pipe, PipeResponse, TcpPipeConfig } from '../types.js';\n\nexport interface TcpPipeOptions {\n name: string;\n config: TcpPipeConfig;\n}\n\nexport type TcpDataHandler = (data: Buffer | string) => void | Promise<void>;\nexport type TcpEventHandler = (data?: unknown) => void | Promise<void>;\n\nexport class TcpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'tcp';\n private socket: Socket | null = null;\n private server: Server | null = null;\n private config: TcpPipeConfig;\n private connected = false;\n private reconnectAttempts = 0;\n private reconnecting = false;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private dataHandlers: TcpDataHandler[] = [];\n private eventHandlers: Map<string, TcpEventHandler[]> = new Map();\n\n constructor(options: TcpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to a TCP server (client mode)\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = createConnection({\n host: this.config.host,\n port: this.config.port,\n });\n\n this.socket.setEncoding(this.config.encoding ?? 'utf8');\n\n this.socket.on('connect', () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n this.emit('connected');\n resolve();\n });\n\n this.socket.on('data', (data) => {\n this.handleData(data);\n });\n\n this.socket.on('close', () => {\n this.connected = false;\n this.emit('disconnected');\n this.handleDisconnect();\n });\n\n this.socket.on('error', (error) => {\n if (!this.connected) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.socket.on('end', () => {\n this.connected = false;\n this.emit('end');\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Start a TCP server (server mode)\n */\n async listen(port?: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.server = createServer((socket) => {\n socket.setEncoding(this.config.encoding ?? 'utf8');\n\n socket.on('data', (data) => {\n this.handleData(data);\n });\n\n socket.on('error', (error) => {\n this.emit('client_error', error);\n });\n\n this.emit('connection', socket);\n });\n\n this.server.on('error', (error) => {\n reject(error);\n });\n\n this.server.listen(port ?? this.config.port, () => {\n this.connected = true;\n this.emit('listening');\n resolve();\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect / close\n */\n async disconnect(): Promise<void> {\n this.reconnecting = false;\n\n // Clear any pending reconnect timer to prevent memory leaks\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n return new Promise((resolve) => {\n if (this.socket) {\n this.socket.end(() => {\n this.socket?.destroy();\n this.socket = null;\n this.connected = false;\n resolve();\n });\n } else if (this.server) {\n this.server.close(() => {\n this.server = null;\n this.connected = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Send data\n */\n async send(data: Buffer | string): Promise<PipeResponse> {\n if (!this.socket || !this.connected) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n this.socket!.write(data, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Send and wait for response (request-response pattern)\n */\n async request<T = string>(\n data: Buffer | string,\n options: { timeout?: number } = {}\n ): Promise<PipeResponse<T>> {\n const { timeout = 30000 } = options;\n\n if (!this.socket || !this.connected) {\n return { success: false, error: 'Not connected' };\n }\n\n return new Promise((resolve) => {\n let resolved = false;\n\n const cleanup = () => {\n this.offData(handler);\n };\n\n const timer = setTimeout(() => {\n if (resolved) return;\n resolved = true;\n cleanup();\n resolve({ success: false, error: 'Request timeout' });\n }, timeout);\n\n const handler = (response: Buffer | string) => {\n if (resolved) return;\n resolved = true;\n clearTimeout(timer);\n cleanup();\n resolve({ success: true, data: response as T });\n };\n\n this.onData(handler);\n this.send(data);\n });\n }\n\n /**\n * Register a data handler\n */\n onData(handler: TcpDataHandler): void {\n this.dataHandlers.push(handler);\n }\n\n /**\n * Remove a data handler\n */\n offData(handler: TcpDataHandler): void {\n const index = this.dataHandlers.indexOf(handler);\n if (index !== -1) {\n this.dataHandlers.splice(index, 1);\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: string, handler: TcpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: string, handler: TcpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n const result = handler(data);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`TCP async handler error for \"${event}\":`, error);\n });\n }\n } catch (error) {\n console.error(`TCP handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming data\n */\n private handleData(data: Buffer | string): void {\n for (const handler of this.dataHandlers) {\n try {\n const result = handler(data);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error('TCP async data handler error:', error);\n });\n }\n } catch (error) {\n console.error('TCP data handler error:', error);\n }\n }\n this.emit('data', data);\n }\n\n /**\n * Handle disconnection with reconnect logic\n */\n private handleDisconnect(): void {\n if (!this.config.reconnect?.enabled || this.reconnecting) {\n return;\n }\n\n const maxAttempts = this.config.reconnect.max_attempts ?? 10;\n const delay = this.parseDuration(this.config.reconnect.delay ?? '5s');\n\n if (this.reconnectAttempts >= maxAttempts) {\n this.emit('reconnect_failed', { attempts: this.reconnectAttempts });\n return;\n }\n\n this.reconnecting = true;\n this.reconnectAttempts++;\n\n // Track the timer so it can be cleared on disconnect\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect()\n .then(() => {\n this.emit('reconnected', { attempts: this.reconnectAttempts });\n })\n .catch(() => {\n this.reconnecting = false;\n this.handleDisconnect();\n });\n }, delay);\n }\n\n /**\n * Parse duration string to milliseconds\n */\n private parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 5000;\n\n const value = parseInt(match[1]!, 10);\n const unit = match[2] ?? 's';\n\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n default:\n return value * 1000;\n }\n }\n}\n\n/**\n * Create a TCP pipe\n */\nexport function createTcpPipe(options: TcpPipeOptions): TcpPipe {\n return new TcpPipe(options);\n}\n\n// Re-export UDP pipe\nexport * from './udp.js';\n","/**\n * UDP pipe for datagram communication\n */\n\nimport { createSocket, Socket, RemoteInfo } from 'dgram';\nimport type { Pipe, PipeResponse, UdpPipeConfig } from '../types.js';\n\nexport interface UdpPipeOptions {\n name: string;\n config: UdpPipeConfig;\n}\n\nexport interface UdpMessage {\n data: Buffer;\n rinfo: RemoteInfo;\n}\n\nexport type UdpMessageHandler = (msg: UdpMessage) => void | Promise<void>;\nexport type UdpEventHandler = (data?: unknown) => void | Promise<void>;\n\nexport class UdpPipe implements Pipe {\n public readonly name: string;\n public readonly type = 'udp';\n private socket: Socket | null = null;\n private config: UdpPipeConfig;\n private bound = false;\n private messageHandlers: UdpMessageHandler[] = [];\n private eventHandlers: Map<string, UdpEventHandler[]> = new Map();\n\n constructor(options: UdpPipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Bind to a port to receive messages\n */\n async bind(port?: number): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n this.socket = createSocket('udp4');\n\n this.socket.on('message', (msg, rinfo) => {\n this.handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', (error) => {\n if (!this.bound) {\n reject(error);\n }\n this.emit('error', error);\n });\n\n this.socket.on('listening', () => {\n this.bound = true;\n const address = this.socket!.address();\n this.emit('listening', address);\n resolve();\n });\n\n // Setup broadcast if configured\n if (this.config.broadcast) {\n this.socket.setBroadcast(true);\n }\n\n // Bind to port\n const bindPort = port ?? this.config.port;\n const bindHost = this.config.host ?? '0.0.0.0';\n this.socket.bind(bindPort, bindHost, () => {\n // Join multicast group if configured\n if (this.config.multicast) {\n this.socket!.addMembership(this.config.multicast);\n }\n });\n\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Close the socket\n */\n async disconnect(): Promise<void> {\n return new Promise((resolve) => {\n if (this.socket) {\n this.socket.close(() => {\n this.socket = null;\n this.bound = false;\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n /**\n * Check if bound\n */\n isConnected(): boolean {\n return this.bound;\n }\n\n /**\n * Send data to a specific host and port\n */\n async send(\n data: Buffer | string,\n host: string,\n port: number\n ): Promise<PipeResponse> {\n if (!this.socket) {\n // Create socket if not exists (for send-only mode)\n this.socket = createSocket('udp4');\n if (this.config.broadcast) {\n this.socket.setBroadcast(true);\n }\n }\n\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n\n return new Promise((resolve) => {\n this.socket!.send(buffer, port, host, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Broadcast data to all hosts on the network\n */\n async broadcast(\n data: Buffer | string,\n port: number,\n address = '255.255.255.255'\n ): Promise<PipeResponse> {\n if (!this.socket) {\n this.socket = createSocket('udp4');\n this.socket.setBroadcast(true);\n }\n\n const buffer = typeof data === 'string' ? Buffer.from(data) : data;\n\n return new Promise((resolve) => {\n this.socket!.send(buffer, port, address, (error) => {\n if (error) {\n resolve({ success: false, error: error.message });\n } else {\n resolve({ success: true });\n }\n });\n });\n }\n\n /**\n * Send to multicast group\n */\n async multicast(\n data: Buffer | string,\n port: number,\n group?: string\n ): Promise<PipeResponse> {\n const multicastGroup = group ?? this.config.multicast;\n if (!multicastGroup) {\n return { success: false, error: 'No multicast group configured' };\n }\n\n return this.send(data, multicastGroup, port);\n }\n\n /**\n * Register a message handler\n */\n onMessage(handler: UdpMessageHandler): void {\n this.messageHandlers.push(handler);\n }\n\n /**\n * Remove a message handler\n */\n offMessage(handler: UdpMessageHandler): void {\n const index = this.messageHandlers.indexOf(handler);\n if (index !== -1) {\n this.messageHandlers.splice(index, 1);\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: string, handler: UdpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: string, handler: UdpEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n const result = handler(data);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error(`UDP async handler error for \"${event}\":`, error);\n });\n }\n } catch (error) {\n console.error(`UDP handler error for \"${event}\":`, error);\n }\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(data: Buffer, rinfo: RemoteInfo): void {\n const msg: UdpMessage = { data, rinfo };\n\n for (const handler of this.messageHandlers) {\n try {\n const result = handler(msg);\n // Handle async handlers properly\n if (result instanceof Promise) {\n result.catch((error) => {\n console.error('UDP async message handler error:', error);\n });\n }\n } catch (error) {\n console.error('UDP message handler error:', error);\n }\n }\n\n this.emit('message', msg);\n }\n}\n\n/**\n * Create a UDP pipe\n */\nexport function createUdpPipe(options: UdpPipeOptions): UdpPipe {\n return new UdpPipe(options);\n}\n","/**\n * Database pipe for reactive database operations\n */\n\nimport type {\n Pipe,\n PipeResponse,\n DatabasePipeConfig,\n DatabaseEvent,\n DatabaseEventType,\n} from '../types.js';\n\n// Pool type for pg (dynamically imported at runtime)\ntype PgPool = {\n query: (sql: string, params?: unknown[]) => Promise<{ rows: unknown[]; rowCount: number | null }>;\n end: () => Promise<void>;\n};\n\nexport interface DatabasePipeOptions {\n name: string;\n config: DatabasePipeConfig;\n}\n\n/**\n * Escape a SQL identifier (table/column name) to prevent SQL injection\n */\nfunction escapeIdentifier(name: string): string {\n // Validate identifier - only allow alphanumeric and underscores\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid SQL identifier: ${name}`);\n }\n return `\"${name}\"`;\n}\n\nexport type DatabaseEventHandler = (event: DatabaseEvent) => void | Promise<void>;\n\nexport class DatabasePipe implements Pipe {\n public readonly name: string;\n public readonly type = 'database';\n private config: DatabasePipeConfig;\n private connected = false;\n private db: any = null;\n private eventHandlers: Map<string, DatabaseEventHandler[]> = new Map();\n\n constructor(options: DatabasePipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Connect to the database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n if (this.config.adapter === 'sqlite') {\n // Dynamic import to avoid bundling issues\n const BetterSqlite3 = (await import('better-sqlite3')).default;\n const connectionString =\n typeof this.config.connection === 'string'\n ? this.config.connection\n : ':memory:';\n this.db = new BetterSqlite3(connectionString);\n } else if (this.config.adapter === 'postgres') {\n // Dynamic import to avoid bundling issues - use Function constructor to hide from TS\n const pgModuleName = 'pg';\n const pg = await (new Function('m', 'return import(m)')(pgModuleName) as Promise<{ Pool: new (config?: unknown) => PgPool }>).catch(() => null);\n if (!pg) {\n throw new Error('PostgreSQL adapter requires the \"pg\" package. Install it with: npm install pg');\n }\n const { Pool } = pg;\n const connectionString =\n typeof this.config.connection === 'string'\n ? this.config.connection\n : undefined;\n const connectionOptions =\n typeof this.config.connection === 'object'\n ? this.config.connection\n : undefined;\n this.db = new PostgresWrapper(\n connectionString\n ? new Pool({ connectionString })\n : new Pool(connectionOptions)\n );\n } else if (this.config.adapter === 'memory') {\n // In-memory storage using a simple object\n this.db = new MemoryDatabase();\n } else {\n throw new Error(`Unsupported adapter: ${this.config.adapter}`);\n }\n\n this.connected = true;\n this.emit('connected', {\n type: 'insert',\n table: '',\n data: {},\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to connect to database: ${message}`);\n }\n }\n\n /**\n * Disconnect from the database\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n try {\n if (this.config.adapter === 'sqlite' && this.db) {\n this.db.close();\n } else if (this.config.adapter === 'postgres' && this.db) {\n await this.db.close();\n }\n this.db = null;\n this.connected = false;\n this.emit('disconnected', {\n type: 'delete',\n table: '',\n data: {},\n });\n } catch {\n // Ignore close errors\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Execute a raw SQL query\n */\n async query<T = Record<string, unknown>[]>(\n sql: string,\n params: unknown[] = []\n ): Promise<PipeResponse<T>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n // Check if it's a SELECT query\n if (sql.trim().toUpperCase().startsWith('SELECT')) {\n const rows = stmt.all(...params);\n return { success: true, data: rows as T };\n } else {\n const result = stmt.run(...params);\n return { success: true, data: result as T };\n }\n } else if (this.config.adapter === 'postgres') {\n const result = await this.db.query(sql, params);\n return { success: true, data: result as T };\n } else if (this.config.adapter === 'memory') {\n const result = this.db.query(sql, params);\n return { success: true, data: result as T };\n }\n\n return { success: false, error: 'Unsupported adapter' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Insert a row into a table\n */\n async insert(\n table: string,\n data: Record<string, unknown>\n ): Promise<PipeResponse<{ lastInsertRowid?: number | bigint }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const columns = Object.keys(data);\n const values = Object.values(data);\n const placeholders = columns.map(() => '?').join(', ');\n const escapedTable = escapeIdentifier(table);\n const escapedColumns = columns.map(c => escapeIdentifier(c)).join(', ');\n const sql = `INSERT INTO ${escapedTable} (${escapedColumns}) VALUES (${placeholders})`;\n\n let result: { lastInsertRowid?: number | bigint } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...values);\n } else if (this.config.adapter === 'postgres') {\n result = await this.db.insert(table, data);\n } else if (this.config.adapter === 'memory') {\n result = this.db.insert(table, data);\n }\n\n // Emit insert event\n const event: DatabaseEvent = {\n type: 'insert',\n table,\n data,\n };\n this.emit('insert', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Update rows in a table\n */\n async update(\n table: string,\n where: Record<string, unknown>,\n data: Record<string, unknown>\n ): Promise<PipeResponse<{ changes?: number }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const escapedTable = escapeIdentifier(table);\n const setClauses = Object.keys(data)\n .map((key) => `${escapeIdentifier(key)} = ?`)\n .join(', ');\n const whereClauses = Object.keys(where)\n .map((key) => `${escapeIdentifier(key)} = ?`)\n .join(' AND ');\n const sql = `UPDATE ${escapedTable} SET ${setClauses} WHERE ${whereClauses}`;\n const params = [...Object.values(data), ...Object.values(where)];\n\n let result: { changes?: number } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...params);\n } else if (this.config.adapter === 'postgres') {\n result = await this.db.update(table, where, data);\n } else if (this.config.adapter === 'memory') {\n result = this.db.update(table, where, data);\n }\n\n // Emit update event\n const event: DatabaseEvent = {\n type: 'update',\n table,\n data,\n oldData: where,\n };\n this.emit('update', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Delete rows from a table\n */\n async delete(\n table: string,\n where: Record<string, unknown>\n ): Promise<PipeResponse<{ changes?: number }>> {\n if (!this.isConnected()) {\n return { success: false, error: 'Not connected' };\n }\n\n try {\n const escapedTable = escapeIdentifier(table);\n const whereClauses = Object.keys(where)\n .map((key) => `${escapeIdentifier(key)} = ?`)\n .join(' AND ');\n const sql = `DELETE FROM ${escapedTable} WHERE ${whereClauses}`;\n const params = Object.values(where);\n\n let result: { changes?: number } = {};\n\n if (this.config.adapter === 'sqlite') {\n const stmt = this.db.prepare(sql);\n result = stmt.run(...params);\n } else if (this.config.adapter === 'postgres') {\n result = await this.db.delete(table, where);\n } else if (this.config.adapter === 'memory') {\n result = this.db.delete(table, where);\n }\n\n // Emit delete event\n const event: DatabaseEvent = {\n type: 'delete',\n table,\n data: where,\n };\n this.emit('delete', event);\n this.emit('change', event);\n\n return { success: true, data: result };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n /**\n * Register an event handler\n */\n on(event: DatabaseEventType | 'change' | 'connected' | 'disconnected', handler: DatabaseEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: DatabaseEventType | 'change' | 'connected' | 'disconnected', handler: DatabaseEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data: DatabaseEvent): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`Database handler error for \"${event}\":`, error);\n }\n }\n }\n}\n\n/**\n * Simple in-memory database for testing and development\n * Supports basic SQL operations: SELECT with WHERE, ORDER BY, LIMIT\n *\n * Limitations:\n * - No JOIN support\n * - No complex expressions in WHERE (only simple equality)\n * - No aggregate functions\n * - For production, use SQLite or PostgreSQL\n */\nclass MemoryDatabase {\n private tables: Map<string, Record<string, unknown>[]> = new Map();\n private autoIncrements: Map<string, number> = new Map();\n\n query(sql: string, params: unknown[]): Record<string, unknown>[] {\n // Parse SELECT queries with basic WHERE, ORDER BY, LIMIT support\n const selectMatch = sql.match(\n /SELECT\\s+(\\*|[\\w,\\s]+)\\s+FROM\\s+[\"']?(\\w+)[\"']?(?:\\s+WHERE\\s+(.+?))?(?:\\s+ORDER\\s+BY\\s+([\\w\\s,]+?)(?:\\s+(ASC|DESC))?)?(?:\\s+LIMIT\\s+(\\d+))?(?:\\s+OFFSET\\s+(\\d+))?$/i\n );\n\n if (selectMatch) {\n const [, columns, table, whereClause, orderBy, orderDir, limitStr, offsetStr] = selectMatch;\n let rows = [...(this.tables.get(table!) ?? [])];\n\n // Apply WHERE clause\n if (whereClause) {\n const where = this.parseWhereClause(whereClause, params);\n rows = rows.filter((row) => this.matchesWhere(row, where));\n }\n\n // Apply ORDER BY\n if (orderBy) {\n const col = orderBy.trim();\n const direction = orderDir?.toUpperCase() === 'DESC' ? -1 : 1;\n rows.sort((a, b) => {\n const aVal = a[col];\n const bVal = b[col];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return direction;\n if (bVal === null || bVal === undefined) return -direction;\n return (aVal < bVal ? -1 : 1) * direction;\n });\n }\n\n // Apply OFFSET\n if (offsetStr) {\n const offset = parseInt(offsetStr, 10);\n rows = rows.slice(offset);\n }\n\n // Apply LIMIT\n if (limitStr) {\n const limit = parseInt(limitStr, 10);\n rows = rows.slice(0, limit);\n }\n\n // Select specific columns if not *\n if (columns !== '*') {\n const cols = columns!.split(',').map((c) => c.trim());\n rows = rows.map((row) => {\n const result: Record<string, unknown> = {};\n for (const col of cols) {\n result[col] = row[col];\n }\n return result;\n });\n }\n\n return rows;\n }\n\n // Fallback for unsupported queries\n console.warn(`MemoryDatabase: Unsupported query: ${sql}`);\n return [];\n }\n\n /**\n * Parse a simple WHERE clause into key-value pairs\n * Supports: col = ? AND col2 = ?\n */\n private parseWhereClause(\n whereClause: string,\n params: unknown[]\n ): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n let paramIndex = 0;\n\n // Split by AND (case insensitive)\n const conditions = whereClause.split(/\\s+AND\\s+/i);\n\n for (const condition of conditions) {\n // Match: column = ? or \"column\" = ?\n const match = condition.match(/[\"']?(\\w+)[\"']?\\s*=\\s*\\?/);\n if (match) {\n where[match[1]!] = params[paramIndex++];\n }\n }\n\n return where;\n }\n\n insert(table: string, data: Record<string, unknown>): { lastInsertRowid: number } {\n if (!this.tables.has(table)) {\n this.tables.set(table, []);\n }\n\n const id = (this.autoIncrements.get(table) ?? 0) + 1;\n this.autoIncrements.set(table, id);\n\n const row = { id, ...data };\n this.tables.get(table)!.push(row);\n\n return { lastInsertRowid: id };\n }\n\n update(\n table: string,\n where: Record<string, unknown>,\n data: Record<string, unknown>\n ): { changes: number } {\n const rows = this.tables.get(table) ?? [];\n let changes = 0;\n\n for (const row of rows) {\n if (this.matchesWhere(row, where)) {\n Object.assign(row, data);\n changes++;\n }\n }\n\n return { changes };\n }\n\n delete(table: string, where: Record<string, unknown>): { changes: number } {\n const rows = this.tables.get(table) ?? [];\n const initialLength = rows.length;\n\n const remaining = rows.filter((row) => !this.matchesWhere(row, where));\n this.tables.set(table, remaining);\n\n return { changes: initialLength - remaining.length };\n }\n\n private matchesWhere(\n row: Record<string, unknown>,\n where: Record<string, unknown>\n ): boolean {\n for (const [key, value] of Object.entries(where)) {\n if (row[key] !== value) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * PostgreSQL wrapper for consistent interface with other adapters\n */\nclass PostgresWrapper {\n private pool: PgPool;\n\n constructor(pool: PgPool) {\n this.pool = pool;\n }\n\n async query(sql: string, params: unknown[]): Promise<Record<string, unknown>[]> {\n // Convert ? placeholders to $1, $2, etc for pg\n let paramIndex = 0;\n const pgSql = sql.replace(/\\?/g, () => `$${++paramIndex}`);\n const result = await this.pool.query(pgSql, params);\n return result.rows as Record<string, unknown>[];\n }\n\n async insert(\n table: string,\n data: Record<string, unknown>\n ): Promise<{ lastInsertRowid?: number }> {\n const columns = Object.keys(data);\n const values = Object.values(data);\n const placeholders = columns.map((_, i) => `$${i + 1}`).join(', ');\n const escapedTable = escapeIdentifier(table);\n const escapedColumns = columns.map(c => escapeIdentifier(c)).join(', ');\n\n const result = await this.pool.query(\n `INSERT INTO ${escapedTable} (${escapedColumns}) VALUES (${placeholders}) RETURNING id`,\n values\n );\n\n const row = result.rows[0] as Record<string, unknown> | undefined;\n return { lastInsertRowid: row?.id as number | undefined };\n }\n\n async update(\n table: string,\n where: Record<string, unknown>,\n data: Record<string, unknown>\n ): Promise<{ changes: number }> {\n const escapedTable = escapeIdentifier(table);\n const setClauses = Object.keys(data)\n .map((key, i) => `${escapeIdentifier(key)} = $${i + 1}`)\n .join(', ');\n const whereClauses = Object.keys(where)\n .map((key, i) => `${escapeIdentifier(key)} = $${Object.keys(data).length + i + 1}`)\n .join(' AND ');\n\n const params = [...Object.values(data), ...Object.values(where)];\n const result = await this.pool.query(\n `UPDATE ${escapedTable} SET ${setClauses} WHERE ${whereClauses}`,\n params\n );\n\n return { changes: result.rowCount ?? 0 };\n }\n\n async delete(\n table: string,\n where: Record<string, unknown>\n ): Promise<{ changes: number }> {\n const escapedTable = escapeIdentifier(table);\n const whereClauses = Object.keys(where)\n .map((key, i) => `${escapeIdentifier(key)} = $${i + 1}`)\n .join(' AND ');\n\n const result = await this.pool.query(\n `DELETE FROM ${escapedTable} WHERE ${whereClauses}`,\n Object.values(where)\n );\n\n return { changes: result.rowCount ?? 0 };\n }\n\n async close(): Promise<void> {\n await this.pool.end();\n }\n}\n\n/**\n * Create a database pipe\n */\nexport function createDatabasePipe(options: DatabasePipeOptions): DatabasePipe {\n return new DatabasePipe(options);\n}\n","/**\n * File pipe for file system watching\n */\n\nimport chokidar, { FSWatcher } from 'chokidar';\nimport type { Pipe, PipeResponse, FilePipeConfig, FileEvent, FileEventType } from '../types.js';\n\nexport interface FilePipeOptions {\n name: string;\n config: FilePipeConfig;\n}\n\nexport type FileEventHandler = (event: FileEvent) => void | Promise<void>;\n\nexport class FilePipe implements Pipe {\n public readonly name: string;\n public readonly type = 'file';\n private watcher: FSWatcher | null = null;\n private config: FilePipeConfig;\n private watching = false;\n private eventHandlers: Map<string, FileEventHandler[]> = new Map();\n\n constructor(options: FilePipeOptions) {\n this.name = options.name;\n this.config = options.config;\n }\n\n /**\n * Start watching files (alias for connect)\n */\n async watch(): Promise<void> {\n return this.connect();\n }\n\n /**\n * Start watching files\n */\n async connect(): Promise<void> {\n if (this.watching) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n try {\n this.watcher = chokidar.watch(this.config.paths, {\n ignored: this.config.ignore,\n persistent: this.config.persistent ?? true,\n usePolling: this.config.usePolling ?? false,\n ignoreInitial: true,\n });\n\n this.watcher.on('ready', () => {\n this.watching = true;\n resolve();\n });\n\n this.watcher.on('error', (error) => {\n if (!this.watching) {\n reject(error);\n }\n this.emit('error', {\n type: 'change',\n path: '',\n });\n });\n\n // File events\n this.watcher.on('add', (path, stats) => {\n const event: FileEvent = {\n type: 'add',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n }\n : undefined,\n };\n this.emit('add', event);\n this.emit('all', event);\n });\n\n this.watcher.on('change', (path, stats) => {\n const event: FileEvent = {\n type: 'change',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: stats.isDirectory(),\n }\n : undefined,\n };\n this.emit('change', event);\n this.emit('all', event);\n });\n\n this.watcher.on('unlink', (path) => {\n const event: FileEvent = {\n type: 'unlink',\n path,\n };\n this.emit('unlink', event);\n this.emit('all', event);\n });\n\n // Directory events\n this.watcher.on('addDir', (path, stats) => {\n const event: FileEvent = {\n type: 'addDir',\n path,\n stats: stats\n ? {\n size: stats.size,\n mtime: stats.mtime,\n isDirectory: true,\n }\n : undefined,\n };\n this.emit('addDir', event);\n this.emit('all', event);\n });\n\n this.watcher.on('unlinkDir', (path) => {\n const event: FileEvent = {\n type: 'unlinkDir',\n path,\n };\n this.emit('unlinkDir', event);\n this.emit('all', event);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop watching files\n */\n async disconnect(): Promise<void> {\n if (!this.watcher) {\n return;\n }\n\n await this.watcher.close();\n this.watcher = null;\n this.watching = false;\n }\n\n /**\n * Check if watching\n */\n isConnected(): boolean {\n return this.watching;\n }\n\n /**\n * Add paths to watch\n */\n add(paths: string | string[]): void {\n if (this.watcher) {\n this.watcher.add(paths);\n }\n }\n\n /**\n * Stop watching specific paths\n */\n unwatch(paths: string | string[]): void {\n if (this.watcher) {\n this.watcher.unwatch(paths);\n }\n }\n\n /**\n * Get watched paths\n */\n getWatched(): Record<string, string[]> {\n if (this.watcher) {\n return this.watcher.getWatched();\n }\n return {};\n }\n\n /**\n * Register an event handler\n */\n on(event: FileEventType | 'all' | 'error', handler: FileEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n handlers.push(handler);\n this.eventHandlers.set(event, handlers);\n }\n\n /**\n * Remove an event handler\n */\n off(event: FileEventType | 'all' | 'error', handler: FileEventHandler): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n const index = handlers.indexOf(handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n /**\n * Emit an event\n */\n private emit(event: string, data: FileEvent): void {\n const handlers = this.eventHandlers.get(event) ?? [];\n for (const handler of handlers) {\n try {\n handler(data);\n } catch (error) {\n console.error(`File handler error for \"${event}\":`, error);\n }\n }\n }\n}\n\n/**\n * Create a file pipe\n */\nexport function createFilePipe(options: FilePipeOptions): FilePipe {\n return new FilePipe(options);\n}\n"],"mappings":"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","names":[]}
@@ -184,7 +184,12 @@ var MqttPipe = class {
184
184
  const handlers = this.messageHandlers.get(event) ?? [];
185
185
  for (const handler of handlers) {
186
186
  try {
187
- handler(event, data, {});
187
+ const result = handler(event, data, {});
188
+ if (result instanceof Promise) {
189
+ result.catch((error) => {
190
+ console.error(`MQTT async handler error for "${event}":`, error);
191
+ });
192
+ }
188
193
  } catch (error) {
189
194
  console.error(`MQTT handler error for "${event}":`, error);
190
195
  }
@@ -204,7 +209,12 @@ var MqttPipe = class {
204
209
  const exactHandlers = this.messageHandlers.get(topic) ?? [];
205
210
  for (const handler of exactHandlers) {
206
211
  try {
207
- handler(topic, parsedPayload, packet);
212
+ const result = handler(topic, parsedPayload, packet);
213
+ if (result instanceof Promise) {
214
+ result.catch((error) => {
215
+ console.error(`MQTT async handler error for topic "${topic}":`, error);
216
+ });
217
+ }
208
218
  } catch (error) {
209
219
  console.error(`MQTT handler error for topic "${topic}":`, error);
210
220
  }
@@ -213,7 +223,12 @@ var MqttPipe = class {
213
223
  if (this.topicMatches(pattern, topic)) {
214
224
  for (const handler of handlers) {
215
225
  try {
216
- handler(topic, parsedPayload, packet);
226
+ const result = handler(topic, parsedPayload, packet);
227
+ if (result instanceof Promise) {
228
+ result.catch((error) => {
229
+ console.error(`MQTT async wildcard handler error for pattern "${pattern}":`, error);
230
+ });
231
+ }
217
232
  } catch (error) {
218
233
  console.error(`MQTT wildcard handler error for pattern "${pattern}":`, error);
219
234
  }