diff --git a/packages/core/realtime-js/src/RealtimeChannel.ts b/packages/core/realtime-js/src/RealtimeChannel.ts index 303bf7cd..90fc1b1d 100644 --- a/packages/core/realtime-js/src/RealtimeChannel.ts +++ b/packages/core/realtime-js/src/RealtimeChannel.ts @@ -35,6 +35,41 @@ export type RealtimeChannelOptions = { } } +type RealtimeChangesPayloadBase = { + schema: string + table: string +} + +type RealtimeBroadcastChangesPayloadBase = RealtimeChangesPayloadBase & { + id: string +} + +export type RealtimeBroadcastInsertPayload = + RealtimeBroadcastChangesPayloadBase & { + operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}` + record: T + old_record: null + } + +export type RealtimeBroadcastUpdatePayload = + RealtimeBroadcastChangesPayloadBase & { + operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}` + record: T + old_record: T + } + +export type RealtimeBroadcastDeletePayload = + RealtimeBroadcastChangesPayloadBase & { + operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}` + record: null + old_record: T + } + +export type RealtimeBroadcastPayload = + | RealtimeBroadcastInsertPayload + | RealtimeBroadcastUpdatePayload + | RealtimeBroadcastDeletePayload + type RealtimePostgresChangesPayloadBase = { schema: string table: string @@ -416,6 +451,42 @@ export default class RealtimeChannel { payload: T }) => void ): RealtimeChannel + on>( + type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, + filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL }, + callback: (payload: { + type: `${REALTIME_LISTEN_TYPES.BROADCAST}` + event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL + payload: RealtimeBroadcastPayload + }) => void + ): RealtimeChannel + on( + type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, + filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT }, + callback: (payload: { + type: `${REALTIME_LISTEN_TYPES.BROADCAST}` + event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT + payload: RealtimeBroadcastInsertPayload + }) => void + ): RealtimeChannel + on( + type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, + filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE }, + callback: (payload: { + type: `${REALTIME_LISTEN_TYPES.BROADCAST}` + event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE + payload: RealtimeBroadcastUpdatePayload + }) => void + ): RealtimeChannel + on( + type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, + filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE }, + callback: (payload: { + type: `${REALTIME_LISTEN_TYPES.BROADCAST}` + event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE + payload: RealtimeBroadcastDeletePayload + }) => void + ): RealtimeChannel on( type: `${REALTIME_LISTEN_TYPES.SYSTEM}`, filter: {},