63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { assert, describe, it } from "@effect/vitest"
|
|
import { Effect, Stream } from "effect"
|
|
import * as Schema from "effect/Schema"
|
|
import * as Sse from "effect/unstable/encoding/Sse"
|
|
|
|
describe("Sse", () => {
|
|
it("Event preserves string payloads", () => {
|
|
const decode = Schema.decodeUnknownSync(Sse.Event)
|
|
const encode = Schema.encodeSync(Sse.Event)
|
|
|
|
const event = decode({
|
|
_tag: "Event",
|
|
event: "message",
|
|
id: undefined,
|
|
data: "{\"type\":\"ok\"}"
|
|
})
|
|
|
|
assert.strictEqual(event.data, "{\"type\":\"ok\"}")
|
|
assert.deepStrictEqual(encode(event), {
|
|
_tag: "Event",
|
|
event: "message",
|
|
id: undefined,
|
|
data: "{\"type\":\"ok\"}"
|
|
})
|
|
})
|
|
|
|
it("EventEncoded consumers can explicitly decode json payloads", () => {
|
|
const EventWithJsonPayload = Schema.Struct({
|
|
...Sse.EventEncoded.fields,
|
|
data: Schema.fromJsonString(Schema.Struct({
|
|
type: Schema.String
|
|
}))
|
|
})
|
|
const decode = Schema.decodeUnknownSync(EventWithJsonPayload)
|
|
|
|
const event = decode({
|
|
event: "message",
|
|
id: undefined,
|
|
data: "{\"type\":\"ok\"}"
|
|
})
|
|
|
|
assert.deepStrictEqual(event.data, { type: "ok" })
|
|
})
|
|
|
|
it.effect("decodeDataSchema decodes json payload from SSE stream", () =>
|
|
Effect.gen(function*() {
|
|
const events = yield* Stream.make(
|
|
"event: message\ndata: {\"type\":\"ok\"}\n\n"
|
|
).pipe(
|
|
Stream.pipeThroughChannel(Sse.decodeDataSchema(Schema.Struct({ type: Schema.String }))),
|
|
Stream.runCollect
|
|
)
|
|
|
|
assert.deepStrictEqual([...events], [{
|
|
event: "message",
|
|
id: undefined,
|
|
data: {
|
|
type: "ok"
|
|
}
|
|
}])
|
|
}))
|
|
})
|