@stackflow-lab/tef-elgin 2.0.3 → 2.1.1
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/dist/index.cjs +16 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -146,6 +146,18 @@ function getWorkerPath() {
|
|
|
146
146
|
return (0, import_node_path.join)(dir, "worker.js");
|
|
147
147
|
}
|
|
148
148
|
var Client = class _Client extends import_node_events.EventEmitter {
|
|
149
|
+
on(event, listener) {
|
|
150
|
+
return super.on(event, listener);
|
|
151
|
+
}
|
|
152
|
+
once(event, listener) {
|
|
153
|
+
return super.once(event, listener);
|
|
154
|
+
}
|
|
155
|
+
off(event, listener) {
|
|
156
|
+
return super.off(event, listener);
|
|
157
|
+
}
|
|
158
|
+
emit(event, ...args) {
|
|
159
|
+
return super.emit(event, ...args);
|
|
160
|
+
}
|
|
149
161
|
worker = null;
|
|
150
162
|
mockDll = null;
|
|
151
163
|
// Para testes
|
|
@@ -431,17 +443,19 @@ var Client = class _Client extends import_node_events.EventEmitter {
|
|
|
431
443
|
let shouldCancel = false;
|
|
432
444
|
if (type && !option) {
|
|
433
445
|
this._log("\u{1F4DD} Emitting collect:text", { message, type, mask });
|
|
446
|
+
const collectPromise = this._waitCollect();
|
|
434
447
|
this.emit("display", message);
|
|
435
448
|
this.emit("collect:text", { message, type, mask });
|
|
436
|
-
const result = await
|
|
449
|
+
const result = await collectPromise;
|
|
437
450
|
info = result.info;
|
|
438
451
|
shouldCancel = result.cancel;
|
|
439
452
|
} else if (type && option) {
|
|
440
453
|
const options = option.split(";").filter(Boolean);
|
|
441
454
|
this._log("\u{1F518} Emitting collect:options", { message, options });
|
|
455
|
+
const collectPromise = this._waitCollect();
|
|
442
456
|
this.emit("display", message);
|
|
443
457
|
this.emit("collect:options", { message, options });
|
|
444
|
-
const result = await
|
|
458
|
+
const result = await collectPromise;
|
|
445
459
|
info = options[Number(result.info)] ?? result.info;
|
|
446
460
|
shouldCancel = result.cancel;
|
|
447
461
|
} else {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["// API principal\r\nexport { Client } from './client.js'\r\nexport { PaymentApi } from './payment.js'\r\nexport { AdminApi } from './admin.js'\r\n\r\nexport type {\r\n PdvConfig,\r\n CollectTextEvent,\r\n CollectOptionsEvent,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n TefClientEvents,\r\n TefResponse,\r\n} from './types.js'\r\n","import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n} from './types.js'\r\n\r\nconst CARD_TYPE_CODE: Record<CardType, number> = {\r\n ask: 0,\r\n credit: 1,\r\n debit: 2,\r\n voucher: 3,\r\n fleet: 4,\r\n 'private-label': 5,\r\n}\r\n\r\nconst ADMIN_OP_CODE: Record<AdminOp, number> = {\r\n ask: 0,\r\n cancel: 1,\r\n pending: 2,\r\n reprint: 3,\r\n}\r\n\r\ntype OperationType = 'payment' | 'pix' | 'admin'\r\n\r\ntype CollectResolve = (value: { info: string; cancel: boolean }) => void\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\n/**\r\n * Resolves the worker path in a CJS and ESM compatible way.\r\n * - ESM / tsx: import.meta.url is available\r\n * - CJS (tsup build): import.meta.url is empty string, uses __dirname\r\n */\r\nfunction getWorkerPath(): string {\r\n const metaUrl = import.meta.url\r\n const dir = metaUrl\r\n ? dirname(fileURLToPath(metaUrl))\r\n : __dirname\r\n\r\n // Dev mode (tsx): worker.ts existe ao lado do source\r\n const tsWorker = join(dir, 'worker.ts')\r\n if (existsSync(tsWorker)) return tsWorker\r\n\r\n // Produção CJS: worker.cjs (compatível com Electron/CJS context)\r\n const cjsWorker = join(dir, 'worker.cjs')\r\n if (existsSync(cjsWorker)) return cjsWorker\r\n\r\n // Produção ESM: worker.js no dist/\r\n return join(dir, 'worker.js')\r\n}\r\n\r\nexport class Client extends EventEmitter<TefClientEvents> {\r\n private worker: Worker | null = null\r\n private mockDll: ElginDll | null = null // Para testes\r\n private operationType: OperationType = 'payment'\r\n private cardType: CardType = 'ask'\r\n private adminOp: AdminOp = 'ask'\r\n private collectResolver: CollectResolve | null = null\r\n private _debugEnabled = false\r\n private workerPromiseResolve: ((value: string) => void) | null = null\r\n private workerPromiseReject: ((reason: any) => void) | null = null\r\n\r\n /** Payment operations - use methods like payment.pix(), payment.credit(), etc. */\r\n public readonly payment: PaymentApi\r\n\r\n /** Administrative operations - use methods like admin.cancel(), admin.pending(), etc. */\r\n public readonly admin: AdminApi\r\n\r\n constructor(dllPathOrInstance?: string | ElginDll) {\r\n super()\r\n \r\n // Se receber um mock da DLL (para testes), usa ele diretamente\r\n if (typeof dllPathOrInstance === 'object' && dllPathOrInstance !== null) {\r\n this.mockDll = dllPathOrInstance\r\n } else {\r\n // Cria Worker Thread com resolução CJS/ESM compatível\r\n this.worker = new Worker(getWorkerPath())\r\n \r\n this.worker.on('message', (response: WorkerResponse) => {\r\n if (response.type === 'result') {\r\n this.workerPromiseResolve?.(response.data)\r\n } else if (response.type === 'error') {\r\n this.workerPromiseReject?.(new Error(response.error))\r\n } else if (response.type === 'loaded' || response.type === 'configured' || response.type === 'unloaded') {\r\n this.workerPromiseResolve?.('')\r\n }\r\n })\r\n \r\n this.worker.on('error', (error) => {\r\n this.workerPromiseReject?.(error)\r\n })\r\n \r\n // Carrega a DLL no worker\r\n this._sendToWorker({ type: 'load', dllPath: typeof dllPathOrInstance === 'string' ? dllPathOrInstance : undefined })\r\n }\r\n\r\n this.payment = new PaymentApi(this)\r\n this.admin = new AdminApi(this)\r\n }\r\n\r\n /**\r\n * Creates a new Client instance\r\n * @param dllPath - Optional path to the DLL (defaults to C:\\Elgin\\TEF\\E1_Tef01.dll)\r\n */\r\n static instance(dllPath?: string): Client {\r\n return new Client(dllPath)\r\n }\r\n\r\n // Debug\r\n\r\n /**\r\n * Enables debug logging to see all DLL calls, responses, and events\r\n */\r\n enableDebug(): void {\r\n this._debugEnabled = true\r\n this._log('🐛 Debug mode enabled')\r\n }\r\n\r\n /**\r\n * Disables debug logging\r\n */\r\n disableDebug(): void {\r\n this._log('🐛 Debug mode disabled')\r\n this._debugEnabled = false\r\n }\r\n\r\n private _log(message: string, data?: unknown): void {\r\n if (!this._debugEnabled) return\r\n const timestamp = new Date().toISOString().split('T')[1].slice(0, 12)\r\n if (data !== undefined) {\r\n console.log(`[${timestamp}] ${message}`, data)\r\n } else {\r\n console.log(`[${timestamp}] ${message}`)\r\n }\r\n }\r\n\r\n // Worker communication\r\n\r\n private _sendToWorker(message: any): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n if (this.mockDll) {\r\n // Modo teste: executa sincronamente com mock\r\n try {\r\n let result = ''\r\n switch (message.type) {\r\n case 'load':\r\n case 'configured':\r\n case 'unload':\r\n result = ''\r\n break\r\n case 'IniciarOperacaoTEF':\r\n result = this.mockDll.IniciarOperacaoTEF(message.payload)\r\n break\r\n case 'RealizarPagamentoTEF':\r\n result = this.mockDll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'RealizarPixTEF':\r\n result = this.mockDll.RealizarPixTEF(message.payload, message.isNew)\r\n break\r\n case 'RealizarAdmTEF':\r\n result = this.mockDll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'ConfirmarOperacaoTEF':\r\n result = this.mockDll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n break\r\n case 'FinalizarOperacaoTEF':\r\n result = this.mockDll.FinalizarOperacaoTEF(message.id)\r\n break\r\n case 'configure':\r\n this.mockDll.SetClientTCP(message.ip, message.port)\r\n this.mockDll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n result = ''\r\n break\r\n }\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n } else if (this.worker) {\r\n // Modo produção: envia para worker\r\n this.workerPromiseResolve = resolve\r\n this.workerPromiseReject = reject\r\n this.worker.postMessage(message)\r\n } else {\r\n reject(new Error('Worker not initialized'))\r\n }\r\n })\r\n }\r\n\r\n // Configuration\r\n\r\n async configure(ip: string, port: number, pdv: PdvConfig): Promise<void> {\r\n this._log('📡 Configuring client', { ip, port, pdv })\r\n await this._sendToWorker({\r\n type: 'configure',\r\n ip,\r\n port,\r\n pdv,\r\n })\r\n }\r\n\r\n // User response\r\n\r\n /** @internal */\r\n async _executePayment(card: CardType, amount: string): Promise<void> {\r\n this._log('💳 Starting payment', { card, amount })\r\n this.operationType = 'payment'\r\n this.cardType = card\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executePix(amount: string): Promise<void> {\r\n this._log('💰 Starting PIX', { amount })\r\n this.operationType = 'pix'\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executeAdmin(op: AdminOp): Promise<void> {\r\n this._log('🔧 Starting admin operation', { op })\r\n this.operationType = 'admin'\r\n this.adminOp = op\r\n await this._run('')\r\n }\r\n\r\n // User response\r\n\r\n /** Sends the user's input to the pending collect request */\r\n input(info: string): void {\r\n this._log('📤 User input', info)\r\n this.collectResolver?.({ info, cancel: false })\r\n this.collectResolver = null\r\n }\r\n\r\n /** Cancels the pending collect request */\r\n cancel(): void {\r\n this._log('🚫 User cancelled')\r\n this.collectResolver?.({ info: '0', cancel: true })\r\n this.collectResolver = null\r\n }\r\n\r\n unload(): void {\r\n if (this.worker) {\r\n this._sendToWorker({ type: 'unload' }).then(() => {\r\n this.worker?.terminate()\r\n this.worker = null\r\n })\r\n } else if (this.mockDll) {\r\n this.mockDll.unload()\r\n }\r\n }\r\n\r\n // Internal flow\r\n\r\n private async _run(amount: string): Promise<void> {\r\n // 1) Start session\r\n this._log('🚀 Starting TEF session')\r\n const raw = await this._sendToWorker({ type: 'IniciarOperacaoTEF', payload: '{}' })\r\n const startResp = this._parse(raw)\r\n this._log('📥 IniciarOperacaoTEF response', startResp)\r\n \r\n if (!startResp.tef) {\r\n this._log('⚠️ IniciarOperacaoTEF error', { codigo: startResp.codigo, mensagem: startResp.mensagem })\r\n console.error('\\n❌ Failed to start TEF operation:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n \r\n if (startResp.tef.retorno !== '1') {\r\n this.emit('error', startResp.tef.retorno ?? '-1', 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 2) Increment sequence number\r\n const seq = this._nextSeq(startResp.tef.sequencial ?? '0')\r\n this._log('🔢 Sequence number', seq)\r\n const payload: Record<string, unknown> = { sequencial: seq }\r\n if (amount) payload.valorTotal = amount.replace(/\\D/g, '')\r\n\r\n // 3) Start transaction\r\n let resp = await this._callTransaction(payload, true)\r\n\r\n // Check for DLL-level errors\r\n if (!resp.tef) {\r\n this._log('⚠️ DLL error response', { codigo: resp.codigo, mensagem: resp.mensagem })\r\n console.error('\\n❌ DLL error:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'DLL error')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 4) Collect loop\r\n resp = await this._collectLoop(resp)\r\n\r\n // Safety check after collect loop\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef after collect loop')\r\n console.error('\\n❌ Invalid response after collect:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Invalid DLL response')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 5) Check result\r\n const retorno = resp.tef.retorno ?? ''\r\n this._log('🏁 Transaction result', { retorno })\r\n if (retorno === '0' || retorno === '1') {\r\n const store = (resp.tef.comprovanteDiferenciadoLoja as string) ?? ''\r\n const customer = (resp.tef.comprovanteDiferenciadoPortador as string) ?? ''\r\n\r\n if (store || customer) {\r\n const printEvent: PrintEvent = { store, customer }\r\n this._log('🖨️ Emitting print', { storeLines: store.split('\\n').length, customerLines: customer.split('\\n').length })\r\n this.emit('print', printEvent)\r\n }\r\n\r\n const event: ApprovedEvent = {\r\n sequenceId: resp.tef.sequencial ?? seq,\r\n needsConfirmation: retorno === '0',\r\n // Transaction details\r\n acquirerDocument: resp.tef.cnpjCredenciadora as string | undefined,\r\n authorizationCode: resp.tef.codigoAutorizacao as string | undefined,\r\n transactionDateTime: resp.tef.dataHoraTransacao as string | undefined,\r\n paymentMethod: resp.tef.formaPagamento as string | undefined,\r\n merchantId: resp.tef.identificadorEstabelecimento as string | undefined,\r\n terminalId: resp.tef.identificadorPontoCaptura as string | undefined,\r\n message: resp.tef.mensagemResultado as string | undefined,\r\n cardBrand: resp.tef.nomeBandeira as string | undefined,\r\n merchantName: resp.tef.nomeEstabelecimento as string | undefined,\r\n provider: resp.tef.nomeProvedor as string | undefined,\r\n nsu: resp.tef.nsuTerminal as string | undefined,\r\n maskedPan: resp.tef.panMascarado as string | undefined,\r\n result: resp.tef.resultadoTransacao as string | undefined,\r\n service: resp.tef.servico as string | undefined,\r\n cardType: resp.tef.tipoCartao as string | undefined,\r\n transaction: resp.tef.transacao as string | undefined,\r\n uniqueId: resp.tef.uniqueID as string | undefined,\r\n totalAmount: resp.tef.valorTotal as string | undefined,\r\n }\r\n this._log('✅ Emitting approved', event)\r\n this.emit('approved', event)\r\n\r\n if (retorno === '0') {\r\n await this._confirm(Number(event.sequenceId))\r\n }\r\n } else {\r\n this._log('❌ Emitting declined', { retorno })\r\n this.emit('declined', retorno, 'Transaction declined')\r\n }\r\n\r\n // 6) End session\r\n await this._finalize()\r\n }\r\n\r\n private async _collectLoop(resp: TefResponse): Promise<TefResponse> {\r\n // Safety check: ensure tef object exists\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef object', resp)\r\n console.error('\\n⚠️ Response missing tef object:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n return resp\r\n }\r\n\r\n if (resp.tef.retorno !== undefined && resp.tef.retorno !== '') {\r\n return resp\r\n }\r\n\r\n const collectStatus = resp.tef.automacao_coleta_retorno ?? ''\r\n if (collectStatus !== '0') {\r\n return resp\r\n }\r\n\r\n const message = (resp.tef.mensagemResultado as string) ?? ''\r\n const type = resp.tef.automacao_coleta_tipo ?? ''\r\n const option = resp.tef.automacao_coleta_opcao ?? ''\r\n const mask = resp.tef.automacao_coleta_mascara as string | undefined\r\n const collectSeq = resp.tef.automacao_coleta_sequencial ?? ''\r\n\r\n let info = ''\r\n let shouldCancel = false\r\n\r\n if (type && !option) {\r\n // Free-text collect\r\n this._log('📝 Emitting collect:text', { message, type, mask })\r\n this.emit('display', message)\r\n this.emit('collect:text', { message, type, mask })\r\n const result = await this._waitCollect()\r\n info = result.info\r\n shouldCancel = result.cancel\r\n } else if (type && option) {\r\n // Option list collect\r\n const options = option.split(';').filter(Boolean)\r\n this._log('🔘 Emitting collect:options', { message, options })\r\n this.emit('display', message)\r\n this.emit('collect:options', { message, options })\r\n const result = await this._waitCollect()\r\n info = options[Number(result.info)] ?? result.info\r\n shouldCancel = result.cancel\r\n } else {\r\n // Informational message — continue automatically\r\n this._log('⏳ Emitting waiting', message)\r\n this.emit('waiting', message)\r\n\r\n const qrData = this._extractQrCode(resp.tef)\r\n if (qrData) {\r\n const qrEvent: QrCodeEvent = { data: qrData }\r\n this._log('📱 Emitting qrcode', { dataLength: qrData.length })\r\n this.emit('qrcode', qrEvent)\r\n }\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n automacao_coleta_retorno: shouldCancel ? '9' : '0',\r\n automacao_coleta_sequencial: collectSeq,\r\n automacao_coleta_informacao: info,\r\n }\r\n\r\n const next = await this._callTransaction(payload, false)\r\n return this._collectLoop(next)\r\n }\r\n\r\n private async _callTransaction(\r\n payload: Record<string, unknown>,\r\n isNew: boolean,\r\n ): Promise<TefResponse> {\r\n const json = JSON.stringify(payload)\r\n this._log(`📞 Calling ${this.operationType} TEF`, { payload, isNew })\r\n let raw: string\r\n\r\n if (this.operationType === 'pix') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPixTEF',\r\n payload: json,\r\n isNew,\r\n })\r\n } else if (this.operationType === 'admin') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarAdmTEF',\r\n code: ADMIN_OP_CODE[this.adminOp],\r\n payload: json,\r\n isNew,\r\n })\r\n } else {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPagamentoTEF',\r\n code: CARD_TYPE_CODE[this.cardType],\r\n payload: json,\r\n isNew,\r\n })\r\n }\r\n\r\n const response = this._parse(raw)\r\n this._log('📥 DLL Response', response)\r\n return response\r\n }\r\n\r\n private async _confirm(sequenceId: number): Promise<void> {\r\n this._log('✔️ Confirming transaction', { sequenceId })\r\n await this._sendToWorker({\r\n type: 'ConfirmarOperacaoTEF',\r\n sequenceId,\r\n action: 1,\r\n })\r\n this.emit('confirmed')\r\n }\r\n\r\n private async _finalize(): Promise<void> {\r\n this._log('🏁 Finalizing operation')\r\n await this._sendToWorker({\r\n type: 'FinalizarOperacaoTEF',\r\n id: 1,\r\n })\r\n this.emit('finished')\r\n }\r\n\r\n private _waitCollect(): Promise<{ info: string; cancel: boolean }> {\r\n return new Promise((resolve) => {\r\n this.collectResolver = resolve\r\n })\r\n }\r\n\r\n private _parse(raw: string): TefResponse {\r\n try {\r\n return JSON.parse(raw) as TefResponse\r\n } catch {\r\n return { codigo: -1, mensagem: 'Failed to parse DLL response' }\r\n }\r\n }\r\n\r\n private _nextSeq(current: string): string {\r\n const n = Number(current)\r\n return isNaN(n) ? '1' : String(n + 1)\r\n }\r\n\r\n private _extractQrCode(tef: TefResponse['tef']): string | undefined {\r\n if (!tef) return undefined\r\n return (tef.qrCode ?? tef.QRCode ?? tef.pixQrCode ?? tef.codigoPix) as string | undefined\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Payment operations API — provides dedicated methods for each payment type\r\n */\r\nexport class PaymentApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * PIX payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async pix(amount: number): Promise<void> {\r\n return this.client._executePix(amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Credit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async credit(amount: number): Promise<void> {\r\n return this.client._executePayment('credit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Debit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async debit(amount: number): Promise<void> {\r\n return this.client._executePayment('debit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Voucher card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async voucher(amount: number): Promise<void> {\r\n return this.client._executePayment('voucher', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Fleet card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async fleet(amount: number): Promise<void> {\r\n return this.client._executePayment('fleet', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Private label card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async privateLabel(amount: number): Promise<void> {\r\n return this.client._executePayment('private-label', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Ask user which card type to use\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async ask(amount: number): Promise<void> {\r\n return this.client._executePayment('ask', amount.toFixed(2))\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Administrative operations API\r\n */\r\nexport class AdminApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * Ask user which administrative operation to perform\r\n */\r\n async ask(): Promise<void> {\r\n return this.client._executeAdmin('ask')\r\n }\r\n\r\n /**\r\n * Cancel a previous transaction\r\n */\r\n async cancel(): Promise<void> {\r\n return this.client._executeAdmin('cancel')\r\n }\r\n\r\n /**\r\n * Check for pending transactions\r\n */\r\n async pending(): Promise<void> {\r\n return this.client._executeAdmin('pending')\r\n }\r\n\r\n /**\r\n * Reprint last receipt\r\n */\r\n async reprint(): Promise<void> {\r\n return this.client._executeAdmin('reprint')\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["// API principal\r\nexport { Client } from './client.js'\r\nexport { PaymentApi } from './payment.js'\r\nexport { AdminApi } from './admin.js'\r\n\r\nexport type {\r\n PdvConfig,\r\n CollectTextEvent,\r\n CollectOptionsEvent,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n TefClientEvents,\r\n TefResponse,\r\n} from './types.js'\r\n","import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n CollectTextEvent,\r\n CollectOptionsEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n} from './types.js'\r\n\r\nconst CARD_TYPE_CODE: Record<CardType, number> = {\r\n ask: 0,\r\n credit: 1,\r\n debit: 2,\r\n voucher: 3,\r\n fleet: 4,\r\n 'private-label': 5,\r\n}\r\n\r\nconst ADMIN_OP_CODE: Record<AdminOp, number> = {\r\n ask: 0,\r\n cancel: 1,\r\n pending: 2,\r\n reprint: 3,\r\n}\r\n\r\ntype OperationType = 'payment' | 'pix' | 'admin'\r\n\r\ntype CollectResolve = (value: { info: string; cancel: boolean }) => void\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\n/**\r\n * Resolves the worker path in a CJS and ESM compatible way.\r\n * - ESM / tsx: import.meta.url is available\r\n * - CJS (tsup build): import.meta.url is empty string, uses __dirname\r\n */\r\nfunction getWorkerPath(): string {\r\n const metaUrl = import.meta.url\r\n const dir = metaUrl\r\n ? dirname(fileURLToPath(metaUrl))\r\n : __dirname\r\n\r\n // Dev mode (tsx): worker.ts existe ao lado do source\r\n const tsWorker = join(dir, 'worker.ts')\r\n if (existsSync(tsWorker)) return tsWorker\r\n\r\n // Produção CJS: worker.cjs (compatível com Electron/CJS context)\r\n const cjsWorker = join(dir, 'worker.cjs')\r\n if (existsSync(cjsWorker)) return cjsWorker\r\n\r\n // Produção ESM: worker.js no dist/\r\n return join(dir, 'worker.js')\r\n}\r\n\r\nexport class Client extends EventEmitter {\r\n // Typed overloads for EventEmitter methods (compatible with all @types/node versions)\r\n on<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n on(event: string | symbol, listener: (...args: any[]) => void): this\r\n on(event: string | symbol, listener: (...args: any[]) => void): this { return super.on(event, listener) }\r\n\r\n once<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n once(event: string | symbol, listener: (...args: any[]) => void): this\r\n once(event: string | symbol, listener: (...args: any[]) => void): this { return super.once(event, listener) }\r\n\r\n off<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n off(event: string | symbol, listener: (...args: any[]) => void): this\r\n off(event: string | symbol, listener: (...args: any[]) => void): this { return super.off(event, listener) }\r\n\r\n emit<K extends keyof TefClientEvents>(event: K, ...args: TefClientEvents[K]): boolean\r\n emit(event: string | symbol, ...args: any[]): boolean\r\n emit(event: string | symbol, ...args: any[]): boolean { return super.emit(event, ...args) }\r\n\r\n private worker: Worker | null = null\r\n private mockDll: ElginDll | null = null // Para testes\r\n private operationType: OperationType = 'payment'\r\n private cardType: CardType = 'ask'\r\n private adminOp: AdminOp = 'ask'\r\n private collectResolver: CollectResolve | null = null\r\n private _debugEnabled = false\r\n private workerPromiseResolve: ((value: string) => void) | null = null\r\n private workerPromiseReject: ((reason: any) => void) | null = null\r\n\r\n /** Payment operations - use methods like payment.pix(), payment.credit(), etc. */\r\n public readonly payment: PaymentApi\r\n\r\n /** Administrative operations - use methods like admin.cancel(), admin.pending(), etc. */\r\n public readonly admin: AdminApi\r\n\r\n constructor(dllPathOrInstance?: string | ElginDll) {\r\n super()\r\n \r\n // Se receber um mock da DLL (para testes), usa ele diretamente\r\n if (typeof dllPathOrInstance === 'object' && dllPathOrInstance !== null) {\r\n this.mockDll = dllPathOrInstance\r\n } else {\r\n // Cria Worker Thread com resolução CJS/ESM compatível\r\n this.worker = new Worker(getWorkerPath())\r\n \r\n this.worker.on('message', (response: WorkerResponse) => {\r\n if (response.type === 'result') {\r\n this.workerPromiseResolve?.(response.data)\r\n } else if (response.type === 'error') {\r\n this.workerPromiseReject?.(new Error(response.error))\r\n } else if (response.type === 'loaded' || response.type === 'configured' || response.type === 'unloaded') {\r\n this.workerPromiseResolve?.('')\r\n }\r\n })\r\n \r\n this.worker.on('error', (error) => {\r\n this.workerPromiseReject?.(error)\r\n })\r\n \r\n // Carrega a DLL no worker\r\n this._sendToWorker({ type: 'load', dllPath: typeof dllPathOrInstance === 'string' ? dllPathOrInstance : undefined })\r\n }\r\n\r\n this.payment = new PaymentApi(this)\r\n this.admin = new AdminApi(this)\r\n }\r\n\r\n /**\r\n * Creates a new Client instance\r\n * @param dllPath - Optional path to the DLL (defaults to C:\\Elgin\\TEF\\E1_Tef01.dll)\r\n */\r\n static instance(dllPath?: string): Client {\r\n return new Client(dllPath)\r\n }\r\n\r\n // Debug\r\n\r\n /**\r\n * Enables debug logging to see all DLL calls, responses, and events\r\n */\r\n enableDebug(): void {\r\n this._debugEnabled = true\r\n this._log('🐛 Debug mode enabled')\r\n }\r\n\r\n /**\r\n * Disables debug logging\r\n */\r\n disableDebug(): void {\r\n this._log('🐛 Debug mode disabled')\r\n this._debugEnabled = false\r\n }\r\n\r\n private _log(message: string, data?: unknown): void {\r\n if (!this._debugEnabled) return\r\n const timestamp = new Date().toISOString().split('T')[1].slice(0, 12)\r\n if (data !== undefined) {\r\n console.log(`[${timestamp}] ${message}`, data)\r\n } else {\r\n console.log(`[${timestamp}] ${message}`)\r\n }\r\n }\r\n\r\n // Worker communication\r\n\r\n private _sendToWorker(message: any): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n if (this.mockDll) {\r\n // Modo teste: executa sincronamente com mock\r\n try {\r\n let result = ''\r\n switch (message.type) {\r\n case 'load':\r\n case 'configured':\r\n case 'unload':\r\n result = ''\r\n break\r\n case 'IniciarOperacaoTEF':\r\n result = this.mockDll.IniciarOperacaoTEF(message.payload)\r\n break\r\n case 'RealizarPagamentoTEF':\r\n result = this.mockDll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'RealizarPixTEF':\r\n result = this.mockDll.RealizarPixTEF(message.payload, message.isNew)\r\n break\r\n case 'RealizarAdmTEF':\r\n result = this.mockDll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'ConfirmarOperacaoTEF':\r\n result = this.mockDll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n break\r\n case 'FinalizarOperacaoTEF':\r\n result = this.mockDll.FinalizarOperacaoTEF(message.id)\r\n break\r\n case 'configure':\r\n this.mockDll.SetClientTCP(message.ip, message.port)\r\n this.mockDll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n result = ''\r\n break\r\n }\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n } else if (this.worker) {\r\n // Modo produção: envia para worker\r\n this.workerPromiseResolve = resolve\r\n this.workerPromiseReject = reject\r\n this.worker.postMessage(message)\r\n } else {\r\n reject(new Error('Worker not initialized'))\r\n }\r\n })\r\n }\r\n\r\n // Configuration\r\n\r\n async configure(ip: string, port: number, pdv: PdvConfig): Promise<void> {\r\n this._log('📡 Configuring client', { ip, port, pdv })\r\n await this._sendToWorker({\r\n type: 'configure',\r\n ip,\r\n port,\r\n pdv,\r\n })\r\n }\r\n\r\n // User response\r\n\r\n /** @internal */\r\n async _executePayment(card: CardType, amount: string): Promise<void> {\r\n this._log('💳 Starting payment', { card, amount })\r\n this.operationType = 'payment'\r\n this.cardType = card\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executePix(amount: string): Promise<void> {\r\n this._log('💰 Starting PIX', { amount })\r\n this.operationType = 'pix'\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executeAdmin(op: AdminOp): Promise<void> {\r\n this._log('🔧 Starting admin operation', { op })\r\n this.operationType = 'admin'\r\n this.adminOp = op\r\n await this._run('')\r\n }\r\n\r\n // User response\r\n\r\n /** Sends the user's input to the pending collect request */\r\n input(info: string): void {\r\n this._log('📤 User input', info)\r\n this.collectResolver?.({ info, cancel: false })\r\n this.collectResolver = null\r\n }\r\n\r\n /** Cancels the pending collect request */\r\n cancel(): void {\r\n this._log('🚫 User cancelled')\r\n this.collectResolver?.({ info: '0', cancel: true })\r\n this.collectResolver = null\r\n }\r\n\r\n unload(): void {\r\n if (this.worker) {\r\n this._sendToWorker({ type: 'unload' }).then(() => {\r\n this.worker?.terminate()\r\n this.worker = null\r\n })\r\n } else if (this.mockDll) {\r\n this.mockDll.unload()\r\n }\r\n }\r\n\r\n // Internal flow\r\n\r\n private async _run(amount: string): Promise<void> {\r\n // 1) Start session\r\n this._log('🚀 Starting TEF session')\r\n const raw = await this._sendToWorker({ type: 'IniciarOperacaoTEF', payload: '{}' })\r\n const startResp = this._parse(raw)\r\n this._log('📥 IniciarOperacaoTEF response', startResp)\r\n \r\n if (!startResp.tef) {\r\n this._log('⚠️ IniciarOperacaoTEF error', { codigo: startResp.codigo, mensagem: startResp.mensagem })\r\n console.error('\\n❌ Failed to start TEF operation:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n \r\n if (startResp.tef.retorno !== '1') {\r\n this.emit('error', startResp.tef.retorno ?? '-1', 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 2) Increment sequence number\r\n const seq = this._nextSeq(startResp.tef.sequencial ?? '0')\r\n this._log('🔢 Sequence number', seq)\r\n const payload: Record<string, unknown> = { sequencial: seq }\r\n if (amount) payload.valorTotal = amount.replace(/\\D/g, '')\r\n\r\n // 3) Start transaction\r\n let resp = await this._callTransaction(payload, true)\r\n\r\n // Check for DLL-level errors\r\n if (!resp.tef) {\r\n this._log('⚠️ DLL error response', { codigo: resp.codigo, mensagem: resp.mensagem })\r\n console.error('\\n❌ DLL error:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'DLL error')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 4) Collect loop\r\n resp = await this._collectLoop(resp)\r\n\r\n // Safety check after collect loop\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef after collect loop')\r\n console.error('\\n❌ Invalid response after collect:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Invalid DLL response')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 5) Check result\r\n const retorno = resp.tef.retorno ?? ''\r\n this._log('🏁 Transaction result', { retorno })\r\n if (retorno === '0' || retorno === '1') {\r\n const store = (resp.tef.comprovanteDiferenciadoLoja as string) ?? ''\r\n const customer = (resp.tef.comprovanteDiferenciadoPortador as string) ?? ''\r\n\r\n if (store || customer) {\r\n const printEvent: PrintEvent = { store, customer }\r\n this._log('🖨️ Emitting print', { storeLines: store.split('\\n').length, customerLines: customer.split('\\n').length })\r\n this.emit('print', printEvent)\r\n }\r\n\r\n const event: ApprovedEvent = {\r\n sequenceId: resp.tef.sequencial ?? seq,\r\n needsConfirmation: retorno === '0',\r\n // Transaction details\r\n acquirerDocument: resp.tef.cnpjCredenciadora as string | undefined,\r\n authorizationCode: resp.tef.codigoAutorizacao as string | undefined,\r\n transactionDateTime: resp.tef.dataHoraTransacao as string | undefined,\r\n paymentMethod: resp.tef.formaPagamento as string | undefined,\r\n merchantId: resp.tef.identificadorEstabelecimento as string | undefined,\r\n terminalId: resp.tef.identificadorPontoCaptura as string | undefined,\r\n message: resp.tef.mensagemResultado as string | undefined,\r\n cardBrand: resp.tef.nomeBandeira as string | undefined,\r\n merchantName: resp.tef.nomeEstabelecimento as string | undefined,\r\n provider: resp.tef.nomeProvedor as string | undefined,\r\n nsu: resp.tef.nsuTerminal as string | undefined,\r\n maskedPan: resp.tef.panMascarado as string | undefined,\r\n result: resp.tef.resultadoTransacao as string | undefined,\r\n service: resp.tef.servico as string | undefined,\r\n cardType: resp.tef.tipoCartao as string | undefined,\r\n transaction: resp.tef.transacao as string | undefined,\r\n uniqueId: resp.tef.uniqueID as string | undefined,\r\n totalAmount: resp.tef.valorTotal as string | undefined,\r\n }\r\n this._log('✅ Emitting approved', event)\r\n this.emit('approved', event)\r\n\r\n if (retorno === '0') {\r\n await this._confirm(Number(event.sequenceId))\r\n }\r\n } else {\r\n this._log('❌ Emitting declined', { retorno })\r\n this.emit('declined', retorno, 'Transaction declined')\r\n }\r\n\r\n // 6) End session\r\n await this._finalize()\r\n }\r\n\r\n private async _collectLoop(resp: TefResponse): Promise<TefResponse> {\r\n // Safety check: ensure tef object exists\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef object', resp)\r\n console.error('\\n⚠️ Response missing tef object:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n return resp\r\n }\r\n\r\n if (resp.tef.retorno !== undefined && resp.tef.retorno !== '') {\r\n return resp\r\n }\r\n\r\n const collectStatus = resp.tef.automacao_coleta_retorno ?? ''\r\n if (collectStatus !== '0') {\r\n return resp\r\n }\r\n\r\n const message = (resp.tef.mensagemResultado as string) ?? ''\r\n const type = resp.tef.automacao_coleta_tipo ?? ''\r\n const option = resp.tef.automacao_coleta_opcao ?? ''\r\n const mask = resp.tef.automacao_coleta_mascara as string | undefined\r\n const collectSeq = resp.tef.automacao_coleta_sequencial ?? ''\r\n\r\n let info = ''\r\n let shouldCancel = false\r\n\r\n if (type && !option) {\r\n // Free-text collect\r\n this._log('📝 Emitting collect:text', { message, type, mask })\r\n const collectPromise = this._waitCollect()\r\n this.emit('display', message)\r\n this.emit('collect:text', { message, type, mask })\r\n const result = await collectPromise\r\n info = result.info\r\n shouldCancel = result.cancel\r\n } else if (type && option) {\r\n // Option list collect\r\n const options = option.split(';').filter(Boolean)\r\n this._log('🔘 Emitting collect:options', { message, options })\r\n const collectPromise = this._waitCollect()\r\n this.emit('display', message)\r\n this.emit('collect:options', { message, options })\r\n const result = await collectPromise\r\n info = options[Number(result.info)] ?? result.info\r\n shouldCancel = result.cancel\r\n } else {\r\n // Informational message — continue automatically\r\n this._log('⏳ Emitting waiting', message)\r\n this.emit('waiting', message)\r\n\r\n const qrData = this._extractQrCode(resp.tef)\r\n if (qrData) {\r\n const qrEvent: QrCodeEvent = { data: qrData }\r\n this._log('📱 Emitting qrcode', { dataLength: qrData.length })\r\n this.emit('qrcode', qrEvent)\r\n }\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n automacao_coleta_retorno: shouldCancel ? '9' : '0',\r\n automacao_coleta_sequencial: collectSeq,\r\n automacao_coleta_informacao: info,\r\n }\r\n\r\n const next = await this._callTransaction(payload, false)\r\n return this._collectLoop(next)\r\n }\r\n\r\n private async _callTransaction(\r\n payload: Record<string, unknown>,\r\n isNew: boolean,\r\n ): Promise<TefResponse> {\r\n const json = JSON.stringify(payload)\r\n this._log(`📞 Calling ${this.operationType} TEF`, { payload, isNew })\r\n let raw: string\r\n\r\n if (this.operationType === 'pix') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPixTEF',\r\n payload: json,\r\n isNew,\r\n })\r\n } else if (this.operationType === 'admin') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarAdmTEF',\r\n code: ADMIN_OP_CODE[this.adminOp],\r\n payload: json,\r\n isNew,\r\n })\r\n } else {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPagamentoTEF',\r\n code: CARD_TYPE_CODE[this.cardType],\r\n payload: json,\r\n isNew,\r\n })\r\n }\r\n\r\n const response = this._parse(raw)\r\n this._log('📥 DLL Response', response)\r\n return response\r\n }\r\n\r\n private async _confirm(sequenceId: number): Promise<void> {\r\n this._log('✔️ Confirming transaction', { sequenceId })\r\n await this._sendToWorker({\r\n type: 'ConfirmarOperacaoTEF',\r\n sequenceId,\r\n action: 1,\r\n })\r\n this.emit('confirmed')\r\n }\r\n\r\n private async _finalize(): Promise<void> {\r\n this._log('🏁 Finalizing operation')\r\n await this._sendToWorker({\r\n type: 'FinalizarOperacaoTEF',\r\n id: 1,\r\n })\r\n this.emit('finished')\r\n }\r\n\r\n private _waitCollect(): Promise<{ info: string; cancel: boolean }> {\r\n return new Promise((resolve) => {\r\n this.collectResolver = resolve\r\n })\r\n }\r\n\r\n private _parse(raw: string): TefResponse {\r\n try {\r\n return JSON.parse(raw) as TefResponse\r\n } catch {\r\n return { codigo: -1, mensagem: 'Failed to parse DLL response' }\r\n }\r\n }\r\n\r\n private _nextSeq(current: string): string {\r\n const n = Number(current)\r\n return isNaN(n) ? '1' : String(n + 1)\r\n }\r\n\r\n private _extractQrCode(tef: TefResponse['tef']): string | undefined {\r\n if (!tef) return undefined\r\n return (tef.qrCode ?? tef.QRCode ?? tef.pixQrCode ?? tef.codigoPix) as string | undefined\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Payment operations API — provides dedicated methods for each payment type\r\n */\r\nexport class PaymentApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * PIX payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async pix(amount: number): Promise<void> {\r\n return this.client._executePix(amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Credit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async credit(amount: number): Promise<void> {\r\n return this.client._executePayment('credit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Debit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async debit(amount: number): Promise<void> {\r\n return this.client._executePayment('debit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Voucher card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async voucher(amount: number): Promise<void> {\r\n return this.client._executePayment('voucher', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Fleet card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async fleet(amount: number): Promise<void> {\r\n return this.client._executePayment('fleet', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Private label card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async privateLabel(amount: number): Promise<void> {\r\n return this.client._executePayment('private-label', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Ask user which card type to use\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async ask(amount: number): Promise<void> {\r\n return this.client._executePayment('ask', amount.toFixed(2))\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Administrative operations API\r\n */\r\nexport class AdminApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * Ask user which administrative operation to perform\r\n */\r\n async ask(): Promise<void> {\r\n return this.client._executeAdmin('ask')\r\n }\r\n\r\n /**\r\n * Cancel a previous transaction\r\n */\r\n async cancel(): Promise<void> {\r\n return this.client._executeAdmin('cancel')\r\n }\r\n\r\n /**\r\n * Check for pending transactions\r\n */\r\n async pending(): Promise<void> {\r\n return this.client._executeAdmin('pending')\r\n }\r\n\r\n /**\r\n * Reprint last receipt\r\n */\r\n async reprint(): Promise<void> {\r\n return this.client._executeAdmin('reprint')\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -176,7 +176,15 @@ interface TefClientEvents {
|
|
|
176
176
|
error: [code: string, message: string];
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
declare class Client extends EventEmitter
|
|
179
|
+
declare class Client extends EventEmitter {
|
|
180
|
+
on<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
181
|
+
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
182
|
+
once<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
183
|
+
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
184
|
+
off<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
185
|
+
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
186
|
+
emit<K extends keyof TefClientEvents>(event: K, ...args: TefClientEvents[K]): boolean;
|
|
187
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
180
188
|
private worker;
|
|
181
189
|
private mockDll;
|
|
182
190
|
private operationType;
|
package/dist/index.d.ts
CHANGED
|
@@ -176,7 +176,15 @@ interface TefClientEvents {
|
|
|
176
176
|
error: [code: string, message: string];
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
declare class Client extends EventEmitter
|
|
179
|
+
declare class Client extends EventEmitter {
|
|
180
|
+
on<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
181
|
+
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
182
|
+
once<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
183
|
+
once(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
184
|
+
off<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this;
|
|
185
|
+
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
186
|
+
emit<K extends keyof TefClientEvents>(event: K, ...args: TefClientEvents[K]): boolean;
|
|
187
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
180
188
|
private worker;
|
|
181
189
|
private mockDll;
|
|
182
190
|
private operationType;
|
package/dist/index.js
CHANGED
|
@@ -117,6 +117,18 @@ function getWorkerPath() {
|
|
|
117
117
|
return join(dir, "worker.js");
|
|
118
118
|
}
|
|
119
119
|
var Client = class _Client extends EventEmitter {
|
|
120
|
+
on(event, listener) {
|
|
121
|
+
return super.on(event, listener);
|
|
122
|
+
}
|
|
123
|
+
once(event, listener) {
|
|
124
|
+
return super.once(event, listener);
|
|
125
|
+
}
|
|
126
|
+
off(event, listener) {
|
|
127
|
+
return super.off(event, listener);
|
|
128
|
+
}
|
|
129
|
+
emit(event, ...args) {
|
|
130
|
+
return super.emit(event, ...args);
|
|
131
|
+
}
|
|
120
132
|
worker = null;
|
|
121
133
|
mockDll = null;
|
|
122
134
|
// Para testes
|
|
@@ -402,17 +414,19 @@ var Client = class _Client extends EventEmitter {
|
|
|
402
414
|
let shouldCancel = false;
|
|
403
415
|
if (type && !option) {
|
|
404
416
|
this._log("\u{1F4DD} Emitting collect:text", { message, type, mask });
|
|
417
|
+
const collectPromise = this._waitCollect();
|
|
405
418
|
this.emit("display", message);
|
|
406
419
|
this.emit("collect:text", { message, type, mask });
|
|
407
|
-
const result = await
|
|
420
|
+
const result = await collectPromise;
|
|
408
421
|
info = result.info;
|
|
409
422
|
shouldCancel = result.cancel;
|
|
410
423
|
} else if (type && option) {
|
|
411
424
|
const options = option.split(";").filter(Boolean);
|
|
412
425
|
this._log("\u{1F518} Emitting collect:options", { message, options });
|
|
426
|
+
const collectPromise = this._waitCollect();
|
|
413
427
|
this.emit("display", message);
|
|
414
428
|
this.emit("collect:options", { message, options });
|
|
415
|
-
const result = await
|
|
429
|
+
const result = await collectPromise;
|
|
416
430
|
info = options[Number(result.info)] ?? result.info;
|
|
417
431
|
shouldCancel = result.cancel;
|
|
418
432
|
} else {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n} from './types.js'\r\n\r\nconst CARD_TYPE_CODE: Record<CardType, number> = {\r\n ask: 0,\r\n credit: 1,\r\n debit: 2,\r\n voucher: 3,\r\n fleet: 4,\r\n 'private-label': 5,\r\n}\r\n\r\nconst ADMIN_OP_CODE: Record<AdminOp, number> = {\r\n ask: 0,\r\n cancel: 1,\r\n pending: 2,\r\n reprint: 3,\r\n}\r\n\r\ntype OperationType = 'payment' | 'pix' | 'admin'\r\n\r\ntype CollectResolve = (value: { info: string; cancel: boolean }) => void\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\n/**\r\n * Resolves the worker path in a CJS and ESM compatible way.\r\n * - ESM / tsx: import.meta.url is available\r\n * - CJS (tsup build): import.meta.url is empty string, uses __dirname\r\n */\r\nfunction getWorkerPath(): string {\r\n const metaUrl = import.meta.url\r\n const dir = metaUrl\r\n ? dirname(fileURLToPath(metaUrl))\r\n : __dirname\r\n\r\n // Dev mode (tsx): worker.ts existe ao lado do source\r\n const tsWorker = join(dir, 'worker.ts')\r\n if (existsSync(tsWorker)) return tsWorker\r\n\r\n // Produção CJS: worker.cjs (compatível com Electron/CJS context)\r\n const cjsWorker = join(dir, 'worker.cjs')\r\n if (existsSync(cjsWorker)) return cjsWorker\r\n\r\n // Produção ESM: worker.js no dist/\r\n return join(dir, 'worker.js')\r\n}\r\n\r\nexport class Client extends EventEmitter<TefClientEvents> {\r\n private worker: Worker | null = null\r\n private mockDll: ElginDll | null = null // Para testes\r\n private operationType: OperationType = 'payment'\r\n private cardType: CardType = 'ask'\r\n private adminOp: AdminOp = 'ask'\r\n private collectResolver: CollectResolve | null = null\r\n private _debugEnabled = false\r\n private workerPromiseResolve: ((value: string) => void) | null = null\r\n private workerPromiseReject: ((reason: any) => void) | null = null\r\n\r\n /** Payment operations - use methods like payment.pix(), payment.credit(), etc. */\r\n public readonly payment: PaymentApi\r\n\r\n /** Administrative operations - use methods like admin.cancel(), admin.pending(), etc. */\r\n public readonly admin: AdminApi\r\n\r\n constructor(dllPathOrInstance?: string | ElginDll) {\r\n super()\r\n \r\n // Se receber um mock da DLL (para testes), usa ele diretamente\r\n if (typeof dllPathOrInstance === 'object' && dllPathOrInstance !== null) {\r\n this.mockDll = dllPathOrInstance\r\n } else {\r\n // Cria Worker Thread com resolução CJS/ESM compatível\r\n this.worker = new Worker(getWorkerPath())\r\n \r\n this.worker.on('message', (response: WorkerResponse) => {\r\n if (response.type === 'result') {\r\n this.workerPromiseResolve?.(response.data)\r\n } else if (response.type === 'error') {\r\n this.workerPromiseReject?.(new Error(response.error))\r\n } else if (response.type === 'loaded' || response.type === 'configured' || response.type === 'unloaded') {\r\n this.workerPromiseResolve?.('')\r\n }\r\n })\r\n \r\n this.worker.on('error', (error) => {\r\n this.workerPromiseReject?.(error)\r\n })\r\n \r\n // Carrega a DLL no worker\r\n this._sendToWorker({ type: 'load', dllPath: typeof dllPathOrInstance === 'string' ? dllPathOrInstance : undefined })\r\n }\r\n\r\n this.payment = new PaymentApi(this)\r\n this.admin = new AdminApi(this)\r\n }\r\n\r\n /**\r\n * Creates a new Client instance\r\n * @param dllPath - Optional path to the DLL (defaults to C:\\Elgin\\TEF\\E1_Tef01.dll)\r\n */\r\n static instance(dllPath?: string): Client {\r\n return new Client(dllPath)\r\n }\r\n\r\n // Debug\r\n\r\n /**\r\n * Enables debug logging to see all DLL calls, responses, and events\r\n */\r\n enableDebug(): void {\r\n this._debugEnabled = true\r\n this._log('🐛 Debug mode enabled')\r\n }\r\n\r\n /**\r\n * Disables debug logging\r\n */\r\n disableDebug(): void {\r\n this._log('🐛 Debug mode disabled')\r\n this._debugEnabled = false\r\n }\r\n\r\n private _log(message: string, data?: unknown): void {\r\n if (!this._debugEnabled) return\r\n const timestamp = new Date().toISOString().split('T')[1].slice(0, 12)\r\n if (data !== undefined) {\r\n console.log(`[${timestamp}] ${message}`, data)\r\n } else {\r\n console.log(`[${timestamp}] ${message}`)\r\n }\r\n }\r\n\r\n // Worker communication\r\n\r\n private _sendToWorker(message: any): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n if (this.mockDll) {\r\n // Modo teste: executa sincronamente com mock\r\n try {\r\n let result = ''\r\n switch (message.type) {\r\n case 'load':\r\n case 'configured':\r\n case 'unload':\r\n result = ''\r\n break\r\n case 'IniciarOperacaoTEF':\r\n result = this.mockDll.IniciarOperacaoTEF(message.payload)\r\n break\r\n case 'RealizarPagamentoTEF':\r\n result = this.mockDll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'RealizarPixTEF':\r\n result = this.mockDll.RealizarPixTEF(message.payload, message.isNew)\r\n break\r\n case 'RealizarAdmTEF':\r\n result = this.mockDll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'ConfirmarOperacaoTEF':\r\n result = this.mockDll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n break\r\n case 'FinalizarOperacaoTEF':\r\n result = this.mockDll.FinalizarOperacaoTEF(message.id)\r\n break\r\n case 'configure':\r\n this.mockDll.SetClientTCP(message.ip, message.port)\r\n this.mockDll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n result = ''\r\n break\r\n }\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n } else if (this.worker) {\r\n // Modo produção: envia para worker\r\n this.workerPromiseResolve = resolve\r\n this.workerPromiseReject = reject\r\n this.worker.postMessage(message)\r\n } else {\r\n reject(new Error('Worker not initialized'))\r\n }\r\n })\r\n }\r\n\r\n // Configuration\r\n\r\n async configure(ip: string, port: number, pdv: PdvConfig): Promise<void> {\r\n this._log('📡 Configuring client', { ip, port, pdv })\r\n await this._sendToWorker({\r\n type: 'configure',\r\n ip,\r\n port,\r\n pdv,\r\n })\r\n }\r\n\r\n // User response\r\n\r\n /** @internal */\r\n async _executePayment(card: CardType, amount: string): Promise<void> {\r\n this._log('💳 Starting payment', { card, amount })\r\n this.operationType = 'payment'\r\n this.cardType = card\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executePix(amount: string): Promise<void> {\r\n this._log('💰 Starting PIX', { amount })\r\n this.operationType = 'pix'\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executeAdmin(op: AdminOp): Promise<void> {\r\n this._log('🔧 Starting admin operation', { op })\r\n this.operationType = 'admin'\r\n this.adminOp = op\r\n await this._run('')\r\n }\r\n\r\n // User response\r\n\r\n /** Sends the user's input to the pending collect request */\r\n input(info: string): void {\r\n this._log('📤 User input', info)\r\n this.collectResolver?.({ info, cancel: false })\r\n this.collectResolver = null\r\n }\r\n\r\n /** Cancels the pending collect request */\r\n cancel(): void {\r\n this._log('🚫 User cancelled')\r\n this.collectResolver?.({ info: '0', cancel: true })\r\n this.collectResolver = null\r\n }\r\n\r\n unload(): void {\r\n if (this.worker) {\r\n this._sendToWorker({ type: 'unload' }).then(() => {\r\n this.worker?.terminate()\r\n this.worker = null\r\n })\r\n } else if (this.mockDll) {\r\n this.mockDll.unload()\r\n }\r\n }\r\n\r\n // Internal flow\r\n\r\n private async _run(amount: string): Promise<void> {\r\n // 1) Start session\r\n this._log('🚀 Starting TEF session')\r\n const raw = await this._sendToWorker({ type: 'IniciarOperacaoTEF', payload: '{}' })\r\n const startResp = this._parse(raw)\r\n this._log('📥 IniciarOperacaoTEF response', startResp)\r\n \r\n if (!startResp.tef) {\r\n this._log('⚠️ IniciarOperacaoTEF error', { codigo: startResp.codigo, mensagem: startResp.mensagem })\r\n console.error('\\n❌ Failed to start TEF operation:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n \r\n if (startResp.tef.retorno !== '1') {\r\n this.emit('error', startResp.tef.retorno ?? '-1', 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 2) Increment sequence number\r\n const seq = this._nextSeq(startResp.tef.sequencial ?? '0')\r\n this._log('🔢 Sequence number', seq)\r\n const payload: Record<string, unknown> = { sequencial: seq }\r\n if (amount) payload.valorTotal = amount.replace(/\\D/g, '')\r\n\r\n // 3) Start transaction\r\n let resp = await this._callTransaction(payload, true)\r\n\r\n // Check for DLL-level errors\r\n if (!resp.tef) {\r\n this._log('⚠️ DLL error response', { codigo: resp.codigo, mensagem: resp.mensagem })\r\n console.error('\\n❌ DLL error:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'DLL error')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 4) Collect loop\r\n resp = await this._collectLoop(resp)\r\n\r\n // Safety check after collect loop\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef after collect loop')\r\n console.error('\\n❌ Invalid response after collect:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Invalid DLL response')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 5) Check result\r\n const retorno = resp.tef.retorno ?? ''\r\n this._log('🏁 Transaction result', { retorno })\r\n if (retorno === '0' || retorno === '1') {\r\n const store = (resp.tef.comprovanteDiferenciadoLoja as string) ?? ''\r\n const customer = (resp.tef.comprovanteDiferenciadoPortador as string) ?? ''\r\n\r\n if (store || customer) {\r\n const printEvent: PrintEvent = { store, customer }\r\n this._log('🖨️ Emitting print', { storeLines: store.split('\\n').length, customerLines: customer.split('\\n').length })\r\n this.emit('print', printEvent)\r\n }\r\n\r\n const event: ApprovedEvent = {\r\n sequenceId: resp.tef.sequencial ?? seq,\r\n needsConfirmation: retorno === '0',\r\n // Transaction details\r\n acquirerDocument: resp.tef.cnpjCredenciadora as string | undefined,\r\n authorizationCode: resp.tef.codigoAutorizacao as string | undefined,\r\n transactionDateTime: resp.tef.dataHoraTransacao as string | undefined,\r\n paymentMethod: resp.tef.formaPagamento as string | undefined,\r\n merchantId: resp.tef.identificadorEstabelecimento as string | undefined,\r\n terminalId: resp.tef.identificadorPontoCaptura as string | undefined,\r\n message: resp.tef.mensagemResultado as string | undefined,\r\n cardBrand: resp.tef.nomeBandeira as string | undefined,\r\n merchantName: resp.tef.nomeEstabelecimento as string | undefined,\r\n provider: resp.tef.nomeProvedor as string | undefined,\r\n nsu: resp.tef.nsuTerminal as string | undefined,\r\n maskedPan: resp.tef.panMascarado as string | undefined,\r\n result: resp.tef.resultadoTransacao as string | undefined,\r\n service: resp.tef.servico as string | undefined,\r\n cardType: resp.tef.tipoCartao as string | undefined,\r\n transaction: resp.tef.transacao as string | undefined,\r\n uniqueId: resp.tef.uniqueID as string | undefined,\r\n totalAmount: resp.tef.valorTotal as string | undefined,\r\n }\r\n this._log('✅ Emitting approved', event)\r\n this.emit('approved', event)\r\n\r\n if (retorno === '0') {\r\n await this._confirm(Number(event.sequenceId))\r\n }\r\n } else {\r\n this._log('❌ Emitting declined', { retorno })\r\n this.emit('declined', retorno, 'Transaction declined')\r\n }\r\n\r\n // 6) End session\r\n await this._finalize()\r\n }\r\n\r\n private async _collectLoop(resp: TefResponse): Promise<TefResponse> {\r\n // Safety check: ensure tef object exists\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef object', resp)\r\n console.error('\\n⚠️ Response missing tef object:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n return resp\r\n }\r\n\r\n if (resp.tef.retorno !== undefined && resp.tef.retorno !== '') {\r\n return resp\r\n }\r\n\r\n const collectStatus = resp.tef.automacao_coleta_retorno ?? ''\r\n if (collectStatus !== '0') {\r\n return resp\r\n }\r\n\r\n const message = (resp.tef.mensagemResultado as string) ?? ''\r\n const type = resp.tef.automacao_coleta_tipo ?? ''\r\n const option = resp.tef.automacao_coleta_opcao ?? ''\r\n const mask = resp.tef.automacao_coleta_mascara as string | undefined\r\n const collectSeq = resp.tef.automacao_coleta_sequencial ?? ''\r\n\r\n let info = ''\r\n let shouldCancel = false\r\n\r\n if (type && !option) {\r\n // Free-text collect\r\n this._log('📝 Emitting collect:text', { message, type, mask })\r\n this.emit('display', message)\r\n this.emit('collect:text', { message, type, mask })\r\n const result = await this._waitCollect()\r\n info = result.info\r\n shouldCancel = result.cancel\r\n } else if (type && option) {\r\n // Option list collect\r\n const options = option.split(';').filter(Boolean)\r\n this._log('🔘 Emitting collect:options', { message, options })\r\n this.emit('display', message)\r\n this.emit('collect:options', { message, options })\r\n const result = await this._waitCollect()\r\n info = options[Number(result.info)] ?? result.info\r\n shouldCancel = result.cancel\r\n } else {\r\n // Informational message — continue automatically\r\n this._log('⏳ Emitting waiting', message)\r\n this.emit('waiting', message)\r\n\r\n const qrData = this._extractQrCode(resp.tef)\r\n if (qrData) {\r\n const qrEvent: QrCodeEvent = { data: qrData }\r\n this._log('📱 Emitting qrcode', { dataLength: qrData.length })\r\n this.emit('qrcode', qrEvent)\r\n }\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n automacao_coleta_retorno: shouldCancel ? '9' : '0',\r\n automacao_coleta_sequencial: collectSeq,\r\n automacao_coleta_informacao: info,\r\n }\r\n\r\n const next = await this._callTransaction(payload, false)\r\n return this._collectLoop(next)\r\n }\r\n\r\n private async _callTransaction(\r\n payload: Record<string, unknown>,\r\n isNew: boolean,\r\n ): Promise<TefResponse> {\r\n const json = JSON.stringify(payload)\r\n this._log(`📞 Calling ${this.operationType} TEF`, { payload, isNew })\r\n let raw: string\r\n\r\n if (this.operationType === 'pix') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPixTEF',\r\n payload: json,\r\n isNew,\r\n })\r\n } else if (this.operationType === 'admin') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarAdmTEF',\r\n code: ADMIN_OP_CODE[this.adminOp],\r\n payload: json,\r\n isNew,\r\n })\r\n } else {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPagamentoTEF',\r\n code: CARD_TYPE_CODE[this.cardType],\r\n payload: json,\r\n isNew,\r\n })\r\n }\r\n\r\n const response = this._parse(raw)\r\n this._log('📥 DLL Response', response)\r\n return response\r\n }\r\n\r\n private async _confirm(sequenceId: number): Promise<void> {\r\n this._log('✔️ Confirming transaction', { sequenceId })\r\n await this._sendToWorker({\r\n type: 'ConfirmarOperacaoTEF',\r\n sequenceId,\r\n action: 1,\r\n })\r\n this.emit('confirmed')\r\n }\r\n\r\n private async _finalize(): Promise<void> {\r\n this._log('🏁 Finalizing operation')\r\n await this._sendToWorker({\r\n type: 'FinalizarOperacaoTEF',\r\n id: 1,\r\n })\r\n this.emit('finished')\r\n }\r\n\r\n private _waitCollect(): Promise<{ info: string; cancel: boolean }> {\r\n return new Promise((resolve) => {\r\n this.collectResolver = resolve\r\n })\r\n }\r\n\r\n private _parse(raw: string): TefResponse {\r\n try {\r\n return JSON.parse(raw) as TefResponse\r\n } catch {\r\n return { codigo: -1, mensagem: 'Failed to parse DLL response' }\r\n }\r\n }\r\n\r\n private _nextSeq(current: string): string {\r\n const n = Number(current)\r\n return isNaN(n) ? '1' : String(n + 1)\r\n }\r\n\r\n private _extractQrCode(tef: TefResponse['tef']): string | undefined {\r\n if (!tef) return undefined\r\n return (tef.qrCode ?? tef.QRCode ?? tef.pixQrCode ?? tef.codigoPix) as string | undefined\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Payment operations API — provides dedicated methods for each payment type\r\n */\r\nexport class PaymentApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * PIX payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async pix(amount: number): Promise<void> {\r\n return this.client._executePix(amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Credit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async credit(amount: number): Promise<void> {\r\n return this.client._executePayment('credit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Debit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async debit(amount: number): Promise<void> {\r\n return this.client._executePayment('debit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Voucher card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async voucher(amount: number): Promise<void> {\r\n return this.client._executePayment('voucher', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Fleet card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async fleet(amount: number): Promise<void> {\r\n return this.client._executePayment('fleet', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Private label card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async privateLabel(amount: number): Promise<void> {\r\n return this.client._executePayment('private-label', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Ask user which card type to use\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async ask(amount: number): Promise<void> {\r\n return this.client._executePayment('ask', amount.toFixed(2))\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Administrative operations API\r\n */\r\nexport class AdminApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * Ask user which administrative operation to perform\r\n */\r\n async ask(): Promise<void> {\r\n return this.client._executeAdmin('ask')\r\n }\r\n\r\n /**\r\n * Cancel a previous transaction\r\n */\r\n async cancel(): Promise<void> {\r\n return this.client._executeAdmin('cancel')\r\n }\r\n\r\n /**\r\n * Check for pending transactions\r\n */\r\n async pending(): Promise<void> {\r\n return this.client._executeAdmin('pending')\r\n }\r\n\r\n /**\r\n * Reprint last receipt\r\n */\r\n async reprint(): Promise<void> {\r\n return this.client._executeAdmin('reprint')\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n CollectTextEvent,\r\n CollectOptionsEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n} from './types.js'\r\n\r\nconst CARD_TYPE_CODE: Record<CardType, number> = {\r\n ask: 0,\r\n credit: 1,\r\n debit: 2,\r\n voucher: 3,\r\n fleet: 4,\r\n 'private-label': 5,\r\n}\r\n\r\nconst ADMIN_OP_CODE: Record<AdminOp, number> = {\r\n ask: 0,\r\n cancel: 1,\r\n pending: 2,\r\n reprint: 3,\r\n}\r\n\r\ntype OperationType = 'payment' | 'pix' | 'admin'\r\n\r\ntype CollectResolve = (value: { info: string; cancel: boolean }) => void\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\n/**\r\n * Resolves the worker path in a CJS and ESM compatible way.\r\n * - ESM / tsx: import.meta.url is available\r\n * - CJS (tsup build): import.meta.url is empty string, uses __dirname\r\n */\r\nfunction getWorkerPath(): string {\r\n const metaUrl = import.meta.url\r\n const dir = metaUrl\r\n ? dirname(fileURLToPath(metaUrl))\r\n : __dirname\r\n\r\n // Dev mode (tsx): worker.ts existe ao lado do source\r\n const tsWorker = join(dir, 'worker.ts')\r\n if (existsSync(tsWorker)) return tsWorker\r\n\r\n // Produção CJS: worker.cjs (compatível com Electron/CJS context)\r\n const cjsWorker = join(dir, 'worker.cjs')\r\n if (existsSync(cjsWorker)) return cjsWorker\r\n\r\n // Produção ESM: worker.js no dist/\r\n return join(dir, 'worker.js')\r\n}\r\n\r\nexport class Client extends EventEmitter {\r\n // Typed overloads for EventEmitter methods (compatible with all @types/node versions)\r\n on<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n on(event: string | symbol, listener: (...args: any[]) => void): this\r\n on(event: string | symbol, listener: (...args: any[]) => void): this { return super.on(event, listener) }\r\n\r\n once<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n once(event: string | symbol, listener: (...args: any[]) => void): this\r\n once(event: string | symbol, listener: (...args: any[]) => void): this { return super.once(event, listener) }\r\n\r\n off<K extends keyof TefClientEvents>(event: K, listener: (...args: TefClientEvents[K]) => void): this\r\n off(event: string | symbol, listener: (...args: any[]) => void): this\r\n off(event: string | symbol, listener: (...args: any[]) => void): this { return super.off(event, listener) }\r\n\r\n emit<K extends keyof TefClientEvents>(event: K, ...args: TefClientEvents[K]): boolean\r\n emit(event: string | symbol, ...args: any[]): boolean\r\n emit(event: string | symbol, ...args: any[]): boolean { return super.emit(event, ...args) }\r\n\r\n private worker: Worker | null = null\r\n private mockDll: ElginDll | null = null // Para testes\r\n private operationType: OperationType = 'payment'\r\n private cardType: CardType = 'ask'\r\n private adminOp: AdminOp = 'ask'\r\n private collectResolver: CollectResolve | null = null\r\n private _debugEnabled = false\r\n private workerPromiseResolve: ((value: string) => void) | null = null\r\n private workerPromiseReject: ((reason: any) => void) | null = null\r\n\r\n /** Payment operations - use methods like payment.pix(), payment.credit(), etc. */\r\n public readonly payment: PaymentApi\r\n\r\n /** Administrative operations - use methods like admin.cancel(), admin.pending(), etc. */\r\n public readonly admin: AdminApi\r\n\r\n constructor(dllPathOrInstance?: string | ElginDll) {\r\n super()\r\n \r\n // Se receber um mock da DLL (para testes), usa ele diretamente\r\n if (typeof dllPathOrInstance === 'object' && dllPathOrInstance !== null) {\r\n this.mockDll = dllPathOrInstance\r\n } else {\r\n // Cria Worker Thread com resolução CJS/ESM compatível\r\n this.worker = new Worker(getWorkerPath())\r\n \r\n this.worker.on('message', (response: WorkerResponse) => {\r\n if (response.type === 'result') {\r\n this.workerPromiseResolve?.(response.data)\r\n } else if (response.type === 'error') {\r\n this.workerPromiseReject?.(new Error(response.error))\r\n } else if (response.type === 'loaded' || response.type === 'configured' || response.type === 'unloaded') {\r\n this.workerPromiseResolve?.('')\r\n }\r\n })\r\n \r\n this.worker.on('error', (error) => {\r\n this.workerPromiseReject?.(error)\r\n })\r\n \r\n // Carrega a DLL no worker\r\n this._sendToWorker({ type: 'load', dllPath: typeof dllPathOrInstance === 'string' ? dllPathOrInstance : undefined })\r\n }\r\n\r\n this.payment = new PaymentApi(this)\r\n this.admin = new AdminApi(this)\r\n }\r\n\r\n /**\r\n * Creates a new Client instance\r\n * @param dllPath - Optional path to the DLL (defaults to C:\\Elgin\\TEF\\E1_Tef01.dll)\r\n */\r\n static instance(dllPath?: string): Client {\r\n return new Client(dllPath)\r\n }\r\n\r\n // Debug\r\n\r\n /**\r\n * Enables debug logging to see all DLL calls, responses, and events\r\n */\r\n enableDebug(): void {\r\n this._debugEnabled = true\r\n this._log('🐛 Debug mode enabled')\r\n }\r\n\r\n /**\r\n * Disables debug logging\r\n */\r\n disableDebug(): void {\r\n this._log('🐛 Debug mode disabled')\r\n this._debugEnabled = false\r\n }\r\n\r\n private _log(message: string, data?: unknown): void {\r\n if (!this._debugEnabled) return\r\n const timestamp = new Date().toISOString().split('T')[1].slice(0, 12)\r\n if (data !== undefined) {\r\n console.log(`[${timestamp}] ${message}`, data)\r\n } else {\r\n console.log(`[${timestamp}] ${message}`)\r\n }\r\n }\r\n\r\n // Worker communication\r\n\r\n private _sendToWorker(message: any): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n if (this.mockDll) {\r\n // Modo teste: executa sincronamente com mock\r\n try {\r\n let result = ''\r\n switch (message.type) {\r\n case 'load':\r\n case 'configured':\r\n case 'unload':\r\n result = ''\r\n break\r\n case 'IniciarOperacaoTEF':\r\n result = this.mockDll.IniciarOperacaoTEF(message.payload)\r\n break\r\n case 'RealizarPagamentoTEF':\r\n result = this.mockDll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'RealizarPixTEF':\r\n result = this.mockDll.RealizarPixTEF(message.payload, message.isNew)\r\n break\r\n case 'RealizarAdmTEF':\r\n result = this.mockDll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n break\r\n case 'ConfirmarOperacaoTEF':\r\n result = this.mockDll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n break\r\n case 'FinalizarOperacaoTEF':\r\n result = this.mockDll.FinalizarOperacaoTEF(message.id)\r\n break\r\n case 'configure':\r\n this.mockDll.SetClientTCP(message.ip, message.port)\r\n this.mockDll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n result = ''\r\n break\r\n }\r\n resolve(result)\r\n } catch (error) {\r\n reject(error)\r\n }\r\n } else if (this.worker) {\r\n // Modo produção: envia para worker\r\n this.workerPromiseResolve = resolve\r\n this.workerPromiseReject = reject\r\n this.worker.postMessage(message)\r\n } else {\r\n reject(new Error('Worker not initialized'))\r\n }\r\n })\r\n }\r\n\r\n // Configuration\r\n\r\n async configure(ip: string, port: number, pdv: PdvConfig): Promise<void> {\r\n this._log('📡 Configuring client', { ip, port, pdv })\r\n await this._sendToWorker({\r\n type: 'configure',\r\n ip,\r\n port,\r\n pdv,\r\n })\r\n }\r\n\r\n // User response\r\n\r\n /** @internal */\r\n async _executePayment(card: CardType, amount: string): Promise<void> {\r\n this._log('💳 Starting payment', { card, amount })\r\n this.operationType = 'payment'\r\n this.cardType = card\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executePix(amount: string): Promise<void> {\r\n this._log('💰 Starting PIX', { amount })\r\n this.operationType = 'pix'\r\n await this._run(amount)\r\n }\r\n\r\n /** @internal */\r\n async _executeAdmin(op: AdminOp): Promise<void> {\r\n this._log('🔧 Starting admin operation', { op })\r\n this.operationType = 'admin'\r\n this.adminOp = op\r\n await this._run('')\r\n }\r\n\r\n // User response\r\n\r\n /** Sends the user's input to the pending collect request */\r\n input(info: string): void {\r\n this._log('📤 User input', info)\r\n this.collectResolver?.({ info, cancel: false })\r\n this.collectResolver = null\r\n }\r\n\r\n /** Cancels the pending collect request */\r\n cancel(): void {\r\n this._log('🚫 User cancelled')\r\n this.collectResolver?.({ info: '0', cancel: true })\r\n this.collectResolver = null\r\n }\r\n\r\n unload(): void {\r\n if (this.worker) {\r\n this._sendToWorker({ type: 'unload' }).then(() => {\r\n this.worker?.terminate()\r\n this.worker = null\r\n })\r\n } else if (this.mockDll) {\r\n this.mockDll.unload()\r\n }\r\n }\r\n\r\n // Internal flow\r\n\r\n private async _run(amount: string): Promise<void> {\r\n // 1) Start session\r\n this._log('🚀 Starting TEF session')\r\n const raw = await this._sendToWorker({ type: 'IniciarOperacaoTEF', payload: '{}' })\r\n const startResp = this._parse(raw)\r\n this._log('📥 IniciarOperacaoTEF response', startResp)\r\n \r\n if (!startResp.tef) {\r\n this._log('⚠️ IniciarOperacaoTEF error', { codigo: startResp.codigo, mensagem: startResp.mensagem })\r\n console.error('\\n❌ Failed to start TEF operation:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n \r\n if (startResp.tef.retorno !== '1') {\r\n this.emit('error', startResp.tef.retorno ?? '-1', 'Failed to start TEF operation')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 2) Increment sequence number\r\n const seq = this._nextSeq(startResp.tef.sequencial ?? '0')\r\n this._log('🔢 Sequence number', seq)\r\n const payload: Record<string, unknown> = { sequencial: seq }\r\n if (amount) payload.valorTotal = amount.replace(/\\D/g, '')\r\n\r\n // 3) Start transaction\r\n let resp = await this._callTransaction(payload, true)\r\n\r\n // Check for DLL-level errors\r\n if (!resp.tef) {\r\n this._log('⚠️ DLL error response', { codigo: resp.codigo, mensagem: resp.mensagem })\r\n console.error('\\n❌ DLL error:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'DLL error')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 4) Collect loop\r\n resp = await this._collectLoop(resp)\r\n\r\n // Safety check after collect loop\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef after collect loop')\r\n console.error('\\n❌ Invalid response after collect:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Invalid DLL response')\r\n await this._finalize()\r\n return\r\n }\r\n\r\n // 5) Check result\r\n const retorno = resp.tef.retorno ?? ''\r\n this._log('🏁 Transaction result', { retorno })\r\n if (retorno === '0' || retorno === '1') {\r\n const store = (resp.tef.comprovanteDiferenciadoLoja as string) ?? ''\r\n const customer = (resp.tef.comprovanteDiferenciadoPortador as string) ?? ''\r\n\r\n if (store || customer) {\r\n const printEvent: PrintEvent = { store, customer }\r\n this._log('🖨️ Emitting print', { storeLines: store.split('\\n').length, customerLines: customer.split('\\n').length })\r\n this.emit('print', printEvent)\r\n }\r\n\r\n const event: ApprovedEvent = {\r\n sequenceId: resp.tef.sequencial ?? seq,\r\n needsConfirmation: retorno === '0',\r\n // Transaction details\r\n acquirerDocument: resp.tef.cnpjCredenciadora as string | undefined,\r\n authorizationCode: resp.tef.codigoAutorizacao as string | undefined,\r\n transactionDateTime: resp.tef.dataHoraTransacao as string | undefined,\r\n paymentMethod: resp.tef.formaPagamento as string | undefined,\r\n merchantId: resp.tef.identificadorEstabelecimento as string | undefined,\r\n terminalId: resp.tef.identificadorPontoCaptura as string | undefined,\r\n message: resp.tef.mensagemResultado as string | undefined,\r\n cardBrand: resp.tef.nomeBandeira as string | undefined,\r\n merchantName: resp.tef.nomeEstabelecimento as string | undefined,\r\n provider: resp.tef.nomeProvedor as string | undefined,\r\n nsu: resp.tef.nsuTerminal as string | undefined,\r\n maskedPan: resp.tef.panMascarado as string | undefined,\r\n result: resp.tef.resultadoTransacao as string | undefined,\r\n service: resp.tef.servico as string | undefined,\r\n cardType: resp.tef.tipoCartao as string | undefined,\r\n transaction: resp.tef.transacao as string | undefined,\r\n uniqueId: resp.tef.uniqueID as string | undefined,\r\n totalAmount: resp.tef.valorTotal as string | undefined,\r\n }\r\n this._log('✅ Emitting approved', event)\r\n this.emit('approved', event)\r\n\r\n if (retorno === '0') {\r\n await this._confirm(Number(event.sequenceId))\r\n }\r\n } else {\r\n this._log('❌ Emitting declined', { retorno })\r\n this.emit('declined', retorno, 'Transaction declined')\r\n }\r\n\r\n // 6) End session\r\n await this._finalize()\r\n }\r\n\r\n private async _collectLoop(resp: TefResponse): Promise<TefResponse> {\r\n // Safety check: ensure tef object exists\r\n if (!resp.tef) {\r\n this._log('⚠️ Response missing tef object', resp)\r\n console.error('\\n⚠️ Response missing tef object:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n return resp\r\n }\r\n\r\n if (resp.tef.retorno !== undefined && resp.tef.retorno !== '') {\r\n return resp\r\n }\r\n\r\n const collectStatus = resp.tef.automacao_coleta_retorno ?? ''\r\n if (collectStatus !== '0') {\r\n return resp\r\n }\r\n\r\n const message = (resp.tef.mensagemResultado as string) ?? ''\r\n const type = resp.tef.automacao_coleta_tipo ?? ''\r\n const option = resp.tef.automacao_coleta_opcao ?? ''\r\n const mask = resp.tef.automacao_coleta_mascara as string | undefined\r\n const collectSeq = resp.tef.automacao_coleta_sequencial ?? ''\r\n\r\n let info = ''\r\n let shouldCancel = false\r\n\r\n if (type && !option) {\r\n // Free-text collect\r\n this._log('📝 Emitting collect:text', { message, type, mask })\r\n const collectPromise = this._waitCollect()\r\n this.emit('display', message)\r\n this.emit('collect:text', { message, type, mask })\r\n const result = await collectPromise\r\n info = result.info\r\n shouldCancel = result.cancel\r\n } else if (type && option) {\r\n // Option list collect\r\n const options = option.split(';').filter(Boolean)\r\n this._log('🔘 Emitting collect:options', { message, options })\r\n const collectPromise = this._waitCollect()\r\n this.emit('display', message)\r\n this.emit('collect:options', { message, options })\r\n const result = await collectPromise\r\n info = options[Number(result.info)] ?? result.info\r\n shouldCancel = result.cancel\r\n } else {\r\n // Informational message — continue automatically\r\n this._log('⏳ Emitting waiting', message)\r\n this.emit('waiting', message)\r\n\r\n const qrData = this._extractQrCode(resp.tef)\r\n if (qrData) {\r\n const qrEvent: QrCodeEvent = { data: qrData }\r\n this._log('📱 Emitting qrcode', { dataLength: qrData.length })\r\n this.emit('qrcode', qrEvent)\r\n }\r\n }\r\n\r\n const payload: Record<string, unknown> = {\r\n automacao_coleta_retorno: shouldCancel ? '9' : '0',\r\n automacao_coleta_sequencial: collectSeq,\r\n automacao_coleta_informacao: info,\r\n }\r\n\r\n const next = await this._callTransaction(payload, false)\r\n return this._collectLoop(next)\r\n }\r\n\r\n private async _callTransaction(\r\n payload: Record<string, unknown>,\r\n isNew: boolean,\r\n ): Promise<TefResponse> {\r\n const json = JSON.stringify(payload)\r\n this._log(`📞 Calling ${this.operationType} TEF`, { payload, isNew })\r\n let raw: string\r\n\r\n if (this.operationType === 'pix') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPixTEF',\r\n payload: json,\r\n isNew,\r\n })\r\n } else if (this.operationType === 'admin') {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarAdmTEF',\r\n code: ADMIN_OP_CODE[this.adminOp],\r\n payload: json,\r\n isNew,\r\n })\r\n } else {\r\n raw = await this._sendToWorker({\r\n type: 'RealizarPagamentoTEF',\r\n code: CARD_TYPE_CODE[this.cardType],\r\n payload: json,\r\n isNew,\r\n })\r\n }\r\n\r\n const response = this._parse(raw)\r\n this._log('📥 DLL Response', response)\r\n return response\r\n }\r\n\r\n private async _confirm(sequenceId: number): Promise<void> {\r\n this._log('✔️ Confirming transaction', { sequenceId })\r\n await this._sendToWorker({\r\n type: 'ConfirmarOperacaoTEF',\r\n sequenceId,\r\n action: 1,\r\n })\r\n this.emit('confirmed')\r\n }\r\n\r\n private async _finalize(): Promise<void> {\r\n this._log('🏁 Finalizing operation')\r\n await this._sendToWorker({\r\n type: 'FinalizarOperacaoTEF',\r\n id: 1,\r\n })\r\n this.emit('finished')\r\n }\r\n\r\n private _waitCollect(): Promise<{ info: string; cancel: boolean }> {\r\n return new Promise((resolve) => {\r\n this.collectResolver = resolve\r\n })\r\n }\r\n\r\n private _parse(raw: string): TefResponse {\r\n try {\r\n return JSON.parse(raw) as TefResponse\r\n } catch {\r\n return { codigo: -1, mensagem: 'Failed to parse DLL response' }\r\n }\r\n }\r\n\r\n private _nextSeq(current: string): string {\r\n const n = Number(current)\r\n return isNaN(n) ? '1' : String(n + 1)\r\n }\r\n\r\n private _extractQrCode(tef: TefResponse['tef']): string | undefined {\r\n if (!tef) return undefined\r\n return (tef.qrCode ?? tef.QRCode ?? tef.pixQrCode ?? tef.codigoPix) as string | undefined\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Payment operations API — provides dedicated methods for each payment type\r\n */\r\nexport class PaymentApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * PIX payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async pix(amount: number): Promise<void> {\r\n return this.client._executePix(amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Credit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async credit(amount: number): Promise<void> {\r\n return this.client._executePayment('credit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Debit card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async debit(amount: number): Promise<void> {\r\n return this.client._executePayment('debit', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Voucher card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async voucher(amount: number): Promise<void> {\r\n return this.client._executePayment('voucher', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Fleet card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async fleet(amount: number): Promise<void> {\r\n return this.client._executePayment('fleet', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Private label card payment\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async privateLabel(amount: number): Promise<void> {\r\n return this.client._executePayment('private-label', amount.toFixed(2))\r\n }\r\n\r\n /**\r\n * Ask user which card type to use\r\n * @param amount - Amount as number (e.g., 10.50 or 10)\r\n */\r\n async ask(amount: number): Promise<void> {\r\n return this.client._executePayment('ask', amount.toFixed(2))\r\n }\r\n}\r\n","import type { Client } from './client.js'\r\n\r\n/**\r\n * Administrative operations API\r\n */\r\nexport class AdminApi {\r\n constructor(private client: Client) {}\r\n\r\n /**\r\n * Ask user which administrative operation to perform\r\n */\r\n async ask(): Promise<void> {\r\n return this.client._executeAdmin('ask')\r\n }\r\n\r\n /**\r\n * Cancel a previous transaction\r\n */\r\n async cancel(): Promise<void> {\r\n return this.client._executeAdmin('cancel')\r\n }\r\n\r\n /**\r\n * Check for pending transactions\r\n */\r\n async pending(): Promise<void> {\r\n return this.client._executeAdmin('pending')\r\n }\r\n\r\n /**\r\n * Reprint last receipt\r\n */\r\n async reprint(): Promise<void> {\r\n return this.client._executeAdmin('reprint')\r\n }\r\n}\r\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,MAAM,eAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,cAAc;;;ACChB,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrC,MAAM,IAAI,QAA+B;AACvC,WAAO,KAAK,OAAO,YAAY,OAAO,QAAQ,CAAC,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,QAA+B;AAC1C,WAAO,KAAK,OAAO,gBAAgB,UAAU,OAAO,QAAQ,CAAC,CAAC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,QAA+B;AACzC,WAAO,KAAK,OAAO,gBAAgB,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,QAA+B;AAC3C,WAAO,KAAK,OAAO,gBAAgB,WAAW,OAAO,QAAQ,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,QAA+B;AACzC,WAAO,KAAK,OAAO,gBAAgB,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAA+B;AAChD,WAAO,KAAK,OAAO,gBAAgB,iBAAiB,OAAO,QAAQ,CAAC,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,QAA+B;AACvC,WAAO,KAAK,OAAO,gBAAgB,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC7D;AACF;;;AC1DO,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA,EAKrC,MAAM,MAAqB;AACzB,WAAO,KAAK,OAAO,cAAc,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAwB;AAC5B,WAAO,KAAK,OAAO,cAAc,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,WAAO,KAAK,OAAO,cAAc,SAAS;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,WAAO,KAAK,OAAO,cAAc,SAAS;AAAA,EAC5C;AACF;;;AFdA,IAAM,iBAA2C;AAAA,EAC/C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,iBAAiB;AACnB;AAEA,IAAM,gBAAyC;AAAA,EAC7C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AACX;AAkBA,SAAS,gBAAwB;AAC/B,QAAM,UAAU,YAAY;AAC5B,QAAM,MAAM,UACR,QAAQ,cAAc,OAAO,CAAC,IAC9B;AAGJ,QAAM,WAAW,KAAK,KAAK,WAAW;AACtC,MAAI,WAAW,QAAQ,EAAG,QAAO;AAGjC,QAAM,YAAY,KAAK,KAAK,YAAY;AACxC,MAAI,WAAW,SAAS,EAAG,QAAO;AAGlC,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,IAAM,SAAN,MAAM,gBAAe,aAAa;AAAA,EAIvC,GAAG,OAAwB,UAA0C;AAAE,WAAO,MAAM,GAAG,OAAO,QAAQ;AAAA,EAAE;AAAA,EAIxG,KAAK,OAAwB,UAA0C;AAAE,WAAO,MAAM,KAAK,OAAO,QAAQ;AAAA,EAAE;AAAA,EAI5G,IAAI,OAAwB,UAA0C;AAAE,WAAO,MAAM,IAAI,OAAO,QAAQ;AAAA,EAAE;AAAA,EAI1G,KAAK,UAA2B,MAAsB;AAAE,WAAO,MAAM,KAAK,OAAO,GAAG,IAAI;AAAA,EAAE;AAAA,EAElF,SAAwB;AAAA,EACxB,UAA2B;AAAA;AAAA,EAC3B,gBAA+B;AAAA,EAC/B,WAAqB;AAAA,EACrB,UAAmB;AAAA,EACnB,kBAAyC;AAAA,EACzC,gBAAgB;AAAA,EAChB,uBAAyD;AAAA,EACzD,sBAAsD;AAAA;AAAA,EAG9C;AAAA;AAAA,EAGA;AAAA,EAEhB,YAAY,mBAAuC;AACjD,UAAM;AAGN,QAAI,OAAO,sBAAsB,YAAY,sBAAsB,MAAM;AACvE,WAAK,UAAU;AAAA,IACjB,OAAO;AAEL,WAAK,SAAS,IAAI,OAAO,cAAc,CAAC;AAExC,WAAK,OAAO,GAAG,WAAW,CAAC,aAA6B;AACtD,YAAI,SAAS,SAAS,UAAU;AAC9B,eAAK,uBAAuB,SAAS,IAAI;AAAA,QAC3C,WAAW,SAAS,SAAS,SAAS;AACpC,eAAK,sBAAsB,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,QACtD,WAAW,SAAS,SAAS,YAAY,SAAS,SAAS,gBAAgB,SAAS,SAAS,YAAY;AACvG,eAAK,uBAAuB,EAAE;AAAA,QAChC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,SAAS,CAAC,UAAU;AACjC,aAAK,sBAAsB,KAAK;AAAA,MAClC,CAAC;AAGD,WAAK,cAAc,EAAE,MAAM,QAAQ,SAAS,OAAO,sBAAsB,WAAW,oBAAoB,OAAU,CAAC;AAAA,IACrH;AAEA,SAAK,UAAU,IAAI,WAAW,IAAI;AAClC,SAAK,QAAQ,IAAI,SAAS,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS,SAA0B;AACxC,WAAO,IAAI,QAAO,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAoB;AAClB,SAAK,gBAAgB;AACrB,SAAK,KAAK,8BAAuB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,SAAK,KAAK,+BAAwB;AAClC,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,KAAK,SAAiB,MAAsB;AAClD,QAAI,CAAC,KAAK,cAAe;AACzB,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE;AACpE,QAAI,SAAS,QAAW;AACtB,cAAQ,IAAI,IAAI,SAAS,KAAK,OAAO,IAAI,IAAI;AAAA,IAC/C,OAAO;AACL,cAAQ,IAAI,IAAI,SAAS,KAAK,OAAO,EAAE;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAIQ,cAAc,SAA+B;AACnD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,KAAK,SAAS;AAEhB,YAAI;AACF,cAAI,SAAS;AACb,kBAAQ,QAAQ,MAAM;AAAA,YACpB,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AACH,uBAAS;AACT;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,mBAAmB,QAAQ,OAAO;AACxD;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,qBAAqB,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AACvF;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,eAAe,QAAQ,SAAS,QAAQ,KAAK;AACnE;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,eAAe,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AACjF;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,qBAAqB,QAAQ,YAAY,QAAQ,MAAM;AAC7E;AAAA,YACF,KAAK;AACH,uBAAS,KAAK,QAAQ,qBAAqB,QAAQ,EAAE;AACrD;AAAA,YACF,KAAK;AACH,mBAAK,QAAQ,aAAa,QAAQ,IAAI,QAAQ,IAAI;AAClD,mBAAK,QAAQ;AAAA,gBACX,QAAQ,IAAI;AAAA,gBACZ,QAAQ,IAAI;AAAA,gBACZ,QAAQ,IAAI;AAAA,gBACZ,QAAQ,IAAI;AAAA,gBACZ,QAAQ,IAAI;AAAA,cACd;AACA,uBAAS;AACT;AAAA,UACJ;AACA,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,WAAW,KAAK,QAAQ;AAEtB,aAAK,uBAAuB;AAC5B,aAAK,sBAAsB;AAC3B,aAAK,OAAO,YAAY,OAAO;AAAA,MACjC,OAAO;AACL,eAAO,IAAI,MAAM,wBAAwB,CAAC;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAM,UAAU,IAAY,MAAc,KAA+B;AACvE,SAAK,KAAK,gCAAyB,EAAE,IAAI,MAAM,IAAI,CAAC;AACpD,UAAM,KAAK,cAAc;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAgB,QAA+B;AACnE,SAAK,KAAK,8BAAuB,EAAE,MAAM,OAAO,CAAC;AACjD,SAAK,gBAAgB;AACrB,SAAK,WAAW;AAChB,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,YAAY,QAA+B;AAC/C,SAAK,KAAK,0BAAmB,EAAE,OAAO,CAAC;AACvC,SAAK,gBAAgB;AACrB,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA,EAGA,MAAM,cAAc,IAA4B;AAC9C,SAAK,KAAK,sCAA+B,EAAE,GAAG,CAAC;AAC/C,SAAK,gBAAgB;AACrB,SAAK,UAAU;AACf,UAAM,KAAK,KAAK,EAAE;AAAA,EACpB;AAAA;AAAA;AAAA,EAKA,MAAM,MAAoB;AACxB,SAAK,KAAK,wBAAiB,IAAI;AAC/B,SAAK,kBAAkB,EAAE,MAAM,QAAQ,MAAM,CAAC;AAC9C,SAAK,kBAAkB;AAAA,EACzB;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,KAAK,0BAAmB;AAC7B,SAAK,kBAAkB,EAAE,MAAM,KAAK,QAAQ,KAAK,CAAC;AAClD,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,SAAe;AACb,QAAI,KAAK,QAAQ;AACf,WAAK,cAAc,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,MAAM;AAChD,aAAK,QAAQ,UAAU;AACvB,aAAK,SAAS;AAAA,MAChB,CAAC;AAAA,IACH,WAAW,KAAK,SAAS;AACvB,WAAK,QAAQ,OAAO;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,KAAK,QAA+B;AAEhD,SAAK,KAAK,gCAAyB;AACnC,UAAM,MAAM,MAAM,KAAK,cAAc,EAAE,MAAM,sBAAsB,SAAS,KAAK,CAAC;AAClF,UAAM,YAAY,KAAK,OAAO,GAAG;AACjC,SAAK,KAAK,yCAAkC,SAAS;AAErD,QAAI,CAAC,UAAU,KAAK;AAClB,WAAK,KAAK,0CAAgC,EAAE,QAAQ,UAAU,QAAQ,UAAU,UAAU,SAAS,CAAC;AACpG,cAAQ,MAAM,yCAAoC;AAClD,cAAQ,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAChD,WAAK,KAAK,SAAS,OAAO,UAAU,UAAU,IAAI,GAAG,UAAU,YAAY,+BAA+B;AAC1G,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAEA,QAAI,UAAU,IAAI,YAAY,KAAK;AACjC,WAAK,KAAK,SAAS,UAAU,IAAI,WAAW,MAAM,+BAA+B;AACjF,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAGA,UAAM,MAAM,KAAK,SAAS,UAAU,IAAI,cAAc,GAAG;AACzD,SAAK,KAAK,6BAAsB,GAAG;AACnC,UAAM,UAAmC,EAAE,YAAY,IAAI;AAC3D,QAAI,OAAQ,SAAQ,aAAa,OAAO,QAAQ,OAAO,EAAE;AAGzD,QAAI,OAAO,MAAM,KAAK,iBAAiB,SAAS,IAAI;AAGpD,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,KAAK,oCAA0B,EAAE,QAAQ,KAAK,QAAQ,UAAU,KAAK,SAAS,CAAC;AACpF,cAAQ,MAAM,qBAAgB;AAC9B,cAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C,WAAK,KAAK,SAAS,OAAO,KAAK,UAAU,IAAI,GAAG,KAAK,YAAY,WAAW;AAC5E,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAGA,WAAO,MAAM,KAAK,aAAa,IAAI;AAGnC,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,KAAK,uDAA6C;AACvD,cAAQ,MAAM,0CAAqC;AACnD,cAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C,WAAK,KAAK,SAAS,MAAM,sBAAsB;AAC/C,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAGA,UAAM,UAAU,KAAK,IAAI,WAAW;AACpC,SAAK,KAAK,gCAAyB,EAAE,QAAQ,CAAC;AAC9C,QAAI,YAAY,OAAO,YAAY,KAAK;AACtC,YAAM,QAAS,KAAK,IAAI,+BAA0C;AAClE,YAAM,WAAY,KAAK,IAAI,mCAA8C;AAEzE,UAAI,SAAS,UAAU;AACrB,cAAM,aAAyB,EAAE,OAAO,SAAS;AACjD,aAAK,KAAK,mCAAuB,EAAE,YAAY,MAAM,MAAM,IAAI,EAAE,QAAQ,eAAe,SAAS,MAAM,IAAI,EAAE,OAAO,CAAC;AACrH,aAAK,KAAK,SAAS,UAAU;AAAA,MAC/B;AAEA,YAAM,QAAuB;AAAA,QAC3B,YAAY,KAAK,IAAI,cAAc;AAAA,QACnC,mBAAmB,YAAY;AAAA;AAAA,QAE/B,kBAAkB,KAAK,IAAI;AAAA,QAC3B,mBAAmB,KAAK,IAAI;AAAA,QAC5B,qBAAqB,KAAK,IAAI;AAAA,QAC9B,eAAe,KAAK,IAAI;AAAA,QACxB,YAAY,KAAK,IAAI;AAAA,QACrB,YAAY,KAAK,IAAI;AAAA,QACrB,SAAS,KAAK,IAAI;AAAA,QAClB,WAAW,KAAK,IAAI;AAAA,QACpB,cAAc,KAAK,IAAI;AAAA,QACvB,UAAU,KAAK,IAAI;AAAA,QACnB,KAAK,KAAK,IAAI;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,QACpB,QAAQ,KAAK,IAAI;AAAA,QACjB,SAAS,KAAK,IAAI;AAAA,QAClB,UAAU,KAAK,IAAI;AAAA,QACnB,aAAa,KAAK,IAAI;AAAA,QACtB,UAAU,KAAK,IAAI;AAAA,QACnB,aAAa,KAAK,IAAI;AAAA,MACxB;AACA,WAAK,KAAK,4BAAuB,KAAK;AACtC,WAAK,KAAK,YAAY,KAAK;AAE3B,UAAI,YAAY,KAAK;AACnB,cAAM,KAAK,SAAS,OAAO,MAAM,UAAU,CAAC;AAAA,MAC9C;AAAA,IACF,OAAO;AACL,WAAK,KAAK,4BAAuB,EAAE,QAAQ,CAAC;AAC5C,WAAK,KAAK,YAAY,SAAS,sBAAsB;AAAA,IACvD;AAGA,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAc,aAAa,MAAyC;AAElE,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,KAAK,6CAAmC,IAAI;AACjD,cAAQ,MAAM,8CAAoC;AAClD,cAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,IAAI,YAAY,UAAa,KAAK,IAAI,YAAY,IAAI;AAC7D,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,IAAI,4BAA4B;AAC3D,QAAI,kBAAkB,KAAK;AACzB,aAAO;AAAA,IACT;AAEA,UAAM,UAAW,KAAK,IAAI,qBAAgC;AAC1D,UAAM,OAAO,KAAK,IAAI,yBAAyB;AAC/C,UAAM,SAAS,KAAK,IAAI,0BAA0B;AAClD,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,aAAa,KAAK,IAAI,+BAA+B;AAE3D,QAAI,OAAO;AACX,QAAI,eAAe;AAEnB,QAAI,QAAQ,CAAC,QAAQ;AAEnB,WAAK,KAAK,mCAA4B,EAAE,SAAS,MAAM,KAAK,CAAC;AAC7D,YAAM,iBAAiB,KAAK,aAAa;AACzC,WAAK,KAAK,WAAW,OAAO;AAC5B,WAAK,KAAK,gBAAgB,EAAE,SAAS,MAAM,KAAK,CAAC;AACjD,YAAM,SAAS,MAAM;AACrB,aAAO,OAAO;AACd,qBAAe,OAAO;AAAA,IACxB,WAAW,QAAQ,QAAQ;AAEzB,YAAM,UAAU,OAAO,MAAM,GAAG,EAAE,OAAO,OAAO;AAChD,WAAK,KAAK,sCAA+B,EAAE,SAAS,QAAQ,CAAC;AAC7D,YAAM,iBAAiB,KAAK,aAAa;AACzC,WAAK,KAAK,WAAW,OAAO;AAC5B,WAAK,KAAK,mBAAmB,EAAE,SAAS,QAAQ,CAAC;AACjD,YAAM,SAAS,MAAM;AACrB,aAAO,QAAQ,OAAO,OAAO,IAAI,CAAC,KAAK,OAAO;AAC9C,qBAAe,OAAO;AAAA,IACxB,OAAO;AAEL,WAAK,KAAK,2BAAsB,OAAO;AACvC,WAAK,KAAK,WAAW,OAAO;AAE5B,YAAM,SAAS,KAAK,eAAe,KAAK,GAAG;AAC3C,UAAI,QAAQ;AACV,cAAM,UAAuB,EAAE,MAAM,OAAO;AAC5C,aAAK,KAAK,6BAAsB,EAAE,YAAY,OAAO,OAAO,CAAC;AAC7D,aAAK,KAAK,UAAU,OAAO;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,UAAmC;AAAA,MACvC,0BAA0B,eAAe,MAAM;AAAA,MAC/C,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,IAC/B;AAEA,UAAM,OAAO,MAAM,KAAK,iBAAiB,SAAS,KAAK;AACvD,WAAO,KAAK,aAAa,IAAI;AAAA,EAC/B;AAAA,EAEA,MAAc,iBACZ,SACA,OACsB;AACtB,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,SAAK,KAAK,qBAAc,KAAK,aAAa,QAAQ,EAAE,SAAS,MAAM,CAAC;AACpE,QAAI;AAEJ,QAAI,KAAK,kBAAkB,OAAO;AAChC,YAAM,MAAM,KAAK,cAAc;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,WAAW,KAAK,kBAAkB,SAAS;AACzC,YAAM,MAAM,KAAK,cAAc;AAAA,QAC7B,MAAM;AAAA,QACN,MAAM,cAAc,KAAK,OAAO;AAAA,QAChC,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,YAAM,MAAM,KAAK,cAAc;AAAA,QAC7B,MAAM;AAAA,QACN,MAAM,eAAe,KAAK,QAAQ;AAAA,QAClC,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK,OAAO,GAAG;AAChC,SAAK,KAAK,0BAAmB,QAAQ;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,YAAmC;AACxD,SAAK,KAAK,wCAA8B,EAAE,WAAW,CAAC;AACtD,UAAM,KAAK,cAAc;AAAA,MACvB,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,KAAK,WAAW;AAAA,EACvB;AAAA,EAEA,MAAc,YAA2B;AACvC,SAAK,KAAK,gCAAyB;AACnC,UAAM,KAAK,cAAc;AAAA,MACvB,MAAM;AAAA,MACN,IAAI;AAAA,IACN,CAAC;AACD,SAAK,KAAK,UAAU;AAAA,EACtB;AAAA,EAEQ,eAA2D;AACjE,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,kBAAkB;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEQ,OAAO,KAA0B;AACvC,QAAI;AACF,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO,EAAE,QAAQ,IAAI,UAAU,+BAA+B;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,SAAS,SAAyB;AACxC,UAAM,IAAI,OAAO,OAAO;AACxB,WAAO,MAAM,CAAC,IAAI,MAAM,OAAO,IAAI,CAAC;AAAA,EACtC;AAAA,EAEQ,eAAe,KAA6C;AAClE,QAAI,CAAC,IAAK,QAAO;AACjB,WAAQ,IAAI,UAAU,IAAI,UAAU,IAAI,aAAa,IAAI;AAAA,EAC3D;AACF;","names":[]}
|