Resolved Graph credentials (bearer token + tenant/app ids).
The Graph module loader (defaults to the lazy dynamic import).
Creates/joins a meeting call (POST /communications/calls); resolves the call + bot participant ids.
Hangs up the bot's call leg (DELETE /communications/calls/{id}).
Drives the retained callEnded handler for a call from a Graph change notification (called by the MJAPI ingress).
Drives the retained participantsUpdated handler for a call from a Graph change notification (called by
the MJAPI ingress — Graph delivers roster changes over the webhook, not a client subscription).
Reads the call's current participants collection (GET /communications/calls/{id}/participants).
Mutes a participant (POST /communications/calls/{id}/participants/{pid}/mute).
retains the handler; the MJAPI Graph-notification ingress drives it via DriveCallEnded.
retains the handler; the MJAPI Graph-notification ingress drives it via DriveParticipantsUpdated.
Posts a chat message to the meeting thread (POST /chats/{threadId}/messages).
A real IGraphCallsLike over the Microsoft Graph cloud-communications REST API (
@microsoft/microsoft-graph-client).CreateCall→POST /communications/callswith an app-hosted-media join-by-URL body; reads the created call id + the bot participant id from the response.DeleteCall→DELETE /communications/calls/{id}(the bot's call-leg hangup).GetParticipants→GET /communications/calls/{id}/participants; maps each to GraphCallParticipant.PostChatMessage→POST /chats/{threadId}/messagesagainst the meeting thread.MuteParticipant→POST /communications/calls/{id}/participants/{pid}/mute.OnParticipantsUpdated/OnCallEnded→ arrive over the Graph change-notification webhook (the MJAPI ingress), not a client subscription; this REST client retains the handlers so the ingress can drive them via DriveParticipantsUpdated / DriveCallEnded.The constructed Graph client is built once on first use and reused for the life of the instance.