webclient.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { ref } from 'vue'
  2. import { server } from '@/api/config'
  3. import Websock from '@/utils/webclient/websock'
  4. import * as rendezvous from '@/utils/webclient/rendezvous'
  5. import * as message from '@/utils/webclient/message'
  6. import { ElMessageBox } from 'element-plus'
  7. import { T } from '@/utils/i18n'
  8. export const toWebClientLink = (row) => {
  9. window.open(`${rustdeskConfig.value.api_server}/webclient/#/?id=${row.id}`)
  10. }
  11. export function loadRustdeskConfig () {
  12. const rustdeskConfig = ref({})
  13. const fetchConfig = async () => {
  14. const res = await server().catch(_ => false)
  15. if (res) {
  16. rustdeskConfig.value = res.data
  17. localStorage.setItem('custom-rendezvous-server', res.data.id_server)
  18. localStorage.setItem('key', res.data.key)
  19. localStorage.setItem('api-server', res.data.api_server)
  20. }
  21. }
  22. if (rustdeskConfig.value.id_server === undefined || rustdeskConfig.value.key === undefined) {
  23. fetchConfig()
  24. }
  25. return {
  26. rustdeskConfig,
  27. }
  28. }
  29. export const { rustdeskConfig } = loadRustdeskConfig()
  30. export async function getPeerSlat (id) {
  31. const [addr, port] = rustdeskConfig.value.id_server.split(':')
  32. if (!addr) {
  33. return
  34. }
  35. const scheme = location.protocol === 'https:' ? 'wss' : 'ws'
  36. const ws = new Websock(`${scheme}://${addr}:21118`, true)
  37. await ws.open()
  38. const conn_type = rendezvous.ConnType.DEFAULT_CONN
  39. const nat_type = rendezvous.NatType.SYMMETRIC
  40. const punch_hole_request = rendezvous.PunchHoleRequest.fromPartial({
  41. id,
  42. licence_key: rustdeskConfig.value.key || undefined,
  43. conn_type,
  44. nat_type,
  45. token: undefined,
  46. })
  47. ws.sendRendezvous({ punch_hole_request })
  48. //rendezvous.RendezvousMessage
  49. const msg = (await ws.next())
  50. ws.close()
  51. console.log(new Date() + ': Got relay response', msg)
  52. const phr = msg.punch_hole_response
  53. const rr = msg.relay_response
  54. if (phr) {
  55. if (phr?.other_failure) {
  56. this.msgbox('error', 'Error', phr?.other_failure)
  57. return
  58. }
  59. if (phr.failure != rendezvous.PunchHoleResponse_Failure.UNRECOGNIZED) {
  60. switch (phr?.failure) {
  61. case rendezvous.PunchHoleResponse_Failure.ID_NOT_EXIST:
  62. ElMessageBox.alert(T('IDNotExist'), T('Error'))
  63. break
  64. case rendezvous.PunchHoleResponse_Failure.OFFLINE:
  65. ElMessageBox.alert(T('RemoteDesktopOffline'), T('Error'))
  66. break
  67. case rendezvous.PunchHoleResponse_Failure.LICENSE_MISMATCH:
  68. ElMessageBox.alert(T('KeyMismatch'), T('Error'))
  69. break
  70. case rendezvous.PunchHoleResponse_Failure.LICENSE_OVERUSE:
  71. ElMessageBox.alert(T('KeyOveruse'), T('Error'))
  72. break
  73. }
  74. }
  75. return false
  76. } else if (rr) {
  77. const uuid = rr.uuid
  78. console.log(new Date() + ': Connecting to relay server')
  79. const _ws = new Websock(`${scheme}://${addr}:21119`, false)
  80. await _ws.open()
  81. console.log(new Date() + ': Connected to relay server')
  82. const request_relay = rendezvous.RequestRelay.fromPartial({
  83. licence_key: rustdeskConfig.value.key || undefined,
  84. uuid,
  85. })
  86. _ws.sendRendezvous({ request_relay })
  87. //暂不支持pk
  88. const public_key = message.PublicKey.fromPartial({})
  89. _ws?.sendMessage({ public_key })
  90. // const secure = (await this.secure(pk)) || false;
  91. // globals.pushEvent("connection_ready", { secure, direct: false });
  92. while (true) {
  93. const msg = (await _ws?.next())
  94. console.log('msg', msg)
  95. if (msg?.hash) {
  96. console.log('hash msg.....', msg.hash)
  97. _ws.close()
  98. return msg.hash
  99. }
  100. }
  101. return false
  102. }
  103. }