Source: src/Runnable.js

'use strict'; // eslint-disable-line

/**
* @private
*/
const timeoutKey = Symbol();

/**
* The default timeout for a runnable in ms.
* @type {!integer}
* @private
*/
const DEFAULT_TIMEOUT = 10000;

/**
* A webpage runnable blueprint
*
* @interface
*/
class Runnable {

    /**
    * A method to get a function from that is evaluated inm various ways.
    *
    * The returned function should call back with an result of any serializable kind by calling
    * `window.callPhantom(error, result)`.
    * If your method did not provoke an error, pass null as the first argument.
    * You can also throw an error from your returned function.
    * Console output from the returned function can be seen if DEBUG="*:debug" is enabled.
    *
    * The time out of the returned function is controlled via {@link Runnable#timeout}.
    *
    * Keep in mind that returned functions run in the webpage (and as such are restricted to browser features).
    * There are no node features available. Also, closures, etc. won't work.
    * Write this function as if it was called inside a pretty old WebKit.
    *
    * The returned function will be called immediately after page load.
    *
    * @return {Function} A function to be evaluated within the crawled webpage
    */
    getRunnable() {
        return function noopFunction() {
            window.callPhantom(null, undefined);
        };
    }

    /**
    * Optional. Getter/setter for the timeout of the method returned by {@link Runnable#getRunnable}.
    *
    * Values under zero are set to zero.
    *
    * @type {integer}
    * @default 10000 (10 seconds)
    */
    set timeout(num) {
        this[timeoutKey] = parseInt(num, 10);
    }

    /**
    * @ignore
    */
    get timeout() {
        return Math.max(0, this[timeoutKey] || DEFAULT_TIMEOUT);
    }
}

Runnable.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;

module.exports = Runnable;