bezier-mouse-js
Version:
Lightweight library to generate human-like mouse movements with Bézier curves.
1 lines • 6.59 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/BezierMouse.ts","../src/utils.ts"],"sourcesContent":["export { BezierMouse } from \"./BezierMouse.js\";\nexport { BezierMouse as default } from \"./BezierMouse.js\";\nexport type { Point, BezierMouseOptions, ClickType } from \"./types.js\";\nexport { default as utils } from \"./utils.js\";\n","import { Bezier } from \"bezier-js\";\nimport utils from \"./utils.js\";\nimport type { Point, BezierMouseOptions, ClickType } from \"./types.js\";\n\nconst { abs, ceil } = Math;\n\ntype NutJsModule = typeof import(\"@nut-tree/nut-js\");\n\nexport class BezierMouse {\n private mouseSpeed: number;\n private nutJsModule: NutJsModule | null = null;\n\n constructor(mouseSpeed: number = 100) {\n this.mouseSpeed = mouseSpeed;\n }\n\n private async getNutJs(): Promise<NutJsModule> {\n if (!this.nutJsModule) {\n try {\n this.nutJsModule = await import(\"@nut-tree/nut-js\");\n this.nutJsModule.mouse.config.mouseSpeed = this.mouseSpeed;\n } catch {\n throw new Error(\n \"bezier-mouse-js: @nut-tree/nut-js is required for mouse control methods. \" +\n \"Install it with: npm install @nut-tree/nut-js\"\n );\n }\n }\n return this.nutJsModule;\n }\n\n async moveAndClick(\n initPos: Point,\n finPos: Point,\n clickType: ClickType = \"LEFT\",\n opts: BezierMouseOptions = {}\n ): Promise<void> {\n const nut = await this.getNutJs();\n await this.move(initPos, finPos, opts);\n await nut.mouse.click(nut.Button[clickType]);\n }\n\n async moveAndDoubleClick(\n initPos: Point,\n finPos: Point,\n clickType: ClickType = \"LEFT\",\n opts: BezierMouseOptions = {}\n ): Promise<void> {\n const nut = await this.getNutJs();\n await this.move(initPos, finPos, opts);\n await nut.mouse.doubleClick(nut.Button[clickType]);\n }\n\n async move(\n initPos: Point,\n finPos: Point,\n opts: BezierMouseOptions = {}\n ): Promise<void> {\n const nut = await this.getNutJs();\n let finishPosition = finPos;\n if (!opts.preciseClick) {\n const deviation = 5;\n const randDeviation = () => utils.randint(deviation / 2, deviation);\n const region = new nut.Region(\n finPos.x,\n finPos.y,\n randDeviation(),\n randDeviation()\n );\n finishPosition = await nut.randomPointIn(region);\n }\n const path = this.bezierCurveTo(initPos, finishPosition, opts);\n const nutPoints = path.map((p) => new nut.Point(p.x, p.y));\n await nut.mouse.move(nutPoints);\n }\n\n bezierCurveTo(\n initPos: Point,\n finPos: Point,\n opts: BezierMouseOptions = {}\n ): Point[] {\n const curve = this.cubicBezierCurve(initPos, finPos, opts);\n const LUT = curve.getLUT(opts.steps || 100);\n return LUT.map((point) => ({ x: point.x, y: point.y }));\n }\n\n cubicBezierCurve(\n initPos: Point,\n finPos: Point,\n opts: BezierMouseOptions = {}\n ): Bezier {\n const cntlPt1 = this.getBezierControlPoint(initPos, finPos, opts);\n const cntlPt2 = this.getBezierControlPoint(initPos, finPos, opts);\n return new Bezier([initPos, cntlPt1, cntlPt2, finPos]);\n }\n\n getBezierControlPoint(\n initPos: Point,\n finPos: Point,\n opts: BezierMouseOptions = {}\n ): Point {\n const { deviation = 20, flip = false } = opts;\n const deltaX = abs(ceil(finPos.x) - ceil(initPos.x));\n const deltaY = abs(ceil(finPos.y) - ceil(initPos.y));\n const randDeviation = () => utils.randint(deviation / 2, deviation);\n const refPointX = flip ? initPos.x : finPos.x;\n const refPointY = flip ? initPos.y : finPos.y;\n return {\n x: refPointX + utils.choice([-1, 1]) * deltaX * 0.01 * randDeviation(),\n y: refPointY + utils.choice([-1, 1]) * deltaY * 0.01 * randDeviation(),\n };\n }\n}\n","const { floor, random } = Math;\n\nfunction choice<T>(items: T[]): T {\n return items[floor(random() * items.length)];\n}\n\nfunction randint(min: number, max: number): number {\n return floor(random() * (max - min + 1)) + min;\n}\n\nconst utils = { choice, randint };\nexport default utils;\n"],"mappings":"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","names":[]}