@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 +22 -0
- package/dist/WebSocketTrigger.d.ts +264 -0
- package/dist/WebSocketTrigger.d.ts.map +1 -0
- package/dist/WebSocketTrigger.js +626 -0
- package/dist/WebSocketTrigger.js.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
- package/src/WebSocketTrigger.test.ts +490 -0
- package/src/WebSocketTrigger.ts +869 -0
- package/src/WebSocketTriggerMonitoring.test.ts +371 -0
- package/src/index.ts +127 -0
- package/tsconfig.json +22 -0
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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"}
|