UNPKG

@danidoble/webserial

Version:
364 lines (363 loc) 12.4 kB
import { K as h } from "./kernel-Dk_J4ThU.js"; import { s as a } from "./relay-CsdB0FSa.js"; import { h as c } from "./webserial-core-BjytHor1.js"; class m extends h { __pinpax__ = { server: "DEV", businessId: null, encryptionKey: null, apiKey: null, asyncResponses: { voucher: null, sale: null }, waiting: { voucher: !1, sale: !1 } }; constructor({ filters: s = null, config_port: e = { baudRate: 115200, dataBits: 8, stopBits: 1, parity: "none", bufferSize: 32768, flowControl: "none" }, no_device: t = 1, device_listen_on_channel: i = 1 } = { filters: null, config_port: { baudRate: 115200, dataBits: 8, stopBits: 1, parity: "none", bufferSize: 32768, flowControl: "none" }, no_device: 1, device_listen_on_channel: 1 }) { if (super({ filters: s, config_port: e, no_device: t, device_listen_on_channel: i }), this.__internal__.device.type = "pinpax", c.getCustom(this.typeDevice, t)) throw new Error(`Device ${this.typeDevice} ${t} already exists`); this.__internal__.time.response_connection = 4e3, this.__internal__.time.response_general = 3e3, this.__internal__.serial.delay_first_connection = 1e3, this.__internal__.serial.response.replacer = "", this.__internal__.serial.response.limiter = `\r `, this.#t(), c.add(this), this.getResponseAsString(); } #t() { const s = [ "buttons-status", "init-app", "connectMessage", "voucher", "info", "keep-alive", "reset-app", "get-config", "payment", "error", "refund", "login" ]; for (const e of s) this.serialRegisterAvailableListener(e); } set businessId(s) { this.__pinpax__.businessId = s; } get businessId() { return this.__pinpax__.businessId; } set encryptionKey(s) { this.__pinpax__.encryptionKey = s; } get encryptionKey() { return this.__pinpax__.encryptionKey; } set apiKey(s) { this.__pinpax__.apiKey = s; } get apiKey() { return this.__pinpax__.apiKey; } set server(s) { this.__pinpax__.server = s; } get server() { return this.__pinpax__.server; } serialMessage(s) { let e = null; try { e = JSON.parse(s), e.request || (e.request = this.lastAction), e.name || (e.name = this.lastAction); } catch (t) { console.error("Error parsing response", t, s), this.dispatch("serial:message", s); return; } switch (e.response) { case "INITAPP": this.dispatch("init-app", { name: "INITAPP", request: this.lastAction, status: "started" }), this.#n().then(() => { }); break; case "CONNECT": this.dispatch("connectMessage", { name: "CONNECT", request: this.lastAction, status: "connected" }), this.#r().then(() => { }); break; case "LOGIN": e.name || (e.name = "LOGIN"), this.dispatch("login", e); break; case "LASTVOUCHER": e.name || (e.name = "LASTVOUCHER"), this.dispatch("voucher", e), this.__pinpax__.waiting.voucher && (this.__pinpax__.asyncResponses.voucher = e, this.__pinpax__.waiting.voucher = !1); break; case "DEVICEINFO": e.name || (e.name = "DEVICEINFO"), this.dispatch("info", e); break; case "KEEPALIVE": this.dispatch("keep-alive", { name: "KEEPALIVE", request: this.lastAction, status: "alive" }); break; case "RESETAPP": this.dispatch("reset-app", { name: "RESETAPP", request: this.lastAction, status: "accepted" }); break; case "GETCONFIG": e.name || (e.name = "GETCONFIG"), this.dispatch("get-config", e); break; case "HIDEBUTTONS": this.dispatch("buttons-status", { name: "HIDEBUTTONS", request: this.lastAction, hidden: !0 }); break; case "SHOWBUTTONS": this.dispatch("buttons-status", { name: "SHOWBUTTONS", request: this.lastAction, hidden: !1 }); break; case "PAYMENT_PROCESS": e.name || (e.name = "PAYMENT_PROCESS"), this.dispatch("payment", { name: "PAYMENT_PROCESS", request: this.lastAction, status: "starting", amount: e.amount, reference: e.referecence }); break; case "INSERT_CARD": this.dispatch("payment", { name: "INSERT_CARD", request: this.lastAction, status: "insert card" }); break; case "CARD_DATA": e.name || (e.name = "CARD_DATA"), this.dispatch("payment", { name: "CARD_DATA", request: this.lastAction, status: "card data", amount: e.amount, cardHolderName: e.cardHolderName, ccMark: e.ccMark, ccType: e.ccType, currency: e.currency, maskedPan: e.maskedPan, readingType: e.readingType }); break; case "MERCHANT": e.name || (e.name = "MERCHANT"), this.dispatch("payment", { request: this.lastAction, status: "merchant", afiliation: e.afiliation, alias: e.alias, amountCashBackCommission: e.amountCashBackCommission, currency: e.currency, description: e.description, hasCashBack: e.hasCashBack, limitCashBackAmount: e.limitCashBackAmount, merchant: e.merchant, months: e.months, name: e.name }); break; case "TRANSACTION_RESULT": e.name || (e.name = "TRANSACTION_RESULT"), this.#o({ status: "result", approved: e.approved, acquirer: e.acquirer, address: e.address, amount: e.amount, amountCashback: e.amountCashback, appIDLabel: e.appIDLabel, appId: e.appId, arqc: e.arqc, auth: e.auth, ccBin: e.ccBin, ccExpirationDate: e.ccExpirationDate, ccName: e.ccName, ccNumber: e.ccNumber, ccType: e.ccType, comissionCashback: e.comissionCashback, currency: e.currency, date: e.date, errorCode: e.errorCode, errorDescription: e.errorDescription, folio: e.folio, id: e.id, merchantName: e.merchantName, msiLabel: e.msiLabel, operation: e.operation, pin: e.pin, qps: e.qps, reference: e.reference, response: e.response, source: e.source, sourceLabel: e.sourceLabel, time: e.time }); break; case "ERROR": e.name || (e.name = "ERROR"), this.__pinpax__.waiting.sale && (this.__pinpax__.asyncResponses.sale = { status: "error", approved: !1, response: e }), this.dispatch("error", { name: "ERROR", request: this.lastAction, status: "error", response: e }), this.dispatch("payment", { name: "ERROR", request: this.lastAction, status: "error", response: e }); break; case "REFUND": this.dispatch("refund", { name: "ERROR", request: this.lastAction, status: "refund", response: e }); break; } this.dispatch("serial:message", e); } serialSetConnectionConstant(s = 1) { return a.connection(s); } softReload() { super.softReload(), this.__pinpax__.waiting.sale = !1, this.__pinpax__.waiting.voucher = !1, this.__pinpax__.asyncResponses.sale = null, this.__pinpax__.asyncResponses.voucher = null; } async sendCustomCode(s = {}) { if (typeof s != "object") throw new Error("Invalid object"); if (s.constructor !== Object) throw new Error("Invalid object"); if (Object.keys(s).length === 0) throw new Error("Empty object"); if (s.action === void 0 || s.action === null) throw new Error("Invalid object add action"); const e = JSON.stringify(s), t = this.parseStringToBytes(e, `\r `); await this.appendToQueue(this.stringArrayToUint8Array(t), "custom"); } async connectMessage() { await this.appendToQueue(a.connect(), "connect:message"); } async #e() { if (this.isDisconnected) throw new Error("Device is disconnected"); if (this.queue.length === 0) return !0; const s = this; return new Promise((e) => { let t = setInterval(() => { s.queue.length === 0 && (clearInterval(t), e(!0)); }, 500); }); } async #s({ type: s = "production" } = {}) { const e = a.readQR({ type: s }); return await this.appendToQueue(e, "read-qr"); } async #a() { await this.appendToQueue(a.forceHide(), "force-hide"); } async #i() { await this.appendToQueue(a.forceShow(), "force-show"); } async #n() { await this.connectMessage(); } async #r() { await this.hideButtons(); } #o(s) { this.dispatch("payment", s), this.__pinpax__.waiting.sale && (this.__pinpax__.asyncResponses.sale = s); } async makeSale({ amount: s = 0, reference: e = null } = {}) { if (this.isDisconnected) throw new Error("Device is disconnected"); if (this.__pinpax__.waiting.sale) throw new Error("Already waiting for sale response"); const t = a.makeSale({ amount: s, reference: e }); this.__pinpax__.waiting.sale = !0, this.__pinpax__.asyncResponses.sale = null, this.queue.length > 0 && await this.#e(); const i = this; return await this.appendToQueue(t, "make-sale"), new Promise((n) => { const r = setInterval(() => { if (i.__pinpax__.asyncResponses.sale) { const o = i.__pinpax__.asyncResponses.sale; i.__pinpax__.asyncResponses.sale = null, i.__pinpax__.waiting.sale = !1, clearInterval(r), n(o.approved); } }, 100); }); } async getVoucher({ folio: s = null } = {}) { if (this.isDisconnected) throw new Error("Device is disconnected"); if (this.__pinpax__.waiting.voucher) throw new Error("Already waiting for voucher"); if (!s) throw new Error("Folio is required"); this.__pinpax__.waiting.voucher = !0, this.__pinpax__.asyncResponses.voucher = null; const e = a.getVoucher({ folio: s }); this.queue.length > 0 && await this.#e(), await this.appendToQueue(e, "get-voucher"); const t = this; return new Promise((i, n) => { const r = setTimeout(() => { t.__pinpax__.waiting.voucher = !1, n("Timeout"); }, 1e4), o = setInterval(() => { if (t.__pinpax__.asyncResponses.voucher) { const p = t.__pinpax__.asyncResponses.voucher; t.__pinpax__.asyncResponses.voucher = null, t.__pinpax__.waiting.voucher = !1, clearInterval(o), clearTimeout(r), i(p.voucher); } }, 100); }); } async info() { await this.appendToQueue(a.info(), "info"); } async keepAlive() { await this.appendToQueue(a.keepAlive(), "keep-alive"); } async restartApp() { await this.appendToQueue(a.restartApp(), "reset-app"); } async getConfig() { return await this.appendToQueue(a.getConfig(), "get-config"); } async hideButtons() { return await this.appendToQueue(a.hideButtons(), "hide-buttons"), await this.#a(); } async showButtons() { return await this.appendToQueue(a.showButtons(), "show-buttons"), await this.#i(); } async demo() { return console.warn("RUNNING DEMO APP, BE CAREFUL"), await this.appendToQueue(a.demo(), "demo"); } async refund({ amount: s = 0, folio: e = null, auth: t = null } = {}) { return await this.appendToQueue( a.refund({ amount: s, folio: e, auth: t }), "refund" ); } async readProductionQR() { return await this.#s({ type: "production" }); } async readQualityAssuranceQR() { return this.#s({ type: "QA" }); } async exit() { return await this.appendToQueue(a.exit(), "exit-app"); } async init() { await this.appendToQueue(a.init(), "init-app"); } async login() { if (!this.apiKey || !this.businessId || !this.encryptionKey || !this.server) throw new Error("Invalid data to login check apiKey, businessId, encryptionKey, server"); const s = JSON.stringify({ action: "LOGIN_MIT", server: this.__pinpax__.server, business_id: this.__pinpax__.businessId, encryption_key: this.__pinpax__.encryptionKey, api_key: this.__pinpax__.apiKey }), e = this.parseStringToBytes(s, `\r `); await this.appendToQueue(e, "login"); } } export { m as PinPax };