@stackflow-lab/tef-elgin 1.0.3
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/LICENSE +21 -0
- package/README.md +546 -0
- package/dist/index.cjs +536 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +232 -0
- package/dist/index.d.ts +232 -0
- package/dist/index.js +506 -0
- package/dist/index.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +107 -0
- package/dist/worker.js.map +1 -0
- package/package.json +78 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
// src/client.ts
|
|
2
|
+
import { EventEmitter } from "events";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { join, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { Worker } from "worker_threads";
|
|
7
|
+
|
|
8
|
+
// src/payment.ts
|
|
9
|
+
var PaymentApi = class {
|
|
10
|
+
constructor(client) {
|
|
11
|
+
this.client = client;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* PIX payment
|
|
15
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
16
|
+
*/
|
|
17
|
+
async pix(amount) {
|
|
18
|
+
return this.client._executePix(amount);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Credit card payment
|
|
22
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
23
|
+
*/
|
|
24
|
+
async credit(amount) {
|
|
25
|
+
return this.client._executePayment("credit", amount);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Debit card payment
|
|
29
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
30
|
+
*/
|
|
31
|
+
async debit(amount) {
|
|
32
|
+
return this.client._executePayment("debit", amount);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Voucher card payment
|
|
36
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
37
|
+
*/
|
|
38
|
+
async voucher(amount) {
|
|
39
|
+
return this.client._executePayment("voucher", amount);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Fleet card payment
|
|
43
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
44
|
+
*/
|
|
45
|
+
async fleet(amount) {
|
|
46
|
+
return this.client._executePayment("fleet", amount);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Private label card payment
|
|
50
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
51
|
+
*/
|
|
52
|
+
async privateLabel(amount) {
|
|
53
|
+
return this.client._executePayment("private-label", amount);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ask user which card type to use
|
|
57
|
+
* @param amount - Amount in format "10.00" or "1000" (cents)
|
|
58
|
+
*/
|
|
59
|
+
async ask(amount) {
|
|
60
|
+
return this.client._executePayment("ask", amount);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// src/admin.ts
|
|
65
|
+
var AdminApi = class {
|
|
66
|
+
constructor(client) {
|
|
67
|
+
this.client = client;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Ask user which administrative operation to perform
|
|
71
|
+
*/
|
|
72
|
+
async ask() {
|
|
73
|
+
return this.client._executeAdmin("ask");
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Cancel a previous transaction
|
|
77
|
+
*/
|
|
78
|
+
async cancel() {
|
|
79
|
+
return this.client._executeAdmin("cancel");
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check for pending transactions
|
|
83
|
+
*/
|
|
84
|
+
async pending() {
|
|
85
|
+
return this.client._executeAdmin("pending");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Reprint last receipt
|
|
89
|
+
*/
|
|
90
|
+
async reprint() {
|
|
91
|
+
return this.client._executeAdmin("reprint");
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// src/client.ts
|
|
96
|
+
var CARD_TYPE_CODE = {
|
|
97
|
+
ask: 0,
|
|
98
|
+
credit: 1,
|
|
99
|
+
debit: 2,
|
|
100
|
+
voucher: 3,
|
|
101
|
+
fleet: 4,
|
|
102
|
+
"private-label": 5
|
|
103
|
+
};
|
|
104
|
+
var ADMIN_OP_CODE = {
|
|
105
|
+
ask: 0,
|
|
106
|
+
cancel: 1,
|
|
107
|
+
pending: 2,
|
|
108
|
+
reprint: 3
|
|
109
|
+
};
|
|
110
|
+
function getWorkerPath() {
|
|
111
|
+
const metaUrl = import.meta.url;
|
|
112
|
+
const dir = metaUrl ? dirname(fileURLToPath(metaUrl)) : __dirname;
|
|
113
|
+
const tsWorker = join(dir, "worker.ts");
|
|
114
|
+
if (existsSync(tsWorker)) return tsWorker;
|
|
115
|
+
return join(dir, "worker.mjs");
|
|
116
|
+
}
|
|
117
|
+
var Client = class _Client extends EventEmitter {
|
|
118
|
+
worker = null;
|
|
119
|
+
mockDll = null;
|
|
120
|
+
// Para testes
|
|
121
|
+
operationType = "payment";
|
|
122
|
+
cardType = "ask";
|
|
123
|
+
adminOp = "ask";
|
|
124
|
+
collectResolver = null;
|
|
125
|
+
_debugEnabled = false;
|
|
126
|
+
workerPromiseResolve = null;
|
|
127
|
+
workerPromiseReject = null;
|
|
128
|
+
/** Payment operations - use methods like payment.pix(), payment.credit(), etc. */
|
|
129
|
+
payment;
|
|
130
|
+
/** Administrative operations - use methods like admin.cancel(), admin.pending(), etc. */
|
|
131
|
+
admin;
|
|
132
|
+
constructor(dllPathOrInstance) {
|
|
133
|
+
super();
|
|
134
|
+
if (typeof dllPathOrInstance === "object" && dllPathOrInstance !== null) {
|
|
135
|
+
this.mockDll = dllPathOrInstance;
|
|
136
|
+
} else {
|
|
137
|
+
this.worker = new Worker(getWorkerPath());
|
|
138
|
+
this.worker.on("message", (response) => {
|
|
139
|
+
if (response.type === "result") {
|
|
140
|
+
this.workerPromiseResolve?.(response.data);
|
|
141
|
+
} else if (response.type === "error") {
|
|
142
|
+
this.workerPromiseReject?.(new Error(response.error));
|
|
143
|
+
} else if (response.type === "loaded" || response.type === "configured" || response.type === "unloaded") {
|
|
144
|
+
this.workerPromiseResolve?.("");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
this.worker.on("error", (error) => {
|
|
148
|
+
this.workerPromiseReject?.(error);
|
|
149
|
+
});
|
|
150
|
+
this._sendToWorker({ type: "load", dllPath: typeof dllPathOrInstance === "string" ? dllPathOrInstance : void 0 });
|
|
151
|
+
}
|
|
152
|
+
this.payment = new PaymentApi(this);
|
|
153
|
+
this.admin = new AdminApi(this);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Creates a new Client instance
|
|
157
|
+
* @param dllPath - Optional path to the DLL (defaults to C:\Elgin\TEF\E1_Tef01.dll)
|
|
158
|
+
*/
|
|
159
|
+
static instance(dllPath) {
|
|
160
|
+
return new _Client(dllPath);
|
|
161
|
+
}
|
|
162
|
+
// Debug
|
|
163
|
+
/**
|
|
164
|
+
* Enables debug logging to see all DLL calls, responses, and events
|
|
165
|
+
*/
|
|
166
|
+
enableDebug() {
|
|
167
|
+
this._debugEnabled = true;
|
|
168
|
+
this._log("\u{1F41B} Debug mode enabled");
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Disables debug logging
|
|
172
|
+
*/
|
|
173
|
+
disableDebug() {
|
|
174
|
+
this._log("\u{1F41B} Debug mode disabled");
|
|
175
|
+
this._debugEnabled = false;
|
|
176
|
+
}
|
|
177
|
+
_log(message, data) {
|
|
178
|
+
if (!this._debugEnabled) return;
|
|
179
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().split("T")[1].slice(0, 12);
|
|
180
|
+
if (data !== void 0) {
|
|
181
|
+
console.log(`[${timestamp}] ${message}`, data);
|
|
182
|
+
} else {
|
|
183
|
+
console.log(`[${timestamp}] ${message}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Worker communication
|
|
187
|
+
_sendToWorker(message) {
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
if (this.mockDll) {
|
|
190
|
+
try {
|
|
191
|
+
let result = "";
|
|
192
|
+
switch (message.type) {
|
|
193
|
+
case "load":
|
|
194
|
+
case "configured":
|
|
195
|
+
case "unload":
|
|
196
|
+
result = "";
|
|
197
|
+
break;
|
|
198
|
+
case "IniciarOperacaoTEF":
|
|
199
|
+
result = this.mockDll.IniciarOperacaoTEF(message.payload);
|
|
200
|
+
break;
|
|
201
|
+
case "RealizarPagamentoTEF":
|
|
202
|
+
result = this.mockDll.RealizarPagamentoTEF(message.code, message.payload, message.isNew);
|
|
203
|
+
break;
|
|
204
|
+
case "RealizarPixTEF":
|
|
205
|
+
result = this.mockDll.RealizarPixTEF(message.payload, message.isNew);
|
|
206
|
+
break;
|
|
207
|
+
case "RealizarAdmTEF":
|
|
208
|
+
result = this.mockDll.RealizarAdmTEF(message.code, message.payload, message.isNew);
|
|
209
|
+
break;
|
|
210
|
+
case "ConfirmarOperacaoTEF":
|
|
211
|
+
result = this.mockDll.ConfirmarOperacaoTEF(message.sequenceId, message.action);
|
|
212
|
+
break;
|
|
213
|
+
case "FinalizarOperacaoTEF":
|
|
214
|
+
result = this.mockDll.FinalizarOperacaoTEF(message.id);
|
|
215
|
+
break;
|
|
216
|
+
case "configure":
|
|
217
|
+
this.mockDll.SetClientTCP(message.ip, message.port);
|
|
218
|
+
this.mockDll.ConfigurarDadosPDV(
|
|
219
|
+
message.pdv.pinpadText,
|
|
220
|
+
message.pdv.version,
|
|
221
|
+
message.pdv.storeName,
|
|
222
|
+
message.pdv.storeCode,
|
|
223
|
+
message.pdv.terminalId
|
|
224
|
+
);
|
|
225
|
+
result = "";
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
resolve(result);
|
|
229
|
+
} catch (error) {
|
|
230
|
+
reject(error);
|
|
231
|
+
}
|
|
232
|
+
} else if (this.worker) {
|
|
233
|
+
this.workerPromiseResolve = resolve;
|
|
234
|
+
this.workerPromiseReject = reject;
|
|
235
|
+
this.worker.postMessage(message);
|
|
236
|
+
} else {
|
|
237
|
+
reject(new Error("Worker n\xE3o inicializado"));
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Configuration
|
|
242
|
+
async configure(ip, port, pdv) {
|
|
243
|
+
this._log("\u{1F4E1} Configuring client", { ip, port, pdv });
|
|
244
|
+
await this._sendToWorker({
|
|
245
|
+
type: "configure",
|
|
246
|
+
ip,
|
|
247
|
+
port,
|
|
248
|
+
pdv
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// User response
|
|
252
|
+
/** @internal */
|
|
253
|
+
async _executePayment(card, amount) {
|
|
254
|
+
this._log("\u{1F4B3} Starting payment", { card, amount });
|
|
255
|
+
this.operationType = "payment";
|
|
256
|
+
this.cardType = card;
|
|
257
|
+
await this._run(amount);
|
|
258
|
+
}
|
|
259
|
+
/** @internal */
|
|
260
|
+
async _executePix(amount) {
|
|
261
|
+
this._log("\u{1F4B0} Starting PIX", { amount });
|
|
262
|
+
this.operationType = "pix";
|
|
263
|
+
await this._run(amount);
|
|
264
|
+
}
|
|
265
|
+
/** @internal */
|
|
266
|
+
async _executeAdmin(op) {
|
|
267
|
+
this._log("\u{1F527} Starting admin operation", { op });
|
|
268
|
+
this.operationType = "admin";
|
|
269
|
+
this.adminOp = op;
|
|
270
|
+
await this._run("");
|
|
271
|
+
}
|
|
272
|
+
// User response
|
|
273
|
+
/** Sends the user's answer to the pending collect request */
|
|
274
|
+
respond(info) {
|
|
275
|
+
this._log("\u{1F4E4} User responded", info);
|
|
276
|
+
this.collectResolver?.({ info, cancel: false });
|
|
277
|
+
this.collectResolver = null;
|
|
278
|
+
}
|
|
279
|
+
/** Cancels the pending collect request */
|
|
280
|
+
cancel() {
|
|
281
|
+
this._log("\u{1F6AB} User cancelled");
|
|
282
|
+
this.collectResolver?.({ info: "0", cancel: true });
|
|
283
|
+
this.collectResolver = null;
|
|
284
|
+
}
|
|
285
|
+
unload() {
|
|
286
|
+
if (this.worker) {
|
|
287
|
+
this._sendToWorker({ type: "unload" }).then(() => {
|
|
288
|
+
this.worker?.terminate();
|
|
289
|
+
this.worker = null;
|
|
290
|
+
});
|
|
291
|
+
} else if (this.mockDll) {
|
|
292
|
+
this.mockDll.unload();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Internal flow
|
|
296
|
+
async _run(amount) {
|
|
297
|
+
this._log("\u{1F680} Starting TEF session");
|
|
298
|
+
const raw = await this._sendToWorker({ type: "IniciarOperacaoTEF", payload: "{}" });
|
|
299
|
+
const startResp = this._parse(raw);
|
|
300
|
+
this._log("\u{1F4E5} IniciarOperacaoTEF response", startResp);
|
|
301
|
+
if (!startResp.tef) {
|
|
302
|
+
this._log("\u26A0\uFE0F IniciarOperacaoTEF error", { codigo: startResp.codigo, mensagem: startResp.mensagem });
|
|
303
|
+
console.error("\n\u274C Erro ao iniciar opera\xE7\xE3o TEF:");
|
|
304
|
+
console.error(JSON.stringify(startResp, null, 2));
|
|
305
|
+
this.emit("error", String(startResp.codigo ?? "-1"), startResp.mensagem ?? "Falha ao iniciar opera\xE7\xE3o TEF");
|
|
306
|
+
await this._finalize();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (startResp.tef.retorno !== "1") {
|
|
310
|
+
this.emit("error", startResp.tef.retorno ?? "-1", "Falha ao iniciar opera\xE7\xE3o TEF");
|
|
311
|
+
await this._finalize();
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const seq = this._nextSeq(startResp.tef.sequencial ?? "0");
|
|
315
|
+
this._log("\u{1F522} Sequence number", seq);
|
|
316
|
+
const payload = { sequencial: seq };
|
|
317
|
+
if (amount) payload.valorTotal = amount.replace(/\D/g, "");
|
|
318
|
+
let resp = await this._callTransaction(payload, true);
|
|
319
|
+
if (!resp.tef) {
|
|
320
|
+
this._log("\u26A0\uFE0F DLL error response", { codigo: resp.codigo, mensagem: resp.mensagem });
|
|
321
|
+
console.error("\n\u274C Erro da DLL:");
|
|
322
|
+
console.error(JSON.stringify(resp, null, 2));
|
|
323
|
+
this.emit("error", String(resp.codigo ?? "-1"), resp.mensagem ?? "Erro na DLL");
|
|
324
|
+
await this._finalize();
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
resp = await this._collectLoop(resp);
|
|
328
|
+
if (!resp.tef) {
|
|
329
|
+
this._log("\u26A0\uFE0F Response missing tef after collect loop");
|
|
330
|
+
console.error("\n\u274C Resposta inv\xE1lida ap\xF3s coleta:");
|
|
331
|
+
console.error(JSON.stringify(resp, null, 2));
|
|
332
|
+
this.emit("error", "-1", "Resposta inv\xE1lida da DLL");
|
|
333
|
+
await this._finalize();
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const retorno = resp.tef.retorno ?? "";
|
|
337
|
+
this._log("\u{1F3C1} Transaction result", { retorno });
|
|
338
|
+
if (retorno === "0" || retorno === "1") {
|
|
339
|
+
const store = resp.tef.comprovanteDiferenciadoLoja ?? "";
|
|
340
|
+
const customer = resp.tef.comprovanteDiferenciadoPortador ?? "";
|
|
341
|
+
if (store || customer) {
|
|
342
|
+
const printEvent = { store, customer };
|
|
343
|
+
this._log("\u{1F5A8}\uFE0F Emitting print", { storeLines: store.split("\n").length, customerLines: customer.split("\n").length });
|
|
344
|
+
this.emit("print", printEvent);
|
|
345
|
+
}
|
|
346
|
+
const event = {
|
|
347
|
+
sequenceId: resp.tef.sequencial ?? seq,
|
|
348
|
+
needsConfirmation: retorno === "0",
|
|
349
|
+
// Transaction details
|
|
350
|
+
acquirerDocument: resp.tef.cnpjCredenciadora,
|
|
351
|
+
authorizationCode: resp.tef.codigoAutorizacao,
|
|
352
|
+
transactionDateTime: resp.tef.dataHoraTransacao,
|
|
353
|
+
paymentMethod: resp.tef.formaPagamento,
|
|
354
|
+
merchantId: resp.tef.identificadorEstabelecimento,
|
|
355
|
+
terminalId: resp.tef.identificadorPontoCaptura,
|
|
356
|
+
message: resp.tef.mensagemResultado,
|
|
357
|
+
cardBrand: resp.tef.nomeBandeira,
|
|
358
|
+
merchantName: resp.tef.nomeEstabelecimento,
|
|
359
|
+
provider: resp.tef.nomeProvedor,
|
|
360
|
+
nsu: resp.tef.nsuTerminal,
|
|
361
|
+
maskedPan: resp.tef.panMascarado,
|
|
362
|
+
result: resp.tef.resultadoTransacao,
|
|
363
|
+
service: resp.tef.servico,
|
|
364
|
+
cardType: resp.tef.tipoCartao,
|
|
365
|
+
transaction: resp.tef.transacao,
|
|
366
|
+
uniqueId: resp.tef.uniqueID,
|
|
367
|
+
totalAmount: resp.tef.valorTotal
|
|
368
|
+
};
|
|
369
|
+
this._log("\u2705 Emitting approved", event);
|
|
370
|
+
this.emit("approved", event);
|
|
371
|
+
if (retorno === "0") {
|
|
372
|
+
await this._confirm(Number(event.sequenceId));
|
|
373
|
+
}
|
|
374
|
+
} else {
|
|
375
|
+
this._log("\u274C Emitting declined", { retorno });
|
|
376
|
+
this.emit("declined", retorno, "Transa\xE7\xE3o recusada");
|
|
377
|
+
}
|
|
378
|
+
await this._finalize();
|
|
379
|
+
}
|
|
380
|
+
async _collectLoop(resp) {
|
|
381
|
+
if (!resp.tef) {
|
|
382
|
+
this._log("\u26A0\uFE0F Response missing tef object", resp);
|
|
383
|
+
console.error("\n\u26A0\uFE0F Resposta sem objeto tef:");
|
|
384
|
+
console.error(JSON.stringify(resp, null, 2));
|
|
385
|
+
return resp;
|
|
386
|
+
}
|
|
387
|
+
if (resp.tef.retorno !== void 0 && resp.tef.retorno !== "") {
|
|
388
|
+
return resp;
|
|
389
|
+
}
|
|
390
|
+
const collectStatus = resp.tef.automacao_coleta_retorno ?? "";
|
|
391
|
+
if (collectStatus !== "0") {
|
|
392
|
+
return resp;
|
|
393
|
+
}
|
|
394
|
+
const message = resp.tef.mensagemResultado ?? "";
|
|
395
|
+
const type = resp.tef.automacao_coleta_tipo ?? "";
|
|
396
|
+
const option = resp.tef.automacao_coleta_opcao ?? "";
|
|
397
|
+
const mask = resp.tef.automacao_coleta_mascara;
|
|
398
|
+
const collectSeq = resp.tef.automacao_coleta_sequencial ?? "";
|
|
399
|
+
let info = "";
|
|
400
|
+
let shouldCancel = false;
|
|
401
|
+
if (type && !option) {
|
|
402
|
+
this._log("\u{1F4DD} Emitting collect:text", { message, type, mask });
|
|
403
|
+
this.emit("display", message);
|
|
404
|
+
this.emit("collect:text", { message, type, mask });
|
|
405
|
+
const result = await this._waitCollect();
|
|
406
|
+
info = result.info;
|
|
407
|
+
shouldCancel = result.cancel;
|
|
408
|
+
} else if (type && option) {
|
|
409
|
+
const options = option.split(";").filter(Boolean);
|
|
410
|
+
this._log("\u{1F518} Emitting collect:options", { message, options });
|
|
411
|
+
this.emit("display", message);
|
|
412
|
+
this.emit("collect:options", { message, options });
|
|
413
|
+
const result = await this._waitCollect();
|
|
414
|
+
info = options[Number(result.info)] ?? result.info;
|
|
415
|
+
shouldCancel = result.cancel;
|
|
416
|
+
} else {
|
|
417
|
+
this._log("\u23F3 Emitting waiting", message);
|
|
418
|
+
this.emit("waiting", message);
|
|
419
|
+
const qrData = this._extractQrCode(resp.tef);
|
|
420
|
+
if (qrData) {
|
|
421
|
+
const qrEvent = { data: qrData };
|
|
422
|
+
this._log("\u{1F4F1} Emitting qrcode", { dataLength: qrData.length });
|
|
423
|
+
this.emit("qrcode", qrEvent);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const payload = {
|
|
427
|
+
automacao_coleta_retorno: shouldCancel ? "9" : "0",
|
|
428
|
+
automacao_coleta_sequencial: collectSeq,
|
|
429
|
+
automacao_coleta_informacao: info
|
|
430
|
+
};
|
|
431
|
+
const next = await this._callTransaction(payload, false);
|
|
432
|
+
return this._collectLoop(next);
|
|
433
|
+
}
|
|
434
|
+
async _callTransaction(payload, isNew) {
|
|
435
|
+
const json = JSON.stringify(payload);
|
|
436
|
+
this._log(`\u{1F4DE} Calling ${this.operationType} TEF`, { payload, isNew });
|
|
437
|
+
let raw;
|
|
438
|
+
if (this.operationType === "pix") {
|
|
439
|
+
raw = await this._sendToWorker({
|
|
440
|
+
type: "RealizarPixTEF",
|
|
441
|
+
payload: json,
|
|
442
|
+
isNew
|
|
443
|
+
});
|
|
444
|
+
} else if (this.operationType === "admin") {
|
|
445
|
+
raw = await this._sendToWorker({
|
|
446
|
+
type: "RealizarAdmTEF",
|
|
447
|
+
code: ADMIN_OP_CODE[this.adminOp],
|
|
448
|
+
payload: json,
|
|
449
|
+
isNew
|
|
450
|
+
});
|
|
451
|
+
} else {
|
|
452
|
+
raw = await this._sendToWorker({
|
|
453
|
+
type: "RealizarPagamentoTEF",
|
|
454
|
+
code: CARD_TYPE_CODE[this.cardType],
|
|
455
|
+
payload: json,
|
|
456
|
+
isNew
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
const response = this._parse(raw);
|
|
460
|
+
this._log("\u{1F4E5} DLL Response", response);
|
|
461
|
+
return response;
|
|
462
|
+
}
|
|
463
|
+
async _confirm(sequenceId) {
|
|
464
|
+
this._log("\u2714\uFE0F Confirming transaction", { sequenceId });
|
|
465
|
+
await this._sendToWorker({
|
|
466
|
+
type: "ConfirmarOperacaoTEF",
|
|
467
|
+
sequenceId,
|
|
468
|
+
action: 1
|
|
469
|
+
});
|
|
470
|
+
this.emit("confirmed");
|
|
471
|
+
}
|
|
472
|
+
async _finalize() {
|
|
473
|
+
this._log("\u{1F3C1} Finalizing operation");
|
|
474
|
+
await this._sendToWorker({
|
|
475
|
+
type: "FinalizarOperacaoTEF",
|
|
476
|
+
id: 1
|
|
477
|
+
});
|
|
478
|
+
this.emit("finished");
|
|
479
|
+
}
|
|
480
|
+
_waitCollect() {
|
|
481
|
+
return new Promise((resolve) => {
|
|
482
|
+
this.collectResolver = resolve;
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
_parse(raw) {
|
|
486
|
+
try {
|
|
487
|
+
return JSON.parse(raw);
|
|
488
|
+
} catch {
|
|
489
|
+
return { codigo: -1, mensagem: "Erro ao parsear resposta da DLL" };
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
_nextSeq(current) {
|
|
493
|
+
const n = Number(current);
|
|
494
|
+
return isNaN(n) ? "1" : String(n + 1);
|
|
495
|
+
}
|
|
496
|
+
_extractQrCode(tef) {
|
|
497
|
+
if (!tef) return void 0;
|
|
498
|
+
return tef.qrCode ?? tef.QRCode ?? tef.pixQrCode ?? tef.codigoPix;
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
export {
|
|
502
|
+
AdminApi,
|
|
503
|
+
Client,
|
|
504
|
+
PaymentApi
|
|
505
|
+
};
|
|
506
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 answer to the pending collect request */\r\n respond(info: string): void {\r\n this._log('📤 User responded', 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 in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async pix(amount: string): Promise<void> {\r\n return this.client._executePix(amount)\r\n }\r\n\r\n /**\r\n * Credit card payment\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async credit(amount: string): Promise<void> {\r\n return this.client._executePayment('credit', amount)\r\n }\r\n\r\n /**\r\n * Debit card payment\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async debit(amount: string): Promise<void> {\r\n return this.client._executePayment('debit', amount)\r\n }\r\n\r\n /**\r\n * Voucher card payment\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async voucher(amount: string): Promise<void> {\r\n return this.client._executePayment('voucher', amount)\r\n }\r\n\r\n /**\r\n * Fleet card payment\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async fleet(amount: string): Promise<void> {\r\n return this.client._executePayment('fleet', amount)\r\n }\r\n\r\n /**\r\n * Private label card payment\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async privateLabel(amount: string): Promise<void> {\r\n return this.client._executePayment('private-label', amount)\r\n }\r\n\r\n /**\r\n * Ask user which card type to use\r\n * @param amount - Amount in format \"10.00\" or \"1000\" (cents)\r\n */\r\n async ask(amount: string): Promise<void> {\r\n return this.client._executePayment('ask', amount)\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.d.ts
ADDED