@stackflow-lab/tef-elgin 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -141,9 +141,23 @@ function getWorkerPath() {
141
141
  const dir = metaUrl ? (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(metaUrl)) : __dirname;
142
142
  const tsWorker = (0, import_node_path.join)(dir, "worker.ts");
143
143
  if ((0, import_node_fs.existsSync)(tsWorker)) return tsWorker;
144
+ const cjsWorker = (0, import_node_path.join)(dir, "worker.cjs");
145
+ if ((0, import_node_fs.existsSync)(cjsWorker)) return cjsWorker;
144
146
  return (0, import_node_path.join)(dir, "worker.js");
145
147
  }
146
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
+ }
147
161
  worker = null;
148
162
  mockDll = null;
149
163
  // Para testes
@@ -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: 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 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":[]}
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<TefClientEvents> {
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<TefClientEvents> {
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
@@ -112,9 +112,23 @@ function getWorkerPath() {
112
112
  const dir = metaUrl ? dirname(fileURLToPath(metaUrl)) : __dirname;
113
113
  const tsWorker = join(dir, "worker.ts");
114
114
  if (existsSync(tsWorker)) return tsWorker;
115
+ const cjsWorker = join(dir, "worker.cjs");
116
+ if (existsSync(cjsWorker)) return cjsWorker;
115
117
  return join(dir, "worker.js");
116
118
  }
117
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
+ }
118
132
  worker = null;
119
133
  mockDll = null;
120
134
  // Para testes
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: 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":";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;;;AFhBA,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,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,IAAM,SAAN,MAAM,gBAAe,aAA8B;AAAA,EAChD,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,WAAK,KAAK,WAAW,OAAO;AAC5B,WAAK,KAAK,gBAAgB,EAAE,SAAS,MAAM,KAAK,CAAC;AACjD,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,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,WAAK,KAAK,WAAW,OAAO;AAC5B,WAAK,KAAK,mBAAmB,EAAE,SAAS,QAAQ,CAAC;AACjD,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,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":[]}
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 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":[]}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+
25
+ // src/worker.ts
26
+ var import_node_worker_threads = require("worker_threads");
27
+ var import_node_path = require("path");
28
+ var import_node_fs = require("fs");
29
+ var import_koffi = __toESM(require("koffi"), 1);
30
+ var DEFAULT_DLL_PATH = (0, import_node_path.join)("C:", "Elgin", "TEF", "E1_Tef01.dll");
31
+ function loadDll(dllPath = DEFAULT_DLL_PATH) {
32
+ if (!(0, import_node_fs.existsSync)(dllPath)) {
33
+ throw new Error(`DLL not found: ${dllPath}`);
34
+ }
35
+ const lib = import_koffi.default.load(dllPath);
36
+ return {
37
+ GetProdutoTef: lib.func("__stdcall", "GetProdutoTef", "int", []),
38
+ GetClientTCP: lib.func("__stdcall", "GetClientTCP", "string", []),
39
+ SetClientTCP: lib.func("__stdcall", "SetClientTCP", "string", ["string", "int"]),
40
+ ConfigurarDadosPDV: lib.func("__stdcall", "ConfigurarDadosPDV", "string", ["string", "string", "string", "string", "string"]),
41
+ IniciarOperacaoTEF: lib.func("__stdcall", "IniciarOperacaoTEF", "string", ["string"]),
42
+ RecuperarOperacaoTEF: lib.func("__stdcall", "RecuperarOperacaoTEF", "string", ["string"]),
43
+ RealizarPagamentoTEF: lib.func("__stdcall", "RealizarPagamentoTEF", "string", ["int", "string", "bool"]),
44
+ RealizarPixTEF: lib.func("__stdcall", "RealizarPixTEF", "string", ["string", "bool"]),
45
+ RealizarAdmTEF: lib.func("__stdcall", "RealizarAdmTEF", "string", ["int", "string", "bool"]),
46
+ ConfirmarOperacaoTEF: lib.func("__stdcall", "ConfirmarOperacaoTEF", "string", ["int", "int"]),
47
+ FinalizarOperacaoTEF: lib.func("__stdcall", "FinalizarOperacaoTEF", "string", ["int"]),
48
+ unload: () => lib.unload()
49
+ };
50
+ }
51
+ var dll = null;
52
+ if (!import_node_worker_threads.parentPort) {
53
+ throw new Error("This file must be executed as a Worker Thread");
54
+ }
55
+ import_node_worker_threads.parentPort.on("message", (message) => {
56
+ try {
57
+ switch (message.type) {
58
+ case "load": {
59
+ dll = loadDll(message.dllPath);
60
+ import_node_worker_threads.parentPort.postMessage({ type: "loaded" });
61
+ break;
62
+ }
63
+ case "configure": {
64
+ if (!dll) throw new Error("DLL not loaded");
65
+ dll.SetClientTCP(message.ip, message.port);
66
+ dll.ConfigurarDadosPDV(
67
+ message.pdv.pinpadText,
68
+ message.pdv.version,
69
+ message.pdv.storeName,
70
+ message.pdv.storeCode,
71
+ message.pdv.terminalId
72
+ );
73
+ import_node_worker_threads.parentPort.postMessage({ type: "configured" });
74
+ break;
75
+ }
76
+ case "IniciarOperacaoTEF": {
77
+ if (!dll) throw new Error("DLL not loaded");
78
+ const result = dll.IniciarOperacaoTEF(message.payload);
79
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
80
+ break;
81
+ }
82
+ case "RealizarPagamentoTEF": {
83
+ if (!dll) throw new Error("DLL not loaded");
84
+ const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew);
85
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
86
+ break;
87
+ }
88
+ case "RealizarPixTEF": {
89
+ if (!dll) throw new Error("DLL not loaded");
90
+ const result = dll.RealizarPixTEF(message.payload, message.isNew);
91
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
92
+ break;
93
+ }
94
+ case "RealizarAdmTEF": {
95
+ if (!dll) throw new Error("DLL not loaded");
96
+ const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew);
97
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
98
+ break;
99
+ }
100
+ case "ConfirmarOperacaoTEF": {
101
+ if (!dll) throw new Error("DLL not loaded");
102
+ const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action);
103
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
104
+ break;
105
+ }
106
+ case "FinalizarOperacaoTEF": {
107
+ if (!dll) throw new Error("DLL not loaded");
108
+ const result = dll.FinalizarOperacaoTEF(message.id);
109
+ import_node_worker_threads.parentPort.postMessage({ type: "result", data: result });
110
+ break;
111
+ }
112
+ case "unload": {
113
+ if (dll) {
114
+ dll.unload();
115
+ dll = null;
116
+ }
117
+ import_node_worker_threads.parentPort.postMessage({ type: "unloaded" });
118
+ break;
119
+ }
120
+ default: {
121
+ throw new Error(`Unknown message type: ${message.type}`);
122
+ }
123
+ }
124
+ } catch (error) {
125
+ import_node_worker_threads.parentPort.postMessage({
126
+ type: "error",
127
+ error: error instanceof Error ? error.message : String(error)
128
+ });
129
+ }
130
+ });
131
+ //# sourceMappingURL=worker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/worker.ts"],"sourcesContent":["/**\r\n * Worker thread that executes all native DLL calls\r\n * This prevents blocking the main Node.js thread\r\n *\r\n * This file is self-contained (doesn't import local modules) to work\r\n * both in development (tsx) and compiled (tsup).\r\n */\r\nimport { parentPort } from 'node:worker_threads'\r\nimport { join } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport koffi from 'koffi'\r\n\r\nconst DEFAULT_DLL_PATH = join('C:', 'Elgin', 'TEF', 'E1_Tef01.dll')\r\n\r\nfunction loadDll(dllPath: string = DEFAULT_DLL_PATH) {\r\n if (!existsSync(dllPath)) {\r\n throw new Error(`DLL not found: ${dllPath}`)\r\n }\r\n\r\n const lib = koffi.load(dllPath)\r\n\r\n return {\r\n GetProdutoTef: lib.func('__stdcall', 'GetProdutoTef', 'int', []),\r\n GetClientTCP: lib.func('__stdcall', 'GetClientTCP', 'string', []),\r\n SetClientTCP: lib.func('__stdcall', 'SetClientTCP', 'string', ['string', 'int']),\r\n ConfigurarDadosPDV: lib.func('__stdcall', 'ConfigurarDadosPDV', 'string', ['string', 'string', 'string', 'string', 'string']),\r\n IniciarOperacaoTEF: lib.func('__stdcall', 'IniciarOperacaoTEF', 'string', ['string']),\r\n RecuperarOperacaoTEF: lib.func('__stdcall', 'RecuperarOperacaoTEF', 'string', ['string']),\r\n RealizarPagamentoTEF: lib.func('__stdcall', 'RealizarPagamentoTEF', 'string', ['int', 'string', 'bool']),\r\n RealizarPixTEF: lib.func('__stdcall', 'RealizarPixTEF', 'string', ['string', 'bool']),\r\n RealizarAdmTEF: lib.func('__stdcall', 'RealizarAdmTEF', 'string', ['int', 'string', 'bool']),\r\n ConfirmarOperacaoTEF: lib.func('__stdcall', 'ConfirmarOperacaoTEF', 'string', ['int', 'int']),\r\n FinalizarOperacaoTEF: lib.func('__stdcall', 'FinalizarOperacaoTEF', 'string', ['int']),\r\n unload: () => lib.unload(),\r\n }\r\n}\r\n\r\ntype Dll = ReturnType<typeof loadDll>\r\n\r\ntype WorkerMessage = \r\n | { type: 'load'; dllPath?: string }\r\n | { type: 'configure'; ip: string; port: number; pdv: { pinpadText: string; version: string; storeName: string; storeCode: string; terminalId: string } }\r\n | { type: 'IniciarOperacaoTEF'; payload: string }\r\n | { type: 'RealizarPagamentoTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'RealizarPixTEF'; payload: string; isNew: boolean }\r\n | { type: 'RealizarAdmTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'ConfirmarOperacaoTEF'; sequenceId: number; action: number }\r\n | { type: 'FinalizarOperacaoTEF'; id: number }\r\n | { type: 'unload' }\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\nlet dll: Dll | null = null\r\n\r\nif (!parentPort) {\r\n throw new Error('This file must be executed as a Worker Thread')\r\n}\r\n\r\nparentPort.on('message', (message: WorkerMessage) => {\r\n try {\r\n switch (message.type) {\r\n case 'load': {\r\n dll = loadDll(message.dllPath)\r\n parentPort!.postMessage({ type: 'loaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'configure': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n dll.SetClientTCP(message.ip, message.port)\r\n dll.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 parentPort!.postMessage({ type: 'configured' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'IniciarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.IniciarOperacaoTEF(message.payload)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPagamentoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPixTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarPixTEF(message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarAdmTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'ConfirmarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'FinalizarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.FinalizarOperacaoTEF(message.id)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'unload': {\r\n if (dll) {\r\n dll.unload()\r\n dll = null\r\n }\r\n parentPort!.postMessage({ type: 'unloaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n default: {\r\n throw new Error(`Unknown message type: ${(message as any).type}`)\r\n }\r\n }\r\n } catch (error) {\r\n parentPort!.postMessage({ \r\n type: 'error', \r\n error: error instanceof Error ? error.message : String(error) \r\n } as WorkerResponse)\r\n }\r\n})\r\n"],"mappings":"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","names":["koffi"]}
@@ -0,0 +1,2 @@
1
+
2
+ export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackflow-lab/tef-elgin",
3
- "version": "2.0.2",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "description": "SDK Node.js para integração com Elgin TEF - Terminal de pagamentos eletrônicos",
6
6
  "main": "./dist/index.cjs",