Migrate the generated TypeScript bindings from ts-proto to protobuf-es v2
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 30/100
- Issue 类型
- 重构
- 描述清晰度
- 基本清楚
- 活跃度
- 活跃
- 技术栈
- grpc, typescript
调研方向
Start in app/controlplane/api/buf.gen.yaml, which holds the ts-proto plugin entry, and then run make api to see the current output in gen/frontend. The work is to swap the generator to buf.build/bufbuild/es with target=ts and include_imports: true, remove the old ts-proto files, and regenerate. Done means the acceptance criteria hold: no @improbable-eng/grpc-web, browser-headers or protobufjs imports, and no diff from make api in CI. The consumer migration and breaking-change plan still need a maintainer decision.
由索引模型根据 Issue 内容生成。
描述
Summary
Migrate the generated TypeScript bindings of the control plane API from ts-proto to protobuf-es v2 (@bufbuild/protobuf v2). Use Connect-ES v2 (@connectrpc/connect v2) for the clients.
Current state
app/controlplane/api/buf.gen.yaml generates the TypeScript bindings with ts-proto:
- remote: buf.build/community/stephenh-ts-proto:v1.151.1
out: ./gen/frontend
opt:
- outputClientImpl=grpc-web
- esModuleInterop=true
- useOptionals=messages
- The output goes to
app/controlplane/api/gen/frontend. - The output contains the control plane, attestation, workflow contract,
errorsandjsonfilterprotos. - The output also contains third-party imported protos. Examples:
protoc-gen-openapiv2/options/annotations.ts,protoc-gen-openapiv2/options/openapiv2.ts,buf/validate/...andgoogle/api/.... - The generated code depends on
@improbable-eng/grpc-web,browser-headersandprotobufjs/minimal.
This is the only buf.gen.yaml in the repository that emits TypeScript. The other files (app/artifact-cas/api, pkg/attestation/crafter/api, pkg/credentials/api, the plugin SDK and the conf packages) emit Go only. So the scope is this one file and its output folder.
Motivation
- ts-proto with the improbable-eng grpc-web transport is in maintenance mode.
- protobuf-es v2 and Connect-ES v2 are the stack that Buf maintains. They have a smaller runtime, first-class ESM and TypeScript support, and they pass the Protobuf conformance tests.
- Some downstream consumers already generate their own protos with protobuf-es v2 into the same source tree. Today they get two different generated files for the same imported proto. For example,
protoc-gen-openapiv2/options/annotations.tsfrom ts-proto sits next toannotations_pb.tsfrom protobuf-es. The consumers must filter files out when they sync the bindings. One generator for all bindings removes this problem.
Proposed implementation
1. Replace the generator plugin
protobuf-es v2 also generates the service descriptors. A separate connect-es plugin is not necessary.
- remote: buf.build/bufbuild/es:v2.16.0
out: ./gen/frontend
opt: target=ts
include_imports: true
include_imports: true generates the imported dependencies (openapiv2 options, buf/validate, google/api) as *_pb.ts files. Consumers then get a self-contained set of files.
2. Changes in the generated code
- File names change to
<name>_pb.ts. - Messages are plain types. Create them with
create(FooSchema, {...}). - Serialize with
toBinary,fromBinary,toJsonandfromJsonfrom@bufbuild/protobuf. - Enums are TypeScript enums.
- Oneofs use the
{ case, value }form. - Use
@bufbuild/protobuf/wktforTimestamp(timestampDate,timestampFromDate).
3. Clients
- Create clients with
createClient(Service, transport)from@connectrpc/connectv2. - Use
createGrpcWebTransportfrom@connectrpc/connect-webv2. The transport stays gRPC-web, so the server needs no change. - Remove the
@improbable-eng/grpc-web,browser-headersandprotobufjsdependencies.
import { createClient } from "@connectrpc/connect";
import { createGrpcWebTransport } from "@connectrpc/connect-web";
import { WorkflowService } from "./controlplane/v1/workflow_pb";
const transport = createGrpcWebTransport({ baseUrl: "https://cp.example.com" });
const client = createClient(WorkflowService, transport);
4. Transition
- This is a breaking change for every consumer of
gen/frontend. - If a transition period is necessary, emit the protobuf-es output to a new folder first (for example
gen/frontend-es). Keep the ts-proto output ingen/frontenduntil the consumers migrate. Then remove the ts-proto plugin.
5. Regeneration and CI
- Run
make apifrom the repository root (it runsbuf generateinapp/controlplane/api) and commit the new output. - Remove the old ts-proto files from the output folder.
buf generatedoes not delete stale files. - The
test.ymlworkflow runsmake apiand fails if the tree is dirty. The regenerated files must be in the same pull request.
Acceptance criteria
app/controlplane/api/buf.gen.yamlusesbuf.build/bufbuild/esv2 withtarget=tsandinclude_imports: true.- The generated output has no imports of
@improbable-eng/grpc-web,browser-headersorprotobufjs. - The generated output contains the imported third-party protos as
*_pb.tsfiles. make apiproduces no diff in CI.- The release notes state the breaking change for consumers of
gen/frontend.
🤖 Posted by Maximus bot (Claude Code) on behalf of @migmartri
- 主要语言
- Go
- 星标
- 582
- 派生
- 61
- 平均合并
- 12 小时 47 分钟
- 30 天内合并 PR
- 137
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
chainloop-dev/chainloop 的其他 Issue
-
feature-parity trace-provider
难度 2/5 1-3 小时 新手友好度 70/100
chainloop-dev/chainloop#3802 ·
维护者通常 1 天内回复
-
bug trace-provider
难度 4/5 3-5 天 新手友好度 48/100
chainloop-dev/chainloop#3803 ·
维护者通常 1 天内回复
-
feat(trace): support GitHub Copilot (CLI and VS Code) in Chainloop Trace可能已有人在做 @migmartri 今天认领。 未关闭Feature spec trace-provider
chainloop-dev/chainloop#3800 · 1 条评论 · 已指派 1 人 ·
维护者通常 1 天内回复
-
Allow enabling policy enforcement at the workflow contract level可能已有人在做 @migmartri 于 10 天前认领。 未关闭component/backend new-policy spec
chainloop-dev/chainloop#3762 · 1 条评论 · 已指派 1 人 ·
维护者通常 1 天内回复
-
chainloop component/CLI performance trace-provider
难度 4/5 3-5 天 新手友好度 62/100
chainloop-dev/chainloop#3756 ·
维护者通常 1 天内回复
查看 chainloop-dev/chainloop 的全部 Issue
相似的 Issue
-
GitHub webhook is not subscribed to release events, so `event: release` never triggers可能已有人在做 @qsun 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
woodpecker-ci/woodpecker#7542 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 74/100
zilliztech/milvus-backup#1386 ·
维护者通常 1 天内回复
-
Pipelined flush no longer observes kill signals after #2042: flush backoffer is built with nil vars未关闭
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
model:sonnet runtime:claude security size:S
难度 2/5 1-3 小时 新手友好度 78/100
FootprintAI/Containarium#3624 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 86/100
维护者通常 1 天内回复