Path: blob/main/src/client/native/function.js
305 views
import EventEmitter from "events";1import HookEvent from "../hook.js";23/**4* @typedef {import('../index').default} UVClient5*/67class FunctionHook extends EventEmitter {8/**9*10* @param {UVClient} ctx11*/12constructor(ctx) {13super();14this.ctx = ctx;15this.window = ctx.window;16this.Function = this.window.Function;17this.fnProto = this.Function.prototype;18this.toString = this.fnProto.toString;19this.fnStrings = ctx.fnStrings;20this.call = this.fnProto.call;21this.apply = this.fnProto.apply;22this.bind = this.fnProto.bind;23}24overrideFunction() {25this.ctx.override(26this.window,27"Function",28(target, that, args) => {29if (!args.length) return target.apply(that, args);3031let script = args[args.length - 1];32let fnArgs = [];3334for (let i = 0; i < args.length - 1; i++) {35fnArgs.push(args[i]);36}3738const event = new HookEvent({ script, args: fnArgs }, target, that);39this.emit("function", event);4041if (event.intercepted) return event.returnValue;42return event.target.call(43event.that,44...event.data.args,45event.data.script46);47},48true49);50}51overrideToString() {52this.ctx.override(this.fnProto, "toString", (target, that) => {53const event = new HookEvent({ fn: that }, target, that);54this.emit("toString", event);5556if (event.intercepted) return event.returnValue;57return event.target.call(event.data.fn);58});59}60}6162export default FunctionHook;636465