JS Подмена информации о состоянии батареи

Рейтинг: 0Ответов: 1Опубликовано: 14.05.2023

Я использую puppeteer-extra-plugin-stealth для подмены отпечатков браузера. В данный момент меня волнует подмена состояния батареи navigator.getBattery. Пробую сделать это таким образом (чтобы зафиксировать изменения было невозможно):

utils.replaceWithProxy(Object.getPrototypeOf(navigator), 'getBattery', {
    apply: (target, ctx, args) => {
        var promise = utils.cache.Reflect.apply(...arguments);
        /*
        const batteryMgr = await promise;
        utils.replaceProperty(batteryMgr, 'charging', { get: () => true });
        utils.replaceProperty(batteryMgr, 'chargingTime', { get: () => 0 });
        utils.replaceProperty(batteryMgr, 'dischargingTime', { get: () => Infinity });
        utils.replaceProperty(batteryMgr, 'level', { get: () => 1 });
        */
        return promise; //Promise.resolve(batteryMgr);
    }
});

Однако реализованный метод replaceWithProxy не принимает асинхронные обработчики. Как сделать правильную подмену чтобы метод остался асинхронным? Допускается изменять replaceWithProxy.

Ответы

▲ 1Принят
utils.replaceWithProxy(Object.getPrototypeOf(navigator), 'getBattery', {
    apply: async (target, ctx, args) => {
        var batteryMgr = await utils.cache.Reflect.apply(target, ctx, args);
        utils.replaceGetterWithProxy(Object.getPrototypeOf(batteryMgr), 'charging', utils.makeHandler().getterValue(true));
        utils.replaceGetterWithProxy(Object.getPrototypeOf(batteryMgr), 'chargingTime', utils.makeHandler().getterValue(0));
        utils.replaceGetterWithProxy(Object.getPrototypeOf(batteryMgr), 'dischargingTime', utils.makeHandler().getterValue(Infinity));
        utils.replaceGetterWithProxy(Object.getPrototypeOf(batteryMgr), 'level', utils.makeHandler().getterValue(1));
        return Promise.resolve(batteryMgr);
    }
});