puppeteer-core
Version:
A high-level API to control headless Chrome over the DevTools Protocol
129 lines • 6.45 kB
JavaScript
/**
* Copyright 2017 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Connection_instances, _Connection_transport, _Connection_delay, _Connection_lastId, _Connection_closed, _Connection_callbacks, _Connection_onClose;
import { debug } from '../Debug.js';
const debugProtocolSend = debug('puppeteer:webDriverBiDi:SEND ►');
const debugProtocolReceive = debug('puppeteer:webDriverBiDi:RECV ◀');
import { EventEmitter } from '../EventEmitter.js';
import { ProtocolError } from '../Errors.js';
/**
* @internal
*/
export class Connection extends EventEmitter {
constructor(transport, delay = 0) {
super();
_Connection_instances.add(this);
_Connection_transport.set(this, void 0);
_Connection_delay.set(this, void 0);
_Connection_lastId.set(this, 0);
_Connection_closed.set(this, false);
_Connection_callbacks.set(this, new Map());
__classPrivateFieldSet(this, _Connection_delay, delay, "f");
__classPrivateFieldSet(this, _Connection_transport, transport, "f");
__classPrivateFieldGet(this, _Connection_transport, "f").onmessage = this.onMessage.bind(this);
__classPrivateFieldGet(this, _Connection_transport, "f").onclose = __classPrivateFieldGet(this, _Connection_instances, "m", _Connection_onClose).bind(this);
}
get closed() {
return __classPrivateFieldGet(this, _Connection_closed, "f");
}
send(method, params) {
var _a;
const id = __classPrivateFieldSet(this, _Connection_lastId, (_a = __classPrivateFieldGet(this, _Connection_lastId, "f"), ++_a), "f");
const stringifiedMessage = JSON.stringify({
id,
method,
params,
});
debugProtocolSend(stringifiedMessage);
__classPrivateFieldGet(this, _Connection_transport, "f").send(stringifiedMessage);
return new Promise((resolve, reject) => {
__classPrivateFieldGet(this, _Connection_callbacks, "f").set(id, {
resolve,
reject,
error: new ProtocolError(),
method,
});
});
}
/**
* @internal
*/
async onMessage(message) {
if (__classPrivateFieldGet(this, _Connection_delay, "f")) {
await new Promise(f => {
return setTimeout(f, __classPrivateFieldGet(this, _Connection_delay, "f"));
});
}
debugProtocolReceive(message);
const object = JSON.parse(message);
if ('id' in object) {
const callback = __classPrivateFieldGet(this, _Connection_callbacks, "f").get(object.id);
// Callbacks could be all rejected if someone has called `.dispose()`.
if (callback) {
__classPrivateFieldGet(this, _Connection_callbacks, "f").delete(object.id);
if ('error' in object) {
callback.reject(createProtocolError(callback.error, callback.method, object));
}
else {
callback.resolve(object.result);
}
}
}
else {
this.emit(object.method, object.params);
}
}
dispose() {
__classPrivateFieldGet(this, _Connection_instances, "m", _Connection_onClose).call(this);
__classPrivateFieldGet(this, _Connection_transport, "f").close();
}
}
_Connection_transport = new WeakMap(), _Connection_delay = new WeakMap(), _Connection_lastId = new WeakMap(), _Connection_closed = new WeakMap(), _Connection_callbacks = new WeakMap(), _Connection_instances = new WeakSet(), _Connection_onClose = function _Connection_onClose() {
if (__classPrivateFieldGet(this, _Connection_closed, "f")) {
return;
}
__classPrivateFieldSet(this, _Connection_closed, true, "f");
__classPrivateFieldGet(this, _Connection_transport, "f").onmessage = undefined;
__classPrivateFieldGet(this, _Connection_transport, "f").onclose = undefined;
for (const callback of __classPrivateFieldGet(this, _Connection_callbacks, "f").values()) {
callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Connection closed.`));
}
__classPrivateFieldGet(this, _Connection_callbacks, "f").clear();
};
function rewriteError(error, message, originalMessage) {
error.message = message;
error.originalMessage = originalMessage !== null && originalMessage !== void 0 ? originalMessage : error.originalMessage;
return error;
}
function createProtocolError(error, method, object) {
let message = `Protocol error (${method}): ${object.error} ${object.message}`;
if (object.stacktrace) {
message += ` ${object.stacktrace}`;
}
return rewriteError(error, message, object.message);
}
//# sourceMappingURL=Connection.js.map