-
Notifications
You must be signed in to change notification settings - Fork 12
Drivers
O Mamba exporta para a window
interfaces que permitem acesso a funcionalidades do POS como impressora, teclado alfanumérico e demais recursos da API Nativa.
No entanto, para construir uma API que se comunique melhor com javascript, criamos o conceito de drivers na SDK.
Um driver é a junção de uma interface exposta pelo Mamba com métodos de controle de sinais, o sistema de eventos do back-end.
O ponto de acesso de cada driver fica no pacote @mamba/pos
, mais especificamente no caminho de cada driver. Ex: @mamba/pos/api/nome-do-driver.js
.
Exemplo de ponto de acesso do driver de impressora:
@mamba/pos/api/printer.js
import extendDriver from '../drivers/extend.js';
import wrappers from '../drivers/printer/wrappers.js';
export default extendDriver(window.$Printer, wrappers);
Para criar uma simulação de uma interface de driver exposta pelo Mamba, você deve criar um arquivo simulation.js
dentro da pasta do driver em questão em @mamba/pos/drivers/nome-do-driver/
.
Deve-se lembrar que a simulação de um driver deve, de fato, simular o back-end, seguindo a mesma assinatura de métodos e sinais.
É obrigatório que um arquivo de simulação siga um padrão específico de exports
. Como exemplo, toma-se o driver da impressora do POS, window.$Printer
:
@mamba/pos/drivers/printer/simulation.js
import { Core } from '../../simulator/index.js';
/**
* Nome da propriedade do driver na `window`.
* Deve ser o mesmo que o exportado pelo POS de verdade.
* Obrigatório.
*/
export const NAMESPACE = '$Printer';
/**
* Lista de sinais que este driver pode disparar.
* Opcional, caso o driver não dispare nenhum sinal.
*/
export const SIGNALS = ['printerDone'];
/**
* Objeto de configuração interna do driver. É usado para
* simular estados do POS real. Este objeto fica registrado
* no `Core` do simulador dentro do `NAMESPACE` especificado.
*
* Neste caso, é possível acessá-lo com: Core.get('NAMESPACE.prop1.prop2...')
*/
export const SETTINGS = {
noPaper: false,
isPrinting: false,
};
/**
* Função que recebe a interface exposta na `window` com o `NAMESPACE` especificado
* como parâmetro e a modifica a fim de simular o comportamento real do back-end.
*/
export function setup(driver) {
Printer.isPrinting = () => Core.get('$Printer.isPrinting');
Printer.failedPrinting = () => Core.get('$Printer.noPaper');
/** Simulação do método de impressão do back-end */
Printer.doPrint = function doPrint(content, options) {
Core.set('$Printer.isPrinting', true);
setTimeout(() => {
if (!Printer.failedPrinting()) {
Core.print(content.cloneNode(true), options);
}
Core.set('$Printer.isPrinting', false);
Printer.printerDone();
}, 1500);
};
}
@mamba/pos/drivers/printer/wrappers.js
O arquivo de wrappers
deve exportar, como padrão, uma função, seguindo a mesma assinatura da setup(driver)
, que modifica/implementa funcionalidades na interface. Este arquivo é sempre executado, seja no POS ou na simulação.
/**
* `driver` refere-se ao objeto exposto na `window`.
* No POS, é a interface exposta pelo back-end.
* Em outros casos, interface simulada exposta pelo simulador.
*/
export default function(driver) {
/**
* Método responsável por encapsular a lógica da impressão em uma `Promise`.
*/
driver.print = (content, options = {}) =>
new Promise((resolve, reject) => {
driver.once('printerDone', () => {
if (driver.failedPrinting()) {
reject(new Error('NO_PAPER'));
} else {
resolve();
}
});
driver.doPrint(content, options);
});
}
@mamba/pos/api/printer.js
Este é o ponto de acesso a API do driver da impressora. Os arquivos de API
devem utilizar o método extendDriver
no objeto exposto na window
para estender os métodos utilitários de controle de sinais e acrescentar os wrappers
.
O método extendDriver
recebe um objeto de interface e uma lista de parâmetros que podem ser:
- Um objeto: neste caso, este será mesclado com o objeto da interface.
- Uma função que recebe como parâmetro o objeto da interface: segue as mesmas especificações da função de
setup(driver)
acima.
import extendDriver from '../drivers/extend.js';
import wrappers from '../drivers/printer/wrappers.js';
export default extendDriver(window.$Printer, wrappers);