UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

113 lines 17.1 kB
"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