up gorm logger & add share to guest by web client
This commit is contained in:
@@ -221,7 +221,8 @@ lejianwen/rustdesk-api
|
|||||||
- 21115:21115
|
- 21115:21115
|
||||||
- 21116:21116 # 自定义 hbbs 映射端口
|
- 21116:21116 # 自定义 hbbs 映射端口
|
||||||
- 21116:21116/udp # 自定义 hbbs 映射端口
|
- 21116:21116/udp # 自定义 hbbs 映射端口
|
||||||
- 21118:21118 # web client 需要
|
- 21118:21118 # web client
|
||||||
|
- 21119:21119 # web client
|
||||||
image: rustdesk/rustdesk-server
|
image: rustdesk/rustdesk-server
|
||||||
command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
|
command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -228,7 +228,8 @@ lejianwen/rustdesk-api
|
|||||||
- 21115:21115
|
- 21115:21115
|
||||||
- 21116:21116 # 自定义 hbbs 映射端口
|
- 21116:21116 # 自定义 hbbs 映射端口
|
||||||
- 21116:21116/udp # 自定义 hbbs 映射端口
|
- 21116:21116/udp # 自定义 hbbs 映射端口
|
||||||
- 21118:21118 # web client 需要
|
- 21118:21118 # web client
|
||||||
|
- 21119:21119 # web client
|
||||||
image: rustdesk/rustdesk-server
|
image: rustdesk/rustdesk-server
|
||||||
command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
|
command: hbbs -r <relay-server-ip[:port]> -k 123456789 # 填入个人域名或 IP + hbbr 暴露端口
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ func getTranslatorForLang(lang string) ut.Translator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
func DatabaseAutoUpdate() {
|
func DatabaseAutoUpdate() {
|
||||||
version := 212
|
version := 220
|
||||||
|
|
||||||
db := global.DB
|
db := global.DB
|
||||||
|
|
||||||
@@ -261,6 +261,7 @@ func Migrate(version uint) {
|
|||||||
&model.UserThird{},
|
&model.UserThird{},
|
||||||
&model.Oauth{},
|
&model.Oauth{},
|
||||||
&model.LoginLog{},
|
&model.LoginLog{},
|
||||||
|
&model.ShareRecord{},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("migrate err :=>", err)
|
fmt.Println("migrate err :=>", err)
|
||||||
|
|||||||
1
go.mod
1
go.mod
@@ -13,6 +13,7 @@ require (
|
|||||||
github.com/go-playground/validator/v10 v10.11.2
|
github.com/go-playground/validator/v10 v10.11.2
|
||||||
github.com/go-redis/redis/v8 v8.11.4
|
github.com/go-redis/redis/v8 v8.11.4
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||||
|
github.com/google/uuid v1.1.2
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.4.0
|
github.com/nicksnyder/go-i18n/v2 v2.4.0
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/spf13/viper v1.9.0
|
github.com/spf13/viper v1.9.0
|
||||||
|
|||||||
@@ -257,3 +257,44 @@ func (ct *AddressBook) Delete(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
|
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShareByWebClient
|
||||||
|
// @Tags 地址簿
|
||||||
|
// @Summary 地址簿分享
|
||||||
|
// @Description 地址簿分享
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Param body body admin.ShareByWebClientForm true "地址簿信息"
|
||||||
|
// @Success 200 {object} response.Response
|
||||||
|
// @Failure 500 {object} response.Response
|
||||||
|
// @Router /admin/address_book/share [post]
|
||||||
|
// @Security token
|
||||||
|
func (ct *AddressBook) ShareByWebClient(c *gin.Context) {
|
||||||
|
f := &admin.ShareByWebClientForm{}
|
||||||
|
if err := c.ShouldBindJSON(f); err != nil {
|
||||||
|
response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
errList := global.Validator.ValidStruct(c, f)
|
||||||
|
if len(errList) > 0 {
|
||||||
|
response.Fail(c, 101, errList[0])
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
u := service.AllService.UserService.CurUser(c)
|
||||||
|
ab := service.AllService.AddressBookService.InfoByUserIdAndId(u.Id, f.Id)
|
||||||
|
if ab.RowId == 0 {
|
||||||
|
response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
m := f.ToShareRecord()
|
||||||
|
m.UserId = u.Id
|
||||||
|
err := service.AllService.AddressBookService.ShareByWebClient(m)
|
||||||
|
if err != nil {
|
||||||
|
response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
response.Success(c, &gin.H{
|
||||||
|
"share_token": m.ShareToken,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"Gwen/http/response/api"
|
"Gwen/http/response/api"
|
||||||
"Gwen/service"
|
"Gwen/service"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type WebClient struct {
|
type WebClient struct {
|
||||||
@@ -40,3 +41,47 @@ func (i *WebClient) ServerConfig(c *gin.Context) {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SharedPeer 分享的peer
|
||||||
|
// @Tags WEBCLIENT
|
||||||
|
// @Summary 分享的peer
|
||||||
|
// @Description 分享的peer
|
||||||
|
// @Accept json
|
||||||
|
// @Produce json
|
||||||
|
// @Success 200 {object} response.Response
|
||||||
|
// @Failure 500 {object} response.Response
|
||||||
|
// @Router /shared-peer [post]
|
||||||
|
func (i *WebClient) SharedPeer(c *gin.Context) {
|
||||||
|
j := &gin.H{}
|
||||||
|
c.ShouldBindJSON(j)
|
||||||
|
t := (*j)["share_token"].(string)
|
||||||
|
if t == "" {
|
||||||
|
response.Fail(c, 101, "share_token is required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sr := service.AllService.AddressBookService.SharedPeer(t)
|
||||||
|
if sr == nil || sr.Id == 0 {
|
||||||
|
response.Fail(c, 101, "share not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//判断是否过期,created_at + expire > now
|
||||||
|
ca := time.Time(sr.CreatedAt)
|
||||||
|
if ca.Add(time.Second * time.Duration(sr.Expire)).Before(time.Now()) {
|
||||||
|
response.Fail(c, 101, "share expired")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ab := service.AllService.AddressBookService.InfoByUserIdAndId(sr.UserId, sr.PeerId)
|
||||||
|
if ab.RowId == 0 {
|
||||||
|
response.Fail(c, 101, "peer not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pp := &api.WebClientPeerPayload{}
|
||||||
|
pp.FromShareRecord(sr)
|
||||||
|
pp.Info.Username = ab.Username
|
||||||
|
pp.Info.Hostname = ab.Hostname
|
||||||
|
response.Success(c, gin.H{
|
||||||
|
"id_server": global.Config.Rustdesk.IdServer,
|
||||||
|
"key": global.Config.Rustdesk.Key,
|
||||||
|
"peer": pp,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,85 +16,7 @@ func (i *Index) ConfigJs(c *gin.Context) {
|
|||||||
apiServer := global.Config.Rustdesk.ApiServer
|
apiServer := global.Config.Rustdesk.ApiServer
|
||||||
|
|
||||||
tmp := `
|
tmp := `
|
||||||
function stringToUint8Array(str){
|
|
||||||
var arr = [];
|
|
||||||
for (var i = 0, j = str.length; i < j; ++i) {
|
|
||||||
arr.push(str.charCodeAt(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
var tmpUint8Array = new Uint8Array(arr);
|
|
||||||
return tmpUint8Array
|
|
||||||
}
|
|
||||||
window._gwen = {}
|
|
||||||
window._gwen.kv = {}
|
|
||||||
function getQueryVariable() {
|
|
||||||
const query = window.location.hash.substring(3);
|
|
||||||
const vars = query.split("&");
|
|
||||||
for (var i = 0; i < vars.length; i++) {
|
|
||||||
var pair = vars[i].split("=");
|
|
||||||
window._gwen.kv[pair[0]] = pair[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getQueryVariable()
|
|
||||||
const id = window._gwen.kv.id || ''
|
|
||||||
if (id) {
|
|
||||||
localStorage.setItem('remote-id', id)
|
|
||||||
}
|
|
||||||
window._gwen.hosts = [
|
|
||||||
"rs-sg.rustdesk.com",
|
|
||||||
"rs-cn.rustdesk.com",
|
|
||||||
"rs-us.rustdesk.com",
|
|
||||||
]
|
|
||||||
localStorage.setItem('api-server', "` + apiServer + `")
|
localStorage.setItem('api-server', "` + apiServer + `")
|
||||||
const autoWriteServer = () => {
|
|
||||||
return setTimeout(() => {
|
|
||||||
const token = localStorage.getItem('access_token')
|
|
||||||
const apiserver = localStorage.getItem('api-server')
|
|
||||||
if (token && apiserver) {
|
|
||||||
fetch(apiserver + "/api/server-config", {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Authorization': 'Bearer ' + token
|
|
||||||
}
|
|
||||||
}
|
|
||||||
).then(res => res.json()).then(res => {
|
|
||||||
if (res.code === 0) {
|
|
||||||
if(!localStorage.getItem('custom-rendezvous-server') || !localStorage.getItem('key') ) {
|
|
||||||
localStorage.setItem('custom-rendezvous-server', res.data.id_server)
|
|
||||||
localStorage.setItem('key', res.data.key)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res.data.peers) {
|
|
||||||
oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
|
|
||||||
let needUpdate = false
|
|
||||||
Object.keys(res.data.peers).forEach(k => {
|
|
||||||
if(!oldPeers[k]) {
|
|
||||||
oldPeers[k] = res.data.peers[k]
|
|
||||||
needUpdate = true
|
|
||||||
}else{
|
|
||||||
oldPeers[k].info = res.data.peers[k].info
|
|
||||||
}
|
|
||||||
if (oldPeers[k].info && oldPeers[k].info.hash&&!oldPeers[k].password ) {
|
|
||||||
let p1 = window.atob(oldPeers[k].info.hash)
|
|
||||||
const pwd = stringToUint8Array(p1)
|
|
||||||
oldPeers[k].password = pwd.toString()
|
|
||||||
oldPeers[k].remember = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
localStorage.setItem('peers', JSON.stringify(oldPeers))
|
|
||||||
if(needUpdate) {
|
|
||||||
window.location.reload()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
autoWriteServer()
|
|
||||||
}
|
|
||||||
}, 1000)
|
|
||||||
}
|
|
||||||
autoWriteServer()
|
|
||||||
`
|
`
|
||||||
c.String(200, tmp)
|
c.String(200, tmp)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,3 +85,20 @@ type AddressBookQuery struct {
|
|||||||
Id string `form:"id"`
|
Id string `form:"id"`
|
||||||
PageQuery
|
PageQuery
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ShareByWebClientForm struct {
|
||||||
|
Id string `json:"id" validate:"required"`
|
||||||
|
PasswordType string `json:"password_type" validate:"required,oneof=once fixed"` //只能是once,fixed
|
||||||
|
Password string `json:"password" validate:"required"`
|
||||||
|
Expire int64 `json:"expire"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sbwcf ShareByWebClientForm) ToShareRecord() *model.ShareRecord {
|
||||||
|
return &model.ShareRecord{
|
||||||
|
UserId: 0,
|
||||||
|
PeerId: sbwcf.Id,
|
||||||
|
PasswordType: sbwcf.PasswordType,
|
||||||
|
Password: sbwcf.Password,
|
||||||
|
Expire: sbwcf.Expire,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ type WebClientPeerPayload struct {
|
|||||||
ViewStyle string `json:"view-style"`
|
ViewStyle string `json:"view-style"`
|
||||||
Tm int64 `json:"tm"`
|
Tm int64 `json:"tm"`
|
||||||
Info WebClientPeerInfoPayload `json:"info"`
|
Info WebClientPeerInfoPayload `json:"info"`
|
||||||
|
Tmppwd string `json:"tmppwd"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebClientPeerInfoPayload struct {
|
type WebClientPeerInfoPayload struct {
|
||||||
@@ -16,6 +17,7 @@ type WebClientPeerInfoPayload struct {
|
|||||||
Hostname string `json:"hostname"`
|
Hostname string `json:"hostname"`
|
||||||
Platform string `json:"platform"`
|
Platform string `json:"platform"`
|
||||||
Hash string `json:"hash"`
|
Hash string `json:"hash"`
|
||||||
|
Id string `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (wcpp *WebClientPeerPayload) FromAddressBook(a *model.AddressBook) {
|
func (wcpp *WebClientPeerPayload) FromAddressBook(a *model.AddressBook) {
|
||||||
@@ -29,3 +31,16 @@ func (wcpp *WebClientPeerPayload) FromAddressBook(a *model.AddressBook) {
|
|||||||
Hash: a.Hash,
|
Hash: a.Hash,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (wcpp *WebClientPeerPayload) FromShareRecord(sr *model.ShareRecord) {
|
||||||
|
wcpp.ViewStyle = "shrink"
|
||||||
|
//24小时前
|
||||||
|
wcpp.Tm = time.Now().UnixNano()
|
||||||
|
wcpp.Tmppwd = sr.Password
|
||||||
|
wcpp.Info = WebClientPeerInfoPayload{
|
||||||
|
Username: "",
|
||||||
|
Hostname: "",
|
||||||
|
Platform: "",
|
||||||
|
Id: sr.PeerId,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ func AddressBookBind(rg *gin.RouterGroup) {
|
|||||||
aR.POST("/create", cont.Create)
|
aR.POST("/create", cont.Create)
|
||||||
aR.POST("/update", cont.Update)
|
aR.POST("/update", cont.Update)
|
||||||
aR.POST("/delete", cont.Delete)
|
aR.POST("/delete", cont.Delete)
|
||||||
|
aR.POST("/shareByWebClient", cont.ShareByWebClient)
|
||||||
|
|
||||||
arp := aR.Use(middleware.AdminPrivilege())
|
arp := aR.Use(middleware.AdminPrivilege())
|
||||||
arp.POST("/batchCreate", cont.BatchCreate)
|
arp.POST("/batchCreate", cont.BatchCreate)
|
||||||
|
|||||||
@@ -46,6 +46,12 @@ func ApiInit(g *gin.Engine) {
|
|||||||
//提交系统信息
|
//提交系统信息
|
||||||
frg.POST("/sysinfo", pe.SysInfo)
|
frg.POST("/sysinfo", pe.SysInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
w := &api.WebClient{}
|
||||||
|
frg.POST("/shared-peer", w.SharedPeer)
|
||||||
|
}
|
||||||
|
|
||||||
frg.Use(middleware.RustAuth())
|
frg.Use(middleware.RustAuth())
|
||||||
{
|
{
|
||||||
w := &api.WebClient{}
|
w := &api.WebClient{}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package orm
|
package orm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"Gwen/global"
|
||||||
"fmt"
|
"fmt"
|
||||||
"gorm.io/driver/mysql"
|
"gorm.io/driver/mysql"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MysqlConfig struct {
|
type MysqlConfig struct {
|
||||||
@@ -22,6 +25,16 @@ func NewMysql(mysqlConf *MysqlConfig) *gorm.DB {
|
|||||||
//SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
|
//SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
|
||||||
}), &gorm.Config{
|
}), &gorm.Config{
|
||||||
DisableForeignKeyConstraintWhenMigrating: true,
|
DisableForeignKeyConstraintWhenMigrating: true,
|
||||||
|
Logger: logger.New(
|
||||||
|
global.Logger, // io writer
|
||||||
|
logger.Config{
|
||||||
|
SlowThreshold: time.Second, // Slow SQL threshold
|
||||||
|
LogLevel: logger.Warn, // Log level
|
||||||
|
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
|
||||||
|
ParameterizedQueries: true, // Don't include params in the SQL log
|
||||||
|
Colorful: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package orm
|
package orm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"Gwen/global"
|
||||||
"fmt"
|
"fmt"
|
||||||
"gorm.io/driver/sqlite"
|
"gorm.io/driver/sqlite"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SqliteConfig struct {
|
type SqliteConfig struct {
|
||||||
@@ -12,7 +15,18 @@ type SqliteConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewSqlite(sqliteConf *SqliteConfig) *gorm.DB {
|
func NewSqlite(sqliteConf *SqliteConfig) *gorm.DB {
|
||||||
db, err := gorm.Open(sqlite.Open("./data/rustdeskapi.db"), &gorm.Config{})
|
db, err := gorm.Open(sqlite.Open("./data/rustdeskapi.db"), &gorm.Config{
|
||||||
|
Logger: logger.New(
|
||||||
|
global.Logger, // io writer
|
||||||
|
logger.Config{
|
||||||
|
SlowThreshold: time.Second, // Slow SQL threshold
|
||||||
|
LogLevel: logger.Warn, // Log level
|
||||||
|
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
|
||||||
|
ParameterizedQueries: true, // Don't include params in the SQL log
|
||||||
|
Colorful: true,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
|
|||||||
12
model/shareRecord.go
Normal file
12
model/shareRecord.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
type ShareRecord struct {
|
||||||
|
IdModel
|
||||||
|
UserId uint `json:"user_id" gorm:"default:0;not null;index"`
|
||||||
|
PeerId string `json:"peer_id" gorm:"default:'';not null;index"`
|
||||||
|
ShareToken string `json:"share_token" gorm:"default:'';not null;index"`
|
||||||
|
PasswordType string `json:"password_type" gorm:"default:'';not null;"`
|
||||||
|
Password string `json:"password" gorm:"default:'';not null;"`
|
||||||
|
Expire int64 `json:"expire" gorm:"default:0;not null;"`
|
||||||
|
TimeModel
|
||||||
|
}
|
||||||
292
resources/web/index.html
vendored
292
resources/web/index.html
vendored
@@ -2,188 +2,188 @@
|
|||||||
<html>
|
<html>
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<!--
|
<!--
|
||||||
If you are serving your web app in a path other than the root, change the
|
If you are serving your web app in a path other than the root, change the
|
||||||
href value below to reflect the base path you are serving from.
|
href value below to reflect the base path you are serving from.
|
||||||
|
|
||||||
The path provided below has to start and end with a slash "/" in order for
|
The path provided below has to start and end with a slash "/" in order for
|
||||||
it to work correctly.
|
it to work correctly.
|
||||||
|
|
||||||
For more details:
|
For more details:
|
||||||
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
|
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
|
||||||
|
|
||||||
This is a placeholder for base href that will be replaced by the value of
|
This is a placeholder for base href that will be replaced by the value of
|
||||||
the `--base-href` argument provided to `flutter build`.
|
the `--base-href` argument provided to `flutter build`.
|
||||||
-->
|
-->
|
||||||
<base href="/webclient/">
|
<base href="/webclient/">
|
||||||
|
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
|
||||||
<meta name="description" content="Remote Desktop.">
|
<meta name="description" content="Remote Desktop.">
|
||||||
|
|
||||||
<!-- iOS meta tags & icons -->
|
<!-- iOS meta tags & icons -->
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
<meta name="apple-mobile-web-app-title" content="RustDesk">
|
<meta name="apple-mobile-web-app-title" content="RustDesk">
|
||||||
<link rel="apple-touch-icon" href="icons/Icon-192.png">
|
<link rel="apple-touch-icon" href="icons/Icon-192.png">
|
||||||
|
|
||||||
<!-- Favicon -->
|
<!-- Favicon -->
|
||||||
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
<link rel="icon" type="image/svg+xml" href="favicon.svg"/>
|
||||||
|
|
||||||
<title>RustDesk</title>
|
<title>RustDesk</title>
|
||||||
<link rel="manifest" href="manifest.json">
|
<link rel="manifest" href="manifest.json">
|
||||||
<script src="/webclient-config/index.js"></script>
|
<script src="/webclient-config/index.js"></script>
|
||||||
<script>
|
<script src="ogvjs-1.8.6/ogv.js"></script>
|
||||||
|
<script type="module" crossorigin src="js/dist/index.js"></script>
|
||||||
|
<script>
|
||||||
|
</script>
|
||||||
|
<link rel="modulepreload" href="js/dist/vendor.js">
|
||||||
|
<script src="yuv-canvas-1.2.6.js"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.loading {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
margin: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
-ms-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
.loader {
|
||||||
<script src="ogvjs-1.8.6/ogv.js"></script>
|
border: 16px solid #f3f3f3;
|
||||||
<script type="module" crossorigin src="js/dist/index.js"></script>
|
border-radius: 50%;
|
||||||
<link rel="modulepreload" href="js/dist/vendor.js">
|
border: 15px solid;
|
||||||
<script src="yuv-canvas-1.2.6.js"></script>
|
border-top: 16px solid #024eff;
|
||||||
|
border-right: 16px solid white;
|
||||||
|
border-bottom: 16px solid #024eff;
|
||||||
|
border-left: 16px solid white;
|
||||||
|
width: 120px;
|
||||||
|
height: 120px;
|
||||||
|
-webkit-animation: spin 2s linear infinite;
|
||||||
|
animation: spin 2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
<style>
|
@-webkit-keyframes spin {
|
||||||
.loading {
|
0% {
|
||||||
display: flex;
|
-webkit-transform: rotate(0deg);
|
||||||
justify-content: center;
|
}
|
||||||
align-items: center;
|
|
||||||
margin: 0;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
-ms-transform: translate(-50%, -50%);
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.loader {
|
100% {
|
||||||
border: 16px solid #f3f3f3;
|
-webkit-transform: rotate(360deg);
|
||||||
border-radius: 50%;
|
}
|
||||||
border: 15px solid;
|
}
|
||||||
border-top: 16px solid #024eff;
|
|
||||||
border-right: 16px solid white;
|
|
||||||
border-bottom: 16px solid #024eff;
|
|
||||||
border-left: 16px solid white;
|
|
||||||
width: 120px;
|
|
||||||
height: 120px;
|
|
||||||
-webkit-animation: spin 2s linear infinite;
|
|
||||||
animation: spin 2s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-webkit-keyframes spin {
|
@keyframes spin {
|
||||||
0% {
|
0% {
|
||||||
-webkit-transform: rotate(0deg);
|
transform: rotate(0deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(360deg);
|
transform: rotate(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
@keyframes spin {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="loading">
|
<div class="loading">
|
||||||
<div class="loader"></div>
|
<div class="loader"></div>
|
||||||
</div>
|
</div>
|
||||||
<!-- This script installs service_worker.js to provide PWA functionality to
|
<!-- This script installs service_worker.js to provide PWA functionality to
|
||||||
application. For more information, see:
|
application. For more information, see:
|
||||||
https://developers.google.com/web/fundamentals/primers/service-workers -->
|
https://developers.google.com/web/fundamentals/primers/service-workers -->
|
||||||
<script>
|
<script>
|
||||||
var serviceWorkerVersion = '1200232272';
|
var serviceWorkerVersion = '1200232272';
|
||||||
var scriptLoaded = false;
|
var scriptLoaded = false;
|
||||||
|
|
||||||
function loadMainDartJs() {
|
function loadMainDartJs() {
|
||||||
if (scriptLoaded) {
|
if (scriptLoaded) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scriptLoaded = true;
|
scriptLoaded = true;
|
||||||
var scriptTag = document.createElement('script');
|
var scriptTag = document.createElement('script');
|
||||||
scriptTag.src = 'main.dart.js';
|
scriptTag.src = 'main.dart.js';
|
||||||
scriptTag.type = 'application/javascript';
|
scriptTag.type = 'application/javascript';
|
||||||
document.body.append(scriptTag);
|
document.body.append(scriptTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('serviceWorker' in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
// Service workers are supported. Use them.
|
// Service workers are supported. Use them.
|
||||||
window.addEventListener('load', function () {
|
window.addEventListener('load', function () {
|
||||||
// Wait for registration to finish before dropping the <script> tag.
|
// Wait for registration to finish before dropping the <script> tag.
|
||||||
// Otherwise, the browser will load the script multiple times,
|
// Otherwise, the browser will load the script multiple times,
|
||||||
// potentially different versions.
|
// potentially different versions.
|
||||||
var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
|
var serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
|
||||||
navigator.serviceWorker.register(serviceWorkerUrl)
|
navigator.serviceWorker.register(serviceWorkerUrl)
|
||||||
.then((reg) => {
|
.then((reg) => {
|
||||||
function waitForActivation(serviceWorker) {
|
function waitForActivation(serviceWorker) {
|
||||||
serviceWorker.addEventListener('statechange', () => {
|
serviceWorker.addEventListener('statechange', () => {
|
||||||
if (serviceWorker.state == 'activated') {
|
if (serviceWorker.state == 'activated') {
|
||||||
console.log('Installed new service worker.');
|
console.log('Installed new service worker.');
|
||||||
loadMainDartJs();
|
loadMainDartJs();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reg.active && (reg.installing || reg.waiting)) {
|
||||||
|
// No active web worker and we have installed or are installing
|
||||||
|
// one for the first time. Simply wait for it to activate.
|
||||||
|
waitForActivation(reg.installing || reg.waiting);
|
||||||
|
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
|
||||||
|
// When the app updates the serviceWorkerVersion changes, so we
|
||||||
|
// need to ask the service worker to update.
|
||||||
|
console.log('New service worker available.');
|
||||||
|
reg.update();
|
||||||
|
waitForActivation(reg.installing);
|
||||||
|
} else {
|
||||||
|
// Existing service worker is still good.
|
||||||
|
console.log('Loading app from service worker.');
|
||||||
|
loadMainDartJs();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// If service worker doesn't succeed in a reasonable amount of time,
|
||||||
|
// fallback to plaint <script> tag.
|
||||||
|
setTimeout(() => {
|
||||||
|
if (!scriptLoaded) {
|
||||||
|
console.warn(
|
||||||
|
'Failed to load app from service worker. Falling back to plain <script> tag.',
|
||||||
|
);
|
||||||
|
loadMainDartJs();
|
||||||
}
|
}
|
||||||
});
|
}, 4000);
|
||||||
}
|
});
|
||||||
if (!reg.active && (reg.installing || reg.waiting)) {
|
|
||||||
// No active web worker and we have installed or are installing
|
|
||||||
// one for the first time. Simply wait for it to activate.
|
|
||||||
waitForActivation(reg.installing || reg.waiting);
|
|
||||||
} else if (!reg.active.scriptURL.endsWith(serviceWorkerVersion)) {
|
|
||||||
// When the app updates the serviceWorkerVersion changes, so we
|
|
||||||
// need to ask the service worker to update.
|
|
||||||
console.log('New service worker available.');
|
|
||||||
reg.update();
|
|
||||||
waitForActivation(reg.installing);
|
|
||||||
} else {
|
|
||||||
// Existing service worker is still good.
|
|
||||||
console.log('Loading app from service worker.');
|
|
||||||
loadMainDartJs();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// If service worker doesn't succeed in a reasonable amount of time,
|
|
||||||
// fallback to plaint <script> tag.
|
|
||||||
setTimeout(() => {
|
|
||||||
if (!scriptLoaded) {
|
|
||||||
console.warn(
|
|
||||||
'Failed to load app from service worker. Falling back to plain <script> tag.',
|
|
||||||
);
|
|
||||||
loadMainDartJs();
|
|
||||||
}
|
|
||||||
}, 4000);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
// Service workers not supported. Just drop the <script> tag.
|
// Service workers not supported. Just drop the <script> tag.
|
||||||
loadMainDartJs();
|
loadMainDartJs();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script src="libs/firebase-app.js?8.10.1"></script>
|
<script src="libs/firebase-app.js?8.10.1"></script>
|
||||||
<script src="libs/firebase-analytics.js?8.10.1"></script>
|
<script src="libs/firebase-analytics.js?8.10.1"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Your web app's Firebase configuration
|
// Your web app's Firebase configuration
|
||||||
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
|
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
|
||||||
const firebaseConfig = {
|
const firebaseConfig = {
|
||||||
apiKey: "AIzaSyCgehIZk1aFP0E7wZtYRRqrfvNiNAF39-A",
|
apiKey: "AIzaSyCgehIZk1aFP0E7wZtYRRqrfvNiNAF39-A",
|
||||||
authDomain: "rustdesk.firebaseapp.com",
|
authDomain: "rustdesk.firebaseapp.com",
|
||||||
databaseURL: "https://rustdesk.firebaseio.com",
|
databaseURL: "https://rustdesk.firebaseio.com",
|
||||||
projectId: "rustdesk",
|
projectId: "rustdesk",
|
||||||
storageBucket: "rustdesk.appspot.com",
|
storageBucket: "rustdesk.appspot.com",
|
||||||
messagingSenderId: "768133699366",
|
messagingSenderId: "768133699366",
|
||||||
appId: "1:768133699366:web:d50faf0792cb208d7993e7",
|
appId: "1:768133699366:web:d50faf0792cb208d7993e7",
|
||||||
measurementId: "G-9PEH85N6ZQ"
|
measurementId: "G-9PEH85N6ZQ"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Initialize Firebase
|
// Initialize Firebase
|
||||||
firebase.initializeApp(firebaseConfig);
|
firebase.initializeApp(firebaseConfig);
|
||||||
firebase.analytics();
|
firebase.analytics();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
3
resources/web/js/dist/index.html
vendored
3
resources/web/js/dist/index.html
vendored
@@ -7,6 +7,9 @@
|
|||||||
<script src="ogvjs-1.8.6/ogv.js"></script>
|
<script src="ogvjs-1.8.6/ogv.js"></script>
|
||||||
<script src="./yuv-canvas-1.2.6.js"></script>
|
<script src="./yuv-canvas-1.2.6.js"></script>
|
||||||
<title>Vite App</title>
|
<title>Vite App</title>
|
||||||
|
<script type="module" crossorigin src="/index.js"></script>
|
||||||
|
<link rel="modulepreload" href="/vendor.js">
|
||||||
|
<link rel="stylesheet" href="/index.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|||||||
4
resources/web/js/dist/index.js
vendored
4
resources/web/js/dist/index.js
vendored
File diff suppressed because one or more lines are too long
797
resources/web/js/package-lock.json
generated
vendored
797
resources/web/js/package-lock.json
generated
vendored
@@ -1,803 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "web_hbb",
|
"name": "web_hbb",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "web_hbb",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"dependencies": {
|
|
||||||
"fast-sha256": "^1.3.0",
|
|
||||||
"libsodium": "^0.7.9",
|
|
||||||
"libsodium-wrappers": "^0.7.9",
|
|
||||||
"pcm-player": "^0.0.11",
|
|
||||||
"ts-proto": "^1.141.1",
|
|
||||||
"wasm-feature-detect": "^1.2.11",
|
|
||||||
"zstddec": "^0.0.2"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"typescript": "4.4.4",
|
|
||||||
"vite": "2.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@esbuild/linux-loong64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==",
|
|
||||||
"cpu": [
|
|
||||||
"loong64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/aspromise": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
|
|
||||||
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/base64": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
|
|
||||||
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/codegen": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
|
|
||||||
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/eventemitter": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/fetch": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"@protobufjs/aspromise": "^1.1.1",
|
|
||||||
"@protobufjs/inquire": "^1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/float": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/inquire": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/path": {
|
|
||||||
"version": "1.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
|
|
||||||
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/pool": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
|
|
||||||
},
|
|
||||||
"node_modules/@protobufjs/utf8": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
|
|
||||||
},
|
|
||||||
"node_modules/@types/long": {
|
|
||||||
"version": "4.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
|
|
||||||
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
|
|
||||||
},
|
|
||||||
"node_modules/@types/node": {
|
|
||||||
"version": "18.7.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.6.tgz",
|
|
||||||
"integrity": "sha512-EdxgKRXgYsNITy5mjjXjVE/CS8YENSdhiagGrLqjG0pvA2owgJ6i4l7wy/PFZGC0B1/H20lWKN7ONVDNYDZm7A=="
|
|
||||||
},
|
|
||||||
"node_modules/@types/object-hash": {
|
|
||||||
"version": "1.3.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz",
|
|
||||||
"integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA=="
|
|
||||||
},
|
|
||||||
"node_modules/case-anything": {
|
|
||||||
"version": "2.1.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz",
|
|
||||||
"integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12.13"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/mesqueeb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/dataloader": {
|
|
||||||
"version": "1.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
|
|
||||||
"integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="
|
|
||||||
},
|
|
||||||
"node_modules/detect-libc": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
|
|
||||||
"bin": {
|
|
||||||
"detect-libc": "bin/detect-libc.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/dprint-node": {
|
|
||||||
"version": "1.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz",
|
|
||||||
"integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==",
|
|
||||||
"dependencies": {
|
|
||||||
"detect-libc": "^1.0.3"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"bin": {
|
|
||||||
"esbuild": "bin/esbuild"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"@esbuild/linux-loong64": "0.14.54",
|
|
||||||
"esbuild-android-64": "0.14.54",
|
|
||||||
"esbuild-android-arm64": "0.14.54",
|
|
||||||
"esbuild-darwin-64": "0.14.54",
|
|
||||||
"esbuild-darwin-arm64": "0.14.54",
|
|
||||||
"esbuild-freebsd-64": "0.14.54",
|
|
||||||
"esbuild-freebsd-arm64": "0.14.54",
|
|
||||||
"esbuild-linux-32": "0.14.54",
|
|
||||||
"esbuild-linux-64": "0.14.54",
|
|
||||||
"esbuild-linux-arm": "0.14.54",
|
|
||||||
"esbuild-linux-arm64": "0.14.54",
|
|
||||||
"esbuild-linux-mips64le": "0.14.54",
|
|
||||||
"esbuild-linux-ppc64le": "0.14.54",
|
|
||||||
"esbuild-linux-riscv64": "0.14.54",
|
|
||||||
"esbuild-linux-s390x": "0.14.54",
|
|
||||||
"esbuild-netbsd-64": "0.14.54",
|
|
||||||
"esbuild-openbsd-64": "0.14.54",
|
|
||||||
"esbuild-sunos-64": "0.14.54",
|
|
||||||
"esbuild-windows-32": "0.14.54",
|
|
||||||
"esbuild-windows-64": "0.14.54",
|
|
||||||
"esbuild-windows-arm64": "0.14.54"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-android-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"android"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-android-arm64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"android"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-darwin-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"darwin"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-darwin-arm64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"darwin"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-freebsd-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"freebsd"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-freebsd-arm64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"freebsd"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-32": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==",
|
|
||||||
"cpu": [
|
|
||||||
"ia32"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-arm": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==",
|
|
||||||
"cpu": [
|
|
||||||
"arm"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-arm64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-mips64le": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==",
|
|
||||||
"cpu": [
|
|
||||||
"mips64el"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-ppc64le": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==",
|
|
||||||
"cpu": [
|
|
||||||
"ppc64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-riscv64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==",
|
|
||||||
"cpu": [
|
|
||||||
"riscv64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-linux-s390x": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==",
|
|
||||||
"cpu": [
|
|
||||||
"s390x"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"linux"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-netbsd-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"netbsd"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-openbsd-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"openbsd"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-sunos-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"sunos"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-windows-32": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==",
|
|
||||||
"cpu": [
|
|
||||||
"ia32"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-windows-64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==",
|
|
||||||
"cpu": [
|
|
||||||
"x64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/esbuild-windows-arm64": {
|
|
||||||
"version": "0.14.54",
|
|
||||||
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz",
|
|
||||||
"integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==",
|
|
||||||
"cpu": [
|
|
||||||
"arm64"
|
|
||||||
],
|
|
||||||
"dev": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"win32"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/fast-sha256": {
|
|
||||||
"version": "1.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz",
|
|
||||||
"integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="
|
|
||||||
},
|
|
||||||
"node_modules/fsevents": {
|
|
||||||
"version": "2.3.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
|
||||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"optional": true,
|
|
||||||
"os": [
|
|
||||||
"darwin"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/function-bind": {
|
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/has": {
|
|
||||||
"version": "1.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
|
||||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"function-bind": "^1.1.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/is-core-module": {
|
|
||||||
"version": "2.10.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
|
|
||||||
"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"has": "^1.0.3"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/libsodium": {
|
|
||||||
"version": "0.7.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz",
|
|
||||||
"integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ=="
|
|
||||||
},
|
|
||||||
"node_modules/libsodium-wrappers": {
|
|
||||||
"version": "0.7.10",
|
|
||||||
"resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz",
|
|
||||||
"integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==",
|
|
||||||
"dependencies": {
|
|
||||||
"libsodium": "^0.7.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/long": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
|
||||||
},
|
|
||||||
"node_modules/nanoid": {
|
|
||||||
"version": "3.3.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
|
|
||||||
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
|
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
|
||||||
"nanoid": "bin/nanoid.cjs"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/object-hash": {
|
|
||||||
"version": "1.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
|
|
||||||
"integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/path-parse": {
|
|
||||||
"version": "1.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
|
||||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/pcm-player": {
|
|
||||||
"version": "0.0.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/pcm-player/-/pcm-player-0.0.11.tgz",
|
|
||||||
"integrity": "sha512-+FmX62jiqZa7wDCqSRQ1g3DuU6JNgpymgOLCWhmiE/Lj/M+rOUNqgNwVQX509LdA9dtBtVD3EQQUSp9JqU6upw=="
|
|
||||||
},
|
|
||||||
"node_modules/picocolors": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/postcss": {
|
|
||||||
"version": "8.4.16",
|
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz",
|
|
||||||
"integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==",
|
|
||||||
"dev": true,
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/postcss/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "tidelift",
|
|
||||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"nanoid": "^3.3.4",
|
|
||||||
"picocolors": "^1.0.0",
|
|
||||||
"source-map-js": "^1.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "^10 || ^12 || >=14"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/protobufjs": {
|
|
||||||
"version": "6.11.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
|
|
||||||
"integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@protobufjs/aspromise": "^1.1.2",
|
|
||||||
"@protobufjs/base64": "^1.1.2",
|
|
||||||
"@protobufjs/codegen": "^2.0.4",
|
|
||||||
"@protobufjs/eventemitter": "^1.1.0",
|
|
||||||
"@protobufjs/fetch": "^1.1.0",
|
|
||||||
"@protobufjs/float": "^1.0.2",
|
|
||||||
"@protobufjs/inquire": "^1.1.0",
|
|
||||||
"@protobufjs/path": "^1.1.2",
|
|
||||||
"@protobufjs/pool": "^1.1.0",
|
|
||||||
"@protobufjs/utf8": "^1.1.0",
|
|
||||||
"@types/long": "^4.0.1",
|
|
||||||
"@types/node": ">=13.7.0",
|
|
||||||
"long": "^4.0.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"pbjs": "bin/pbjs",
|
|
||||||
"pbts": "bin/pbts"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/resolve": {
|
|
||||||
"version": "1.22.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
|
|
||||||
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-core-module": "^2.9.0",
|
|
||||||
"path-parse": "^1.0.7",
|
|
||||||
"supports-preserve-symlinks-flag": "^1.0.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"resolve": "bin/resolve"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/rollup": {
|
|
||||||
"version": "2.77.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz",
|
|
||||||
"integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==",
|
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
|
||||||
"rollup": "dist/bin/rollup"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10.0.0"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"fsevents": "~2.3.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/source-map-js": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/supports-preserve-symlinks-flag": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ts-poet": {
|
|
||||||
"version": "6.4.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz",
|
|
||||||
"integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"dprint-node": "^1.0.7"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ts-proto": {
|
|
||||||
"version": "1.141.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.141.1.tgz",
|
|
||||||
"integrity": "sha512-1b7Ka6R96FvFZldHnYPTFy4rzwOo+OTpIP1mBFW0dDwq4WWtSkIVlZ+SokOQSC1TiccNshOJwQC9soVyWfQ7Zg==",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/object-hash": "^1.3.0",
|
|
||||||
"case-anything": "^2.1.10",
|
|
||||||
"dataloader": "^1.4.0",
|
|
||||||
"object-hash": "^1.3.1",
|
|
||||||
"protobufjs": "^6.11.3",
|
|
||||||
"ts-poet": "^6.2.0",
|
|
||||||
"ts-proto-descriptors": "1.7.1"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"protoc-gen-ts_proto": "protoc-gen-ts_proto"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ts-proto-descriptors": {
|
|
||||||
"version": "1.7.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.7.1.tgz",
|
|
||||||
"integrity": "sha512-oIKUh3K4Xts4v29USGLfUG+2mEk32MsqpgZAOUyUlkrcIdv34yE+k2oZ2Nzngm6cV/JgFdOxRCqeyvmWHuYAyw==",
|
|
||||||
"dependencies": {
|
|
||||||
"long": "^4.0.0",
|
|
||||||
"protobufjs": "^6.8.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/typescript": {
|
|
||||||
"version": "4.4.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
|
|
||||||
"integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
|
|
||||||
"dev": true,
|
|
||||||
"bin": {
|
|
||||||
"tsc": "bin/tsc",
|
|
||||||
"tsserver": "bin/tsserver"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/vite": {
|
|
||||||
"version": "2.8.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
|
|
||||||
"integrity": "sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"esbuild": "^0.14.14",
|
|
||||||
"postcss": "^8.4.6",
|
|
||||||
"resolve": "^1.22.0",
|
|
||||||
"rollup": "^2.59.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"vite": "bin/vite.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12.2.0"
|
|
||||||
},
|
|
||||||
"optionalDependencies": {
|
|
||||||
"fsevents": "~2.3.2"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"less": "*",
|
|
||||||
"sass": "*",
|
|
||||||
"stylus": "*"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"less": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"sass": {
|
|
||||||
"optional": true
|
|
||||||
},
|
|
||||||
"stylus": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/wasm-feature-detect": {
|
|
||||||
"version": "1.2.11",
|
|
||||||
"resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.2.11.tgz",
|
|
||||||
"integrity": "sha512-HUqwaodrQGaZgz1lZaNioIkog9tkeEJjrM3eq4aUL04whXOVDRc/o2EGb/8kV0QX411iAYWEqq7fMBmJ6dKS6w=="
|
|
||||||
},
|
|
||||||
"node_modules/zstddec": {
|
|
||||||
"version": "0.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.0.2.tgz",
|
|
||||||
"integrity": "sha512-DCo0oxvcvOTGP/f5FA6tz2Z6wF+FIcEApSTu0zV5sQgn9hoT5lZ9YRAKUraxt9oP7l4e8TnNdi8IZTCX6WCkwA=="
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@esbuild/linux-loong64": {
|
"@esbuild/linux-loong64": {
|
||||||
"version": "0.14.54",
|
"version": "0.14.54",
|
||||||
|
|||||||
2
resources/web/js/package.json
vendored
2
resources/web/js/package.json
vendored
@@ -3,7 +3,7 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"build": "python ./gen_js_from_hbb.py > src/gen_js_from_hbb.ts && python ./ts_proto.py && tsc && yarn vite build",
|
"build": "vite build",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
11
resources/web/js/src/connection.ts
vendored
11
resources/web/js/src/connection.ts
vendored
@@ -14,7 +14,8 @@ const HOSTS = [
|
|||||||
"rs-us.rustdesk.com",
|
"rs-us.rustdesk.com",
|
||||||
];
|
];
|
||||||
let HOST = localStorage.getItem("rendezvous-server") || HOSTS[0];
|
let HOST = localStorage.getItem("rendezvous-server") || HOSTS[0];
|
||||||
const SCHEMA = "ws://";
|
//根据协议设置为ws或wss
|
||||||
|
const SCHEMA=location.protocol=="https:"?"wss://":"ws://";
|
||||||
|
|
||||||
type MsgboxCallback = (type: string, title: string, text: string) => void;
|
type MsgboxCallback = (type: string, title: string, text: string) => void;
|
||||||
type DrawCallback = (data: Uint8Array) => void;
|
type DrawCallback = (data: Uint8Array) => void;
|
||||||
@@ -99,7 +100,7 @@ export default class Connection {
|
|||||||
ws.sendRendezvous({ punch_hole_request });
|
ws.sendRendezvous({ punch_hole_request });
|
||||||
const msg = (await ws.next()) as rendezvous.RendezvousMessage;
|
const msg = (await ws.next()) as rendezvous.RendezvousMessage;
|
||||||
ws.close();
|
ws.close();
|
||||||
console.log(new Date() + ": Got relay response");
|
console.log(new Date() + ": Got relay response", msg);
|
||||||
const phr = msg.punch_hole_response;
|
const phr = msg.punch_hole_response;
|
||||||
const rr = msg.relay_response;
|
const rr = msg.relay_response;
|
||||||
if (phr) {
|
if (phr) {
|
||||||
@@ -236,8 +237,14 @@ export default class Connection {
|
|||||||
async msgLoop() {
|
async msgLoop() {
|
||||||
while (true) {
|
while (true) {
|
||||||
const msg = (await this._ws?.next()) as message.Message;
|
const msg = (await this._ws?.next()) as message.Message;
|
||||||
|
// console.log("msg", msg);
|
||||||
if (msg?.hash) {
|
if (msg?.hash) {
|
||||||
this._hash = msg?.hash;
|
this._hash = msg?.hash;
|
||||||
|
const tmp = this.getOption('tmppwd')
|
||||||
|
if(!this._password && tmp){
|
||||||
|
this._password = Uint8Array.from(JSON.parse("[" + tmp + "]"));
|
||||||
|
this.setOption('tmppwd', '')
|
||||||
|
}
|
||||||
if (!this._password)
|
if (!this._password)
|
||||||
this.msgbox("input-password", "Password Required", "");
|
this.msgbox("input-password", "Password Required", "");
|
||||||
this.login();
|
this.login();
|
||||||
|
|||||||
100
resources/web/js/src/ljw.js
vendored
Normal file
100
resources/web/js/src/ljw.js
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
window._gwen = {}
|
||||||
|
window._gwen.kv = {}
|
||||||
|
const apiserver = localStorage.getItem('api-server')
|
||||||
|
|
||||||
|
function stringToUint8Array(str) {
|
||||||
|
var arr = [];
|
||||||
|
for (var i = 0, j = str.length; i < j; ++i) {
|
||||||
|
arr.push(str.charCodeAt(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
var tmpUint8Array = new Uint8Array(arr);
|
||||||
|
return tmpUint8Array
|
||||||
|
}
|
||||||
|
|
||||||
|
function getQueryVariable() {
|
||||||
|
const query = window.location.hash.substring(3);
|
||||||
|
const vars = query.split("&");
|
||||||
|
for (var i = 0; i < vars.length; i++) {
|
||||||
|
var pair = vars[i].split("=");
|
||||||
|
window._gwen.kv[pair[0]] = pair[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getQueryVariable()
|
||||||
|
|
||||||
|
const id = window._gwen.kv.id || ''
|
||||||
|
if (id) {
|
||||||
|
localStorage.setItem('remote-id', id)
|
||||||
|
}
|
||||||
|
const share_token = window._gwen.kv.share_token || ''
|
||||||
|
if (share_token) {
|
||||||
|
fetch(apiserver + "/api/shared-peer", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({share_token})
|
||||||
|
}).then(res => res.json()).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
localStorage.setItem('custom-rendezvous-server', res.data.id_server)
|
||||||
|
localStorage.setItem('key', res.data.key)
|
||||||
|
const peer = res.data.peer
|
||||||
|
localStorage.setItem('remote-id', peer.info.id)
|
||||||
|
peer.tmppwd = stringToUint8Array(window.atob(peer.tmppwd)).toString()
|
||||||
|
const oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
|
||||||
|
oldPeers[peer.info.id] = peer
|
||||||
|
localStorage.setItem('peers', JSON.stringify(oldPeers))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const autoWriteServer = () => {
|
||||||
|
return setTimeout(() => {
|
||||||
|
const token = localStorage.getItem('access_token')
|
||||||
|
if (token && apiserver) {
|
||||||
|
fetch(apiserver + "/api/server-config", {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': 'Bearer ' + token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
).then(res => res.json()).then(res => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
if (!localStorage.getItem('custom-rendezvous-server') || !localStorage.getItem('key')) {
|
||||||
|
localStorage.setItem('custom-rendezvous-server', res.data.id_server)
|
||||||
|
localStorage.setItem('key', res.data.key)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res.data.peers) {
|
||||||
|
const oldPeers = JSON.parse(localStorage.getItem('peers')) || {}
|
||||||
|
let needUpdate = false
|
||||||
|
Object.keys(res.data.peers).forEach(k => {
|
||||||
|
if (!oldPeers[k]) {
|
||||||
|
oldPeers[k] = res.data.peers[k]
|
||||||
|
needUpdate = true
|
||||||
|
} else {
|
||||||
|
oldPeers[k].info = res.data.peers[k].info
|
||||||
|
}
|
||||||
|
if (oldPeers[k].info && oldPeers[k].info.hash && !oldPeers[k].password) {
|
||||||
|
let p1 = window.atob(oldPeers[k].info.hash)
|
||||||
|
const pwd = stringToUint8Array(p1)
|
||||||
|
oldPeers[k].password = pwd.toString()
|
||||||
|
oldPeers[k].remember = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
localStorage.setItem('peers', JSON.stringify(oldPeers))
|
||||||
|
if (needUpdate) {
|
||||||
|
window.location.reload()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
autoWriteServer()
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
autoWriteServer()
|
||||||
1
resources/web/js/src/main.ts
vendored
1
resources/web/js/src/main.ts
vendored
@@ -1,2 +1,3 @@
|
|||||||
|
import "./ljw";
|
||||||
import "./globals";
|
import "./globals";
|
||||||
import "./ui";
|
import "./ui";
|
||||||
@@ -3,6 +3,7 @@ package service
|
|||||||
import (
|
import (
|
||||||
"Gwen/global"
|
"Gwen/global"
|
||||||
"Gwen/model"
|
"Gwen/model"
|
||||||
|
"github.com/google/uuid"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -113,3 +114,16 @@ func (t *AddressBookService) Delete(u *model.AddressBook) error {
|
|||||||
func (t *AddressBookService) Update(u *model.AddressBook) error {
|
func (t *AddressBookService) Update(u *model.AddressBook) error {
|
||||||
return global.DB.Model(u).Updates(u).Error
|
return global.DB.Model(u).Updates(u).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ShareByWebClient 分享
|
||||||
|
func (t *AddressBookService) ShareByWebClient(m *model.ShareRecord) error {
|
||||||
|
m.ShareToken = uuid.New().String()
|
||||||
|
return global.DB.Create(m).Error
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedPeer
|
||||||
|
func (t *AddressBookService) SharedPeer(shareToken string) *model.ShareRecord {
|
||||||
|
m := &model.ShareRecord{}
|
||||||
|
global.DB.Where("share_token = ?", shareToken).First(m)
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user