Skip to content

Drivers

Vitor Paladini edited this page Oct 10, 2018 · 2 revisions

O que é?

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);

Simulação de comportamentos do back-end

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);
Clone this wiki locally