import { RealtimeChannel } from "@supabase/supabase-js";
import { Logger } from "@xylo/types";
import { createSupabaseClient } from "./client";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Payload = { [key: string]: any };
class RealtimeClient {
channel: RealtimeChannel;
defaultEvent: string;
metadata: Payload;
logger?: Logger;
constructor({
channelId,
defaultEvent,
metadata,
token,
logger,
}: {
channelId: string;
defaultEvent: string;
token: string;
metadata?: Payload;
logger?: Logger;
}) {
const supabase = createSupabaseClient(token);
this.channel = supabase.channel(channelId);
this.channel.subscribe();
this.defaultEvent = defaultEvent;
this.metadata = metadata || {};
this.logger = logger;
}
sendMessage({ event, payload }: { event?: string; payload: Payload }) {
this.logger?.info(
{ event: event || this.defaultEvent, payload },
"Sending realtime message",
);
this.channel.send({
type: "broadcast",
event: event || this.defaultEvent,
...this.metadata,
...payload,
});
}
unsubscribe() {
this.channel.unsubscribe();
}
}
export const createRealtimeClient = ({
channelId,
defaultEvent,
token,
metadata,
logger,
}: {
channelId: string;
defaultEvent: string;
token: string;
metadata?: Payload;
logger?: Logger;
}) => {
return new RealtimeClient({
channelId,
defaultEvent,
metadata,
token,
logger,
});
};
import { RealtimeChannel } from "@supabase/supabase-js";
import { Logger } from "@xylo/types";
import { createSupabaseClient } from "./client";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type Payload = { [key: string]: any };
class RealtimeClient {
channel: RealtimeChannel;
defaultEvent: string;
metadata: Payload;
logger?: Logger;
constructor({
channelId,
defaultEvent,
metadata,
token,
logger,
}: {
channelId: string;
defaultEvent: string;
token: string;
metadata?: Payload;
logger?: Logger;
}) {
const supabase = createSupabaseClient(token);
this.channel = supabase.channel(channelId);
this.channel.subscribe();
this.defaultEvent = defaultEvent;
this.metadata = metadata || {};
this.logger = logger;
}
sendMessage({ event, payload }: { event?: string; payload: Payload }) {
this.logger?.info(
{ event: event || this.defaultEvent, payload },
"Sending realtime message",
);
this.channel.send({
type: "broadcast",
event: event || this.defaultEvent,
...this.metadata,
...payload,
});
}
unsubscribe() {
this.channel.unsubscribe();
}
}
export const createRealtimeClient = ({
channelId,
defaultEvent,
token,
metadata,
logger,
}: {
channelId: string;
defaultEvent: string;
token: string;
metadata?: Payload;
logger?: Logger;
}) => {
return new RealtimeClient({
channelId,
defaultEvent,
metadata,
token,
logger,
});
};