Skip to content

gvproto: fix EventSub1.unknown1 type to string#19

Merged
tulir merged 1 commit intomainfrom
g/desk-26233
Apr 29, 2026
Merged

gvproto: fix EventSub1.unknown1 type to string#19
tulir merged 1 commit intomainfrom
g/desk-26233

Conversation

@iFixRobots
Copy link
Copy Markdown
Contributor

Google changed the webchannel wire format for EventSub1.unknown1. It used to be an empty message; it now carries a microsecond timestamp string. Every webchannel event hits this field, so pblite fails on the first chunk and RunRealtimeChannel returns the error. The connector treats it as transient, retries 5x at 1-min intervals, then surfaces gv-too-many-retries. Bridge is effectively dead — only fetchNewMessagesLoop polling every 15 min delivers anything.

Failed payload from prod:

[2,[[[["9",[["1777416433772457"]]]]]]]

The "1777416433772457" decodes as 2026-04-28T22:47:13.772Z — a microsecond timestamp, not an Empty.

Confirmed across cloud, self-hosted, and bundled local-gvoice deployments across multiple unrelated users — 902 parse failures in one user's 30-minute rageshake window with zero successful parses.

Chose string to match existing convention in this proto (every other timestamp — EventSub2Data.unknownTimestampMillis, unknownTimestampMicros, EventSub3.unknownTimestamp — is string). int64/uint64 would also work since pblite's Int64Kind deserializer accepts string-encoded numbers, but I went with the lower-surprise option. Happy to switch if you'd prefer.

The proto change is one line; webchannel.pb.go is regenerated from it. The field is not referenced in any non-generated code.

Google now sends a microsecond timestamp string at this position in every
webchannel event. The previous Empty schema causes pblite to fail on the
first event of every connection with 'expected untyped array, got string',
which the connector escalates through 5 transient retries to gv-too-many-
retries — leaving the bridge dependent on the 15-minute polling fallback
for incoming messages.

Sample failed payload from prod:

    [2,[[[["9",[["1777416433772457"]]]]]]]

The 1777416433772457 decodes as 2026-04-28T22:47:13.772Z.

string matches the convention used elsewhere in this proto for Google's
microsecond/millisecond timestamps (EventSub2Data.unknownTimestampMillis,
EventSub2Data.unknownTimestampMicros, EventSub3.unknownTimestamp). int64
would also work — pblite's Int64Kind accepts string-encoded numbers — but
I went with string for consistency.
@tulir tulir merged commit f74d898 into main Apr 29, 2026
11 checks passed
@tulir tulir deleted the g/desk-26233 branch April 29, 2026 14:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants