@cleverence/edge-js-sdk 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 @@
1
+ {"version":3,"sources":["../../src/core/events.ts","../../src/core/websocket.ts","../../src/types/messages.ts","../../src/core/client.ts","../../src/vue/useEdge.ts","../../src/vue/useBarcode.ts","../../src/vue/useRfid.ts"],"names":["shallowRef","ref","onMounted","onUnmounted","watch"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Minimal typed event emitter for browser environments\r\n */\r\n\r\ntype EventHandler<T = unknown> = (data: T) => void;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport class EventEmitter<Events extends Record<string, any> = Record<string, unknown>> {\r\n private handlers: Map<keyof Events, Set<EventHandler<unknown>>> = new Map();\r\n\r\n /**\r\n * Subscribe to an event\r\n */\r\n on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\r\n if (!this.handlers.has(event)) {\r\n this.handlers.set(event, new Set());\r\n }\r\n this.handlers.get(event)!.add(handler as EventHandler<unknown>);\r\n return this;\r\n }\r\n\r\n /**\r\n * Subscribe to an event once (auto-unsubscribes after first call)\r\n */\r\n once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\r\n const onceHandler: EventHandler<Events[K]> = (data) => {\r\n this.off(event, onceHandler);\r\n handler(data);\r\n };\r\n return this.on(event, onceHandler);\r\n }\r\n\r\n /**\r\n * Unsubscribe from an event\r\n */\r\n off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this {\r\n const eventHandlers = this.handlers.get(event);\r\n if (eventHandlers) {\r\n eventHandlers.delete(handler as EventHandler<unknown>);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Emit an event to all subscribers\r\n */\r\n protected emit<K extends keyof Events>(event: K, data: Events[K]): void {\r\n const eventHandlers = this.handlers.get(event);\r\n if (eventHandlers) {\r\n eventHandlers.forEach((handler) => {\r\n try {\r\n handler(data);\r\n } catch (err) {\r\n console.error(`Error in event handler for \"${String(event)}\":`, err);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners for an event, or all listeners if no event specified\r\n */\r\n removeAllListeners(event?: keyof Events): this {\r\n if (event) {\r\n this.handlers.delete(event);\r\n } else {\r\n this.handlers.clear();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Get listener count for an event\r\n */\r\n listenerCount(event: keyof Events): number {\r\n return this.handlers.get(event)?.size ?? 0;\r\n }\r\n}\r\n","import { EventEmitter } from './events';\r\nimport type { ClientMessage, ServerMessage, ConnectionState } from '../types';\r\n\r\ninterface WSManagerEvents {\r\n message: ServerMessage;\r\n open: void;\r\n close: void;\r\n error: Error;\r\n statechange: ConnectionState;\r\n}\r\n\r\ninterface WSManagerOptions {\r\n reconnect?: boolean;\r\n reconnectDelay?: number;\r\n maxReconnectDelay?: number;\r\n pingInterval?: number;\r\n}\r\n\r\nconst DEFAULT_WS_OPTIONS: Required<WSManagerOptions> = {\r\n reconnect: true,\r\n reconnectDelay: 1000,\r\n maxReconnectDelay: 30000,\r\n pingInterval: 30000,\r\n};\r\n\r\n/**\r\n * WebSocket connection manager with auto-reconnect and request/response correlation\r\n */\r\nexport class WebSocketManager extends EventEmitter<WSManagerEvents> {\r\n private ws: WebSocket | null = null;\r\n private url: string;\r\n private options: Required<WSManagerOptions>;\r\n private _state: ConnectionState = 'disconnected';\r\n private reconnectAttempts = 0;\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private pingTimer: ReturnType<typeof setInterval> | null = null;\r\n private pendingRequests: Map<string, {\r\n resolve: (data: unknown) => void;\r\n reject: (error: Error) => void;\r\n timeout: ReturnType<typeof setTimeout>;\r\n }> = new Map();\r\n private intentionalClose = false;\r\n\r\n constructor(url: string, options: WSManagerOptions = {}) {\r\n super();\r\n this.url = url;\r\n this.options = { ...DEFAULT_WS_OPTIONS, ...options };\r\n }\r\n\r\n /**\r\n * Current connection state\r\n */\r\n get state(): ConnectionState {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Whether currently connected\r\n */\r\n get isConnected(): boolean {\r\n return this._state === 'connected';\r\n }\r\n\r\n /**\r\n * Connect to the WebSocket server\r\n */\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (this._state === 'connected' || this._state === 'connecting') {\r\n resolve();\r\n return;\r\n }\r\n\r\n this.intentionalClose = false;\r\n this.setState('connecting');\r\n\r\n try {\r\n this.ws = new WebSocket(this.url);\r\n\r\n const onOpen = () => {\r\n this.ws?.removeEventListener('error', onError);\r\n this.reconnectAttempts = 0;\r\n this.setState('connected');\r\n this.startPing();\r\n this.emit('open', undefined);\r\n resolve();\r\n };\r\n\r\n const onError = (event: Event) => {\r\n this.ws?.removeEventListener('open', onOpen);\r\n const error = new Error('WebSocket connection failed');\r\n reject(error);\r\n };\r\n\r\n this.ws.addEventListener('open', onOpen, { once: true });\r\n this.ws.addEventListener('error', onError, { once: true });\r\n\r\n this.ws.addEventListener('message', this.handleMessage.bind(this));\r\n this.ws.addEventListener('close', this.handleClose.bind(this));\r\n this.ws.addEventListener('error', this.handleError.bind(this));\r\n } catch (err) {\r\n this.setState('disconnected');\r\n reject(err instanceof Error ? err : new Error(String(err)));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disconnect from the WebSocket server\r\n */\r\n disconnect(): void {\r\n this.intentionalClose = true;\r\n this.cleanup();\r\n this.setState('disconnected');\r\n this.emit('close', undefined);\r\n }\r\n\r\n /**\r\n * Send a message to the server\r\n */\r\n send(message: ClientMessage): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n throw new Error('WebSocket is not connected');\r\n }\r\n this.ws.send(JSON.stringify(message));\r\n }\r\n\r\n /**\r\n * Send a query and wait for response (request/response pattern)\r\n */\r\n request<T>(query: 'status' | 'capabilities' | 'config' | 'rfid_tags', timeoutMs = 10000): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const id = this.generateId();\r\n \r\n const timeout = setTimeout(() => {\r\n this.pendingRequests.delete(id);\r\n reject(new Error(`Request timeout: ${query}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(id, {\r\n resolve: resolve as (data: unknown) => void,\r\n reject,\r\n timeout,\r\n });\r\n\r\n try {\r\n this.send({ type: 'query', id, query });\r\n } catch (err) {\r\n clearTimeout(timeout);\r\n this.pendingRequests.delete(id);\r\n reject(err);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Send a command (fire and forget, but throws if not connected)\r\n */\r\n command(message: Exclude<ClientMessage, { type: 'query' } | { type: 'ping' }>): void {\r\n this.send(message);\r\n }\r\n\r\n private handleMessage(event: MessageEvent): void {\r\n try {\r\n const message = JSON.parse(event.data) as ServerMessage;\r\n\r\n // Handle response to pending request\r\n if (message.type === 'response') {\r\n const pending = this.pendingRequests.get(message.id);\r\n if (pending) {\r\n clearTimeout(pending.timeout);\r\n this.pendingRequests.delete(message.id);\r\n \r\n if (message.success) {\r\n pending.resolve(message.data.result);\r\n } else {\r\n pending.reject(new Error(message.error));\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // Handle pong\r\n if (message.type === 'pong') {\r\n return; // Keepalive response, no action needed\r\n }\r\n\r\n // Emit for other handlers\r\n this.emit('message', message);\r\n } catch (err) {\r\n console.error('Failed to parse WebSocket message:', err);\r\n }\r\n }\r\n\r\n private handleClose(): void {\r\n this.cleanup();\r\n \r\n if (this.intentionalClose) {\r\n this.setState('disconnected');\r\n return;\r\n }\r\n\r\n this.emit('close', undefined);\r\n\r\n if (this.options.reconnect) {\r\n this.scheduleReconnect();\r\n } else {\r\n this.setState('disconnected');\r\n }\r\n }\r\n\r\n private handleError(event: Event): void {\r\n const error = new Error('WebSocket error');\r\n this.emit('error', error);\r\n }\r\n\r\n private scheduleReconnect(): void {\r\n if (this.reconnectTimer) return;\r\n\r\n this.setState('reconnecting');\r\n\r\n // Exponential backoff\r\n const delay = Math.min(\r\n this.options.reconnectDelay * Math.pow(2, this.reconnectAttempts),\r\n this.options.maxReconnectDelay\r\n );\r\n\r\n this.reconnectTimer = setTimeout(async () => {\r\n this.reconnectTimer = null;\r\n this.reconnectAttempts++;\r\n \r\n try {\r\n await this.connect();\r\n } catch {\r\n // connect() will trigger handleClose which schedules another reconnect\r\n }\r\n }, delay);\r\n }\r\n\r\n private startPing(): void {\r\n this.stopPing();\r\n this.pingTimer = setInterval(() => {\r\n if (this.ws?.readyState === WebSocket.OPEN) {\r\n try {\r\n this.send({ type: 'ping' });\r\n } catch {\r\n // Ignore ping errors\r\n }\r\n }\r\n }, this.options.pingInterval);\r\n }\r\n\r\n private stopPing(): void {\r\n if (this.pingTimer) {\r\n clearInterval(this.pingTimer);\r\n this.pingTimer = null;\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n this.stopPing();\r\n\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n\r\n // Reject all pending requests\r\n this.pendingRequests.forEach((pending) => {\r\n clearTimeout(pending.timeout);\r\n pending.reject(new Error('WebSocket disconnected'));\r\n });\r\n this.pendingRequests.clear();\r\n\r\n if (this.ws) {\r\n const ws = this.ws;\r\n this.ws = null;\r\n // Only close if not already closed/closing\r\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\r\n ws.close();\r\n }\r\n }\r\n }\r\n\r\n private setState(state: ConnectionState): void {\r\n if (this._state !== state) {\r\n this._state = state;\r\n this.emit('statechange', state);\r\n }\r\n }\r\n\r\n private generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n}\r\n","import type { ScanEvent, RfidEvent } from './events';\r\nimport type { DeviceCapabilities, EdgeStatus, EdgeConfig, RfidInventoryOptions, RfidTag } from './capabilities';\r\n\r\n/**\r\n * Messages sent from SDK (client) to Edge service (server)\r\n */\r\nexport type ClientMessage =\r\n | { type: 'command'; command: 'trigger_scan' }\r\n | { type: 'command'; command: 'set_symbologies'; symbologies: string[] }\r\n | { type: 'command'; command: 'start_rfid_inventory'; options?: RfidInventoryOptions }\r\n | { type: 'command'; command: 'stop_rfid_inventory' }\r\n | { type: 'query'; id: string; query: 'status' }\r\n | { type: 'query'; id: string; query: 'capabilities' }\r\n | { type: 'query'; id: string; query: 'config' }\r\n | { type: 'query'; id: string; query: 'rfid_tags' }\r\n | { type: 'ping' };\r\n\r\n/**\r\n * Messages received from Edge service (server) to SDK (client)\r\n */\r\nexport type ServerMessage =\r\n | { type: 'event'; event: ScanEvent | RfidEvent }\r\n | { type: 'capabilities'; data: DeviceCapabilities }\r\n | { type: 'response'; id: string; success: true; data: ResponseData }\r\n | { type: 'response'; id: string; success: false; error: string }\r\n | { type: 'error'; message: string; code?: string }\r\n | { type: 'pong' };\r\n\r\n/**\r\n * Response data types based on query type\r\n */\r\nexport type ResponseData =\r\n | { query: 'status'; result: EdgeStatus }\r\n | { query: 'capabilities'; result: DeviceCapabilities }\r\n | { query: 'config'; result: EdgeConfig }\r\n | { query: 'rfid_tags'; result: RfidTag[] };\r\n\r\n/**\r\n * Connection state for the WebSocket\r\n */\r\nexport type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';\r\n\r\n/**\r\n * Options for creating a CleverenceEdge instance\r\n */\r\nexport interface EdgeOptions {\r\n /** WebSocket URL. Default: 'ws://localhost:8585' */\r\n url?: string;\r\n /** Auto-connect on instantiation. Default: true */\r\n autoConnect?: boolean;\r\n /** Initial reconnect delay in ms. Default: 1000 */\r\n reconnectDelay?: number;\r\n /** Maximum reconnect delay in ms. Default: 30000 */\r\n maxReconnectDelay?: number;\r\n /** Ping interval for keepalive in ms. Default: 30000 */\r\n pingInterval?: number;\r\n}\r\n\r\n/**\r\n * Default options\r\n */\r\nexport const DEFAULT_OPTIONS: Required<EdgeOptions> = {\r\n url: 'ws://localhost:8585',\r\n autoConnect: true,\r\n reconnectDelay: 1000,\r\n maxReconnectDelay: 30000,\r\n pingInterval: 30000,\r\n};\r\n","import { EventEmitter } from './events';\r\nimport { WebSocketManager } from './websocket';\r\nimport type {\r\n ScanEvent,\r\n RfidEvent,\r\n DeviceCapabilities,\r\n EdgeStatus,\r\n EdgeConfig,\r\n RfidInventoryOptions,\r\n RfidTag,\r\n ConnectionState,\r\n EdgeOptions,\r\n ServerMessage,\r\n} from '../types';\r\nimport { DEFAULT_OPTIONS } from '../types';\r\n\r\n/**\r\n * Events emitted by CleverenceEdge\r\n */\r\ninterface CleverenceEdgeEvents {\r\n scan: ScanEvent;\r\n rfid: RfidEvent;\r\n connect: void;\r\n disconnect: void;\r\n reconnecting: void;\r\n error: Error;\r\n capabilities: DeviceCapabilities;\r\n}\r\n\r\n/**\r\n * CleverenceEdge SDK - Connect to barcode scanners and RFID readers\r\n *\r\n * @example\r\n * ```typescript\r\n * const edge = new CleverenceEdge();\r\n *\r\n * edge.on('scan', (event) => {\r\n * console.log(event.data); // \"012345678905\"\r\n * console.log(event.symbology); // \"ean13\"\r\n * });\r\n *\r\n * edge.on('rfid', (event) => {\r\n * console.log(event.epc); // \"3034257BF400B7800004CB2F\"\r\n * console.log(event.rssi); // -45\r\n * });\r\n *\r\n * await edge.connect();\r\n * ```\r\n */\r\nexport class CleverenceEdge extends EventEmitter<CleverenceEdgeEvents> {\r\n private ws: WebSocketManager;\r\n private options: Required<EdgeOptions>;\r\n private _capabilities: DeviceCapabilities | null = null;\r\n\r\n constructor(options: EdgeOptions = {}) {\r\n super();\r\n this.options = { ...DEFAULT_OPTIONS, ...options };\r\n this.ws = new WebSocketManager(this.options.url, {\r\n reconnect: true,\r\n reconnectDelay: this.options.reconnectDelay,\r\n maxReconnectDelay: this.options.maxReconnectDelay,\r\n pingInterval: this.options.pingInterval,\r\n });\r\n\r\n this.setupWebSocketHandlers();\r\n\r\n if (this.options.autoConnect) {\r\n // Auto-connect on next tick to allow event handlers to be set up\r\n setTimeout(() => this.connect().catch(() => {}), 0);\r\n }\r\n }\r\n\r\n /**\r\n * Current connection state\r\n */\r\n get connectionState(): ConnectionState {\r\n return this.ws.state;\r\n }\r\n\r\n /**\r\n * Whether currently connected to the Edge service\r\n */\r\n get isConnected(): boolean {\r\n return this.ws.isConnected;\r\n }\r\n\r\n /**\r\n * Cached device capabilities (available after connect)\r\n */\r\n get capabilities(): DeviceCapabilities | null {\r\n return this._capabilities;\r\n }\r\n\r\n /**\r\n * Connect to the Edge service\r\n */\r\n async connect(): Promise<void> {\r\n await this.ws.connect();\r\n }\r\n\r\n /**\r\n * Disconnect from the Edge service\r\n */\r\n disconnect(): void {\r\n this.ws.disconnect();\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // Commands\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Trigger a barcode scan programmatically\r\n */\r\n async triggerScan(): Promise<void> {\r\n this.ensureConnected();\r\n this.ws.command({ type: 'command', command: 'trigger_scan' });\r\n }\r\n\r\n /**\r\n * Set enabled barcode symbologies\r\n */\r\n async setSymbologies(symbologies: string[]): Promise<void> {\r\n this.ensureConnected();\r\n this.ws.command({ type: 'command', command: 'set_symbologies', symbologies });\r\n }\r\n\r\n /**\r\n * Start RFID inventory (continuous reading)\r\n */\r\n async startRfidInventory(options?: RfidInventoryOptions): Promise<void> {\r\n this.ensureConnected();\r\n this.ws.command({ type: 'command', command: 'start_rfid_inventory', options });\r\n }\r\n\r\n /**\r\n * Stop RFID inventory\r\n */\r\n async stopRfidInventory(): Promise<void> {\r\n this.ensureConnected();\r\n this.ws.command({ type: 'command', command: 'stop_rfid_inventory' });\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // Queries\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Get current Edge service status\r\n */\r\n async getStatus(): Promise<EdgeStatus> {\r\n this.ensureConnected();\r\n return this.ws.request<EdgeStatus>('status');\r\n }\r\n\r\n /**\r\n * Get device capabilities\r\n */\r\n async getCapabilities(): Promise<DeviceCapabilities> {\r\n this.ensureConnected();\r\n return this.ws.request<DeviceCapabilities>('capabilities');\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n async getConfig(): Promise<EdgeConfig> {\r\n this.ensureConnected();\r\n return this.ws.request<EdgeConfig>('config');\r\n }\r\n\r\n /**\r\n * Get RFID tags from current/last inventory\r\n */\r\n async getRfidTags(): Promise<RfidTag[]> {\r\n this.ensureConnected();\r\n return this.ws.request<RfidTag[]>('rfid_tags');\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // Static factory\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Create a new CleverenceEdge instance\r\n */\r\n static create(options?: EdgeOptions): CleverenceEdge {\r\n return new CleverenceEdge(options);\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // Private methods\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n private setupWebSocketHandlers(): void {\r\n this.ws.on('open', () => {\r\n this.emit('connect', undefined);\r\n // Fetch capabilities on connect\r\n this.getCapabilities()\r\n .then((caps) => {\r\n this._capabilities = caps;\r\n this.emit('capabilities', caps);\r\n })\r\n .catch(() => {});\r\n });\r\n\r\n this.ws.on('close', () => {\r\n this.emit('disconnect', undefined);\r\n });\r\n\r\n this.ws.on('error', (error) => {\r\n this.emit('error', error);\r\n });\r\n\r\n this.ws.on('statechange', (state) => {\r\n if (state === 'reconnecting') {\r\n this.emit('reconnecting', undefined);\r\n }\r\n });\r\n\r\n this.ws.on('message', (message) => {\r\n this.handleServerMessage(message);\r\n });\r\n }\r\n\r\n private handleServerMessage(message: ServerMessage): void {\r\n switch (message.type) {\r\n case 'event':\r\n this.handleEvent(message.event);\r\n break;\r\n case 'capabilities':\r\n this._capabilities = message.data;\r\n this.emit('capabilities', message.data);\r\n break;\r\n case 'error':\r\n this.emit('error', new Error(message.message));\r\n break;\r\n }\r\n }\r\n\r\n private handleEvent(event: ScanEvent | RfidEvent): void {\r\n // Parse timestamp if it's a string\r\n const parsedEvent = {\r\n ...event,\r\n timestamp: typeof event.timestamp === 'string' \r\n ? new Date(event.timestamp) \r\n : event.timestamp,\r\n };\r\n\r\n if (event.type === 'scan') {\r\n this.emit('scan', parsedEvent as ScanEvent);\r\n } else if (event.type === 'rfid') {\r\n this.emit('rfid', parsedEvent as RfidEvent);\r\n }\r\n }\r\n\r\n private ensureConnected(): void {\r\n if (!this.isConnected) {\r\n throw new Error('Not connected to Edge service. Call connect() first.');\r\n }\r\n }\r\n}\r\n","import { ref, shallowRef, onMounted, onUnmounted, type Ref, type ShallowRef } from 'vue';\r\nimport { CleverenceEdge } from '../core/client';\r\nimport type { ConnectionState, DeviceCapabilities, EdgeOptions } from '../types';\r\n\r\n// Shared instance for the app\r\nlet sharedEdge: CleverenceEdge | null = null;\r\nlet refCount = 0;\r\n\r\nexport interface UseEdgeOptions extends EdgeOptions {\r\n /** Use a shared instance across components. Default: true */\r\n shared?: boolean;\r\n}\r\n\r\nexport interface UseEdgeReturn {\r\n /** The CleverenceEdge instance */\r\n edge: ShallowRef<CleverenceEdge | null>;\r\n /** Whether connected to the Edge service */\r\n isConnected: Ref<boolean>;\r\n /** Current connection state */\r\n connectionState: Ref<ConnectionState>;\r\n /** Device capabilities (available after connect) */\r\n capabilities: Ref<DeviceCapabilities | null>;\r\n /** Last error that occurred */\r\n error: Ref<Error | null>;\r\n /** Manually connect */\r\n connect: () => Promise<void>;\r\n /** Manually disconnect */\r\n disconnect: () => void;\r\n}\r\n\r\n/**\r\n * Vue composable to access the CleverenceEdge instance and connection state\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { useEdge } from '@cleverence-edge/js-sdk/vue';\r\n *\r\n * const { isConnected, capabilities, error } = useEdge();\r\n * </script>\r\n *\r\n * <template>\r\n * <div v-if=\"error\">Error: {{ error.message }}</div>\r\n * <div v-else-if=\"!isConnected\">Connecting...</div>\r\n * <div v-else>\r\n * Connected to {{ capabilities?.vendor }} {{ capabilities?.deviceModel }}\r\n * </div>\r\n * </template>\r\n * ```\r\n */\r\nexport function useEdge(options: UseEdgeOptions = {}): UseEdgeReturn {\r\n const { shared = true, ...edgeOptions } = options;\r\n\r\n const edge = shallowRef<CleverenceEdge | null>(null);\r\n const isConnected = ref(false);\r\n const connectionState = ref<ConnectionState>('disconnected');\r\n const capabilities = ref<DeviceCapabilities | null>(null);\r\n const error = ref<Error | null>(null);\r\n\r\n const handleConnect = () => {\r\n connectionState.value = 'connected';\r\n isConnected.value = true;\r\n error.value = null;\r\n };\r\n\r\n const handleDisconnect = () => {\r\n connectionState.value = 'disconnected';\r\n isConnected.value = false;\r\n };\r\n\r\n const handleReconnecting = () => {\r\n connectionState.value = 'reconnecting';\r\n isConnected.value = false;\r\n };\r\n\r\n const handleError = (err: Error) => {\r\n error.value = err;\r\n };\r\n\r\n const handleCapabilities = (caps: DeviceCapabilities) => {\r\n capabilities.value = caps;\r\n };\r\n\r\n const setupListeners = (instance: CleverenceEdge) => {\r\n instance.on('connect', handleConnect);\r\n instance.on('disconnect', handleDisconnect);\r\n instance.on('reconnecting', handleReconnecting);\r\n instance.on('error', handleError);\r\n instance.on('capabilities', handleCapabilities);\r\n };\r\n\r\n const removeListeners = (instance: CleverenceEdge) => {\r\n instance.off('connect', handleConnect);\r\n instance.off('disconnect', handleDisconnect);\r\n instance.off('reconnecting', handleReconnecting);\r\n instance.off('error', handleError);\r\n instance.off('capabilities', handleCapabilities);\r\n };\r\n\r\n onMounted(() => {\r\n let instance: CleverenceEdge;\r\n\r\n if (shared) {\r\n if (!sharedEdge) {\r\n sharedEdge = new CleverenceEdge(edgeOptions);\r\n }\r\n instance = sharedEdge;\r\n refCount++;\r\n } else {\r\n instance = new CleverenceEdge(edgeOptions);\r\n }\r\n\r\n edge.value = instance;\r\n connectionState.value = instance.connectionState;\r\n isConnected.value = instance.isConnected;\r\n capabilities.value = instance.capabilities;\r\n\r\n setupListeners(instance);\r\n });\r\n\r\n onUnmounted(() => {\r\n const instance = edge.value;\r\n if (!instance) return;\r\n\r\n removeListeners(instance);\r\n\r\n if (shared) {\r\n refCount--;\r\n if (refCount === 0 && sharedEdge) {\r\n sharedEdge.disconnect();\r\n sharedEdge = null;\r\n }\r\n } else {\r\n instance.disconnect();\r\n }\r\n\r\n edge.value = null;\r\n });\r\n\r\n const connect = async () => {\r\n if (edge.value) {\r\n await edge.value.connect();\r\n }\r\n };\r\n\r\n const disconnect = () => {\r\n if (edge.value) {\r\n edge.value.disconnect();\r\n }\r\n };\r\n\r\n return {\r\n edge,\r\n isConnected,\r\n connectionState,\r\n capabilities,\r\n error,\r\n connect,\r\n disconnect,\r\n };\r\n}\r\n","import { ref, watch, onUnmounted, type Ref, type ShallowRef } from 'vue';\r\nimport type { CleverenceEdge } from '../core/client';\r\nimport type { ScanEvent } from '../types';\r\n\r\nexport interface UseBarcodeOptions {\r\n /** The edge instance to use (from useEdge) */\r\n edge: ShallowRef<CleverenceEdge | null> | Ref<CleverenceEdge | null>;\r\n /** Maximum number of scans to keep in history. Default: 50 */\r\n maxHistory?: number;\r\n /** Called when a new scan is received */\r\n onScan?: (event: ScanEvent) => void;\r\n}\r\n\r\nexport interface UseBarcodeReturn {\r\n /** Most recent scan event */\r\n lastScan: Ref<ScanEvent | null>;\r\n /** History of scan events (newest first) */\r\n scanHistory: Ref<ScanEvent[]>;\r\n /** Clear the scan history */\r\n clearHistory: () => void;\r\n /** Trigger a scan programmatically */\r\n triggerScan: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Vue composable for barcode scanning\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { useEdge, useBarcode } from '@cleverence-edge/js-sdk/vue';\r\n *\r\n * const { edge } = useEdge();\r\n * const { lastScan, scanHistory, clearHistory } = useBarcode({ edge });\r\n * </script>\r\n *\r\n * <template>\r\n * <div>\r\n * <h1>Last: {{ lastScan?.data }}</h1>\r\n * <button @click=\"clearHistory\">Clear</button>\r\n * <ul>\r\n * <li v-for=\"scan in scanHistory\" :key=\"scan.id\">\r\n * {{ scan.data }} ({{ scan.symbology }})\r\n * </li>\r\n * </ul>\r\n * </div>\r\n * </template>\r\n * ```\r\n */\r\nexport function useBarcode(options: UseBarcodeOptions): UseBarcodeReturn {\r\n const { edge, maxHistory = 50, onScan } = options;\r\n\r\n const lastScan = ref<ScanEvent | null>(null);\r\n const scanHistory = ref<ScanEvent[]>([]);\r\n\r\n let currentHandler: ((event: ScanEvent) => void) | null = null;\r\n\r\n const handleScan = (event: ScanEvent) => {\r\n lastScan.value = event;\r\n scanHistory.value = [event, ...scanHistory.value].slice(0, maxHistory);\r\n onScan?.(event);\r\n };\r\n\r\n // Watch for edge instance changes\r\n const stopWatch = watch(\r\n edge,\r\n (newEdge, oldEdge) => {\r\n // Remove old handler\r\n if (oldEdge && currentHandler) {\r\n oldEdge.off('scan', currentHandler);\r\n }\r\n\r\n // Add new handler\r\n if (newEdge) {\r\n currentHandler = handleScan;\r\n newEdge.on('scan', currentHandler);\r\n }\r\n },\r\n { immediate: true }\r\n );\r\n\r\n onUnmounted(() => {\r\n stopWatch();\r\n if (edge.value && currentHandler) {\r\n edge.value.off('scan', currentHandler);\r\n }\r\n });\r\n\r\n const clearHistory = () => {\r\n lastScan.value = null;\r\n scanHistory.value = [];\r\n };\r\n\r\n const triggerScan = async () => {\r\n if (!edge.value) throw new Error('Not connected');\r\n await edge.value.triggerScan();\r\n };\r\n\r\n return {\r\n lastScan,\r\n scanHistory,\r\n clearHistory,\r\n triggerScan,\r\n };\r\n}\r\n","import { ref, watch, onUnmounted, type Ref, type ShallowRef } from 'vue';\r\nimport type { CleverenceEdge } from '../core/client';\r\nimport type { RfidEvent, RfidTag, RfidInventoryOptions } from '../types';\r\n\r\nexport interface UseRfidOptions {\r\n /** The edge instance to use (from useEdge) */\r\n edge: ShallowRef<CleverenceEdge | null> | Ref<CleverenceEdge | null>;\r\n /** Called when a new RFID tag is read */\r\n onRead?: (event: RfidEvent) => void;\r\n}\r\n\r\nexport interface UseRfidReturn {\r\n /** Most recent RFID read event */\r\n lastRead: Ref<RfidEvent | null>;\r\n /** Aggregated list of unique tags (by EPC) */\r\n tags: Ref<Map<string, RfidTag>>;\r\n /** Whether an inventory is currently active */\r\n isInventoryActive: Ref<boolean>;\r\n /** Start RFID inventory */\r\n startInventory: (options?: RfidInventoryOptions) => Promise<void>;\r\n /** Stop RFID inventory */\r\n stopInventory: () => Promise<void>;\r\n /** Clear the tags list */\r\n clearTags: () => void;\r\n}\r\n\r\n/**\r\n * Vue composable for RFID reading\r\n *\r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { useEdge, useRfid } from '@cleverence-edge/js-sdk/vue';\r\n *\r\n * const { edge } = useEdge();\r\n * const { tags, isInventoryActive, startInventory, stopInventory } = useRfid({ edge });\r\n * </script>\r\n *\r\n * <template>\r\n * <div>\r\n * <button @click=\"isInventoryActive ? stopInventory() : startInventory()\">\r\n * {{ isInventoryActive ? 'Stop' : 'Start' }} Inventory\r\n * </button>\r\n * <p>{{ tags.size }} unique tags found</p>\r\n * <ul>\r\n * <li v-for=\"[epc, tag] in tags\" :key=\"epc\">\r\n * {{ tag.epc }} (RSSI: {{ tag.rssi }}, Count: {{ tag.readCount }})\r\n * </li>\r\n * </ul>\r\n * </div>\r\n * </template>\r\n * ```\r\n */\r\nexport function useRfid(options: UseRfidOptions): UseRfidReturn {\r\n const { edge, onRead } = options;\r\n\r\n const lastRead = ref<RfidEvent | null>(null);\r\n const tags = ref<Map<string, RfidTag>>(new Map());\r\n const isInventoryActive = ref(false);\r\n\r\n let currentHandler: ((event: RfidEvent) => void) | null = null;\r\n\r\n const handleRfid = (event: RfidEvent) => {\r\n lastRead.value = event;\r\n\r\n // Update tags map\r\n const newTags = new Map(tags.value);\r\n const existing = newTags.get(event.epc);\r\n const now = new Date();\r\n\r\n if (existing) {\r\n newTags.set(event.epc, {\r\n ...existing,\r\n rssi: event.rssi,\r\n antenna: event.antenna,\r\n readCount: existing.readCount + 1,\r\n lastSeen: now,\r\n });\r\n } else {\r\n newTags.set(event.epc, {\r\n epc: event.epc,\r\n rssi: event.rssi,\r\n antenna: event.antenna,\r\n readCount: 1,\r\n firstSeen: now,\r\n lastSeen: now,\r\n });\r\n }\r\n\r\n tags.value = newTags;\r\n onRead?.(event);\r\n };\r\n\r\n // Watch for edge instance changes\r\n const stopWatch = watch(\r\n edge,\r\n (newEdge, oldEdge) => {\r\n // Remove old handler\r\n if (oldEdge && currentHandler) {\r\n oldEdge.off('rfid', currentHandler);\r\n }\r\n\r\n // Add new handler\r\n if (newEdge) {\r\n currentHandler = handleRfid;\r\n newEdge.on('rfid', currentHandler);\r\n }\r\n },\r\n { immediate: true }\r\n );\r\n\r\n onUnmounted(() => {\r\n stopWatch();\r\n if (edge.value && currentHandler) {\r\n edge.value.off('rfid', currentHandler);\r\n }\r\n });\r\n\r\n const startInventory = async (inventoryOptions?: RfidInventoryOptions) => {\r\n if (!edge.value) throw new Error('Not connected');\r\n await edge.value.startRfidInventory(inventoryOptions);\r\n isInventoryActive.value = true;\r\n };\r\n\r\n const stopInventory = async () => {\r\n if (!edge.value) throw new Error('Not connected');\r\n await edge.value.stopRfidInventory();\r\n isInventoryActive.value = false;\r\n };\r\n\r\n const clearTags = () => {\r\n lastRead.value = null;\r\n tags.value = new Map();\r\n };\r\n\r\n return {\r\n lastRead,\r\n tags,\r\n isInventoryActive,\r\n startInventory,\r\n stopInventory,\r\n clearTags,\r\n };\r\n}\r\n"]}
@@ -0,0 +1,447 @@
1
+ import { ShallowRef, Ref } from 'vue';
2
+
3
+ /**
4
+ * Minimal typed event emitter for browser environments
5
+ */
6
+ type EventHandler<T = unknown> = (data: T) => void;
7
+ declare class EventEmitter<Events extends Record<string, any> = Record<string, unknown>> {
8
+ private handlers;
9
+ /**
10
+ * Subscribe to an event
11
+ */
12
+ on<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this;
13
+ /**
14
+ * Subscribe to an event once (auto-unsubscribes after first call)
15
+ */
16
+ once<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this;
17
+ /**
18
+ * Unsubscribe from an event
19
+ */
20
+ off<K extends keyof Events>(event: K, handler: EventHandler<Events[K]>): this;
21
+ /**
22
+ * Emit an event to all subscribers
23
+ */
24
+ protected emit<K extends keyof Events>(event: K, data: Events[K]): void;
25
+ /**
26
+ * Remove all listeners for an event, or all listeners if no event specified
27
+ */
28
+ removeAllListeners(event?: keyof Events): this;
29
+ /**
30
+ * Get listener count for an event
31
+ */
32
+ listenerCount(event: keyof Events): number;
33
+ }
34
+
35
+ /**
36
+ * Barcode scan event - simplified API surface for easy consumption
37
+ */
38
+ interface ScanEvent {
39
+ /** Event type discriminator */
40
+ type: 'scan';
41
+ /** Unique event identifier */
42
+ id: string;
43
+ /** When the scan occurred */
44
+ timestamp: Date;
45
+ /** Decoded barcode data string */
46
+ data: string;
47
+ /** Human-readable symbology name: "ean13", "qrcode", "code128", etc. */
48
+ symbology: string;
49
+ /** Scanner source: "integrated-laser", "camera", "bluetooth-ring" */
50
+ source: string;
51
+ /** Device vendor: "zebra", "honeywell", "urovo", "datalogic" */
52
+ vendor: string;
53
+ /** Extended raw data (optional, for advanced use cases) */
54
+ raw?: {
55
+ /** Raw barcode bytes as hex string */
56
+ bytesHex: string;
57
+ /** Vendor-specific symbology identifier */
58
+ symbologyId: string;
59
+ /** AIM identifier for the symbology */
60
+ aimId: string;
61
+ /** Signal strength if available */
62
+ signalStrength: number | null;
63
+ /** How long the scan took in milliseconds */
64
+ scanDurationMs: number;
65
+ };
66
+ }
67
+ /**
68
+ * RFID read event - simplified API surface for easy consumption
69
+ */
70
+ interface RfidEvent {
71
+ /** Event type discriminator */
72
+ type: 'rfid';
73
+ /** Unique event identifier */
74
+ id: string;
75
+ /** When the read occurred */
76
+ timestamp: Date;
77
+ /** EPC (Electronic Product Code) tag identifier */
78
+ epc: string;
79
+ /** Received Signal Strength Indicator in dBm */
80
+ rssi: number;
81
+ /** Antenna port number that read the tag */
82
+ antenna: number;
83
+ /** Tag Identifier (TID) memory bank data */
84
+ tid?: string | null;
85
+ /** User memory bank data */
86
+ userData?: string | null;
87
+ /** RF phase angle */
88
+ phase?: number;
89
+ /** RF channel frequency */
90
+ channel?: number;
91
+ /** Number of times this tag was read in current inventory */
92
+ readCount?: number;
93
+ /** Protocol Control (PC) bits */
94
+ pc?: string;
95
+ /** CRC checksum */
96
+ crc?: string;
97
+ /** Inventory session identifier */
98
+ inventorySession?: string;
99
+ /** Transmit power used for this read in dBm */
100
+ transmitPowerDbm?: number;
101
+ }
102
+
103
+ /**
104
+ * Device capabilities reported by the Edge service on connection
105
+ */
106
+ interface DeviceCapabilities {
107
+ /** Device vendor: "zebra", "honeywell", "urovo", "datalogic", etc. */
108
+ vendor: string;
109
+ /** Device model name */
110
+ deviceModel: string;
111
+ /** Whether device has barcode scanning capability */
112
+ hasBarcode: boolean;
113
+ /** Whether device has RFID reading capability */
114
+ hasRfid: boolean;
115
+ /** List of supported barcode symbologies */
116
+ supportedSymbologies: string[];
117
+ /** RFID transmit power range in dBm (if RFID capable) */
118
+ rfidPowerRange?: {
119
+ min: number;
120
+ max: number;
121
+ };
122
+ /** Firmware version if available */
123
+ firmwareVersion?: string;
124
+ /** Serial number if available */
125
+ serialNumber?: string;
126
+ }
127
+ /**
128
+ * Edge service status information
129
+ */
130
+ interface EdgeStatus {
131
+ /** Whether the service is connected to hardware */
132
+ connected: boolean;
133
+ /** Unique device identifier */
134
+ deviceId: string;
135
+ /** Edge service version */
136
+ version: string;
137
+ /** Service uptime in seconds */
138
+ uptime: number;
139
+ /** Current battery level (0-100) if available */
140
+ batteryLevel?: number;
141
+ /** Whether device is charging */
142
+ isCharging?: boolean;
143
+ }
144
+ /**
145
+ * Edge service configuration
146
+ */
147
+ interface EdgeConfig {
148
+ /** Enabled barcode symbologies */
149
+ enabledSymbologies: string[];
150
+ /** RFID transmit power in dBm */
151
+ rfidPower?: number;
152
+ /** Whether to deduplicate rapid scans of same barcode */
153
+ deduplicateScans: boolean;
154
+ /** Deduplication window in milliseconds */
155
+ deduplicateWindowMs: number;
156
+ /** Whether sound feedback is enabled */
157
+ soundEnabled: boolean;
158
+ /** Whether vibration feedback is enabled */
159
+ vibrationEnabled: boolean;
160
+ }
161
+ /**
162
+ * RFID inventory options for startRfidInventory()
163
+ */
164
+ interface RfidInventoryOptions {
165
+ /** Transmit power in dBm (uses device default if not specified) */
166
+ power?: number;
167
+ /** Which antenna ports to use (all if not specified) */
168
+ antennas?: number[];
169
+ /** Session (0-3, affects tag persistence behavior) */
170
+ session?: 0 | 1 | 2 | 3;
171
+ /** Target flag (A or B) */
172
+ target?: 'A' | 'B';
173
+ }
174
+ /**
175
+ * RFID tag information from inventory
176
+ */
177
+ interface RfidTag {
178
+ /** EPC tag identifier */
179
+ epc: string;
180
+ /** Last seen RSSI */
181
+ rssi: number;
182
+ /** Antenna that last read the tag */
183
+ antenna: number;
184
+ /** Total read count during inventory */
185
+ readCount: number;
186
+ /** When the tag was first seen */
187
+ firstSeen: Date;
188
+ /** When the tag was last seen */
189
+ lastSeen: Date;
190
+ }
191
+
192
+ /**
193
+ * Connection state for the WebSocket
194
+ */
195
+ type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting';
196
+ /**
197
+ * Options for creating a CleverenceEdge instance
198
+ */
199
+ interface EdgeOptions {
200
+ /** WebSocket URL. Default: 'ws://localhost:8585' */
201
+ url?: string;
202
+ /** Auto-connect on instantiation. Default: true */
203
+ autoConnect?: boolean;
204
+ /** Initial reconnect delay in ms. Default: 1000 */
205
+ reconnectDelay?: number;
206
+ /** Maximum reconnect delay in ms. Default: 30000 */
207
+ maxReconnectDelay?: number;
208
+ /** Ping interval for keepalive in ms. Default: 30000 */
209
+ pingInterval?: number;
210
+ }
211
+
212
+ /**
213
+ * Events emitted by CleverenceEdge
214
+ */
215
+ interface CleverenceEdgeEvents {
216
+ scan: ScanEvent;
217
+ rfid: RfidEvent;
218
+ connect: void;
219
+ disconnect: void;
220
+ reconnecting: void;
221
+ error: Error;
222
+ capabilities: DeviceCapabilities;
223
+ }
224
+ /**
225
+ * CleverenceEdge SDK - Connect to barcode scanners and RFID readers
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const edge = new CleverenceEdge();
230
+ *
231
+ * edge.on('scan', (event) => {
232
+ * console.log(event.data); // "012345678905"
233
+ * console.log(event.symbology); // "ean13"
234
+ * });
235
+ *
236
+ * edge.on('rfid', (event) => {
237
+ * console.log(event.epc); // "3034257BF400B7800004CB2F"
238
+ * console.log(event.rssi); // -45
239
+ * });
240
+ *
241
+ * await edge.connect();
242
+ * ```
243
+ */
244
+ declare class CleverenceEdge extends EventEmitter<CleverenceEdgeEvents> {
245
+ private ws;
246
+ private options;
247
+ private _capabilities;
248
+ constructor(options?: EdgeOptions);
249
+ /**
250
+ * Current connection state
251
+ */
252
+ get connectionState(): ConnectionState;
253
+ /**
254
+ * Whether currently connected to the Edge service
255
+ */
256
+ get isConnected(): boolean;
257
+ /**
258
+ * Cached device capabilities (available after connect)
259
+ */
260
+ get capabilities(): DeviceCapabilities | null;
261
+ /**
262
+ * Connect to the Edge service
263
+ */
264
+ connect(): Promise<void>;
265
+ /**
266
+ * Disconnect from the Edge service
267
+ */
268
+ disconnect(): void;
269
+ /**
270
+ * Trigger a barcode scan programmatically
271
+ */
272
+ triggerScan(): Promise<void>;
273
+ /**
274
+ * Set enabled barcode symbologies
275
+ */
276
+ setSymbologies(symbologies: string[]): Promise<void>;
277
+ /**
278
+ * Start RFID inventory (continuous reading)
279
+ */
280
+ startRfidInventory(options?: RfidInventoryOptions): Promise<void>;
281
+ /**
282
+ * Stop RFID inventory
283
+ */
284
+ stopRfidInventory(): Promise<void>;
285
+ /**
286
+ * Get current Edge service status
287
+ */
288
+ getStatus(): Promise<EdgeStatus>;
289
+ /**
290
+ * Get device capabilities
291
+ */
292
+ getCapabilities(): Promise<DeviceCapabilities>;
293
+ /**
294
+ * Get current configuration
295
+ */
296
+ getConfig(): Promise<EdgeConfig>;
297
+ /**
298
+ * Get RFID tags from current/last inventory
299
+ */
300
+ getRfidTags(): Promise<RfidTag[]>;
301
+ /**
302
+ * Create a new CleverenceEdge instance
303
+ */
304
+ static create(options?: EdgeOptions): CleverenceEdge;
305
+ private setupWebSocketHandlers;
306
+ private handleServerMessage;
307
+ private handleEvent;
308
+ private ensureConnected;
309
+ }
310
+
311
+ interface UseEdgeOptions extends EdgeOptions {
312
+ /** Use a shared instance across components. Default: true */
313
+ shared?: boolean;
314
+ }
315
+ interface UseEdgeReturn {
316
+ /** The CleverenceEdge instance */
317
+ edge: ShallowRef<CleverenceEdge | null>;
318
+ /** Whether connected to the Edge service */
319
+ isConnected: Ref<boolean>;
320
+ /** Current connection state */
321
+ connectionState: Ref<ConnectionState>;
322
+ /** Device capabilities (available after connect) */
323
+ capabilities: Ref<DeviceCapabilities | null>;
324
+ /** Last error that occurred */
325
+ error: Ref<Error | null>;
326
+ /** Manually connect */
327
+ connect: () => Promise<void>;
328
+ /** Manually disconnect */
329
+ disconnect: () => void;
330
+ }
331
+ /**
332
+ * Vue composable to access the CleverenceEdge instance and connection state
333
+ *
334
+ * @example
335
+ * ```vue
336
+ * <script setup>
337
+ * import { useEdge } from '@cleverence-edge/js-sdk/vue';
338
+ *
339
+ * const { isConnected, capabilities, error } = useEdge();
340
+ * </script>
341
+ *
342
+ * <template>
343
+ * <div v-if="error">Error: {{ error.message }}</div>
344
+ * <div v-else-if="!isConnected">Connecting...</div>
345
+ * <div v-else>
346
+ * Connected to {{ capabilities?.vendor }} {{ capabilities?.deviceModel }}
347
+ * </div>
348
+ * </template>
349
+ * ```
350
+ */
351
+ declare function useEdge(options?: UseEdgeOptions): UseEdgeReturn;
352
+
353
+ interface UseBarcodeOptions {
354
+ /** The edge instance to use (from useEdge) */
355
+ edge: ShallowRef<CleverenceEdge | null> | Ref<CleverenceEdge | null>;
356
+ /** Maximum number of scans to keep in history. Default: 50 */
357
+ maxHistory?: number;
358
+ /** Called when a new scan is received */
359
+ onScan?: (event: ScanEvent) => void;
360
+ }
361
+ interface UseBarcodeReturn {
362
+ /** Most recent scan event */
363
+ lastScan: Ref<ScanEvent | null>;
364
+ /** History of scan events (newest first) */
365
+ scanHistory: Ref<ScanEvent[]>;
366
+ /** Clear the scan history */
367
+ clearHistory: () => void;
368
+ /** Trigger a scan programmatically */
369
+ triggerScan: () => Promise<void>;
370
+ }
371
+ /**
372
+ * Vue composable for barcode scanning
373
+ *
374
+ * @example
375
+ * ```vue
376
+ * <script setup>
377
+ * import { useEdge, useBarcode } from '@cleverence-edge/js-sdk/vue';
378
+ *
379
+ * const { edge } = useEdge();
380
+ * const { lastScan, scanHistory, clearHistory } = useBarcode({ edge });
381
+ * </script>
382
+ *
383
+ * <template>
384
+ * <div>
385
+ * <h1>Last: {{ lastScan?.data }}</h1>
386
+ * <button @click="clearHistory">Clear</button>
387
+ * <ul>
388
+ * <li v-for="scan in scanHistory" :key="scan.id">
389
+ * {{ scan.data }} ({{ scan.symbology }})
390
+ * </li>
391
+ * </ul>
392
+ * </div>
393
+ * </template>
394
+ * ```
395
+ */
396
+ declare function useBarcode(options: UseBarcodeOptions): UseBarcodeReturn;
397
+
398
+ interface UseRfidOptions {
399
+ /** The edge instance to use (from useEdge) */
400
+ edge: ShallowRef<CleverenceEdge | null> | Ref<CleverenceEdge | null>;
401
+ /** Called when a new RFID tag is read */
402
+ onRead?: (event: RfidEvent) => void;
403
+ }
404
+ interface UseRfidReturn {
405
+ /** Most recent RFID read event */
406
+ lastRead: Ref<RfidEvent | null>;
407
+ /** Aggregated list of unique tags (by EPC) */
408
+ tags: Ref<Map<string, RfidTag>>;
409
+ /** Whether an inventory is currently active */
410
+ isInventoryActive: Ref<boolean>;
411
+ /** Start RFID inventory */
412
+ startInventory: (options?: RfidInventoryOptions) => Promise<void>;
413
+ /** Stop RFID inventory */
414
+ stopInventory: () => Promise<void>;
415
+ /** Clear the tags list */
416
+ clearTags: () => void;
417
+ }
418
+ /**
419
+ * Vue composable for RFID reading
420
+ *
421
+ * @example
422
+ * ```vue
423
+ * <script setup>
424
+ * import { useEdge, useRfid } from '@cleverence-edge/js-sdk/vue';
425
+ *
426
+ * const { edge } = useEdge();
427
+ * const { tags, isInventoryActive, startInventory, stopInventory } = useRfid({ edge });
428
+ * </script>
429
+ *
430
+ * <template>
431
+ * <div>
432
+ * <button @click="isInventoryActive ? stopInventory() : startInventory()">
433
+ * {{ isInventoryActive ? 'Stop' : 'Start' }} Inventory
434
+ * </button>
435
+ * <p>{{ tags.size }} unique tags found</p>
436
+ * <ul>
437
+ * <li v-for="[epc, tag] in tags" :key="epc">
438
+ * {{ tag.epc }} (RSSI: {{ tag.rssi }}, Count: {{ tag.readCount }})
439
+ * </li>
440
+ * </ul>
441
+ * </div>
442
+ * </template>
443
+ * ```
444
+ */
445
+ declare function useRfid(options: UseRfidOptions): UseRfidReturn;
446
+
447
+ export { type ConnectionState, type DeviceCapabilities, type EdgeConfig, type EdgeOptions, type EdgeStatus, type RfidEvent, type RfidInventoryOptions, type RfidTag, type ScanEvent, type UseBarcodeOptions, type UseBarcodeReturn, type UseEdgeOptions, type UseEdgeReturn, type UseRfidOptions, type UseRfidReturn, useBarcode, useEdge, useRfid };