@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 +12 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/worker.js +10 -10
- package/dist/worker.js.map +1 -1
- package/package.json +11 -5
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.
|
|
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
|
|
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
|
|
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 ?? "
|
|
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", "
|
|
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
|
|
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 ?? "
|
|
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
|
|
359
|
+
console.error("\n\u274C Invalid response after collect:");
|
|
360
360
|
console.error(JSON.stringify(resp, null, 2));
|
|
361
|
-
this.emit("error", "-1", "
|
|
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, "
|
|
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
|
|
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: "
|
|
518
|
+
return { codigo: -1, mensagem: "Failed to parse DLL response" };
|
|
519
519
|
}
|
|
520
520
|
}
|
|
521
521
|
_nextSeq(current) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["// API principal\r\nexport { Client } from './client.js'\r\nexport { PaymentApi } from './payment.js'\r\nexport { AdminApi } from './admin.js'\r\n\r\nexport type {\r\n PdvConfig,\r\n CollectTextEvent,\r\n CollectOptionsEvent,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n TefClientEvents,\r\n TefResponse,\r\n} from './types.js'\r\n","import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n PrintEvent,\r\n QrCodeEvent,\r\n} from './types.js'\r\n\r\nconst CARD_TYPE_CODE: Record<CardType, number> = {\r\n ask: 0,\r\n credit: 1,\r\n debit: 2,\r\n voucher: 3,\r\n fleet: 4,\r\n 'private-label': 5,\r\n}\r\n\r\nconst ADMIN_OP_CODE: Record<AdminOp, number> = {\r\n ask: 0,\r\n cancel: 1,\r\n pending: 2,\r\n reprint: 3,\r\n}\r\n\r\ntype OperationType = 'payment' | 'pix' | 'admin'\r\n\r\ntype CollectResolve = (value: { info: string; cancel: boolean }) => void\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\n/**\r\n * 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.
|
|
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
|
|
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
|
|
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 ?? "
|
|
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", "
|
|
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
|
|
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 ?? "
|
|
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
|
|
330
|
+
console.error("\n\u274C Invalid response after collect:");
|
|
331
331
|
console.error(JSON.stringify(resp, null, 2));
|
|
332
|
-
this.emit("error", "-1", "
|
|
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, "
|
|
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
|
|
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: "
|
|
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":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/payment.ts","../src/admin.ts"],"sourcesContent":["import { EventEmitter } from 'node:events'\r\nimport { existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\nimport { Worker } from 'node:worker_threads'\r\nimport type { ElginDll } from './loader.js'\r\nimport { PaymentApi } from './payment.js'\r\nimport { AdminApi } from './admin.js'\r\nimport type {\r\n PdvConfig,\r\n TefResponse,\r\n CardType,\r\n AdminOp,\r\n TefClientEvents,\r\n ApprovedEvent,\r\n 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
|
|
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("
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(`
|
|
97
|
+
throw new Error(`Unknown message type: ${message.type}`);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
} catch (error) {
|
package/dist/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/worker.ts"],"sourcesContent":["/**\r\n * Worker thread
|
|
1
|
+
{"version":3,"sources":["../src/worker.ts"],"sourcesContent":["/**\r\n * Worker thread that executes all native DLL calls\r\n * This prevents blocking the main Node.js thread\r\n *\r\n * This file is self-contained (doesn't import local modules) to work\r\n * both in development (tsx) and compiled (tsup).\r\n */\r\nimport { parentPort } from 'node:worker_threads'\r\nimport { join } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport koffi from 'koffi'\r\n\r\nconst DEFAULT_DLL_PATH = join('C:', 'Elgin', 'TEF', 'E1_Tef01.dll')\r\n\r\nfunction loadDll(dllPath: string = DEFAULT_DLL_PATH) {\r\n if (!existsSync(dllPath)) {\r\n throw new Error(`DLL not found: ${dllPath}`)\r\n }\r\n\r\n const lib = koffi.load(dllPath)\r\n\r\n return {\r\n GetProdutoTef: lib.func('__stdcall', 'GetProdutoTef', 'int', []),\r\n GetClientTCP: lib.func('__stdcall', 'GetClientTCP', 'string', []),\r\n SetClientTCP: lib.func('__stdcall', 'SetClientTCP', 'string', ['string', 'int']),\r\n ConfigurarDadosPDV: lib.func('__stdcall', 'ConfigurarDadosPDV', 'string', ['string', 'string', 'string', 'string', 'string']),\r\n IniciarOperacaoTEF: lib.func('__stdcall', 'IniciarOperacaoTEF', 'string', ['string']),\r\n RecuperarOperacaoTEF: lib.func('__stdcall', 'RecuperarOperacaoTEF', 'string', ['string']),\r\n RealizarPagamentoTEF: lib.func('__stdcall', 'RealizarPagamentoTEF', 'string', ['int', 'string', 'bool']),\r\n RealizarPixTEF: lib.func('__stdcall', 'RealizarPixTEF', 'string', ['string', 'bool']),\r\n RealizarAdmTEF: lib.func('__stdcall', 'RealizarAdmTEF', 'string', ['int', 'string', 'bool']),\r\n ConfirmarOperacaoTEF: lib.func('__stdcall', 'ConfirmarOperacaoTEF', 'string', ['int', 'int']),\r\n FinalizarOperacaoTEF: lib.func('__stdcall', 'FinalizarOperacaoTEF', 'string', ['int']),\r\n unload: () => lib.unload(),\r\n }\r\n}\r\n\r\ntype Dll = ReturnType<typeof loadDll>\r\n\r\ntype WorkerMessage = \r\n | { type: 'load'; dllPath?: string }\r\n | { type: 'configure'; ip: string; port: number; pdv: { pinpadText: string; version: string; storeName: string; storeCode: string; terminalId: string } }\r\n | { type: 'IniciarOperacaoTEF'; payload: string }\r\n | { type: 'RealizarPagamentoTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'RealizarPixTEF'; payload: string; isNew: boolean }\r\n | { type: 'RealizarAdmTEF'; code: number; payload: string; isNew: boolean }\r\n | { type: 'ConfirmarOperacaoTEF'; sequenceId: number; action: number }\r\n | { type: 'FinalizarOperacaoTEF'; id: number }\r\n | { type: 'unload' }\r\n\r\ntype WorkerResponse = \r\n | { type: 'loaded' }\r\n | { type: 'configured' }\r\n | { type: 'result'; data: string }\r\n | { type: 'unloaded' }\r\n | { type: 'error'; error: string }\r\n\r\nlet dll: Dll | null = null\r\n\r\nif (!parentPort) {\r\n throw new Error('This file must be executed as a Worker Thread')\r\n}\r\n\r\nparentPort.on('message', (message: WorkerMessage) => {\r\n try {\r\n switch (message.type) {\r\n case 'load': {\r\n dll = loadDll(message.dllPath)\r\n parentPort!.postMessage({ type: 'loaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'configure': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n dll.SetClientTCP(message.ip, message.port)\r\n dll.ConfigurarDadosPDV(\r\n message.pdv.pinpadText,\r\n message.pdv.version,\r\n message.pdv.storeName,\r\n message.pdv.storeCode,\r\n message.pdv.terminalId,\r\n )\r\n parentPort!.postMessage({ type: 'configured' } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'IniciarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.IniciarOperacaoTEF(message.payload)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPagamentoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarPagamentoTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarPixTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarPixTEF(message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'RealizarAdmTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.RealizarAdmTEF(message.code, message.payload, message.isNew)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'ConfirmarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.ConfirmarOperacaoTEF(message.sequenceId, message.action)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'FinalizarOperacaoTEF': {\r\n if (!dll) throw new Error('DLL not loaded')\r\n const result = dll.FinalizarOperacaoTEF(message.id)\r\n parentPort!.postMessage({ type: 'result', data: result } as WorkerResponse)\r\n break\r\n }\r\n\r\n case 'unload': {\r\n if (dll) {\r\n dll.unload()\r\n dll = null\r\n }\r\n parentPort!.postMessage({ type: 'unloaded' } as WorkerResponse)\r\n break\r\n }\r\n\r\n default: {\r\n throw new Error(`Unknown message type: ${(message as any).type}`)\r\n }\r\n }\r\n } catch (error) {\r\n parentPort!.postMessage({ \r\n type: 'error', \r\n error: error instanceof Error ? error.message : String(error) \r\n } as WorkerResponse)\r\n }\r\n})\r\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stackflow-lab/tef-elgin",
|
|
3
|
-
"version": "2.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.
|
|
7
|
-
"module": "./dist/index.
|
|
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":
|
|
13
|
-
|
|
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": [
|