Last active
January 31, 2018 17:05
-
-
Save vkosh/d8bc50fd17cad8e51e9c2b8725655017 to your computer and use it in GitHub Desktop.
protobuf wrong enum encoding generation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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