Comparing version
'use strict'; | ||
var Pbf = require('../'), | ||
Benchmark = require('benchmark'), | ||
var Benchmark = require('benchmark'), | ||
fs = require('fs'), | ||
protobuf = require('protocol-buffers'); | ||
protobuf = require('protocol-buffers'), | ||
vt = require('./vector_tile'), | ||
Pbf = require('../'), | ||
readTile = vt.Tile.read, | ||
writeTile = vt.Tile.write; | ||
var messages = protobuf(fs.readFileSync(__dirname + '/vector_tile.proto')), | ||
var Tile = protobuf(fs.readFileSync(__dirname + '/vector_tile.proto')).Tile, | ||
data = fs.readFileSync(__dirname + '/../test/fixtures/12665.vector.pbf'), | ||
suite = new Benchmark.Suite(); | ||
var layers = readLayers(data), | ||
layersJSON = JSON.stringify(layers); | ||
var tile = readTile(new Pbf(data)), | ||
tileJSON = JSON.stringify(tile), | ||
tile2 = Tile.decode(data); | ||
// var layers2 = messages.Tile.decode(data); | ||
writeTile(tile, new Pbf()); | ||
suite | ||
.add('decode vector tile with pbf', function() { | ||
readLayers(data); | ||
readTile(new Pbf(data)); | ||
}) | ||
.add('encode vector tile with pbf', function() { | ||
var pbf = new Pbf(); | ||
writeTile(tile, pbf); | ||
pbf.finish(); | ||
}) | ||
.add('decode vector tile with protocol-buffers', function() { | ||
messages.Tile.decode(data); | ||
Tile.decode(data); | ||
}) | ||
.add('native JSON.parse of the same data', function() { | ||
JSON.parse(layersJSON); | ||
.add('encode vector tile with protocol-buffers', function() { | ||
Tile.encode(tile2); | ||
}) | ||
.add('encode vector tile with pbf', function() { | ||
encodeLayers(layers); | ||
.add('JSON.parse vector tile', function() { | ||
JSON.parse(tileJSON); | ||
}) | ||
// .add('encode vector tile with protocol-buffers', function() { | ||
// messages.Tile.encode(layers2); | ||
// }) | ||
.add('native JSON.stringify', function() { | ||
JSON.stringify(layers); | ||
.add('JSON.stringify vector tile', function() { | ||
JSON.stringify(tile); | ||
}) | ||
@@ -40,74 +46,1 @@ .on('cycle', function(event) { | ||
.run(); | ||
// decoding vector tile | ||
function readLayers(data) { | ||
return new Pbf(data).readFields(readTile, []); | ||
} | ||
function readTile(tag, layers, pbf) { | ||
if (tag === 3) layers.push(pbf.readMessage(readLayer, {features: [], keys: [], values: []})); | ||
} | ||
function readLayer(tag, layer, pbf) { | ||
if (tag === 1) layer.name = pbf.readString(); | ||
else if (tag === 2) layer.features.push(pbf.readMessage(readFeature, {})); | ||
else if (tag === 3) layer.keys.push(pbf.readString()); | ||
else if (tag === 4) layer.values.push(pbf.readMessage(readValue, {}).value); | ||
else if (tag === 5) layer.extent = pbf.readVarint(); | ||
else if (tag === 15) layer.version = pbf.readVarint(); | ||
} | ||
function readFeature(tag, feature, pbf) { | ||
if (tag === 1) feature.id = pbf.readVarint(); | ||
else if (tag === 2) feature.tags = pbf.readPackedVarint(); | ||
else if (tag === 3) feature.type = pbf.readVarint(); | ||
else if (tag === 4) feature.geometry = pbf.readPackedVarint(); | ||
} | ||
function readValue(tag, value, pbf) { | ||
if (tag === 1) value.value = pbf.readString(); | ||
else if (tag === 2) value.value = pbf.readFloat(); | ||
else if (tag === 3) value.value = pbf.readDouble(); | ||
else if (tag === 4) value.value = pbf.readVarint(); | ||
else if (tag === 5) value.value = pbf.readVarint(); | ||
else if (tag === 6) value.value = pbf.readSVarint(); | ||
else if (tag === 7) value.value = pbf.readBoolean(); | ||
} | ||
// encoding vector tile | ||
function encodeLayers(layers) { | ||
var pbf = new Pbf(); | ||
for (var i = 0; i < layers.length; i++) { | ||
pbf.writeMessage(3, encodeLayer, layers[i]); | ||
} | ||
return pbf.finish(); | ||
} | ||
function encodeLayer(layer, pbf) { | ||
pbf.writeStringField(1, layer.name); | ||
for (var i = 0; i < layer.features.length; i++) { | ||
pbf.writeMessage(2, encodeFeature, layer.features[i]); | ||
} | ||
for (i = 0; i < layer.keys.length; i++) { | ||
pbf.writeStringField(3, layer.keys[i]); | ||
} | ||
for (i = 0; i < layer.values.length; i++) { | ||
pbf.writeMessage(4, encodeValue, layer.values[i]); | ||
} | ||
pbf.writeVarintField(5, layer.extent); | ||
pbf.writeVarintField(15, layer.version); | ||
} | ||
function encodeFeature(feature, pbf) { | ||
pbf.writeVarintField(1, feature.id); | ||
pbf.writePackedVarint(2, feature.tags); | ||
pbf.writeVarintField(3, feature.type); | ||
pbf.writePackedVarint(4, feature.geometry); | ||
} | ||
function encodeValue(value, pbf) { | ||
if (typeof value === 'string') pbf.writeStringField(1, value); | ||
else if (typeof value === 'number') { | ||
if (value % 1 === 0) { // integer | ||
if (value >= 0) pbf.writeVarintField(4, value); | ||
else pbf.writeSVarintField(6, value); | ||
} else pbf.writeDoubleField(3, value); | ||
} else if (typeof value === 'boolean') pbf.writeBooleanField(7, value); | ||
} |
@@ -10,2 +10,4 @@ 'use strict'; | ||
var BufferMethods; | ||
function Buffer(length) { | ||
@@ -39,3 +41,3 @@ var arr; | ||
var BufferMethods = { | ||
BufferMethods = { | ||
readUInt32LE: function(pos) { | ||
@@ -154,9 +156,7 @@ return ((this[pos]) | | ||
if (c < 0x80) bytes.push(c); | ||
else { | ||
if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); | ||
else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); | ||
else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); | ||
} | ||
else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); | ||
else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); | ||
else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); | ||
} | ||
return bytes; | ||
} |
20
index.js
@@ -180,3 +180,3 @@ 'use strict'; | ||
var type = val & 0x7; | ||
if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f); | ||
if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} | ||
else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; | ||
@@ -199,3 +199,3 @@ else if (type === Pbf.Fixed32) this.pos += 4; | ||
if (length != this.length) { | ||
if (length !== this.length) { | ||
var buf = new Buffer(length); | ||
@@ -250,16 +250,16 @@ this.buf.copy(buf); | ||
this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = (val >>> 7) & 0x7f; | ||
this.buf[this.pos++] = ((val >>> 7) & 0x7f); | ||
} else if (val <= 0x1fffff) { | ||
this.realloc(3); | ||
this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = (val >>> 14) & 0x7f; | ||
this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 14) & 0x7f); | ||
} else if (val <= 0xfffffff) { | ||
this.realloc(4); | ||
this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; | ||
this.buf[this.pos++] = (val >>> 21) & 0x7f; | ||
this.buf[this.pos++] = ((val >>> 21) & 0x7f); | ||
@@ -275,3 +275,3 @@ } else { | ||
this.buf[this.pos++] = val | 0; | ||
if (this.pos - pos > 10) throw new Error("Given varint doesn't fit into 10 bytes"); | ||
if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); | ||
} | ||
@@ -278,0 +278,0 @@ }, |
{ | ||
"name": "pbf", | ||
"version": "1.2.0", | ||
"version": "1.3.0", | ||
"description": "a low-level, lightweight protocol buffers implementation in JavaScript", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "jshint index.js buffer.js test/*.js && tape test/*.test.js | faucet", | ||
"test": "eslint index.js buffer.js test/*.js bin/pbf && tape test/*.test.js | faucet", | ||
"cov": "istanbul cover tape test/*.test.js && coveralls < ./coverage/lcov.info", | ||
"build-min": "browserify index.js -s Pbf | uglifyjs -c -m > pbf.js", | ||
"build-dev": "browserify index.js -d -s Pbf > pbf-dev.js" | ||
"build-min": "mkdirp dist && browserify index.js -s Pbf | uglifyjs -c warnings=false -m > dist/pbf.js", | ||
"build-dev": "mkdirp dist && browserify index.js -d -s Pbf > dist/pbf-dev.js" | ||
}, | ||
"bin": { | ||
"pbf": "bin/pbf" | ||
}, | ||
"repository": { | ||
@@ -34,11 +37,5 @@ "type": "git", | ||
"dependencies": { | ||
"ieee754": "~1.1.4" | ||
"ieee754": "~1.1.4", | ||
"resolve-protobuf-schema": "^1.0.2" | ||
}, | ||
"jshintConfig": { | ||
"trailing": true, | ||
"undef": true, | ||
"unused": true, | ||
"indent": 4, | ||
"node": true | ||
}, | ||
"devDependencies": { | ||
@@ -48,9 +45,47 @@ "benchmark": "^1.0.0", | ||
"coveralls": "~2.11.2", | ||
"eslint": "^0.13.0", | ||
"faucet": "0.0.1", | ||
"istanbul": "~0.3.5", | ||
"jshint": "^2.5.11", | ||
"protocol-buffers": "^2.4.3", | ||
"mkdirp": "^0.5.0", | ||
"protocol-buffers": "^2.4.6", | ||
"tape": "~3.0.3", | ||
"uglify-js": "^2.4.16" | ||
}, | ||
"eslintConfig": { | ||
"rules": { | ||
"no-use-before-define": [ | ||
2, | ||
"nofunc" | ||
], | ||
"camelcase": 2, | ||
"space-after-function-name": 2, | ||
"space-in-parens": 2, | ||
"space-before-blocks": 2, | ||
"space-after-keywords": 2, | ||
"comma-style": 2, | ||
"no-lonely-if": 2, | ||
"no-else-return": 2, | ||
"new-cap": 2, | ||
"space-in-brackets": 2, | ||
"quotes": [ | ||
2, | ||
"single" | ||
], | ||
"no-new": 2, | ||
"no-empty": 0, | ||
"key-spacing": 0, | ||
"no-multi-spaces": 0, | ||
"no-underscore-dangle": 0, | ||
"no-shadow": 0, | ||
"curly": 0, | ||
"no-constant-condition": 0 | ||
}, | ||
"env": { | ||
"node": true, | ||
"browser": true | ||
}, | ||
"globals": { | ||
"Buffer": true | ||
} | ||
} | ||
} |
@@ -7,11 +7,27 @@ # pbf | ||
Designed to be a building block for writing customized decoders and encoders for a stable protobuf schema. | ||
Designed to be a building block for writing customized decoders and encoders. | ||
If you need an all-purpose protobuf JS library that does most of the work for you, | ||
take a look at [protocol-buffers](https://github.com/mafintosh/protocol-buffers). | ||
take a look at [protocol-buffers](https://github.com/mafintosh/protocol-buffers) too. | ||
## Example | ||
## Examples | ||
#### Reading | ||
#### Using Compiled Code | ||
Install `pbf` and compile a JavaScript module from a `.proto` file: | ||
```bash | ||
$ npm install -g pbf | ||
$ pbf test.proto > test.js | ||
``` | ||
Then read and write objects using the module like this: | ||
```js | ||
var obj = Test.read(new Pbf(buffer)); // read | ||
var buffer = Test.write(obj, new Pbf()); // write | ||
``` | ||
#### Custom Reading | ||
```js | ||
var data = new Pbf(buffer).readFields(readData, {}); | ||
@@ -30,13 +46,13 @@ | ||
#### Writing | ||
#### Custom Writing | ||
```js | ||
var buffer = writeData(data); | ||
var pbf = new Pbf(); | ||
writeData(data, pbf); | ||
var buffer = pbf.finish(); | ||
function writeData(data) { | ||
var pbf = new Pbf(); | ||
function writeData(data, pbf) { | ||
pbf.writeStringField(1, data.name); | ||
pbf.writeVarintField(2, data.version); | ||
pbf.writeMessage(3, writeLayer, data.layer); | ||
return pbf.finish(); | ||
} | ||
@@ -49,2 +65,3 @@ function writeLayer(layer, pbf) { | ||
## Install | ||
@@ -62,4 +79,4 @@ | ||
npm install | ||
npm run build-dev # pbf-dev.js (development build) | ||
npm run build-min # pbf.js (minified production build) | ||
npm run build-dev # dist/pbf-dev.js (development build) | ||
npm run build-min # dist/pbf.js (minified production build) | ||
``` | ||
@@ -69,9 +86,13 @@ | ||
Create a Protobuf object, optionally given a `Buffer` as input data (or `Uint8Array` in browsers): | ||
Create a `Pbf` object, optionally given a `Buffer` or `Uint8Array` as input data: | ||
```js | ||
var pbf = Protobuf(/*Buffer or Uint8Array*/ buf); | ||
// parse a pbf file from disk in Node | ||
var pbf = new Pbf(fs.readFileSync('data.pbf')); | ||
// parse a pbf file in a browser after an ajax request with responseType="arraybuffer" | ||
var pbf = new Pbf(new Uint8Array(xhr.response)); | ||
``` | ||
Protobuf object properties: | ||
`Pbf` object properties: | ||
@@ -96,3 +117,3 @@ ```js | ||
It optionally accepts an object that will be passed to the reading function for easier construction of decoded data, | ||
and also passes the Protobuf object as a third argument: | ||
and also passes the `Pbf` object as a third argument: | ||
@@ -113,3 +134,4 @@ ```js | ||
var value = pbf.readVarint(); | ||
var packed = pbf.readPacked('UInt32'); | ||
var str = pbf.readString(); | ||
var numbers = pbf.readPackedVarint(); | ||
``` | ||
@@ -143,4 +165,2 @@ | ||
* `readBytes()` | ||
* `readString()` | ||
* `readBytes()` | ||
* `skip(value)` | ||
@@ -216,3 +236,3 @@ | ||
* `writeString(val)` | ||
* `writeBytes(buffer[, start, end])` | ||
* `writeBytes(buffer)` | ||
@@ -228,4 +248,28 @@ Misc methods: | ||
## Proto Schema to JavaScript | ||
If installed globally, `pbf` provides a binary that compiles `proto` files into JavaScript modules. Usage: | ||
```bash | ||
$ pbf <proto_path> [--no-write] [--no-read] [--browser] | ||
``` | ||
The `--no-write` and `--no-read` switches remove corresponding code in the output. | ||
The `--browser` switch makes the module work in browsers instead of Node. | ||
The resulting module exports each message by name with the following methods: | ||
* `read(pbf)` - decodes an object from the given `Pbf` instance | ||
* `write(obj, pbf)` - encodes an object into the given `Pbf` instance (usually empty) | ||
The resulting code is pretty short and easy to understand, so you can customize it easily. | ||
## Changelog | ||
#### 1.3.0 (Feb 5, 2015) | ||
- Added `pbf` binary that compiles `.proto` files into `Pbf`-based JavaScript modules. | ||
#### 1.2.0 (Jan 5, 2015) | ||
@@ -232,0 +276,0 @@ |
@@ -6,2 +6,4 @@ 'use strict'; | ||
/*eslint comma-spacing: 0*/ | ||
function toArray(buf) { | ||
@@ -8,0 +10,0 @@ var arr = []; |
@@ -5,2 +5,3 @@ 'use strict'; | ||
fs = require('fs'), | ||
path = require('path'), | ||
test = require('tape').test; | ||
@@ -10,2 +11,4 @@ | ||
/*eslint comma-spacing: 0*/ | ||
function toArray(buf) { | ||
@@ -282,3 +285,3 @@ var arr = []; | ||
test('readFields', function (t) { | ||
var buf = new Pbf(fs.readFileSync(__dirname + '/fixtures/12665.vector.pbf')), | ||
var buf = new Pbf(fs.readFileSync(path.join(__dirname, '/fixtures/12665.vector.pbf'))), | ||
layerOffsets = [], | ||
@@ -288,3 +291,3 @@ foo = {}, res, res2, buf2; | ||
res2 = buf.readFields(function (tag, result, buf) { | ||
if (tag == 3) layerOffsets.push(buf.pos); | ||
if (tag === 3) layerOffsets.push(buf.pos); | ||
res = result; | ||
@@ -305,3 +308,3 @@ buf2 = buf; | ||
test('readMessage', function (t) { | ||
var buf = new Pbf(fs.readFileSync(__dirname + '/fixtures/12665.vector.pbf')), | ||
var buf = new Pbf(fs.readFileSync(path.join(__dirname, '/fixtures/12665.vector.pbf'))), | ||
layerNames = [], | ||
@@ -311,3 +314,3 @@ foo = {}; | ||
buf.readFields(function (tag) { | ||
if (tag == 3) buf.readMessage(readLayer, foo); | ||
if (tag === 3) buf.readMessage(readLayer, foo); | ||
}, foo); | ||
@@ -319,4 +322,4 @@ | ||
t.same(layerNames, ["landuse","water","barrier_line","building","tunnel","road", | ||
"place_label","water_label","poi_label","road_label","housenum_label"]); | ||
t.same(layerNames, ['landuse','water','barrier_line','building','tunnel','road', | ||
'place_label','water_label','poi_label','road_label','housenum_label']); | ||
@@ -323,0 +326,0 @@ t.end(); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Unidentified License
License(Experimental) Something that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
582025
3.28%19
46.15%0
-100%2833
13.18%316
16.18%0
-100%2
100%10
11.11%+ Added
+ Added