Path: blob/main/plugins/execute-js/lib/ClientPlugin.ts
2579 views
import { ISendToCoreFn } from '@secret-agent/interfaces/IClientPlugin';1import ClientPlugin from '@secret-agent/plugin-utils/lib/ClientPlugin';2import type { Agent, Tab, FrameEnvironment } from 'secret-agent';3import { IExecuteJsArgs } from './IExecuteJsArgs';45const { name: pluginId } = require('../package.json');67export default class ExecuteJsClientPlugin extends ClientPlugin {8public static id = pluginId;9public static coreDependencyIds = [pluginId];1011public onAgent(agent: Agent, sendToCore: ISendToCoreFn) {12agent.executeJs = this.executeJs.bind(this, sendToCore);13}1415public onTab(agent: Agent, tab: Tab, sendToCore: ISendToCoreFn) {16tab.executeJs = this.executeJs.bind(this, sendToCore);17}1819public onFrameEnvironment(20agent: Agent,21frameEnvironment: FrameEnvironment,22sendToCore: ISendToCoreFn,23) {24frameEnvironment.executeJs = this.executeJs.bind(this, sendToCore);25}2627// PRIVATE2829private executeJs<T extends any[]>(30sendToCore: ISendToCoreFn,31fn: string | ((...args: T) => any),32...args: T33): Promise<any> {34let fnName = '';35let fnSerialized = fn as string;36if (typeof fn !== 'string') {37fnName = fn.name;38fnSerialized = `(${fn.toString()})(${JSON.stringify(args).slice(1, -1)});`;39}40return sendToCore(pluginId, <IExecuteJsArgs>{41fnName,42fnSerialized,43args,44isolateFromWebPageEnvironment: false,45});46}47}484950