@m3r/sdk 0.5.0

ctx.events

O Core avisa depois do commit. O handler não aborta a operação.

Use evento para reagir. Use ctx.entryPoints para negar o save.

src/index.ts
import { SdkEvent } from "@m3r/sdk";

ctx.subscriptions.add(
  ctx.events.on(SdkEvent.SalesOrderCreated, async (event, meta) => {
    const order = await ctx.m3r.sales.orders.get(event.salesOrderId);
    ctx.logger.info("pedido criado", { code: order.code, at: meta.occurredAt });
  })
);

API

MétodoEfeito
on(SdkEvent.*, handler)Toda ocorrência. Devolve Disposable (unsubscribe / dispose).
once(SdkEvent.*, handler)Primeira ocorrência; o runtime remove o handler.
removeAll()O host chama depois do deactivate. Você não precisa.

Handler: (payload, meta) => void | Promise<void>.

meta (EventExecutionContext): eventType, eventLogId?, correlationId?, occurredAt.

Se o handler lança, o runtime loga e segue. O pedido já está gravado.

Catálogo 0.5.0

Use SdkEvent.*. Literal fora da lista: SdkValidationError no on().

ConstNome no fioPayload
SalesOrderCreatedsales.order.createdsalesOrderId, code, customerId, filialId, amount, status
SalesOrderUpdatedsales.order.updated+ changedFields[]
SalesOrderCancelledsales.order.cancelled+ releasedSources
SalesOrderApprovedsales.order.approvedsalesOrderId, code, filialId, status
SalesOrderFulfilledsales.order.fulfilled+ exitDocumentCode?
SalesQuoteConvertedsales.quote.convertedsalesOrderId, code, filialId
SalesOrderConvertedToQuotesales.order.convertedToQuoteidem
SalesPdvCompletedsales.pdv.completedpdvSaleId, salesOrderId?, filialId

Declare os mesmos nomes em m3r.json → events[]. Validate recusa evento fora do catálogo e avisa evento declarado sem on().

Validação

  1. TypeScript — o payload é o daquele SdkEvent.
  2. Runtime — ctx.events.on("sales.order.creatd", …) lança SdkValidationError.
  3. m3r validate — cruzamento manifest × código.

Pode / não pode

Pode

  • Chamar ctx.m3r e ctx.ext.records no handler.
  • Registrar com SdkEvent ou o string do catálogo.

Não pode

  • return { allow: false } — a API do evento não tem isso.
  • Assinar financial.title.created (não está no catálogo 0.5.0).
  • Confiar em entrega instantânea: o transport atual é polling do EventLog (dev). Perda/atraso não desfaz o commit.