tons of code

This commit is contained in:
Egor Aristov 2025-10-20 14:36:37 +03:00
parent cf83eeab86
commit 87bbdacc22
Signed by: egor3f
GPG Key ID: 40482A264AAEC85F
14 changed files with 115 additions and 22 deletions

View File

@ -1,3 +0,0 @@
module efprojects.com/kitten-ipc
go 1.25.1

View File

@ -1,12 +0,0 @@
package kittenipc
import (
"os/exec"
)
type KittenIPC struct {
}
func New(cmd *exec.Cmd, api any) *KittenIPC {
}

View File

@ -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
View 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
View 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
View 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
}