Files
vtsuru.live/src/store/useRTC.ts
2025-03-18 22:58:19 +08:00

84 lines
2.2 KiB
TypeScript

import { useAccount } from '@/api/account'
import {
BaseRTCClient,
MasterRTCClient,
SlaveRTCClient
} from '@/data/RTCClient'
import { useStorage } from '@vueuse/core'
import { acceptHMRUpdate, defineStore } from 'pinia'
import { ref } from 'vue'
import { useRoute } from 'vue-router'
export const useWebRTC = defineStore('WebRTC', () => {
const client = ref<BaseRTCClient>()
const accountInfo = useAccount()
let isInitializing = false
function on(event: string, callback: (...args: any[]) => void) {
client.value?.on(event, callback)
}
function off(event: string, callback: (...args: any[]) => void) {
client.value?.off(event, callback)
}
function send(event: string, data: any) {
client.value?.send(event, data)
}
const cookie = useStorage('JWT_Token', '')
const route = useRoute()
async function Init(type: 'master' | 'slave') {
if (isInitializing) {
return useWebRTC()
}
try {
isInitializing = true
await navigator.locks.request(
'rtcClientInit',
{ ifAvailable: true },
async (lock) => {
if (lock) {
if (!cookie.value && !route.query.token) {
console.log('[RTC] 未登录, 跳过RTC初始化')
return
}
while (!accountInfo.value.id) {
await new Promise((resolve) => setTimeout(resolve, 500))
}
if (client.value) {
return client.value
}
if (type == 'master') {
client.value = new MasterRTCClient(
accountInfo.value.id.toString(),
accountInfo.value.token
)
} else {
client.value = new SlaveRTCClient(
accountInfo.value.id?.toString(),
accountInfo.value.token
)
}
await client.value.Init()
return useWebRTC()
} else {
return useWebRTC()
}
}
)
return useWebRTC()
} catch (e) {
console.error(e)
throw e
} finally {
isInitializing = false
}
}
return { Init, send, on, off }
})
if (import.meta.hot) {
import.meta.hot.accept(acceptHMRUpdate(useWebRTC, import.meta.hot))
}