109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
//go:build js && wasm
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"syscall/js"
|
|
|
|
"github.com/tale/headplane/internal/hp_ipn"
|
|
)
|
|
|
|
func main() {
|
|
log.Printf("Loading WASM Headplane SSH module")
|
|
js.Global().Set("TsWasmNet", js.FuncOf(func(this js.Value, args []js.Value) any {
|
|
if len(args) != 2 {
|
|
log.Fatal("Usage: TsWasmNet(config, callbacks)")
|
|
return nil
|
|
}
|
|
|
|
options, err := hp_ipn.ParseTsWasmNetOptions(args[0])
|
|
if err != nil {
|
|
log.Fatal("Error parsing options:", err)
|
|
return nil
|
|
}
|
|
|
|
callbacks, err := hp_ipn.ParseTsWasmNetCallbacks(args[1])
|
|
if err != nil {
|
|
log.Fatal("Error parsing callbacks:", err)
|
|
return nil
|
|
}
|
|
|
|
ipn, err := hp_ipn.NewTsWasmIpn(options, callbacks)
|
|
if err != nil {
|
|
log.Fatal("Error creating TsWasmIpn:", err)
|
|
return nil
|
|
}
|
|
|
|
return map[string]any{
|
|
"Start": js.FuncOf(func(this js.Value, args []js.Value) any {
|
|
ipn.Start(context.Background())
|
|
return nil
|
|
}),
|
|
"OpenSSH": js.FuncOf(func(this js.Value, args []js.Value) any {
|
|
if len(args) != 3 {
|
|
log.Fatal("Usage: OpenSSH(host, user, options)")
|
|
return nil
|
|
}
|
|
|
|
hostname := args[0]
|
|
if hostname.IsNull() || hostname.IsUndefined() {
|
|
log.Fatal("Hostname must be a non-null, non-undefined string")
|
|
return nil
|
|
}
|
|
|
|
if hostname.Type() != js.TypeString {
|
|
log.Fatal("Hostname must be a string")
|
|
return nil
|
|
}
|
|
|
|
username := args[1]
|
|
if username.IsNull() || username.IsUndefined() {
|
|
log.Fatal("Username must be a non-null, non-undefined string")
|
|
return nil
|
|
}
|
|
|
|
if username.Type() != js.TypeString {
|
|
log.Fatal("Username must be a string")
|
|
return nil
|
|
}
|
|
|
|
sshOptions, err := hp_ipn.ParseSSHXtermConfig(args[2])
|
|
if err != nil {
|
|
log.Fatal("Error parsing SSH options:", err)
|
|
return nil
|
|
}
|
|
|
|
session := ipn.NewSSHSession(hostname.String(), username.String(), sshOptions)
|
|
go session.ConnectAndRun()
|
|
|
|
return map[string]any{
|
|
"Close": js.FuncOf(func(this js.Value, args []js.Value) any {
|
|
return session.Close() != nil
|
|
}),
|
|
|
|
"Resize": js.FuncOf(func(this js.Value, args []js.Value) any {
|
|
if len(args) != 2 {
|
|
log.Fatal("Usage: Resize(cols, rows)")
|
|
return nil
|
|
}
|
|
|
|
rows := args[0].Int()
|
|
cols := args[1].Int()
|
|
if cols <= 0 || rows <= 0 {
|
|
log.Fatal("Columns and rows must be positive integers")
|
|
return nil
|
|
}
|
|
|
|
return session.Resize(cols, rows) == nil
|
|
}),
|
|
}
|
|
}),
|
|
}
|
|
}))
|
|
|
|
log.Printf("WASM Headplane SSH module loaded successfully")
|
|
<-make(chan bool)
|
|
}
|