e-bon
e-bon.ro
Realtime

Evenimente

Payload-urile de evenimente partenere servite pe canalul realtime, plus tipurile EventMap / EventName.

Evenimente

Canalul realtime livrează unsprezece payload-uri de evenimente partenere plus trei evenimente locale de ciclu de viață. Cheile din tabelul de mai jos sunt exact șirurile pe care le pasezi lui on / off / once; coloana de payload este forma tipată a celui de-al doilea argument.

Șir evenimentTip payloadSe declanșează când
device.statusDeviceStatusEventStatusul de conexiune al unui dispozitiv se schimbă (online / offline / busy).
device.claimedDeviceClaimedEventUn controler (instanță a aplicației mobile E-BON) revendică un dispozitiv.
device.releasedDeviceReleasedEventUn controler eliberează un dispozitiv — acesta devine neatribuit și doar-cloud.
device.deletedDeviceDeletedEventUn admin de organizație șterge rândul dispozitivului; identitatea este păstrată.
device.alertDeviceAlertEventSetul de alerte derivate al unui dispozitiv se schimbă (ex. hârtie terminată, offline, raport Z scadent). Un array alerts gol înseamnă că totul e în regulă.
receipt.createdReceiptCreatedEventUn bon fiscal este stocat pe platformă.
command.completedCommandCompletedEventO comandă fiscală se termină cu succes la imprimantă.
command.failedCommandFailedEventO comandă fiscală eșuează pe dispozitiv. Payload-ul include un fiscalError precalculat.
command.timeoutCommandTimeoutEventO comandă în așteptare expiră înainte ca dispozitivul să răspundă.
app.connectedAppConnectedEventO instanță a aplicației mobile E-BON își deschide WebSocket-ul către server.
app.disconnectedAppDisconnectedEventO instanță a aplicației mobile E-BON se deconectează.
connectedundefinedSocket-ul realtime tocmai s-a (re)deschis — doar ciclu de viață local.
disconnectedundefinedSocket-ul realtime tocmai a căzut — doar ciclu de viață local.
errorErrorSocket-ul realtime a emis o eroare — doar ciclu de viață local.

Tipurile de payload exportate sunt: DeviceStatusEvent, DeviceClaimedEvent, DeviceReleasedEvent, DeviceDeletedEvent, DeviceAlertEvent, ReceiptCreatedEvent, CommandCompletedEvent, CommandFailedEvent, CommandTimeoutEvent, AppConnectedEvent și AppDisconnectedEvent. Toate pot fi importate ca tipuri din @e-bon/realtime. command.timeout este un eveniment propriu pe fir — abonează-te la el pentru a distinge „imprimanta nu a răspuns" de command.failed („imprimanta a refuzat"), sau tratează-le pe ambele prin același listener dacă distincția nu contează pentru tine.

Formele payload-urilor

Fiecare payload este derivat dintr-o schemă zod exportată de pachetul @e-bon/realtime — schemele sunt sursa unică de adevăr, iar tipurile TypeScript sunt inferate din ele.

DeviceStatusEvent

{
  deviceId: string;
  status: DeviceStatus; // 'online' | 'offline' | 'busy' | …
  timestamp: string;    // ISO-8601
}

DeviceClaimedEvent

{
  deviceId: string;
  controllerId: string;
  controllerName: string;
  timestamp: string;
}

DeviceAlertEvent

{
  deviceId: string;
  alerts: DeviceAlert[];
}

ReceiptCreatedEvent

{
  receiptId: string;
  deviceId: string;
  total: number;
  timestamp: string;
}

CommandCompletedEvent

{
  commandId: string;
  deviceId: string;
  type: CommandType;
  result: unknown;
  timestamp: string;
}

CommandFailedEvent

{
  commandId: string;
  deviceId: string;
  type: CommandType;
  error: string;
  errorCode: ErrorCode;
  retryable: boolean;
  timestamp: string;
  /** Construit de client înainte de dispatch — instanță aruncabilă convenabilă. */
  fiscalError: FiscalError;
}

CommandTimeoutEvent

{
  id: string;
  deviceId: string;
  type: CommandType;
  error: string;
  errorCode: ErrorCode;
  retryable: boolean;
  timestamp: string;
}

AppConnectedEvent / AppDisconnectedEvent

{
  deviceId: string;
  timestamp: string;
}

Ascultă cu on, off, once

import { RealtimeClient, type ReceiptCreatedEvent } from '@e-bon/realtime';

const realtime = new RealtimeClient('https://api.e-bon.ro', {
  apiKey: process.env.EBON_API_KEY!,
});

realtime.on('device.status', (data) => {
  // data: DeviceStatusEvent { deviceId, status, timestamp }
});

const handler = (data: ReceiptCreatedEvent) => { /* … */ };
realtime.on('receipt.created', handler);
realtime.off('receipt.created', handler); // elimină un listener anume

realtime.once('command.completed', (data) => {
  // se declanșează exact o dată și se dezînregistrează singur
});

Exemplu — reacționează la receipt.created

Un worker minim care oglindește fiecare bon fiscal într-un jurnal de audit local prin SDK-ul REST:

import { EBonClient } from '@e-bon/sdk';
import { RealtimeClient, type ReceiptCreatedEvent } from '@e-bon/realtime';

const client = new EBonClient({
  baseUrl: 'https://api.e-bon.ro',
  apiKey: process.env.EBON_API_KEY!,
});

const realtime = new RealtimeClient('https://api.e-bon.ro', {
  apiKey: process.env.EBON_API_KEY!,
});

realtime.on('connected', () => console.log('realtime: live'));
realtime.on('disconnected', () => console.warn('realtime: se reconectează…'));

realtime.on('receipt.created', async (event: ReceiptCreatedEvent) => {
  // Aducem bonul fiscal complet acum că îi știm id-ul.
  const receipt = await client.receipts.get(event.receiptId);
  await auditLog.append({
    receiptId: receipt.id,
    deviceId: event.deviceId,
    total: event.total,
    timestamp: event.timestamp,
  });
});

process.on('SIGTERM', () => realtime.close());

Unde mergi mai departe

  • Reconectare și ciclu de viață — programul de backoff, close, suspend / resume, CursorStore.
  • Scheme — cadrele de protocol subiacente dacă îți construiești un client custom, plus API-ul dispozitiv→server send / sendCommandResult / sendCommandError.
  • SDK › Erori — forma FiscalError atașată payload-urilor command.failed.
  • API › Webhook-uri — apeluri HTTP de ieșire dacă nu poți menține un WebSocket cu durată lungă deschis.