feat: complete OCI registry implementation with docker push/pull support
A lightweight OCI (Open Container Initiative) registry implementation written in Go.
This commit is contained in:
75
pkg/resp/sse.go
Normal file
75
pkg/resp/sse.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package resp
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v3"
|
||||
)
|
||||
|
||||
type SSEManager struct {
|
||||
c fiber.Ctx
|
||||
event string
|
||||
ch chan string
|
||||
id int64
|
||||
}
|
||||
|
||||
func (m *SSEManager) Send(msg string) {
|
||||
m.ch <- msg
|
||||
}
|
||||
|
||||
func (m *SSEManager) JSON(data any) {
|
||||
bs, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
m.ch <- err.Error()
|
||||
return
|
||||
}
|
||||
|
||||
m.ch <- string(bs)
|
||||
}
|
||||
|
||||
func (m *SSEManager) Writer() func(w *bufio.Writer) {
|
||||
return func(w *bufio.Writer) {
|
||||
for msg := range m.ch {
|
||||
fmt.Fprintf(w, "event: %s\nid: %d\ntimestamp: %d\ndata: %s\n\n", m.event, m.id, time.Now().UnixMilli(), msg)
|
||||
w.Flush()
|
||||
m.id++
|
||||
}
|
||||
w.Flush()
|
||||
}
|
||||
}
|
||||
|
||||
func (m *SSEManager) Close() {
|
||||
close(m.ch)
|
||||
}
|
||||
|
||||
// SSE create a new SSEManager
|
||||
// example:
|
||||
//
|
||||
// func someHandler(c fiber.Ctx) error {
|
||||
// m := resp.SSE(c, "test")
|
||||
// go func() {
|
||||
// defer m.Close()
|
||||
// for i := range 10 {
|
||||
// m.Send("test" + strconv.Itoa(i))
|
||||
// time.Sleep(1 * time.Second)
|
||||
// }
|
||||
// }()
|
||||
//
|
||||
// return c.SendStreamWriter(m.Writer())
|
||||
// }
|
||||
func SSE(c fiber.Ctx, event string) *SSEManager {
|
||||
c.Set("Content-Type", "text/event-stream")
|
||||
c.Set("Cache-Control", "no-cache")
|
||||
c.Set("Connection", "keep-alive")
|
||||
c.Set("Transfer-Encoding", "chunked")
|
||||
|
||||
return &SSEManager{
|
||||
c: c,
|
||||
event: event,
|
||||
id: 0,
|
||||
ch: make(chan string, 1),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user