@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
113 lines • 17.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const error_list_1 = __importDefault(require("../../../errors/error-list"));
const async_event_emitter_1 = __importDefault(require("../../../utils/async-event-emitter"));
const interfaces_1 = require("./interfaces");
const prerender_callsite_1 = __importDefault(require("../../../utils/prerender-callsite"));
class IPCProxy extends async_event_emitter_1.default {
constructor(transport) {
super();
this._requestCounter = 0;
this._transport = transport;
this._handlers = {};
this._transport.read();
this._transport.on(interfaces_1.IPCTransportEvents.data, rawPacket => this._onRead(rawPacket));
this.on('request', data => this._onRequest(data));
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
_saveError(error) {
if (interfaces_1.isTestCafeErrorList(error)) {
for (const item of error.items) {
if (item.callsite)
item.callsite = prerender_callsite_1.default(item.callsite);
}
return error;
}
// NOTE: The properties of the 'Error' class lost during serialization using the 'JSON.stringify' way
// because they are not enumerable.
// We clone the object and copy these properties explicitly to mark these properties as enumerable.
const errorData = Object.assign({}, error);
errorData.name = errorData.name || error.name;
errorData.message = errorData.message || error.message;
errorData.stack = errorData.stack || error.stack;
return errorData;
}
async _onRead(packet) {
if (packet.type === interfaces_1.IPCPacketType.response)
this.emit(`response-${packet.id}`, packet);
else
this.emit('request', packet);
}
async _onRequest(requestPacket) {
let resultData = null;
try {
resultData = { result: await this._handlers[requestPacket.data.name](...requestPacket.data.args) };
}
catch (error) {
resultData = { error: this._saveError(error) };
}
const responsePacket = {
id: requestPacket.id,
type: interfaces_1.IPCPacketType.response,
sync: requestPacket.sync,
data: resultData
};
await this._transport.write(responsePacket);
}
_createPacket(opts) {
return {
id: this._requestCounter++,
type: interfaces_1.IPCPacketType.request,
sync: opts.sync,
data: opts.data
};
}
_createPlainError(errorData) {
const error = new Error(errorData.message);
Object.assign(error, errorData);
return error;
}
_createError(errorData) {
if (interfaces_1.isTestCafeErrorList(errorData)) {
const errorList = new error_list_1.default();
errorList.items = errorData.items;
return errorList;
}
return this._createPlainError(errorData);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register(func, context = null) {
if (this._handlers[func.name])
return;
this._handlers[func.name] = func.bind(context);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async call(target, ...args) {
const name = typeof target === 'string' ? target : target.name;
const packet = this._createPacket({ data: { name, args }, sync: false });
const responsePromise = this.once(`response-${packet.id}`);
await this._transport.write(packet);
const { data } = await responsePromise;
if (interfaces_1.isIPCErrorResponse(data))
throw this._createError(data.error);
return data.result;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callSync(target, ...args) {
const name = typeof target === 'string' ? target : target.name;
const requestPacket = this._createPacket({ data: { name, args }, sync: true });
this._transport.writeSync(requestPacket);
let responsePacket = this._transport.readSync();
while (responsePacket.id !== requestPacket.id)
responsePacket = this._transport.readSync();
const response = responsePacket.data;
if (interfaces_1.isIPCErrorResponse(response))
throw this._createError(response.error);
return response.result;
}
}
exports.IPCProxy = IPCProxy;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvdXRpbHMvaXBjL3Byb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNEVBQTJEO0FBQzNELDZGQUE4RDtBQUU5RCw2Q0Fhc0I7QUFFdEIsMkZBQWtFO0FBUWxFLE1BQWEsUUFBUyxTQUFRLDZCQUFZO0lBS3RDLFlBQW9CLFNBQXVCO1FBQ3ZDLEtBQUssRUFBRSxDQUFDO1FBSkosb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFNaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFFNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQywrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELDhEQUE4RDtJQUN0RCxVQUFVLENBQUUsS0FBb0I7UUFDcEMsSUFBSSxnQ0FBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQzVCLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyw0QkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEQ7WUFFRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELHFHQUFxRztRQUNyRyxtQ0FBbUM7UUFDbkMsbUdBQW1HO1FBQ25HLE1B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QztRQUV6QyxJQUFJLGNBQWMsR0FBc0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVuRSxPQUFPLGNBQWMsQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLEVBQUU7WUFDekMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztRQUVyQyxJQUFJLCtCQUFrQixDQUFDLFFBQVEsQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0NBQ0o7QUE1SUQsNEJBNElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlc3RDYWZlRXJyb3JMaXN0IGZyb20gJy4uLy4uLy4uL2Vycm9ycy9lcnJvci1saXN0JztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXN5bmMtZXZlbnQtZW1pdHRlcic7XG5cbmltcG9ydCB7XG4gICAgRXh0ZXJuYWxFcnJvcixcbiAgICBpc1Rlc3RDYWZlRXJyb3JMaXN0LFxuXG4gICAgSVBDUGFja2V0LFxuICAgIElQQ1BhY2tldFR5cGUsXG4gICAgSVBDUmVxdWVzdFBhY2tldCxcbiAgICBJUENSZXNwb25zZVBhY2tldCxcbiAgICBJUENSZXF1ZXN0RGF0YSxcbiAgICBpc0lQQ0Vycm9yUmVzcG9uc2UsXG5cbiAgICBJUENUcmFuc3BvcnRFdmVudHMsXG4gICAgSVBDVHJhbnNwb3J0LFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgcHJlcmVuZGVyQ2FsbHNpdGUgZnJvbSAnLi4vLi4vLi4vdXRpbHMvcHJlcmVuZGVyLWNhbGxzaXRlJztcblxuXG5pbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnMge1xuICAgIGRhdGE6IElQQ1JlcXVlc3REYXRhO1xuICAgIHN5bmM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBJUENQcm94eSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgcHJpdmF0ZSBfdHJhbnNwb3J0OiBJUENUcmFuc3BvcnQ7XG4gICAgcHJpdmF0ZSBfcmVxdWVzdENvdW50ZXI6IG51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGFuZGxlcnM6IHsgW25hbWU6IHN0cmluZ106IEZ1bmN0aW9uIH07XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHRyYW5zcG9ydDogSVBDVHJhbnNwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuXG4gICAgICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0LnJlYWQoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNwb3J0Lm9uKElQQ1RyYW5zcG9ydEV2ZW50cy5kYXRhLCByYXdQYWNrZXQgPT4gdGhpcy5fb25SZWFkKHJhd1BhY2tldCkpO1xuICAgICAgICB0aGlzLm9uKCdyZXF1ZXN0JywgZGF0YSA9PiB0aGlzLl9vblJlcXVlc3QoZGF0YSkpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJpdmF0ZSBfc2F2ZUVycm9yIChlcnJvcjogRXh0ZXJuYWxFcnJvcik6IGFueSB7XG4gICAgICAgIGlmIChpc1Rlc3RDYWZlRXJyb3JMaXN0KGVycm9yKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGVycm9yLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY2FsbHNpdGUpXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY2FsbHNpdGUgPSBwcmVyZW5kZXJDYWxsc2l0ZShpdGVtLmNhbGxzaXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogVGhlIHByb3BlcnRpZXMgb2YgdGhlICdFcnJvcicgY2xhc3MgbG9zdCBkdXJpbmcgc2VyaWFsaXphdGlvbiB1c2luZyB0aGUgJ0pTT04uc3RyaW5naWZ5JyB3YXlcbiAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBub3QgZW51bWVyYWJsZS5cbiAgICAgICAgLy8gV2UgY2xvbmUgdGhlIG9iamVjdCBhbmQgY29weSB0aGVzZSBwcm9wZXJ0aWVzIGV4cGxpY2l0bHkgdG8gbWFyayB0aGVzZSBwcm9wZXJ0aWVzIGFzIGVudW1lcmFibGUuXG4gICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGVycm9yKTtcblxuICAgICAgICBlcnJvckRhdGEubmFtZSAgICA9IGVycm9yRGF0YS5uYW1lIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGVycm9yRGF0YS5tZXNzYWdlID0gZXJyb3JEYXRhLm1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZTtcbiAgICAgICAgZXJyb3JEYXRhLnN0YWNrICAgPSBlcnJvckRhdGEuc3RhY2sgfHwgZXJyb3Iuc3RhY2s7XG5cbiAgICAgICAgcmV0dXJuIGVycm9yRGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vblJlYWQgKHBhY2tldDogSVBDUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChwYWNrZXQudHlwZSA9PT0gSVBDUGFja2V0VHlwZS5yZXNwb25zZSlcbiAgICAgICAgICAgIHRoaXMuZW1pdChgcmVzcG9uc2UtJHtwYWNrZXQuaWR9YCwgcGFja2V0KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgcGFja2V0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vblJlcXVlc3QgKHJlcXVlc3RQYWNrZXQ6IElQQ1JlcXVlc3RQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdERhdGEgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHREYXRhID0geyByZXN1bHQ6IGF3YWl0IHRoaXMuX2hhbmRsZXJzW3JlcXVlc3RQYWNrZXQuZGF0YS5uYW1lXSguLi5yZXF1ZXN0UGFja2V0LmRhdGEuYXJncykgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdERhdGEgPSB7IGVycm9yOiB0aGlzLl9zYXZlRXJyb3IoZXJyb3IpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVBhY2tldDogSVBDUmVzcG9uc2VQYWNrZXQgPSB7XG4gICAgICAgICAgICBpZDogICByZXF1ZXN0UGFja2V0LmlkLFxuICAgICAgICAgICAgdHlwZTogSVBDUGFja2V0VHlwZS5yZXNwb25zZSxcbiAgICAgICAgICAgIHN5bmM6IHJlcXVlc3RQYWNrZXQuc3luYyxcblxuICAgICAgICAgICAgZGF0YTogcmVzdWx0RGF0YVxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3RyYW5zcG9ydC53cml0ZShyZXNwb25zZVBhY2tldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlUGFja2V0IChvcHRzOiBSZXF1ZXN0T3B0aW9ucyk6IElQQ1JlcXVlc3RQYWNrZXQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgdGhpcy5fcmVxdWVzdENvdW50ZXIrKyxcbiAgICAgICAgICAgIHR5cGU6IElQQ1BhY2tldFR5cGUucmVxdWVzdCxcbiAgICAgICAgICAgIHN5bmM6IG9wdHMuc3luYyxcbiAgICAgICAgICAgIGRhdGE6IG9wdHMuZGF0YVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZVBsYWluRXJyb3IgKGVycm9yRGF0YTogRXJyb3IpOiBFcnJvciB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGVycm9yRGF0YS5tZXNzYWdlKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCBlcnJvckRhdGEpO1xuXG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVFcnJvciAoZXJyb3JEYXRhOiBFeHRlcm5hbEVycm9yKTogRXh0ZXJuYWxFcnJvciB7XG4gICAgICAgIGlmIChpc1Rlc3RDYWZlRXJyb3JMaXN0KGVycm9yRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTGlzdCA9IG5ldyBUZXN0Q2FmZUVycm9yTGlzdCgpO1xuXG4gICAgICAgICAgICBlcnJvckxpc3QuaXRlbXMgPSBlcnJvckRhdGEuaXRlbXM7XG5cbiAgICAgICAgICAgIHJldHVybiBlcnJvckxpc3Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUGxhaW5FcnJvcihlcnJvckRhdGEpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIHJlZ2lzdGVyIChmdW5jOiBGdW5jdGlvbiwgY29udGV4dDogYW55ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faGFuZGxlcnNbZnVuYy5uYW1lXSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLl9oYW5kbGVyc1tmdW5jLm5hbWVdID0gZnVuYy5iaW5kKGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIGFzeW5jIGNhbGwgKHRhcmdldDogc3RyaW5nfEZ1bmN0aW9uLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgICAgICAgICAgICA9IHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnID8gdGFyZ2V0IDogdGFyZ2V0Lm5hbWU7XG4gICAgICAgIGNvbnN0IHBhY2tldCAgICAgICAgICA9IHRoaXMuX2NyZWF0ZVBhY2tldCh7IGRhdGE6IHsgbmFtZSwgYXJncyB9LCBzeW5jOiBmYWxzZSB9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gdGhpcy5vbmNlKGByZXNwb25zZS0ke3BhY2tldC5pZH1gKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl90cmFuc3BvcnQud3JpdGUocGFja2V0KTtcblxuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHJlc3BvbnNlUHJvbWlzZTtcblxuICAgICAgICBpZiAoaXNJUENFcnJvclJlc3BvbnNlKGRhdGEpKVxuICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoZGF0YS5lcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0O1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIGNhbGxTeW5jICh0YXJnZXQ6IHN0cmluZ3xGdW5jdGlvbiwgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgICAgICBjb25zdCBuYW1lICAgICAgICAgID0gdHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgPyB0YXJnZXQgOiB0YXJnZXQubmFtZTtcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhY2tldCA9IHRoaXMuX2NyZWF0ZVBhY2tldCh7IGRhdGE6IHsgbmFtZSwgYXJncyB9LCBzeW5jOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zcG9ydC53cml0ZVN5bmMocmVxdWVzdFBhY2tldCk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlUGFja2V0OiBJUENSZXNwb25zZVBhY2tldCA9IHRoaXMuX3RyYW5zcG9ydC5yZWFkU3luYygpO1xuXG4gICAgICAgIHdoaWxlIChyZXNwb25zZVBhY2tldC5pZCAhPT0gcmVxdWVzdFBhY2tldC5pZClcbiAgICAgICAgICAgIHJlc3BvbnNlUGFja2V0ID0gdGhpcy5fdHJhbnNwb3J0LnJlYWRTeW5jKCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXNwb25zZVBhY2tldC5kYXRhO1xuXG4gICAgICAgIGlmIChpc0lQQ0Vycm9yUmVzcG9uc2UocmVzcG9uc2UpKVxuICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IocmVzcG9uc2UuZXJyb3IpO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG4gICAgfVxufVxuIl19