Просмотр исходного кода

up gorm logger & add share to guest by web client

ljw 1 год назад
Родитель
Сommit
8b266d4fee

+ 2 - 1
README.md

@@ -221,7 +221,8 @@ lejianwen/rustdesk-api
221 221
          - 21115:21115
222 222
          - 21116:21116 # 自定义 hbbs 映射端口
223 223
          - 21116:21116/udp # 自定义 hbbs 映射端口
224
-         - 21118:21118 # web client 需要
224
+         - 21118:21118 # web client
225
+         - 21119:21119 # web client
225 226
        image: rustdesk/rustdesk-server
226 227
        command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
227 228
        volumes:

+ 2 - 1
README_EN.md

@@ -228,7 +228,8 @@ lejianwen/rustdesk-api
228 228
          - 21115:21115
229 229
          - 21116:21116 # 自定义 hbbs 映射端口
230 230
          - 21116:21116/udp # 自定义 hbbs 映射端口
231
-         - 21118:21118 # web client 需要
231
+         - 21118:21118 # web client
232
+         - 21119:21119 # web client
232 233
        image: rustdesk/rustdesk-server
233 234
        command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
234 235
        volumes:

+ 2 - 1
cmd/apimain.go

@@ -200,7 +200,7 @@ func getTranslatorForLang(lang string) ut.Translator {
200 200
 	}
201 201
 }
202 202
 func DatabaseAutoUpdate() {
203
-	version := 212
203
+	version := 220
204 204
 
205 205
 	db := global.DB
206 206
 
@@ -261,6 +261,7 @@ func Migrate(version uint) {
261 261
 		&model.UserThird{},
262 262
 		&model.Oauth{},
263 263
 		&model.LoginLog{},
264
+		&model.ShareRecord{},
264 265
 	)
265 266
 	if err != nil {
266 267
 		fmt.Println("migrate err :=>", err)

+ 1 - 0
go.mod

@@ -13,6 +13,7 @@ require (
13 13
 	github.com/go-playground/validator/v10 v10.11.2
14 14
 	github.com/go-redis/redis/v8 v8.11.4
15 15
 	github.com/golang-jwt/jwt/v5 v5.2.1
16
+	github.com/google/uuid v1.1.2
16 17
 	github.com/nicksnyder/go-i18n/v2 v2.4.0
17 18
 	github.com/sirupsen/logrus v1.8.1
18 19
 	github.com/spf13/viper v1.9.0

+ 41 - 0
http/controller/admin/addressBook.go

@@ -257,3 +257,44 @@ func (ct *AddressBook) Delete(c *gin.Context) {
257 257
 	}
258 258
 	response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
259 259
 }
260
+
261
+// ShareByWebClient
262
+// @Tags 地址簿
263
+// @Summary 地址簿分享
264
+// @Description 地址簿分享
265
+// @Accept  json
266
+// @Produce  json
267
+// @Param body body admin.ShareByWebClientForm true "地址簿信息"
268
+// @Success 200 {object} response.Response
269
+// @Failure 500 {object} response.Response
270
+// @Router /admin/address_book/share [post]
271
+// @Security token
272
+func (ct *AddressBook) ShareByWebClient(c *gin.Context) {
273
+	f := &admin.ShareByWebClientForm{}
274
+	if err := c.ShouldBindJSON(f); err != nil {
275
+		response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
276
+		return
277
+	}
278
+	errList := global.Validator.ValidStruct(c, f)
279
+	if len(errList) > 0 {
280
+		response.Fail(c, 101, errList[0])
281
+		return
282
+	}
283
+
284
+	u := service.AllService.UserService.CurUser(c)
285
+	ab := service.AllService.AddressBookService.InfoByUserIdAndId(u.Id, f.Id)
286
+	if ab.RowId == 0 {
287
+		response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
288
+		return
289
+	}
290
+	m := f.ToShareRecord()
291
+	m.UserId = u.Id
292
+	err := service.AllService.AddressBookService.ShareByWebClient(m)
293
+	if err != nil {
294
+		response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
295
+		return
296
+	}
297
+	response.Success(c, &gin.H{
298
+		"share_token": m.ShareToken,
299
+	})
300
+}

+ 45 - 0
http/controller/api/webClient.go

@@ -6,6 +6,7 @@ import (
6 6
 	"Gwen/http/response/api"
7 7
 	"Gwen/service"
8 8
 	"github.com/gin-gonic/gin"
9
+	"time"
9 10
 )
10 11
 
11 12
 type WebClient struct {
@@ -40,3 +41,47 @@ func (i *WebClient) ServerConfig(c *gin.Context) {
40 41
 		},
41 42
 	)
42 43
 }
44
+
45
+// SharedPeer 分享的peer
46
+// @Tags WEBCLIENT
47
+// @Summary 分享的peer
48
+// @Description 分享的peer
49
+// @Accept  json
50
+// @Produce  json
51
+// @Success 200 {object} response.Response
52
+// @Failure 500 {object} response.Response
53
+// @Router /shared-peer [post]
54
+func (i *WebClient) SharedPeer(c *gin.Context) {
55
+	j := &gin.H{}
56
+	c.ShouldBindJSON(j)
57
+	t := (*j)["share_token"].(string)
58
+	if t == "" {
59
+		response.Fail(c, 101, "share_token is required")
60
+		return
61
+	}
62
+	sr := service.AllService.AddressBookService.SharedPeer(t)
63
+	if sr == nil || sr.Id == 0 {
64
+		response.Fail(c, 101, "share not found")
65
+		return
66
+	}
67
+	//判断是否过期,created_at + expire > now
68
+	ca := time.Time(sr.CreatedAt)
69
+	if ca.Add(time.Second * time.Duration(sr.Expire)).Before(time.Now()) {
70
+		response.Fail(c, 101, "share expired")
71
+		return
72
+	}
73
+	ab := service.AllService.AddressBookService.InfoByUserIdAndId(sr.UserId, sr.PeerId)
74
+	if ab.RowId == 0 {
75
+		response.Fail(c, 101, "peer not found")
76
+		return
77
+	}
78
+	pp := &api.WebClientPeerPayload{}
79
+	pp.FromShareRecord(sr)
80
+	pp.Info.Username = ab.Username
81
+	pp.Info.Hostname = ab.Hostname
82
+	response.Success(c, gin.H{
83
+		"id_server": global.Config.Rustdesk.IdServer,
84
+		"key":       global.Config.Rustdesk.Key,
85
+		"peer":      pp,
86
+	})
87
+}

+ 0 - 78
http/controller/web/index.go

@@ -16,85 +16,7 @@ func (i *Index) ConfigJs(c *gin.Context) {
16 16
 	apiServer := global.Config.Rustdesk.ApiServer
17 17
 
18 18
 	tmp := `
19
-      function stringToUint8Array(str){
20
-		  var arr = [];
21
-		  for (var i = 0, j = str.length; i < j; ++i) {
22
-			arr.push(str.charCodeAt(i));
23
-		  }
24
-		 
25
-		  var tmpUint8Array = new Uint8Array(arr);
26
-		  return tmpUint8Array
27
-	 }
28
- 	  window._gwen = {}
29
-      window._gwen.kv = {}
30
-      function getQueryVariable() {
31
-          const query = window.location.hash.substring(3);
32
-          const vars = query.split("&");
33
-          for (var i = 0; i < vars.length; i++) {
34
-              var pair = vars[i].split("=");
35
-              window._gwen.kv[pair[0]] = pair[1]
36
-          }
37
-      }
38
-      getQueryVariable()
39
-      const id = window._gwen.kv.id || ''
40
-      if (id) {
41
-        localStorage.setItem('remote-id', id)
42
-      }
43
-      window._gwen.hosts = [
44
-        "rs-sg.rustdesk.com",
45
-        "rs-cn.rustdesk.com",
46
-        "rs-us.rustdesk.com",
47
-      ]
48 19
 localStorage.setItem('api-server', "` + apiServer + `")
49
-const autoWriteServer = () => {
50
-          return setTimeout(() => {
51
-              const token = localStorage.getItem('access_token')
52
-              const apiserver = localStorage.getItem('api-server')
53
-              if (token && apiserver) {
54
-                  fetch(apiserver + "/api/server-config", {
55
-                          method: 'POST',
56
-                          headers: {
57
-                              'Content-Type': 'application/json',
58
-                              'Authorization': 'Bearer ' + token
59
-                          }
60
-                      }
61
-                  ).then(res => res.json()).then(res => {
62
-                      if (res.code === 0) {
63
-						  if(!localStorage.getItem('custom-rendezvous-server')  || !localStorage.getItem('key') ) {
64
-	 						localStorage.setItem('custom-rendezvous-server', res.data.id_server)
65
-							localStorage.setItem('key', res.data.key)
66
-							}	
67
-                         
68
-						  if (res.data.peers) {
69
-                              oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
70
-							  let needUpdate = false	
71
-							  Object.keys(res.data.peers).forEach(k => {
72
-								if(!oldPeers[k]) {
73
-									oldPeers[k] = res.data.peers[k]
74
-									needUpdate = true
75
-								}else{
76
-									oldPeers[k].info = res.data.peers[k].info
77
-								}
78
-								if (oldPeers[k].info && oldPeers[k].info.hash&&!oldPeers[k].password ) {
79
-									let p1 = window.atob(oldPeers[k].info.hash)
80
-									const pwd = stringToUint8Array(p1)
81
-									oldPeers[k].password = pwd.toString()
82
-                                    oldPeers[k].remember = true
83
-								}							
84
-                              })
85
-							  localStorage.setItem('peers', JSON.stringify(oldPeers))
86
-							  if(needUpdate) {
87
-								  window.location.reload()
88
-                              }
89
-					      }
90
-                      }
91
-                  })
92
-              } else {
93
-                  autoWriteServer()
94
-              }
95
-          }, 1000)
96
-      }
97
-		autoWriteServer()
98 20
 `
99 21
 	c.String(200, tmp)
100 22
 }

+ 17 - 0
http/request/admin/addressBook.go

@@ -85,3 +85,20 @@ type AddressBookQuery struct {
85 85
 	Id       string `form:"id"`
86 86
 	PageQuery
87 87
 }
88
+
89
+type ShareByWebClientForm struct {
90
+	Id           string `json:"id" validate:"required"`
91
+	PasswordType string `json:"password_type" validate:"required,oneof=once fixed"` //只能是once,fixed
92
+	Password     string `json:"password" validate:"required"`
93
+	Expire       int64  `json:"expire"`
94
+}
95
+
96
+func (sbwcf ShareByWebClientForm) ToShareRecord() *model.ShareRecord {
97
+	return &model.ShareRecord{
98
+		UserId:       0,
99
+		PeerId:       sbwcf.Id,
100
+		PasswordType: sbwcf.PasswordType,
101
+		Password:     sbwcf.Password,
102
+		Expire:       sbwcf.Expire,
103
+	}
104
+}

+ 15 - 0
http/response/api/webClient.go

@@ -9,6 +9,7 @@ type WebClientPeerPayload struct {
9 9
 	ViewStyle string                   `json:"view-style"`
10 10
 	Tm        int64                    `json:"tm"`
11 11
 	Info      WebClientPeerInfoPayload `json:"info"`
12
+	Tmppwd    string                   `json:"tmppwd"`
12 13
 }
13 14
 
14 15
 type WebClientPeerInfoPayload struct {
@@ -16,6 +17,7 @@ type WebClientPeerInfoPayload struct {
16 17
 	Hostname string `json:"hostname"`
17 18
 	Platform string `json:"platform"`
18 19
 	Hash     string `json:"hash"`
20
+	Id       string `json:"id"`
19 21
 }
20 22
 
21 23
 func (wcpp *WebClientPeerPayload) FromAddressBook(a *model.AddressBook) {
@@ -29,3 +31,16 @@ func (wcpp *WebClientPeerPayload) FromAddressBook(a *model.AddressBook) {
29 31
 		Hash:     a.Hash,
30 32
 	}
31 33
 }
34
+
35
+func (wcpp *WebClientPeerPayload) FromShareRecord(sr *model.ShareRecord) {
36
+	wcpp.ViewStyle = "shrink"
37
+	//24小时前
38
+	wcpp.Tm = time.Now().UnixNano()
39
+	wcpp.Tmppwd = sr.Password
40
+	wcpp.Info = WebClientPeerInfoPayload{
41
+		Username: "",
42
+		Hostname: "",
43
+		Platform: "",
44
+		Id:       sr.PeerId,
45
+	}
46
+}

+ 1 - 0
http/router/admin.go

@@ -93,6 +93,7 @@ func AddressBookBind(rg *gin.RouterGroup) {
93 93
 		aR.POST("/create", cont.Create)
94 94
 		aR.POST("/update", cont.Update)
95 95
 		aR.POST("/delete", cont.Delete)
96
+		aR.POST("/shareByWebClient", cont.ShareByWebClient)
96 97
 
97 98
 		arp := aR.Use(middleware.AdminPrivilege())
98 99
 		arp.POST("/batchCreate", cont.BatchCreate)

+ 6 - 0
http/router/api.go

@@ -46,6 +46,12 @@ func ApiInit(g *gin.Engine) {
46 46
 		//提交系统信息
47 47
 		frg.POST("/sysinfo", pe.SysInfo)
48 48
 	}
49
+
50
+	{
51
+		w := &api.WebClient{}
52
+		frg.POST("/shared-peer", w.SharedPeer)
53
+	}
54
+
49 55
 	frg.Use(middleware.RustAuth())
50 56
 	{
51 57
 		w := &api.WebClient{}

+ 13 - 0
lib/orm/mysql.go

@@ -1,9 +1,12 @@
1 1
 package orm
2 2
 
3 3
 import (
4
+	"Gwen/global"
4 5
 	"fmt"
5 6
 	"gorm.io/driver/mysql"
6 7
 	"gorm.io/gorm"
8
+	"gorm.io/gorm/logger"
9
+	"time"
7 10
 )
8 11
 
9 12
 type MysqlConfig struct {
@@ -22,6 +25,16 @@ func NewMysql(mysqlConf *MysqlConfig) *gorm.DB {
22 25
 		//SkipInitializeWithVersion: false,                   // 根据当前 MySQL 版本自动配置
23 26
 	}), &gorm.Config{
24 27
 		DisableForeignKeyConstraintWhenMigrating: true,
28
+		Logger: logger.New(
29
+			global.Logger, // io writer
30
+			logger.Config{
31
+				SlowThreshold:             time.Second, // Slow SQL threshold
32
+				LogLevel:                  logger.Warn, // Log level
33
+				IgnoreRecordNotFoundError: true,        // Ignore ErrRecordNotFound error for logger
34
+				ParameterizedQueries:      true,        // Don't include params in the SQL log
35
+				Colorful:                  true,
36
+			},
37
+		),
25 38
 	})
26 39
 	if err != nil {
27 40
 		fmt.Println(err)

+ 15 - 1
lib/orm/sqlite.go

@@ -1,9 +1,12 @@
1 1
 package orm
2 2
 
3 3
 import (
4
+	"Gwen/global"
4 5
 	"fmt"
5 6
 	"gorm.io/driver/sqlite"
6 7
 	"gorm.io/gorm"
8
+	"gorm.io/gorm/logger"
9
+	"time"
7 10
 )
8 11
 
9 12
 type SqliteConfig struct {
@@ -12,7 +15,18 @@ type SqliteConfig struct {
12 15
 }
13 16
 
14 17
 func NewSqlite(sqliteConf *SqliteConfig) *gorm.DB {
15
-	db, err := gorm.Open(sqlite.Open("./data/rustdeskapi.db"), &gorm.Config{})
18
+	db, err := gorm.Open(sqlite.Open("./data/rustdeskapi.db"), &gorm.Config{
19
+		Logger: logger.New(
20
+			global.Logger, // io writer
21
+			logger.Config{
22
+				SlowThreshold:             time.Second, // Slow SQL threshold
23
+				LogLevel:                  logger.Warn, // Log level
24
+				IgnoreRecordNotFoundError: true,        // Ignore ErrRecordNotFound error for logger
25
+				ParameterizedQueries:      true,        // Don't include params in the SQL log
26
+				Colorful:                  true,
27
+			},
28
+		),
29
+	})
16 30
 	if err != nil {
17 31
 		fmt.Println(err)
18 32
 	}

+ 12 - 0
model/shareRecord.go

@@ -0,0 +1,12 @@
1
+package model
2
+
3
+type ShareRecord struct {
4
+	IdModel
5
+	UserId       uint   `json:"user_id" gorm:"default:0;not null;index"`
6
+	PeerId       string `json:"peer_id" gorm:"default:'';not null;index"`
7
+	ShareToken   string `json:"share_token" gorm:"default:'';not null;index"`
8
+	PasswordType string `json:"password_type" gorm:"default:'';not null;"`
9
+	Password     string `json:"password" gorm:"default:'';not null;"`
10
+	Expire       int64  `json:"expire" gorm:"default:0;not null;"`
11
+	TimeModel
12
+}

+ 156 - 156
resources/web/index.html

@@ -2,188 +2,188 @@
2 2
 <html>
3 3
 
4 4
 <head>
5
-  <!--
6
-    If you are serving your web app in a path other than the root, change the
7
-    href value below to reflect the base path you are serving from.
8
-
9
-    The path provided below has to start and end with a slash "/" in order for
10
-    it to work correctly.
11
-
12
-    For more details:
13
-    * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
14
-
15
-    This is a placeholder for base href that will be replaced by the value of
16
-    the `--base-href` argument provided to `flutter build`.
17
-  -->
18
-  <base href="/webclient/">
19
-
20
-  <meta charset="UTF-8">
21
-  <meta content="IE=Edge" http-equiv="X-UA-Compatible">
22
-  <meta name="description" content="Remote Desktop.">
23
-
24
-  <!-- iOS meta tags & icons -->
25
-  <meta name="apple-mobile-web-app-capable" content="yes">
26
-  <meta name="apple-mobile-web-app-status-bar-style" content="black">
27
-  <meta name="apple-mobile-web-app-title" content="RustDesk">
28
-  <link rel="apple-touch-icon" href="icons/Icon-192.png">
29
-
30
-  <!-- Favicon -->
31
-  <link rel="icon" type="image/svg+xml" href="favicon.svg" />
32
-
33
-  <title>RustDesk</title>
34
-  <link rel="manifest" href="manifest.json">
35
-  <script src="/webclient-config/index.js"></script>
36
-  <script>
37
-
38
-
39
-  </script>
40
-  <script src="ogvjs-1.8.6/ogv.js"></script>
41
-  <script type="module" crossorigin src="js/dist/index.js"></script>
42
-  <link rel="modulepreload" href="js/dist/vendor.js">
43
-  <script src="yuv-canvas-1.2.6.js"></script>
44
-
45
-  <style>
46
-    .loading {
47
-      display: flex;
48
-      justify-content: center;
49
-      align-items: center;
50
-      margin: 0;
51
-      position: absolute;
52
-      top: 50%;
53
-      left: 50%;
54
-      -ms-transform: translate(-50%, -50%);
55
-      transform: translate(-50%, -50%);
56
-    }
57
-
58
-    .loader {
59
-      border: 16px solid #f3f3f3;
60
-      border-radius: 50%;
61
-      border: 15px solid;
62
-      border-top: 16px solid #024eff;
63
-      border-right: 16px solid white;
64
-      border-bottom: 16px solid #024eff;
65
-      border-left: 16px solid white;
66
-      width: 120px;
67
-      height: 120px;
68
-      -webkit-animation: spin 2s linear infinite;
69
-      animation: spin 2s linear infinite;
70
-    }
71
-
72
-    @-webkit-keyframes spin {
73
-      0% {
74
-        -webkit-transform: rotate(0deg);
75
-      }
5
+    <!--
6
+      If you are serving your web app in a path other than the root, change the
7
+      href value below to reflect the base path you are serving from.
8
+
9
+      The path provided below has to start and end with a slash "/" in order for
10
+      it to work correctly.
11
+
12
+      For more details:
13
+      * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
14
+
15
+      This is a placeholder for base href that will be replaced by the value of
16
+      the `--base-href` argument provided to `flutter build`.
17
+    -->
18
+    <base href="/webclient/">
19
+
20
+    <meta charset="UTF-8">
21
+    <meta content="IE=Edge" http-equiv="X-UA-Compatible">
22
+    <meta name="description" content="Remote Desktop.">
23
+
24
+    <!-- iOS meta tags & icons -->
25
+    <meta name="apple-mobile-web-app-capable" content="yes">
26
+    <meta name="apple-mobile-web-app-status-bar-style" content="black">
27
+    <meta name="apple-mobile-web-app-title" content="RustDesk">
28
+    <link rel="apple-touch-icon" href="icons/Icon-192.png">
29
+
30
+    <!-- Favicon -->
31
+    <link rel="icon" type="image/svg+xml" href="favicon.svg"/>
32
+
33
+    <title>RustDesk</title>
34
+    <link rel="manifest" href="manifest.json">
35
+    <script src="/webclient-config/index.js"></script>
36
+    <script src="ogvjs-1.8.6/ogv.js"></script>
37
+    <script type="module" crossorigin src="js/dist/index.js"></script>
38
+    <script>
39
+    </script>
40
+    <link rel="modulepreload" href="js/dist/vendor.js">
41
+    <script src="yuv-canvas-1.2.6.js"></script>
42
+
43
+    <style>
44
+        .loading {
45
+            display: flex;
46
+            justify-content: center;
47
+            align-items: center;
48
+            margin: 0;
49
+            position: absolute;
50
+            top: 50%;
51
+            left: 50%;
52
+            -ms-transform: translate(-50%, -50%);
53
+            transform: translate(-50%, -50%);
54
+        }
55
+
56
+        .loader {
57
+            border: 16px solid #f3f3f3;
58
+            border-radius: 50%;
59
+            border: 15px solid;
60
+            border-top: 16px solid #024eff;
61
+            border-right: 16px solid white;
62
+            border-bottom: 16px solid #024eff;
63
+            border-left: 16px solid white;
64
+            width: 120px;
65
+            height: 120px;
66
+            -webkit-animation: spin 2s linear infinite;
67
+            animation: spin 2s linear infinite;
68
+        }
69
+
70
+        @-webkit-keyframes spin {
71
+            0% {
72
+                -webkit-transform: rotate(0deg);
73
+            }
76 74
 
77
-      100% {
78
-        -webkit-transform: rotate(360deg);
79
-      }
80
-    }
75
+            100% {
76
+                -webkit-transform: rotate(360deg);
77
+            }
78
+        }
81 79
 
82
-    @keyframes spin {
83
-      0% {
84
-        transform: rotate(0deg);
85
-      }
80
+        @keyframes spin {
81
+            0% {
82
+                transform: rotate(0deg);
83
+            }
86 84
 
87
-      100% {
88
-        transform: rotate(360deg);
89
-      }
90
-    }
91
-  </style>
85
+            100% {
86
+                transform: rotate(360deg);
87
+            }
88
+        }
89
+    </style>
92 90
 
93 91
 </head>
94 92
 
95 93
 <body>
96
-  <div class="loading">
94
+<div class="loading">
97 95
     <div class="loader"></div>
98
-  </div>
99
-  <!-- This script installs service_worker.js to provide PWA functionality to
100
-       application. For more information, see:
101
-       https://developers.google.com/web/fundamentals/primers/service-workers -->
102
-  <script>
96
+</div>
97
+<!-- This script installs service_worker.js to provide PWA functionality to
98
+     application. For more information, see:
99
+     https://developers.google.com/web/fundamentals/primers/service-workers -->
100
+<script>
103 101
     var serviceWorkerVersion = '1200232272';
104 102
     var scriptLoaded = false;
103
+
105 104
     function loadMainDartJs() {
106
-      if (scriptLoaded) {
107
-        return;
108
-      }
109
-      scriptLoaded = true;
110
-      var scriptTag = document.createElement('script');
111
-      scriptTag.src = 'main.dart.js';
112
-      scriptTag.type = 'application/javascript';
113
-      document.body.append(scriptTag);
105
+        if (scriptLoaded) {
106
+            return;
107
+        }
108
+        scriptLoaded = true;
109
+        var scriptTag = document.createElement('script');
110
+        scriptTag.src = 'main.dart.js';
111
+        scriptTag.type = 'application/javascript';
112
+        document.body.append(scriptTag);
114 113
     }
115 114
 
116 115
     if ('serviceWorker' in navigator) {
117
-      // Service workers are supported. Use them.
118
-      window.addEventListener('load', function () {
119
-        // Wait for registration to finish before dropping the <script> tag.
120
-        // Otherwise, the browser will load the script multiple times,
121
-        // potentially different versions.
122
-        var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
123
-        navigator.serviceWorker.register(serviceWorkerUrl)
124
-          .then((reg) => {
125
-            function waitForActivation(serviceWorker) {
126
-              serviceWorker.addEventListener('statechange', () => {
127
-                if (serviceWorker.state == 'activated') {
128
-                  console.log('Installed new service worker.');
129
-                  loadMainDartJs();
116
+        // Service workers are supported. Use them.
117
+        window.addEventListener('load', function () {
118
+            // Wait for registration to finish before dropping the <script> tag.
119
+            // Otherwise, the browser will load the script multiple times,
120
+            // potentially different versions.
121
+            var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
122
+            navigator.serviceWorker.register(serviceWorkerUrl)
123
+                .then((reg) => {
124
+                    function waitForActivation(serviceWorker) {
125
+                        serviceWorker.addEventListener('statechange', () => {
126
+                            if (serviceWorker.state == 'activated') {
127
+                                console.log('Installed new service worker.');
128
+                                loadMainDartJs();
129
+                            }
130
+                        });
131
+                    }
132
+
133
+                    if (!reg.active && (reg.installing || reg.waiting)) {
134
+                        // No active web worker and we have installed or are installing
135
+                        // one for the first time. Simply wait for it to activate.
136
+                        waitForActivation(reg.installing || reg.waiting);
137
+                    } else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
138
+                        // When the app updates the serviceWorkerVersion changes, so we
139
+                        // need to ask the service worker to update.
140
+                        console.log('New service worker available.');
141
+                        reg.update();
142
+                        waitForActivation(reg.installing);
143
+                    } else {
144
+                        // Existing service worker is still good.
145
+                        console.log('Loading app from service worker.');
146
+                        loadMainDartJs();
147
+                    }
148
+                });
149
+
150
+            // If service worker doesn't succeed in a reasonable amount of time,
151
+            // fallback to plaint <script> tag.
152
+            setTimeout(() => {
153
+                if (!scriptLoaded) {
154
+                    console.warn(
155
+                        'Failed to load app from service worker. Falling back to plain <script> tag.',
156
+                    );
157
+                    loadMainDartJs();
130 158
                 }
131
-              });
132
-            }
133
-            if (!reg.active && (reg.installing || reg.waiting)) {
134
-              // No active web worker and we have installed or are installing
135
-              // one for the first time. Simply wait for it to activate.
136
-              waitForActivation(reg.installing || reg.waiting);
137
-            } else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
138
-              // When the app updates the serviceWorkerVersion changes, so we
139
-              // need to ask the service worker to update.
140
-              console.log('New service worker available.');
141
-              reg.update();
142
-              waitForActivation(reg.installing);
143
-            } else {
144
-              // Existing service worker is still good.
145
-              console.log('Loading app from service worker.');
146
-              loadMainDartJs();
147
-            }
148
-          });
149
-
150
-        // If service worker doesn't succeed in a reasonable amount of time,
151
-        // fallback to plaint <script> tag.
152
-        setTimeout(() => {
153
-          if (!scriptLoaded) {
154
-            console.warn(
155
-              'Failed to load app from service worker. Falling back to plain <script> tag.',
156
-            );
157
-            loadMainDartJs();
158
-          }
159
-        }, 4000);
160
-      });
159
+            }, 4000);
160
+        });
161 161
     } else {
162
-      // Service workers not supported. Just drop the <script> tag.
163
-      loadMainDartJs();
162
+        // Service workers not supported. Just drop the <script> tag.
163
+        loadMainDartJs();
164 164
     }
165
-  </script>
166
-  <script src="libs/firebase-app.js?8.10.1"></script>
167
-  <script src="libs/firebase-analytics.js?8.10.1"></script>
165
+</script>
166
+<script src="libs/firebase-app.js?8.10.1"></script>
167
+<script src="libs/firebase-analytics.js?8.10.1"></script>
168 168
 
169
-  <script>
169
+<script>
170 170
     // Your web app's Firebase configuration
171 171
     // For Firebase JS SDK v7.20.0 and later, measurementId is optional
172 172
     const firebaseConfig = {
173
-      apiKey: "AIzaSyCgehIZk1aFP0E7wZtYRRqrfvNiNAF39-A",
174
-      authDomain: "rustdesk.firebaseapp.com",
175
-      databaseURL: "https://rustdesk.firebaseio.com",
176
-      projectId: "rustdesk",
177
-      storageBucket: "rustdesk.appspot.com",
178
-      messagingSenderId: "768133699366",
179
-      appId: "1:768133699366:web:d50faf0792cb208d7993e7",
180
-      measurementId: "G-9PEH85N6ZQ"
173
+        apiKey: "AIzaSyCgehIZk1aFP0E7wZtYRRqrfvNiNAF39-A",
174
+        authDomain: "rustdesk.firebaseapp.com",
175
+        databaseURL: "https://rustdesk.firebaseio.com",
176
+        projectId: "rustdesk",
177
+        storageBucket: "rustdesk.appspot.com",
178
+        messagingSenderId: "768133699366",
179
+        appId: "1:768133699366:web:d50faf0792cb208d7993e7",
180
+        measurementId: "G-9PEH85N6ZQ"
181 181
     };
182 182
 
183 183
     // Initialize Firebase
184 184
     firebase.initializeApp(firebaseConfig);
185 185
     firebase.analytics();
186
-  </script>
186
+</script>
187 187
 </body>
188 188
 
189 189
 </html>

+ 4 - 1
resources/web/js/dist/index.html

@@ -7,9 +7,12 @@
7 7
     <script src="ogvjs-1.8.6/ogv.js"></script>
8 8
     <script src="./yuv-canvas-1.2.6.js"></script>
9 9
     <title>Vite App</title>
10
+    <script type="module" crossorigin src="/index.js"></script>
11
+    <link rel="modulepreload" href="/vendor.js">
12
+    <link rel="stylesheet" href="/index.css">
10 13
   </head>
11 14
   <body>
12 15
     <div id="app"></div>
13
-
16
+    
14 17
   </body>
15 18
 </html>

Разница между файлами не показана из-за своего большого размера
+ 2 - 2
resources/web/js/dist/index.js


+ 1 - 796
resources/web/js/package-lock.json

@@ -1,803 +1,8 @@
1 1
 {
2 2
   "name": "web_hbb",
3 3
   "version": "1.0.0",
4
-  "lockfileVersion": 2,
4
+  "lockfileVersion": 1,
5 5
   "requires": true,
6
-  "packages": {
7
-    "": {
8
-      "name": "web_hbb",
9
-      "version": "1.0.0",
10
-      "dependencies": {
11
-        "fast-sha256": "^1.3.0",
12
-        "libsodium": "^0.7.9",
13
-        "libsodium-wrappers": "^0.7.9",
14
-        "pcm-player": "^0.0.11",
15
-        "ts-proto": "^1.141.1",
16
-        "wasm-feature-detect": "^1.2.11",
17
-        "zstddec": "^0.0.2"
18
-      },
19
-      "devDependencies": {
20
-        "typescript": "4.4.4",
21
-        "vite": "2.8"
22
-      }
23
-    },
24
-    "node_modules/@esbuild/linux-loong64": {
25
-      "version": "0.14.54",
26
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
27
-      "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
28
-      "cpu": [
29
-        "loong64"
30
-      ],
31
-      "dev": true,
32
-      "optional": true,
33
-      "os": [
34
-        "linux"
35
-      ],
36
-      "engines": {
37
-        "node": ">=12"
38
-      }
39
-    },
40
-    "node_modules/@protobufjs/aspromise": {
41
-      "version": "1.1.2",
42
-      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
43
-      "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
44
-    },
45
-    "node_modules/@protobufjs/base64": {
46
-      "version": "1.1.2",
47
-      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
48
-      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
49
-    },
50
-    "node_modules/@protobufjs/codegen": {
51
-      "version": "2.0.4",
52
-      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
53
-      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
54
-    },
55
-    "node_modules/@protobufjs/eventemitter": {
56
-      "version": "1.1.0",
57
-      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
58
-      "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
59
-    },
60
-    "node_modules/@protobufjs/fetch": {
61
-      "version": "1.1.0",
62
-      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
63
-      "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
64
-      "dependencies": {
65
-        "@protobufjs/aspromise": "^1.1.1",
66
-        "@protobufjs/inquire": "^1.1.0"
67
-      }
68
-    },
69
-    "node_modules/@protobufjs/float": {
70
-      "version": "1.0.2",
71
-      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
72
-      "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
73
-    },
74
-    "node_modules/@protobufjs/inquire": {
75
-      "version": "1.1.0",
76
-      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
77
-      "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
78
-    },
79
-    "node_modules/@protobufjs/path": {
80
-      "version": "1.1.2",
81
-      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
82
-      "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
83
-    },
84
-    "node_modules/@protobufjs/pool": {
85
-      "version": "1.1.0",
86
-      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
87
-      "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
88
-    },
89
-    "node_modules/@protobufjs/utf8": {
90
-      "version": "1.1.0",
91
-      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
92
-      "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
93
-    },
94
-    "node_modules/@types/long": {
95
-      "version": "4.0.2",
96
-      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
97
-      "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
98
-    },
99
-    "node_modules/@types/node": {
100
-      "version": "18.7.6",
101
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
102
-      "integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
103
-    },
104
-    "node_modules/@types/object-hash": {
105
-      "version": "1.3.4",
106
-      "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
107
-      "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA=="
108
-    },
109
-    "node_modules/case-anything": {
110
-      "version": "2.1.10",
111
-      "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
112
-      "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==",
113
-      "engines": {
114
-        "node": ">=12.13"
115
-      },
116
-      "funding": {
117
-        "url": "https://github.com/sponsors/mesqueeb"
118
-      }
119
-    },
120
-    "node_modules/dataloader": {
121
-      "version": "1.4.0",
122
-      "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
123
-      "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="
124
-    },
125
-    "node_modules/detect-libc": {
126
-      "version": "1.0.3",
127
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
128
-      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
129
-      "bin": {
130
-        "detect-libc": "bin/detect-libc.js"
131
-      },
132
-      "engines": {
133
-        "node": ">=0.10"
134
-      }
135
-    },
136
-    "node_modules/dprint-node": {
137
-      "version": "1.0.7",
138
-      "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz",
139
-      "integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==",
140
-      "dependencies": {
141
-        "detect-libc": "^1.0.3"
142
-      }
143
-    },
144
-    "node_modules/esbuild": {
145
-      "version": "0.14.54",
146
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
147
-      "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
148
-      "dev": true,
149
-      "hasInstallScript": true,
150
-      "bin": {
151
-        "esbuild": "bin/esbuild"
152
-      },
153
-      "engines": {
154
-        "node": ">=12"
155
-      },
156
-      "optionalDependencies": {
157
-        "@esbuild/linux-loong64": "0.14.54",
158
-        "esbuild-android-64": "0.14.54",
159
-        "esbuild-android-arm64": "0.14.54",
160
-        "esbuild-darwin-64": "0.14.54",
161
-        "esbuild-darwin-arm64": "0.14.54",
162
-        "esbuild-freebsd-64": "0.14.54",
163
-        "esbuild-freebsd-arm64": "0.14.54",
164
-        "esbuild-linux-32": "0.14.54",
165
-        "esbuild-linux-64": "0.14.54",
166
-        "esbuild-linux-arm": "0.14.54",
167
-        "esbuild-linux-arm64": "0.14.54",
168
-        "esbuild-linux-mips64le": "0.14.54",
169
-        "esbuild-linux-ppc64le": "0.14.54",
170
-        "esbuild-linux-riscv64": "0.14.54",
171
-        "esbuild-linux-s390x": "0.14.54",
172
-        "esbuild-netbsd-64": "0.14.54",
173
-        "esbuild-openbsd-64": "0.14.54",
174
-        "esbuild-sunos-64": "0.14.54",
175
-        "esbuild-windows-32": "0.14.54",
176
-        "esbuild-windows-64": "0.14.54",
177
-        "esbuild-windows-arm64": "0.14.54"
178
-      }
179
-    },
180
-    "node_modules/esbuild-android-64": {
181
-      "version": "0.14.54",
182
-      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
183
-      "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
184
-      "cpu": [
185
-        "x64"
186
-      ],
187
-      "dev": true,
188
-      "optional": true,
189
-      "os": [
190
-        "android"
191
-      ],
192
-      "engines": {
193
-        "node": ">=12"
194
-      }
195
-    },
196
-    "node_modules/esbuild-android-arm64": {
197
-      "version": "0.14.54",
198
-      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
199
-      "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
200
-      "cpu": [
201
-        "arm64"
202
-      ],
203
-      "dev": true,
204
-      "optional": true,
205
-      "os": [
206
-        "android"
207
-      ],
208
-      "engines": {
209
-        "node": ">=12"
210
-      }
211
-    },
212
-    "node_modules/esbuild-darwin-64": {
213
-      "version": "0.14.54",
214
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
215
-      "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
216
-      "cpu": [
217
-        "x64"
218
-      ],
219
-      "dev": true,
220
-      "optional": true,
221
-      "os": [
222
-        "darwin"
223
-      ],
224
-      "engines": {
225
-        "node": ">=12"
226
-      }
227
-    },
228
-    "node_modules/esbuild-darwin-arm64": {
229
-      "version": "0.14.54",
230
-      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
231
-      "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
232
-      "cpu": [
233
-        "arm64"
234
-      ],
235
-      "dev": true,
236
-      "optional": true,
237
-      "os": [
238
-        "darwin"
239
-      ],
240
-      "engines": {
241
-        "node": ">=12"
242
-      }
243
-    },
244
-    "node_modules/esbuild-freebsd-64": {
245
-      "version": "0.14.54",
246
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
247
-      "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
248
-      "cpu": [
249
-        "x64"
250
-      ],
251
-      "dev": true,
252
-      "optional": true,
253
-      "os": [
254
-        "freebsd"
255
-      ],
256
-      "engines": {
257
-        "node": ">=12"
258
-      }
259
-    },
260
-    "node_modules/esbuild-freebsd-arm64": {
261
-      "version": "0.14.54",
262
-      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
263
-      "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
264
-      "cpu": [
265
-        "arm64"
266
-      ],
267
-      "dev": true,
268
-      "optional": true,
269
-      "os": [
270
-        "freebsd"
271
-      ],
272
-      "engines": {
273
-        "node": ">=12"
274
-      }
275
-    },
276
-    "node_modules/esbuild-linux-32": {
277
-      "version": "0.14.54",
278
-      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
279
-      "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
280
-      "cpu": [
281
-        "ia32"
282
-      ],
283
-      "dev": true,
284
-      "optional": true,
285
-      "os": [
286
-        "linux"
287
-      ],
288
-      "engines": {
289
-        "node": ">=12"
290
-      }
291
-    },
292
-    "node_modules/esbuild-linux-64": {
293
-      "version": "0.14.54",
294
-      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
295
-      "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
296
-      "cpu": [
297
-        "x64"
298
-      ],
299
-      "dev": true,
300
-      "optional": true,
301
-      "os": [
302
-        "linux"
303
-      ],
304
-      "engines": {
305
-        "node": ">=12"
306
-      }
307
-    },
308
-    "node_modules/esbuild-linux-arm": {
309
-      "version": "0.14.54",
310
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
311
-      "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
312
-      "cpu": [
313
-        "arm"
314
-      ],
315
-      "dev": true,
316
-      "optional": true,
317
-      "os": [
318
-        "linux"
319
-      ],
320
-      "engines": {
321
-        "node": ">=12"
322
-      }
323
-    },
324
-    "node_modules/esbuild-linux-arm64": {
325
-      "version": "0.14.54",
326
-      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
327
-      "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
328
-      "cpu": [
329
-        "arm64"
330
-      ],
331
-      "dev": true,
332
-      "optional": true,
333
-      "os": [
334
-        "linux"
335
-      ],
336
-      "engines": {
337
-        "node": ">=12"
338
-      }
339
-    },
340
-    "node_modules/esbuild-linux-mips64le": {
341
-      "version": "0.14.54",
342
-      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
343
-      "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
344
-      "cpu": [
345
-        "mips64el"
346
-      ],
347
-      "dev": true,
348
-      "optional": true,
349
-      "os": [
350
-        "linux"
351
-      ],
352
-      "engines": {
353
-        "node": ">=12"
354
-      }
355
-    },
356
-    "node_modules/esbuild-linux-ppc64le": {
357
-      "version": "0.14.54",
358
-      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
359
-      "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
360
-      "cpu": [
361
-        "ppc64"
362
-      ],
363
-      "dev": true,
364
-      "optional": true,
365
-      "os": [
366
-        "linux"
367
-      ],
368
-      "engines": {
369
-        "node": ">=12"
370
-      }
371
-    },
372
-    "node_modules/esbuild-linux-riscv64": {
373
-      "version": "0.14.54",
374
-      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
375
-      "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
376
-      "cpu": [
377
-        "riscv64"
378
-      ],
379
-      "dev": true,
380
-      "optional": true,
381
-      "os": [
382
-        "linux"
383
-      ],
384
-      "engines": {
385
-        "node": ">=12"
386
-      }
387
-    },
388
-    "node_modules/esbuild-linux-s390x": {
389
-      "version": "0.14.54",
390
-      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
391
-      "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
392
-      "cpu": [
393
-        "s390x"
394
-      ],
395
-      "dev": true,
396
-      "optional": true,
397
-      "os": [
398
-        "linux"
399
-      ],
400
-      "engines": {
401
-        "node": ">=12"
402
-      }
403
-    },
404
-    "node_modules/esbuild-netbsd-64": {
405
-      "version": "0.14.54",
406
-      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
407
-      "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
408
-      "cpu": [
409
-        "x64"
410
-      ],
411
-      "dev": true,
412
-      "optional": true,
413
-      "os": [
414
-        "netbsd"
415
-      ],
416
-      "engines": {
417
-        "node": ">=12"
418
-      }
419
-    },
420
-    "node_modules/esbuild-openbsd-64": {
421
-      "version": "0.14.54",
422
-      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
423
-      "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
424
-      "cpu": [
425
-        "x64"
426
-      ],
427
-      "dev": true,
428
-      "optional": true,
429
-      "os": [
430
-        "openbsd"
431
-      ],
432
-      "engines": {
433
-        "node": ">=12"
434
-      }
435
-    },
436
-    "node_modules/esbuild-sunos-64": {
437
-      "version": "0.14.54",
438
-      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
439
-      "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
440
-      "cpu": [
441
-        "x64"
442
-      ],
443
-      "dev": true,
444
-      "optional": true,
445
-      "os": [
446
-        "sunos"
447
-      ],
448
-      "engines": {
449
-        "node": ">=12"
450
-      }
451
-    },
452
-    "node_modules/esbuild-windows-32": {
453
-      "version": "0.14.54",
454
-      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
455
-      "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
456
-      "cpu": [
457
-        "ia32"
458
-      ],
459
-      "dev": true,
460
-      "optional": true,
461
-      "os": [
462
-        "win32"
463
-      ],
464
-      "engines": {
465
-        "node": ">=12"
466
-      }
467
-    },
468
-    "node_modules/esbuild-windows-64": {
469
-      "version": "0.14.54",
470
-      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
471
-      "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
472
-      "cpu": [
473
-        "x64"
474
-      ],
475
-      "dev": true,
476
-      "optional": true,
477
-      "os": [
478
-        "win32"
479
-      ],
480
-      "engines": {
481
-        "node": ">=12"
482
-      }
483
-    },
484
-    "node_modules/esbuild-windows-arm64": {
485
-      "version": "0.14.54",
486
-      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
487
-      "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
488
-      "cpu": [
489
-        "arm64"
490
-      ],
491
-      "dev": true,
492
-      "optional": true,
493
-      "os": [
494
-        "win32"
495
-      ],
496
-      "engines": {
497
-        "node": ">=12"
498
-      }
499
-    },
500
-    "node_modules/fast-sha256": {
501
-      "version": "1.3.0",
502
-      "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz",
503
-      "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="
504
-    },
505
-    "node_modules/fsevents": {
506
-      "version": "2.3.2",
507
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
508
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
509
-      "dev": true,
510
-      "hasInstallScript": true,
511
-      "optional": true,
512
-      "os": [
513
-        "darwin"
514
-      ],
515
-      "engines": {
516
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
517
-      }
518
-    },
519
-    "node_modules/function-bind": {
520
-      "version": "1.1.1",
521
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
522
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
523
-      "dev": true
524
-    },
525
-    "node_modules/has": {
526
-      "version": "1.0.3",
527
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
528
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
529
-      "dev": true,
530
-      "dependencies": {
531
-        "function-bind": "^1.1.1"
532
-      },
533
-      "engines": {
534
-        "node": ">= 0.4.0"
535
-      }
536
-    },
537
-    "node_modules/is-core-module": {
538
-      "version": "2.10.0",
539
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
540
-      "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
541
-      "dev": true,
542
-      "dependencies": {
543
-        "has": "^1.0.3"
544
-      },
545
-      "funding": {
546
-        "url": "https://github.com/sponsors/ljharb"
547
-      }
548
-    },
549
-    "node_modules/libsodium": {
550
-      "version": "0.7.10",
551
-      "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz",
552
-      "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ=="
553
-    },
554
-    "node_modules/libsodium-wrappers": {
555
-      "version": "0.7.10",
556
-      "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz",
557
-      "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==",
558
-      "dependencies": {
559
-        "libsodium": "^0.7.0"
560
-      }
561
-    },
562
-    "node_modules/long": {
563
-      "version": "4.0.0",
564
-      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
565
-      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
566
-    },
567
-    "node_modules/nanoid": {
568
-      "version": "3.3.4",
569
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
570
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
571
-      "dev": true,
572
-      "bin": {
573
-        "nanoid": "bin/nanoid.cjs"
574
-      },
575
-      "engines": {
576
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
577
-      }
578
-    },
579
-    "node_modules/object-hash": {
580
-      "version": "1.3.1",
581
-      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
582
-      "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
583
-      "engines": {
584
-        "node": ">= 0.10.0"
585
-      }
586
-    },
587
-    "node_modules/path-parse": {
588
-      "version": "1.0.7",
589
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
590
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
591
-      "dev": true
592
-    },
593
-    "node_modules/pcm-player": {
594
-      "version": "0.0.11",
595
-      "resolved": "https://registry.npmjs.org/pcm-player/-/pcm-player-0.0.11.tgz",
596
-      "integrity": "sha512-+FmX62jiqZa7wDCqSRQ1g3DuU6JNgpymgOLCWhmiE/Lj/M+rOUNqgNwVQX509LdA9dtBtVD3EQQUSp9JqU6upw=="
597
-    },
598
-    "node_modules/picocolors": {
599
-      "version": "1.0.0",
600
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
601
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
602
-      "dev": true
603
-    },
604
-    "node_modules/postcss": {
605
-      "version": "8.4.16",
606
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
607
-      "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
608
-      "dev": true,
609
-      "funding": [
610
-        {
611
-          "type": "opencollective",
612
-          "url": "https://opencollective.com/postcss/"
613
-        },
614
-        {
615
-          "type": "tidelift",
616
-          "url": "https://tidelift.com/funding/github/npm/postcss"
617
-        }
618
-      ],
619
-      "dependencies": {
620
-        "nanoid": "^3.3.4",
621
-        "picocolors": "^1.0.0",
622
-        "source-map-js": "^1.0.2"
623
-      },
624
-      "engines": {
625
-        "node": "^10 || ^12 || >=14"
626
-      }
627
-    },
628
-    "node_modules/protobufjs": {
629
-      "version": "6.11.3",
630
-      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
631
-      "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
632
-      "hasInstallScript": true,
633
-      "dependencies": {
634
-        "@protobufjs/aspromise": "^1.1.2",
635
-        "@protobufjs/base64": "^1.1.2",
636
-        "@protobufjs/codegen": "^2.0.4",
637
-        "@protobufjs/eventemitter": "^1.1.0",
638
-        "@protobufjs/fetch": "^1.1.0",
639
-        "@protobufjs/float": "^1.0.2",
640
-        "@protobufjs/inquire": "^1.1.0",
641
-        "@protobufjs/path": "^1.1.2",
642
-        "@protobufjs/pool": "^1.1.0",
643
-        "@protobufjs/utf8": "^1.1.0",
644
-        "@types/long": "^4.0.1",
645
-        "@types/node": ">=13.7.0",
646
-        "long": "^4.0.0"
647
-      },
648
-      "bin": {
649
-        "pbjs": "bin/pbjs",
650
-        "pbts": "bin/pbts"
651
-      }
652
-    },
653
-    "node_modules/resolve": {
654
-      "version": "1.22.1",
655
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
656
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
657
-      "dev": true,
658
-      "dependencies": {
659
-        "is-core-module": "^2.9.0",
660
-        "path-parse": "^1.0.7",
661
-        "supports-preserve-symlinks-flag": "^1.0.0"
662
-      },
663
-      "bin": {
664
-        "resolve": "bin/resolve"
665
-      },
666
-      "funding": {
667
-        "url": "https://github.com/sponsors/ljharb"
668
-      }
669
-    },
670
-    "node_modules/rollup": {
671
-      "version": "2.77.3",
672
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
673
-      "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
674
-      "dev": true,
675
-      "bin": {
676
-        "rollup": "dist/bin/rollup"
677
-      },
678
-      "engines": {
679
-        "node": ">=10.0.0"
680
-      },
681
-      "optionalDependencies": {
682
-        "fsevents": "~2.3.2"
683
-      }
684
-    },
685
-    "node_modules/source-map-js": {
686
-      "version": "1.0.2",
687
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
688
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
689
-      "dev": true,
690
-      "engines": {
691
-        "node": ">=0.10.0"
692
-      }
693
-    },
694
-    "node_modules/supports-preserve-symlinks-flag": {
695
-      "version": "1.0.0",
696
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
697
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
698
-      "dev": true,
699
-      "engines": {
700
-        "node": ">= 0.4"
701
-      },
702
-      "funding": {
703
-        "url": "https://github.com/sponsors/ljharb"
704
-      }
705
-    },
706
-    "node_modules/ts-poet": {
707
-      "version": "6.4.1",
708
-      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz",
709
-      "integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==",
710
-      "dependencies": {
711
-        "dprint-node": "^1.0.7"
712
-      }
713
-    },
714
-    "node_modules/ts-proto": {
715
-      "version": "1.141.1",
716
-      "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.141.1.tgz",
717
-      "integrity": "sha512-1b7Ka6R96FvFZldHnYPTFy4rzwOo+OTpIP1mBFW0dDwq4WWtSkIVlZ+SokOQSC1TiccNshOJwQC9soVyWfQ7Zg==",
718
-      "dependencies": {
719
-        "@types/object-hash": "^1.3.0",
720
-        "case-anything": "^2.1.10",
721
-        "dataloader": "^1.4.0",
722
-        "object-hash": "^1.3.1",
723
-        "protobufjs": "^6.11.3",
724
-        "ts-poet": "^6.2.0",
725
-        "ts-proto-descriptors": "1.7.1"
726
-      },
727
-      "bin": {
728
-        "protoc-gen-ts_proto": "protoc-gen-ts_proto"
729
-      }
730
-    },
731
-    "node_modules/ts-proto-descriptors": {
732
-      "version": "1.7.1",
733
-      "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz",
734
-      "integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==",
735
-      "dependencies": {
736
-        "long": "^4.0.0",
737
-        "protobufjs": "^6.8.8"
738
-      }
739
-    },
740
-    "node_modules/typescript": {
741
-      "version": "4.4.4",
742
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
743
-      "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
744
-      "dev": true,
745
-      "bin": {
746
-        "tsc": "bin/tsc",
747
-        "tsserver": "bin/tsserver"
748
-      },
749
-      "engines": {
750
-        "node": ">=4.2.0"
751
-      }
752
-    },
753
-    "node_modules/vite": {
754
-      "version": "2.8.6",
755
-      "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
756
-      "integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==",
757
-      "dev": true,
758
-      "dependencies": {
759
-        "esbuild": "^0.14.14",
760
-        "postcss": "^8.4.6",
761
-        "resolve": "^1.22.0",
762
-        "rollup": "^2.59.0"
763
-      },
764
-      "bin": {
765
-        "vite": "bin/vite.js"
766
-      },
767
-      "engines": {
768
-        "node": ">=12.2.0"
769
-      },
770
-      "optionalDependencies": {
771
-        "fsevents": "~2.3.2"
772
-      },
773
-      "peerDependencies": {
774
-        "less": "*",
775
-        "sass": "*",
776
-        "stylus": "*"
777
-      },
778
-      "peerDependenciesMeta": {
779
-        "less": {
780
-          "optional": true
781
-        },
782
-        "sass": {
783
-          "optional": true
784
-        },
785
-        "stylus": {
786
-          "optional": true
787
-        }
788
-      }
789
-    },
790
-    "node_modules/wasm-feature-detect": {
791
-      "version": "1.2.11",
792
-      "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.2.11.tgz",
793
-      "integrity": "sha512-HUqwaodrQGaZgz1lZaNioIkog9tkeEJjrM3eq4aUL04whXOVDRc/o2EGb/8kV0QX411iAYWEqq7fMBmJ6dKS6w=="
794
-    },
795
-    "node_modules/zstddec": {
796
-      "version": "0.0.2",
797
-      "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz",
798
-      "integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA=="
799
-    }
800
-  },
801 6
   "dependencies": {
802 7
     "@esbuild/linux-loong64": {
803 8
       "version": "0.14.54",

+ 1 - 1
resources/web/js/package.json

@@ -3,7 +3,7 @@
3 3
   "version": "1.0.0",
4 4
   "scripts": {
5 5
     "dev": "vite",
6
-    "build": "python ./gen_js_from_hbb.py > src/gen_js_from_hbb.ts && python ./ts_proto.py && tsc && yarn vite build",
6
+    "build": "vite build",
7 7
     "preview": "vite preview"
8 8
   },
9 9
   "devDependencies": {

+ 9 - 2
resources/web/js/src/connection.ts

@@ -14,7 +14,8 @@ const HOSTS = [
14 14
   "rs-us.rustdesk.com",
15 15
 ];
16 16
 let HOST = localStorage.getItem("rendezvous-server") || HOSTS[0];
17
-const SCHEMA = "ws://";
17
+//根据协议设置为ws或wss
18
+const SCHEMA=location.protocol=="https:"?"wss://":"ws://";
18 19
 
19 20
 type MsgboxCallback = (type: string, title: string, text: string) => void;
20 21
 type DrawCallback = (data: Uint8Array) => void;
@@ -99,7 +100,7 @@ export default class Connection {
99 100
     ws.sendRendezvous({ punch_hole_request });
100 101
     const msg = (await ws.next()) as rendezvous.RendezvousMessage;
101 102
     ws.close();
102
-    console.log(new Date() + ": Got relay response");
103
+    console.log(new Date() + ": Got relay response", msg);
103 104
     const phr = msg.punch_hole_response;
104 105
     const rr = msg.relay_response;
105 106
     if (phr) {
@@ -236,8 +237,14 @@ export default class Connection {
236 237
   async msgLoop() {
237 238
     while (true) {
238 239
       const msg = (await this._ws?.next()) as message.Message;
240
+      // console.log("msg", msg);
239 241
       if (msg?.hash) {
240 242
         this._hash = msg?.hash;
243
+        const tmp = this.getOption('tmppwd')
244
+        if(!this._password && tmp){
245
+          this._password = Uint8Array.from(JSON.parse("[" + tmp + "]"));
246
+          this.setOption('tmppwd', '')
247
+        }
241 248
         if (!this._password)
242 249
           this.msgbox("input-password", "Password Required", "");
243 250
         this.login();

+ 100 - 0
resources/web/js/src/ljw.js

@@ -0,0 +1,100 @@
1
+window._gwen = {}
2
+window._gwen.kv = {}
3
+const apiserver = localStorage.getItem('api-server')
4
+
5
+function stringToUint8Array(str) {
6
+    var arr = [];
7
+    for (var i = 0, j = str.length; i < j; ++i) {
8
+        arr.push(str.charCodeAt(i));
9
+    }
10
+
11
+    var tmpUint8Array = new Uint8Array(arr);
12
+    return tmpUint8Array
13
+}
14
+
15
+function getQueryVariable() {
16
+    const query = window.location.hash.substring(3);
17
+    const vars = query.split("&");
18
+    for (var i = 0; i < vars.length; i++) {
19
+        var pair = vars[i].split("=");
20
+        window._gwen.kv[pair[0]] = pair[1]
21
+    }
22
+}
23
+
24
+getQueryVariable()
25
+
26
+const id = window._gwen.kv.id || ''
27
+if (id) {
28
+    localStorage.setItem('remote-id', id)
29
+}
30
+const share_token = window._gwen.kv.share_token || ''
31
+if (share_token) {
32
+    fetch(apiserver + "/api/shared-peer", {
33
+        method: 'POST',
34
+        headers: {
35
+            'Content-Type': 'application/json',
36
+        },
37
+        body: JSON.stringify({share_token})
38
+    }).then(res => res.json()).then(res => {
39
+        if (res.code === 0) {
40
+            localStorage.setItem('custom-rendezvous-server', res.data.id_server)
41
+            localStorage.setItem('key', res.data.key)
42
+            const peer = res.data.peer
43
+            localStorage.setItem('remote-id', peer.info.id)
44
+            peer.tmppwd = stringToUint8Array(window.atob(peer.tmppwd)).toString()
45
+            const oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
46
+            oldPeers[peer.info.id] = peer
47
+            localStorage.setItem('peers', JSON.stringify(oldPeers))
48
+        }
49
+    })
50
+}
51
+
52
+
53
+const autoWriteServer = () => {
54
+    return setTimeout(() => {
55
+        const token = localStorage.getItem('access_token')
56
+        if (token && apiserver) {
57
+            fetch(apiserver + "/api/server-config", {
58
+                    method: 'POST',
59
+                    headers: {
60
+                        'Content-Type': 'application/json',
61
+                        'Authorization': 'Bearer ' + token
62
+                    }
63
+                }
64
+            ).then(res => res.json()).then(res => {
65
+                if (res.code === 0) {
66
+                    if (!localStorage.getItem('custom-rendezvous-server') || !localStorage.getItem('key')) {
67
+                        localStorage.setItem('custom-rendezvous-server', res.data.id_server)
68
+                        localStorage.setItem('key', res.data.key)
69
+                    }
70
+
71
+                    if (res.data.peers) {
72
+                        const oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
73
+                        let needUpdate = false
74
+                        Object.keys(res.data.peers).forEach(k => {
75
+                            if (!oldPeers[k]) {
76
+                                oldPeers[k] = res.data.peers[k]
77
+                                needUpdate = true
78
+                            } else {
79
+                                oldPeers[k].info = res.data.peers[k].info
80
+                            }
81
+                            if (oldPeers[k].info && oldPeers[k].info.hash && !oldPeers[k].password) {
82
+                                let p1 = window.atob(oldPeers[k].info.hash)
83
+                                const pwd = stringToUint8Array(p1)
84
+                                oldPeers[k].password = pwd.toString()
85
+                                oldPeers[k].remember = true
86
+                            }
87
+                        })
88
+                        localStorage.setItem('peers', JSON.stringify(oldPeers))
89
+                        if (needUpdate) {
90
+                            window.location.reload()
91
+                        }
92
+                    }
93
+                }
94
+            })
95
+        } else {
96
+            autoWriteServer()
97
+        }
98
+    }, 1000)
99
+}
100
+autoWriteServer()

+ 2 - 1
resources/web/js/src/main.ts

@@ -1,2 +1,3 @@
1
+import "./ljw";
1 2
 import "./globals";
2
-import "./ui";
3
+import "./ui";

+ 14 - 0
service/addressBook.go

@@ -3,6 +3,7 @@ package service
3 3
 import (
4 4
 	"Gwen/global"
5 5
 	"Gwen/model"
6
+	"github.com/google/uuid"
6 7
 	"gorm.io/gorm"
7 8
 )
8 9
 
@@ -113,3 +114,16 @@ func (t *AddressBookService) Delete(u *model.AddressBook) error {
113 114
 func (t *AddressBookService) Update(u *model.AddressBook) error {
114 115
 	return global.DB.Model(u).Updates(u).Error
115 116
 }
117
+
118
+// ShareByWebClient 分享
119
+func (t *AddressBookService) ShareByWebClient(m *model.ShareRecord) error {
120
+	m.ShareToken = uuid.New().String()
121
+	return global.DB.Create(m).Error
122
+}
123
+
124
+// SharedPeer
125
+func (t *AddressBookService) SharedPeer(shareToken string) *model.ShareRecord {
126
+	m := &model.ShareRecord{}
127
+	global.DB.Where("share_token = ?", shareToken).First(m)
128
+	return m
129
+}