From 87bbdacc2245d2578cbb4e47128611ec575d4c7f Mon Sep 17 00:00:00 2001 From: Egor Aristov Date: Mon, 20 Oct 2025 14:36:37 +0300 Subject: [PATCH] tons of code --- {examples/simple => example}/golang/go.mod | 0 {examples/simple => example}/golang/main.go | 0 {examples/simple => example}/ts/index.ts | 0 {examples/simple => example}/ts/package.json | 0 {examples/simple => example}/ts/tsconfig.json | 0 golang/go.mod | 3 - golang/lib.go | 12 -- kitcom/main.go | 7 -- lib/golang/go.mod | 5 + lib/golang/go.sum | 2 + lib/golang/lib.go | 108 ++++++++++++++++++ {ts => lib/ts}/lib.ts | 0 {ts => lib/ts}/package.json | 0 {ts => lib/ts}/tsconfig.json | 0 14 files changed, 115 insertions(+), 22 deletions(-) rename {examples/simple => example}/golang/go.mod (100%) rename {examples/simple => example}/golang/main.go (100%) rename {examples/simple => example}/ts/index.ts (100%) rename {examples/simple => example}/ts/package.json (100%) rename {examples/simple => example}/ts/tsconfig.json (100%) delete mode 100644 golang/go.mod delete mode 100644 golang/lib.go create mode 100644 lib/golang/go.mod create mode 100644 lib/golang/go.sum create mode 100644 lib/golang/lib.go rename {ts => lib/ts}/lib.ts (100%) rename {ts => lib/ts}/package.json (100%) rename {ts => lib/ts}/tsconfig.json (100%) diff --git a/examples/simple/golang/go.mod b/example/golang/go.mod similarity index 100% rename from examples/simple/golang/go.mod rename to example/golang/go.mod diff --git a/examples/simple/golang/main.go b/example/golang/main.go similarity index 100% rename from examples/simple/golang/main.go rename to example/golang/main.go diff --git a/examples/simple/ts/index.ts b/example/ts/index.ts similarity index 100% rename from examples/simple/ts/index.ts rename to example/ts/index.ts diff --git a/examples/simple/ts/package.json b/example/ts/package.json similarity index 100% rename from examples/simple/ts/package.json rename to example/ts/package.json diff --git a/examples/simple/ts/tsconfig.json b/example/ts/tsconfig.json similarity index 100% rename from examples/simple/ts/tsconfig.json rename to example/ts/tsconfig.json diff --git a/golang/go.mod b/golang/go.mod deleted file mode 100644 index 2f20896..0000000 --- a/golang/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module efprojects.com/kitten-ipc - -go 1.25.1 diff --git a/golang/lib.go b/golang/lib.go deleted file mode 100644 index 50f216f..0000000 --- a/golang/lib.go +++ /dev/null @@ -1,12 +0,0 @@ -package kittenipc - -import ( - "os/exec" -) - -type KittenIPC struct { -} - -func New(cmd *exec.Cmd, api any) *KittenIPC { - -} diff --git a/kitcom/main.go b/kitcom/main.go index 1d0586c..050131d 100644 --- a/kitcom/main.go +++ b/kitcom/main.go @@ -9,13 +9,6 @@ import ( "path/filepath" ) -type ProgLang string - -const ( - Golang ProgLang = "Golang" - TypeScript = "Typescript" -) - var ( Src string Dest string diff --git a/lib/golang/go.mod b/lib/golang/go.mod new file mode 100644 index 0000000..2f3078e --- /dev/null +++ b/lib/golang/go.mod @@ -0,0 +1,5 @@ +module efprojects.com/kitten-ipc + +go 1.25.1 + +require github.com/samber/mo v1.16.0 // indirect diff --git a/lib/golang/go.sum b/lib/golang/go.sum new file mode 100644 index 0000000..e83beb0 --- /dev/null +++ b/lib/golang/go.sum @@ -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= diff --git a/lib/golang/lib.go b/lib/golang/lib.go new file mode 100644 index 0000000..0eaf1d1 --- /dev/null +++ b/lib/golang/lib.go @@ -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 +} diff --git a/ts/lib.ts b/lib/ts/lib.ts similarity index 100% rename from ts/lib.ts rename to lib/ts/lib.ts diff --git a/ts/package.json b/lib/ts/package.json similarity index 100% rename from ts/package.json rename to lib/ts/package.json diff --git a/ts/tsconfig.json b/lib/ts/tsconfig.json similarity index 100% rename from ts/tsconfig.json rename to lib/ts/tsconfig.json