websockets

package
v1.22.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 8, 2021 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package websockets is a wrapper for gofiber websocket.

Example:

  h.fiber.Get("/ws", websocket.New(func(c *websocket.Conn) {
	// get locals to use
	myLocal := c.Locals("myLocal")
	if myLocal == nil {
		log.Println("No myLocal")
		return
	}
	log.Println("Websocket opened")

	socketClosed := make(chan bool)
	sourceDone := make(chan bool)

	// use or implement custom buffer so non blocking
	// see videosource.RingBufferProcessedImage for an example which allows for drops
	// some services must guarantee msgs sent, use appropriate buffer type
	ringBuffer := customringbuffer.NewRingBuffer(1)
	stuffChan := h.myEngine.Subscribe("stuff")
	go func() {
		for cur := range stuffChan {
			popped := ringBuffer.Push(cur)
			if popped.IsValid() {
				log.Println("Dropped stuff at websocket, but that's expected/ok")
			}
			popped.Cleanup()
		}
		close(sourceDone)
	}()

	receive := func(msgType int, data []byte) {
		log.Println("Read Func called")
	}
	send := func(c *websocket.Conn) {
		writeOut := func() (ok bool) {
			stuff := ringBuffer.Pop()
			if !stuff.IsValid() {
				stuff.Cleanup()
				return true
			}
			var stuffArray []byte
			// serialize stuff into stuffAray
			stuff.Cleanup()
			err := c.WriteMessage(websocket.BinaryMessage, stuffArray)
			if err != nil {
				// socket closed
				h.myEngine.Unsubscribe("stuff")
				return false
			}
			return true
		}
	Loop:
		for {
			select {
			case <-socketClosed:
				h.myEngine.Unsubscribe("stuff")
				break Loop
			case <-sourceDone:
				if ringBuffer.Len() == 0 {
					break Loop
				}
				for ringBuffer.Len() != 0 {
					if !writeOut() {
						break Loop
					}
				}
			case _, ok := <-ringBuffer.Ready():
				if !ok {
					break Loop
				}
				if !writeOut() {
					break Loop
				}
			}
		}
	}
	cleanup := func() {
		for ringBuffer.Len() > 0 {
			stuff := ringBuffer.Pop()
			stuff.Cleanup()
		}
		log.Println("Websocket closed")
	}

	websockets.Run(c, socketClosed, receive, send, cleanup)
  }))

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Run

func Run(c *websocket.Conn, socketClosed chan bool, receive func(int, []byte), send func(*websocket.Conn), cleanup func())

Run is a wrapper for gofiber websocket

socketClosed - passes out to callers that the socket has closed
receive - do not block as it will continuously run until the websocket is closed
send - push out msgs and return when server is done with the websocket
cleanup - will be called when all goroutines are finished

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL