Skip to content

Commit 1c9055d

Browse files
committed
Docs: Added a longish section on the correct use of the toolset to README
1 parent 99667c8 commit 1c9055d

File tree

1 file changed

+73
-16
lines changed

1 file changed

+73
-16
lines changed

README.md

+73-16
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,63 @@ In case of doubt you can just use the full library.
8787
Examples
8888
--------
8989

90+
### Understanding the toolset
91+
92+
For optimal performance, protobuf.js tries to avoid redundant assertions. Instead, it provides multiple methods, each doing just one thing.
93+
94+
* **Message.verify**(message: *Object*): *?string*<br />
95+
explicitly performs verification prior to encoding / converting a plain object (i.e. where data comes from user input). Instead of throwing, it returns the error message as a string, if any.
96+
97+
```js
98+
var payload = "invalid (not an object)";
99+
var err = AwesomeMessage.verify(payload);
100+
if (err)
101+
throw Error(err);
102+
```
103+
104+
* **Message.encode**(message: *Message|Object*[, writer: *Writer*]): *Writer*<br />
105+
is a message specific encoder expecting a valid message. Hence, if your data is already known to be valid, you can skip verification and just call the encoder. It accepts both a runtime message (recommended where messages are reused, i.e. use `.fromObject`) or a valid plain object.
106+
107+
```js
108+
var buffer = AwesomeMessage.encode(message).finish();
109+
```
110+
111+
* **Message.decode**(reader: *Reader|Uint8Array*): *Message*<br />
112+
is a message specific decoder expecting a valid buffer. If required fields are missing, it throws a `protobuf.util.ProtocolError` with an `instance` property set to the so far decoded message - otherwise an `Error`. The result is a runtime message.
113+
114+
```js
115+
try {
116+
var decodedMessage = AwesomeMessage.decode(buffer);
117+
} catch (e) {
118+
if (e instanceof protobuf.util.ProtocolError) {
119+
// e.instance holds the so far decoded message
120+
}
121+
}
122+
```
123+
124+
* **Message.create**(properties: *Object*): *Message*<br />
125+
quickly creates a new runtime message from known to be valid properties without any conversion being performed.
126+
127+
```js
128+
var message = AwesomeMessage.create({ awesomeField: "AwesomeString" });
129+
```
130+
131+
* **Message.fromObject**(object: *Object*): *Message*<br />
132+
converts any plain object to a runtime message. Tries to convert whatever is specified (use `.verify` before if necessary).
133+
134+
```js
135+
var message = AwesomeMessage.fromObject({ awesomeField: 42 });
136+
// converts awesomeField to a string
137+
```
138+
139+
* **Message.toObject**(message: *Message*, options: *ConversionOptions*): *Object*<br />
140+
can be used to convert a runtime message to a plain object. See: [ConversionOptions](http://dcode.io/protobuf.js/global.html#ConversionOptions)
141+
142+
```js
143+
var object = AwesomeMessage.toObject(message, { enums: String, longs: String, bytes: String, defaults: true });
144+
// converts enums, longs and bytes to their string representation and includes default values
145+
```
146+
90147
### Using .proto files
91148

92149
It's possible to load existing .proto files using the full library, which parses and compiles the definitions to ready to use (reflection-based) message classes:
@@ -109,37 +166,37 @@ protobuf.load("awesome.proto", function(err, root) {
109166
// Obtain a message type
110167
var AwesomeMessage = root.lookup("awesomepackage.AwesomeMessage");
111168

112-
// Create a new message
113-
var message = AwesomeMessage.create({ awesomeField: "AwesomeString" });
169+
// Exemplary payload
170+
var payload = { awesomeField: "AwesomeString" };
114171

115-
// Verify the message if necessary (i.e. when possibly incomplete or invalid)
116-
var errMsg = AwesomeMessage.verify(message);
172+
// Verify the payload if necessary (i.e. when possibly incomplete or invalid)
173+
var errMsg = AwesomeMessage.verify(payload);
117174
if (errMsg)
118175
throw Error(errMsg);
119176

177+
// Create a new message
178+
var message = AwesomeMessage.fromObject(payload);
179+
120180
// Encode a message to an Uint8Array (browser) or Buffer (node)
121181
var buffer = AwesomeMessage.encode(message).finish();
122182
// ... do something with buffer
123183

124-
// Or, encode a plain object
125-
var buffer = AwesomeMessage.encode({ awesomeField: "AwesomeString" }).finish();
126-
// ... do something with buffer
127-
128184
// Decode an Uint8Array (browser) or Buffer (node) to a message
129185
var message = AwesomeMessage.decode(buffer);
130186
// ... do something with message
131187

132188
// If your application uses length-delimited buffers, there is also encodeDelimited and decodeDelimited.
189+
190+
// Maybe convert the message back to a plain object
191+
var object = AwesomeMessage.toObject(message, {
192+
longs: String,
193+
enums: String,
194+
bytes: String,
195+
// see ConversionOptions
196+
});
133197
});
134198
```
135199

136-
**Note:** To avoid redundant assertions where messages are already known to be valid, there is a separate method for encoding and verification.
137-
138-
* `Message.verify` can be used to explicitly perform verification prior to encoding any object where necessary. Instead of throwing, it returns the error message, if any.
139-
* `Message.encode` does not implicitly verify a message but tries to encode whatever is specified, possibly resulting in a runtime error being thrown somewhere down the road.
140-
* `Message.decode` throws if a buffer is invalid or missing required fields (a `protobuf.util.ProtocolError` with an `instance` property set to the so far decoded message in the latter case) and doesn't require calling `Message.verify` afterwards.
141-
* `Message.fromObject` and `Message.toObject` safely translate between runtime messages and plain JavaScript objects.
142-
143200
Additionally, promise syntax can be used by omitting the callback, if preferred:
144201

145202
```js
@@ -230,7 +287,7 @@ protobuf.Class.create(root.lookup("awesomepackage.AwesomeMessage") /* or use ref
230287
AwesomeMessage.customStaticMethod = function() { ... };
231288
AwesomeMessage.prototype.customInstanceMethod = function() { ... };
232289

233-
// Continue at "Create a message" above (you can also use the constructor directly)
290+
// Continue at "Create a message"
234291
```
235292

236293
Afterwards, decoded messages of this type are `instanceof AwesomeMessage`.

0 commit comments

Comments
 (0)