From vmkteam-developer
Generates typed RPC clients from SMD/OpenRPC specs for Go, TypeScript, PHP, Swift, Kotlin, Dart. Use CLI or HTTP handlers for zenrpc servers and cross-platform apps.
npx claudepluginhub vmkteam/claude-plugins --plugin vmkteam-developerThis skill uses the workspace's default tool permissions.
Rpcgen (https://github.com/vmkteam/rpcgen) генерирует типизированные клиенты из SMD-описания zenrpc-сервера.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Rpcgen (https://github.com/vmkteam/rpcgen) генерирует типизированные клиенты из SMD-описания zenrpc-сервера.
Читает SMD (Service Mapping Description) с endpoint'а zenrpc-сервера и генерирует клиентский код.
Зависимость:
tool github.com/vmkteam/rpcgen/v2/cmd/rpcgen
Связанный инструмент: rpcdiff — diff между старым и новым OpenRPC schema (для проверки breaking changes).
| Язык | Метод | Описание |
|---|---|---|
| Go | gen.GoClient(settings) | Go HTTP клиент |
| TypeScript | gen.TSClient(typeMapper) | TS клиент для frontend |
| PHP | gen.PHPClient(settings) | PHP клиент |
| Swift | gen.SwiftClient(settings) | iOS клиент |
| Kotlin | gen.KotlinClient(settings) | Android клиент |
| Dart | gen.DartClient(settings) | Flutter клиент |
| OpenRPC | gen.OpenRPC(name, url) | OpenRPC JSON schema |
# Go клиент
rpcgen -lang go -url http://localhost:8080/rpc/ -o ./pkg/client/service/
# TypeScript клиент
rpcgen -lang typescript -url http://localhost:8080/rpc/ -o ./frontend/src/api/
# Из файла SMD
rpcgen -lang typescript -file smd.json -o ./frontend/src/api/
# Kotlin клиент
rpcgen -lang kotlin -url http://localhost:8080/rpc/ -o ./android/api/
| Флаг | Описание |
|---|---|
-lang | Целевой язык (go, typescript, php, swift, kotlin, dart) |
-url | URL SMD endpoint'а |
-file | Путь к SMD JSON файлу |
-o | Выходной файл/директория |
-package | Имя пакета (Go) |
-namespace | Фильтр namespace'ов |
Генерация клиентов прямо с endpoint'а сервера:
// pkg/app/handlers.go
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))))
Каждый язык поддерживает кастомные type mappers для переопределения типов:
// TypeScript
typeMapper := func(schema rpcgen.Schema, current string) string {
// кастомная логика
return current
}
gen.TSClient(typeMapper)
// Swift — IsProtocol режим генерирует protocol вместо class
gen.SwiftClient(swift.Settings{
Class: "API",
IsProtocol: true, // protocol вместо class
TypeMapper: swiftTypeMapper,
})
// Kotlin — максимум настроек
gen.KotlinClient(kotlin.Settings{
Class: "Api",
PackageAPI: "com.example.api",
IsProtocol: true, // interface вместо data class
TypeMapper: kotlinTypeMapper,
})
# Go клиент другого сервиса
go-client:
rpcgen -lang go -url http://localhost:$(PORT)/rpc/ -o ./pkg/client/$(NAME)/
# TypeScript клиент (frontend)
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
ВАЖНО: После генерации TS-клиентов добавить // @ts-nocheck на третью строку (после /* eslint-disable */), иначе frontend не скомпилируется.
// pkg/client/othersrv/
import othersrv "project/pkg/client/othersrv"
client := othersrv.New("http://othersrv:8080/rpc/")
result, err := client.GetData(ctx, &othersrv.GetDataParams{ID: 42})
Сравнивает два OpenRPC schema и показывает diff:
rpcdiff old-openrpc.json new-openrpc.json
Полезно в CI для проверки обратной совместимости API перед деплоем.
Сгенерированные файлы содержат заголовок // Code generated by rpcgen; DO NOT EDIT.