package websocket
import (
"bytes"
"net"
"sync"
"time"
)
type PreparedMessage struct {
messageType int
data []byte
mu sync .Mutex
frames map [prepareKey ]*preparedFrame
}
type prepareKey struct {
isServer bool
compress bool
compressionLevel int
}
type preparedFrame struct {
once sync .Once
data []byte
}
func NewPreparedMessage (messageType int , data []byte ) (*PreparedMessage , error ) {
pm := &PreparedMessage {
messageType : messageType ,
frames : make (map [prepareKey ]*preparedFrame ),
data : data ,
}
_ , frameData , err := pm .frame (prepareKey {isServer : true , compress : false })
if err != nil {
return nil , err
}
pm .data = frameData [len (frameData )-len (data ):]
return pm , nil
}
func (pm *PreparedMessage ) frame (key prepareKey ) (int , []byte , error ) {
pm .mu .Lock ()
frame , ok := pm .frames [key ]
if !ok {
frame = &preparedFrame {}
pm .frames [key ] = frame
}
pm .mu .Unlock ()
var err error
frame .once .Do (func () {
mu := make (chan struct {}, 1 )
mu <- struct {}{}
var nc prepareConn
c := &Conn {
conn : &nc ,
mu : mu ,
isServer : key .isServer ,
compressionLevel : key .compressionLevel ,
enableWriteCompression : true ,
writeBuf : make ([]byte , defaultWriteBufferSize +maxFrameHeaderSize ),
}
if key .compress {
c .newCompressionWriter = compressNoContextTakeover
}
err = c .WriteMessage (pm .messageType , pm .data )
frame .data = nc .buf .Bytes ()
})
return pm .messageType , frame .data , err
}
type prepareConn struct {
buf bytes .Buffer
net .Conn
}
func (pc *prepareConn ) Write (p []byte ) (int , error ) { return pc .buf .Write (p ) }
func (pc *prepareConn ) SetWriteDeadline (t time .Time ) error { return nil }
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .