UNPKG

puppeteer-core

Version:

A high-level API to control headless Chrome over the DevTools Protocol

123 lines • 4.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebWorker = void 0; const EventEmitter_js_1 = require("../common/EventEmitter.js"); const TimeoutSettings_js_1 = require("../common/TimeoutSettings.js"); const util_js_1 = require("../common/util.js"); const ExecutionContext_js_1 = require("./ExecutionContext.js"); const IsolatedWorld_js_1 = require("./IsolatedWorld.js"); const JSHandle_js_1 = require("./JSHandle.js"); /** * This class represents a * {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API | WebWorker}. * * @remarks * The events `workercreated` and `workerdestroyed` are emitted on the page * object to signal the worker lifecycle. * * @example * * ```ts * page.on('workercreated', worker => * console.log('Worker created: ' + worker.url()) * ); * page.on('workerdestroyed', worker => * console.log('Worker destroyed: ' + worker.url()) * ); * * console.log('Current workers:'); * for (const worker of page.workers()) { * console.log(' ' + worker.url()); * } * ``` * * @public */ class WebWorker extends EventEmitter_js_1.EventEmitter { /** * @internal */ timeoutSettings = new TimeoutSettings_js_1.TimeoutSettings(); #world; #client; #url; /** * @internal */ constructor(client, url, consoleAPICalled, exceptionThrown) { super(); this.#client = client; this.#url = url; this.#world = new IsolatedWorld_js_1.IsolatedWorld(this, new TimeoutSettings_js_1.TimeoutSettings()); this.#client.once('Runtime.executionContextCreated', async (event) => { this.#world.setContext(new ExecutionContext_js_1.ExecutionContext(client, event.context, this.#world)); }); this.#client.on('Runtime.consoleAPICalled', async (event) => { try { return consoleAPICalled(event.type, event.args.map((object) => { return new JSHandle_js_1.CdpJSHandle(this.#world, object); }), event.stackTrace); } catch (err) { (0, util_js_1.debugError)(err); } }); this.#client.on('Runtime.exceptionThrown', exceptionThrown); // This might fail if the target is closed before we receive all execution contexts. this.#client.send('Runtime.enable').catch(util_js_1.debugError); } /** * @internal */ mainRealm() { return this.#world; } /** * The URL of this web worker. */ url() { return this.#url; } /** * The CDP session client the WebWorker belongs to. */ get client() { return this.#client; } /** * If the function passed to the `worker.evaluate` returns a Promise, then * `worker.evaluate` would wait for the promise to resolve and return its * value. If the function passed to the `worker.evaluate` returns a * non-serializable value, then `worker.evaluate` resolves to `undefined`. * DevTools Protocol also supports transferring some additional values that * are not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`, and * bigint literals. * Shortcut for `await worker.executionContext()).evaluate(pageFunction, ...args)`. * * @param pageFunction - Function to be evaluated in the worker context. * @param args - Arguments to pass to `pageFunction`. * @returns Promise which resolves to the return value of `pageFunction`. */ async evaluate(pageFunction, ...args) { pageFunction = (0, util_js_1.withSourcePuppeteerURLIfNone)(this.evaluate.name, pageFunction); return await this.mainRealm().evaluate(pageFunction, ...args); } /** * The only difference between `worker.evaluate` and `worker.evaluateHandle` * is that `worker.evaluateHandle` returns in-page object (JSHandle). If the * function passed to the `worker.evaluateHandle` returns a `Promise`, then * `worker.evaluateHandle` would wait for the promise to resolve and return * its value. Shortcut for * `await worker.executionContext()).evaluateHandle(pageFunction, ...args)` * * @param pageFunction - Function to be evaluated in the page context. * @param args - Arguments to pass to `pageFunction`. * @returns Promise which resolves to the return value of `pageFunction`. */ async evaluateHandle(pageFunction, ...args) { pageFunction = (0, util_js_1.withSourcePuppeteerURLIfNone)(this.evaluateHandle.name, pageFunction); return await this.mainRealm().evaluateHandle(pageFunction, ...args); } } exports.WebWorker = WebWorker; //# sourceMappingURL=WebWorker.js.map