sunmi-device-sdk
Version:
JavaScript SDK for Sunmi card readers and printers
247 lines (202 loc) • 5.99 kB
text/typescript
/**
* 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
};