rpcgen
Rpcgen — генерация клиентов из SMD/OpenRPC для Go, TypeScript, PHP, Swift, Kotlin, Dart. Используй при подключении клиента к чужому RPC-сервису или публикации собственного SMD/OpenRPC-контракта.
- License 许可
- MIT
- 最近更新
- 2026-11-05
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- rpcgen
- description
- Rpcgen — генерация клиентов из SMD/OpenRPC для Go, TypeScript, PHP, Swift, Kotlin, Dart. Используй при подключении клиента к чужому RPC-сервису или публикации собственного SMD/OpenRPC-контракта.
03 SKILL.md 正文
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 classTypeMapper 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, полезно перед деплоем- Клиент сервиса из того же модуля (CLI, SDK) — тоже
pkg/client/<service>/, не рядом с потребителем
Известные баги (rpcgen ≤ v2.5.7)
Убрать раздел, когда исправят upstream: #42.
- Go-клиент теряет ошибку сервера. Для кодов, описанных в
//zenrpc:<код>, сгенерированный метод заменяет*zenrpc.Errorпакетной переменнойErrSvcMethodNNNс текстом из комментария:messageиdataответа теряются,errors.Asих не достанет. Сравнениеerrors.Is(err, client.ErrSvcMethodNNN)работает. Нужна подсказка изdata(причина, hint) —http.RoundTripperклиента читает тело ответа с ошибкой, сохраняетerror.dataи возвращает тело дальше (образец — hubsrvpkg/cli/client.go).
Маркер
// Code generated by rpcgen; DO NOT EDIT.
04 同仓库更多 Skills
zenrpc
Zenrpc — справочник по JSON-RPC 2.0 серверу для Go. Используй при создании и редактировании RPC-сервисов.
youtrack
YouTrack — задачи через REST API и pcurl. Используй для поиска issues, создания, обновления описаний, смены assignee/stage/приоритета, логирования времени и работы с комментариями.
topsrv
topsrv — метрики, алерты, CVE и HTTP-логи серверов проекта через публичный JSON-RPC API app.topsrv.io. Используй, когда нужна загрузка CPU, памяти или диска хоста, метрики PostgreSQL/nginx/angie агента topsrv (`topsrv_*`), какие алерты горят, уязвимые пакеты на серверах или кто (боты, сети, IP) нагружает сайт.
testing
Testing — используй всегда, когда пишешь или правишь Go-тесты (*_test.go), в том числе по сценариям Given/When/Then из spec: фреймворк как в соседних файлах, префикс TestDB, фабрики pkg/db/test, реальная БД без моков. Также при настройке TestMain/test-short и когда тесты падают в gate, но проходят локально.
solve
Solve — полный цикл решения задачи из YouTrack: preflight → анализ → план → реализация → ревью → коммит. Используй при любой YouTrack-задаче (`/solve PLF-819`); флаг `--fast` сокращает HITL для тривиальных багфиксов.
skills-check
Skills Check — smoke-тесты интеграций из project-index.md. Используй для проверки что pcurl-профили и URL всех data-source скиллов ещё живы.