@stackflow-lab/tef-elgin 2.0.0 → 2.0.2

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,7 +141,7 @@ 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
- return (0, import_node_path.join)(dir, "worker.mjs");
144
+ return (0, import_node_path.join)(dir, "worker.js");
145
145
  }
146
146
  var Client = class _Client extends import_node_events.EventEmitter {
147
147
  worker = null;
@@ -263,7 +263,7 @@ var Client = class _Client extends import_node_events.EventEmitter {
263
263
  this.workerPromiseReject = reject;
264
264
  this.worker.postMessage(message);
265
265
  } else {
266
- reject(new Error("Worker n\xE3o inicializado"));
266
+ reject(new Error("Worker not initialized"));
267
267
  }
268
268
  });
269
269
  }
@@ -329,14 +329,14 @@ var Client = class _Client extends import_node_events.EventEmitter {
329
329
  this._log("\u{1F4E5} IniciarOperacaoTEF response", startResp);
330
330
  if (!startResp.tef) {
331
331
  this._log("\u26A0\uFE0F IniciarOperacaoTEF error", { codigo: startResp.codigo, mensagem: startResp.mensagem });
332
- console.error("\n\u274C Erro ao iniciar opera\xE7\xE3o TEF:");
332
+ console.error("\n\u274C Failed to start TEF operation:");
333
333
  console.error(JSON.stringify(startResp, null, 2));
334
- this.emit("error", String(startResp.codigo ?? "-1"), startResp.mensagem ?? "Falha ao iniciar opera\xE7\xE3o TEF");
334
+ this.emit("error", String(startResp.codigo ?? "-1"), startResp.mensagem ?? "Failed to start TEF operation");
335
335
  await this._finalize();
336
336
  return;
337
337
  }
338
338
  if (startResp.tef.retorno !== "1") {
339
- this.emit("error", startResp.tef.retorno ?? "-1", "Falha ao iniciar opera\xE7\xE3o TEF");
339
+ this.emit("error", startResp.tef.retorno ?? "-1", "Failed to start TEF operation");
340
340
  await this._finalize();
341
341
  return;
342
342
  }
@@ -347,18 +347,18 @@ var Client = class _Client extends import_node_events.EventEmitter {
347
347
  let resp = await this._callTransaction(payload, true);
348
348
  if (!resp.tef) {
349
349
  this._log("\u26A0\uFE0F DLL error response", { codigo: resp.codigo, mensagem: resp.mensagem });
350
- console.error("\n\u274C Erro da DLL:");
350
+ console.error("\n\u274C DLL error:");
351
351
  console.error(JSON.stringify(resp, null, 2));
352
- this.emit("error", String(resp.codigo ?? "-1"), resp.mensagem ?? "Erro na DLL");
352
+ this.emit("error", String(resp.codigo ?? "-1"), resp.mensagem ?? "DLL error");
353
353
  await this._finalize();
354
354
  return;
355
355
  }
356
356
  resp = await this._collectLoop(resp);
357
357
  if (!resp.tef) {
358
358
  this._log("\u26A0\uFE0F Response missing tef after collect loop");
359
- console.error("\n\u274C Resposta inv\xE1lida ap\xF3s coleta:");
359
+ console.error("\n\u274C Invalid response after collect:");
360
360
  console.error(JSON.stringify(resp, null, 2));
361
- this.emit("error", "-1", "Resposta inv\xE1lida da DLL");
361
+ this.emit("error", "-1", "Invalid DLL response");
362
362
  await this._finalize();
363
363
  return;
364
364
  }
@@ -402,14 +402,14 @@ var Client = class _Client extends import_node_events.EventEmitter {
402
402
  }
403
403
  } else {
404
404
  this._log("\u274C Emitting declined", { retorno });
405
- this.emit("declined", retorno, "Transa\xE7\xE3o recusada");
405
+ this.emit("declined", retorno, "Transaction declined");
406
406
  }
407
407
  await this._finalize();
408
408
  }
409
409
  async _collectLoop(resp) {
410
410
  if (!resp.tef) {
411
411
  this._log("\u26A0\uFE0F Response missing tef object", resp);
412
- console.error("\n\u26A0\uFE0F Resposta sem objeto tef:");
412
+ console.error("\n\u26A0\uFE0F Response missing tef object:");
413
413
  console.error(JSON.stringify(resp, null, 2));
414
414
  return resp;
415
415
  }
@@ -515,7 +515,7 @@ var Client = class _Client extends import_node_events.EventEmitter {
515
515
  try {
516
516
  return JSON.parse(raw);
517
517
  } catch {
518
- return { codigo: -1, mensagem: "Erro ao parsear resposta da DLL" };
518
+ return { codigo: -1, mensagem: "Failed to parse DLL response" };
519
519
  }
520
520
  }
521
521
  _nextSeq(current) {
@@ -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 * Resolve o caminho do worker de forma compatível com CJS e ESM.\r\n * - ESM / tsx: import.meta.url está disponível\r\n * - CJS (tsup build): import.meta.url é string vazia, usa __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.mjs no dist/\r\n return join(dir, 'worker.mjs')\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 não inicializado'))\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❌ Erro ao iniciar operação TEF:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Falha ao iniciar operação TEF')\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', 'Falha ao iniciar operação TEF')\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❌ Erro da DLL:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'Erro na DLL')\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❌ Resposta inválida após coleta:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Resposta inválida da DLL')\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, 'Transação recusada')\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⚠️ Resposta sem objeto tef:')\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: 'Erro ao parsear resposta da DLL' }\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 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":[]}
package/dist/index.js CHANGED
@@ -112,7 +112,7 @@ 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
- return join(dir, "worker.mjs");
115
+ return join(dir, "worker.js");
116
116
  }
117
117
  var Client = class _Client extends EventEmitter {
118
118
  worker = null;
@@ -234,7 +234,7 @@ var Client = class _Client extends EventEmitter {
234
234
  this.workerPromiseReject = reject;
235
235
  this.worker.postMessage(message);
236
236
  } else {
237
- reject(new Error("Worker n\xE3o inicializado"));
237
+ reject(new Error("Worker not initialized"));
238
238
  }
239
239
  });
240
240
  }
@@ -300,14 +300,14 @@ var Client = class _Client extends EventEmitter {
300
300
  this._log("\u{1F4E5} IniciarOperacaoTEF response", startResp);
301
301
  if (!startResp.tef) {
302
302
  this._log("\u26A0\uFE0F IniciarOperacaoTEF error", { codigo: startResp.codigo, mensagem: startResp.mensagem });
303
- console.error("\n\u274C Erro ao iniciar opera\xE7\xE3o TEF:");
303
+ console.error("\n\u274C Failed to start TEF operation:");
304
304
  console.error(JSON.stringify(startResp, null, 2));
305
- this.emit("error", String(startResp.codigo ?? "-1"), startResp.mensagem ?? "Falha ao iniciar opera\xE7\xE3o TEF");
305
+ this.emit("error", String(startResp.codigo ?? "-1"), startResp.mensagem ?? "Failed to start TEF operation");
306
306
  await this._finalize();
307
307
  return;
308
308
  }
309
309
  if (startResp.tef.retorno !== "1") {
310
- this.emit("error", startResp.tef.retorno ?? "-1", "Falha ao iniciar opera\xE7\xE3o TEF");
310
+ this.emit("error", startResp.tef.retorno ?? "-1", "Failed to start TEF operation");
311
311
  await this._finalize();
312
312
  return;
313
313
  }
@@ -318,18 +318,18 @@ var Client = class _Client extends EventEmitter {
318
318
  let resp = await this._callTransaction(payload, true);
319
319
  if (!resp.tef) {
320
320
  this._log("\u26A0\uFE0F DLL error response", { codigo: resp.codigo, mensagem: resp.mensagem });
321
- console.error("\n\u274C Erro da DLL:");
321
+ console.error("\n\u274C DLL error:");
322
322
  console.error(JSON.stringify(resp, null, 2));
323
- this.emit("error", String(resp.codigo ?? "-1"), resp.mensagem ?? "Erro na DLL");
323
+ this.emit("error", String(resp.codigo ?? "-1"), resp.mensagem ?? "DLL error");
324
324
  await this._finalize();
325
325
  return;
326
326
  }
327
327
  resp = await this._collectLoop(resp);
328
328
  if (!resp.tef) {
329
329
  this._log("\u26A0\uFE0F Response missing tef after collect loop");
330
- console.error("\n\u274C Resposta inv\xE1lida ap\xF3s coleta:");
330
+ console.error("\n\u274C Invalid response after collect:");
331
331
  console.error(JSON.stringify(resp, null, 2));
332
- this.emit("error", "-1", "Resposta inv\xE1lida da DLL");
332
+ this.emit("error", "-1", "Invalid DLL response");
333
333
  await this._finalize();
334
334
  return;
335
335
  }
@@ -373,14 +373,14 @@ var Client = class _Client extends EventEmitter {
373
373
  }
374
374
  } else {
375
375
  this._log("\u274C Emitting declined", { retorno });
376
- this.emit("declined", retorno, "Transa\xE7\xE3o recusada");
376
+ this.emit("declined", retorno, "Transaction declined");
377
377
  }
378
378
  await this._finalize();
379
379
  }
380
380
  async _collectLoop(resp) {
381
381
  if (!resp.tef) {
382
382
  this._log("\u26A0\uFE0F Response missing tef object", resp);
383
- console.error("\n\u26A0\uFE0F Resposta sem objeto tef:");
383
+ console.error("\n\u26A0\uFE0F Response missing tef object:");
384
384
  console.error(JSON.stringify(resp, null, 2));
385
385
  return resp;
386
386
  }
@@ -486,7 +486,7 @@ var Client = class _Client extends EventEmitter {
486
486
  try {
487
487
  return JSON.parse(raw);
488
488
  } catch {
489
- return { codigo: -1, mensagem: "Erro ao parsear resposta da DLL" };
489
+ return { codigo: -1, mensagem: "Failed to parse DLL response" };
490
490
  }
491
491
  }
492
492
  _nextSeq(current) {
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 * Resolve o caminho do worker de forma compatível com CJS e ESM.\r\n * - ESM / tsx: import.meta.url está disponível\r\n * - CJS (tsup build): import.meta.url é string vazia, usa __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.mjs no dist/\r\n return join(dir, 'worker.mjs')\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 não inicializado'))\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❌ Erro ao iniciar operação TEF:')\r\n console.error(JSON.stringify(startResp, null, 2))\r\n this.emit('error', String(startResp.codigo ?? '-1'), startResp.mensagem ?? 'Falha ao iniciar operação TEF')\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', 'Falha ao iniciar operação TEF')\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❌ Erro da DLL:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', String(resp.codigo ?? '-1'), resp.mensagem ?? 'Erro na DLL')\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❌ Resposta inválida após coleta:')\r\n console.error(JSON.stringify(resp, null, 2))\r\n this.emit('error', '-1', 'Resposta inválida da DLL')\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, 'Transação recusada')\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⚠️ Resposta sem objeto tef:')\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: 'Erro ao parsear resposta da DLL' }\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,YAAY;AAC/B;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,4BAAyB,CAAC;AAAA,MAC7C;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,8CAAmC;AACjD,cAAQ,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAChD,WAAK,KAAK,SAAS,OAAO,UAAU,UAAU,IAAI,GAAG,UAAU,YAAY,qCAA+B;AAC1G,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAEA,QAAI,UAAU,IAAI,YAAY,KAAK;AACjC,WAAK,KAAK,SAAS,UAAU,IAAI,WAAW,MAAM,qCAA+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,uBAAkB;AAChC,cAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C,WAAK,KAAK,SAAS,OAAO,KAAK,UAAU,IAAI,GAAG,KAAK,YAAY,aAAa;AAC9E,YAAM,KAAK,UAAU;AACrB;AAAA,IACF;AAGA,WAAO,MAAM,KAAK,aAAa,IAAI;AAGnC,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,KAAK,uDAA6C;AACvD,cAAQ,MAAM,+CAAoC;AAClD,cAAQ,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C,WAAK,KAAK,SAAS,MAAM,6BAA0B;AACnD,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,0BAAoB;AAAA,IACrD;AAGA,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAc,aAAa,MAAyC;AAElE,QAAI,CAAC,KAAK,KAAK;AACb,WAAK,KAAK,6CAAmC,IAAI;AACjD,cAAQ,MAAM,0CAAgC;AAC9C,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,kCAAkC;AAAA,IACnE;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 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":[]}
package/dist/worker.js CHANGED
@@ -6,7 +6,7 @@ import koffi from "koffi";
6
6
  var DEFAULT_DLL_PATH = join("C:", "Elgin", "TEF", "E1_Tef01.dll");
7
7
  function loadDll(dllPath = DEFAULT_DLL_PATH) {
8
8
  if (!existsSync(dllPath)) {
9
- throw new Error(`DLL n\xE3o encontrada: ${dllPath}`);
9
+ throw new Error(`DLL not found: ${dllPath}`);
10
10
  }
11
11
  const lib = koffi.load(dllPath);
12
12
  return {
@@ -26,7 +26,7 @@ function loadDll(dllPath = DEFAULT_DLL_PATH) {
26
26
  }
27
27
  var dll = null;
28
28
  if (!parentPort) {
29
- throw new Error("Este arquivo deve ser executado como Worker Thread");
29
+ throw new Error("This file must be executed as a Worker Thread");
30
30
  }
31
31
  parentPort.on("message", (message) => {
32
32
  try {
@@ -37,7 +37,7 @@ parentPort.on("message", (message) => {
37
37
  break;
38
38
  }
39
39
  case "configure": {
40
- if (!dll) throw new Error("DLL n\xE3o carregada");
40
+ if (!dll) throw new Error("DLL not loaded");
41
41
  dll.SetClientTCP(message.ip, message.port);
42
42
  dll.ConfigurarDadosPDV(
43
43
  message.pdv.pinpadText,
@@ -50,37 +50,37 @@ parentPort.on("message", (message) => {
50
50
  break;
51
51
  }
52
52
  case "IniciarOperacaoTEF": {
53
- if (!dll) throw new Error("DLL n\xE3o carregada");
53
+ if (!dll) throw new Error("DLL not loaded");
54
54
  const result = dll.IniciarOperacaoTEF(message.payload);
55
55
  parentPort.postMessage({ type: "result", data: result });
56
56
  break;
57
57
  }
58
58
  case "RealizarPagamentoTEF": {
59
- if (!dll) throw new Error("DLL n\xE3o carregada");
59
+ if (!dll) throw new Error("DLL not loaded");
60
60
  const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew);
61
61
  parentPort.postMessage({ type: "result", data: result });
62
62
  break;
63
63
  }
64
64
  case "RealizarPixTEF": {
65
- if (!dll) throw new Error("DLL n\xE3o carregada");
65
+ if (!dll) throw new Error("DLL not loaded");
66
66
  const result = dll.RealizarPixTEF(message.payload, message.isNew);
67
67
  parentPort.postMessage({ type: "result", data: result });
68
68
  break;
69
69
  }
70
70
  case "RealizarAdmTEF": {
71
- if (!dll) throw new Error("DLL n\xE3o carregada");
71
+ if (!dll) throw new Error("DLL not loaded");
72
72
  const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew);
73
73
  parentPort.postMessage({ type: "result", data: result });
74
74
  break;
75
75
  }
76
76
  case "ConfirmarOperacaoTEF": {
77
- if (!dll) throw new Error("DLL n\xE3o carregada");
77
+ if (!dll) throw new Error("DLL not loaded");
78
78
  const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action);
79
79
  parentPort.postMessage({ type: "result", data: result });
80
80
  break;
81
81
  }
82
82
  case "FinalizarOperacaoTEF": {
83
- if (!dll) throw new Error("DLL n\xE3o carregada");
83
+ if (!dll) throw new Error("DLL not loaded");
84
84
  const result = dll.FinalizarOperacaoTEF(message.id);
85
85
  parentPort.postMessage({ type: "result", data: result });
86
86
  break;
@@ -94,7 +94,7 @@ parentPort.on("message", (message) => {
94
94
  break;
95
95
  }
96
96
  default: {
97
- throw new Error(`Tipo de mensagem desconhecido: ${message.type}`);
97
+ throw new Error(`Unknown message type: ${message.type}`);
98
98
  }
99
99
  }
100
100
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/worker.ts"],"sourcesContent":["/**\r\n * Worker thread que executa todas as chamadas à DLL nativa\r\n * Isso evita bloquear a thread principal do Node.js\r\n *\r\n * Este arquivo é auto-contido (não importa módulos locais) para funcionar\r\n * tanto em desenvolvimento (tsx) quanto compilado (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 não encontrada: ${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('Este arquivo deve ser executado como 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 não carregada')\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 não carregada')\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 não carregada')\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 não carregada')\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 não carregada')\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 não carregada')\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 não carregada')\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(`Tipo de mensagem desconhecido: ${(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":[]}
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":";AAOA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAC3B,OAAO,WAAW;AAElB,IAAM,mBAAmB,KAAK,MAAM,SAAS,OAAO,cAAc;AAElE,SAAS,QAAQ,UAAkB,kBAAkB;AACnD,MAAI,CAAC,WAAW,OAAO,GAAG;AACxB,UAAM,IAAI,MAAM,kBAAkB,OAAO,EAAE;AAAA,EAC7C;AAEA,QAAM,MAAM,MAAM,KAAK,OAAO;AAE9B,SAAO;AAAA,IACL,eAAe,IAAI,KAAK,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAAA,IAC/D,cAAc,IAAI,KAAK,aAAa,gBAAgB,UAAU,CAAC,CAAC;AAAA,IAChE,cAAc,IAAI,KAAK,aAAa,gBAAgB,UAAU,CAAC,UAAU,KAAK,CAAC;AAAA,IAC/E,oBAAoB,IAAI,KAAK,aAAa,sBAAsB,UAAU,CAAC,UAAU,UAAU,UAAU,UAAU,QAAQ,CAAC;AAAA,IAC5H,oBAAoB,IAAI,KAAK,aAAa,sBAAsB,UAAU,CAAC,QAAQ,CAAC;AAAA,IACpF,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,QAAQ,CAAC;AAAA,IACxF,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,OAAO,UAAU,MAAM,CAAC;AAAA,IACvG,gBAAgB,IAAI,KAAK,aAAa,kBAAkB,UAAU,CAAC,UAAU,MAAM,CAAC;AAAA,IACpF,gBAAgB,IAAI,KAAK,aAAa,kBAAkB,UAAU,CAAC,OAAO,UAAU,MAAM,CAAC;AAAA,IAC3F,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,OAAO,KAAK,CAAC;AAAA,IAC5F,sBAAsB,IAAI,KAAK,aAAa,wBAAwB,UAAU,CAAC,KAAK,CAAC;AAAA,IACrF,QAAQ,MAAM,IAAI,OAAO;AAAA,EAC3B;AACF;AAsBA,IAAI,MAAkB;AAEtB,IAAI,CAAC,YAAY;AACf,QAAM,IAAI,MAAM,+CAA+C;AACjE;AAEA,WAAW,GAAG,WAAW,CAAC,YAA2B;AACnD,MAAI;AACF,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,QAAQ;AACX,cAAM,QAAQ,QAAQ,OAAO;AAC7B,mBAAY,YAAY,EAAE,MAAM,SAAS,CAAmB;AAC5D;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,YAAI,aAAa,QAAQ,IAAI,QAAQ,IAAI;AACzC,YAAI;AAAA,UACF,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,UACZ,QAAQ,IAAI;AAAA,QACd;AACA,mBAAY,YAAY,EAAE,MAAM,aAAa,CAAmB;AAChE;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,mBAAmB,QAAQ,OAAO;AACrD,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AACpF,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,eAAe,QAAQ,SAAS,QAAQ,KAAK;AAChE,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,eAAe,QAAQ,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAC9E,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,YAAY,QAAQ,MAAM;AAC1E,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gBAAgB;AAC1C,cAAM,SAAS,IAAI,qBAAqB,QAAQ,EAAE;AAClD,mBAAY,YAAY,EAAE,MAAM,UAAU,MAAM,OAAO,CAAmB;AAC1E;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,YAAI,KAAK;AACP,cAAI,OAAO;AACX,gBAAM;AAAA,QACR;AACA,mBAAY,YAAY,EAAE,MAAM,WAAW,CAAmB;AAC9D;AAAA,MACF;AAAA,MAEA,SAAS;AACP,cAAM,IAAI,MAAM,yBAA0B,QAAgB,IAAI,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,eAAY,YAAY;AAAA,MACtB,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAmB;AAAA,EACrB;AACF,CAAC;","names":[]}
package/package.json CHANGED
@@ -1,16 +1,22 @@
1
1
  {
2
2
  "name": "@stackflow-lab/tef-elgin",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "type": "module",
5
5
  "description": "SDK Node.js para integração com Elgin TEF - Terminal de pagamentos eletrônicos",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.mjs",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
9
  "exports": {
10
10
  ".": {
11
11
  "types": "./dist/index.d.ts",
12
- "require": "./dist/index.js",
13
- "import": "./dist/index.mjs"
12
+ "require": {
13
+ "types": "./dist/index.d.cts",
14
+ "default": "./dist/index.cjs"
15
+ },
16
+ "import": {
17
+ "types": "./dist/index.d.ts",
18
+ "default": "./dist/index.js"
19
+ }
14
20
  }
15
21
  },
16
22
  "files": [