UNPKG

sunmi-device-sdk

Version:

JavaScript SDK for Sunmi card readers and printers

247 lines (202 loc) 5.99 kB
/** * TypeScript Usage Examples * Shows type-safe usage of the Sunmi Device SDK */ import { SunmiCardReader, SunmiPrinter, CardReadResult, CardType, MifareKeyType, PrintAlignment, BarcodeTextPosition, PrinterStatus } from '@sunmi/device-sdk'; // ============================================================ // CARD READER WITH TYPES // ============================================================ async function readCardWithTypes(): Promise<void> { try { // Type-safe card reading const result: CardReadResult = await SunmiCardReader.startReadCard([ CardType.MIFARE, CardType.IC ]); console.log('Card UID:', result.uid); console.log('Card Type:', result.cardType); // Type-safe Mifare operations if (result.cardType === CardType.MIFARE) { const blockNumber = 4; await SunmiCardReader.authMifare( 'FFFFFFFFFFFF', MifareKeyType.KEY_A, blockNumber ); const data: string = await SunmiCardReader.readBlockMifare(blockNumber); console.log('Block data:', data); } } catch (error) { console.error('Error reading card:', error); } } // ============================================================ // PRINTER WITH TYPES // ============================================================ interface ReceiptItem { name: string; price: number; quantity: number; } interface Receipt { storeName: string; items: ReceiptItem[]; tax: number; total: number; timestamp: Date; } async function printTypedReceipt(receipt: Receipt): Promise<void> { try { await SunmiPrinter.init(); // Header await SunmiPrinter.setAlignment(PrintAlignment.CENTER); await SunmiPrinter.setFontSize(28); await SunmiPrinter.printText(receipt.storeName); await SunmiPrinter.feedPaper(1); // Date await SunmiPrinter.setFontSize(18); await SunmiPrinter.printText(receipt.timestamp.toLocaleString()); await SunmiPrinter.feedPaper(2); // Items await SunmiPrinter.setAlignment(PrintAlignment.LEFT); await SunmiPrinter.setFontSize(20); for (const item of receipt.items) { const itemTotal = item.price * item.quantity; await SunmiPrinter.printColumns( [ `${item.name} x${item.quantity}`, itemTotal.toFixed(2) ], [24, 6], [PrintAlignment.LEFT, PrintAlignment.RIGHT] ); } // Subtotal, tax, total await SunmiPrinter.feedPaper(1); const subtotal = receipt.total - receipt.tax; await SunmiPrinter.printColumns( ['Subtotal', subtotal.toFixed(2)], [24, 6], [PrintAlignment.LEFT, PrintAlignment.RIGHT] ); await SunmiPrinter.printColumns( ['Tax', receipt.tax.toFixed(2)], [24, 6], [PrintAlignment.LEFT, PrintAlignment.RIGHT] ); await SunmiPrinter.feedPaper(1); await SunmiPrinter.setFontSize(24); await SunmiPrinter.printColumns( ['TOTAL', receipt.total.toFixed(2)], [24, 6], [PrintAlignment.LEFT, PrintAlignment.RIGHT] ); await SunmiPrinter.feedPaper(3); } catch (error) { console.error('Print failed:', error); throw error; } } // ============================================================ // BARCODE PRINTING // ============================================================ async function printProductLabel( productName: string, barcode: string, price: number ): Promise<void> { try { await SunmiPrinter.init(); await SunmiPrinter.setAlignment(PrintAlignment.CENTER); // Product name await SunmiPrinter.setFontSize(24); await SunmiPrinter.printText(productName); await SunmiPrinter.feedPaper(1); // Barcode await SunmiPrinter.printBarcode( barcode, 'CODE128', 380, 162, BarcodeTextPosition.BELOW ); await SunmiPrinter.feedPaper(1); // Price await SunmiPrinter.setFontSize(28); await SunmiPrinter.printText(`$${price.toFixed(2)}`); await SunmiPrinter.feedPaper(3); } catch (error) { console.error('Failed to print label:', error); throw error; } } // ============================================================ // PRINTER STATUS MONITORING // ============================================================ class PrinterStatusMonitor { private isMonitoring: boolean = false; start(onStatusChange: (status: PrinterStatus) => void): void { if (this.isMonitoring) { console.warn('Already monitoring printer status'); return; } this.isMonitoring = true; SunmiPrinter.startStatusListener((status: PrinterStatus) => { console.log(`[Printer Status] ${status}`); onStatusChange(status); }); } stop(): void { if (!this.isMonitoring) { return; } SunmiPrinter.stopStatusListener(); this.isMonitoring = false; } } // ============================================================ // USAGE EXAMPLE // ============================================================ async function example(): Promise<void> { // Read a card await readCardWithTypes(); // Print a receipt const receipt: Receipt = { storeName: 'Coffee Shop', items: [ { name: 'Espresso', price: 3.50, quantity: 2 }, { name: 'Croissant', price: 2.50, quantity: 1 } ], tax: 0.95, total: 10.45, timestamp: new Date() }; await printTypedReceipt(receipt); // Print product label await printProductLabel('Blue Widget', '1234567890123', 19.99); // Monitor printer const monitor = new PrinterStatusMonitor(); monitor.start((status) => { if (status === PrinterStatus.OUT_OF_PAPER) { console.error('Out of paper!'); } }); // Stop monitoring after 5 minutes setTimeout(() => monitor.stop(), 5 * 60 * 1000); } export { readCardWithTypes, printTypedReceipt, printProductLabel, PrinterStatusMonitor, example };