diff --git a/.cspell.json b/.cspell.json index ff381140416..9b4695badb5 100644 --- a/.cspell.json +++ b/.cspell.json @@ -570,6 +570,8 @@ "lparam", "refcon", "cflags", + "uiohook", + "gauzyagent", "PostHog", "posthog", "autocapture" diff --git a/apps/agent/src/main/workers/pull-activities.ts b/apps/agent/src/main/workers/pull-activities.ts index fcdcda622b3..d65f276201d 100644 --- a/apps/agent/src/main/workers/pull-activities.ts +++ b/apps/agent/src/main/workers/pull-activities.ts @@ -1,6 +1,7 @@ +import { KeyboardMouseEventCounter } from '@gauzy/desktop-activity'; class PullActivities { static instance: PullActivities; - private listenerModule: any; + private listenerModule: KeyboardMouseEventCounter; private isStarted: boolean; constructor() { if (!PullActivities.instance) { @@ -19,8 +20,7 @@ class PullActivities { getListenerModule() { try { - // this is not implemented yet - this.listenerModule = null; + this.listenerModule = new KeyboardMouseEventCounter(); } catch (error) { console.error('error on get listener module', error); } @@ -32,6 +32,7 @@ class PullActivities { } try { if (!this.isStarted) { + this.listenerModule.startListener(); this.isStarted = true; } } catch (error) { @@ -44,6 +45,7 @@ class PullActivities { this.getListenerModule(); } try { + this.listenerModule.stopListener(); this.isStarted = false; } catch (error) { console.error('error to stop tracking', 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/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", diff --git a/package.json b/package.json index 7a9e2caaa5a..2469a49b8a4 100644 --- a/package.json +++ b/package.json @@ -269,15 +269,18 @@ "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: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", "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", + "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", @@ -338,7 +341,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..1cb34d6d7ee --- /dev/null +++ b/packages/desktop-activity/README.md @@ -0,0 +1,24 @@ +# @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 `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 Activity Library using your preferred package manager: + +```bash +npm install @gauzy/desktop-activity +# or +yarn add @gauzy/desktop-activity 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..d3351a632ab --- /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'], + 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..cd066cbba3f --- /dev/null +++ b/packages/desktop-activity/src/lib/kb-mouse-event-counter.ts @@ -0,0 +1,43 @@ +import KeyboardMouse from './kb-mouse'; +export class KeyboardMouseEventCounter { + private isStarted: boolean; + private keyboardMouse: KeyboardMouse; + constructor() { + this.isStarted = false; + this.keyboardMouse = new KeyboardMouse(); + } + + registerEvent() { + this.keyboardMouse.on('keydown', (e) => { + console.log('keyboard pressed at key', e.keycode); + }); + + this.keyboardMouse.on('click', (e) => { + console.log('mouse click at position', `${e.x}, ${e.y}`); + }); + + this.keyboardMouse.on('mousemove', (e) => { + console.log('mouse moved at position', `${e.x}, ${e.y}`) + }); + + this.keyboardMouse.on('wheel', (e) => { + console.log('mouse wheeled at position', `${e.direction} to ${e.x}, ${e.y}`); + }); + } + + startListener() { + if (!this.isStarted) { + this.registerEvent(); + this.keyboardMouse.start(); + this.isStarted = true; + } + } + + stopListener() { + if (this.isStarted) { + 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 new file mode 100644 index 00000000000..23dc48f8e29 --- /dev/null +++ b/packages/desktop-activity/src/lib/kb-mouse.ts @@ -0,0 +1,59 @@ +import { EventEmitter } from 'node: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 { + 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(); + 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 { + 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 bc3f9a38674..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", @@ -56,7 +57,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/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/tsconfig.json b/tsconfig.json index 413378b7c8b..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"], diff --git a/yarn.lock b/yarn.lock index 353fa7df232..c2615769cf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29046,7 +29046,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== @@ -37574,6 +37574,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"