87 lines
12 KiB
JavaScript
87 lines
12 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.CdpCookieProvider = void 0;
|
|
const url_1 = require("url");
|
|
const base_1 = require("../test-run/cookies/base");
|
|
const match_collection_1 = __importDefault(require("../utils/match-collection"));
|
|
const get_active_client_1 = require("./utils/get-active-client");
|
|
const MAX_TIMESTAMP = 8640000000000000;
|
|
class CdpCookieProvider extends base_1.CookieProviderBase {
|
|
async _getCdpClient() {
|
|
const browserConnection = this.testRun.browserConnection;
|
|
return (0, get_active_client_1.getActiveClient)(browserConnection);
|
|
}
|
|
async initialize() {
|
|
return this.deleteCookies();
|
|
}
|
|
async getCookies(externalCookies) {
|
|
const client = await this._getCdpClient();
|
|
const { cookies } = await client.Storage.getCookies({});
|
|
return (0, match_collection_1.default)(cookies, externalCookies).map(this._cdpCookieToExternalCookie);
|
|
}
|
|
async setCookies(cookies, url) {
|
|
const client = await this._getCdpClient();
|
|
const { hostname = '', pathname = '/' } = url ? new url_1.URL(url) : {};
|
|
await client.Network.setCookies({
|
|
cookies: cookies.map(cookie => this._cookieOptionToCdpCookieParam(cookie, hostname, pathname)),
|
|
});
|
|
}
|
|
async deleteCookies(cookies = [], urls = []) {
|
|
const client = await this._getCdpClient();
|
|
if (!cookies || !cookies.length)
|
|
return client.Network.clearBrowserCookies();
|
|
const parsedUrls = this._parseUrls(urls);
|
|
let existingCookies = await this.getCookies([]);
|
|
if (parsedUrls.length) {
|
|
existingCookies = existingCookies.filter(cookie => parsedUrls
|
|
.find(url => url.domain === cookie.domain && url.path === cookie.path));
|
|
}
|
|
existingCookies = (0, match_collection_1.default)(existingCookies, cookies);
|
|
for (const cookie of existingCookies) {
|
|
await client.Network.deleteCookies({
|
|
name: cookie.name,
|
|
domain: cookie.domain,
|
|
path: cookie.path,
|
|
});
|
|
}
|
|
return void 0;
|
|
}
|
|
_cdpCookieToExternalCookie(cookie) {
|
|
var _a;
|
|
return {
|
|
name: cookie.name,
|
|
value: cookie.value,
|
|
domain: cookie.domain,
|
|
maxAge: void 0,
|
|
path: cookie.path,
|
|
expires: void 0,
|
|
secure: cookie.secure,
|
|
httpOnly: cookie.httpOnly,
|
|
sameSite: (_a = cookie.sameSite) !== null && _a !== void 0 ? _a : 'none',
|
|
};
|
|
}
|
|
_cookieOptionToCdpCookieParam(cookie, hostname, pathname) {
|
|
var _a, _b, _c;
|
|
return {
|
|
name: cookie.name,
|
|
value: cookie.value,
|
|
domain: (_a = cookie.domain) !== null && _a !== void 0 ? _a : hostname,
|
|
path: (_b = cookie.path) !== null && _b !== void 0 ? _b : pathname,
|
|
secure: cookie.secure,
|
|
httpOnly: false,
|
|
sameSite: cookie.sameSite,
|
|
expires: ((_c = cookie.expires) === null || _c === void 0 ? void 0 : _c.getTime()) || MAX_TIMESTAMP,
|
|
};
|
|
}
|
|
_parseUrls(urls) {
|
|
return urls.map(url => {
|
|
const { hostname, pathname } = new url_1.URL(url);
|
|
return { domain: hostname, path: pathname };
|
|
});
|
|
}
|
|
}
|
|
exports.CdpCookieProvider = CdpCookieProvider;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3h5bGVzcy9jb29raWUtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUEsNkJBQTBCO0FBRTFCLG1EQUE4RTtBQUU5RSxpRkFBd0Q7QUFDeEQsaUVBQTREO0FBSTVELE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBRXZDLE1BQWEsaUJBQWtCLFNBQVEseUJBQWtCO0lBQzdDLEtBQUssQ0FBQyxhQUFhO1FBQ3ZCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUV6RCxPQUFPLElBQUEsbUNBQWUsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFFLGVBQWtDO1FBQ2hELE1BQU0sTUFBTSxHQUFRLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9DLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE9BQVEsSUFBQSwwQkFBZSxFQUFDLE9BQU8sRUFBRSxlQUFlLENBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDeEcsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUUsT0FBd0IsRUFBRSxHQUFXO1FBQ25ELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsRUFBRSxFQUFFLFFBQVEsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBRyxDQUFD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Q0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLFNBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUU1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUF4RkQsOENBd0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlbW90ZUNocm9tZSBmcm9tICdjaHJvbWUtcmVtb3RlLWludGVyZmFjZSc7XG5pbXBvcnQgeyBFeHRlcm5hbENvb2tpZXMgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCBQcm90b2NvbCBmcm9tICdkZXZ0b29scy1wcm90b2NvbCc7XG5pbXBvcnQgQ29va2llID0gUHJvdG9jb2wuTmV0d29yay5Db29raWU7XG5pbXBvcnQgeyBVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQ29va2llT3B0aW9ucyB9IGZyb20gJy4uL3Rlc3QtcnVuL2NvbW1hbmRzL29wdGlvbnMnO1xuaW1wb3J0IHsgQ29va2llUHJvdmlkZXIsIENvb2tpZVByb3ZpZGVyQmFzZSB9IGZyb20gJy4uL3Rlc3QtcnVuL2Nvb2tpZXMvYmFzZSc7XG5pbXBvcnQgQ29va2llUGFyYW0gPSBQcm90b2NvbC5OZXR3b3JrLkNvb2tpZVBhcmFtO1xuaW1wb3J0IG1hdGNoQ29sbGVjdGlvbiBmcm9tICcuLi91dGlscy9tYXRjaC1jb2xsZWN0aW9uJztcbmltcG9ydCB7IGdldEFjdGl2ZUNsaWVudCB9IGZyb20gJy4vdXRpbHMvZ2V0LWFjdGl2ZS1jbGllbnQnO1xuXG5kZWNsYXJlIHR5cGUgQ29va2llU2FtZVNpdGUgPSAnTGF4JyB8ICdTdHJpY3QnIHwgJ05vbmUnO1xuXG5jb25zdCBNQVhfVElNRVNUQU1QID0gODY0MDAwMDAwMDAwMDAwMDtcblxuZXhwb3J0IGNsYXNzIENkcENvb2tpZVByb3ZpZGVyIGV4dGVuZHMgQ29va2llUHJvdmlkZXJCYXNlIGltcGxlbWVudHMgQ29va2llUHJvdmlkZXIge1xuICAgIHByaXZhdGUgYXN5bmMgX2dldENkcENsaWVudCAoKTogUHJvbWlzZTxyZW1vdGVDaHJvbWUuUHJvdG9jb2xBcGk+IHtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbm5lY3Rpb24gPSB0aGlzLnRlc3RSdW4uYnJvd3NlckNvbm5lY3Rpb247XG5cbiAgICAgICAgcmV0dXJuIGdldEFjdGl2ZUNsaWVudChicm93c2VyQ29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbGl6ZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUNvb2tpZXMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRDb29raWVzIChleHRlcm5hbENvb2tpZXM6IEV4dGVybmFsQ29va2llc1tdKTogUHJvbWlzZTxFeHRlcm5hbENvb2tpZXNbXT4ge1xuICAgICAgICBjb25zdCBjbGllbnQgICAgICA9IGF3YWl0IHRoaXMuX2dldENkcENsaWVudCgpO1xuICAgICAgICBjb25zdCB7IGNvb2tpZXMgfSA9IGF3YWl0IGNsaWVudC5TdG9yYWdlLmdldENvb2tpZXMoe30pO1xuXG4gICAgICAgIHJldHVybiAobWF0Y2hDb2xsZWN0aW9uKGNvb2tpZXMsIGV4dGVybmFsQ29va2llcykgYXMgQ29va2llW10pLm1hcCh0aGlzLl9jZHBDb29raWVUb0V4dGVybmFsQ29va2llKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRDb29raWVzIChjb29raWVzOiBDb29raWVPcHRpb25zW10sIHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuX2dldENkcENsaWVudCgpO1xuICAgICAgICBjb25zdCB7IGhvc3RuYW1lID0gJycsIHBhdGhuYW1lID0gJy8nIH0gPSB1cmwgPyBuZXcgVVJMKHVybCkgOiB7fTtcblxuICAgICAgICBhd2FpdCBjbGllbnQuTmV0d29yay5zZXRDb29raWVzKHtcbiAgICAgICAgICAgIGNvb2tpZXM6IGNvb2tpZXMubWFwKGNvb2tpZSA9PiB0aGlzLl9jb29raWVPcHRpb25Ub0NkcENvb2tpZVBhcmFtKGNvb2tpZSwgaG9zdG5hbWUsIHBhdGhuYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZUNvb2tpZXMgKGNvb2tpZXM6IENvb2tpZU9wdGlvbnNbXSA9IFtdLCB1cmxzOiBzdHJpbmdbXSA9IFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuX2dldENkcENsaWVudCgpO1xuXG4gICAgICAgIGlmICghY29va2llcyB8fCAhY29va2llcy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gY2xpZW50Lk5ldHdvcmsuY2xlYXJCcm93c2VyQ29va2llcygpO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFVybHMgICAgPSB0aGlzLl9wYXJzZVVybHModXJscyk7XG4gICAgICAgIGxldCBleGlzdGluZ0Nvb2tpZXMgPSBhd2FpdCB0aGlzLmdldENvb2tpZXMoW10pO1xuXG4gICAgICAgIGlmIChwYXJzZWRVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgZXhpc3RpbmdDb29raWVzID0gZXhpc3RpbmdDb29raWVzLmZpbHRlcihjb29raWUgPT4gcGFyc2VkVXJsc1xuICAgICAgICAgICAgICAgIC5maW5kKHVybCA9PiB1cmwuZG9tYWluID09PSBjb29raWUuZG9tYWluICYmIHVybC5wYXRoID09PSBjb29raWUucGF0aCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXhpc3RpbmdDb29raWVzID0gbWF0Y2hDb2xsZWN0aW9uKGV4aXN0aW5nQ29va2llcywgY29va2llcykgYXMgRXh0ZXJuYWxDb29raWVzW107XG5cbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgZXhpc3RpbmdDb29raWVzKSB7XG4gICAgICAgICAgICBhd2FpdCBjbGllbnQuTmV0d29yay5kZWxldGVDb29raWVzKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAgIGNvb2tpZS5uYW1lLFxuICAgICAgICAgICAgICAgIGRvbWFpbjogY29va2llLmRvbWFpbixcbiAgICAgICAgICAgICAgICBwYXRoOiAgIGNvb2tpZS5wYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NkcENvb2tpZVRvRXh0ZXJuYWxDb29raWUgKGNvb2tpZTogQ29va2llKTogRXh0ZXJuYWxDb29raWVzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICAgICBjb29raWUubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiAgICBjb29raWUudmFsdWUsXG4gICAgICAgICAgICBkb21haW46ICAgY29va2llLmRvbWFpbixcbiAgICAgICAgICAgIG1heEFnZTogICB2b2lkIDAsXG4gICAgICAgICAgICBwYXRoOiAgICAgY29va2llLnBhdGgsXG4gICAgICAgICAgICBleHBpcmVzOiAgdm9pZCAwLFxuICAgICAgICAgICAgc2VjdXJlOiAgIGNvb2tpZS5zZWN1cmUsXG4gICAgICAgICAgICBodHRwT25seTogY29va2llLmh0dHBPbmx5LFxuICAgICAgICAgICAgc2FtZVNpdGU6IGNvb2tpZS5zYW1lU2l0ZSA/PyAnbm9uZScsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBFeHRlcm5hbENvb2tpZXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29va2llT3B0aW9uVG9DZHBDb29raWVQYXJhbSAoY29va2llOiBDb29raWVPcHRpb25zLCBob3N0bmFtZTogc3RyaW5nLCBwYXRobmFtZTogc3RyaW5nKTogQ29va2llUGFyYW0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogICAgIGNvb2tpZS5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6ICAgIGNvb2tpZS52YWx1ZSxcbiAgICAgICAgICAgIGRvbWFpbjogICBjb29raWUuZG9tYWluID8/IGhvc3RuYW1lLFxuICAgICAgICAgICAgcGF0aDogICAgIGNvb2tpZS5wYXRoID8/IHBhdGhuYW1lLFxuICAgICAgICAgICAgc2VjdXJlOiAgIGNvb2tpZS5zZWN1cmUsXG4gICAgICAgICAgICBodHRwT25seTogZmFsc2UsXG4gICAgICAgICAgICBzYW1lU2l0ZTogY29va2llLnNhbWVTaXRlIGFzIENvb2tpZVNhbWVTaXRlLFxuICAgICAgICAgICAgZXhwaXJlczogIGNvb2tpZS5leHBpcmVzPy5nZXRUaW1lKCkgfHwgTUFYX1RJTUVTVEFNUCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVVybHMgKHVybHM6IHN0cmluZ1tdKTogeyBkb21haW46IHN0cmluZywgcGF0aDogc3RyaW5nIH1bXSB7XG4gICAgICAgIHJldHVybiB1cmxzLm1hcCh1cmwgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBob3N0bmFtZSwgcGF0aG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgZG9tYWluOiBob3N0bmFtZSwgcGF0aDogcGF0aG5hbWUgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|