bsonfy - ultrafast BSON parser
bsonfy is an ultrafast serializer and deserializer for the BSON format.
It is written in clean typescript and has no other lib dependencies. BSON is mainly used as compact transport format for (JSON) objects.
Motivation
I needed a simple, fast and clean (typescript) module to generate and parse BSON for storing JSON objects in files efficiently.There are some parsers around (2016/06), mainly the primary one of the mongodb project. But I found that it's really not lightweight enough and too slow for mobile usage.
A further requirement was using typed arrays (
Uint8Array
) instead of nodejs buffers, to get this baby portable and running in browsers, too.Design goals:
- Written in typescript
- Fast and lightweight parser
- Very easy to use, just one include module, NO dependencies
- tslint warning free, clean code
- Unit tested, around 50 passing test cases
- Rocksolid (I hope so)
- MIT license
Usage
Using this module is rather simple. Copy or (npm) install bsonfy to your project and use it like:import { BSON } from 'bsonfy';
// create a test document
let doc = { id: 10, time: new BSON.UTC(), arr: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]) };
// serialize the document
let bson = BSON.serialize(doc);
// and deserialize it, using BSON.UTC objects as time representation
let orig = BSON.deserialize(bson, true);
API
Basically the API consists of just two static methods to serialize/deserialize objects to/from BSON format:BSON serialization and deserialiation
BSON.serialize(object)
@param {Object} object The Javascript object to serialize
@return {Uint8Array} returns an Uint8Array in BSON format.Unknown objects are ignored in serialization.
BSON.deserialize(buffer, useUTC)
@param {Uint8Array} buffer An Uint8Array containing the BSON data
@param {Boolean} useUTC Optional, if set a BSON.UTC
object is created for 'UTC datetime' instead of a normal JS Date
object. Defaults to false
@return {Object} returns the deserialized Javascript object or undefined
in case of a parsing error (unsupported BSON element etc.)UTC
bson.ObjectId.isValid(id)
- Returns true if id
is a valid number or hexadecimal string representing an ObjectId.
bson.ObjectId.createFromHexString(hexString)
- Returns the ObjectId the hexString
represents.
bson.ObjectId.createFromTime(time)
- Returns an ObjectId containing the passed time.time
- A Unix timestamp (number of seconds since the epoch).
UUID
bson.ObjectId.isValid(id)
- Returns true if id
is a valid number or hexadecimal string representing an ObjectId.
bson.ObjectId.createFromHexString(hexString)
- Returns the ObjectId the hexString
represents.
bson.ObjectId.createFromTime(time)
- Returns an ObjectId containing the passed time.time
- A Unix timestamp (number of seconds since the epoch).
ObjectId
bson.ObjectId.isValid(id)
- Returns true if id
is a valid number or hexadecimal string representing an ObjectId.
bson.ObjectId.createFromHexString(hexString)
- Returns the ObjectId the hexString
represents.
bson.ObjectId.createFromTime(time)
- Returns an ObjectId containing the passed time.time
- A Unix timestamp (number of seconds since the epoch).
Unsupported elements
The following BSON elements are currently not supported (and lead to a deserialiation error):- JavaScript code
- Min key
- Max key
- Regular expression (implemented, but untested yet - so don't rely on it)
Caveats
- 64-bit integer BSON values are converted to the Javascript Number type.
Test suite
bsonfy is using the mocha test suite for testing. To do all tests just runnpm run test
.Contributing
If you find any bugs, have any comments, improvements or suggestions:- Create an issue and describe your idea
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Publish the branch (
git push origin my-new-feature
) - Create a new pull request
- Profit! :whitecheckmark: