UNPKG

rawproto

Version:

Guess structure of protobuf binary from raw data

1 lines 27.3 kB
{"version":3,"file":"rawproto.cjs","sources":["../src/index.js"],"sourcesContent":["import { unflatten } from 'flat'\n\nexport const wireTypes = {\n VARINT: 0, // int32, int64, uint32, uint64, sint32, sint64, bool, enum\n I64: 1, // fixed64, sfixed64, double\n LEN: 2, // string, bytes, embedded messages, packed repeated fields\n SGROUP: 3, // group start (deprecated)\n EGROUP: 4, // group end (deprecated)\n I32: 5 // fixed32, sfixed32, float\n}\n\nconst dec = new TextDecoder()\n\nexport const wireMap = {\n 0: ['uint32', 'int32', 'int64', 'uint64', 'sint32', 'sint64', 'bool', 'raw', 'bytes'],\n 1: ['uint32', 'int32', 'bytes', 'fixed64', 'sfixed64', 'double'],\n 2: ['raw', 'bytes', 'string', 'sub', 'packedIntVar', 'packedInt32', 'packedInt64'],\n 5: ['uint32', 'int32', 'bytes', 'fixed32', 'sfixed32', 'float', 'raw']\n}\n\nexport class ReaderFixed {\n constructor (buffer, type, path, renderType) {\n this.buffer = buffer\n this.type = type\n this.dataView = new DataView(this.buffer)\n this.path = path\n this.renderType = renderType || wireMap[this.type][0]\n }\n\n // lazy-load representations other than this.buffer (ArrayBuffer)\n get raw () {\n return this\n }\n\n get string () {\n return this.int + ''\n }\n\n get bytes () {\n this._bytes ||= new Uint8Array(this.buffer)\n return this._bytes\n }\n}\n\nexport class ReaderFixed64 extends ReaderFixed {\n constructor (buffer, path, renderType) {\n super(buffer, wireTypes.I64, path, renderType)\n }\n\n // lazy-load representations other than this.buffer (ArrayBuffer)\n get uint () {\n const v = this.dataView.getBigUint64(0, true)\n try {\n return Number(v)\n } catch (e) {\n return v\n }\n }\n\n get int () {\n const v = this.dataView.getBigInt64(0, true)\n try {\n return Number(v)\n } catch (e) {\n return v\n }\n }\n\n get float () {\n const v = this.dataView.getFloat64(0, true)\n try {\n return Number(v)\n } catch (e) {\n return v\n }\n }\n\n get double () {\n return this.float\n }\n\n get fixed64 () {\n return this.uint\n }\n\n get sfixed64 () {\n return this.int\n }\n}\n\nexport class ReaderFixed32 extends ReaderFixed {\n constructor (buffer, path, renderType) {\n super(buffer, wireTypes.I32, path, renderType)\n }\n\n // lazy-load representations other than this.buffer (ArrayBuffer)\n get uint () {\n return this.dataView.getUint32(0, true)\n }\n\n get int () {\n return this.dataView.getInt32(0, true)\n }\n\n get float () {\n return this.dataView.getFloat32(0, true)\n }\n\n get fixed32 () {\n return this.uint\n }\n\n get sfixed32 () {\n return this.int\n }\n}\n\nexport class ReaderVarInt {\n constructor (buffer, path, renderType, value) {\n this.type = wireTypes.VARINT\n this.buffer = buffer\n this.value = this.uint = this.int = value\n this.path = path\n this.renderType = renderType || wireMap[this.type][0]\n }\n\n // lazy-load representations other than this.buffer (ArrayBuffer)\n get raw () {\n return this\n }\n\n get bytes () {\n this._bytes ||= new Uint8Array(this.buffer)\n return this._bytes\n }\n\n get string () {\n return this.uint.toString()\n }\n\n get bool () {\n return !!this.uint\n }\n\n get int32 () {\n return this.int\n }\n\n get int64 () {\n return this.int\n }\n\n get sint32 () {\n return this.int\n }\n\n get sint64 () {\n return this.int\n }\n\n get uint32 () {\n return this.uint\n }\n\n get uint64 () {\n return this.uint\n }\n}\n\nexport class ReaderMessage {\n constructor (buffer, path = '0', renderType) {\n this.type = wireTypes.LEN\n this.path = path\n this.renderType = renderType || wireMap[this.type][0]\n\n // Buffer is weird because it will say it's an instance of Uint8Array\n if (typeof Buffer !== 'undefined' && buffer instanceof Buffer) {\n this.bytes = new Uint8Array(buffer)\n this.buffer = this.bytes.buffer\n } else if (buffer instanceof ArrayBuffer) {\n this.buffer = buffer\n this.bytes = new Uint8Array(this.buffer)\n } else if (buffer instanceof Uint8Array) {\n this.buffer = buffer.buffer\n this.bytes = new Uint8Array(this.buffer)\n } else {\n this.bytes = new Uint8Array(buffer)\n this.buffer = this.bytes.buffer\n }\n this.offset = 0\n }\n\n // render: pull a group (as bytes) from this\n readBufferUntilGroupEnd (index) {\n const offsetStart = this.offset\n let indexType = parseInt(this.readVarInt())\n let type = indexType & 7\n let foundIndex = index\n\n while (type !== wireTypes.EGROUP) {\n indexType = parseInt(this.readVarInt())\n type = indexType & 7\n foundIndex = indexType >> 3\n }\n\n // if (foundIndex !== index) {\n // throw new Error(`Group index ${foundIndex} should match ${index}`)\n // }\n\n return this.buffer.slice(offsetStart, this.offset)\n }\n\n // render: pull a varint from this\n readVarInt () {\n if (typeof this.offset === 'undefined') {\n throw new Error('Offset must be defined to use readVarInt. If you really want to do this, try setting it to 0.')\n }\n let result = 0\n let shift = 0\n let byte\n do {\n if (this.offset >= this.buffer.byteLength) {\n throw new Error(`Buffer overflow while reading varint: ${this.offset}/${this.buffer.byteLength}`)\n }\n byte = this.bytes[this.offset++]\n result |= (byte & 0x7f) << shift\n shift += 7\n } while (byte >= 0x80)\n return result\n }\n\n // lazy-load fields\n\n // is it possible this is a message?\n get couldHaveSub () {\n if (typeof this._couldHaveSub === 'undefined') {\n this._couldHaveSub = Object.keys(this.sub).length > 0\n }\n return this._couldHaveSub\n }\n\n // is it likely this is a string?\n get likelyString () {\n this._likelyString ||= typeof (this.bytes.find(b => b < 32)) === 'undefined'\n return this._likelyString\n }\n\n // get list of sub-fields with counts\n get fields () {\n if (this._fields) {\n return this._fields\n }\n\n // sub triggers field-analysis\n const s = this.sub\n return this._fields\n }\n\n // get sub-fields, triggers sub-render (cached)\n get sub () {\n if (this._sub) {\n return this._sub\n }\n\n this.offset = 0\n this._fields = {}\n this._sub = {}\n\n let rollbackOffset = this.offset\n\n try {\n while (this.offset < this.buffer.byteLength) {\n const indexType = parseInt(this.readVarInt())\n const type = indexType & 7\n const index = indexType >> 3\n this._fields[index] ||= 0\n this._fields[index]++\n this._sub[index] ||= []\n\n if (type === wireTypes.VARINT) {\n const s = this.offset\n const value = parseInt(this.readVarInt())\n const reader = new ReaderVarInt(this.buffer.slice(s, this.offset - 1), [this.path, index].join('.'), 'int32', value)\n this._sub[index].push(reader)\n rollbackOffset = this.offset\n }\n\n if (type === wireTypes.LEN) {\n const byteLength = this.readVarInt()\n const reader = new ReaderMessage(this.buffer.slice(this.offset, this.offset + byteLength), [this.path, index].join('.'))\n this.offset += byteLength\n this._sub[index].push(reader)\n rollbackOffset = this.offset\n }\n\n if (type === wireTypes.SGROUP) {\n const reader = new ReaderMessage(this.readBufferUntilGroupEnd(index), [this.path, index].join('.'))\n this._sub[index].push(reader)\n rollbackOffset = this.offset\n }\n\n if (type === wireTypes.I64) {\n const reader = new ReaderFixed64(this.buffer.slice(this.offset, this.offset + 8), [this.path, index].join('.'))\n this.offset += 8\n this._sub[index].push(reader)\n rollbackOffset = this.offset\n }\n\n if (type === wireTypes.I32) {\n const reader = new ReaderFixed32(this.buffer.slice(this.offset, this.offset + 4), [this.path, index].join('.'))\n this.offset += 4\n this._sub[index].push(reader)\n rollbackOffset = this.offset\n }\n }\n return this._sub\n } catch (e) {\n // console.error(e)\n this.remainder = this.buffer.slice(rollbackOffset)\n return {}\n }\n }\n\n // get raw representation of this (used for queries)\n get raw () {\n return this\n }\n\n // get string of this\n get string () {\n this._string ||= dec.decode(this.bytes)\n return this._string\n }\n\n // render: pull packed ints from this\n\n get packedIntVar () {\n if (typeof this._packedintvar !== 'undefined') {\n return this._packedintvar\n }\n this._packedintvar = []\n this.offset = 0\n while (this.offset < this.buffer.byteLength) {\n this._packedintvar.push(this.readVarInt())\n }\n return this._packedintvar\n }\n\n get packedInt32 () {\n if (typeof this._packedint32 !== 'undefined') {\n return this._packedint32\n }\n this.dataView ||= new DataView(this.buffer)\n this._packedint32 = []\n this.offset = 0\n while (this.offset < this.buffer.byteLength) {\n this._packedint32.push(this.dataView.getInt32(this.offset, true))\n this.offset += 4\n }\n return this._packedint32\n }\n\n get packedInt64 () {\n if (typeof this._packedint64 !== 'undefined') {\n return this._packedint64\n }\n this.dataView ||= new DataView(this.buffer)\n this._packedint64 = []\n this.offset = 0\n while (this.offset < this.buffer.byteLength) {\n try {\n this._packedint64.push(parseInt(this.dataView.getBigInt64(this.offset, true)))\n } catch (e) {\n this._packedint64.push(this.dataView.getBigInt64(this.offset, true))\n }\n this.offset += 8\n }\n return this._packedint64\n }\n\n // utils\n\n // use string-queries to get data, without walking all messages (just those in query)\n query (...queries) {\n return query(this, this.path, ...queries)\n }\n\n toJS (queryMap = {}, prefix = 'f', nameMap, typeMap) {\n return toJS(this, queryMap, prefix, nameMap, typeMap)\n }\n\n toProto (queryMap = {}, prefix = 'f', nameMap, typeMap, messageName = 'MessageRoot') {\n return toProto(this, queryMap, prefix, nameMap, typeMap, messageName)\n }\n}\n\nexport function query (tree, prefix = '0', ...queries) {\n const out = []\n for (const q of queries) {\n let [path, type = 'raw'] = q.split(':')\n if (path.substr(0, prefix.length) !== prefix) {\n path = `${prefix}.${path}`\n }\n const pathTraverse = path.replace(new RegExp(`^${prefix}\\.`), '').split('.')\n let current = [tree]\n for (const i of pathTraverse) {\n const ca = []\n for (const c of current) {\n if (c.sub[i]) {\n ca.push(...c.sub[i])\n }\n }\n current = ca\n }\n out.push(...current.filter(c => c.path === path).map(c => c[type]))\n }\n return out\n}\n\nexport function toJS (tree, queryMap, prefix = 'f', nameMap, typeMap) {\n let out = {}\n\n // this is used as a marker that it's top-level\n if (typeof queryMap === 'object') {\n if (!nameMap) {\n nameMap = {}\n }\n if (!typeMap) {\n typeMap = {}\n }\n for (const name of Object.keys(queryMap)) {\n let [path, type = 'raw'] = queryMap[name].split(':')\n if (path[0] !== '0') {\n path = `0.${path}`\n }\n nameMap[path] = name\n typeMap[path] = type\n }\n }\n\n for (const subs of Object.values(tree.sub || {})) {\n for (const t of subs) {\n try {\n const name = nameMap[t.path] || prefixify(prefix, t.path)\n out[name] ||= []\n const renderType = typeMap[t.path] || t.renderType\n if (t.type === wireTypes.LEN && !['string', 'bytes'].includes(renderType)) {\n if (t.couldHaveSub) {\n out = { ...out, ...toJS(t, undefined, prefix, nameMap, typeMap) }\n } else if (t.likelyString) {\n out[name].push(t.string)\n } else {\n out[name].push(t.bytes)\n }\n } else {\n out[name].push(t[renderType])\n }\n } catch (e) {}\n }\n }\n\n return unflatten(out)\n}\n\nconst prefixify = (prefix, path) => path.split('.').map((v, k, a) => `${prefix}${v}`).join('.')\nconst indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count))\n\nexport function toProto (tree, queryMap, prefix = 'f', nameMap, typeMap, messageName = 'MessageRoot', indent = 0, isSub = false) {\n const out = []\n\n // this is used as a marker that it's top-level\n if (typeof queryMap === 'object') {\n if (!nameMap) {\n nameMap = {}\n }\n if (!typeMap) {\n typeMap = {}\n }\n for (const name of Object.keys(queryMap)) {\n let [path, type = 'raw'] = queryMap[name].split(':')\n if (path[0] !== '0') {\n path = `0.${path}`\n }\n nameMap[path] = name\n typeMap[path] = type\n }\n }\n\n out.push(`message ${messageName} {`)\n\n const treekeys = Object.keys(tree.sub || {})\n\n for (const n in treekeys) {\n const fn = parseInt(n) + 1\n\n const f = tree?.sub[treekeys[n]]\n if (!f[0]?.path) {\n // not really sure why this happens\n continue\n }\n let repeated = ''\n let options = ''\n let renderType = typeMap[f[0]?.path] || f[0].renderType\n const name = nameMap[f[0].path] ? nameMap[f[0].path].split('.').pop() : `${prefix}${fn}`\n\n if (f.length > 1) {\n repeated = 'repeated '\n }\n\n if (renderType === 'packedIntVar') {\n renderType = 'int32'\n repeated = 'repeated '\n options = ' [packed=true]'\n }\n\n if (renderType === 'packedInt32') {\n renderType = 'fixed32'\n repeated = 'repeated '\n options = ' [packed=true]'\n }\n\n if (renderType === 'packedInt64') {\n renderType = 'fixed64'\n repeated = 'repeated '\n options = ' [packed=true]'\n }\n\n if (typeof f[0] === 'object' && f[0].type === wireTypes.LEN && !['string', 'bytes'].includes(renderType)) {\n if (f[0].couldHaveSub) {\n out.push(indentString(`Message${fn} ${name} = ${fn};`, 2))\n out.push(toProto(f[0], undefined, prefix, nameMap, typeMap, `Message${fn}`, indent + 1, true))\n } else {\n out.push(indentString(`bytes ${name} = ${fn};`, 2))\n }\n } else {\n out.push(indentString(`${repeated}${renderType} ${name} = ${fn}${options};`, 2))\n }\n }\n\n out.push('}')\n\n return indentString(out.join('\\n'), 2 * indent)\n}\n\nexport default ReaderMessage\n"],"names":["wireTypes","VARINT","I64","LEN","SGROUP","EGROUP","I32","dec","TextDecoder","wireMap","ReaderFixed","_createClass","buffer","type","path","renderType","this","dataView","DataView","key","get","_bytes","Uint8Array","ReaderFixed64","_ReaderFixed","call","_inheritsLoose","v","getBigUint64","Number","e","getBigInt64","getFloat64","uint","ReaderFixed32","_ReaderFixed2","getUint32","getInt32","getFloat32","ReaderVarInt","value","toString","ReaderMessage","Buffer","bytes","ArrayBuffer","offset","_proto","prototype","readBufferUntilGroupEnd","index","offsetStart","indexType","parseInt","readVarInt","slice","Error","byte","result","shift","byteLength","query","apply","concat","arguments","toJS","queryMap","prefix","nameMap","typeMap","toProto","messageName","_couldHaveSub","Object","keys","sub","length","_likelyString","find","b","_fields","_sub","rollbackOffset","_this$_fields","_this$_sub","s","reader","join","push","remainder","_string","decode","_packedintvar","_packedint32","_packedint64","tree","_step","out","_loop","_q$split","split","_q$split$","substr","_step2","pathTraverse","replace","RegExp","current","_iterator2","_createForOfIteratorHelperLoose","done","_step3","i","ca","_iterator3","c","filter","map","_iterator","_i","_Object$keys","name","_queryMap$name$split","_queryMap$name$split$","_i2","_Object$values","values","_step4","_iterator4","t","_out","prefixify","includes","couldHaveSub","_extends","undefined","likelyString","string","unflatten","k","a","indentString","str","count","indent","repeat","isSub","_i3","_Object$keys2","_queryMap$name$split2","_queryMap$name$split3","treekeys","n","_f$","_f$2","fn","f","repeated","options","pop"],"mappings":"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"}