Skip to content

Instantly share code, notes, and snippets.

@vkosh
Last active January 31, 2018 17:05
Show Gist options
  • Save vkosh/d8bc50fd17cad8e51e9c2b8725655017 to your computer and use it in GitHub Desktop.
Save vkosh/d8bc50fd17cad8e51e9c2b8725655017 to your computer and use it in GitHub Desktop.
protobuf wrong enum encoding generation
enum FOO {
A = 1;
B = 2;
}
message Message {
optional bool bool_value = 1;
optional float float_value = 2;
optional int32 int_value = 3;
optional string string_value = 4;
optional FOO foo = 5;
}
// This file is auto generated by the protocol-buffers cli tool
/* eslint-disable quotes */
/* eslint-disable indent */
/* eslint-disable no-redeclare */
// Remember to `npm install --save protocol-buffers-encodings`
var encodings = require('protocol-buffers-encodings')
var varint = encodings.varint
var skip = encodings.skip
var FOO = exports.FOO = {
"A": 1,
"B": 2
}
var Message = exports.Message = {
buffer: true,
encodingLength: null,
encode: null,
decode: null
}
defineMessage()
function defineMessage () {
var enc = [
encodings.bool,
encodings.float,
encodings.int32,
encodings.string,
undefined
]
Message.encodingLength = encodingLength
Message.encode = encode
Message.decode = decode
function encodingLength (obj) {
var length = 0
if (defined(obj.bool_value)) {
var len = enc[0].encodingLength(obj.bool_value)
length += 1 + len
}
if (defined(obj.float_value)) {
var len = enc[1].encodingLength(obj.float_value)
length += 1 + len
}
if (defined(obj.int_value)) {
var len = enc[2].encodingLength(obj.int_value)
length += 1 + len
}
if (defined(obj.string_value)) {
var len = enc[3].encodingLength(obj.string_value)
length += 1 + len
}
if (defined(obj.foo)) {
var len = enc[4].encodingLength(obj.foo)
length += 1 + len
}
return length
}
function encode (obj, buf, offset) {
if (!offset) offset = 0
if (!buf) buf = Buffer.allocUnsafe(encodingLength(obj))
var oldOffset = offset
if (defined(obj.bool_value)) {
buf[offset++] = 8
enc[0].encode(obj.bool_value, buf, offset)
offset += enc[0].encode.bytes
}
if (defined(obj.float_value)) {
buf[offset++] = 21
enc[1].encode(obj.float_value, buf, offset)
offset += enc[1].encode.bytes
}
if (defined(obj.int_value)) {
buf[offset++] = 24
enc[2].encode(obj.int_value, buf, offset)
offset += enc[2].encode.bytes
}
if (defined(obj.string_value)) {
buf[offset++] = 34
enc[3].encode(obj.string_value, buf, offset)
offset += enc[3].encode.bytes
}
if (defined(obj.foo)) {
buf[offset++] = 40
enc[4].encode(obj.foo, buf, offset)
offset += enc[4].encode.bytes
}
encode.bytes = offset - oldOffset
return buf
}
function decode (buf, offset, end) {
if (!offset) offset = 0
if (!end) end = buf.length
if (!(end <= buf.length && offset <= buf.length)) throw new Error("Decoded message is not valid")
var oldOffset = offset
var obj = {
bool_value: false,
float_value: 0,
int_value: 0,
string_value: "",
foo: 1
}
while (true) {
if (end <= offset) {
decode.bytes = offset - oldOffset
return obj
}
var prefix = varint.decode(buf, offset)
offset += varint.decode.bytes
var tag = prefix >> 3
switch (tag) {
case 1:
obj.bool_value = enc[0].decode(buf, offset)
offset += enc[0].decode.bytes
break
case 2:
obj.float_value = enc[1].decode(buf, offset)
offset += enc[1].decode.bytes
break
case 3:
obj.int_value = enc[2].decode(buf, offset)
offset += enc[2].decode.bytes
break
case 4:
obj.string_value = enc[3].decode(buf, offset)
offset += enc[3].decode.bytes
break
case 5:
obj.foo = enc[4].decode(buf, offset)
offset += enc[4].decode.bytes
break
default:
offset = skip(prefix & 7, buf, offset)
}
}
}
}
function defined (val) {
return val !== null && val !== undefined && (typeof val !== 'number' || !isNaN(val))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment