package service import ( "bytes" "context" "decoder/valib/ipc" "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, } } // Run run task from ipc data func (r *Reciever) Run(asServer bool) { var i *ipc.IPC if asServer { i = ipc.NewServer(r.ctxIPC.ctx, r.ipcURL) } else { i = ipc.NewClient(r.ctxIPC.ctx, r.ipcURL) } dataChan := make(chan []byte) go unserilizeImageInfo(dataChan, r.chImage) i.RecvToChannel(dataChan) } // Stop stop reciever, run in goroutine func (r *Reciever) Stop() { if r.ctxIPC.cancel != nil { r.ctxIPC.cancel() } }