feat: support string SSE event IDs - #1086
Open
stareezy-1 wants to merge 1 commit into
Open
Conversation
The SSE specification allows any string as the event ID, but the Message struct only accepted a non-zero integer, preventing UUIDs, cursor tokens, composite keys, and the value 0 from being used. Add an IDString field that takes precedence over the now-deprecated numeric ID, and document both types in the generated OpenAPI schema. Line breaks in IDString are stripped so they cannot inject extra SSE fields.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #1040
Problem
The SSE specification describes the event ID as a string (WHATWG: "event ID string"), but
sse.Messageonly models it as a non-zero integer:This prevents spec-valid use cases such as UUIDs, opaque cursor tokens, composite identifiers (e.g.
stream-123:456), or explicitly using0as an event ID — the wire output is onlyid: <int>, and0is silently omitted (if msg.ID > 0).Fix
Add an
IDStringfield alongside the existingID(per the approach confirmed by the maintainers in the issue):IDString, when set, is written to theid:field and takes precedence overID.IDis marked deprecated and used only whenIDStringis empty.idproperty is nowoneOf: [integer, string].IDStringare stripped — they are SSE line terminators and could otherwise inject extra fields into the stream (same hardening already applied toComment).Tests
TestSSE/sse_string_event_idsadded tosse_test.go:IDStringsetid: stream-123:456on the wireIDandIDStringsetIDsetIDString: "0"IDString: "ab\r\ncd"idproperty isoneOfwithintegerandstringAll existing tests continue to pass (
go test -race ./...).