UNPKG

capnp-js

Version:

Capnproto run-time decoding and encoding for Node

34 lines (33 loc) 1.35 kB
var Arena = require('./reader/Arena'); var Allocator = require('./builder/Allocator'); var copy = require('./builder/copy/pointer'); var allocator = new Allocator(); var fromStruct = function(instance) { var layout = instance._layout(); if (layout.meta !== 0) throw new TypeError("Message must have a structure as its root"); var arena = instance._arena; var singleton; if (arena._segments.length !== 1) { // Compute upper bound on necessary arena size: // * Single hop far pointer implies 8 bytes of slop. // * Double hop far pointer implies 16 bytes of slop. var size = 0; arena._segments.forEach(function(s) { size += s._position; }); var nonframedArena = allocator.createArena(size); copy.setStructPointer(arena, layout, nonframedArena, nonframedArena._root()); singleton = nonframedArena.getSegment(0); } else { singleton = arena.getSegment(0); } return singleton.slice(0, singleton._position); }; var toArena = function(blob) { blob = blob.slice(); blob._id = 0; blob._position = blob.length; return new Arena([ blob ]); }; exports.fromStruct = fromStruct; exports.toArena = toArena;