diff --git a/pkg/protocol/protocol.go b/pkg/protocol/protocol.go index 4f1371c..82d8c52 100644 --- a/pkg/protocol/protocol.go +++ b/pkg/protocol/protocol.go @@ -510,12 +510,34 @@ func (c *COBSFramer) WriteFrames(ctx context.Context, writer io.Writer, frameCha encoded := c.encoder.Encode(frame) - n, err := io.Copy(writer, bytes.NewReader(encoded)) + err := c.writeRaw(ctx, writer, encoded) if err != nil { - return fmt.Errorf("cold not write data: %w", err) + return err } - - c.logger.Tracef("wrote %d bytes", n) } } } + +func (c *COBSFramer) writeRaw(ctx context.Context, writer io.Writer, raw []byte) error { + errChan := make(chan error) + + go func() { + n, err := io.Copy(writer, bytes.NewReader(raw)) + if err != nil { + errChan <- fmt.Errorf("could not write data: %w", err) + + return + } + + c.logger.WithField("count", n).Tracef("wrote bytes") + + close(errChan) + }() + + select { + case <-ctx.Done(): + return nil + case err := <-errChan: + return err + } +}