43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
|
|
import { readWidgetConfig } from "@/lib/widget/config";
|
||
|
|
import { getOrCreateExternalId } from "@/lib/widget/visitor";
|
||
|
|
|
||
|
|
export type RealtimeEnvelope = {
|
||
|
|
type: string;
|
||
|
|
topic?: string;
|
||
|
|
data?: {
|
||
|
|
conversationId?: number;
|
||
|
|
messageId?: number;
|
||
|
|
};
|
||
|
|
payload?: {
|
||
|
|
conversationId?: number;
|
||
|
|
messageId?: number;
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
export function createRealtimeConnection(onEvent: (event: RealtimeEnvelope) => void) {
|
||
|
|
const config = readWidgetConfig();
|
||
|
|
const baseUrl = (config.apiBaseUrl || config.baseUrl)
|
||
|
|
.replace(/^http/, "ws")
|
||
|
|
.replace(/\/$/, "");
|
||
|
|
const externalId = encodeURIComponent(getOrCreateExternalId());
|
||
|
|
const externalSource = encodeURIComponent(
|
||
|
|
(config.externalSource ?? "web_chat").trim() || "web_chat",
|
||
|
|
);
|
||
|
|
const externalName = (config.subject ?? "").trim();
|
||
|
|
const nameQuery =
|
||
|
|
externalName !== ""
|
||
|
|
? `&externalName=${encodeURIComponent(externalName)}`
|
||
|
|
: "";
|
||
|
|
const socket = new WebSocket(
|
||
|
|
`${baseUrl}/api/open/im/ws?externalId=${externalId}&externalSource=${externalSource}&channelId=${encodeURIComponent(config.channelId)}${nameQuery}`,
|
||
|
|
);
|
||
|
|
socket.addEventListener("message", (event) => {
|
||
|
|
try {
|
||
|
|
onEvent(JSON.parse(event.data) as RealtimeEnvelope);
|
||
|
|
} catch {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
return socket;
|
||
|
|
}
|