Migrate the generated TypeScript bindings from ts-proto to protobuf-es v2
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 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分
- マージ済み PR(30日)
- 137
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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 日以内に返信