Non-message events arrive through app.on(event, handler) rather than app.messages.

Reaction

app.on("reaction", (signal, space) => {
  console.log(signal.reaction, signal.removed ? "removed" : "added");
});

Typing and read

app.on("typing", (signal) => {
  console.log(signal.sender.id, signal.typing ? "typing…" : "stopped");
});

app.on("read", (signal) => {
  console.log(signal.sender.id, "read the chat");
});

Edits, unsends, errors

app.on("edited", (signal) => console.log(signal.text));
app.on("unsent", (signal) => console.log(signal.messageGuid));
app.on("error", (signal) => console.error(signal.code, signal.message));

Unsubscribe

const off = app.on("typing", handler);
off();

Graceful shutdown

process.on("SIGINT", async () => {
  await app.close();
  process.exit(0);
});
close() cancels broker refresh, tears down gRPC streams, and ends the app.messages iterator.

Platform availability

SignaliMessageWhatsAppWhatsApp BusinessTerminal
reaction
typing
read
edited
unsent
error