join.go raw

   1  // Copyright 2019 The Gorilla WebSocket Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  package websocket
   6  
   7  import (
   8  	"io"
   9  	"strings"
  10  )
  11  
  12  // JoinMessages concatenates received messages to create a single io.Reader.
  13  // The string term is appended to each message. The returned reader does not
  14  // support concurrent calls to the Read method.
  15  func JoinMessages(c *Conn, term string) io.Reader {
  16  	return &joinReader{c: c, term: term}
  17  }
  18  
  19  type joinReader struct {
  20  	c    *Conn
  21  	term string
  22  	r    io.Reader
  23  }
  24  
  25  func (r *joinReader) Read(p []byte) (int, error) {
  26  	if r.r == nil {
  27  		var err error
  28  		_, r.r, err = r.c.NextReader()
  29  		if err != nil {
  30  			return 0, err
  31  		}
  32  		if r.term != "" {
  33  			r.r = io.MultiReader(r.r, strings.NewReader(r.term))
  34  		}
  35  	}
  36  	n, err := r.r.Read(p)
  37  	if err == io.EOF {
  38  		err = nil
  39  		r.r = nil
  40  	}
  41  	return n, err
  42  }
  43