Files
ai-agent/widget/lib/services/realtime.ts
T
mlogclub efe801b8bf Init
2026-04-09 10:01:23 +08:00

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;
}