///|
test "parse an event stream split at arbitrary points" {
let parser = @sse.SseParser::new()
let events = parser.feed(b"retry: 1000\nid: 1\nevent: delta\ndata: hel")
assert_eq(events, [])
let events = parser.feed(b"lo\r\n\r\ndata: [DONE]\n\n")
assert_eq(events.map(e => (e.event, e.data)), [
("delta", "hello"),
("message", "[DONE]"),
])
assert_eq(parser.finish(), [])
assert_eq(parser.last_event_id(), Some("1"))
assert_eq(parser.reconnection_ms(), Some(1000))
}
///|
test "encode an event" {
let event : @sse.SseEvent = {
event: "delta",
data: "two\nlines",
id: Some("2"),
retry: None,
}
assert_eq(
@sse.encode(event),
b"event: delta\nid: 2\ndata: two\ndata: lines\n\n",
)
}test {
let event = @sse.SseEvent::new("hello", id="1")
assert_eq(event.event, "message")
assert_eq(@sse.encode(event), b"id: 1\ndata: hello\n\n")
}pub struct SseParser {
// private fields
}test {
let parser = @sse.SseParser::new()
assert_eq(parser.feed(b"id: 7\n\nid: 8\ndata: unfinished\n"), [])
assert_eq(parser.finish(), [])
assert_eq(parser.last_event_id(), Some("7"))
}test {
let parser = @sse.SseParser::new()
assert_eq(parser.feed(b"data: hello\n\n")[0].data, "hello")
assert_eq(parser.finish(), [])
let _ = @sse.SseParser::new(max_event_bytes=1_048_576)
}test {
let parser = @sse.SseParser::new()
assert_eq(parser.feed(b"retry: 2500\n\n"), [])
assert_eq(parser.reconnection_ms(), Some(2500))
}pub struct SseReader {
// private fields
}test {
let d = @driver.Driver::new()
let source = @sim.Feed::bytes(d, [b"data: hello\n\n"])
let reader = @sse.SseReader::new(source)
let events = []
d.run(() => reader.each(event => events.push(event.data)))
assert_eq(events, ["hello"])
assert_eq(source.closes(), 1)
}Install
Download zipHTTP for MoonBit in the style of sttp, on top of gaato/http: a client with retries, rate limits and deadlines, server-sent events, multipart, cookies, endpoints and OpenAPI. Runs on every backend.