Files
video_socket-server/client/public/signaling-session.js
2026-05-24 01:46:57 +08:00

100 lines
2.7 KiB
JavaScript

import { Signaling, WebSocketSignaling } from "../../module/signaling.js";
const INVITE_EVENT_NAMES = Object.freeze([
'invite-call',
'invite-accepted',
'invite-rejected',
'invite-failed'
]);
const DEFAULT_SOCKET_USER_NAME = 'Me';
const DEFAULT_SOCKET_USER_AVATAR = '/images/p1.png';
export function createSignalingInstance(useWebSocket) {
return useWebSocket ? new WebSocketSignaling() : new Signaling();
}
export async function ensureSignalingStarted(existingSignaling, useWebSocket) {
if (existingSignaling) {
return {
signaling: existingSignaling,
reused: true
};
}
const signaling = createSignalingInstance(useWebSocket);
await signaling.start();
return {
signaling,
reused: false
};
}
export function bindInviteSocketEvents(signaling, eventHandlers, boundSignaling = null) {
if (!signaling || signaling === boundSignaling || typeof signaling.addEventListener !== 'function') {
return boundSignaling;
}
INVITE_EVENT_NAMES.forEach((eventName) => {
signaling.addEventListener(eventName, (event) => {
const handler = eventHandlers[eventName];
if (typeof handler === 'function') {
handler(event.detail);
}
});
});
return signaling;
}
export function getActiveSignalingInstance(preconnectedSignaling, renderstreaming) {
if (preconnectedSignaling) {
return preconnectedSignaling;
}
if (renderstreaming && renderstreaming._signaling) {
return renderstreaming._signaling;
}
return null;
}
export function sendInviteSignal(signaling, methodName, payload) {
if (!signaling || typeof signaling[methodName] !== 'function') {
throw new Error('Invite signaling is not ready');
}
signaling[methodName](payload);
}
function readStoredSocketUserInfo() {
try {
return JSON.parse(localStorage.getItem('userSettings') || '{}');
} catch (error) {
console.error('Error parsing user settings:', error);
return {};
}
}
export function buildSocketUserInfoPayload(userInfo, localUser) {
const settings = userInfo || readStoredSocketUserInfo();
return {
id: settings.id || settings.userId || localUser.id || '',
name: settings.name || localUser.name || DEFAULT_SOCKET_USER_NAME,
avatar: settings.avatar || localUser.avatar || DEFAULT_SOCKET_USER_AVATAR
};
}
export function sendSocketUserInfo(signaling, payload) {
if (!signaling || typeof signaling.sendMessage !== 'function') {
return;
}
signaling.sendMessage('', {
type: 'user-info',
data: payload
});
}