diff --git a/integration/microservices/src/disconnected.controller.ts b/integration/microservices/src/disconnected.controller.ts index fed84ce6f55..ebf8005631f 100644 --- a/integration/microservices/src/disconnected.controller.ts +++ b/integration/microservices/src/disconnected.controller.ts @@ -26,7 +26,8 @@ export class DisconnectedClientController { code === 'CONN_ERR' || code === 'ENOTFOUND' || code === 'CONNECTION_REFUSED' || - error.message.includes('Connection is closed.') + error.message.includes('Connection is closed.') || + error.message.includes('connection refused') ? new RequestTimeoutException('ECONNREFUSED') : new InternalServerErrorException(), ); diff --git a/integration/microservices/src/nats/nats.controller.ts b/integration/microservices/src/nats/nats.controller.ts index ffcfb18687a..48738a215db 100644 --- a/integration/microservices/src/nats/nats.controller.ts +++ b/integration/microservices/src/nats/nats.controller.ts @@ -1,3 +1,4 @@ +import * as nats from '@nats-io/nats-core'; import { Body, Controller, Get, HttpCode, Post, Query } from '@nestjs/common'; import { ClientProxy, @@ -11,7 +12,6 @@ import { RpcException, Transport, } from '@nestjs/microservices'; -import * as nats from 'nats'; import { from, lastValueFrom, Observable, of, throwError } from 'rxjs'; import { catchError, scan } from 'rxjs/operators'; import { NatsService } from './nats.service'; diff --git a/package-lock.json b/package-lock.json index c17f9c9f6de..4dbae1c5494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "@fastify/view": "11.1.0", "@grpc/grpc-js": "1.13.4", "@grpc/proto-loader": "0.7.15", + "@nats-io/transport-node": "^3.0.2", "@nestjs/apollo": "13.1.0", "@nestjs/graphql": "13.1.0", "@nestjs/mongoose": "11.0.3", @@ -108,7 +109,7 @@ "lint-staged": "16.0.0", "markdown-table": "2.0.0", "mocha": "11.5.0", - "mongoose": "8.15.0", + "mongoose": "8.15.1", "mqtt": "5.13.0", "multer": "2.0.0", "mysql2": "3.14.1", @@ -6335,30 +6336,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -6473,6 +6450,62 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@nats-io/nats-core": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nats-io/nats-core/-/nats-core-3.0.2.tgz", + "integrity": "sha512-gACbRIhY3yQTO+5C4E1LY/qO2e5EhGUBeDsnPDT8Hd3qY9mfhNtluY6R7d7WX7/JMGsXRPbYdSLSADr/ECSy3w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@nats-io/nkeys": "2.0.3", + "@nats-io/nuid": "2.0.3" + } + }, + "node_modules/@nats-io/nkeys": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nats-io/nkeys/-/nkeys-2.0.3.tgz", + "integrity": "sha512-JVt56GuE6Z89KUkI4TXUbSI9fmIfAmk6PMPknijmuL72GcD+UgIomTcRWiNvvJKxA01sBbmIPStqJs5cMRBC3A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@nats-io/nkeys/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/@nats-io/nuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nats-io/nuid/-/nuid-2.0.3.tgz", + "integrity": "sha512-TpA3HEBna/qMVudy+3HZr5M3mo/L1JPofpVT4t0HkFGkz2Cn9wrlrQC8tvR8Md5Oa9//GtGG26eN0qEWF5Vqew==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 18.x" + } + }, + "node_modules/@nats-io/transport-node": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nats-io/transport-node/-/transport-node-3.0.2.tgz", + "integrity": "sha512-hPuep/ObVepjAM1dFy+XhqMlIzga3bQpbgQiOWM5AxwNZ9CF7GHAtfaxG7WY6+t057tBW8axC0nBL71Q8chQBQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@nats-io/nats-core": "3.0.2", + "@nats-io/nkeys": "2.0.3", + "@nats-io/nuid": "2.0.3" + }, + "engines": { + "node": ">= 18.0.0" + } + }, "node_modules/@nestjs/apollo": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@nestjs/apollo/-/apollo-13.1.0.tgz", @@ -6507,81 +6540,6 @@ } } }, - "node_modules/@nestjs/common": { - "version": "11.0.16", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.16.tgz", - "integrity": "sha512-agvuQ8su4aZ+PVxAmY89odG1eR97HEQvxPmTMdDqyvDWzNerl7WQhUEd+j4/UyNWcF1or1UVcrtPj52x+eUSsA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "iterare": "1.2.1", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "file-type": "^20.4.1", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.3.tgz", - "integrity": "sha512-6UoVHpwa23HJxMNtuTXQCiqx/NHTG3lRBRgnZ8EDHTjgaNnR7P+xBS68zN3gLH7rBIrhhQ5Q1hVs7WswRxrw7Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@nuxt/opencollective": "0.4.1", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "8.2.0", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "engines": { - "node": ">= 20" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^11.0.0", - "@nestjs/microservices": "^11.0.0", - "@nestjs/platform-express": "^11.0.0", - "@nestjs/websockets": "^11.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, "node_modules/@nestjs/graphql": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@nestjs/graphql/-/graphql-13.1.0.tgz", @@ -10971,18 +10929,6 @@ "@types/eslint": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -11672,182 +11618,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, "node_modules/@whatwg-node/promise-helpers": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.0.0.tgz", @@ -11913,22 +11683,6 @@ "node": ">=8" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -12108,20 +11862,6 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -14061,40 +13801,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/bson": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", @@ -14696,28 +14402,6 @@ "node": ">=4" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0", - "peer": true - }, "node_modules/capture-stack-trace": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", @@ -14891,17 +14575,6 @@ "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", @@ -18421,14 +18094,6 @@ "node": ">=0.10.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", - "dev": true, - "license": "ISC", - "peer": true - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -18786,14 +18451,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -21635,14 +21292,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/glob-watcher": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", @@ -22001,21 +21650,6 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graphql-ws": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz", - "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": ">=0.11 <=16" - } - }, "node_modules/gulp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", @@ -26049,39 +25683,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jiti": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", @@ -28026,17 +27627,6 @@ "node": ">=4" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -29845,9 +29435,9 @@ } }, "node_modules/mongoose": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.0.tgz", - "integrity": "sha512-WFKsY1q12ScGabnZWUB9c/QzZmz/ESorrV27OembB7Gz6rrh9m3GA4Srsv1uvW1s9AHO5DeZ6DdUTyF9zyNERQ==", + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", + "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", "dev": true, "license": "MIT", "dependencies": { @@ -30583,14 +30173,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/node-source-walk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-6.0.2.tgz", @@ -33509,21 +33091,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, "node_modules/react-element-to-jsx-string": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", @@ -34819,63 +34386,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/secure-json-parse": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", @@ -37205,114 +36715,6 @@ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true }, - "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -38736,38 +38138,6 @@ "yarn": "*" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -39212,21 +38582,6 @@ "dev": true, "license": "ISC" }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -39242,91 +38597,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", diff --git a/package.json b/package.json index 0b2f66ae3f3..ce4e91d14bf 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "@fastify/view": "11.1.0", "@grpc/grpc-js": "1.13.4", "@grpc/proto-loader": "0.7.15", + "@nats-io/transport-node": "3.0.2", "@nestjs/apollo": "13.1.0", "@nestjs/graphql": "13.1.0", "@nestjs/mongoose": "11.0.3", diff --git a/packages/common/pipes/file/file-type.validator.ts b/packages/common/pipes/file/file-type.validator.ts index be3c48f3bcf..982dead4217 100644 --- a/packages/common/pipes/file/file-type.validator.ts +++ b/packages/common/pipes/file/file-type.validator.ts @@ -1,6 +1,6 @@ +import { loadEsm } from 'load-esm'; import { FileValidator } from './file-validator.interface'; import { IFile } from './interfaces'; -import { loadEsm } from 'load-esm'; export type FileTypeValidatorOptions = { fileType: string | RegExp; @@ -72,8 +72,7 @@ export class FileTypeValidator extends FileValidator< if (!isFileValid || !file.buffer) return false; try { - const { fileTypeFromBuffer } = - await loadEsm('file-type'); + const { fileTypeFromBuffer } = await loadEsm('file-type'); const fileType = await fileTypeFromBuffer(file.buffer); if (fileType) { diff --git a/packages/microservices/client/client-nats.ts b/packages/microservices/client/client-nats.ts index 665666e3d72..26809ec63e5 100644 --- a/packages/microservices/client/client-nats.ts +++ b/packages/microservices/client/client-nats.ts @@ -17,8 +17,8 @@ let natsPackage = {} as any; // because it would require the user to install the nats package even if they dont use Nats // Otherwise, TypeScript would fail to compile the code. // -// type Client = import('nats').NatsConnection; -// type NatsMsg = import('nats').Msg; +// type Client = import('@nats-io/transport-node').NatsConnection; +// type NatsMsg = import('@nats-io/transport-node').Msg; type Client = Record; type NatsMsg = Record; @@ -37,7 +37,9 @@ export class ClientNats extends ClientProxy { constructor(protected readonly options: Required['options']) { super(); - natsPackage = loadPackage('nats', ClientNats.name, () => require('nats')); + natsPackage = loadPackage('@nats-io/transport-node', ClientNats.name, () => + require('@nats-io/transport-node'), + ); this.initializeSerializer(options); this.initializeDeserializer(options); @@ -76,15 +78,10 @@ export class ClientNats extends ClientProxy { public async handleStatusUpdates(client: Client) { for await (const status of client.status()) { - const data = - status.data && isObject(status.data) - ? JSON.stringify(status.data) - : status.data; - switch (status.type) { case 'error': this.logger.error( - `NatsError: type: "${status.type}", data: "${data}".`, + `NatsError: type: "${status.type}", error: "${status.error}".`, ); break; @@ -95,14 +92,12 @@ export class ClientNats extends ClientProxy { // Prevent unhandled promise rejection this.connectionPromise.catch(() => {}); - this.logger.error( - `NatsError: type: "${status.type}", data: "${data}".`, - ); + this.logger.error(`NatsError: type: "${status.type}".`); this._status$.next(NatsStatus.DISCONNECTED); this.statusEventEmitter.emit( NatsEventsMap.DISCONNECT, - status.data as string, + status.server as string, ); break; @@ -112,33 +107,37 @@ export class ClientNats extends ClientProxy { case 'reconnect': this.connectionPromise = Promise.resolve(client); - this.logger.log( - `NatsStatus: type: "${status.type}", data: "${data}".`, - ); + this.logger.log(`NatsStatus: type: "${status.type}".`); this._status$.next(NatsStatus.CONNECTED); this.statusEventEmitter.emit( NatsEventsMap.RECONNECT, - status.data as string, + status.server as string, ); break; - case 'pingTimer': + case 'ping': if (this.options.debug) { - this.logger.debug( - `NatsStatus: type: "${status.type}", data: "${data}".`, + this.logger.debug!( + `NatsStatus: type: "${status.type}", pending pings: "${status.pendingPings}".`, ); } break; case 'update': this.logger.log( - `NatsStatus: type: "${status.type}", data: "${data}".`, + `NatsStatus: type: "${status.type}", added: "${status.added}", deleted: "${status.deleted}".`, ); - this.statusEventEmitter.emit(NatsEventsMap.UPDATE, status.data); + this.statusEventEmitter.emit(NatsEventsMap.UPDATE, undefined); break; default: + const data = + 'data' in status && isObject(status.data) + ? JSON.stringify(status.data) + : 'data' in status + ? status.data + : ''; this.logger.log( `NatsStatus: type: "${status.type}", data: "${data}".`, ); @@ -167,7 +166,7 @@ export class ClientNats extends ClientProxy { packet: ReadPacket & PacketId, callback: (packet: WritePacket) => any, ) { - return async (error: string | Error | undefined, natsMsg: NatsMsg) => { + return async (error: Error | null, natsMsg: NatsMsg) => { if (error) { return callback({ err: error, @@ -182,7 +181,7 @@ export class ClientNats extends ClientProxy { isDisposed: true, }); } - const message = await this.deserializer.deserialize(rawPacket); + const message = await this.deserializer.deserialize(natsMsg); if (message.id && message.id !== packet.id) { return undefined; } @@ -217,7 +216,10 @@ export class ClientNats extends ClientProxy { ); const subscription = this.natsClient!.subscribe(inbox, { - callback: subscriptionHandler, + callback: subscriptionHandler as ( + err: Error | null, + msg: NatsMsg, + ) => Promise, }); const headers = this.mergeHeaders(serializedPacket.headers); diff --git a/packages/microservices/deserializers/nats-request-json.deserializer.ts b/packages/microservices/deserializers/nats-request-json.deserializer.ts index e0311041ace..bcf4cf8019f 100644 --- a/packages/microservices/deserializers/nats-request-json.deserializer.ts +++ b/packages/microservices/deserializers/nats-request-json.deserializer.ts @@ -1,30 +1,23 @@ -import { loadPackage } from '@nestjs/common/utils/load-package.util'; -import { NatsCodec } from '../external/nats-codec.interface'; import { IncomingEvent, IncomingRequest } from '../interfaces'; import { IncomingRequestDeserializer } from './incoming-request.deserializer'; -let natsPackage = {} as any; +// To enable type safety for Nats. This cant be uncommented by default +// because it would require the user to install the nats package even if they dont use Nats +// Otherwise, TypeScript would fail to compile the code. +// +// type NatsMsg = import('@nats-io/transport-node').Msg; + +type NatsMsg = any; /** * @publicApi */ export class NatsRequestJSONDeserializer extends IncomingRequestDeserializer { - private readonly jsonCodec: NatsCodec; - - constructor() { - super(); - - natsPackage = loadPackage('nats', NatsRequestJSONDeserializer.name, () => - require('nats'), - ); - this.jsonCodec = natsPackage.JSONCodec(); - } - deserialize( - value: Uint8Array, + value: NatsMsg, options?: Record, ): IncomingRequest | IncomingEvent { - const decodedRequest = this.jsonCodec.decode(value); + const decodedRequest = value.json(); return super.deserialize(decodedRequest, options); } } diff --git a/packages/microservices/deserializers/nats-response-json.deserializer.ts b/packages/microservices/deserializers/nats-response-json.deserializer.ts index 5b81f7512ee..4c063935b30 100644 --- a/packages/microservices/deserializers/nats-response-json.deserializer.ts +++ b/packages/microservices/deserializers/nats-response-json.deserializer.ts @@ -1,31 +1,20 @@ -import { loadPackage } from '@nestjs/common/utils/load-package.util'; -import { NatsCodec } from '../external/nats-codec.interface'; import { IncomingResponse } from '../interfaces'; import { IncomingResponseDeserializer } from './incoming-response.deserializer'; -import { NatsRequestJSONDeserializer } from './nats-request-json.deserializer'; -let natsPackage = {} as any; +// To enable type safety for Nats. This cant be uncommented by default +// because it would require the user to install the nats package even if they dont use Nats +// Otherwise, TypeScript would fail to compile the code. +// +// type NatsMsg = import('@nats-io/transport-node').Msg; + +type NatsMsg = any; /** * @publicApi */ export class NatsResponseJSONDeserializer extends IncomingResponseDeserializer { - private readonly jsonCodec: NatsCodec; - - constructor() { - super(); - - natsPackage = loadPackage('nats', NatsRequestJSONDeserializer.name, () => - require('nats'), - ); - this.jsonCodec = natsPackage.JSONCodec(); - } - - deserialize( - value: Uint8Array, - options?: Record, - ): IncomingResponse { - const decodedRequest = this.jsonCodec.decode(value); + deserialize(value: NatsMsg, options?: Record): IncomingResponse { + const decodedRequest = value.json(); return super.deserialize(decodedRequest, options); } } diff --git a/packages/microservices/serializers/nats-record.serializer.ts b/packages/microservices/serializers/nats-record.serializer.ts index b00f3969a1d..ac704e5a470 100644 --- a/packages/microservices/serializers/nats-record.serializer.ts +++ b/packages/microservices/serializers/nats-record.serializer.ts @@ -1,24 +1,11 @@ -import { loadPackage } from '@nestjs/common/utils/load-package.util'; import { isObject } from '@nestjs/common/utils/shared.utils'; -import { NatsCodec } from '../external/nats-codec.interface'; import { ReadPacket } from '../interfaces'; import { Serializer } from '../interfaces/serializer.interface'; import { NatsRecord, NatsRecordBuilder } from '../record-builders'; -let natsPackage = {} as any; - export class NatsRecordSerializer implements Serializer { - private readonly jsonCodec: NatsCodec; - - constructor() { - natsPackage = loadPackage('nats', NatsRecordSerializer.name, () => - require('nats'), - ); - this.jsonCodec = natsPackage.JSONCodec(); - } - serialize(packet: any): NatsRecord { const natsMessage = packet?.data && isObject(packet.data) && packet.data instanceof NatsRecord @@ -26,7 +13,7 @@ export class NatsRecordSerializer : new NatsRecordBuilder(packet?.data).build(); return { - data: this.jsonCodec.encode({ ...packet, data: natsMessage.data }), + data: JSON.stringify({ ...packet, data: natsMessage.data }), headers: natsMessage.headers, }; } diff --git a/packages/microservices/server/server-nats.ts b/packages/microservices/server/server-nats.ts index 31c8c28c310..d8730553191 100644 --- a/packages/microservices/server/server-nats.ts +++ b/packages/microservices/server/server-nats.ts @@ -24,9 +24,9 @@ let natsPackage = {} as any; // because it would require the user to install the nats package even if they dont use Nats // Otherwise, TypeScript would fail to compile the code. // -// type Client = import('nats').NatsConnection; -// type NatsMsg = import('nats').Msg; -// type Subscription = import('nats').Subscription; +// type Client = import('@nats-io/transport-node').NatsConnection; +// type NatsMsg = import('@nats-io/transport-node').Msg; +// type Subscription = import('@nats-io/transport-node').Subscription; type Client = any; type NatsMsg = any; @@ -41,7 +41,7 @@ export class ServerNats< > extends Server { public transportId: TransportId = Transport.NATS; - private natsClient: Client; + private natsClient: Client | null; protected statusEventEmitter = new EventEmitter<{ [key in keyof NatsEvents]: Parameters; }>(); @@ -50,8 +50,10 @@ export class ServerNats< constructor(private readonly options: Required['options']) { super(); - natsPackage = this.loadPackage('nats', ServerNats.name, () => - require('nats'), + natsPackage = this.loadPackage( + '@nats-io/transport-node', + ServerNats.name, + () => require('@nats-io/transport-node'), ); this.initializeSerializer(options); @@ -75,7 +77,7 @@ export class ServerNats< public start( callback: (err?: unknown, ...optionalParams: unknown[]) => void, ) { - this.bindEvents(this.natsClient); + this.bindEvents(this.natsClient!); callback(); } @@ -146,7 +148,7 @@ export class ServerNats< const replyTo = natsMsg.reply; const natsCtx = new NatsContext([callerSubject, natsMsg.headers]); - const message = await this.deserializer.deserialize(rawMessage, { + const message = await this.deserializer.deserialize(natsMsg, { channel, replyTo, }); @@ -176,7 +178,7 @@ export class ServerNats< Object.assign(response, { id }); const outgoingResponse: NatsRecord = this.serializer.serialize(response); - return natsMsg.respond(outgoingResponse.data, { + natsMsg.respond(outgoingResponse.data, { headers: outgoingResponse.headers, }); }; @@ -190,34 +192,24 @@ export class ServerNats< public async handleStatusUpdates(client: Client) { for await (const status of client.status()) { - const data = - status.data && isObject(status.data) - ? JSON.stringify(status.data) - : status.data; - switch (status.type) { case 'error': this.logger.error( - `NatsError: type: "${status.type}", data: "${data}".`, + `NatsError: type: "${status.type}", error: "${status.error}".`, ); break; case 'disconnect': - this.logger.error( - `NatsError: type: "${status.type}", data: "${data}".`, - ); + this.logger.error(`NatsError: type: "${status.type}".`); this._status$.next(NatsStatus.DISCONNECTED as S); - this.statusEventEmitter.emit( - NatsEventsMap.DISCONNECT, - status.data as string, - ); + this.statusEventEmitter.emit(NatsEventsMap.DISCONNECT, status.server); break; - case 'pingTimer': + case 'ping': if (this.options.debug) { this.logger.debug!( - `NatsStatus: type: "${status.type}", data: "${data}".`, + `NatsStatus: type: "${status.type}", pending pings: "${status.pendingPings}".`, ); } break; @@ -227,25 +219,26 @@ export class ServerNats< break; case 'reconnect': - this.logger.log( - `NatsStatus: type: "${status.type}", data: "${data}".`, - ); + this.logger.log(`NatsStatus: type: "${status.type}".`); this._status$.next(NatsStatus.CONNECTED as S); - this.statusEventEmitter.emit( - NatsEventsMap.RECONNECT, - status.data as string, - ); + this.statusEventEmitter.emit(NatsEventsMap.RECONNECT, status.server); break; case 'update': this.logger.log( - `NatsStatus: type: "${status.type}", data: "${data}".`, + `NatsStatus: type: "${status.type}", added: "${status.added}", deleted: "${status.deleted}".`, ); - this.statusEventEmitter.emit(NatsEventsMap.UPDATE, status.data); + this.statusEventEmitter.emit(NatsEventsMap.UPDATE, undefined); break; default: + const data = + 'data' in status && isObject(status.data) + ? JSON.stringify(status.data) + : 'data' in status + ? status.data + : ''; this.logger.log( `NatsStatus: type: "${status.type}", data: "${data}".`, ); diff --git a/packages/microservices/test/client/client-nats.spec.ts b/packages/microservices/test/client/client-nats.spec.ts index c818351fe36..3b66a0ea2dd 100644 --- a/packages/microservices/test/client/client-nats.spec.ts +++ b/packages/microservices/test/client/client-nats.spec.ts @@ -1,5 +1,5 @@ +import { headers as createHeaders } from '@nats-io/nats-core'; import { expect } from 'chai'; -import { headers as createHeaders, JSONCodec } from 'nats'; import * as sinon from 'sinon'; import { ClientNats } from '../../client/client-nats'; import { ReadPacket } from '../../interfaces'; @@ -157,7 +157,8 @@ describe('ClientNats', () => { id: '1', }; const natsMessage = { - data: JSONCodec().encode(responseMessage), + data: JSON.stringify(responseMessage), + json: () => responseMessage, }; let callback: sinon.SinonSpy, subscription; @@ -183,10 +184,13 @@ describe('ClientNats', () => { callback = sinon.spy(); subscription = client.createSubscriptionHandler(msg, callback); subscription(undefined, { - data: JSONCodec().encode({ + data: JSON.stringify({ ...responseMessage, isDisposed: true, }), + json: function () { + return JSON.parse(this.data); + }, }); }); @@ -212,7 +216,7 @@ describe('ClientNats', () => { callback, ); subscription(undefined, { - data: JSONCodec().encode({ + data: JSON.stringify({ ...responseMessage, isDisposed: true, }), @@ -245,7 +249,7 @@ describe('ClientNats', () => { beforeEach(async () => { createClientSpy = sinon .stub(client, 'createClient') - .callsFake(() => Promise.resolve({})); + .callsFake(() => Promise.resolve({})); handleStatusUpdatesSpy = sinon.spy(client, 'handleStatusUpdates'); await client.connect(); diff --git a/packages/microservices/test/serializers/nats-record.serializer.spec.ts b/packages/microservices/test/serializers/nats-record.serializer.spec.ts index b34ed0a0ba8..33deb6a9cf6 100644 --- a/packages/microservices/test/serializers/nats-record.serializer.spec.ts +++ b/packages/microservices/test/serializers/nats-record.serializer.spec.ts @@ -1,10 +1,8 @@ +import * as nats from '@nats-io/nats-core'; import { expect } from 'chai'; -import * as nats from 'nats'; import { NatsRecordBuilder } from '../../record-builders'; import { NatsRecordSerializer } from '../../serializers/nats-record.serializer'; -const jsonCodec = nats.JSONCodec(); - describe('NatsRecordSerializer', () => { let instance: NatsRecordSerializer; beforeEach(() => { @@ -14,42 +12,42 @@ describe('NatsRecordSerializer', () => { it('undefined', () => { expect(instance.serialize({ data: undefined })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: undefined }), + data: JSON.stringify({ data: undefined }), }); }); it('null', () => { expect(instance.serialize({ data: null })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: null }), + data: JSON.stringify({ data: null }), }); }); it('string', () => { expect(instance.serialize({ data: 'string' })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: 'string' }), + data: JSON.stringify({ data: 'string' }), }); }); it('number', () => { expect(instance.serialize({ data: 12345 })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: 12345 }), + data: JSON.stringify({ data: 12345 }), }); }); it('buffer', () => { expect(instance.serialize({ data: Buffer.from('buffer') })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: Buffer.from('buffer') }), + data: JSON.stringify({ data: Buffer.from('buffer') }), }); }); it('array', () => { expect(instance.serialize({ data: [1, 2, 3, 4, 5] })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: [1, 2, 3, 4, 5] }), + data: JSON.stringify({ data: [1, 2, 3, 4, 5] }), }); }); @@ -57,7 +55,7 @@ describe('NatsRecordSerializer', () => { const serObject = { prop: 'value' }; expect(instance.serialize({ data: serObject })).to.deep.eq({ headers: undefined, - data: jsonCodec.encode({ data: serObject }), + data: JSON.stringify({ data: serObject }), }); }); @@ -74,7 +72,7 @@ describe('NatsRecordSerializer', () => { }), ).to.deep.eq({ headers: natsHeaders, - data: jsonCodec.encode({ + data: JSON.stringify({ data: { value: 'string', }, diff --git a/packages/microservices/test/server/server-nats.spec.ts b/packages/microservices/test/server/server-nats.spec.ts index ef5a62800ad..c434cbdcd4a 100644 --- a/packages/microservices/test/server/server-nats.spec.ts +++ b/packages/microservices/test/server/server-nats.spec.ts @@ -1,5 +1,4 @@ import { expect } from 'chai'; -import { JSONCodec } from 'nats'; import * as sinon from 'sinon'; import { NO_MESSAGE_HANDLER } from '../../constants'; import { NatsContext } from '../../ctx-host'; @@ -7,7 +6,7 @@ import { BaseRpcContext } from '../../ctx-host/base-rpc.context'; import { ServerNats } from '../../server/server-nats'; import { objectToMap } from './utils/object-to-map'; -// type NatsMsg = import('nats').Msg; +// type NatsMsg = import('@nats-io/nats-core').Msg; type NatsMsg = any; describe('ServerNats', () => { @@ -164,18 +163,19 @@ describe('ServerNats', () => { }); it('should call "handleEvent" if identifier is not present', async () => { const handleEventSpy = sinon.spy(server, 'handleEvent'); - const data = JSONCodec().encode({ id: 10 }); + const data = JSON.stringify({ id: 10 }); const natsMsg: NatsMsg = { data, subject: channel, sid: +id, respond: sinon.spy(), + json: () => JSON.parse(data), }; await server.handleMessage(channel, natsMsg); expect(handleEventSpy.called).to.be.true; }); it(`should publish NO_MESSAGE_HANDLER if pattern does not exist in messageHandlers object`, async () => { - const data = JSONCodec().encode({ + const data = JSON.stringify({ id, pattern: 'test', data: 'test', @@ -185,6 +185,7 @@ describe('ServerNats', () => { subject: channel, sid: +id, respond: sinon.spy(), + json: () => JSON.parse(data), }; await server.handleMessage(channel, natsMsg); @@ -205,7 +206,7 @@ describe('ServerNats', () => { const headers = {}; const natsContext = new NatsContext([channel, headers]); - const data = JSONCodec().encode({ + const data = JSON.stringify({ pattern: channel, data: 'test', id, @@ -216,6 +217,7 @@ describe('ServerNats', () => { sid: +id, respond: sinon.spy(), headers, + json: () => JSON.parse(data), }; await server.handleMessage(channel, natsMsg); expect(handler.calledWith('test', natsContext)).to.be.true; @@ -230,6 +232,7 @@ describe('ServerNats', () => { subject: '', sid: +id, respond: sinon.spy(), + json: () => JSON.parse(''), }; expect(typeof server.getPublisher(natsMsg, id)).to.be.eql('function'); }); @@ -241,13 +244,13 @@ describe('ServerNats', () => { sid: +id, respond: sinon.spy(), reply: replyTo, - }; + } as NatsMsg; const publisher = server.getPublisher(natsMsg, id); const respond = 'test'; publisher({ respond, id }); - expect(natsMsg.respond.calledWith(JSONCodec().encode({ respond, id }))).to - .be.true; + expect(natsMsg.respond.calledWith(JSON.stringify({ respond, id }))).to.be + .true; }); it(`should not call "publish" when replyTo NOT provided`, () => { const replyTo = undefined; @@ -257,7 +260,7 @@ describe('ServerNats', () => { reply: replyTo, sid: +id, respond: sinon.spy(), - }; + } as NatsMsg; const publisher = server.getPublisher(natsMsg, id); const respond = 'test';