575 lines
22 KiB
TypeScript
575 lines
22 KiB
TypeScript
import type { ChannelState } from './lib/constants';
|
|
import type RealtimeClient from './RealtimeClient';
|
|
import RealtimePresence, { REALTIME_PRESENCE_LISTEN_EVENTS } from './RealtimePresence';
|
|
import type { RealtimePresenceJoinPayload, RealtimePresenceLeavePayload, RealtimePresenceState } from './RealtimePresence';
|
|
import { ChannelBindingCallback } from './phoenix/types';
|
|
import type { Timer } from './phoenix/types';
|
|
import { RealtimePostgresFilterBuilder } from './RealtimePostgresFilterBuilder';
|
|
export type { RealtimePostgresChangesFilterOperator } from './RealtimePostgresFilterBuilder';
|
|
export { RealtimePostgresFilterBuilder, postgresChangesFilter, } from './RealtimePostgresFilterBuilder';
|
|
type ReplayOption = {
|
|
since: number;
|
|
limit?: number;
|
|
};
|
|
export type RealtimeChannelOptions = {
|
|
config: {
|
|
/**
|
|
* self option enables client to receive message it broadcast
|
|
* ack option instructs server to acknowledge that broadcast message was received
|
|
* replay option instructs server to replay broadcast messages
|
|
* replication_ready option instructs the server to emit a `system` event once the
|
|
* Postgres replication connection backing this channel is established and ready to
|
|
* stream changes. Listen for it with `channel.on('system', {}, (payload) => ...)`;
|
|
* the payload's `status` is `'ok'` (`message: 'Replication connection established'`)
|
|
* on success or `'error'` if the connection is not ready in time.
|
|
*/
|
|
broadcast?: {
|
|
self?: boolean;
|
|
ack?: boolean;
|
|
replay?: ReplayOption;
|
|
replication_ready?: boolean;
|
|
};
|
|
/**
|
|
* key option is used to track presence payload across clients
|
|
*
|
|
* enabled controls whether this client receives presence state and updates from other
|
|
* clients — set it to true (or add an `.on('presence', ...)` listener, which enables it
|
|
* automatically) if you want to see who else is present. Without it, this client's
|
|
* `presenceState()` stays empty and no `presence` events fire for you, because the
|
|
* underlying presence state machine buffers incoming updates until it has received an
|
|
* initial snapshot, which is only requested when this flag is set.
|
|
*
|
|
* It does not gate the other direction: calling `track()` always makes this client
|
|
* visible to other subscribers that have presence enabled, regardless of this client's
|
|
* own `enabled` setting. On RLS-protected (private) channels, receiving presence updates
|
|
* additionally requires the `presence.read` policy to authorize this client.
|
|
*/
|
|
presence?: {
|
|
key?: string;
|
|
enabled?: boolean;
|
|
};
|
|
/**
|
|
* defines if the channel is private or not and if RLS policies will be used to check data
|
|
*/
|
|
private?: boolean;
|
|
};
|
|
};
|
|
type RealtimeChangesPayloadBase = {
|
|
schema: string;
|
|
table: string;
|
|
};
|
|
type RealtimeBroadcastChangesPayloadBase = RealtimeChangesPayloadBase & {
|
|
id: string;
|
|
};
|
|
export type RealtimeBroadcastInsertPayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimeBroadcastChangesPayloadBase & {
|
|
operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`;
|
|
record: T;
|
|
old_record: null;
|
|
};
|
|
export type RealtimeBroadcastUpdatePayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimeBroadcastChangesPayloadBase & {
|
|
operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`;
|
|
record: T;
|
|
old_record: T;
|
|
};
|
|
export type RealtimeBroadcastDeletePayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimeBroadcastChangesPayloadBase & {
|
|
operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`;
|
|
record: null;
|
|
old_record: T;
|
|
};
|
|
export type RealtimeBroadcastPayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimeBroadcastInsertPayload<T> | RealtimeBroadcastUpdatePayload<T> | RealtimeBroadcastDeletePayload<T>;
|
|
type RealtimePostgresChangesPayloadBase = {
|
|
schema: string;
|
|
table: string;
|
|
commit_timestamp: string;
|
|
errors: string[];
|
|
};
|
|
export type RealtimePostgresInsertPayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimePostgresChangesPayloadBase & {
|
|
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`;
|
|
new: T;
|
|
old: {};
|
|
};
|
|
export type RealtimePostgresUpdatePayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimePostgresChangesPayloadBase & {
|
|
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`;
|
|
new: T;
|
|
old: Partial<T>;
|
|
};
|
|
export type RealtimePostgresDeletePayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimePostgresChangesPayloadBase & {
|
|
eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`;
|
|
new: {};
|
|
old: Partial<T>;
|
|
};
|
|
export type RealtimePostgresChangesPayload<T extends {
|
|
[key: string]: any;
|
|
}> = RealtimePostgresInsertPayload<T> | RealtimePostgresUpdatePayload<T> | RealtimePostgresDeletePayload<T>;
|
|
export type RealtimePostgresChangesFilter<T extends `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`> = {
|
|
/**
|
|
* The type of database change to listen to.
|
|
*/
|
|
event: T;
|
|
/**
|
|
* The database schema to listen to.
|
|
*/
|
|
schema: string;
|
|
/**
|
|
* The database table to listen to.
|
|
*/
|
|
table?: string;
|
|
/**
|
|
* Receive database changes only when the filter is matched.
|
|
*
|
|
* A filter is a `column=operator.value` expression, e.g. `id=eq.1` or
|
|
* `title=like.%foo%`. See {@link RealtimePostgresChangesFilterOperator} for
|
|
* the available operators.
|
|
*
|
|
* Multiple filters can be combined with commas; they are applied as an `AND`
|
|
* condition: `filter: 'id=gt.0,id=lt.100'`.
|
|
*
|
|
* Any operator can be negated with the `not.` prefix: `filter: 'status=not.in.(draft,archived)'`.
|
|
*
|
|
* The server splits conditions on commas outside quotes/parentheses. To
|
|
* include a reserved character (`,`, `(`, `)`) in a value, wrap it in double
|
|
* quotes PostgREST-style: `name=eq."a,b"`. The {@link RealtimePostgresFilterBuilder}
|
|
* does this quoting for you.
|
|
*
|
|
* Instead of a raw string you can pass a {@link RealtimePostgresFilterBuilder}
|
|
* (via `postgresChangesFilter()`) for a type-checked, ergonomic way to compose filters; the
|
|
* SDK serializes it to a string automatically.
|
|
*/
|
|
filter?: string | RealtimePostgresFilterBuilder;
|
|
/**
|
|
* Restrict the change payload to a subset of columns instead of receiving the
|
|
* full row. Reduces payload size (helpful for large `bytea`/`jsonb` columns)
|
|
* and the data transferred per event.
|
|
*
|
|
* The listed columns must be selectable by the subscribing role.
|
|
*
|
|
* @example
|
|
* channel.on('postgres_changes', {
|
|
* event: '*',
|
|
* schema: 'public',
|
|
* table: 'users',
|
|
* select: ['id', 'first_name'],
|
|
* }, (payload) => {
|
|
* // payload.new only contains { id, first_name }
|
|
* })
|
|
*/
|
|
select?: string[];
|
|
};
|
|
export type RealtimeChannelSendResponse = 'ok' | 'timed out' | 'error' | (string & {});
|
|
/**
|
|
* Payload of a `system` event emitted by the server.
|
|
*
|
|
* Most notably, when a channel is created with `config.broadcast.replication_ready: true`,
|
|
* the server sends one of these once the Postgres replication connection is ready
|
|
* (`status: 'ok'`) or fails to become ready in time (`status: 'error'`).
|
|
*/
|
|
export type RealtimeSystemPayload = {
|
|
/** The extension that produced the message, e.g. `'system'` or `'postgres_changes'`. */
|
|
extension: 'system' | 'postgres_changes' | (string & {});
|
|
/** `'ok'` on success, `'error'` on failure. */
|
|
status: 'ok' | 'error' | (string & {});
|
|
/** Human-readable description, e.g. `'Replication connection established'`. */
|
|
message: string;
|
|
/** The channel (sub)topic the message refers to. */
|
|
channel: string;
|
|
};
|
|
export declare enum REALTIME_POSTGRES_CHANGES_LISTEN_EVENT {
|
|
ALL = "*",
|
|
INSERT = "INSERT",
|
|
UPDATE = "UPDATE",
|
|
DELETE = "DELETE"
|
|
}
|
|
export declare enum REALTIME_LISTEN_TYPES {
|
|
BROADCAST = "broadcast",
|
|
PRESENCE = "presence",
|
|
POSTGRES_CHANGES = "postgres_changes",
|
|
SYSTEM = "system"
|
|
}
|
|
export declare enum REALTIME_SUBSCRIBE_STATES {
|
|
SUBSCRIBED = "SUBSCRIBED",
|
|
TIMED_OUT = "TIMED_OUT",
|
|
CLOSED = "CLOSED",
|
|
CHANNEL_ERROR = "CHANNEL_ERROR"
|
|
}
|
|
export declare const REALTIME_CHANNEL_STATES: {
|
|
readonly closed: "closed";
|
|
readonly errored: "errored";
|
|
readonly joined: "joined";
|
|
readonly joining: "joining";
|
|
readonly leaving: "leaving";
|
|
};
|
|
type Binding = {
|
|
type: string;
|
|
filter: {
|
|
[key: string]: any;
|
|
};
|
|
callback: ChannelBindingCallback;
|
|
ref: number;
|
|
id?: string;
|
|
};
|
|
/** A channel is the basic building block of Realtime
|
|
* and narrows the scope of data flow to subscribed clients.
|
|
* You can think of a channel as a chatroom where participants are able to see who's online
|
|
* and send and receive messages.
|
|
*/
|
|
export default class RealtimeChannel {
|
|
/** Topic name can be any string. */
|
|
topic: string;
|
|
params: RealtimeChannelOptions;
|
|
socket: RealtimeClient;
|
|
bindings: Record<string, Binding[]>;
|
|
subTopic: string;
|
|
broadcastEndpointURL: string;
|
|
private: boolean;
|
|
presence: RealtimePresence;
|
|
get state(): ChannelState;
|
|
set state(state: ChannelState);
|
|
get joinedOnce(): boolean;
|
|
get timeout(): number;
|
|
get joinPush(): import("@supabase/phoenix").Push;
|
|
get rejoinTimer(): Timer;
|
|
/**
|
|
* Creates a channel that can broadcast messages, sync presence, and listen to Postgres changes.
|
|
*
|
|
* The topic determines which realtime stream you are subscribing to. Config options let you
|
|
* enable acknowledgement for broadcasts, presence tracking, or private channels.
|
|
*
|
|
* @category Realtime
|
|
*
|
|
* @example Using supabase-js (recommended)
|
|
* ```ts
|
|
* import { createClient } from '@supabase/supabase-js'
|
|
*
|
|
* const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')
|
|
* const channel = supabase.channel('room1')
|
|
* channel
|
|
* .on('broadcast', { event: 'cursor-pos' }, (payload) => console.log(payload))
|
|
* .subscribe()
|
|
* ```
|
|
*
|
|
* @example Standalone import for bundle-sensitive environments
|
|
* ```ts
|
|
* import RealtimeClient from '@supabase/realtime-js'
|
|
*
|
|
* const client = new RealtimeClient('https://xyzcompany.supabase.co/realtime/v1', {
|
|
* params: { apikey: 'your-publishable-key' },
|
|
* })
|
|
* const channel = new RealtimeChannel('realtime:public:messages', { config: {} }, client)
|
|
* ```
|
|
*/
|
|
constructor(
|
|
/** Topic name can be any string. */
|
|
topic: string, params: RealtimeChannelOptions | undefined, socket: RealtimeClient);
|
|
/**
|
|
* Subscribe registers your client with the server.
|
|
*
|
|
* The optional `callback` receives a `status` and, on failure, an `err` argument.
|
|
* Log the full `err` so its `cause`, `name`, and any structured fields aren't hidden
|
|
* behind `err.message`.
|
|
*
|
|
* @category Realtime
|
|
*
|
|
* @example Handling errors
|
|
* ```js
|
|
* supabase.channel('room1').subscribe((status, err) => {
|
|
* if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {
|
|
* // Log the full error: its `cause` often holds the underlying reason.
|
|
* console.error(status, err)
|
|
* }
|
|
* })
|
|
* ```
|
|
*/
|
|
subscribe(callback?: (status: REALTIME_SUBSCRIBE_STATES, err?: Error) => void, timeout?: number): RealtimeChannel;
|
|
private _updatePostgresBindings;
|
|
/**
|
|
* Returns the current presence state for this channel.
|
|
*
|
|
* The shape is a map keyed by presence key (for example a user id) where each entry contains the
|
|
* tracked metadata for that user.
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
presenceState<T extends {
|
|
[key: string]: any;
|
|
} = {}>(): RealtimePresenceState<T>;
|
|
/**
|
|
* Sends the supplied payload to the presence tracker so other subscribers can see that this
|
|
* client is online. Use `untrack` to stop broadcasting presence for the same key.
|
|
*
|
|
* Tracking makes this client visible to other subscribers immediately, regardless of this
|
|
* channel's `config.presence.enabled` setting or whether it has a `presence` listener — that
|
|
* flag only affects whether *this* client receives presence updates from others (and, on
|
|
* RLS-protected channels, whether it's authorized to do so).
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
track(payload: {
|
|
[key: string]: any;
|
|
}, opts?: {
|
|
[key: string]: any;
|
|
}): Promise<RealtimeChannelSendResponse>;
|
|
/**
|
|
* Removes the current presence state for this client.
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
untrack(opts?: {
|
|
[key: string]: any;
|
|
}): Promise<RealtimeChannelSendResponse>;
|
|
/**
|
|
* Listen for presence events on this channel — when peers join, leave, or
|
|
* sync presence state.
|
|
*/
|
|
on(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.SYNC}`;
|
|
}, callback: () => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.JOIN}`;
|
|
}, callback: (payload: RealtimePresenceJoinPayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
event: `${REALTIME_PRESENCE_LISTEN_EVENTS.LEAVE}`;
|
|
}, callback: (payload: RealtimePresenceLeavePayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.PRESENCE}`, filter: {
|
|
event: '*';
|
|
}, callback: (payload?: RealtimePresenceJoinPayload<T> | RealtimePresenceLeavePayload<T>) => void): RealtimeChannel;
|
|
/**
|
|
* Listen for Postgres database changes (insert / update / delete) streamed
|
|
* over this channel.
|
|
*/
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>, callback: (payload: RealtimePostgresChangesPayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`>, callback: (payload: RealtimePostgresInsertPayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`>, callback: (payload: RealtimePostgresUpdatePayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`>, callback: (payload: RealtimePostgresDeletePayload<T>) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`, filter: RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`>, callback: (payload: RealtimePostgresChangesPayload<T>) => void): RealtimeChannel;
|
|
/**
|
|
* Listen for broadcast messages sent on this channel.
|
|
*
|
|
* @param type One of "broadcast", "presence", or "postgres_changes".
|
|
* @param filter Custom object specific to the Realtime feature detailing which payloads to receive.
|
|
* @param callback Function to be invoked when event handler is triggered.
|
|
*/
|
|
on(type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, filter: {
|
|
event: string;
|
|
}, callback: (payload: {
|
|
type: `${REALTIME_LISTEN_TYPES.BROADCAST}`;
|
|
event: string;
|
|
meta?: {
|
|
replayed?: boolean;
|
|
id: string;
|
|
};
|
|
[key: string]: any;
|
|
}) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.BROADCAST}`, filter: {
|
|
event: string;
|
|
}, callback: (payload: {
|
|
type: `${REALTIME_LISTEN_TYPES.BROADCAST}`;
|
|
event: string;
|
|
meta?: {
|
|
replayed?: boolean;
|
|
id: string;
|
|
};
|
|
payload: T;
|
|
}) => void): RealtimeChannel;
|
|
on<T extends Record<string, unknown>>(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<T>;
|
|
}) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(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<T>;
|
|
}) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(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<T>;
|
|
}) => void): RealtimeChannel;
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(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<T>;
|
|
}) => void): RealtimeChannel;
|
|
/**
|
|
* Listen for `system` events on this channel.
|
|
*
|
|
* The payload follows the {@link RealtimeSystemPayload} shape. Opt in to the replication-ready
|
|
* notification with `config.broadcast.replication_ready: true` when creating the channel, then
|
|
* watch for `payload.status === 'ok'` to know the Postgres replication connection is ready.
|
|
*
|
|
* @example Know when the replication connection is ready
|
|
* ```js
|
|
* const channel = supabase.channel('room1', {
|
|
* config: { broadcast: { replication_ready: true } },
|
|
* })
|
|
*
|
|
* channel
|
|
* .on('postgres_changes', { event: '*', schema: 'public', table: 'messages' }, (payload) => {
|
|
* console.log('Change received!', payload)
|
|
* })
|
|
* .on('system', {}, (payload) => {
|
|
* if (payload.extension === 'system' && payload.status === 'ok') {
|
|
* console.log('Replication connection is ready:', payload.message)
|
|
* }
|
|
* })
|
|
* .subscribe()
|
|
* ```
|
|
*/
|
|
on<T extends {
|
|
[key: string]: any;
|
|
}>(type: `${REALTIME_LISTEN_TYPES.SYSTEM}`, filter: {}, callback: (payload: any) => void): RealtimeChannel;
|
|
/**
|
|
* Sends a broadcast message explicitly via REST API.
|
|
*
|
|
* This method always uses the REST API endpoint regardless of WebSocket connection state.
|
|
* Useful when you want to guarantee REST delivery or when gradually migrating from implicit REST fallback.
|
|
*
|
|
* Payloads that are `ArrayBuffer` or `ArrayBufferView` (e.g. `Uint8Array`) are sent as
|
|
* `application/octet-stream`; all other payloads are JSON-encoded.
|
|
*
|
|
* @param event The name of the broadcast event
|
|
* @param payload Payload to be sent (required)
|
|
* @param opts Options including timeout
|
|
* @returns Promise resolving to object with success status, and error details if failed
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
httpSend(event: string, payload: any, opts?: {
|
|
timeout?: number;
|
|
}): Promise<{
|
|
success: true;
|
|
} | {
|
|
success: false;
|
|
status: number;
|
|
error: string;
|
|
}>;
|
|
/**
|
|
* Sends a message into the channel.
|
|
*
|
|
* @param args Arguments to send to channel
|
|
* @param args.type The type of event to send
|
|
* @param args.event The name of the event being sent
|
|
* @param args.payload Payload to be sent
|
|
* @param opts Options to be used during the send process
|
|
*
|
|
* @category Realtime
|
|
*
|
|
* @remarks
|
|
* - When using REST you don't need to subscribe to the channel
|
|
* - REST calls are only available from 2.37.0 onwards
|
|
* - If you create a channel only to send a REST broadcast, remove it from
|
|
* the client when the send completes
|
|
*
|
|
* @example Send a message via websocket
|
|
* ```js
|
|
* const channel = supabase.channel('room1')
|
|
*
|
|
* channel.subscribe((status) => {
|
|
* if (status === 'SUBSCRIBED') {
|
|
* channel.send({
|
|
* type: 'broadcast',
|
|
* event: 'cursor-pos',
|
|
* payload: { x: Math.random(), y: Math.random() },
|
|
* })
|
|
* }
|
|
* })
|
|
* ```
|
|
*
|
|
* @exampleResponse Send a message via websocket
|
|
* ```js
|
|
* ok | timed out | error
|
|
* ```
|
|
*
|
|
* @example Send a message via REST
|
|
* ```js
|
|
* const channel = supabase.channel('room1')
|
|
*
|
|
* try {
|
|
* await channel.httpSend('cursor-pos', { x: Math.random(), y: Math.random() })
|
|
* } finally {
|
|
* await supabase.removeChannel(channel)
|
|
* }
|
|
* ```
|
|
*/
|
|
send(args: {
|
|
type: 'broadcast' | 'presence' | 'postgres_changes';
|
|
event: string;
|
|
payload?: any;
|
|
[key: string]: any;
|
|
}, opts?: {
|
|
[key: string]: any;
|
|
}): Promise<RealtimeChannelSendResponse>;
|
|
/**
|
|
* Updates the payload that will be sent the next time the channel joins (reconnects).
|
|
* Useful for rotating access tokens or updating config without re-creating the channel.
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
updateJoinPayload(payload: Record<string, any>): void;
|
|
/**
|
|
* Leaves the channel.
|
|
*
|
|
* Unsubscribes from server events, and instructs channel to terminate on server.
|
|
* Triggers onClose() hooks.
|
|
*
|
|
* To receive leave acknowledgements, use the a `receive` hook to bind to the server ack, ie:
|
|
* channel.unsubscribe().receive("ok", () => alert("left!") )
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
unsubscribe(timeout?: number): Promise<RealtimeChannelSendResponse>;
|
|
/**
|
|
* Destroys and stops related timers.
|
|
*
|
|
* @category Realtime
|
|
*/
|
|
teardown(): void;
|
|
copyBindings(other: RealtimeChannel): void;
|
|
}
|
|
//# sourceMappingURL=RealtimeChannel.d.ts.map
|