69 lines
1.8 KiB
JavaScript

var fs = require("fs");
// Define imports. Just logs to console for the sake of this example.
var pson = {
onNull: function() {
console.log("null");
},
onTrue: function() {
console.log("true");
},
onFalse: function() {
console.log("false");
},
onEObject: function() {
console.log("{}");
},
onEArray: function() {
console.log("[]");
},
onEString: function() {
console.log("\"\"");
},
onObject: function(size) {
console.log("{" + size + "}")
},
onArray: function(size) {
console.log("[" + size + "]");
},
onInteger: function(value) {
console.log("integer: " + value);
},
onLong: function(valueLow, valueHigh) {
console.log("long: " + valueLow + ", " + valueHigh);
},
onFloat: function(value) {
console.log("float: " + value);
},
onDouble: function(value) {
console.log("double: " + value);
},
onString: function(offset, length) {
console.log("string(length=" + length + "): " + new Buffer(mem.slice(offset, offset + length)).toString());
},
onBinary: function(offset, length) {
console.log("binary(length=" + length + "): " + mem.slice(offset, offset + length));
}
};
// Instantiate the module
var mod = new WebAssembly.Module(fs.readFileSync(__dirname + "/pson.optimized.wasm"));
var ins = new WebAssembly.Instance(mod, { pson: pson });
var mem = new Uint8Array(ins.exports.memory.buffer);
// Export API
exports.decode = function(buffer) {
// grow memory if necessary
if (mem.length < buffer.length) {
ins.exports.memory.grow(Math.ceil((buffer.length - mem.length) / 65536));
mem = new Uint8Array(ins.exports.memory.buffer);
}
// copy buffer to memory
mem.set(buffer);
// start decoding (calls the imports defined above)
ins.exports.decode(buffer.length);
}