Fichiers
rustdesk-api-web/src/utils/webclient.js
T
2024-10-09 15:52:17 +08:00

110 lignes
3.5 KiB
JavaScript

import { ref } from 'vue'
import { config } from '@/api/rustdesk'
import Websock from '@/utils/webclient/websock'
import * as rendezvous from '@/utils/webclient/rendezvous'
import * as message from '@/utils/webclient/message'
import { ElMessageBox } from 'element-plus'
import { T } from '@/utils/i18n'
export const toWebClientLink = (row) => {
window.open(`${rustdeskConfig.value.api_server}/webclient/#/?id=${row.id}`)
}
export function loadRustdeskConfig () {
const rustdeskConfig = ref({})
const fetchConfig = async () => {
const res = await config().catch(_ => false)
if (res) {
rustdeskConfig.value = res.data
localStorage.setItem('custom-rendezvous-server', res.data.id_server)
localStorage.setItem('key', res.data.key)
localStorage.setItem('api-server', res.data.api_server)
}
}
if (rustdeskConfig.value.id_server === undefined || rustdeskConfig.value.key === undefined) {
fetchConfig()
}
return {
rustdeskConfig,
}
}
export const { rustdeskConfig } = loadRustdeskConfig()
export async function getPeerSlat (id) {
const [addr, port] = rustdeskConfig.value.id_server.split(':')
if (!addr) {
return
}
const scheme = location.protocol === 'https:' ? 'wss' : 'ws'
const ws = new Websock(`${scheme}://${addr}:21118`, true)
await ws.open()
const conn_type = rendezvous.ConnType.DEFAULT_CONN
const nat_type = rendezvous.NatType.SYMMETRIC
const punch_hole_request = rendezvous.PunchHoleRequest.fromPartial({
id,
licence_key: rustdeskConfig.value.key || undefined,
conn_type,
nat_type,
token: undefined,
})
ws.sendRendezvous({ punch_hole_request })
//rendezvous.RendezvousMessage
const msg = (await ws.next())
ws.close()
console.log(new Date() + ': Got relay response', msg)
const phr = msg.punch_hole_response
const rr = msg.relay_response
if (phr) {
if (phr?.other_failure) {
this.msgbox('error', 'Error', phr?.other_failure)
return
}
if (phr.failure != rendezvous.PunchHoleResponse_Failure.UNRECOGNIZED) {
switch (phr?.failure) {
case rendezvous.PunchHoleResponse_Failure.ID_NOT_EXIST:
ElMessageBox.alert(T('IDNotExist'), T('Error'))
break
case rendezvous.PunchHoleResponse_Failure.OFFLINE:
ElMessageBox.alert(T('RemoteDesktopOffline'), T('Error'))
break
case rendezvous.PunchHoleResponse_Failure.LICENSE_MISMATCH:
ElMessageBox.alert(T('KeyMismatch'), T('Error'))
break
case rendezvous.PunchHoleResponse_Failure.LICENSE_OVERUSE:
ElMessageBox.alert(T('KeyOveruse'), T('Error'))
break
}
}
return false
} else if (rr) {
const uuid = rr.uuid
console.log(new Date() + ': Connecting to relay server')
const _ws = new Websock(`${scheme}://${addr}:21119`, false)
await _ws.open()
console.log(new Date() + ': Connected to relay server')
const request_relay = rendezvous.RequestRelay.fromPartial({
licence_key: rustdeskConfig.value.key || undefined,
uuid,
})
_ws.sendRendezvous({ request_relay })
//暂不支持pk
const public_key = message.PublicKey.fromPartial({})
_ws?.sendMessage({ public_key })
// const secure = (await this.secure(pk)) || false;
// globals.pushEvent("connection_ready", { secure, direct: false });
while (true) {
const msg = (await _ws?.next())
console.log('msg', msg)
if (msg?.hash) {
console.log('hash msg.....', msg.hash)
_ws.close()
return msg.hash
}
}
return false
}
}