@urth/metatell-sdk/events is the low-level typed event bus that the higher
level modules (user, users, chat, input, voice, emote, objects,
triggers, runtime, environment) are built on. Most
plugins should prefer those modules; reach for events when you need an event
that has no dedicated wrapper, or want to work with the bus directly.
import { on, once, off } from "@urth/metatell-sdk/events";
const unsubscribe = on("chat:message", (message) => {
console.log(message.text);
});
once("users:join", (user) => {
console.log("first join", user.profile.displayName);
});
// either call the returned function, or off() with the same handler
unsubscribe();
on(event, handler) — subscribe; returns an Unsubscribe.once(event, handler) — subscribe for a single delivery.off(event, handler) — remove a previously registered handler.Events are fully typed: the payload type is inferred from the event name. The
EventMap includes (among others):
| Event | Payload |
|---|---|
user:profile |
UserProfile |
users:join / users:update |
RemoteUser |
users:leave |
{ sessionId } |
users:speaking / voice:speaking |
SpeakingEvent |
users:transform |
TransformUpdate |
chat:message |
ChatMessage |
input:pointerdown … input:hover |
PointerEvent |
input:gaze |
GazeInfo |
emote |
EmoteEvent |
objects:added / objects:updated |
RoomObject |
objects:removed |
{ id } |
objects:moved |
{ id, transform: ObjectTransform } |
trigger:fired |
TriggerFiredEvent |
runtime:changed |
RuntimeSnapshot |
environment:changed |
EnvironmentChanged ({ epoch, revision }) |
The onAdded(), onUpdated(), and onMoved() wrappers in
Room Objects deliver copies of their payloads. onRemoved() and
onFired() in Triggers pass the bus payload through unchanged,
so treat it as read-only. Prefer
onCapabilitiesChanged() from /runtime and onChanged() from
/environment over the raw runtime:changed and
environment:changed events: the wrappers validate, order, and fetch full state.
The EventMap also contains internal request/response events that back the
wrapper APIs and are not meant to be used directly: chat:send-request /
chat:send-result and input:raycast-request / input:raycast-result (behind
the promise-based chat and input APIs), emote:trigger-request (behind
emote.trigger()), objects:op-request / objects:op-result,
trigger:op-request / trigger:op-result, runtime:request /
runtime:result, and environment:request / environment:result /
environment:release. Prefer the wrapper functions over emitting these
yourself. All payload types are exported from @urth/metatell-sdk/events.
import { getBus } from "@urth/metatell-sdk/events";
const bus = getBus();
bus.on("emote", (e) => console.log(e.name));
createBus() is also exported for advanced cases (e.g. tests) that need an
isolated bus instance.