packages/script/src/engine.js

/**
 * The scripting engine that takes a script provider and context provider
 * @class
 * @memberof module:@perion/script
 */
class Engine {
  /**
   * Instantiates a new Engine
   * @constructor
   * @param {ScriptProvider} scriptProvider 
   * @param {ContextProvider} contextProvider 
   * @param {Object} options 
   */
  constructor(scriptProvider, contextProvider, options=null) {
    this.scriptProvider = scriptProvider;
    this.contextProvider = contextProvider;
    this.options = options;
  }
  /**
   * Evaluates a script in context
   * @static
   * @param {string} js The script to execute
   * @param {Object} context The context to apply
   * @return {boolean} The result
   * @throws {Error}
   */
  static evalInContext(js, context) {
    return new Promise((resolve, reject) => {
      try {
        resolve(function() {return eval(js);}.call(context));
      } catch (err) {
        reject(err);
      }
    });
  }
  /**
   * Handles a script execute request asynchronously
   * @param {Object} request 
   * @return {boolean} Th result
   * @throws {Error}
   */
  async handleRequest(request) {
    const parsedRequest = request;
    try {
      const script = await this.scriptProvider.getScript(parsedRequest);
      const context = this.contextProvider.getContext(parsedRequest).build();
      await Engine.evalInContext(script, context);
      return true;
    } catch (err) {
      throw err;
    }
  }
}
module.exports = Engine;