From 46407b368528abdb2acbfc76b3556407d6049919 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Sat, 3 Dec 2022 13:33:37 +0100 Subject: [PATCH] Implement write canceling in COBSFramer --- pkg/protocol/protocol.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) 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 } + } + } +} + +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) - c.logger.Tracef("wrote %d bytes", n) + return } + + c.logger.WithField("count", n).Tracef("wrote bytes") + + close(errChan) + }() + + select { + case <-ctx.Done(): + return nil + case err := <-errChan: + return err } }