import { IContent, MatrixClient, Method } from 'matrix-js-sdk'; /** * Schedule a message via MSC4140 (delayed messages). * Synapse implementation: pass org.matrix.msc4140.delay on the standard * /v3/rooms send endpoint. The server stores the event and returns delay_id * instead of event_id. */ export async function scheduleMessage( mx: MatrixClient, roomId: string, content: IContent, sendAtMs: number, ): Promise { const delayMs = Math.max(1000, Math.round(sendAtMs - Date.now())); const txnId = `sched_${Date.now()}_${Math.random().toString(36).slice(2)}`; const path = `/rooms/${encodeURIComponent(roomId)}/send/m.room.message/${txnId}`; // Use standard v3 prefix with the MSC4140 delay query param. const res = (await mx.http.authedRequest( Method.Put, path, { 'org.matrix.msc4140.delay': delayMs, }, content, )) as { delay_id: string }; return res.delay_id; } /** * Cancel a scheduled message via MSC4140. */ export async function cancelScheduledMessage(mx: MatrixClient, delayId: string): Promise { const path = `/delayed_events/${encodeURIComponent(delayId)}`; await mx.http.authedRequest( Method.Post, path, undefined, { action: 'cancel' }, { prefix: '/_matrix/client/unstable/org.matrix.msc4140' }, ); } export async function restartScheduledMessage(mx: MatrixClient, delayId: string): Promise { const path = `/delayed_events/${encodeURIComponent(delayId)}`; await mx.http.authedRequest( Method.Post, path, undefined, { action: 'restart' }, { prefix: '/_matrix/client/unstable/org.matrix.msc4140' }, ); }