rehanift / object-grafter

Grafts Javascript objects from one global context to another

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Object Grafter

Utility to safely move Javascript objects from one V8 context to another.

var loader = require('object-grafter').create();
var source = loader.load_source();

// WeakMap is required for caching
var filename = require.resolve("es6-collections");
var fs = require("fs");
var weakmap_src = fs.readFileSync(filename);

var vm = require('vm');
var client_context = vm.createContext();
vm.runInContext(weakmap_src, client_context);
vm.runInContext(source, client_context);
var grafter = vm.runInContext('ObjectGrafter.create()', client_context);
grafter.set_host_builtin_objects({
  "Array": Array,
  "Date" : Date,
  "Error" : Error,
  "RegExp" : RegExp,
  "Object" : Object,
  "String" : String
});

var host_date = new Date(); // Create a Date object in the host context
var grafted_date = grafter.graft(host_date); // Graft the date to the client context

var assert = require('assert');
assert.strictEqual(host_date.constructor,Date); // Duh
// The grafted object does not reference the host context
assert.notStrictEqual(grafted_date.constructor,Date); 

// The grafted object has the same value as the host object
assert.strictEqual(host_date.toString(), grafted_date.toString()); 

// The grafted object thinks it was created inside the client context
assert.strictEqual(grafted_date.constructor, vm.runInContext("Date", client_context));

Things that don't work yet

  • Function Constructors

Attribution

Heavily inspired by Bradley Meck's "object wrapper".

About

Grafts Javascript objects from one global context to another


Languages

Language:JavaScript 100.0%