fix(grpc): preserve null values in protobuf Struct#578
Conversation
🧪 Code CoverageNo coverage changes. Generated by coverage-comment.yml |
There was a problem hiding this comment.
Code Review
This pull request fixes an issue with protobuf serialization where null values were not correctly preserved. It updates the wrap and unwrap functions in struct.ts and adds a test suite to verify the behavior. Feedback was provided noting that modifying generated files directly is a maintenance risk, and alternative approaches like post-generation scripts or patching were suggested.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
|
Hi @MyPrototypeWhat, thank you for the fix. As you mentioned in the PR description we are working towards releasing stable 1.0.0 version of a2a-js sdk. Can you please rebase your current branch to epic/1.0 and fix it there directly also updating the base branch of this PR? |
4d4ff77 to
fd5501b
Compare
|
Done — I rebased the PR onto the current |
fd5501b to
46d37af
Compare
f447e4e
into
a2aproject:epic/1.0_breaking_changes
Summary
google.protobuf.Structwrappers preserve JavaScriptnullnullasgoogle.protobuf.NullValue.NULL_VALUEnullValuecase back to JavaScriptnullRoot cause
The generated
Value.wrap()implementation assigned the literal JavaScriptnullto a protobuf enum field.@bufbuild/protobufrequires an integer enum value, so gRPC serialization failed withinvalid int32: object.The reverse conversion also returned the enum value
0instead of restoring JSONnull. The newer ts-proto output corrects both directions sogoogle.protobuf.Structfields preserve JSON semantics across the gRPC wire.Impact
Tasks, messages, and other A2A gRPC payloads can now contain valid JSON
nullvalues in metadata or otherStruct-backed fields without crashing or changing them to0after deserialization.Target branch
This PR is rebased onto and directly targets
epic/1.0_breaking_changesfor the stable 1.0.0 SDK work.Generation note
The checked-in 1.0 bindings contain post-generation adjustments. A full
buf generatecurrently rewrites those bindings and adds unrelated generated files, so this PR refreshes only the affectedStructartifact together with the generator pin to keep the fix scoped.Validation
npm test— 66 files, 1,375 tests passednpm run test:edge— 49 files, 1,081 tests passed, 2 skippednpm run build— passednpm run test-build— passednpm run lint:ci— passed in GitHub ActionsFixes #576