mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
12 KiB
293 lines
12 KiB
'use strict';var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {return typeof obj;} : function (obj) {return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;}; /* eslint-disable no-param-reassign, import/no-unresolved,
|
|
import/no-extraneous-dependencies, import/extensions */
|
|
|
|
var _webpage = require('webpage');var _webpage2 = _interopRequireDefault(_webpage);
|
|
var _system = require('system');var _system2 = _interopRequireDefault(_system);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function _toConsumableArray(arr) {if (Array.isArray(arr)) {for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {arr2[i] = arr[i];}return arr2;} else {return Array.from(arr);}}
|
|
|
|
/**
|
|
* Stores all all pages and single instance of phantom
|
|
*/
|
|
var objectSpace = {
|
|
phantom: phantom };
|
|
|
|
|
|
var events = {};
|
|
var NOOP = 'NOOP';
|
|
|
|
/**
|
|
* Looks for transform key and uses objectSpace to call objects
|
|
* @param object
|
|
*/
|
|
function transform(object) {
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
for (var key in object) {
|
|
// eslint-disable-next-line no-prototype-builtins
|
|
if (object.hasOwnProperty(key)) {
|
|
var child = object[key];
|
|
if (child === null || child === undefined) {
|
|
return;
|
|
} else if (child.transform === true) {
|
|
object[key] = objectSpace[child.parent][child.method](child.target);
|
|
} else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') {
|
|
transform(child);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Completes a command by return a response to node and listening again for next command.
|
|
* @param command
|
|
*/
|
|
function completeCommand(command) {
|
|
_system2.default.stdout.writeLine('>' + JSON.stringify(command));
|
|
}
|
|
|
|
/**
|
|
* Sync all OutObjects present in the array
|
|
*
|
|
* @param objects
|
|
*/
|
|
function syncOutObjects(objects) {
|
|
objects.forEach(function (param) {
|
|
if (param.target !== undefined) {
|
|
objectSpace[param.target] = param;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Determines a targets type using its id
|
|
*
|
|
* @param target
|
|
* @returns {*}
|
|
*/
|
|
function getTargetType(target) {
|
|
return target.toString().split('$')[0];
|
|
}
|
|
|
|
/**
|
|
* Verifies if an event is supported for a type of target
|
|
*
|
|
* @param type
|
|
* @param eventName
|
|
* @returns {boolean}
|
|
*/
|
|
function isEventSupported(type, eventName) {
|
|
return type === 'page' && eventName.indexOf('on') === 0;
|
|
}
|
|
|
|
/**
|
|
* Returns a function that will notify to node that an event have been triggered
|
|
*
|
|
* @param eventName
|
|
* @param targetId
|
|
* @returns {Function}
|
|
*/
|
|
function getOutsideListener(eventName, targetId) {
|
|
return function () {for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}
|
|
_system2.default.stdout.writeLine('<event>' + JSON.stringify({ target: targetId, type: eventName, args: args }));
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Executes all the listeners for an event from a target
|
|
*
|
|
* @param target
|
|
* @param eventName
|
|
*/
|
|
function triggerEvent(target, eventName) {for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {args[_key2 - 2] = arguments[_key2];}
|
|
var listeners = events[target][eventName];
|
|
listeners.outsideListener.apply(null, args);
|
|
listeners.otherListeners.forEach(function (listener) {
|
|
listener.apply(objectSpace[target], args);
|
|
});
|
|
}
|
|
/**
|
|
* Gets an object containing all the listeners for an event of a target
|
|
*
|
|
* @param target the target id
|
|
* @param eventName the event name
|
|
*/
|
|
function getEventListeners(target, eventName) {
|
|
if (!events[target]) {
|
|
events[target] = {};
|
|
}
|
|
|
|
if (!events[target][eventName]) {
|
|
events[target][eventName] = {
|
|
outsideListener: getOutsideListener(eventName, target),
|
|
otherListeners: [] };
|
|
|
|
|
|
objectSpace[target][eventName] = triggerEvent.bind(null, target, eventName);
|
|
}
|
|
|
|
return events[target][eventName];
|
|
}
|
|
|
|
/**
|
|
* All commands that have a custom implementation
|
|
*/
|
|
var commands = {
|
|
createPage: function createPage(command) {
|
|
var page = _webpage2.default.create();
|
|
objectSpace['page$' + command.id] = page;
|
|
|
|
page.onClosing = function () {return delete objectSpace['page$' + command.id];};
|
|
|
|
command.response = { pageId: command.id };
|
|
completeCommand(command);
|
|
},
|
|
property: function property(command) {
|
|
if (command.params.length > 1) {
|
|
if (typeof command.params[1] === 'function') {
|
|
// If the second parameter is a function then we want to proxy and pass parameters too
|
|
var callback = command.params[1];
|
|
var otherArgs = command.params.slice(2);
|
|
syncOutObjects(otherArgs);
|
|
objectSpace[command.target][command.params[0]] = function () {for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {args[_key3] = arguments[_key3];}return (
|
|
callback.apply(objectSpace[command.target], args.concat(otherArgs)));};
|
|
} else {
|
|
// If the second parameter is not a function then just assign
|
|
var target = command.target,_command$params = _slicedToArray(command.params, 2),name = _command$params[0],value = _command$params[1];
|
|
objectSpace[target][name] = value;
|
|
}
|
|
} else {
|
|
command.response = objectSpace[command.target][command.params[0]];
|
|
}
|
|
|
|
completeCommand(command);
|
|
},
|
|
setting: function setting(command) {
|
|
if (command.params.length === 2) {var
|
|
target = command.target,_command$params2 = _slicedToArray(command.params, 2),name = _command$params2[0],value = _command$params2[1];
|
|
objectSpace[target].settings[name] = value;
|
|
} else {
|
|
command.response = objectSpace[command.target].settings[command.params[0]];
|
|
}
|
|
|
|
completeCommand(command);
|
|
},
|
|
|
|
windowProperty: function windowProperty(command) {
|
|
if (command.params.length === 2) {var _command$params3 = _slicedToArray(
|
|
command.params, 2),name = _command$params3[0],value = _command$params3[1];
|
|
window[name] = value;
|
|
} else {
|
|
command.response = window[command.params[0]];
|
|
}
|
|
completeCommand(command);
|
|
},
|
|
|
|
addEvent: function addEvent(command) {
|
|
var type = getTargetType(command.target);
|
|
|
|
if (isEventSupported(type, command.params[0].type)) {
|
|
var listeners = getEventListeners(command.target, command.params[0].type);
|
|
|
|
if (typeof command.params[0].event === 'function') {
|
|
listeners.otherListeners.push(function () {for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {args[_key4] = arguments[_key4];}
|
|
var params = args.concat(command.params[0].args);
|
|
return command.params[0].event.apply(objectSpace[command.target], params);
|
|
});
|
|
}
|
|
}
|
|
|
|
completeCommand(command);
|
|
},
|
|
|
|
removeEvent: function removeEvent(command) {
|
|
var type = getTargetType(command.target);
|
|
|
|
if (isEventSupported(type, command.params[0].type)) {
|
|
events[command.target][command.params[0].type] = null;
|
|
objectSpace[command.target][command.params[0].type] = null;
|
|
}
|
|
|
|
completeCommand(command);
|
|
},
|
|
|
|
noop: function noop(command) {return completeCommand(command);},
|
|
|
|
invokeAsyncMethod: function invokeAsyncMethod(command) {
|
|
var target = objectSpace[command.target];
|
|
target[command.params[0]].apply(target, _toConsumableArray(command.params.slice(1).concat(function (result) {
|
|
command.response = result;
|
|
completeCommand(command);
|
|
})));
|
|
},
|
|
|
|
invokeMethod: function invokeMethod(command) {
|
|
var target = objectSpace[command.target];
|
|
var method = target[command.params[0]];
|
|
command.response = method.apply(target, command.params.slice(1));
|
|
completeCommand(command);
|
|
},
|
|
|
|
defineMethod: function defineMethod(command) {
|
|
var target = objectSpace[command.target];var _command$params4 = _slicedToArray(
|
|
command.params, 2),name = _command$params4[0],value = _command$params4[1];
|
|
target[name] = value;
|
|
completeCommand(command);
|
|
} };
|
|
|
|
|
|
/**
|
|
* Executes a command.
|
|
* @param command the command to execute
|
|
*/
|
|
function executeCommand(command) {
|
|
if (commands[command.name]) {
|
|
return commands[command.name](command);
|
|
}
|
|
throw new Error('\'' + command.name + '\' isn\'t a command.');
|
|
}
|
|
|
|
/**
|
|
* Calls readLine() and blocks until a message is ready
|
|
*/
|
|
function read() {
|
|
var line = _system2.default.stdin.readLine();
|
|
if (line) {
|
|
if (line === NOOP) {
|
|
_system2.default.stdout.writeLine('>' + NOOP);
|
|
setTimeout(read, 100);
|
|
return;
|
|
}
|
|
var command = JSON.parse(line, function (key, value) {
|
|
if (
|
|
value &&
|
|
typeof value === 'string' &&
|
|
value.substr(0, 8) === 'function' &&
|
|
value.indexOf('[native code]') === -1)
|
|
{
|
|
var startBody = value.indexOf('{') + 1;
|
|
var endBody = value.lastIndexOf('}');
|
|
var startArgs = value.indexOf('(') + 1;
|
|
var endArgs = value.indexOf(')');
|
|
|
|
// eslint-disable-next-line no-new-func
|
|
return new Function(
|
|
value.substring(startArgs, endArgs),
|
|
value.substring(startBody, endBody));
|
|
|
|
}
|
|
return value;
|
|
});
|
|
|
|
// Call here to look for transform key
|
|
transform(command.params);
|
|
|
|
try {
|
|
executeCommand(command);
|
|
} catch (e) {
|
|
command.error = e.message;
|
|
completeCommand(command);
|
|
} finally {
|
|
setTimeout(read, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
read();
|