package service import ( "analysis/valib/ipc" "bytes" "context" "encoding/gob" "fmt" ) // Reciever recv from ipc type Reciever struct { ctxIPC *ContextIPC ipcURL string chImage chan<- ImageInfo } func unserilizeImageInfo(data <-chan []byte, img chan<- ImageInfo) { for { d := <-data var buf bytes.Buffer buf.Write(d) dec := gob.NewDecoder(&buf) var i ImageInfo if err := dec.Decode(&i); err != nil { fmt.Println("gob decode CameraImage error", err) continue } img <- i } } // NewReciever new recv func NewReciever(url string, ch chan<- ImageInfo) *Reciever { ctx, cancel := context.WithCancel(context.Background()) return &Reciever{ ctxIPC: &ContextIPC{ctx, cancel}, ipcURL: url, chImage: ch, } } // NewRecieverWithContext new recver with context func NewRecieverWithContext(ctx context.Context, url string, ch chan<- ImageInfo) *Reciever { return &Reciever{ ctxIPC: &ContextIPC{ctx, nil}, ipcURL: url, chImage: ch, } } func (r *Reciever) run(i *ipc.IPC) { dataChan := make(chan []byte) go unserilizeImageInfo(dataChan, r.chImage) i.RecvToChannel(dataChan) } // RunAsServer run a IPC server func (r *Reciever) RunAsServer() { r.run(ipc.NewServer(r.ctxIPC.ctx, r.ipcURL)) } // RunAsClient run as a IPC client func (r *Reciever) RunAsClient() { r.run(ipc.NewClient(r.ctxIPC.ctx, r.ipcURL)) } // Stop stop reciever, run in goroutine func (r *Reciever) Stop() { if r.ctxIPC.cancel != nil { r.ctxIPC.cancel() } }