Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/olahol/melody
:notes: Minimalist websocket framework for Go
https://github.com/olahol/melody
example framework go golang minimalist websocket websocket-framework
Last synced: 5 days ago
JSON representation
:notes: Minimalist websocket framework for Go
- Host: GitHub
- URL: https://github.com/olahol/melody
- Owner: olahol
- License: bsd-2-clause
- Created: 2015-05-13T20:38:32.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-07-25T18:08:25.000Z (6 months ago)
- Last Synced: 2024-12-30T18:12:34.604Z (12 days ago)
- Topics: example, framework, go, golang, minimalist, websocket, websocket-framework
- Language: Go
- Homepage:
- Size: 987 KB
- Stars: 3,802
- Watchers: 64
- Forks: 368
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go - melody - Minimalist framework for dealing with websocket sessions, includes broadcasting and automatic ping/pong handling. (Messaging / Search and Analytic Databases)
- zero-alloc-awesome-go - melody - Minimalist framework for dealing with websocket sessions, includes broadcasting and automatic ping/pong handling. (Messaging / Search and Analytic Databases)
- awesome-trevor - Melody - minimalist websocket framework for Go (Programming / Golang)
- go-awesome - melody - WebSocket service framework (Open source library / WebSocket)
- awesome-go - melody - Minimalist framework for dealing with websocket sessions, includes broadcasting and automatic ping/pong handling. Stars:`3.8K`. (Messaging / Search and Analytic Databases)
- awesome-golang-repositories - melody
- awesome-go - melody - Minimalist websocket framework for Go - ★ 1187 (Messaging)
- awesome-go-extra - melody - 05-13T20:38:32Z|2022-03-09T11:29:28Z| (Messaging / Advanced Console UIs)
- awesome-gin - olahol/melody
- awesome-go-zh - melody
README
# melody
![Build Status](https://github.com/olahol/melody/actions/workflows/test.yml/badge.svg)
[![Codecov](https://img.shields.io/codecov/c/github/olahol/melody)](https://app.codecov.io/github/olahol/melody)
[![Go Report Card](https://goreportcard.com/badge/github.com/olahol/melody)](https://goreportcard.com/report/github.com/olahol/melody)
[![GoDoc](https://godoc.org/github.com/olahol/melody?status.svg)](https://godoc.org/github.com/olahol/melody)> :notes: Minimalist websocket framework for Go.
Melody is websocket framework based on [github.com/gorilla/websocket](https://github.com/gorilla/websocket)
that abstracts away the tedious parts of handling websockets. It gets out of
your way so you can write real-time apps. Features include:* [x] Clear and easy interface similar to `net/http` or Gin.
* [x] A simple way to broadcast to all or selected connected sessions.
* [x] Message buffers making concurrent writing safe.
* [x] Automatic handling of sending ping/pong heartbeats that timeout broken sessions.
* [x] Store data on sessions.## Install
```bash
go get github.com/olahol/melody
```## [Example: chat](https://github.com/olahol/melody/tree/master/examples/chat)
[![Chat](https://cdn.rawgit.com/olahol/melody/master/examples/chat/demo.gif "Demo")](https://github.com/olahol/melody/tree/master/examples/chat)
```go
package mainimport (
"net/http""github.com/olahol/melody"
)func main() {
m := melody.New()http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "index.html")
})http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
m.HandleRequest(w, r)
})m.HandleMessage(func(s *melody.Session, msg []byte) {
m.Broadcast(msg)
})http.ListenAndServe(":5000", nil)
}
```## [Example: gophers](https://github.com/olahol/melody/tree/master/examples/gophers)
[![Gophers](https://cdn.rawgit.com/olahol/melody/master/examples/gophers/demo.gif "Demo")](https://github.com/olahol/melody/tree/master/examples/gophers)
```go
package mainimport (
"fmt"
"net/http"
"sync/atomic""github.com/olahol/melody"
)var idCounter atomic.Int64
func main() {
m := melody.New()http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "index.html")
})http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
m.HandleRequest(w, r)
})m.HandleConnect(func(s *melody.Session) {
id := idCounter.Add(1)s.Set("id", id)
s.Write([]byte(fmt.Sprintf("iam %d", id)))
})m.HandleDisconnect(func(s *melody.Session) {
if id, ok := s.Get("id"); ok {
m.BroadcastOthers([]byte(fmt.Sprintf("dis %d", id)), s)
}
})m.HandleMessage(func(s *melody.Session, msg []byte) {
if id, ok := s.Get("id"); ok {
m.BroadcastOthers([]byte(fmt.Sprintf("set %d %s", id, msg)), s)
}
})http.ListenAndServe(":5000", nil)
}
```### [More examples](https://github.com/olahol/melody/tree/master/examples)
## [Documentation](https://godoc.org/github.com/olahol/melody)
## Contributors
## FAQ
If you are getting a `403` when trying to connect to your websocket you can [change allow all origin hosts](http://godoc.org/github.com/gorilla/websocket#hdr-Origin_Considerations):
```go
m := melody.New()
m.Upgrader.CheckOrigin = func(r *http.Request) bool { return true }
```