Nitro + Nanopb bridge for fast protobuf encode/decode on iOS and Android.
- Encodes/decodes protobuf messages in C++ (Nanopb).
- JS inputs/outputs are JSON-like
AnyMapobjects. - Binary payloads are passed as
ArrayBuffer.
npm install react-native-nitro-protobuf react-native-nitro-modules
cd ios && pod install
- Install
protocand the Nanopb generator:
brew install protobuf nanopb
- Put your
.protofiles in your app (example uses./proto). - Add
.optionsfiles to definemax_length,max_size, andmax_count. - Generate C sources + registry:
npx react-native-nitro-protobuf --protoDir ./proto --outDir ./node_modules/react-native-nitro-protobuf/generated
The generator writes:
generated/*.pb.handgenerated/*.pb.cgenerated/nitro_protobuf_registry.cpp
import { NitroProtobuf } from 'react-native-nitro-protobuf'
const encoded = NitroProtobuf.encode('nitro.protobuf.UserProfile', {
id: 1,
name: 'Ada',
scores: [10, 20],
avatar: 'base64...',
active: true,
})
const decoded = NitroProtobuf.decode('nitro.protobuf.UserProfile', encoded)
const names = NitroProtobuf.listMessages()- Only Nanopb static fields are supported. Use
.optionsto set:max_lengthfor stringsmax_sizefor bytesmax_countfor repeated fields
oneofandmapfields are not supported.bytesfields use base64 strings (encode accepts base64 ornumber[]).- 64-bit numbers are returned as strings to avoid precision loss.
See proto/example.proto and proto/example.options for a minimal setup.
npm test
Native integration coverage runs automatically when protoc, protoc-gen-nanopb, and a C++ compiler are available. It skips otherwise.