@hardwarebridge/client 1.0.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.
@@ -0,0 +1,448 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.HardwareBridgeClient = {}));
5
+ })(this, (function (exports) { 'use strict';
6
+
7
+ class WebSocketClient {
8
+ constructor(config, options = {}) {
9
+ this.ws = null;
10
+ this.connectionListeners = [];
11
+ this.messageListeners = [];
12
+ this.deviceEventListeners = [];
13
+ this.reconnectTimer = null;
14
+ this.pingTimer = null;
15
+ this.messageId = 0;
16
+ this.pendingRequests = new Map();
17
+ this.config = config;
18
+ this.options = {
19
+ autoReconnect: true,
20
+ reconnectInterval: 5000,
21
+ maxReconnectAttempts: 10,
22
+ timeout: 30000,
23
+ debug: false,
24
+ protocols: ['jsonrpc-2.0'],
25
+ ...options
26
+ };
27
+ this.connectionState = {
28
+ connected: false,
29
+ connecting: false,
30
+ reconnectAttempts: 0
31
+ };
32
+ }
33
+ onConnectionStateChange(listener) {
34
+ this.connectionListeners.push(listener);
35
+ }
36
+ onMessage(listener) {
37
+ this.messageListeners.push(listener);
38
+ }
39
+ onDeviceEvent(listener) {
40
+ this.deviceEventListeners.push(listener);
41
+ }
42
+ get isConnected() {
43
+ return this.connectionState.connected;
44
+ }
45
+ get isConnecting() {
46
+ return this.connectionState.connecting;
47
+ }
48
+ getConnectionStatus() {
49
+ if (this.connectionState.connecting)
50
+ return 'connecting';
51
+ if (this.connectionState.connected)
52
+ return 'connected';
53
+ if (this.connectionState.reconnectAttempts > 0)
54
+ return 'reconnecting';
55
+ return 'disconnected';
56
+ }
57
+ async connect() {
58
+ if (this.isConnected || this.isConnecting) {
59
+ return;
60
+ }
61
+ this.updateConnectionState({ connecting: true });
62
+ try {
63
+ await this.createWebSocket();
64
+ this.updateConnectionState({
65
+ connected: true,
66
+ connecting: false,
67
+ reconnectAttempts: 0,
68
+ lastConnectionTime: new Date()
69
+ });
70
+ this.startPingTimer();
71
+ this.log('Connected to WebSocket server');
72
+ }
73
+ catch (error) {
74
+ this.updateConnectionState({ connecting: false, error: error.message });
75
+ this.log('Failed to connect to WebSocket server', error);
76
+ if (this.options.autoReconnect) {
77
+ this.scheduleReconnect();
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ disconnect() {
83
+ this.log('Disconnecting from WebSocket server');
84
+ this.cleanup();
85
+ if (this.ws) {
86
+ this.ws.close(1000, 'Client disconnect');
87
+ this.ws = null;
88
+ }
89
+ this.updateConnectionState({
90
+ connected: false,
91
+ connecting: false,
92
+ error: undefined
93
+ });
94
+ }
95
+ async sendRequest(method, params) {
96
+ if (!this.isConnected) {
97
+ throw new Error('WebSocket client is not connected');
98
+ }
99
+ const id = ++this.messageId;
100
+ const request = {
101
+ jsonrpc: '2.0',
102
+ method,
103
+ params,
104
+ id
105
+ };
106
+ return new Promise((resolve, reject) => {
107
+ const timeout = setTimeout(() => {
108
+ this.pendingRequests.delete(id);
109
+ reject(new Error(`Request timeout: ${method}`));
110
+ }, this.options.timeout);
111
+ this.pendingRequests.set(id, { resolve, reject, timeout });
112
+ try {
113
+ this.sendMessage(request);
114
+ }
115
+ catch (error) {
116
+ clearTimeout(timeout);
117
+ this.pendingRequests.delete(id);
118
+ reject(error);
119
+ }
120
+ });
121
+ }
122
+ sendNotification(method, params) {
123
+ if (!this.isConnected) {
124
+ throw new Error('WebSocket client is not connected');
125
+ }
126
+ const notification = {
127
+ jsonrpc: '2.0',
128
+ method,
129
+ params
130
+ };
131
+ this.sendMessage(notification);
132
+ }
133
+ async createWebSocket() {
134
+ return new Promise((resolve, reject) => {
135
+ try {
136
+ const protocols = this.options.protocols || [];
137
+ const ws = new WebSocket(this.config.url, protocols);
138
+ ws.onopen = () => {
139
+ this.log('WebSocket connection opened');
140
+ resolve();
141
+ };
142
+ ws.onclose = (event) => {
143
+ this.log(`WebSocket connection closed: ${event.code} ${event.reason}`);
144
+ this.handleDisconnect();
145
+ };
146
+ ws.onerror = (error) => {
147
+ this.log('WebSocket error', error);
148
+ reject(new Error('WebSocket connection failed'));
149
+ };
150
+ ws.onmessage = (event) => {
151
+ this.handleMessage(event.data);
152
+ };
153
+ this.ws = ws;
154
+ }
155
+ catch (error) {
156
+ reject(error);
157
+ }
158
+ });
159
+ }
160
+ handleMessage(data) {
161
+ try {
162
+ const message = JSON.parse(data);
163
+ if (message.jsonrpc !== '2.0') {
164
+ this.log('Invalid JSON-RPC message received', message);
165
+ return;
166
+ }
167
+ // Handle responses to requests
168
+ if (message.id !== undefined && message.id !== null) {
169
+ const pendingRequest = this.pendingRequests.get(message.id);
170
+ if (pendingRequest) {
171
+ clearTimeout(pendingRequest.timeout);
172
+ this.pendingRequests.delete(message.id);
173
+ if (message.error) {
174
+ pendingRequest.reject(new Error(`JSON-RPC Error ${message.error.code}: ${message.error.message}`));
175
+ }
176
+ else {
177
+ pendingRequest.resolve(message.result);
178
+ }
179
+ }
180
+ }
181
+ // Handle notifications and broadcast messages
182
+ if (message.id === undefined || message.id === null) {
183
+ // Notify message listeners
184
+ this.messageListeners.forEach(listener => listener(message));
185
+ // Handle device events (check if it's a notification with method and params)
186
+ const notification = message;
187
+ if (notification.method === 'device.event' && notification.params) {
188
+ const deviceEvent = notification.params;
189
+ this.deviceEventListeners.forEach(listener => listener(deviceEvent));
190
+ }
191
+ }
192
+ }
193
+ catch (error) {
194
+ this.log('Error parsing WebSocket message', error);
195
+ }
196
+ }
197
+ handleDisconnect() {
198
+ this.cleanup();
199
+ this.updateConnectionState({
200
+ connected: false,
201
+ connecting: false
202
+ });
203
+ if (this.options.autoReconnect) {
204
+ this.scheduleReconnect();
205
+ }
206
+ }
207
+ scheduleReconnect() {
208
+ if (this.reconnectTimer) {
209
+ return;
210
+ }
211
+ const currentState = this.connectionState;
212
+ if (currentState.reconnectAttempts >= (this.options.maxReconnectAttempts || 10)) {
213
+ this.log('Max reconnection attempts reached');
214
+ return;
215
+ }
216
+ const nextAttempt = currentState.reconnectAttempts + 1;
217
+ this.log(`Scheduling reconnection attempt ${nextAttempt}`);
218
+ this.reconnectTimer = setTimeout(() => {
219
+ this.reconnectTimer = null;
220
+ this.updateConnectionState({ reconnectAttempts: nextAttempt });
221
+ this.connect().catch(() => {
222
+ // Reconnection failed, will be handled by scheduleReconnect
223
+ });
224
+ }, this.options.reconnectInterval);
225
+ }
226
+ startPingTimer() {
227
+ if (this.pingTimer) {
228
+ return;
229
+ }
230
+ // Send ping every 30 seconds to keep connection alive
231
+ this.pingTimer = setInterval(() => {
232
+ if (this.isConnected) {
233
+ try {
234
+ this.sendNotification('ping');
235
+ }
236
+ catch (error) {
237
+ this.log('Ping failed', error);
238
+ }
239
+ }
240
+ }, 30000);
241
+ }
242
+ cleanup() {
243
+ // Clear timers
244
+ if (this.reconnectTimer) {
245
+ clearTimeout(this.reconnectTimer);
246
+ this.reconnectTimer = null;
247
+ }
248
+ if (this.pingTimer) {
249
+ clearInterval(this.pingTimer);
250
+ this.pingTimer = null;
251
+ }
252
+ // Clear pending requests
253
+ for (const request of this.pendingRequests.values()) {
254
+ clearTimeout(request.timeout);
255
+ request.reject(new Error('Connection closed'));
256
+ }
257
+ this.pendingRequests.clear();
258
+ }
259
+ sendMessage(message) {
260
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
261
+ throw new Error('WebSocket is not open');
262
+ }
263
+ const data = JSON.stringify(message);
264
+ this.ws.send(data);
265
+ this.log(`Sent message: ${message.method}`);
266
+ }
267
+ updateConnectionState(updates) {
268
+ this.connectionState = { ...this.connectionState, ...updates };
269
+ this.connectionListeners.forEach(listener => listener(this.connectionState));
270
+ }
271
+ log(message, data) {
272
+ if (this.options.debug) {
273
+ console.log(`[HardwareBridge] ${message}`, data);
274
+ }
275
+ }
276
+ dispose() {
277
+ this.log('Disposing WebSocket client');
278
+ this.disconnect();
279
+ this.connectionListeners = [];
280
+ this.messageListeners = [];
281
+ this.deviceEventListeners = [];
282
+ }
283
+ }
284
+
285
+ class HardwareBridgeClient {
286
+ constructor(config, options = {}) {
287
+ this.options = {
288
+ autoReconnect: true,
289
+ reconnectInterval: 5000,
290
+ maxReconnectAttempts: 10,
291
+ timeout: 30000,
292
+ debug: false,
293
+ ...options
294
+ };
295
+ this.wsClient = new WebSocketClient(config, this.options);
296
+ this.setupEventHandlers();
297
+ }
298
+ setupEventHandlers() {
299
+ // Forward device events
300
+ this.wsClient.onDeviceEvent((event) => {
301
+ this.onDeviceEvent(event);
302
+ });
303
+ }
304
+ // Connection Management
305
+ async connect() {
306
+ return this.wsClient.connect();
307
+ }
308
+ disconnect() {
309
+ this.wsClient.disconnect();
310
+ }
311
+ get isConnected() {
312
+ return this.wsClient.isConnected;
313
+ }
314
+ get isConnecting() {
315
+ return this.wsClient.isConnecting;
316
+ }
317
+ getConnectionStatus() {
318
+ return this.wsClient.getConnectionStatus();
319
+ }
320
+ onConnectionStateChange(listener) {
321
+ this.wsClient.onConnectionStateChange((state) => {
322
+ listener(state.connected);
323
+ });
324
+ }
325
+ // Device Discovery
326
+ async enumerateDevices() {
327
+ const result = await this.wsClient.sendRequest('devices.enumerate');
328
+ return result.devices;
329
+ }
330
+ async getDevice(deviceId) {
331
+ return this.wsClient.sendRequest('devices.get', { deviceId });
332
+ }
333
+ async watchDevices() {
334
+ return this.wsClient.sendRequest('devices.watch');
335
+ }
336
+ async unwatchDevices() {
337
+ return this.wsClient.sendRequest('devices.unwatch');
338
+ }
339
+ // Printer Operations
340
+ async print(deviceId, data, format = 'raw') {
341
+ return this.wsClient.sendRequest('printer.print', {
342
+ deviceId,
343
+ data,
344
+ format
345
+ });
346
+ }
347
+ async getPrinterStatus(deviceId) {
348
+ return this.wsClient.sendRequest('printer.getStatus', { deviceId });
349
+ }
350
+ async getPrinterCapabilities(deviceId) {
351
+ return this.wsClient.sendRequest('printer.getCapabilities', { deviceId });
352
+ }
353
+ // Serial Port Operations
354
+ async openSerialPort(deviceId, config) {
355
+ return this.wsClient.sendRequest('serial.open', {
356
+ deviceId,
357
+ ...config
358
+ });
359
+ }
360
+ async closeSerialPort(deviceId) {
361
+ return this.wsClient.sendRequest('serial.close', { deviceId });
362
+ }
363
+ async sendSerialData(deviceId, data) {
364
+ return this.wsClient.sendRequest('serial.send', { deviceId, data });
365
+ }
366
+ async receiveSerialData(deviceId, maxBytes = 1024, timeout = 10000) {
367
+ return this.wsClient.sendRequest('serial.receive', { deviceId, maxBytes, timeout });
368
+ }
369
+ async getSerialPortStatus(deviceId) {
370
+ return this.wsClient.sendRequest('serial.getStatus', { deviceId });
371
+ }
372
+ // USB HID Operations
373
+ async openUsbDevice(deviceId) {
374
+ return this.wsClient.sendRequest('usb.open', { deviceId });
375
+ }
376
+ async closeUsbDevice(deviceId) {
377
+ return this.wsClient.sendRequest('usb.close', { deviceId });
378
+ }
379
+ async sendUsbReport(deviceId, reportId, data) {
380
+ return this.wsClient.sendRequest('usb.sendReport', { deviceId, reportId, data });
381
+ }
382
+ async receiveUsbReport(deviceId, reportId, timeout = 5000) {
383
+ return this.wsClient.sendRequest('usb.receiveReport', { deviceId, reportId, timeout });
384
+ }
385
+ async getUsbDeviceStatus(deviceId) {
386
+ return this.wsClient.sendRequest('usb.getStatus', { deviceId });
387
+ }
388
+ // Queue Management
389
+ async getQueueStatus() {
390
+ return this.wsClient.sendRequest('queue.getStatus');
391
+ }
392
+ async getQueueJobs(deviceId, status, limit = 100) {
393
+ return this.wsClient.sendRequest('queue.getJobs', { deviceId, status, limit });
394
+ }
395
+ async cancelQueueJob(jobId) {
396
+ return this.wsClient.sendRequest('queue.cancelJob', { jobId });
397
+ }
398
+ // System Information
399
+ async getSystemInfo() {
400
+ return this.wsClient.sendRequest('system.getInfo');
401
+ }
402
+ async getSystemHealth() {
403
+ return this.wsClient.sendRequest('system.getHealth');
404
+ }
405
+ // Event Handlers
406
+ onDeviceEvent(event) {
407
+ // This can be overridden by subclasses or used to emit events
408
+ console.log('Device event:', event);
409
+ }
410
+ // Utility Methods
411
+ async waitForConnection(timeout = 30000) {
412
+ return new Promise((resolve, reject) => {
413
+ if (this.isConnected) {
414
+ resolve();
415
+ return;
416
+ }
417
+ const timeoutId = setTimeout(() => {
418
+ reject(new Error('Connection timeout'));
419
+ }, timeout);
420
+ const checkConnection = () => {
421
+ if (this.isConnected) {
422
+ clearTimeout(timeoutId);
423
+ resolve();
424
+ }
425
+ else {
426
+ setTimeout(checkConnection, 100);
427
+ }
428
+ };
429
+ checkConnection();
430
+ });
431
+ }
432
+ dispose() {
433
+ this.wsClient.dispose();
434
+ }
435
+ }
436
+
437
+ // Core exports
438
+ // Version
439
+ const VERSION = '1.0.0';
440
+ // Default export
441
+ // Default export removed due to TypeScript compilation issues
442
+
443
+ exports.HardwareBridgeClient = HardwareBridgeClient;
444
+ exports.VERSION = VERSION;
445
+ exports.WebSocketClient = WebSocketClient;
446
+
447
+ }));
448
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/core/websocket-client.ts","../src/core/hardware-bridge-client.ts","../src/index.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@hardwarebridge/client",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript client library for Hardware Bridge WebSocket service",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.esm.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.esm.js",
12
+ "require": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "src"
19
+ ],
20
+ "scripts": {
21
+ "build": "rollup -c",
22
+ "build:watch": "rollup -c -w",
23
+ "test": "NODE_OPTIONS='--experimental-vm-modules' jest",
24
+ "test:watch": "NODE_OPTIONS='--experimental-vm-modules' jest --watch",
25
+ "test:coverage": "NODE_OPTIONS='--experimental-vm-modules' jest --coverage",
26
+ "lint": "eslint src",
27
+ "lint:fix": "eslint src --fix",
28
+ "clean": "rimraf dist",
29
+ "prepublishOnly": "npm run clean && npm run build"
30
+ },
31
+ "keywords": [
32
+ "websocket",
33
+ "hardware",
34
+ "printer",
35
+ "serial",
36
+ "usb",
37
+ "hid",
38
+ "typescript",
39
+ "rxjs"
40
+ ],
41
+ "author": "Hardware Bridge Team",
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "rxjs": "^7.0.0",
45
+ "ws": "^8.18.0"
46
+ },
47
+ "devDependencies": {
48
+ "@eslint/js": "^9.39.2",
49
+ "@rollup/plugin-commonjs": "^28.0.2",
50
+ "@rollup/plugin-node-resolve": "^16.0.0",
51
+ "@rollup/plugin-typescript": "^12.1.2",
52
+ "@types/jest": "^29.5.14",
53
+ "@types/node": "^22.10.7",
54
+ "@types/ws": "^8.18.0",
55
+ "@typescript-eslint/eslint-plugin": "^8.21.0",
56
+ "@typescript-eslint/parser": "^8.21.0",
57
+ "eslint": "^9.18.0",
58
+ "jest": "^30.0.0",
59
+ "rimraf": "^6.0.1",
60
+ "rollup": "^4.32.0",
61
+ "rollup-plugin-dts": "^6.1.0",
62
+ "ts-jest": "^29.1.1",
63
+ "tslib": "^2.6.2",
64
+ "typescript": "^5.2.2",
65
+ "typescript-eslint": "^8.53.1"
66
+ },
67
+ "peerDependencies": {
68
+ "rxjs": "^7.0.0"
69
+ },
70
+ "repository": {
71
+ "type": "git",
72
+ "url": "https://github.com/hardwarebridge/client.git"
73
+ },
74
+ "bugs": {
75
+ "url": "https://github.com/hardwarebridge/client/issues"
76
+ },
77
+ "homepage": "https://github.com/hardwarebridge/client#readme"
78
+ }