From 9666eefce436204397cd025167549cb0034ac83a Mon Sep 17 00:00:00 2001 From: syns2191 Date: Mon, 14 Apr 2025 00:36:19 +0700 Subject: [PATCH 1/5] feat: added keyboard and mouse listener --- .../agent/src/main/workers/pull-activities.ts | 7 ++- packages/desktop-lib/package.json | 3 +- packages/desktop-lib/src/index.ts | 1 + .../src/lib/keyboard-mouse-counter.ts | 52 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 packages/desktop-lib/src/lib/keyboard-mouse-counter.ts diff --git a/apps/agent/src/main/workers/pull-activities.ts b/apps/agent/src/main/workers/pull-activities.ts index fcdcda622b3..3d78e7ffee2 100644 --- a/apps/agent/src/main/workers/pull-activities.ts +++ b/apps/agent/src/main/workers/pull-activities.ts @@ -1,6 +1,7 @@ +import { KeyboardMouseCounter } from '@gauzy/desktop-lib'; class PullActivities { static instance: PullActivities; - private listenerModule: any; + private listenerModule: KeyboardMouseCounter; private isStarted: boolean; constructor() { if (!PullActivities.instance) { @@ -20,7 +21,7 @@ class PullActivities { getListenerModule() { try { // this is not implemented yet - this.listenerModule = null; + this.listenerModule = KeyboardMouseCounter.getInstance(); } catch (error) { console.error('error on get listener module', error); } @@ -32,6 +33,7 @@ class PullActivities { } try { if (!this.isStarted) { + this.listenerModule.startListener(); this.isStarted = true; } } catch (error) { @@ -44,6 +46,7 @@ class PullActivities { this.getListenerModule(); } try { + this.listenerModule.stopListener(); this.isStarted = false; } catch (error) { console.error('error to stop tracking', error); diff --git a/packages/desktop-lib/package.json b/packages/desktop-lib/package.json index bc3f9a38674..059cf0a35b5 100644 --- a/packages/desktop-lib/package.json +++ b/packages/desktop-lib/package.json @@ -56,7 +56,8 @@ "tslib": "^2.6.2", "underscore": "^1.13.3", "undici": "^6.10.2", - "unzipper": "^0.12.1" + "unzipper": "^0.12.1", + "uiohook-napi": "^1.5.4" }, "devDependencies": { "@types/node": "^20.14.9", diff --git a/packages/desktop-lib/src/index.ts b/packages/desktop-lib/src/index.ts index 294dfa43de8..6b6b6224864 100644 --- a/packages/desktop-lib/src/index.ts +++ b/packages/desktop-lib/src/index.ts @@ -24,3 +24,4 @@ export * from './lib/strategies'; export * from './lib/translation'; export * from './lib/update-server/desktop-local-update-server'; export * from './lib/desktop-theme-listener'; +export * from './lib/keyboard-mouse-counter'; diff --git a/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts b/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts new file mode 100644 index 00000000000..d44dc9db241 --- /dev/null +++ b/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts @@ -0,0 +1,52 @@ +import { uIOhook, UiohookKey, UiohookKeyboardEvent, UiohookMouseEvent, UiohookWheelEvent } from 'uiohook-napi' + +export class KeyboardMouseCounter { + static instance: KeyboardMouseCounter; + private isStarted: boolean; + constructor() { + if (!KeyboardMouseCounter.instance) { + KeyboardMouseCounter.instance = this; + } + } + + static getInstance(): KeyboardMouseCounter { + if (!KeyboardMouseCounter.instance) { + KeyboardMouseCounter.instance = new KeyboardMouseCounter(); + return KeyboardMouseCounter.instance; + } + return KeyboardMouseCounter.instance; + } + + registerEvent() { + uIOhook.on('keydown', (e: UiohookKeyboardEvent) => { + console.log('keyboard pressed at key', e.keycode); + }); + + uIOhook.on('click', (e: UiohookMouseEvent) => { + console.log('mouse click at position', `${e.x}, ${e.y}`); + }); + + uIOhook.on('mousemove', (e: UiohookMouseEvent) => { + console.log('mouse moved at position', `${e.x}. ${e.y}`) + }); + + uIOhook.on('wheel', (e: UiohookWheelEvent) => { + console.log('mouse wheeled at position', `${e.direction} to ${e.x}, ${e.y}`); + }); + } + + startListener() { + if (!this.isStarted) { + this.registerEvent(); + uIOhook.start(); + this.isStarted = true; + } + } + + stopListener() { + if (this.isStarted) { + uIOhook.stop(); + this.isStarted = false; + } + } +} From 2b8f27dca95ceabcbefc9b732a12572c27cb2f2c Mon Sep 17 00:00:00 2001 From: syns2191 Date: Sun, 20 Apr 2025 14:25:45 +0700 Subject: [PATCH 2/5] feat: added package desktop-activity and implement to gauzy agent --- .../agent/src/main/workers/pull-activities.ts | 6 +- apps/agent/src/package.json | 14 ++-- package.json | 5 +- packages/desktop-activity/README.md | 7 ++ packages/desktop-activity/eslint.config.js | 19 ++++++ packages/desktop-activity/jest.config.ts | 10 +++ packages/desktop-activity/package.json | 62 ++++++++++++++++++ packages/desktop-activity/project.json | 43 ++++++++++++ packages/desktop-activity/src/index.ts | 3 + .../src/lib/desktop-event-counter.ts | 1 + .../src/lib/kb-mouse-event-counter.ts | 42 ++++++++++++ packages/desktop-activity/src/lib/kb-mouse.ts | 65 +++++++++++++++++++ packages/desktop-activity/tsconfig.json | 21 ++++++ packages/desktop-activity/tsconfig.lib.json | 10 +++ packages/desktop-activity/tsconfig.spec.json | 9 +++ packages/desktop-lib/package.json | 1 + packages/desktop-lib/src/index.ts | 1 - packages/desktop-lib/src/lib/desktop-timer.ts | 2 +- .../src/lib/keyboard-mouse-counter.ts | 52 --------------- tsconfig.json | 1 + yarn.lock | 9 ++- 21 files changed, 317 insertions(+), 66 deletions(-) create mode 100644 packages/desktop-activity/README.md create mode 100644 packages/desktop-activity/eslint.config.js create mode 100644 packages/desktop-activity/jest.config.ts create mode 100644 packages/desktop-activity/package.json create mode 100644 packages/desktop-activity/project.json create mode 100644 packages/desktop-activity/src/index.ts rename packages/{desktop-lib => desktop-activity}/src/lib/desktop-event-counter.ts (99%) create mode 100644 packages/desktop-activity/src/lib/kb-mouse-event-counter.ts create mode 100644 packages/desktop-activity/src/lib/kb-mouse.ts create mode 100644 packages/desktop-activity/tsconfig.json create mode 100644 packages/desktop-activity/tsconfig.lib.json create mode 100644 packages/desktop-activity/tsconfig.spec.json delete mode 100644 packages/desktop-lib/src/lib/keyboard-mouse-counter.ts diff --git a/apps/agent/src/main/workers/pull-activities.ts b/apps/agent/src/main/workers/pull-activities.ts index 3d78e7ffee2..b5e9dba2bed 100644 --- a/apps/agent/src/main/workers/pull-activities.ts +++ b/apps/agent/src/main/workers/pull-activities.ts @@ -1,7 +1,7 @@ -import { KeyboardMouseCounter } from '@gauzy/desktop-lib'; +import { KeyboardMouseEventCounter } from '@gauzy/desktop-activity'; class PullActivities { static instance: PullActivities; - private listenerModule: KeyboardMouseCounter; + private listenerModule: KeyboardMouseEventCounter; private isStarted: boolean; constructor() { if (!PullActivities.instance) { @@ -21,7 +21,7 @@ class PullActivities { getListenerModule() { try { // this is not implemented yet - this.listenerModule = KeyboardMouseCounter.getInstance(); + this.listenerModule = new KeyboardMouseEventCounter(); } catch (error) { console.error('error on get listener module', error); } diff --git a/apps/agent/src/package.json b/apps/agent/src/package.json index dafedddf02d..fd0c235ad4d 100644 --- a/apps/agent/src/package.json +++ b/apps/agent/src/package.json @@ -1,8 +1,8 @@ { "name": "gauzy-agent", - "productName": "Ever Gauzy Agent", + "productName": "Gauzy Agent", "version": "0.1.0", - "description": "Ever Gauzy Agent", + "description": "Gauzy Agent", "license": "AGPL-3.0", "homepage": "https://gauzy.co", "repository": { @@ -23,6 +23,7 @@ "packages": [ "../../../dist/packages/contracts", "../../../dist/packages/desktop-core", + "../../../dist/packages/desktop-activity", "../../../dist/packages/desktop-lib", "../../../dist/packages/desktop-window", "../../../dist/packages/ui-config", @@ -30,9 +31,9 @@ ] }, "build": { - "appId": "com.ever.agentapp", + "appId": "com.ever.gauzyagent", "artifactName": "${name}-${version}.${ext}", - "productName": "Ever Agent App", + "productName": "Gauzy Agent", "copyright": "Copyright © 2019-Present. Ever Co. LTD", "afterSign": "tools/notarize.js", "dmg": { @@ -97,7 +98,7 @@ "deb", "tar.gz" ], - "executableName": "Agent", + "executableName": "ever-gauzy-agent", "artifactName": "${name}-${version}.${ext}", "synopsis": "Desktop", "category": "Development" @@ -132,6 +133,7 @@ "node-notifier": "^8.0.0", "@gauzy/contracts": "file:../../../dist/packages/contracts", "@gauzy/desktop-core": "file:../../../dist/packages/desktop-core", + "@gauzy/desktop-activity": "file:../../../dist/packages/desktop-activity", "@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib", "@gauzy/desktop-window": "file:../../../dist/packages/desktop-window", "@gauzy/ui-config": "file:../../../dist/packages/ui-config", @@ -144,6 +146,6 @@ "@sentry/tracing": "^7.101.1", "@sentry/types": "^7.101.1", "auto-launch": "5.0.5", - "custom-electron-titlebar": "^4.2.8" + "custom-electron-titlebar": "^4.2.8" } } diff --git a/package.json b/package.json index 9a98664447d..9bc8787b4aa 100644 --- a/package.json +++ b/package.json @@ -266,7 +266,7 @@ "build:package:plugin:integration-wakatime": "cross-env NODE_ENV=development NODE_OPTIONS=--max-old-space-size=12288 yarn nx build plugin-integration-wakatime", "build:package:plugin:integration-wakatime:prod": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=12288 yarn nx build plugin-integration-wakatime", "build:package:plugin:integration-wakatime:docker": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=60000 yarn nx build plugin-integration-wakatime", - "build:package:all": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:plugins:pre && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:desktop-lib && yarn run build:package:plugin:integration-wakatime && yarn run build:package:desktop-ui-lib", + "build:package:all": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:plugins:pre && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:desktop-lib && yarn run build:package:plugin:integration-wakatime && yarn run build:package:desktop-ui-lib && yarn run build:package:desktop-activity", "build:package:all:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:plugins:pre:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod && yarn run build:package:desktop-lib:prod && yarn run build:package:plugin:integration-wakatime:prod && yarn run build:package:desktop-ui-lib:prod", "build:package:all:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker &&yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:plugins:pre:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker && yarn run build:package:desktop-lib:docker && yarn run build:package:plugin:integration-wakatime:docker && yarn run build:package:desktop-ui-lib:docker", "build:package:api": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:plugin:integration-wakatime", @@ -275,6 +275,7 @@ "build:package:gauzy": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:plugins:pre && yarn run build:package:core && yarn run build:package:plugins:post", "build:package:gauzy:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:plugins:pre:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod", "build:package:gauzy:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker && yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:plugins:pre:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker", + "build:package:desktop-activity": "cross-env NODE_ENV=development NODE_OPTIONS=--max-old-space-size=12288 yarn nx build desktop-activity", "copy-files-desktop": "copyfiles -f packages/core/src/**/*.gql dist/apps/desktop/data/", "prepare:desktop-timer": "yarn run postinstall.electron && tsc -p apps/desktop-timer/tsconfig.electron.json", "build:desktop-timer": "cross-env NODE_ENV=production yarn copy-files-i18n-desktop-timer && yarn run postinstall.electron && yarn run config:prod && yarn run config:desktop-timer:prod && yarn build:package:all:prod && yarn run pack:desktop-timer && yarn run generate:icons:desktop-timer --environment=prod && yarn ng:prod build desktop-timer --base-href=./ && yarn run prepare:desktop-timer && yarn ng:prod build desktop-api --configuration=production --output-path=dist/apps/desktop-timer/desktop-api && yarn run copy-assets-gauzy-timer", @@ -335,7 +336,7 @@ "serve:agent:main": "cross-env NODE_ENV=development yarn config:agent:prod && yarn copy-files-i18n-agent && yarn prepare:agent && NODE_ENV=development NODE_PATH=dist/packages yarn electronmon ./dist/apps/agent/index.js", "serve:agent:ui": "yarn config:prod && yarn config:agent:prod && yarn ng serve agent --configuration production", "serve:agent": "concurrently \"yarn serve:agent:ui\" \"wait-on http://localhost:4200 && yarn serve:agent:main\"", - "build:agent": "cross-env NODE_ENV=production yarn copy-files-i18n-agent && yarn run postinstall.electron && yarn run config:agent:prod && yarn run generate:icons:agent --environment=prod && yarn config:prod && yarn pack:agent && yarn build:package:all:prod && yarn ng:prod build agent --base-href=./ && yarn run prepare:agent", + "build:agent": "cross-env NODE_ENV=production yarn copy-files-i18n-agent && yarn run postinstall.electron && yarn run config:agent:prod && yarn run generate:icons:agent --environment=prod && yarn config:prod && yarn build:package:all:prod && yarn pack:agent && yarn ng:prod build agent --base-href=./ && yarn run prepare:agent", "copy-files-i18n-agent": "yarn run download:translations --desktop=agent", "config:agent:prod": "yarn run config:electron -- --environment=prod --desktop=agent", "dev:agent": "electronmon --exec ts-node ./apps/agent/src/index.ts", diff --git a/packages/desktop-activity/README.md b/packages/desktop-activity/README.md new file mode 100644 index 00000000000..62bc0e624ff --- /dev/null +++ b/packages/desktop-activity/README.md @@ -0,0 +1,7 @@ +# desktop-activity + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test desktop-activity` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/packages/desktop-activity/eslint.config.js b/packages/desktop-activity/eslint.config.js new file mode 100644 index 00000000000..b4cb7a081b8 --- /dev/null +++ b/packages/desktop-activity/eslint.config.js @@ -0,0 +1,19 @@ +const baseConfig = require('../../.eslintrc.json'); + +module.exports = [ + ...baseConfig, + { + files: ['**/*.json'], + rules: { + '@nx/dependency-checks': [ + 'error', + { + ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'] + } + ] + }, + languageOptions: { + parser: require('jsonc-eslint-parser') + } + } +]; diff --git a/packages/desktop-activity/jest.config.ts b/packages/desktop-activity/jest.config.ts new file mode 100644 index 00000000000..a8f17184fc4 --- /dev/null +++ b/packages/desktop-activity/jest.config.ts @@ -0,0 +1,10 @@ +export default { + displayName: 'desktop-activity', + preset: '../../jest.preset.js', + testEnvironment: 'node', + transform: { + '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }] + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/desktop-activity' +}; diff --git a/packages/desktop-activity/package.json b/packages/desktop-activity/package.json new file mode 100644 index 00000000000..686f88e8feb --- /dev/null +++ b/packages/desktop-activity/package.json @@ -0,0 +1,62 @@ +{ + "name": "@gauzy/desktop-activity", + "version": "0.1.0", + "description": "Ever Gauzy Platform desktop activity", + "author": { + "name": "Ever Co. LTD", + "email": "ever@ever.co", + "url": "https://ever.co" + }, + "repository": { + "type": "git", + "url": "https://github.com/ever-co/ever-gauzy", + "directory": "packages/desktop-activity" + }, + "bugs": { + "url": "https://github.com/ever-co/ever-gauzy/issues" + }, + "homepage": "https://ever.co", + "license": "AGPL-3.0", + "private": true, + "type": "commonjs", + "main": "./src/index.js", + "typings": "./src/index.d.ts", + "scripts": { + "lib:build": "yarn nx build desktop-activity", + "lib:build:prod": "yarn nx build desktop-activity", + "lib:watch": "yarn nx build desktop-activity --watch" + }, + "dependencies": { + "moment": "^2.30.1", + "uiohook-napi": "^1.5.4", + "tslib": "^2.6.2" + }, + "devDependencies": { + "@types/node": "^20.14.9", + "@types/unzipper": "^0.10.9", + "electron": "^30.0.1" + }, + "keywords": [ + "electron", + "desktop", + "desktop-activity", + "ever-gauzy", + "typescript", + "sqlite", + "knex", + "embedded-queue", + "moment", + "offline-mode", + "active-window", + "file-management", + "enterprise", + "platform", + "open-source", + "agpl" + ], + "engines": { + "node": ">=20.11.1", + "yarn": ">=1.22.19" + }, + "sideEffects": false +} diff --git a/packages/desktop-activity/project.json b/packages/desktop-activity/project.json new file mode 100644 index 00000000000..1be469f3762 --- /dev/null +++ b/packages/desktop-activity/project.json @@ -0,0 +1,43 @@ +{ + "name": "desktop-activity", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/desktop-activity/src", + "projectType": "library", + "release": { + "version": { + "generatorOptions": { + "packageRoot": "dist/{projectRoot}", + "currentVersionResolver": "git-tag" + } + } + }, + "tags": [], + "implicitDependencies": [], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/desktop-activity", + "main": "packages/desktop-activity/src/index.ts", + "tsConfig": "packages/desktop-activity/tsconfig.lib.json", + "assets": ["packages/desktop-activity/*.md"] + } + }, + "nx-release-publish": { + "options": { + "packageRoot": "dist/{projectRoot}" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/desktop-activity/jest.config.ts" + } + } + } +} diff --git a/packages/desktop-activity/src/index.ts b/packages/desktop-activity/src/index.ts new file mode 100644 index 00000000000..fa7c4f3b125 --- /dev/null +++ b/packages/desktop-activity/src/index.ts @@ -0,0 +1,3 @@ +export * from './lib/kb-mouse'; +export * from './lib/desktop-event-counter'; +export * from './lib/kb-mouse-event-counter'; diff --git a/packages/desktop-lib/src/lib/desktop-event-counter.ts b/packages/desktop-activity/src/lib/desktop-event-counter.ts similarity index 99% rename from packages/desktop-lib/src/lib/desktop-event-counter.ts rename to packages/desktop-activity/src/lib/desktop-event-counter.ts index cb273a976ea..142dbcc7465 100644 --- a/packages/desktop-lib/src/lib/desktop-event-counter.ts +++ b/packages/desktop-activity/src/lib/desktop-event-counter.ts @@ -1,3 +1,4 @@ + import { powerMonitor } from 'electron'; export class DesktopEventCounter { diff --git a/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts b/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts new file mode 100644 index 00000000000..aef5ceaf51b --- /dev/null +++ b/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts @@ -0,0 +1,42 @@ +import KeyboardMouse from './kb-mouse'; +const keyboardMouse = new KeyboardMouse(); +export class KeyboardMouseEventCounter { + private isStarted: boolean; + + constructor() { + this.isStarted = false; + } + + registerEvent() { + keyboardMouse.on('keydown', (e) => { + console.log('keyboard pressed at key', e.keycode); + }); + + keyboardMouse.on('click', (e) => { + console.log('mouse click at position', `${e.x}, ${e.y}`); + }); + + keyboardMouse.on('mousemove', (e) => { + console.log('mouse moved at position', `${e.x}. ${e.y}`) + }); + + keyboardMouse.on('wheel', (e) => { + console.log('mouse wheeled at position', `${e.direction} to ${e.x}, ${e.y}`); + }); + } + + startListener() { + if (!this.isStarted) { + this.registerEvent(); + keyboardMouse.start(); + this.isStarted = true; + } + } + + stopListener() { + if (this.isStarted) { + keyboardMouse.stop(); + this.isStarted = false; + } + } +} diff --git a/packages/desktop-activity/src/lib/kb-mouse.ts b/packages/desktop-activity/src/lib/kb-mouse.ts new file mode 100644 index 00000000000..c400e9756c8 --- /dev/null +++ b/packages/desktop-activity/src/lib/kb-mouse.ts @@ -0,0 +1,65 @@ +import { EventEmitter } from 'events'; +import { uIOhook, UiohookKeyboardEvent, UiohookMouseEvent, UiohookWheelEvent } from 'uiohook-napi'; + +type KeyboardMouseEvent = { + keydown: (event: UiohookKeyboardEvent) => void; + input: (event: UiohookKeyboardEvent) => void; + keyup: (event: UiohookKeyboardEvent) => void; + click: (event: UiohookMouseEvent) => void; + wheel: (event: UiohookWheelEvent) => void; + mouseup: (event: UiohookMouseEvent) => void; + mousedown: (event: UiohookMouseEvent) => void; + mousemove: (event: UiohookMouseEvent) => void; +} + +type EventNames = keyof KeyboardMouseEvent; + +export default class KeyboardMouse extends EventEmitter { + constructor() { + super(); + + uIOhook.on('keydown', (e: UiohookKeyboardEvent) => { + this.emit('keydown', e); + }); + + uIOhook.on('input', (e: UiohookKeyboardEvent) => { + this.emit('input', e); + }); + + uIOhook.on('keyup', (e: UiohookKeyboardEvent) => { + this.emit('keyup', e); + }); + + uIOhook.on('click', (e: UiohookMouseEvent) => { + this.emit('click', e); + }); + + uIOhook.on('wheel', (e: UiohookWheelEvent) => { + this.emit('wheel', e); + }); + + uIOhook.on('mouseup', (e: UiohookMouseEvent) => { + this.emit('mouseup', e); + }); + + uIOhook.on('mousedown', (e: UiohookMouseEvent) => { + this.emit('mousedown', e); + }); + uIOhook.on('mousemove', (e: UiohookMouseEvent) => { + this.emit('mousemove', e); + }); + } + + start(): void { + uIOhook.start(); + } + + stop(): void { + uIOhook.stop(); + } + + override on(event: K, listener: KeyboardMouseEvent[K]): this { + return super.on(event, listener); + } +} + diff --git a/packages/desktop-activity/tsconfig.json b/packages/desktop-activity/tsconfig.json new file mode 100644 index 00000000000..421318cc65b --- /dev/null +++ b/packages/desktop-activity/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": false, + "noImplicitOverride": false, + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": false, + "noPropertyAccessFromIndexSignature": false + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/desktop-activity/tsconfig.lib.json b/packages/desktop-activity/tsconfig.lib.json new file mode 100644 index 00000000000..94b20c39e81 --- /dev/null +++ b/packages/desktop-activity/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/desktop-activity/tsconfig.spec.json b/packages/desktop-activity/tsconfig.spec.json new file mode 100644 index 00000000000..ceb45ea29a4 --- /dev/null +++ b/packages/desktop-activity/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/packages/desktop-lib/package.json b/packages/desktop-lib/package.json index 059cf0a35b5..0fc876c4b40 100644 --- a/packages/desktop-lib/package.json +++ b/packages/desktop-lib/package.json @@ -32,6 +32,7 @@ "@gauzy/contracts": "^0.1.0", "@gauzy/desktop-core": "^0.1.0", "@gauzy/desktop-window": "^0.1.0", + "@gauzy/desktop-activity": "^0.1.0", "active-win": "^8.1.0", "better-sqlite3": "9.6.0", "electron-log": "^4.4.8", diff --git a/packages/desktop-lib/src/index.ts b/packages/desktop-lib/src/index.ts index 6b6b6224864..294dfa43de8 100644 --- a/packages/desktop-lib/src/index.ts +++ b/packages/desktop-lib/src/index.ts @@ -24,4 +24,3 @@ export * from './lib/strategies'; export * from './lib/translation'; export * from './lib/update-server/desktop-local-update-server'; export * from './lib/desktop-theme-listener'; -export * from './lib/keyboard-mouse-counter'; diff --git a/packages/desktop-lib/src/lib/desktop-timer.ts b/packages/desktop-lib/src/lib/desktop-timer.ts index 6410ab09f27..921317aa416 100644 --- a/packages/desktop-lib/src/lib/desktop-timer.ts +++ b/packages/desktop-lib/src/lib/desktop-timer.ts @@ -2,7 +2,7 @@ import { ActivityType, IActivityWatchCollectEventData, ITimeLog, TimeLogSourceEn import { app, screen } from 'electron'; import * as moment from 'moment'; import { DesktopActiveWindow } from './desktop-active-window'; -import { DesktopEventCounter } from './desktop-event-counter'; +import { DesktopEventCounter } from '@gauzy/desktop-activity'; import NotificationDesktop from './desktop-notifier'; import { detectActiveWindow, getScreenshot } from './desktop-screenshot'; import { LocalStore } from './desktop-store'; diff --git a/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts b/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts deleted file mode 100644 index d44dc9db241..00000000000 --- a/packages/desktop-lib/src/lib/keyboard-mouse-counter.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { uIOhook, UiohookKey, UiohookKeyboardEvent, UiohookMouseEvent, UiohookWheelEvent } from 'uiohook-napi' - -export class KeyboardMouseCounter { - static instance: KeyboardMouseCounter; - private isStarted: boolean; - constructor() { - if (!KeyboardMouseCounter.instance) { - KeyboardMouseCounter.instance = this; - } - } - - static getInstance(): KeyboardMouseCounter { - if (!KeyboardMouseCounter.instance) { - KeyboardMouseCounter.instance = new KeyboardMouseCounter(); - return KeyboardMouseCounter.instance; - } - return KeyboardMouseCounter.instance; - } - - registerEvent() { - uIOhook.on('keydown', (e: UiohookKeyboardEvent) => { - console.log('keyboard pressed at key', e.keycode); - }); - - uIOhook.on('click', (e: UiohookMouseEvent) => { - console.log('mouse click at position', `${e.x}, ${e.y}`); - }); - - uIOhook.on('mousemove', (e: UiohookMouseEvent) => { - console.log('mouse moved at position', `${e.x}. ${e.y}`) - }); - - uIOhook.on('wheel', (e: UiohookWheelEvent) => { - console.log('mouse wheeled at position', `${e.direction} to ${e.x}, ${e.y}`); - }); - } - - startListener() { - if (!this.isStarted) { - this.registerEvent(); - uIOhook.start(); - this.isStarted = true; - } - } - - stopListener() { - if (this.isStarted) { - uIOhook.stop(); - this.isStarted = false; - } - } -} diff --git a/tsconfig.json b/tsconfig.json index 6392d366058..02880af740e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -53,6 +53,7 @@ "@gauzy/ui-core": ["./packages/ui-core/src/index.ts"], "@gauzy/ui-core/*": ["./packages/ui-core/*/src/index.ts"], "@gauzy/utils": ["./packages/utils/src/index.ts"], + "@gauzy/desktop-activity": ["./packages/desktop-activity/src/index.ts"], "@nebular/*": ["./node_modules/@nebular/*"], "ng2-completer": ["./node_modules/@akveo/ng2-completer"], "ngx-daterangepicker-material/*": ["./node_modules/ngx-daterangepicker-material/*"] diff --git a/yarn.lock b/yarn.lock index 2c855c09eb6..75f11987efa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29048,7 +29048,7 @@ node-gyp-build-optional-packages@5.2.2: dependencies: detect-libc "^2.0.1" -node-gyp-build@^4.2.2: +node-gyp-build@4.x.x, node-gyp-build@^4.2.2: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== @@ -37569,6 +37569,13 @@ uid@2.0.2: dependencies: "@lukeed/csprng" "^1.0.0" +uiohook-napi@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/uiohook-napi/-/uiohook-napi-1.5.4.tgz#8838918c87339f183e606db90288fdbf0581f946" + integrity sha512-7vPVDNwgb6MwTgviA/dnF2MrW0X5xm76fAqaOAC3cEKkswqAZOPw1USu14Sr6383s5qhXegcJaR63CpJOPCNAg== + dependencies: + node-gyp-build "4.x.x" + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" From 830b85453b5a6ad483bf6df74c76c8a6d0a4638d Mon Sep 17 00:00:00 2001 From: syns2191 Date: Sun, 20 Apr 2025 14:27:49 +0700 Subject: [PATCH 3/5] chore: added package desktop-activity to app with already imported desktop-lib --- apps/desktop-timer/src/package.json | 4 +++- apps/desktop/src/package.json | 2 ++ apps/server-api/src/package.json | 2 ++ apps/server/src/package.json | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/desktop-timer/src/package.json b/apps/desktop-timer/src/package.json index 4b96f9ed9df..2fd1d253302 100644 --- a/apps/desktop-timer/src/package.json +++ b/apps/desktop-timer/src/package.json @@ -23,6 +23,7 @@ "packages": [ "../../../dist/packages/contracts", "../../../dist/packages/desktop-core", + "../../../dist/packages/desktop-activity", "../../../dist/packages/desktop-lib", "../../../dist/packages/desktop-window", "../../../dist/packages/ui-config", @@ -137,6 +138,7 @@ "@electron/remote": "^2.0.8", "@gauzy/contracts": "file:../../../dist/packages/contracts", "@gauzy/desktop-core": "file:../../../dist/packages/desktop-core", + "@gauzy/desktop-activity": "file:../../../dist/packages/desktop-activity", "@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib", "@gauzy/desktop-window": "file:../../../dist/packages/desktop-window", "@gauzy/ui-config": "file:../../../dist/packages/ui-config", @@ -174,4 +176,4 @@ "undici": "^6.10.2", "custom-electron-titlebar": "^4.2.8" } -} \ No newline at end of file +} diff --git a/apps/desktop/src/package.json b/apps/desktop/src/package.json index c01821733af..c313eaea59b 100644 --- a/apps/desktop/src/package.json +++ b/apps/desktop/src/package.json @@ -28,6 +28,7 @@ "../../../dist/packages/contracts", "../../../dist/packages/core", "../../../dist/packages/desktop-core", + "../../../dist/packages/desktop-activity", "../../../dist/packages/desktop-lib", "../../../dist/packages/desktop-window", "../../../dist/packages/plugin", @@ -154,6 +155,7 @@ "@gauzy/contracts": "file:../../../dist/packages/contracts", "@gauzy/core": "file:../../../dist/packages/core", "@gauzy/desktop-core": "file:../../../dist/packages/desktop-core", + "@gauzy/desktop-activity": "file:../../../dist/packages/desktop-activity", "@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib", "@gauzy/desktop-window": "file:../../../dist/packages/desktop-window", "@gauzy/plugin": "file:../../../dist/packages/plugin", diff --git a/apps/server-api/src/package.json b/apps/server-api/src/package.json index 75733107eb0..3160caef449 100755 --- a/apps/server-api/src/package.json +++ b/apps/server-api/src/package.json @@ -29,6 +29,7 @@ "../../../dist/packages/contracts", "../../../dist/packages/core", "../../../dist/packages/desktop-core", + "../../../dist/packages/desktop-activity", "../../../dist/packages/desktop-lib", "../../../dist/packages/desktop-window", "../../../dist/packages/plugin", @@ -143,6 +144,7 @@ "@gauzy/contracts": "file:../../../dist/packages/contracts", "@gauzy/core": "file:../../../dist/packages/core", "@gauzy/desktop-core": "file:../../../dist/packages/desktop-core", + "@gauzy/desktop-activity": "file:../../../dist/packages/desktop-activity", "@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib", "@gauzy/desktop-window": "file:../../../dist/packages/desktop-window", "@gauzy/plugin": "file:../../../dist/packages/plugin", diff --git a/apps/server/src/package.json b/apps/server/src/package.json index 6609938faa3..6222413e267 100755 --- a/apps/server/src/package.json +++ b/apps/server/src/package.json @@ -29,6 +29,7 @@ "../../../dist/packages/contracts", "../../../dist/packages/core", "../../../dist/packages/desktop-core", + "../../../dist/packages/desktop-activity", "../../../dist/packages/desktop-lib", "../../../dist/packages/desktop-window", "../../../dist/packages/plugin", @@ -143,6 +144,7 @@ "@gauzy/contracts": "file:../../../dist/packages/contracts", "@gauzy/core": "file:../../../dist/packages/core", "@gauzy/desktop-core": "file:../../../dist/packages/desktop-core", + "@gauzy/desktop-activity": "file:../../../dist/packages/desktop-activity", "@gauzy/desktop-lib": "file:../../../dist/packages/desktop-lib", "@gauzy/desktop-window": "file:../../../dist/packages/desktop-window", "@gauzy/plugin": "file:../../../dist/packages/plugin", From 4e4045efcf1a11072d22fb598cb0b163504d0ec0 Mon Sep 17 00:00:00 2001 From: syns2191 Date: Sun, 20 Apr 2025 15:32:47 +0700 Subject: [PATCH 4/5] style: fix style coding and type correction --- .cspell.json | 4 +++- packages/desktop-activity/README.md | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.cspell.json b/.cspell.json index 88f6acd764a..0bd7e96b7bf 100644 --- a/.cspell.json +++ b/.cspell.json @@ -569,7 +569,9 @@ "wparam", "lparam", "refcon", - "cflags" + "cflags", + "uiohook", + "gauzyagent" ], "useGitignore": true, "ignorePaths": [ diff --git a/packages/desktop-activity/README.md b/packages/desktop-activity/README.md index 62bc0e624ff..be81b5d7571 100644 --- a/packages/desktop-activity/README.md +++ b/packages/desktop-activity/README.md @@ -1,7 +1,24 @@ -# desktop-activity +# @gauzy/desktop-activity This library was generated with [Nx](https://nx.dev). +## Building + +Run `yarn nx build desktop-activity` to build the library. + ## Running unit tests -Run `nx test desktop-activity` to execute the unit tests via [Jest](https://jestjs.io). +Run `yarn nx test desktop-activity` to execute the unit tests via [Jest](https://jestjs.io). + +## Publishing + +After building your library with `yarn nx build desktop-activity`, go to the dist folder `dist/packages/desktop-activity` and run `npm publish`. + +## Installation + +Install the Desktop Libs Library using your preferred package manager: + +```bash +npm install @gauzy/desktop-activity +# or +yarn add @gauzy/desktop-activity From d53092948797f533aad9520d0c133c616972979e Mon Sep 17 00:00:00 2001 From: syns2191 Date: Sun, 20 Apr 2025 16:35:40 +0700 Subject: [PATCH 5/5] fix: all code suggestion --- .../agent/src/main/workers/pull-activities.ts | 1 - package.json | 8 ++- packages/desktop-activity/README.md | 2 +- packages/desktop-activity/jest.config.ts | 2 +- .../src/lib/kb-mouse-event-counter.ts | 19 +++--- packages/desktop-activity/src/lib/kb-mouse.ts | 58 +++++++++---------- tsconfig.json | 2 +- 7 files changed, 44 insertions(+), 48 deletions(-) diff --git a/apps/agent/src/main/workers/pull-activities.ts b/apps/agent/src/main/workers/pull-activities.ts index b5e9dba2bed..d65f276201d 100644 --- a/apps/agent/src/main/workers/pull-activities.ts +++ b/apps/agent/src/main/workers/pull-activities.ts @@ -20,7 +20,6 @@ class PullActivities { getListenerModule() { try { - // this is not implemented yet this.listenerModule = new KeyboardMouseEventCounter(); } catch (error) { console.error('error on get listener module', error); diff --git a/package.json b/package.json index 85844eae255..2469a49b8a4 100644 --- a/package.json +++ b/package.json @@ -269,9 +269,9 @@ "build:package:plugin:integration-wakatime": "cross-env NODE_ENV=development NODE_OPTIONS=--max-old-space-size=12288 yarn nx build plugin-integration-wakatime", "build:package:plugin:integration-wakatime:prod": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=12288 yarn nx build plugin-integration-wakatime", "build:package:plugin:integration-wakatime:docker": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=60000 yarn nx build plugin-integration-wakatime", - "build:package:all": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:plugins:pre && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:desktop-lib && yarn run build:package:plugin:integration-wakatime && yarn run build:package:desktop-ui-lib && yarn run build:package:desktop-activity", - "build:package:all:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:plugins:pre:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod && yarn run build:package:desktop-lib:prod && yarn run build:package:plugin:integration-wakatime:prod && yarn run build:package:desktop-ui-lib:prod", - "build:package:all:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker &&yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:plugins:pre:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker && yarn run build:package:desktop-lib:docker && yarn run build:package:plugin:integration-wakatime:docker && yarn run build:package:desktop-ui-lib:docker", + "build:package:all": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:plugins:pre && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:desktop-activity && yarn run build:package:desktop-lib && yarn run build:package:plugin:integration-wakatime && yarn run build:package:desktop-ui-lib", + "build:package:all:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:plugins:pre:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod && yarn run build:package:desktop-activity:prod && yarn run build:package:desktop-lib:prod && yarn run build:package:plugin:integration-wakatime:prod && yarn run build:package:desktop-ui-lib:prod", + "build:package:all:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker &&yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:plugins:pre:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker && yarn build:package:desktop-activity:docker && yarn run build:package:desktop-lib:docker && yarn run build:package:plugin:integration-wakatime:docker && yarn run build:package:desktop-ui-lib:docker", "build:package:api": "yarn run build:package:constants && yarn run build:package:contracts && yarn run build:package:common && yarn run build:package:utils && yarn run build:package:config && yarn run build:package:plugin && yarn run build:package:auth && yarn run build:package:core && yarn run build:package:plugins:post && yarn run build:package:plugin:integration-wakatime", "build:package:api:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod", "build:package:api:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker && yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker", @@ -279,6 +279,8 @@ "build:package:gauzy:prod": "yarn run build:package:constants:prod && yarn run build:package:contracts:prod && yarn run build:package:common:prod && yarn run build:package:utils:prod && yarn run build:package:config:prod && yarn run build:package:plugin:prod && yarn run build:package:auth:prod && yarn run build:package:plugins:pre:prod && yarn run build:package:core:prod && yarn run build:package:plugins:post:prod", "build:package:gauzy:docker": "yarn run build:package:constants:docker && yarn run build:package:contracts:docker && yarn run build:package:common:docker && yarn run build:package:utils:docker && yarn run build:package:config:docker && yarn run build:package:plugin:docker && yarn run build:package:auth:docker && yarn run build:package:plugins:pre:docker && yarn run build:package:core:docker && yarn run build:package:plugins:post:docker", "build:package:desktop-activity": "cross-env NODE_ENV=development NODE_OPTIONS=--max-old-space-size=12288 yarn nx build desktop-activity", + "build:package:desktop-activity:prod": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=12288 yarn nx build desktop-activity", + "build:package:desktop-activity:docker": "cross-env NODE_ENV=production NODE_OPTIONS=--max-old-space-size=60000 yarn nx build desktop-activity", "copy-files-desktop": "copyfiles -f packages/core/src/**/*.gql dist/apps/desktop/data/", "prepare:desktop-timer": "yarn run postinstall.electron && tsc -p apps/desktop-timer/tsconfig.electron.json", "build:desktop-timer": "cross-env NODE_ENV=production yarn copy-files-i18n-desktop-timer && yarn run postinstall.electron && yarn run config:prod && yarn run config:desktop-timer:prod && yarn build:package:all:prod && yarn run pack:desktop-timer && yarn run generate:icons:desktop-timer --environment=prod && yarn ng:prod build desktop-timer --base-href=./ && yarn run prepare:desktop-timer && yarn ng:prod build desktop-api --configuration=production --output-path=dist/apps/desktop-timer/desktop-api && yarn run copy-assets-gauzy-timer", diff --git a/packages/desktop-activity/README.md b/packages/desktop-activity/README.md index be81b5d7571..1cb34d6d7ee 100644 --- a/packages/desktop-activity/README.md +++ b/packages/desktop-activity/README.md @@ -16,7 +16,7 @@ After building your library with `yarn nx build desktop-activity`, go to the dis ## Installation -Install the Desktop Libs Library using your preferred package manager: +Install the Desktop Activity Library using your preferred package manager: ```bash npm install @gauzy/desktop-activity diff --git a/packages/desktop-activity/jest.config.ts b/packages/desktop-activity/jest.config.ts index a8f17184fc4..d3351a632ab 100644 --- a/packages/desktop-activity/jest.config.ts +++ b/packages/desktop-activity/jest.config.ts @@ -5,6 +5,6 @@ export default { transform: { '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }] }, - moduleFileExtensions: ['ts', 'js', 'html'], + moduleFileExtensions: ['ts', 'js'], coverageDirectory: '../../coverage/packages/desktop-activity' }; diff --git a/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts b/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts index aef5ceaf51b..cd066cbba3f 100644 --- a/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts +++ b/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts @@ -1,26 +1,26 @@ import KeyboardMouse from './kb-mouse'; -const keyboardMouse = new KeyboardMouse(); export class KeyboardMouseEventCounter { private isStarted: boolean; - + private keyboardMouse: KeyboardMouse; constructor() { this.isStarted = false; + this.keyboardMouse = new KeyboardMouse(); } registerEvent() { - keyboardMouse.on('keydown', (e) => { + this.keyboardMouse.on('keydown', (e) => { console.log('keyboard pressed at key', e.keycode); }); - keyboardMouse.on('click', (e) => { + this.keyboardMouse.on('click', (e) => { console.log('mouse click at position', `${e.x}, ${e.y}`); }); - keyboardMouse.on('mousemove', (e) => { - console.log('mouse moved at position', `${e.x}. ${e.y}`) + this.keyboardMouse.on('mousemove', (e) => { + console.log('mouse moved at position', `${e.x}, ${e.y}`) }); - keyboardMouse.on('wheel', (e) => { + this.keyboardMouse.on('wheel', (e) => { console.log('mouse wheeled at position', `${e.direction} to ${e.x}, ${e.y}`); }); } @@ -28,14 +28,15 @@ export class KeyboardMouseEventCounter { startListener() { if (!this.isStarted) { this.registerEvent(); - keyboardMouse.start(); + this.keyboardMouse.start(); this.isStarted = true; } } stopListener() { if (this.isStarted) { - keyboardMouse.stop(); + this.keyboardMouse.stop(); + this.keyboardMouse.removeAllListeners(); this.isStarted = false; } } diff --git a/packages/desktop-activity/src/lib/kb-mouse.ts b/packages/desktop-activity/src/lib/kb-mouse.ts index c400e9756c8..23dc48f8e29 100644 --- a/packages/desktop-activity/src/lib/kb-mouse.ts +++ b/packages/desktop-activity/src/lib/kb-mouse.ts @@ -1,4 +1,4 @@ -import { EventEmitter } from 'events'; +import { EventEmitter } from 'node:events'; import { uIOhook, UiohookKeyboardEvent, UiohookMouseEvent, UiohookWheelEvent } from 'uiohook-napi'; type KeyboardMouseEvent = { @@ -15,39 +15,33 @@ type KeyboardMouseEvent = { type EventNames = keyof KeyboardMouseEvent; export default class KeyboardMouse extends EventEmitter { + private handleKeydown: (event: UiohookKeyboardEvent) => void; + private handleInput: (event: UiohookKeyboardEvent) => void; + private handleKeyup: (event: UiohookKeyboardEvent) => void; + private handleClick: (event: UiohookMouseEvent) => void; + private handleWheel: (event: UiohookWheelEvent) => void; + private handleMouseup: (event: UiohookMouseEvent) => void; + private handleMousedown: (event: UiohookMouseEvent) => void; + private handleMousemove: (event: UiohookMouseEvent) => void; constructor() { super(); - - uIOhook.on('keydown', (e: UiohookKeyboardEvent) => { - this.emit('keydown', e); - }); - - uIOhook.on('input', (e: UiohookKeyboardEvent) => { - this.emit('input', e); - }); - - uIOhook.on('keyup', (e: UiohookKeyboardEvent) => { - this.emit('keyup', e); - }); - - uIOhook.on('click', (e: UiohookMouseEvent) => { - this.emit('click', e); - }); - - uIOhook.on('wheel', (e: UiohookWheelEvent) => { - this.emit('wheel', e); - }); - - uIOhook.on('mouseup', (e: UiohookMouseEvent) => { - this.emit('mouseup', e); - }); - - uIOhook.on('mousedown', (e: UiohookMouseEvent) => { - this.emit('mousedown', e); - }); - uIOhook.on('mousemove', (e: UiohookMouseEvent) => { - this.emit('mousemove', e); - }); + this.handleKeydown = (event: UiohookKeyboardEvent) => this.emit('keydown', event); + this.handleInput = (event: UiohookKeyboardEvent) => this.emit('input', event); + this.handleKeyup = (event: UiohookKeyboardEvent) => this.emit('keyup', event); + this.handleClick = (event: UiohookMouseEvent) => this.emit('click', event); + this.handleWheel = (event: UiohookWheelEvent) => this.emit('wheel', event); + this.handleMouseup = (event: UiohookMouseEvent) => this.emit('mouseup', event); + this.handleMousedown = (event: UiohookMouseEvent) => this.emit('mousedown', event); + this.handleMousemove = (event: UiohookMouseEvent) => this.emit('mousemove', event); + + uIOhook.on('keydown', this.handleKeydown); + uIOhook.on('input', this.handleInput); + uIOhook.on('keyup', this.handleKeyup); + uIOhook.on('click', this.handleClick); + uIOhook.on('wheel', this.handleWheel); + uIOhook.on('mouseup', this.handleMouseup); + uIOhook.on('mousedown', this.handleMousedown); + uIOhook.on('mousemove', this.handleMousemove); } start(): void { diff --git a/tsconfig.json b/tsconfig.json index 9eac788e6c9..cbb5ab03254 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,7 @@ "@gauzy/constants": ["./packages/constants/src/index.ts"], "@gauzy/contracts": ["./packages/contracts/src/index.ts"], "@gauzy/core": ["./packages/core/src/index.ts"], + "@gauzy/desktop-activity": ["./packages/desktop-activity/src/index.ts"], "@gauzy/desktop-core": ["./packages/desktop-core/src/index.ts"], "@gauzy/desktop-timer": ["./packages/desktop-timer/src/index.ts"], "@gauzy/desktop-lib": ["./packages/desktop-lib/src/index.ts"], @@ -54,7 +55,6 @@ "@gauzy/ui-core": ["./packages/ui-core/src/index.ts"], "@gauzy/ui-core/*": ["./packages/ui-core/*/src/index.ts"], "@gauzy/utils": ["./packages/utils/src/index.ts"], - "@gauzy/desktop-activity": ["./packages/desktop-activity/src/index.ts"], "@nebular/*": ["./node_modules/@nebular/*"], "ng2-completer": ["./node_modules/@akveo/ng2-completer"], "ngx-daterangepicker-material/*": ["./node_modules/ngx-daterangepicker-material/*"]