| name | rpcgen |
| description | Rpcgen — генерация клиентов из SMD/OpenRPC для Go, TypeScript, PHP, Swift, Kotlin, Dart. Используй при подключении клиента к чужому RPC-сервису или публикации собственного SMD/OpenRPC-контракта. |
Rpcgen
Upstream: https://github.com/vmkteam/rpcgen
Генерирует типизированные клиенты из SMD (Service Mapping Description) zenrpc-сервера. Связанный инструмент — rpcdiff (diff OpenRPC schema для breaking-changes в CI).
Tool-зависимость:
tool github.com/vmkteam/rpcgen/v2/cmd/rpcgen
Языки и API
gen.GoClient, gen.TSClient, gen.PHPClient, gen.SwiftClient, gen.KotlinClient, gen.DartClient, gen.OpenRPC(name, url).
CLI — через -lang <go|typescript|php|swift|kotlin|dart>, источник -url (SMD endpoint) или -file smd.json, вывод -o. Полный список флагов — rpcgen --help.
vmkteam-паттерн: on-the-fly handler
Сервер раздаёт клиенты с собственных endpoint'ов через rpcgen.Handler:
a.echo.Any("/v1/rpc/api.ts", appkit.EchoHandlerFunc(rpcgen.Handler(gen.TSClient(typeMapper))))
a.echo.Any("/v1/rpc/api.go", appkit.EchoHandlerFunc(rpcgen.Handler(gen.GoClient(golang.Settings{Package: appName}))))
a.echo.Any("/v1/rpc/api.swift", appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{Class: "API", TypeMapper: swiftTypeMapper}))))
a.echo.Any("/v1/rpc/networking.swift", appkit.EchoHandlerFunc(rpcgen.Handler(gen.SwiftClient(swift.Settings{IsProtocol: true, TypeMapper: swiftTypeMapper}))))
a.echo.Any("/v1/rpc/api.kt", appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: "Api", PackageAPI: "com.example.api", TypeMapper: kotlinTypeMapper}))))
a.echo.Any("/v1/rpc/networking.kt", appkit.EchoHandlerFunc(rpcgen.Handler(gen.KotlinClient(kotlin.Settings{Class: "Api", PackageAPI: "com.example.api", IsProtocol: true}))))
a.echo.Any("/v1/rpc/openrpc.json", appkit.EchoHandlerFunc(rpcgen.Handler(gen.OpenRPC("service", rpcUrl))))
IsProtocol: true для Swift/Kotlin → protocol/interface вместо class/data class
TypeMapper func(schema, current) string — переопределение типов per-язык
Makefile-цели (vmkteam-конвенция)
go-client:
rpcgen -lang go -url http://localhost:$(PORT)/rpc/ -o ./pkg/client/$(NAME)/
type-script-client: generate
rpcgen -lang typescript -url http://localhost:$(PORT)/rpc/ -o ../frontend/src/api/factory.generated.ts
rpcgen -lang typescript -url http://localhost:$(PORT)/vt/ -o ../frontend/src/api/vt.generated.ts
Gotchas
- TS: после генерации добавить
// @ts-nocheck на 3-ю строку (после /* eslint-disable */), иначе frontend не собирается
- Go-клиенты импортируются как
project/pkg/client/<service>, инициализация svc.New("http://host/rpc/")
rpcdiff old.json new.json — сравнение OpenRPC schema, полезно перед деплоем
Маркер
// Code generated by rpcgen; DO NOT EDIT.