From 28671a37cd77cca56d04e326b07d006f953f54d4 Mon Sep 17 00:00:00 2001 From: Andres Pache Date: Tue, 10 Feb 2026 21:25:45 -0300 Subject: [PATCH 1/2] feat: use pg-boss native WorkOptions instead of internal wrapper pg-boss now natively supports concurrency options like teamSize in its WorkOptions interface, removing the need for a custom wrapper. Co-Authored-By: Claude Opus 4.6 --- lib/decorators/job.decorator.ts | 3 +- lib/handler-scanner.service.ts | 18 +- lib/interfaces/handler-metadata.interface.ts | 6 +- package-lock.json | 167 ++++++++++--------- package.json | 2 +- test/handler-scanner.service.spec.ts | 81 --------- 6 files changed, 103 insertions(+), 174 deletions(-) delete mode 100644 test/handler-scanner.service.spec.ts diff --git a/lib/decorators/job.decorator.ts b/lib/decorators/job.decorator.ts index e088158..2185f92 100644 --- a/lib/decorators/job.decorator.ts +++ b/lib/decorators/job.decorator.ts @@ -1,6 +1,5 @@ import { SetMetadata } from "@nestjs/common"; -import { ScheduleOptions } from "pg-boss"; -import { WorkOptions } from "../interfaces/handler-metadata.interface"; +import { ScheduleOptions, WorkOptions } from "pg-boss"; export const JOB_NAME = "JOB_NAME"; export const JOB_OPTIONS = "JOB_OPTIONS"; diff --git a/lib/handler-scanner.service.ts b/lib/handler-scanner.service.ts index 20c03f2..058ecf4 100644 --- a/lib/handler-scanner.service.ts +++ b/lib/handler-scanner.service.ts @@ -10,7 +10,7 @@ import { import { InstanceWrapper } from "@nestjs/core/injector/instance-wrapper"; import PgBoss from "pg-boss"; import { LOGGER } from "./utils/consts"; -import { WorkOptions } from "./interfaces/handler-metadata.interface"; +import { WorkOptions } from "pg-boss"; @Injectable() export class HandlerScannerService { @@ -73,15 +73,13 @@ export class HandlerScannerService { continue; } - const teamSize = Math.max(1, jobOptions?.teamSize ?? 1); - for (let i = 0; i < teamSize; i++) { - await this.pgBossService.registerJob( - jobName, - methodRef.bind(instance), - jobOptions, - ); - } - this.logger.log(`Registered job: ${jobName} (${teamSize} worker${teamSize > 1 ? 's' : ''})`); + await this.pgBossService.registerJob( + jobName, + methodRef.bind(instance), + jobOptions, + ); + + this.logger.log(`Registered job: ${jobName}`); } catch (error) { this.logger.error(error, `Error registering job ${jobName}`); } diff --git a/lib/interfaces/handler-metadata.interface.ts b/lib/interfaces/handler-metadata.interface.ts index bdb5fe1..447be47 100644 --- a/lib/interfaces/handler-metadata.interface.ts +++ b/lib/interfaces/handler-metadata.interface.ts @@ -1,8 +1,4 @@ -import { WorkOptions as PgBossWorkOptions, ScheduleOptions } from "pg-boss"; - -export interface WorkOptions extends PgBossWorkOptions { - teamSize?: number; -} +import { WorkOptions, ScheduleOptions } from "pg-boss"; export interface HandlerMetadata { jobName: string; diff --git a/package-lock.json b/package-lock.json index d61a455..1d6fd59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@wavezync/nestjs-pgboss", - "version": "4.0.1", + "version": "5.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@wavezync/nestjs-pgboss", - "version": "4.0.1", + "version": "5.1.1", "license": "MIT", "devDependencies": { "@nestjs/cli": "^11.0.0", @@ -34,7 +34,7 @@ "peerDependencies": { "@nestjs/common": "^11", "@nestjs/core": "^11", - "pg-boss": "^12", + "pg-boss": "^12.6.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0" } @@ -179,6 +179,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", @@ -690,7 +691,6 @@ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" @@ -1754,7 +1754,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "peer": true, "engines": { "node": ">=8" } @@ -2010,7 +2009,6 @@ "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", "license": "MIT", - "peer": true, "dependencies": { "consola": "^3.2.3" }, @@ -2063,7 +2061,6 @@ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" @@ -2080,8 +2077,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@tsconfig/node10": { "version": "1.0.11", @@ -2178,6 +2174,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2296,6 +2293,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", "dev": true, + "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2421,6 +2419,7 @@ "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.51.0", "@typescript-eslint/types": "8.51.0", @@ -2806,6 +2805,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2853,6 +2853,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3234,6 +3235,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3396,6 +3398,7 @@ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -3618,7 +3621,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -3697,11 +3699,10 @@ "dev": true }, "node_modules/cron-parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-5.4.0.tgz", - "integrity": "sha512-HxYB8vTvnQFx4dLsZpGRa0uHp6X3qIzS3ZJgJ9v6l/5TJMgeWQbLkR5yiJ5hOxGbc9+jCADDnydIe15ReLZnJA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-5.5.0.tgz", + "integrity": "sha512-oML4lKUXxizYswqmxuOCpgFS8BNUJpIu6k/2HVHyaL8Ynnf3wdf9tkns0yRdJLSIjkJ+b0DXHMZEHGpMwjnPww==", "license": "MIT", - "peer": true, "dependencies": { "luxon": "^3.7.1" }, @@ -3974,6 +3975,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4029,6 +4031,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -4384,7 +4387,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.2.0.tgz", "integrity": "sha512-vCYBgFOrJQLoTzDyAXAL/RFfKnXXpUYt4+tipVy26nJJhT7ftgGETf2tAQF59EEL61i3MrorV/PG6tf7LJK7eg==", "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", @@ -5122,7 +5124,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", - "peer": true, "engines": { "node": ">=6" } @@ -5172,6 +5173,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -5987,7 +5989,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=13.2.0" } @@ -6070,7 +6071,6 @@ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" } @@ -6290,6 +6290,18 @@ "dev": true, "license": "MIT" }, + "node_modules/non-error": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/non-error/-/non-error-0.1.0.tgz", + "integrity": "sha512-TMB1uHiGsHRGv1uYclfhivcnf0/PdFp2pNqRxXjncaAsjYMoisaQJI+SSZCqRq+VliwRTC8tsMQfmrWjDMhkPQ==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6522,7 +6534,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -6539,15 +6550,15 @@ } }, "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", "license": "MIT", "peer": true, "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", + "pg-connection-string": "^2.11.0", + "pg-pool": "^3.11.0", + "pg-protocol": "^1.11.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -6555,7 +6566,7 @@ "node": ">= 16.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.2.7" + "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -6567,68 +6578,65 @@ } }, "node_modules/pg-boss": { - "version": "12.5.4", - "resolved": "https://registry.npmjs.org/pg-boss/-/pg-boss-12.5.4.tgz", - "integrity": "sha512-I52Gkpda6lLNZNDZVKN5sWYO2YKndI3bBwOGAHY7xC+UBYMHI3m2tWSmDGjuq/odf6zpGoFSKVUUukTEaBZocA==", + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/pg-boss/-/pg-boss-12.11.1.tgz", + "integrity": "sha512-gb7zgSac6RwpA6LQvgwY/yJtYeHrwjX7ksCK1WJs5Hi3mHx4/1eFBD+UtAMcm9JIYTMlBwttsnV2GxsArguRAg==", "license": "MIT", "peer": true, "dependencies": { - "cron-parser": "^5.4.0", - "pg": "^8.16.3", - "serialize-error": "^12.0.0" + "cron-parser": "^5.5.0", + "pg": "^8.18.0", + "serialize-error": "^13.0.1" + }, + "bin": { + "pg-boss": "dist/cli.js" }, "engines": { "node": ">=22.12.0" } }, "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "license": "MIT", - "peer": true + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", + "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "license": "ISC", - "peer": true, "engines": { "node": ">=4.0.0" } }, "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", + "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", "license": "MIT", - "peer": true, "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "license": "MIT", - "peer": true + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", + "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "license": "MIT", - "peer": true, "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", @@ -6645,7 +6653,6 @@ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "license": "MIT", - "peer": true, "dependencies": { "split2": "^4.1.0" } @@ -6758,7 +6765,6 @@ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -6768,7 +6774,6 @@ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6778,7 +6783,6 @@ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6788,7 +6792,6 @@ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "license": "MIT", - "peer": true, "dependencies": { "xtend": "^4.0.0" }, @@ -6810,6 +6813,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7174,6 +7178,7 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -7229,6 +7234,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7268,29 +7274,31 @@ } }, "node_modules/serialize-error": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-12.0.0.tgz", - "integrity": "sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-13.0.1.tgz", + "integrity": "sha512-bBZaRwLH9PN5HbLCjPId4dP5bNGEtumcErgOX952IsvOhVPrm3/AeK1y0UHA/QaPG701eg0yEnOKsCOC6X/kaA==", "license": "MIT", - "peer": true, "dependencies": { - "type-fest": "^4.31.0" + "non-error": "^0.1.0", + "type-fest": "^5.4.1" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/serialize-error/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", + "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", "license": "(MIT OR CC0-1.0)", - "peer": true, + "dependencies": { + "tagged-tag": "^1.0.0" + }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7423,7 +7431,6 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", - "peer": true, "engines": { "node": ">= 10.x" } @@ -7539,7 +7546,6 @@ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/token": "^0.3.0" }, @@ -7646,6 +7652,18 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -7915,7 +7933,6 @@ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", - "peer": true, "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", @@ -8015,6 +8032,7 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -8137,6 +8155,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8149,7 +8168,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "peer": true, "dependencies": { "@lukeed/csprng": "^1.0.0" }, @@ -8162,7 +8180,6 @@ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8292,6 +8309,7 @@ "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -8483,7 +8501,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.4" } diff --git a/package.json b/package.json index c9f476d..2d482aa 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "peerDependencies": { "@nestjs/common": "^11", "@nestjs/core": "^11", - "pg-boss": "^12", + "pg-boss": "^12.6.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0" }, diff --git a/test/handler-scanner.service.spec.ts b/test/handler-scanner.service.spec.ts deleted file mode 100644 index 7a6a7de..0000000 --- a/test/handler-scanner.service.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -jest.mock("pg-boss", () => ({})); - -import { Test, TestingModule } from "@nestjs/testing"; -import { Reflector, ModulesContainer } from "@nestjs/core"; -import { HandlerScannerService } from "../lib/handler-scanner.service"; -import { PgBossService } from "../lib/pgboss.service"; -import { JOB_NAME, JOB_OPTIONS } from "../lib/decorators/job.decorator"; - -describe("HandlerScannerService", () => { - let service: HandlerScannerService; - let mockPgBossService: any; - let mockReflector: any; - let mockModulesContainer: Map; - - class TestHandler { - handle() {} - } - - beforeEach(async () => { - mockPgBossService = { - registerJob: jest.fn().mockResolvedValue(undefined), - registerCronJob: jest.fn().mockResolvedValue(undefined), - }; - - mockReflector = { get: jest.fn() }; - mockModulesContainer = new Map(); - - const module: TestingModule = await Test.createTestingModule({ - providers: [ - HandlerScannerService, - { provide: PgBossService, useValue: mockPgBossService }, - { provide: Reflector, useValue: mockReflector }, - { provide: ModulesContainer, useValue: mockModulesContainer }, - ], - }).compile(); - - service = module.get(HandlerScannerService); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - describe("teamSize", () => { - const setupHandler = (jobOptions?: { teamSize?: number }) => { - const instance = new TestHandler(); - mockModulesContainer.set("TestModule", { - providers: new Map([["TestHandler", { instance }]]), - }); - mockReflector.get.mockImplementation((key: string, target: any) => { - if (key === JOB_NAME && target === instance.handle) return "my-job"; - if (key === JOB_OPTIONS && target === instance.handle) return jobOptions; - return undefined; - }); - }; - - it("should register job once by default", async () => { - setupHandler(); - await service.scanAndRegisterHandlers(); - expect(mockPgBossService.registerJob).toHaveBeenCalledTimes(1); - }); - - it("should register job multiple times when teamSize > 1", async () => { - setupHandler({ teamSize: 3 }); - await service.scanAndRegisterHandlers(); - expect(mockPgBossService.registerJob).toHaveBeenCalledTimes(3); - }); - - it("should default to 1 when teamSize is 0", async () => { - setupHandler({ teamSize: 0 }); - await service.scanAndRegisterHandlers(); - expect(mockPgBossService.registerJob).toHaveBeenCalledTimes(1); - }); - - it("should default to 1 when teamSize is negative", async () => { - setupHandler({ teamSize: -5 }); - await service.scanAndRegisterHandlers(); - expect(mockPgBossService.registerJob).toHaveBeenCalledTimes(1); - }); - }); -}); From 02840adabc9d11c54e34e18692a7774274aff1d0 Mon Sep 17 00:00:00 2001 From: Andres Pache Date: Sat, 14 Feb 2026 09:37:27 -0300 Subject: [PATCH 2/2] require "pg-boss": ">=12.6.0" --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d6fd59..9a0e706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "peerDependencies": { "@nestjs/common": "^11", "@nestjs/core": "^11", - "pg-boss": "^12.6.0", + "pg-boss": ">=12.6.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0" } diff --git a/package.json b/package.json index 2d482aa..9f4e4e5 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "peerDependencies": { "@nestjs/common": "^11", "@nestjs/core": "^11", - "pg-boss": "^12.6.0", + "pg-boss": ">=12.6.0", "reflect-metadata": "^0.1.13 || ^0.2.0", "rxjs": "^7.2.0" },