gofr-dev/gofr

View on GitHub
docs/advanced-guide/websocket/page.md

Summary

Maintainability
Test Coverage
# Websockets

WebSockets provide a full-duplex communication channel over a single, long-lived connection, making them ideal for 
real-time applications like chat, notifications, and live updates. GoFr provides a convenient way to integrate websockets
into your application. By leveraging GoFr's WebSocket support and customizable upgrader options,
you can efficiently manage real-time communication in your applications.

## Usage in GoFr

Here is a simple example to set up a WebSocket server in GoFr:

```go
package main

import (
    "gofr.dev/pkg/gofr"
)

func main() {
    app := gofr.New()

    app.WebSocket("/ws", WSHandler)

    app.Run()
}

func WSHandler(ctx *gofr.Context) (interface{}, error) {
    var message string

    err := ctx.Bind(&message)
    if err != nil {
        ctx.Logger.Errorf("Error binding message: %v", err)
        return nil, err
    }

    ctx.Logger.Infof("Received message: %s", message)

    return message, nil
}
```

## Configuration Options
GoFr allows you to customize the WebSocket upgrader with several options. You can set these options using the 
`websocket.NewWSUpgrader` function. Here is the list of options you can apply to your websocket upgrader using GoFr.

- `HandshakeTimeout (WithHandshakeTimeout)`: Sets the handshake timeout.
- `ReadBufferSize (WithReadBufferSize)`: Sets the size of the read buffer.
- `WriteBufferSize (WithWriteBufferSize)`: Sets the size of the write buffer.
- `Subprotocols (WithSubprotocols)`: Sets the supported sub-protocols.
- `Error (WithError)`:  Sets a custom error handler.
- `CheckOrigin (WithCheckOrigin)`: Sets a custom origin check function.
- `Compression (WithCompression)`:  Enables compression.

## Example:
You can configure the Upgrader by creating a chain of option functions provided by GoFr.

```go
package main

import (
    "time"
    "gofr.dev/pkg/gofr"
    "gofr.dev/pkg/gofr/websocket"
)

func main() {
    app := gofr.New()

    wsUpgrader := websocket.NewWSUpgrader(
        websocket.WithHandshakeTimeout(5 * time.Second), // Set handshake timeout
        websocket.WithReadBufferSize(2048),              // Set read buffer size
        websocket.WithWriteBufferSize(2048),             // Set write buffer size
        websocket.WithSubprotocols("chat", "binary"),    // Specify subprotocols
        websocket.WithCompression(),                     // Enable compression
    )

    app.OverrideWebSocketUpgrader(wsUpgrader)

    app.WebSocket("/ws", WSHandler)

    app.Run()
}

func WSHandler(ctx *gofr.Context) (interface{}, error) {
    var message string

    err := ctx.Bind(&message)
    if err != nil {
        ctx.Logger.Errorf("Error binding message: %v", err)
        return nil, err
    }

    ctx.Logger.Infof("Received message: %s", message)

    err = ctx.WriteMessageToSocket("Hello! GoFr")
    if err != nil {
        return nil, err
    }

    return message, nil
}
```
> #### Check out the example on how to read/write through a WebSocket in GoFr: [Visit GitHub](https://github.com/gofr-dev/gofr/blob/main/examples/using-web-socket/main.go)