index.js

  1. 'use strict';
  2. /**
  3. * Serializable value
  4. *
  5. * @typedef {number|boolean|string|object|array} Serializable
  6. *
  7. * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description|Promise}
  8. */
  9. /**
  10. * A proxy of the return value in the future
  11. *
  12. * @typedef {Promise} Promise
  13. *
  14. * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise|Promise}
  15. */
  16. /**
  17. * Event emitter
  18. *
  19. * @typedef {EventEmitter} EventEmitter
  20. *
  21. * @see {@link https://nodejs.org/dist/latest-v6.x/docs/api/events.html#events_class_eventemitter|Node.JS - Event module}
  22. */
  23. /**
  24. * Binary buffer
  25. *
  26. * @typedef {Buffer} Buffer
  27. *
  28. * @see {@link https://nodejs.org/dist/latest-v6.x/docs/api/buffer.html#buffer_buffer|Node.JS - Buffer}
  29. */
  30. const Browser = require('./Browser'), stack = [ ];
  31. /**
  32. * Puppeteer API
  33. *
  34. * @class
  35. */
  36. class Puppeteer {
  37. /**
  38. * Launch a browser instance with given arguments.
  39. * The browser will be closed when the parent NodeJS process is closed.
  40. *
  41. * @param {object} [options] Set of configurable options to set on the browser
  42. * @param {boolean} [options.headless = true] Whether to run browser in headless mode
  43. *
  44. * @return {Promise<Browser>}
  45. */
  46. static async launch({headless = true} = {}) {
  47. return stack[stack.push(new Browser( headless )) - 1];
  48. }
  49. /**
  50. * @return {string} A path where Puppeteer expects to find Internet Explorer
  51. */
  52. static executablePath() {
  53. const page = stack[0] && stack[0]._page[0];
  54. return page && (page._target.FullName + '');
  55. }
  56. }
  57. async function clear(error) {
  58. await Promise.all( stack.map(browser => browser.close()) );
  59. if (error instanceof Error) {
  60. console.error( error );
  61. process.exit(1);
  62. }
  63. process.exit(0);
  64. }
  65. for (let event of ['uncaughtException', 'unhandledRejection', 'SIGINT', 'exit'])
  66. process.on(event, clear);
  67. module.exports = Puppeteer;