kylebrowning/vapor-sse
Server-Sent Events (SSE) for [Vapor](https://github.com/vapor/vapor).
Installation
Add vapor-sse to your Package.swift:
dependencies: [
.package(url: "https://github.com/kylebrowning/vapor-sse.git", from: "1.0.0-beta"),
],
targets: [
.target(name: "App", dependencies: [
.product(name: "SSE", package: "vapor-sse"),
]),
]Usage
Basic
import Vapor
import SSE
app.get("events") { req in
req.sse { sse in
for i in 0..<10 {
try await sse.send("tick \(i)")
try await Task.sleep(for: .seconds(1))
}
}
}Named Events
app.get("events") { req in
req.sse { sse in
try await sse.send(event: "ping", data: "alive")
}
}JSON Data
Send any Encodable value and it's automatically serialized to JSON:
struct Status: Codable, Sendable {
var users: Int
var uptime: Double
}
app.get("status") { req in
req.sse { sse in
try await sse.send(Status(users: 42, uptime: 99.9))
try await sse.send(event: "update", data: Status(users: 43, uptime: 100.0))
}
}A custom JSONEncoder can be passed if needed:
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
app.get("events") { req in
req.sse(encoder: encoder) { sse in
try await sse.send(MyPayload())
}
}Full Control
Use ServerSentEvent directly for id, retry, and comments:
app.get("events") { req in
req.sse { sse in
try await sse.send(ServerSentEvent(
id: "1",
event: "message",
data: "{\"hello\": \"world\"}",
retry: 5000
))
try await sse.sendComment("keep-alive")
}
}Reconnect Support
Access the client's Last-Event-ID header on reconnect:
app.get("events") { req in
let lastID = req.lastEventID
return req.sse { sse in
// Resume from lastID...
}
}Static Factory
You can also use Response.sse directly:
app.get("events") { req in
Response.sse { sse in
try await sse.send("hello")
}
}API
| Type | Description | |------|-------------| | ServerSentEvent | SSE event model with id, event, data, retry, comment | | SSEContext | Handle for sending events over an active connection | | Request.sse(:) | Creates an SSE response from a route handler | | Response.sse(:) | Static factory for SSE responses | | Request.lastEventID | The Last-Event-ID header value, if present |
License
MIT. See LICENSE.
Package Metadata
Repository: kylebrowning/vapor-sse
Default branch: main
README: README.md