tons of code
This commit is contained in:
parent
cf83eeab86
commit
87bbdacc22
@ -1,3 +0,0 @@
|
|||||||
module efprojects.com/kitten-ipc
|
|
||||||
|
|
||||||
go 1.25.1
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
package kittenipc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os/exec"
|
|
||||||
)
|
|
||||||
|
|
||||||
type KittenIPC struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(cmd *exec.Cmd, api any) *KittenIPC {
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -9,13 +9,6 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProgLang string
|
|
||||||
|
|
||||||
const (
|
|
||||||
Golang ProgLang = "Golang"
|
|
||||||
TypeScript = "Typescript"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Src string
|
Src string
|
||||||
Dest string
|
Dest string
|
||||||
|
|||||||
5
lib/golang/go.mod
Normal file
5
lib/golang/go.mod
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module efprojects.com/kitten-ipc
|
||||||
|
|
||||||
|
go 1.25.1
|
||||||
|
|
||||||
|
require github.com/samber/mo v1.16.0 // indirect
|
||||||
2
lib/golang/go.sum
Normal file
2
lib/golang/go.sum
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
github.com/samber/mo v1.16.0 h1:qpEPCI63ou6wXlsNDMLE0IIN8A+devbGX/K1xdgr4b4=
|
||||||
|
github.com/samber/mo v1.16.0/go.mod h1:DlgzJ4SYhOh41nP1L9kh9rDNERuf8IqWSAs+gj2Vxag=
|
||||||
108
lib/golang/lib.go
Normal file
108
lib/golang/lib.go
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package kittenipc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"slices"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/samber/mo"
|
||||||
|
)
|
||||||
|
|
||||||
|
type StdioMode int
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
type KittenIPC struct {
|
||||||
|
cmd *exec.Cmd
|
||||||
|
cfg Config
|
||||||
|
|
||||||
|
socketPath string
|
||||||
|
listener net.Listener
|
||||||
|
conn net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(cmd *exec.Cmd, api any, cfg Config) (*KittenIPC, error) {
|
||||||
|
k := KittenIPC{
|
||||||
|
cmd: cmd,
|
||||||
|
cfg: cfg,
|
||||||
|
}
|
||||||
|
|
||||||
|
k.socketPath = filepath.Join(os.TempDir(), fmt.Sprintf("kitten-ipc-%d.sock", os.Getpid()))
|
||||||
|
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
|
||||||
|
const ipcSocketArg = "--ipc-socket"
|
||||||
|
if slices.Contains(cmd.Args, ipcSocketArg) {
|
||||||
|
return nil, fmt.Errorf("you should not use `%s` argument in your command", ipcSocketArg)
|
||||||
|
}
|
||||||
|
cmd.Args = append(cmd.Args, ipcSocketArg, k.socketPath)
|
||||||
|
|
||||||
|
return &k, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *KittenIPC) Start() error {
|
||||||
|
_ = os.Remove(k.socketPath)
|
||||||
|
listener, err := net.Listen("unix", k.socketPath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("listen unix socket: %w", err)
|
||||||
|
}
|
||||||
|
k.listener = listener
|
||||||
|
defer k.closeSock()
|
||||||
|
|
||||||
|
err = k.cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cmd start: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
const acceptTimeout = time.Second * 10
|
||||||
|
|
||||||
|
res := make(chan mo.Result[net.Conn], 1)
|
||||||
|
go func() {
|
||||||
|
conn, err := k.listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
res <- mo.Err[net.Conn](err)
|
||||||
|
} else {
|
||||||
|
res <- mo.Ok[net.Conn](conn)
|
||||||
|
}
|
||||||
|
close(res)
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-time.After(acceptTimeout):
|
||||||
|
_ = k.cmd.Process.Kill()
|
||||||
|
return fmt.Errorf("accept timeout")
|
||||||
|
case res := <-res:
|
||||||
|
if res.IsError() {
|
||||||
|
_ = k.cmd.Process.Kill()
|
||||||
|
return fmt.Errorf("accept: %w", res.Error())
|
||||||
|
}
|
||||||
|
k.conn = res.MustGet()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *KittenIPC) closeSock() error {
|
||||||
|
if err := k.listener.Close(); err != nil {
|
||||||
|
return fmt.Errorf("close socket listener: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *KittenIPC) Wait() error {
|
||||||
|
if err := k.cmd.Wait(); err != nil {
|
||||||
|
return fmt.Errorf("cmd wait: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := k.closeSock(); err != nil {
|
||||||
|
return fmt.Errorf("closeSock: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user