Skip to content

Instantly share code, notes, and snippets.

@alexvictoor
Last active February 8, 2021 19:47
Show Gist options
  • Save alexvictoor/0b76764857b780ad8f83 to your computer and use it in GitHub Desktop.
Save alexvictoor/0b76764857b780ad8f83 to your computer and use it in GitHub Desktop.
First steps with Flatbuffers in Javascript

This is a tiny sample to help you get up to speed with flatbuffers, javascript flavor. This gist contains a flatbuffers schema, tick.fbs, and the related generated javascript code, tick_generated.js . The git does not include flatbuffers.js itself, you can download it from flatbuffers github repository.
In index.html you will find a simple code fragment showing how to build a flatbuffer "Tick" buffer and how to read a Tick object out of an array of bytes.

If you want to change the model, hence the schema, you need the 'flatbuffers compiler', available for download on flatbuffers release page Then you can use the following command line:

flatc -s tick.fbs --gen-mutable

Hope it helps!

<!DOCTYPE html>
<html>
<head>
<title>Test FlatB</title>
<script type="text/javascript" src="flatbuffers.js"></script>
<script type="text/javascript" src="tick_generated.js"></script>
<script type="text/javascript">
function run() {
var builder = new flatbuffers.Builder(0);
var ric = builder.createString('.fchi');
var Tick = com.alex.generated.Tick;
var Price = com.alex.generated.Price;
Tick.startTick(builder);
Tick.addRic(builder, ric);
Tick.addPrice(builder, Price.createPrice(builder, 36, 42));
var offset = Tick.endTick(builder);
builder.finish(offset);
var bytes = builder.asUint8Array()
var hexString = "> ";
for(var i = 0; i < bytes.length; i++){
hexString += bytes[i].toString(16);
}
console.log(hexString);
var buffer = new flatbuffers.ByteBuffer(bytes);
var tick = Tick.getRootAsTick(buffer, null);
console.log("ric = " + tick.ric());
console.log("bid/ask = " + tick.price().bid() + "/" + tick.price().ask());
}
window.onload = run;
</script>
</head>
<body>
</body>
</html>
// Not used at runtime
// Use the following command to generate js code:
// flatc -s tick.fbs --gen-mutable
namespace com.alex.generated;
struct Price {
bid:float;
ask:float;
}
table Tick {
price:Price;
ric:string;
}
root_type Tick;
// automatically generated by the FlatBuffers compiler, do not modify
/**
* @const
*/
var com = com || {};
/**
* @const
*/
com.alex = com.alex || {};
/**
* @const
*/
com.alex.generated = com.alex.generated || {};
/**
* @constructor
*/
com.alex.generated.Price = function() {
/**
* @type {flatbuffers.ByteBuffer}
*/
this.bb = null;
/**
* @type {number}
*/
this.bb_pos = 0;
};
/**
* @param {number} i
* @param {flatbuffers.ByteBuffer} bb
* @returns {com.alex.generated.Price}
*/
com.alex.generated.Price.prototype.__init = function(i, bb) {
this.bb_pos = i;
this.bb = bb;
return this;
};
/**
* @returns {number}
*/
com.alex.generated.Price.prototype.bid = function() {
return this.bb.readFloat32(this.bb_pos);
};
/**
* @returns {number}
*/
com.alex.generated.Price.prototype.ask = function() {
return this.bb.readFloat32(this.bb_pos + 4);
};
/**
* @param {flatbuffers.Builder} builder
* @param {number} bid
* @param {number} ask
* @returns {flatbuffers.Offset}
*/
com.alex.generated.Price.createPrice = function(builder, bid, ask) {
builder.prep(4, 8);
builder.writeFloat32(ask);
builder.writeFloat32(bid);
return builder.offset();
};
/**
* @constructor
*/
com.alex.generated.Tick = function() {
/**
* @type {flatbuffers.ByteBuffer}
*/
this.bb = null;
/**
* @type {number}
*/
this.bb_pos = 0;
};
/**
* @param {number} i
* @param {flatbuffers.ByteBuffer} bb
* @returns {com.alex.generated.Tick}
*/
com.alex.generated.Tick.prototype.__init = function(i, bb) {
this.bb_pos = i;
this.bb = bb;
return this;
};
/**
* @param {flatbuffers.ByteBuffer} bb
* @param {com.alex.generated.Tick=} obj
* @returns {com.alex.generated.Tick}
*/
com.alex.generated.Tick.getRootAsTick = function(bb, obj) {
return (obj || new com.alex.generated.Tick).__init(bb.readInt32(bb.position()) + bb.position(), bb);
};
/**
* @param {com.alex.generated.Price=} obj
* @returns {com.alex.generated.Price}
*/
com.alex.generated.Tick.prototype.price = function(obj) {
var offset = this.bb.__offset(this.bb_pos, 4);
return offset ? (obj || new com.alex.generated.Price).__init(this.bb_pos + offset, this.bb) : null;
};
/**
* @param {flatbuffers.Encoding=} optionalEncoding
* @returns {string|Uint8Array}
*/
com.alex.generated.Tick.prototype.ric = function(optionalEncoding) {
var offset = this.bb.__offset(this.bb_pos, 6);
return offset ? this.bb.__string(this.bb_pos + offset, optionalEncoding) : null;
};
/**
* @param {flatbuffers.Builder} builder
*/
com.alex.generated.Tick.startTick = function(builder) {
builder.startObject(2);
};
/**
* @param {flatbuffers.Builder} builder
* @param {flatbuffers.Offset} priceOffset
*/
com.alex.generated.Tick.addPrice = function(builder, priceOffset) {
builder.addFieldStruct(0, priceOffset, 0);
};
/**
* @param {flatbuffers.Builder} builder
* @param {flatbuffers.Offset} ricOffset
*/
com.alex.generated.Tick.addRic = function(builder, ricOffset) {
builder.addFieldOffset(1, ricOffset, 0);
};
/**
* @param {flatbuffers.Builder} builder
* @returns {flatbuffers.Offset}
*/
com.alex.generated.Tick.endTick = function(builder) {
var offset = builder.endObject();
return offset;
};
/**
* @param {flatbuffers.Builder} builder
* @param {flatbuffers.Offset} offset
*/
com.alex.generated.Tick.finishTickBuffer = function(builder, offset) {
builder.finish(offset);
};
// Exports for Node.js and RequireJS
this.com = com;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment