mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-01-02 18:39:05 +01:00
01b5d71709
lots of changes. new wshrpc implementation. unify websocket, web, blockcontroller, domain sockets, and terminal inputs to all use the new rpc system. lots of moving files around to deal with circular dependencies use new wshrpc as a client in wsh cmd
131 lines
3.4 KiB
Go
131 lines
3.4 KiB
Go
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// types and methods for wsh rpc calls
|
|
package wshrpc
|
|
|
|
import (
|
|
"reflect"
|
|
|
|
"github.com/wavetermdev/thenextwave/pkg/ijson"
|
|
"github.com/wavetermdev/thenextwave/pkg/shellexec"
|
|
"github.com/wavetermdev/thenextwave/pkg/waveobj"
|
|
"github.com/wavetermdev/thenextwave/pkg/wshutil"
|
|
"github.com/wavetermdev/thenextwave/pkg/wstore"
|
|
)
|
|
|
|
const (
|
|
Command_Message = "message"
|
|
Command_SetView = "setview"
|
|
Command_SetMeta = "setmeta"
|
|
Command_GetMeta = "getmeta"
|
|
Command_BlockInput = "controller:input"
|
|
Command_Restart = "controller:restart"
|
|
Command_AppendFile = "file:append"
|
|
Command_AppendIJson = "file:appendijson"
|
|
Command_ResolveIds = "resolveids"
|
|
Command_CreateBlock = "createblock"
|
|
)
|
|
|
|
type MetaDataType = map[string]any
|
|
|
|
var DataTypeMap = map[string]reflect.Type{
|
|
"meta": reflect.TypeOf(MetaDataType{}),
|
|
"resolveidsrtn": reflect.TypeOf(CommandResolveIdsRtnData{}),
|
|
"oref": reflect.TypeOf(waveobj.ORef{}),
|
|
}
|
|
|
|
// for frontend
|
|
type WshServerCommandMeta struct {
|
|
CommandType string `json:"commandtype"`
|
|
}
|
|
|
|
type WshRpcCommandOpts struct {
|
|
Timeout int `json:"timeout"`
|
|
NoResponse bool `json:"noresponse"`
|
|
}
|
|
|
|
func HackRpcContextIntoData(dataPtr any, rpcContext wshutil.RpcContext) {
|
|
dataVal := reflect.ValueOf(dataPtr).Elem()
|
|
dataType := dataVal.Type()
|
|
for i := 0; i < dataVal.NumField(); i++ {
|
|
field := dataVal.Field(i)
|
|
if !field.IsZero() {
|
|
continue
|
|
}
|
|
fieldType := dataType.Field(i)
|
|
tag := fieldType.Tag.Get("wshcontext")
|
|
if tag == "" {
|
|
continue
|
|
}
|
|
switch tag {
|
|
case "BlockId":
|
|
field.SetString(rpcContext.BlockId)
|
|
case "TabId":
|
|
field.SetString(rpcContext.TabId)
|
|
case "WindowId":
|
|
field.SetString(rpcContext.WindowId)
|
|
case "BlockORef":
|
|
if rpcContext.BlockId != "" {
|
|
field.Set(reflect.ValueOf(waveobj.MakeORef(wstore.OType_Block, rpcContext.BlockId)))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
type CommandMessageData struct {
|
|
ORef waveobj.ORef `json:"oref" wshcontext:"BlockORef"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type CommandGetMetaData struct {
|
|
ORef waveobj.ORef `json:"oref" wshcontext:"BlockORef"`
|
|
}
|
|
|
|
type CommandSetMetaData struct {
|
|
ORef waveobj.ORef `json:"oref" wshcontext:"BlockORef"`
|
|
Meta MetaDataType `json:"meta"`
|
|
}
|
|
|
|
type CommandResolveIdsData struct {
|
|
Ids []string `json:"ids"`
|
|
}
|
|
|
|
type CommandResolveIdsRtnData struct {
|
|
ResolvedIds map[string]waveobj.ORef `json:"resolvedids"`
|
|
}
|
|
|
|
type CommandCreateBlockData struct {
|
|
TabId string `json:"tabid" wshcontext:"TabId"`
|
|
BlockDef *wstore.BlockDef `json:"blockdef"`
|
|
RtOpts *wstore.RuntimeOpts `json:"rtopts"`
|
|
}
|
|
|
|
type CommandBlockSetViewData struct {
|
|
BlockId string `json:"blockid" wshcontext:"BlockId"`
|
|
View string `json:"view"`
|
|
}
|
|
|
|
type CommandBlockRestartData struct {
|
|
BlockId string `json:"blockid" wshcontext:"BlockId"`
|
|
}
|
|
|
|
type CommandBlockInputData struct {
|
|
BlockId string `json:"blockid" wshcontext:"BlockId"`
|
|
InputData64 string `json:"inputdata64,omitempty"`
|
|
SigName string `json:"signame,omitempty"`
|
|
TermSize *shellexec.TermSize `json:"termsize,omitempty"`
|
|
}
|
|
|
|
type CommandAppendFileData struct {
|
|
ZoneId string `json:"zoneid" wshcontext:"BlockId"`
|
|
FileName string `json:"filename"`
|
|
Data64 string `json:"data64"`
|
|
}
|
|
|
|
type CommandAppendIJsonData struct {
|
|
ZoneId string `json:"zoneid" wshcontext:"BlockId"`
|
|
FileName string `json:"filename"`
|
|
Data ijson.Command `json:"data"`
|
|
}
|