Conversation
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
approved these changes
Apr 29, 2026
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.
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:
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
stringto 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.