@blokjs/trigger-websocket 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,22 @@
1
+ # @blokjs/trigger-websocket
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Initial public release of Blok packages.
8
+
9
+ This release includes:
10
+
11
+ - Core packages: @blokjs/shared, @blokjs/helper, @blokjs/runner
12
+ - Node packages: @blokjs/api-call, @blokjs/if-else, @blokjs/react
13
+ - Trigger packages: pubsub, queue, webhook, websocket, worker, cron, grpc
14
+ - CLI tool: blokctl
15
+ - Editor support: @blokjs/lsp-server, @blokjs/syntax
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies
20
+ - @blokjs/shared@0.2.0
21
+ - @blokjs/helper@0.2.0
22
+ - @blokjs/runner@0.2.0
@@ -0,0 +1,264 @@
1
+ /**
2
+ * WebSocketTrigger - Real-time bidirectional communication trigger
3
+ *
4
+ * Extends TriggerBase to handle WebSocket connections for:
5
+ * - Real-time messaging
6
+ * - Live updates and notifications
7
+ * - Collaborative features
8
+ * - Streaming data
9
+ *
10
+ * Features:
11
+ * - Connection management (connect, disconnect, reconnect)
12
+ * - Room/channel support for broadcasting
13
+ * - Message routing to workflows
14
+ * - Heartbeat/ping-pong for connection health
15
+ * - Authentication middleware
16
+ * - Binary message support
17
+ */
18
+ import type { HelperResponse, WebSocketTriggerOpts } from "@blok/helper";
19
+ import { DefaultLogger, type GlobalOptions, type BlokService, TriggerBase, type TriggerResponse } from "@blok/runner";
20
+ /**
21
+ * WebSocket message types
22
+ */
23
+ export type WebSocketMessageType = "text" | "binary" | "ping" | "pong";
24
+ /**
25
+ * WebSocket connection state
26
+ */
27
+ export type WebSocketState = "connecting" | "connected" | "disconnecting" | "disconnected";
28
+ /**
29
+ * WebSocket message structure
30
+ */
31
+ export interface WebSocketMessage {
32
+ /** Unique message ID */
33
+ id: string;
34
+ /** Message type */
35
+ type: WebSocketMessageType;
36
+ /** Event name (for routing) */
37
+ event: string;
38
+ /** Message payload */
39
+ data: unknown;
40
+ /** Timestamp */
41
+ timestamp: Date;
42
+ /** Raw message data */
43
+ raw?: Buffer | string;
44
+ }
45
+ /**
46
+ * WebSocket client connection
47
+ */
48
+ export interface WebSocketClient {
49
+ /** Unique client ID */
50
+ id: string;
51
+ /** Connection state */
52
+ state: WebSocketState;
53
+ /** Rooms/channels the client is subscribed to */
54
+ rooms: Set<string>;
55
+ /** Client metadata */
56
+ metadata: Record<string, unknown>;
57
+ /** Connection timestamp */
58
+ connectedAt: Date;
59
+ /** Last activity timestamp */
60
+ lastActivity: Date;
61
+ /** Send message to client */
62
+ send(data: string | Buffer): void;
63
+ /** Close connection */
64
+ close(code?: number, reason?: string): void;
65
+ /** Ping the client */
66
+ ping(): void;
67
+ }
68
+ /**
69
+ * WebSocket room/channel for broadcasting
70
+ */
71
+ export interface WebSocketRoom {
72
+ /** Room name */
73
+ name: string;
74
+ /** Clients in the room */
75
+ clients: Set<string>;
76
+ /** Room metadata */
77
+ metadata: Record<string, unknown>;
78
+ /** Created timestamp */
79
+ createdAt: Date;
80
+ }
81
+ /**
82
+ * WebSocket event types for lifecycle hooks
83
+ */
84
+ export type WebSocketEventType = "connection" | "message" | "close" | "error" | "ping" | "pong" | "join_room" | "leave_room";
85
+ /**
86
+ * WebSocket event for workflow triggering
87
+ */
88
+ export interface WebSocketEvent {
89
+ /** Event type */
90
+ type: WebSocketEventType;
91
+ /** Client ID */
92
+ clientId: string;
93
+ /** Message (for message events) */
94
+ message?: WebSocketMessage;
95
+ /** Room name (for room events) */
96
+ room?: string;
97
+ /** Error (for error events) */
98
+ error?: Error;
99
+ /** Close code (for close events) */
100
+ closeCode?: number;
101
+ /** Close reason (for close events) */
102
+ closeReason?: string;
103
+ }
104
+ /**
105
+ * Authentication result
106
+ */
107
+ export interface AuthResult {
108
+ authenticated: boolean;
109
+ clientId?: string;
110
+ metadata?: Record<string, unknown>;
111
+ error?: string;
112
+ }
113
+ /**
114
+ * Authentication handler function type
115
+ */
116
+ export type AuthHandler = (request: unknown, headers: Record<string, string>) => Promise<AuthResult> | AuthResult;
117
+ /**
118
+ * Workflow model with WebSocket trigger configuration
119
+ */
120
+ interface WebSocketWorkflowModel {
121
+ path: string;
122
+ config: {
123
+ name: string;
124
+ version: string;
125
+ trigger?: {
126
+ websocket?: WebSocketTriggerOpts;
127
+ [key: string]: unknown;
128
+ };
129
+ [key: string]: unknown;
130
+ };
131
+ }
132
+ /**
133
+ * WebSocketTrigger - Handle WebSocket connections and messages
134
+ */
135
+ export declare abstract class WebSocketTrigger extends TriggerBase {
136
+ protected nodeMap: GlobalOptions;
137
+ protected readonly tracer: import("@opentelemetry/api").Tracer;
138
+ protected readonly logger: DefaultLogger;
139
+ protected websocketWorkflows: WebSocketWorkflowModel[];
140
+ protected clients: Map<string, WebSocketClient>;
141
+ protected rooms: Map<string, WebSocketRoom>;
142
+ protected activeConnections: number;
143
+ protected totalMessages: number;
144
+ protected heartbeatInterval: NodeJS.Timeout | null;
145
+ protected heartbeatIntervalMs: number;
146
+ protected maxClients: number;
147
+ protected messageRateLimit: number;
148
+ protected abstract nodes: Record<string, BlokService<unknown>>;
149
+ protected abstract workflows: Record<string, HelperResponse>;
150
+ protected authHandler?: AuthHandler;
151
+ constructor();
152
+ /**
153
+ * Load nodes into the node map
154
+ */
155
+ loadNodes(): void;
156
+ /**
157
+ * Load workflows into the workflow map
158
+ */
159
+ loadWorkflows(): void;
160
+ /**
161
+ * Set authentication handler
162
+ */
163
+ setAuthHandler(handler: AuthHandler): void;
164
+ /**
165
+ * Initialize WebSocket trigger
166
+ */
167
+ listen(): Promise<number>;
168
+ /**
169
+ * Stop the WebSocket trigger
170
+ */
171
+ stop(): Promise<void>;
172
+ protected onHmrWorkflowChange(): Promise<void>;
173
+ /**
174
+ * Handle new WebSocket connection
175
+ */
176
+ handleConnection(socket: {
177
+ send: (data: string | Buffer) => void;
178
+ close: (code?: number, reason?: string) => void;
179
+ ping: () => void;
180
+ }, request: unknown, headers?: Record<string, string>): Promise<WebSocketClient | null>;
181
+ /**
182
+ * Handle WebSocket message
183
+ */
184
+ handleMessage(clientId: string, data: string | Buffer, isBinary: boolean): Promise<TriggerResponse | null>;
185
+ /**
186
+ * Handle WebSocket close
187
+ */
188
+ handleClose(clientId: string, code: number, reason: string): Promise<void>;
189
+ /**
190
+ * Handle WebSocket error
191
+ */
192
+ handleError(clientId: string, error: Error): Promise<void>;
193
+ /**
194
+ * Handle ping from client
195
+ */
196
+ handlePing(clientId: string): void;
197
+ /**
198
+ * Handle pong from client
199
+ */
200
+ handlePong(clientId: string): void;
201
+ /**
202
+ * Join a room/channel
203
+ */
204
+ joinRoom(clientId: string, roomName: string): Promise<boolean>;
205
+ /**
206
+ * Leave a room/channel
207
+ */
208
+ leaveRoom(clientId: string, roomName: string): Promise<boolean>;
209
+ /**
210
+ * Send message to a specific client
211
+ */
212
+ sendToClient(clientId: string, event: string, data: unknown): boolean;
213
+ /**
214
+ * Broadcast message to all clients in a room
215
+ */
216
+ broadcastToRoom(roomName: string, event: string, data: unknown, excludeClient?: string): number;
217
+ /**
218
+ * Broadcast message to all connected clients
219
+ */
220
+ broadcastToAll(event: string, data: unknown, excludeClient?: string): number;
221
+ /**
222
+ * Get client by ID
223
+ */
224
+ getClient(clientId: string): WebSocketClient | undefined;
225
+ /**
226
+ * Get all clients in a room
227
+ */
228
+ getClientsInRoom(roomName: string): WebSocketClient[];
229
+ /**
230
+ * Get connection stats
231
+ */
232
+ getStats(): {
233
+ activeConnections: number;
234
+ totalMessages: number;
235
+ roomCount: number;
236
+ clientsByRoom: Record<string, number>;
237
+ };
238
+ /**
239
+ * Get all workflows that have WebSocket triggers
240
+ */
241
+ protected getWebSocketWorkflows(): WebSocketWorkflowModel[];
242
+ /**
243
+ * Find workflow matching the WebSocket event
244
+ */
245
+ protected findMatchingWorkflow(event: WebSocketEvent): WebSocketWorkflowModel | null;
246
+ /**
247
+ * Trigger a workflow based on WebSocket event
248
+ */
249
+ protected triggerEvent(event: WebSocketEvent): Promise<TriggerResponse | null>;
250
+ /**
251
+ * Execute a workflow for a WebSocket event
252
+ */
253
+ protected executeWorkflow(event: WebSocketEvent, workflow: WebSocketWorkflowModel, _config: WebSocketTriggerOpts): Promise<TriggerResponse>;
254
+ /**
255
+ * Start heartbeat monitoring
256
+ */
257
+ protected startHeartbeat(): void;
258
+ /**
259
+ * Stop heartbeat monitoring
260
+ */
261
+ protected stopHeartbeat(): void;
262
+ }
263
+ export default WebSocketTrigger;
264
+ //# sourceMappingURL=WebSocketTrigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketTrigger.d.ts","sourceRoot":"","sources":["../src/WebSocketTrigger.ts"],"names":[],"mappings":"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"}