diff --git a/.nvmrc b/.nvmrc index 270c4d9..2f51fa4 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.7 +v16.14 \ No newline at end of file diff --git a/@types/later.d.ts b/@types/later.d.ts index acb8a89..5e83038 100644 --- a/@types/later.d.ts +++ b/@types/later.d.ts @@ -144,7 +144,7 @@ declare module '@breejs/later' { * @param dateFrom: The earliest a valid instance can occur * @param dateTo: The latest a valid instance can occur */ - next(numberOfInst: number, dateFrom?: Date, dateTo?: Date): Date[] | Date; + next(numberOfInst: number, dateFrom?: Date | number, dateTo?: Date): Date[] | Date; /** * Finds the next valid range or ranges of the current schedule, @@ -520,14 +520,14 @@ declare module '@breejs/later' { * @param callback - A callback called after first instance of recurrence pattern. * @param - A recurrence instance. */ - setTimeout(callback: () => void, time: ScheduleData): Timer; + setTimeout(callback: () => void, time: ScheduleData, timezone?: string): Timer; /** * Set interval on window using given recurrence * * @param callback - A callback called after each instance of recurrence pattern. * @param - A recurrence instance. */ - setInterval(callback: () => void, time: ScheduleData): Timer; + setInterval(callback: () => void, time: ScheduleData, timezone?: string): Timer; /** * time period information provider. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 92beb28..c7d37e6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,21 +5,52 @@ email, or any other method with the owners of this repository before making a ch Please note we have a code of conduct, please follow it in all your interactions with the project. -## Commit message format +## How to Contribute -**semantic-release** uses the commit messages to determine the type of changes in the codebase. Following formalized conventions for commit messages, **semantic-release** automatically determines the next [semantic version](https://semver.org) number, generates a changelog and publishes the release. +1. Fork the repository to your GitHub account. +2. Clone the project to your local machine. +3. Create a new branch for your feature or fix: -By default **semantic-release** uses [Angular Commit Message Conventions](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines). The commit message format can be changed with the [`preset` or `config` options](docs/usage/configuration.md#options) of the [@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) and [@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) plugins. + ```bash + git checkout -b feature/your-feature-name + ``` -Tools such as [commitizen](https://github.com/commitizen/cz-cli) or [commitlint](https://github.com/conventional-changelog/commitlint) can be used to help contributors and enforce valid commit messages. +4. Implement your changes and ensure that the tests pass. +5. Commit your changes: -Here is an example of the release type that will be done based on a commit messages: + ```bash + git commit -am 'Add some feature' + ``` -| Commit message | Release type | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------- | -| `fix(pencil): stop graphite breaking when too much pressure applied` | Patch Release | -| `feat(pencil): add 'graphiteWidth' option` | ~~Minor~~ Feature Release | -| `perf(pencil): remove graphiteWidth option`

`BREAKING CHANGE: The graphiteWidth option has been removed.`
`The default graphite width of 10mm is always used for performance reasons.` | ~~Major~~ Breaking Release | +6. Push to the branch: + + ```bash + git push origin feature/your-feature-name + ``` + +7. Create a new pull request from your forked repository's branch to the main repository's `master` branch. + +**Note:** Be sure to follow our [Code of Conduct](link-to-code-of-conduct) and [Contributor License Agreement](link-to-CLA) if we have one. + +## Releases and Semantic Versioning + +We use GitHub's releases feature and semantic versioning for managing releases for our project. Here's how to create releases and use specific version tags for working with npm semantic versioning: + +1. To create a new release, go to the "Releases" tab in the GitHub repository. + +2. Click on the "Draft a new release" button. + +3. In the "Tag version" field, enter your specific semver-formatted tag (e.g., v1.0.0) for the release. + +4. Enter a release title and description to provide details about this release. + +5. Click "Publish release" to create the release. + +With this process, we ensure that every release in this project corresponds to a semantic versioning tag and a corresponding release on GitHub. + +Thank you for your interest in contributing to [Your Project Name]! + +If you have any questions, feel free to [contact us](link-to-contact). We look forward to working with you! ## Pull Request Process diff --git a/README.md b/README.md index 70a4d8b..8da732f 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,12 @@ The following Core Outputs are available: web management portal) the two properties are passed as `reply_to` and `correlation_id`. However, inside this library the values are exposed via Node AMQP Connection Manager as `replyTo` and `correlationId` in the `properties` of an AMQP message. +- CoreOutputMqtt - Allows for the publishing of the result of a rules engine pass into an MQTT broker. When a rules + pass `result` is received by this output, the output looks for an mqttPublishAction object. If found, it publishes to + an Topic following the details in that object. +- CoreOutputUdp - Allows for the publishing of the result of a rules engine pass into a UDP message. When a rules + pass `result` is received by this output, the output looks for an udpPublishAction object. If found, it publishes to + an IP following the details in that object. The Rule Harvester maintainers expect to continually be adding to Core Outputs. Because of that, rather than trying to explain each of the outputs here, you are invited to check out the ./examples/ directory of this repo. Each diff --git a/examples/package-lock.json b/examples/package-lock.json index 5209eb1..44c4c7f 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -22,11 +22,13 @@ "version": "2.1.0", "license": "MIT", "dependencies": { - "amqp-cacoon": "^3.0.3", - "coronado-bridge": "^2.0.0", + "@breejs/later": "^4.1.0", + "@valtech-sd/rules-js": "^1.0.0", + "amqp-cacoon": "github:GiganticPlayground/amqp-cacoon#semver:^3.2.1", + "coronado-bridge": "github:GiganticPlayground/coronado-bridge#semver:^2.2.1", "lodash": "^4.17.21", "log4js": "^6.3.0", - "rules-js": "^1.0.0" + "p-queue": "^7.3.0" }, "devDependencies": { "@types/amqp-connection-manager": "^2.0.12", @@ -1593,14 +1595,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "../node_modules/moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "engines": { - "node": "*" - } - }, "../node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1987,14 +1981,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../node_modules/rules-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rules-js/-/rules-js-1.0.0.tgz", - "integrity": "sha512-bm6FhqV31uwd9RViTiL+Lex2VKJ0yrDljyU7+u/oa8GhRIfQ2/y2Eez5vuMbd4oHkoJBoRIGngSJ4v4fsLTKiQ==", - "dependencies": { - "moment": "~2.24.0" - } - }, "../node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3231,21 +3217,23 @@ "rule-harvester": { "version": "file:..", "requires": { + "@breejs/later": "^4.1.0", "@types/amqp-connection-manager": "^2.0.12", "@types/amqplib": "^0.8.2", "@types/chai": "^4.2.21", "@types/lodash": "^4.14.172", "@types/mocha": "^9.0.0", "@types/node": "^16.7.2", - "amqp-cacoon": "^3.0.3", + "@valtech-sd/rules-js": "^1.0.0", + "amqp-cacoon": "github:GiganticPlayground/amqp-cacoon#semver:^3.2.1", "chai": "^4.3.4", - "coronado-bridge": "^2.0.0", + "coronado-bridge": "github:GiganticPlayground/coronado-bridge#semver:^2.2.1", "lodash": "^4.17.21", "log4js": "^6.3.0", "mocha": "^9.1.0", "nodemon": "^2.0.12", + "p-queue": "^7.3.0", "rimraf": "^3.0.2", - "rules-js": "^1.0.0", "sinon": "^11.1.2", "ts-node": "^10.2.1", "ts-sinon": "^2.0.1", @@ -3439,8 +3427,7 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "amqp-cacoon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/amqp-cacoon/-/amqp-cacoon-3.2.0.tgz", + "version": "https://registry.npmjs.org/amqp-cacoon/-/amqp-cacoon-3.2.0.tgz", "integrity": "sha512-y5C2NN339d59qnPog91NnWU9vVDfkEoK2EqkimfeJerXeJHGU82l13B9JwlT9wXHWGAfs8ZIH+9aP/PCH+ZqSw==", "requires": { "amqp-connection-manager": "~3.5.0", @@ -3792,8 +3779,7 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "coronado-bridge": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/coronado-bridge/-/coronado-bridge-2.0.0.tgz", + "version": "https://registry.npmjs.org/coronado-bridge/-/coronado-bridge-2.0.0.tgz", "integrity": "sha512-ZlKjBYMcScEJ9j0fgRim0RT3S7AGStmEB6GQ1FTxLFCWs3Dzs9DmMg6X1F3+wiiDlv8YwlY//8eu8ytLGom7Eg==", "requires": { "connect-timeout": "^1.9.0", @@ -4471,11 +4457,6 @@ } } }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4763,14 +4744,6 @@ "glob": "^7.1.3" } }, - "rules-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rules-js/-/rules-js-1.0.0.tgz", - "integrity": "sha512-bm6FhqV31uwd9RViTiL+Lex2VKJ0yrDljyU7+u/oa8GhRIfQ2/y2Eez5vuMbd4oHkoJBoRIGngSJ4v4fsLTKiQ==", - "requires": { - "moment": "~2.24.0" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", diff --git a/examples/src/example-scheduler-input.js b/examples/src/example-scheduler-input.js index f0e2a72..8b16d85 100644 --- a/examples/src/example-scheduler-input.js +++ b/examples/src/example-scheduler-input.js @@ -33,7 +33,16 @@ const coreScheduledInput = new CoreInputScheduler( // This limits the queue size. The queue used for tasks will not grow beyond 100. // For the example service, this should not come into play at all. defaultMaxPerTaskQueueLength: 100, + // timezoneConfig: 'America/New_York', tasks: [ + // { + // name: 'Specific time', + // intervalText: 'at 3:41 pm', + // input: { + // directory: 'input_schedule_path/fast', + // outputFilePrefix: 'scheduled-order-fast', + // }, // Passed as part of the input facts in the scheduler + // }, { name: 'Fast Orders', intervalText: 'every 15 seconds', // Could use intervalCron as an alternative diff --git a/package-lock.json b/package-lock.json index 1232c19..72523f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,22 @@ { "name": "rule-harvester", - "version": "2.1.0", + "version": "2.15.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rule-harvester", - "version": "2.1.0", + "version": "2.15.0", "license": "MIT", "dependencies": { - "@breejs/later": "^4.1.0", + "@breejs/later": "^4.2.0", + "@types/ws": "8.5.4", "@valtech-sd/rules-js": "^1.0.0", - "amqp-cacoon": "^3.2.0", - "coronado-bridge": "^2.2.0", + "amqp-cacoon": "github:GiganticPlayground/amqp-cacoon#semver:^3.3.0", + "coronado-bridge": "github:GiganticPlayground/coronado-bridge#semver:^2.3.0", "lodash": "^4.17.21", "log4js": "^6.3.0", + "mqtt": "^4.3.8", "p-queue": "^7.3.0" }, "devDependencies": { @@ -23,7 +25,7 @@ "@types/chai": "^4.2.21", "@types/lodash": "^4.14.172", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.2", + "@types/node": "^16.18.103", "chai": "^4.3.4", "mocha": "^9.1.0", "nodemon": "^2.0.12", @@ -31,7 +33,7 @@ "sinon": "^11.1.2", "ts-node": "^10.2.1", "ts-sinon": "^2.0.1", - "typescript": "^4.3.5" + "typescript": "^4.6.3" } }, "../amqp-cacoon": { @@ -93,32 +95,50 @@ } }, "node_modules/@breejs/later": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz", - "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.2.0.tgz", + "integrity": "sha512-EVMD0SgJtOuFeg0lAVbCwa+qeTKILb87jqvLyUtQswGD9+ce2nB52Y5zbTF1Hc0MDFfbydcMcxb47jSdhikVHA==", "engines": { "node": ">= 10" } }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "engines": { - "node": ">= 12" - } - }, "node_modules/@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -157,22 +177,26 @@ "node_modules/@tsconfig/node10": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true }, "node_modules/@types/amqp-connection-manager": { "version": "2.0.12", @@ -218,9 +242,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.2.tgz", - "integrity": "sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw==" + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==" }, "node_modules/@types/sinon": { "version": "9.0.10", @@ -247,6 +271,14 @@ "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -291,6 +323,7 @@ "version": "8.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -302,28 +335,27 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/amqp-cacoon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/amqp-cacoon/-/amqp-cacoon-3.2.0.tgz", - "integrity": "sha512-y5C2NN339d59qnPog91NnWU9vVDfkEoK2EqkimfeJerXeJHGU82l13B9JwlT9wXHWGAfs8ZIH+9aP/PCH+ZqSw==", + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/GiganticPlayground/amqp-cacoon.git#c43b19aef02b91d6e65a6563ba6e2c791f132e6f", + "license": "MIT", "dependencies": { - "amqp-connection-manager": "~3.5.0", + "amqp-connection-manager": "~4.1.14", "amqplib": "^0.8.0", "lodash": "^4.17.21" } }, "node_modules/amqp-connection-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-3.5.2.tgz", - "integrity": "sha512-lvyzz983TDv6aMhvnhn1g/m74Xy+idYKZ8STnuQ6vFTSQmfPThlSNmbs+ZURaEJAVrOVL9M9tlLGCX4PsK7wjA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-4.1.14.tgz", + "integrity": "sha512-1km47dIvEr0HhMUazqovSvNwIlSvDX2APdUpULaINtHpiki1O+cLRaTeXb/jav4OLtH+k6GBXx5gsKOT9kcGKQ==", "dependencies": { - "promise-breaker": "^5.0.0", - "ts-node": "^10.2.1", - "typescript": "^4.3.5" + "promise-breaker": "^6.0.0" }, "engines": { "node": ">=10.0.0", @@ -417,7 +449,8 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/argparse": { "version": "2.0.1", @@ -442,8 +475,26 @@ "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -478,7 +529,57 @@ "node_modules/bitsyntax/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, "node_modules/bluebird": { "version": "3.7.2", @@ -567,7 +668,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -591,6 +691,34 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "node_modules/buffer-more-ints": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", @@ -776,11 +904,73 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, "node_modules/connect-timeout": { "version": "1.9.0", @@ -853,14 +1043,14 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/coronado-bridge": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/coronado-bridge/-/coronado-bridge-2.2.0.tgz", - "integrity": "sha512-BBBffFalubzPG0QZkD6jfVIABe7z1IIKcQk7b7K1imwLcHhL5aFadNj4ggxBAkDoEQ2b4hkGiS55FxDhYQvSrg==", + "version": "2.3.0", + "resolved": "git+ssh://git@github.com/GiganticPlayground/coronado-bridge.git#ba468ed11bfab39dd6271db6593610e499769100", + "license": "MIT", "dependencies": { "connect-timeout": "^1.9.0", "cors": "^2.8.5", @@ -883,7 +1073,8 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/date-format": { "version": "4.0.14", @@ -954,10 +1145,62 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { "node": ">=0.3.1" } }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -971,6 +1214,14 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1253,8 +1504,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -1310,7 +1560,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1392,6 +1641,55 @@ "he": "bin/he" } }, + "node_modules/help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/help-me/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/help-me/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -1427,6 +1725,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -1437,7 +1754,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1530,6 +1846,15 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1556,6 +1881,14 @@ "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1613,10 +1946,22 @@ "node": ">=8.0" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -1673,7 +2018,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1681,6 +2025,14 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -1786,6 +2138,88 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mqtt": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.8.tgz", + "integrity": "sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==", + "dependencies": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mqtt/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/mqtt/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1906,6 +2340,15 @@ "node": ">=0.10.0" } }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -1945,7 +2388,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -2027,7 +2469,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2062,10 +2503,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/promise-breaker": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-5.0.0.tgz", - "integrity": "sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-6.0.0.tgz", + "integrity": "sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -2085,6 +2531,15 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -2169,7 +2624,7 @@ "node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -2189,6 +2644,11 @@ "node": ">=8.10.0" } }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2201,7 +2661,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/rfdc": { "version": "1.3.0", @@ -2437,16 +2897,64 @@ "node": ">=8" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split2/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/split2/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.2.0" } }, "node_modules/statuses": { @@ -2457,6 +2965,11 @@ "node": ">= 0.6" } }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, "node_modules/streamroller": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", @@ -2473,7 +2986,7 @@ "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "node_modules/supports-color": { "version": "8.1.1", @@ -2532,11 +3045,12 @@ } }, "node_modules/ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -2547,18 +3061,17 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", @@ -2676,10 +3189,16 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "node_modules/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2719,6 +3238,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -2727,6 +3251,12 @@ "node": ">= 0.4.0" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2817,8 +3347,35 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, "node_modules/y18n": { "version": "5.0.8", @@ -2829,6 +3386,11 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2928,6 +3490,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "engines": { "node": ">=6" } @@ -2947,21 +3510,39 @@ }, "dependencies": { "@breejs/later": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz", - "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==" - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.2.0.tgz", + "integrity": "sha512-EVMD0SgJtOuFeg0lAVbCwa+qeTKILb87jqvLyUtQswGD9+ce2nB52Y5zbTF1Hc0MDFfbydcMcxb47jSdhikVHA==" }, "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "requires": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@sinonjs/commons": { @@ -3002,22 +3583,26 @@ "@tsconfig/node10": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==" + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true }, "@tsconfig/node12": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==" + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true }, "@tsconfig/node14": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true }, "@tsconfig/node16": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==" + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true }, "@types/amqp-connection-manager": { "version": "2.0.12", @@ -3063,9 +3648,9 @@ "dev": true }, "@types/node": { - "version": "16.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.2.tgz", - "integrity": "sha512-TbG4TOx9hng8FKxaVrCisdaxKxqEwJ3zwHoCWXZ0Jw6mnvTInpaB99/2Cy4+XxpXtjNv9/TgfGSvZFyfV/t8Fw==" + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==" }, "@types/sinon": { "version": "9.0.10", @@ -3092,6 +3677,14 @@ "integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==", "dev": true }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -3131,31 +3724,30 @@ "acorn": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "dev": true }, "acorn-walk": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", - "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==" + "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "dev": true }, "amqp-cacoon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/amqp-cacoon/-/amqp-cacoon-3.2.0.tgz", - "integrity": "sha512-y5C2NN339d59qnPog91NnWU9vVDfkEoK2EqkimfeJerXeJHGU82l13B9JwlT9wXHWGAfs8ZIH+9aP/PCH+ZqSw==", + "version": "git+ssh://git@github.com/GiganticPlayground/amqp-cacoon.git#c43b19aef02b91d6e65a6563ba6e2c791f132e6f", + "from": "git+ssh://git@github.com/GiganticPlayground/amqp-cacoon.git#c43b19aef02b91d6e65a6563ba6e2c791f132e6f", "requires": { - "amqp-connection-manager": "~3.5.0", + "amqp-connection-manager": "~4.1.14", "amqplib": "^0.8.0", "lodash": "^4.17.21" } }, "amqp-connection-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-3.5.2.tgz", - "integrity": "sha512-lvyzz983TDv6aMhvnhn1g/m74Xy+idYKZ8STnuQ6vFTSQmfPThlSNmbs+ZURaEJAVrOVL9M9tlLGCX4PsK7wjA==", + "version": "4.1.14", + "resolved": "https://registry.npmjs.org/amqp-connection-manager/-/amqp-connection-manager-4.1.14.tgz", + "integrity": "sha512-1km47dIvEr0HhMUazqovSvNwIlSvDX2APdUpULaINtHpiki1O+cLRaTeXb/jav4OLtH+k6GBXx5gsKOT9kcGKQ==", "requires": { - "promise-breaker": "^5.0.0", - "ts-node": "^10.2.1", - "typescript": "^4.3.5" + "promise-breaker": "^6.0.0" } }, "amqplib": { @@ -3212,7 +3804,8 @@ "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "argparse": { "version": "2.0.1", @@ -3234,8 +3827,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "binary-extensions": { "version": "2.2.0", @@ -3264,7 +3861,42 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } } } }, @@ -3341,7 +3973,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3362,6 +3993,20 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "buffer-more-ints": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", @@ -3504,11 +4149,55 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "requires": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } }, "connect-timeout": { "version": "1.9.0", @@ -3559,14 +4248,13 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "coronado-bridge": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/coronado-bridge/-/coronado-bridge-2.2.0.tgz", - "integrity": "sha512-BBBffFalubzPG0QZkD6jfVIABe7z1IIKcQk7b7K1imwLcHhL5aFadNj4ggxBAkDoEQ2b4hkGiS55FxDhYQvSrg==", + "version": "git+ssh://git@github.com/GiganticPlayground/coronado-bridge.git#ba468ed11bfab39dd6271db6593610e499769100", + "from": "coronado-bridge@github:GiganticPlayground/coronado-bridge#semver:^2.3.0", "requires": { "connect-timeout": "^1.9.0", "cors": "^2.8.5", @@ -3586,7 +4274,8 @@ "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "date-format": { "version": "4.0.14", @@ -3629,7 +4318,44 @@ "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } }, "ee-first": { "version": "1.1.1", @@ -3641,6 +4367,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3856,8 +4590,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -3897,7 +4630,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3952,6 +4684,40 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "requires": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -3983,6 +4749,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -3993,7 +4764,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4062,6 +4832,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==" + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4085,6 +4860,11 @@ "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==" + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4127,10 +4907,19 @@ "streamroller": "^3.1.3" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "media-typer": { "version": "0.3.0", @@ -4169,11 +4958,15 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, "mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -4252,6 +5045,65 @@ } } }, + "mqtt": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.8.tgz", + "integrity": "sha512-2xT75uYa0kiPEF/PE0VPdavmEkoBzMT/UL9moid0rAvlCtV48qBwxD62m7Ld/4j8tSkIO1E/iqRl/S72SEOhOw==", + "requires": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, + "mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4345,6 +5197,15 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "requires": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4372,7 +5233,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -4423,8 +5283,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-to-regexp": { "version": "1.8.0", @@ -4447,10 +5306,15 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "promise-breaker": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-5.0.0.tgz", - "integrity": "sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-6.0.0.tgz", + "integrity": "sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA==" }, "proxy-addr": { "version": "2.0.7", @@ -4467,6 +5331,15 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -4532,7 +5405,7 @@ "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -4549,6 +5422,11 @@ "picomatch": "^2.2.1" } }, + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4558,7 +5436,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "rfdc": { "version": "1.3.0", @@ -4765,11 +5643,49 @@ } } }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, "streamroller": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.3.tgz", @@ -4783,7 +5699,7 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "supports-color": { "version": "8.1.1", @@ -4826,11 +5742,12 @@ } }, "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "requires": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -4841,6 +5758,7 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" } }, @@ -4932,10 +5850,16 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true }, "undefsafe": { "version": "2.0.5", @@ -4962,11 +5886,22 @@ "requires-port": "^1.0.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5035,8 +5970,18 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", @@ -5044,6 +5989,11 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -5122,7 +6072,8 @@ "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index b6b03a8..d0acce4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rule-harvester", - "version": "2.1.0", + "version": "2.16.3", "description": "RuleHarvester is a rules engine for javascript", "main": "build/index.js", "types": "build/index.d.ts", @@ -13,18 +13,21 @@ "url": "https://github.com/valtech-sd/rule-harvester.git" }, "scripts": { + "prepare": "rimraf ./build && tsc", "start:example": "cd examples && npm run start", "start:example:dev": "nodemon", "build": "rimraf ./build && tsc", "test": "mocha -r ts-node/register ./tests/**/*.test.ts" }, "dependencies": { - "@breejs/later": "^4.1.0", + "@types/ws": "8.5.4", + "@breejs/later": "^4.2.0", "@valtech-sd/rules-js": "^1.0.0", - "amqp-cacoon": "^3.2.0", - "coronado-bridge": "^2.2.0", + "amqp-cacoon": "github:GiganticPlayground/amqp-cacoon#semver:^3.3.0", + "coronado-bridge": "github:GiganticPlayground/coronado-bridge#semver:^2.3.0", "lodash": "^4.17.21", "log4js": "^6.3.0", + "mqtt": "^4.3.8", "p-queue": "^7.3.0" }, "author": "Valtech: Daniel Morris", @@ -35,7 +38,7 @@ "@types/chai": "^4.2.21", "@types/lodash": "^4.14.172", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.2", + "@types/node": "^16.18.103", "chai": "^4.3.4", "mocha": "^9.1.0", "nodemon": "^2.0.12", @@ -43,7 +46,7 @@ "sinon": "^11.1.2", "ts-node": "^10.2.1", "ts-sinon": "^2.0.1", - "typescript": "^4.3.5" + "typescript": "^4.6.3" }, "publishConfig": { "access": "public" diff --git a/src/core/inputs/amqp-input.ts b/src/core/inputs/amqp-input.ts index afdaa9c..7af2c44 100644 --- a/src/core/inputs/amqp-input.ts +++ b/src/core/inputs/amqp-input.ts @@ -165,7 +165,7 @@ export default class CoreInputAmqp implements IInputProvider { if (this.options.ackMode === 'auto') { channel.ack(msg); } - } catch (e) { + } catch (e: any) { output.error = e; // Handle errors! diff --git a/src/core/inputs/helpers/task-scheduler.ts b/src/core/inputs/helpers/task-scheduler.ts index f742e23..1289354 100644 --- a/src/core/inputs/helpers/task-scheduler.ts +++ b/src/core/inputs/helpers/task-scheduler.ts @@ -24,7 +24,7 @@ export interface ScheduleConfig { * This variable controls the max length of that queue **/ defaultMaxPerTaskQueueLength?: number; // Default to Infinity - timezoneConfig?: 'local' | 'utc'; // Local or utc time (Defaults to utc) + timezoneConfig?: 'local' | 'utc' | string; // Local or utc time (Defaults to utc) tasks: TaskConfig[]; // List of tasks } export interface TaskConfig { @@ -68,6 +68,7 @@ export default class TaskScheduler { private schedulerConfig: ScheduleConfig; private taskList: Task[]; private isStarted: boolean; + private specificTimezone?: string; private scheduledFn: (task: Task) => Promise; /** @@ -89,13 +90,17 @@ export default class TaskScheduler { this.scheduledFn = scheduledFn; this.logger?.debug('TaskScheduler -> constructor'); - switch (schedulerConfig.timezoneConfig) { + switch ((schedulerConfig.timezoneConfig || 'utc').toLowerCase()) { case 'local': later.date.localTime(); break; case 'utc': later.date.UTC(); break; + default: + later.date.localTime(); + this.specificTimezone = schedulerConfig.timezoneConfig; + break; } // Initialize task list @@ -135,15 +140,19 @@ export default class TaskScheduler { * @params none * return undefined **/ - stop() { + async stop() { // Start the scheduler if (this.isStarted) { this.logger?.debug('TaskScheduler -> start - Stopping all tasks'); // Schedule the actual tasks + let allPromiseQueues = []; for (let idx in this.taskList) { this.taskList[idx]?.handle?.clear(); + allPromiseQueues.push(this.taskList[idx].promiseQueue.onIdle()); } + // Wait for all tasks to complete + await Promise.all(allPromiseQueues); this.isStarted = false; } else { this.logger?.debug('TaskScheduler -> start - Tasks already stopped'); @@ -170,7 +179,7 @@ export default class TaskScheduler { task.handle = later.setInterval(() => { // Add task to the queue to make sure we only run 1 of the same task at a time this._addToTaskQueue(task); - }, task.schedule); + }, task.schedule, this.specificTimezone); } } @@ -247,12 +256,47 @@ export default class TaskScheduler { throw new Error('Invalid schedule'); } + // This next blob came from the later.js library to calculate the real next value for a given timezone + // this is a workaround for the library only partially supporting timezones + // Specifically setInterval and setTimeout support timezones but next does not + const next = (() => { + const date = new Date(); + const now = date.getTime(); + const s = later.schedule(schedule); + const timezone = this.specificTimezone; + if (!timezone || ['local', 'system'].includes(timezone)) { + return s.next(2, now); + } + + const localOffsetMillis = date.getTimezoneOffset() * 6e4; + const offsetMillis = this._getOffset(date, timezone); + + // Specified timezone has the same offset as local timezone. + // ie. America/New_York = America/Nassau = GMT-4 + if (offsetMillis === localOffsetMillis) { + return s.next(2, now); + } + + // Offsets differ, adjust current time to match what + // it should've been for the specified timezone. + const adjustedNow = new Date(now + localOffsetMillis - offsetMillis); + + return (s.next(2, adjustedNow) as Date[] || /* istanbul ignore next */ []).map( + (sched: any) => { + // adjust scheduled times to match their intended timezone + // ie. scheduled = 2021-08-22T11:30:00.000-04:00 => America/New_York + // intended = 2021-08-22T11:30:00.000-05:00 => America/Mexico_City + return new Date(sched.getTime() + offsetMillis - localOffsetMillis); + } + ); + })(); + this.logger?.debug( 'TaskScheduler -> _addToInternalTaskList - task: ', taskConfig.name, ' - interval: ', taskConfig.intervalText || taskConfig.intervalCron, - ` - Next Schedules: ${later.schedule(schedule).next(1)}` + ` - Next Schedules: ${next}` ); this.taskList.push({ @@ -273,4 +317,23 @@ export default class TaskScheduler { throw err; } } + + // This function is used to get the offset between the local timezone and the specified timezone + // This is a workaround for the later.js library not fully supporting timezones + // This code was taken from the later.js library because it partially supports timezones + private _getOffset(date: Date, zone: string) { + const d = (date as any).toLocaleString('en-US', { + hour12: false, + timeZone: zone, + timeZoneName: 'short' + }) //=> ie. "8/22/2021, 24:30:00 EDT" + .match(/(\d+)\/(\d+)\/(\d+),? (\d+):(\d+):(\d+)/) + .map((n: any) => (n.length === 1 ? '0' + n : n)); + + const zdate = new Date( + `${d[3]}-${d[1]}-${d[2]}T${d[4].replace('24', '00')}:${d[5]}:${d[6]}Z` + ); + + return date.getTime() - zdate.getTime(); + } } diff --git a/src/core/inputs/http-input.ts b/src/core/inputs/http-input.ts index 78d20f4..f3c4af6 100644 --- a/src/core/inputs/http-input.ts +++ b/src/core/inputs/http-input.ts @@ -1,15 +1,15 @@ // Bring in package dependencies -import _ from 'lodash'; +import _ from "lodash"; import CoronadoBridge, { IBridgeConfig, IOutboundProvider, OutboundResponse, -} from 'coronado-bridge'; +} from "coronado-bridge"; // Bring in rule-harvester dependencies -import { IInputProvider, ILogger } from '../../types'; -import { ICoreHttpRequest } from '../types/http-types'; -import * as http from 'http'; +import { IInputProvider, ILogger } from "../../types"; +import { ICoreHttpRequest } from "../types/http-types"; +import * as http from "http"; /** * CoreInputHttpResponseType os an enum for use in the responseMode property of @@ -34,7 +34,7 @@ export enum CoreInputHttpResponseType { // Export an interface to hold our provider options export interface ICoreInputHttpProviderOptions { responseMode: CoreInputHttpResponseType; - responseTimeoutMs?:number; + responseTimeoutMs?: number; staticHttpResponse?: OutboundResponse; inputContextCallback?: (req: ICoreHttpRequest) => void; jsonParsingOptions?: { @@ -58,7 +58,7 @@ export interface ICoreInputHttpProviderOptions { */ origin?: any; // Other keys we are alowing but not defining here - [key:string]: any + [key: string]: any; }; } @@ -76,13 +76,13 @@ export default class CoreInputHttp implements IInputProvider { * This function sets class level variables. * * @param httpPorts - an array of numbers, the ports to start HTTP servers on. - * @param logger - a logger instance to use for logging. + * @param logger - a logger instance to use for logging. * @param options **/ constructor( httpPorts: Array, logger: ILogger | undefined, - options: ICoreInputHttpProviderOptions + options: ICoreInputHttpProviderOptions, ) { this.alreadyRegistered = false; // Save the constructor parameters to local class variables @@ -107,7 +107,7 @@ export default class CoreInputHttp implements IInputProvider { * @returns Promise **/ async registerInput( - applyInputCb: (input: any, context: any) => Promise + applyInputCb: (input: any, context: any) => Promise, ) { this.logger?.trace(`CoreInputHttp.registerHandler: Start`); @@ -124,7 +124,8 @@ export default class CoreInputHttp implements IInputProvider { jsonParsingOptions: this.options.jsonParsingOptions, corsOptions: this.options.corsOptions, }; - if (this.options.responseTimeoutMs) bridgeConfig.requestTimeoutMs = this.options.responseTimeoutMs; + if (this.options.responseTimeoutMs) + bridgeConfig.requestTimeoutMs = this.options.responseTimeoutMs; this.httpBridge = new CoronadoBridge(bridgeConfig); // Keep track so that we only register one http bridge @@ -136,8 +137,9 @@ export default class CoreInputHttp implements IInputProvider { async unregisterInput() { return new Promise((resolve, reject) => { try { - this.httpBridge.close(); - resolve(); + this.httpBridge.close(() => { + resolve(); + }); } catch (e) { reject(e); } @@ -165,7 +167,7 @@ class HttpHandler implements IOutboundProvider { constructor( applyInputCb: (input: any, context: any) => Promise, logger: ILogger | undefined, - options: ICoreInputHttpProviderOptions + options: ICoreInputHttpProviderOptions, ) { this.applyInputCb = applyInputCb; this.logger = logger; @@ -243,12 +245,12 @@ class HttpHandler implements IOutboundProvider { } break; } - } catch (ex) { + } catch (ex: any) { // Something threw. We pass it forward. If it's a BridgeError the bridge will // pass properly formatted to the http client! Otherwise, the bridge will return an http 500 with // ex.message. this.logger?.trace( - `CoreInputHttp HttpHandler - Received error - ${ex.message}` + `CoreInputHttp HttpHandler - Received error - ${ex.message}`, ); throw ex; } @@ -274,7 +276,11 @@ class HttpHandler implements IOutboundProvider { // we respond wih that! If it's empty or just undefined, the http bridge will just respond // with http 200 and an empty body! The http bridge will also always respond with 200 if // this is not an instanceof OutboundResponse. - return new OutboundResponse(result.httpResponseAction.body, result.httpResponseAction.status, result.httpResponseAction.headers); + return new OutboundResponse( + result.httpResponseAction.body, + result.httpResponseAction.status, + result.httpResponseAction.headers, + ); } /** @@ -288,12 +294,14 @@ class HttpHandler implements IOutboundProvider { */ private callRulesWithoutWaitingForResponse( req: ICoreHttpRequest, - context: any + context: any, ) { // Since we're not "waiting" here for the Rules Engine pass, we catch any errors and log // This solves an issue where a promise error would go unhandled. - this.applyInputCb({ httpRequest: req }, context).catch(err => this.logger?.trace( - `CoreInputHttp HttpHandler, callRulesWithoutWaitingForResponse - Received error from applyInputCb - ${err.message}` - )); + this.applyInputCb({ httpRequest: req }, context).catch((err) => + this.logger?.trace( + `CoreInputHttp HttpHandler, callRulesWithoutWaitingForResponse - Received error from applyInputCb - ${err.message}`, + ), + ); } } diff --git a/src/core/inputs/mqtt-input.ts b/src/core/inputs/mqtt-input.ts new file mode 100644 index 0000000..07b0bb0 --- /dev/null +++ b/src/core/inputs/mqtt-input.ts @@ -0,0 +1,158 @@ +import { IInputProvider, ILogger } from '../../types'; +import _ from 'lodash'; +import { MqttClient } from 'mqtt'; +import { default as util } from 'util'; +import { ICoreMqttMessage } from '../types/mqtt-types'; + + +export interface ICoreInputMqttProviderOptions { + inputContextCallback?: (topic: string, message: Buffer) => void; +} + + +/** + * Rule Input Provider Mqtt + * + * This class wires up a MqttClient to a rule input provider. + * + * Usage: + * 1. Instantiate the class and pass in the instantiated MqttClient and logger + * 2. call registerHandler to register the input callback + * 3. When input comes in, the handler registered in step 2 will be called + * + **/ +export default class CoreInputMqtt implements IInputProvider { + private alreadyRegistered: boolean; + private handler!: (input: any, context: any) => Promise; + private logger?: ILogger; + private mqttClient: MqttClient; + private mqttTopic: string; + private options: ICoreInputMqttProviderOptions; + + /** + * constructor + * + * This function sets class level variables. + * + **/ + constructor( + mqttClient: MqttClient, + mqttTopic: string, + logger: ILogger | undefined, + options: ICoreInputMqttProviderOptions + ) { + this.alreadyRegistered = false; + // Save the constructor parameters to local class variables + this.logger = logger; + this.mqttClient = mqttClient; + this.mqttTopic = mqttTopic; + this.options = options; + } + + /** + * registerHandler + * + * Does this by... + * 1. Points the passed in applyInputCb to a class instance handler + * 2. If this is the first call then we register an amqpCacoon consumer which in turn + * registers an mqttHandler function that will receive all new AMQP messages. + * + * @param applyInputCb - a handler that will be called when there is input. It should be passed input and context. + * @returns Promise + **/ + async registerInput( + applyInputCb: (input: any, context: any) => Promise + ) { + this.logger?.trace(`CoreInputMqtt.registerHandler: Start`); + + // Link applyInputCb to a class property we can reference later + this.handler = applyInputCb; + + if (!this.alreadyRegistered) { + // 2. If we are not already setup subscribe to the topic and register the handler + this.mqttClient.subscribe(this.mqttTopic, (error) => this.logger?.error(`CoreInputMqtt.registerHandler: Error subscribing to topic ${this.mqttTopic}: ${error}`)); + this.mqttClient.on('message', (topic, message) => this.mqttHandler(topic, message)); + + this.alreadyRegistered = true; + } + + this.logger?.trace(`CoreInputMqtt.registerHandler: End`); + } + + /** + * mqttHandler + * + * This is the function that we register with mqttClient on message. + * + * Note tha this INPUT provider adds a SPECIFIC object into facts with property mqttMessage. + * mqttMessage in turn has three objects: + * - topic: a string containing the MQTT Topic. + * - message: string containing the MQTT message. + * + * @param channel: the active/open AMQP channel (inside a ChannelWrapper from node-amqp-connection-manager) to consume from. + * @param msg: object - the message object, ConsumeMessage type. + * @return Promise + **/ + async mqttHandler(topic: string, message: Buffer) { + this.logger?.trace(`CoreInputMqtt.mqttHandler: Start`); + let output = {facts: undefined, error: undefined} + let mqttMessage: ICoreMqttMessage | undefined= undefined; + try { + // Create an object for our message - note we DO NOT validate the message here at all! + // It will be set to a string with whatever. it's the responsibility of the application + // using this Input to validate and THROW an error with the name 'MessageValidationError' + // which this method will catch and treat differently! + + // Convert the Buffer to a string + const messageString = message.toString(); + + mqttMessage = { + topic, + message: messageString, + }; + + // And an object for our context + let context: any = {}; + + // Call the inputContextCallback if we were passed one + if (this.options.inputContextCallback) { + context = _.merge(context, this.options.inputContextCallback(topic, message)); + } + + this.logger?.debug( + `CoreInputMqtt.mqttHandler - mqttMessage: ${util.inspect(mqttMessage)}` + ); + + // Call our handler with an object for facts called mqttMessage that wraps our + // ICoremqttMessage. Why? This input can't "own" the facts structure of the rules engine + // since that should be driven by an application. Therefore, we just put in 1 item into + // facts, an mqttMessage and then let the application do whatever it wants/needs. + // Note, the handler WILL return updated facts, but we're not using them in this input! + output.facts = await this.handler( + { mqttMessage }, + context + ); + } catch (e: any) { + output.error = e; + // Handle errors! + + // If this is a message validation error then we do not need to retry because this is not going to magically be fixed. + // Note: Applications using this Input are expected to return an error name == 'MessageValidationError' + // to trigger this first condition! These messages, since they are invalid, are ACK so that they don't + // requeue forever! (They're expected to fail any retry, since they're invalid!) + if (e.name === 'MessageValidationError') { + this.logger?.error( + `CoreInputMqtt.mqttHandler: Validation Error: ${e.message}` + ); + } else { + // Otherwise, the error is something other than INVALID MESSAGE, so we deal with it. + this.logger?.error( + `CoreInputMqtt.mqttHandler - ERROR: ${e.message}` + ); + } + this.logger?.trace(`The message contained: ${message.toString()}`); + } + + this.logger?.trace(`CoreInputMqtt.mqttHandler: End`); + } +} diff --git a/src/core/inputs/scheduler-input.ts b/src/core/inputs/scheduler-input.ts index 55619d7..d3f7f73 100644 --- a/src/core/inputs/scheduler-input.ts +++ b/src/core/inputs/scheduler-input.ts @@ -112,14 +112,7 @@ export default class CoreInputSchedulerProvider implements IInputProvider { } async unregisterInput() { - return new Promise((resolve, reject) => { - try { - this.scheduler.stop(); - this.alreadyRegistered = false; - resolve(); - } catch (e) { - reject(e); - } - }); + await this.scheduler.stop(); + this.alreadyRegistered = false; } } diff --git a/src/core/inputs/udp-input.ts b/src/core/inputs/udp-input.ts index c17d6fc..97077a9 100644 --- a/src/core/inputs/udp-input.ts +++ b/src/core/inputs/udp-input.ts @@ -5,6 +5,7 @@ import dgram, { RemoteInfo, Socket } from 'node:dgram'; // Bring in rule-harvester dependencies import { IInputProvider, ILogger } from '../../types'; import { ICoreUdpRequest } from '../types/udp-types'; +import { default as util } from 'util'; // Export an interface to hold our provider options export interface ICoreInputUdpProviderOptions { @@ -71,9 +72,9 @@ export default class CoreInputUdpProvider implements IInputProvider { // 2. If we are not already setup then loop over every configured port for (let p of this.udpPorts) { - // Configure then Start up a new instance of the Udp Bridge (note, this wires in the handler!) + // Configure then Start up a new instance of the Udp Bridge // 3. for every configured port create udp socket - let socket = dgram.createSocket('udp4', this.udpHandler); + let socket = dgram.createSocket('udp4'); this.logger?.trace( `CoreInputUdp.registerHandler: Starting server on port ${p}` ); @@ -90,8 +91,19 @@ export default class CoreInputUdpProvider implements IInputProvider { `CoreInputUdp.registerHandler: Server listening on ${address.family} ${address.address}:${address.port}` ); }); - // 6. for every configured port setup message handler - socket.on('message', this.udpHandler.bind(this)); + // 6. for every configured port setup message handler, error and drop handlers + socket.on('message', (msg: Buffer, rinfo: RemoteInfo) => { + this.udpHandler(msg, p, rinfo); + }); + + socket.on('error', (error) => { + this.logger?.error(`CoreInputUdp: UDP server error on port ${p}:`, error); + }); + + socket.on('drop', () => { + this.logger?.trace(`CoreInputUdp: Packet dropped on port ${p} due to full buffer`); + }); + // 7. for every configured port save the socket for later removal if we ever unregisterInput this.udpServer.push(socket); } @@ -110,15 +122,19 @@ export default class CoreInputUdpProvider implements IInputProvider { * 2. Optionaly call inputContextCallback if it is defined to build a context * 3. Pass input facts and context to the rules engine */ - async udpHandler(msg: Buffer, rinfo: RemoteInfo) { + async udpHandler(msg: Buffer, port: number, rinfo: RemoteInfo) { this.logger?.trace(`CoreInputUdp.udpHandler: Start`); try { // 1. Build input facts let input: ICoreUdpRequest = { body: msg.toString(), remoteInfo: rinfo, + port }; + this.logger?.debug( + `CoreInputUdp.udpHandler - udpMessage: ${util.inspect(input)}` + ); // And an object for our context let context: any = {}; @@ -149,4 +165,4 @@ export default class CoreInputUdpProvider implements IInputProvider { } }); } -} +} \ No newline at end of file diff --git a/src/core/outputs/amqp-output.ts b/src/core/outputs/amqp-output.ts index 5228645..5d6be65 100644 --- a/src/core/outputs/amqp-output.ts +++ b/src/core/outputs/amqp-output.ts @@ -122,15 +122,14 @@ export default class CoreOutputAmqp implements IOutputProvider { } } else { // We don't have an amqpPublishAction, so we log that. - this.logger?.error( - `CoreOutputAmqp.outputResult: Error in retrieving an amqpPublishAction from result.facts. Nothing was published.` + this.logger?.info( + `CoreOutputAmqp.outputResult: No amqpPublishAction from result.facts. Nothing was published.` ); } - } catch (e) { + } catch (e: any) { // Oh no! Something else. Log the error. this.logger?.error( - `CoreOutputAmqp.outputResult: Error - INNER ERROR: ${e.message}` - ); + `CoreOutputAmqp.outputResult: Error - INNER ERROR: ${e.message}`); } this.logger?.trace(`CoreOutputAmqp.outputResult: End`); diff --git a/src/core/outputs/amqp-rpc-output.ts b/src/core/outputs/amqp-rpc-output.ts index 3f3711b..0c604eb 100644 --- a/src/core/outputs/amqp-rpc-output.ts +++ b/src/core/outputs/amqp-rpc-output.ts @@ -140,7 +140,7 @@ export default class CoreOutputAmqpRpc implements IOutputProvider { ); } } - } catch (e) { + } catch (e: any) { // Oh no! Something else. Log the error. this.logger?.error( `CoreOutputAmqpRpc.outputResult: Error - INNER ERROR: ${e.message}` diff --git a/src/core/outputs/mqtt-output.ts b/src/core/outputs/mqtt-output.ts new file mode 100644 index 0000000..c198778 --- /dev/null +++ b/src/core/outputs/mqtt-output.ts @@ -0,0 +1,67 @@ +import { MqttClient } from 'mqtt'; +import { ILogger, IOutputProvider, IOutputResult } from '../../types'; + +import { default as util } from 'util'; +import { ICoreMQTTPublishAction } from '../types/mqtt-types'; + +export default class CoreOutputMqtt implements IOutputProvider { + private mqttClient: MqttClient; + private logger?: ILogger; + + constructor(client: MqttClient, logger: ILogger) { + this.mqttClient = client; + this.logger = logger; + } + + async outputResult(result: IOutputResult) { + this.logger?.trace(`CoreOutputMqtt.outputResult: Start`); + // Process the incoming results + try { + if (result.error) { + // The rules engine already sent in an error, so we just log and not output + this.logger?.error( + `CoreOutputMqtt.outputResult: the result object contained an error. Nothing will publish. The error received was: ${util.inspect( + result.error + )}` + ); + } else if (result?.facts?.mqttPublishAction) { + // No error + we have an facts.mqttPublishAction so we publish! + + // Setup an array of actions so we can handle multiple. + let mqttPublishArray: Array = []; + + // Were we passed an ARRAY of mqttPublishAction in facts.mqttPublishAction? + if (Array.isArray(result.facts.mqttPublishAction)) { + // It is an array, so we just set our local to the array we were passed + mqttPublishArray = result.facts.mqttPublishAction; + } else { + // Not an array, so let's add the one action into our local array + mqttPublishArray.push(result.facts.mqttPublishAction); + } + + // Now, let's loop over the array and publish each + for (let mqttPublishAction of mqttPublishArray) { + const topic = mqttPublishAction.mqttTopic; + const message = mqttPublishAction.mqttMessage; + + this.mqttClient.publish(topic, message, {retain: true}); + this.logger?.info( + `CoreOutputMqtt.outputResult: Message published to topic='${topic}' message='${util.inspect(message)}'.` + ); + } + } else { + // We don't have an mqttPublishAction, so we log that. + this.logger?.info( + `CoreOutputMqtt.outputResult: No mqttPublishAction from result.facts. Nothing was published.` + ); + } + } catch (e: any) { + // Oh no! Something else. Log the error. + this.logger?.error( + `CoreOutputMqtt.outputResult: Error - INNER ERROR: ${e.message}` + ); + } + + this.logger?.trace(`CoreOutputMqtt.outputResult: End`); + } +} diff --git a/src/core/outputs/udp-output.ts b/src/core/outputs/udp-output.ts new file mode 100644 index 0000000..47a2d5e --- /dev/null +++ b/src/core/outputs/udp-output.ts @@ -0,0 +1,75 @@ +import dgram, { Socket } from 'node:dgram'; +import { ILogger, IOutputProvider, IOutputResult } from '../../types'; + +import { default as util } from 'util'; +import { ICoreUdpPublishAction } from '../types/udp-types'; + +export default class CoreOutputUdp implements IOutputProvider { + private socket: Socket; + private logger?: ILogger; + + constructor(logger: ILogger) { + this.socket = dgram.createSocket('udp4'); + this.logger = logger; + } + + async outputResult(result: IOutputResult) { + this.logger?.trace(`CoreOutputUdp.outputResult: Start`); + // Process the incoming results + try { + if (result.error) { + // The rules engine already sent in an error, so we just log and not output + this.logger?.error( + `CoreOutputUdp.outputResult: the result object contained an error. Nothing will publish. The error received was: ${util.inspect( + result.error + )}` + ); + } else if (result?.facts?.udpPublishAction) { + // No error + we have an facts.udpPublishAction so we publish! + + // Setup an array of actions so we can handle multiple. + let udpPublishArray: Array = []; + + // Were we passed an ARRAY of udpPublishAction in facts.udpPublishAction? + if (Array.isArray(result.facts.udpPublishAction)) { + // It is an array, so we just set our local to the array we were passed + udpPublishArray = result.facts.udpPublishAction; + } else { + // Not an array, so let's add the one action into our local array + udpPublishArray.push(result.facts.udpPublishAction); + } + + // Now, let's loop over the array and publish each + for (let udpPublishAction of udpPublishArray) { + const ip = udpPublishAction.ip; + const port = udpPublishAction.port; + const message = udpPublishAction.message; + + this.socket.send(message, port, ip, (err) => { + if (err) { + this.logger?.error( + `CoreOutputUdp.outputResult - Error: ${err}` + ); + } + + this.logger?.info( + `CoreOutputUdp.outputResult: Message published to ip='${ip}' port='${port} message='${message}'.` + ); + }); + } + } else { + // We don't have an udpPublishAction, so we log that. + this.logger?.info( + `CoreOutputUdp.outputResult: No udpPublishAction from result.facts. Nothing was published.` + ); + } + } catch (e: any) { + // Oh no! Something else. Log the error. + this.logger?.error( + `CoreOutputUdp.outputResult: Error - INNER ERROR: ${e.message}` + ); + } + + this.logger?.trace(`CoreOutputUdp.outputResult: End`); + } +} diff --git a/src/core/types/mqtt-types.ts b/src/core/types/mqtt-types.ts new file mode 100644 index 0000000..d28c58d --- /dev/null +++ b/src/core/types/mqtt-types.ts @@ -0,0 +1,19 @@ + +/** + * Core MQTT Publish Action - Used for the Core MQTT Output + * + * This object is used to control what the Core MQTT Output publishes. + * + * This is intended to be passed inside an ARRAY of these in order to send multiple messages! + */ +export interface ICoreMQTTPublishAction { + // The exchange to publish into + mqttTopic: string; + // The content of the message, which should already be a string. Applications should JSON.stringify before passing. + mqttMessage: string; +} + +export interface ICoreMqttMessage { + topic: string; + message: string; +} \ No newline at end of file diff --git a/src/core/types/udp-types.ts b/src/core/types/udp-types.ts index ab7f36e..71d0a76 100644 --- a/src/core/types/udp-types.ts +++ b/src/core/types/udp-types.ts @@ -3,4 +3,11 @@ import { RemoteInfo } from 'node:dgram'; export interface ICoreUdpRequest { body: string; remoteInfo: RemoteInfo; + port: number; +} + +export interface ICoreUdpPublishAction { + ip: string; + port: number; + message: string; } diff --git a/src/index.ts b/src/index.ts index ce280ff..ea943ef 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,10 +5,10 @@ import { ICorpusRuleGroup, IClosure, ILogger, -} from './types'; +} from "./types"; //@ts-ignore -import Engine from '@valtech-sd/rules-js'; -import _ from 'lodash'; +import Engine from "@valtech-sd/rules-js"; +import _ from "lodash"; export interface IRuleHarvesterProviders { inputs: IInputProvider[]; @@ -24,57 +24,66 @@ export interface IRuleHarvesterConfig { closureHandlerWrapper?: ( facts: any, context: any, - handler: (facts: any, context: any) => any | Promise + handler: (facts: any, context: any) => any | Promise, ) => any | Promise; fieldDereferenceChar?: string; } -export * from './types'; +export * from "./types"; -export * from './generators'; +export * from "./generators"; // Export Core Closures, Both as a single export and as individuals for flexibility -export { default as CoreClosures } from './core/closures/index'; -export { default as CoreConditionals } from './core/closures/conditionals'; -export { default as CoreTransformations } from './core/closures/transformations'; -export { default as CoreErrorHandling } from './core/closures/error-handling'; -export { default as CoreErrorHandlingHttp } from './core/closures/error-handling-http'; +export { default as CoreClosures } from "./core/closures/index"; +export { default as CoreConditionals } from "./core/closures/conditionals"; +export { default as CoreTransformations } from "./core/closures/transformations"; +export { default as CoreErrorHandling } from "./core/closures/error-handling"; +export { default as CoreErrorHandlingHttp } from "./core/closures/error-handling-http"; // Export Core Inputs, individually since these are pick-and-choose export { default as CoreInputAmqp, ICoreInputAmqpProviderOptions, -} from './core/inputs/amqp-input'; +} from "./core/inputs/amqp-input"; export { default as CoreInputHttp, ICoreInputHttpProviderOptions, CoreInputHttpResponseType, -} from './core/inputs/http-input'; +} from "./core/inputs/http-input"; export { default as CoreInputUdp, ICoreInputUdpProviderOptions, -} from './core/inputs/udp-input'; +} from "./core/inputs/udp-input"; export { default as CoreInputScheduler, ICoreInputSchedulerProviderOptions, -} from './core/inputs/scheduler-input'; +} from "./core/inputs/scheduler-input"; + +export { + default as CoreInputMQTT, + ICoreInputMqttProviderOptions, +} from "./core/inputs/mqtt-input"; // Export Core Outputs, individually since these are pick-and-choose -export { default as CoreOutputAmqp } from './core/outputs/amqp-output'; -export { default as CoreOutputAmqpRpc } from './core/outputs/amqp-rpc-output'; +export { default as CoreOutputAmqp } from "./core/outputs/amqp-output"; +export { default as CoreOutputAmqpRpc } from "./core/outputs/amqp-rpc-output"; +export { default as CoreOutputMQTT } from "./core/outputs/mqtt-output"; +export { default as CoreOutputUdp } from "./core/outputs/udp-output"; // Export Core Types that are shared by various components // AMQP -export * from './core/types/amqp-types'; +export * from "./core/types/amqp-types"; // HTTP -export * from './core/types/http-types'; +export * from "./core/types/http-types"; // UDP -export * from './core/types/udp-types'; +export * from "./core/types/udp-types"; // Scheduler -export * from './core/types/scheduler-types'; +export * from "./core/types/scheduler-types"; +// MQTT +export * from "./core/types/mqtt-types"; // Export RuleHarvester export default class RuleHarvester { @@ -82,15 +91,15 @@ export default class RuleHarvester { config: IRuleHarvesterConfig; engine: any; logger?: ILogger; - fieldDereferenceChar: string = '^'; + fieldDereferenceChar: string = "^"; ruleGroups: string[]; extraContext?: object | null; forbiddenExtraContext: string[] = [ - 'engine', - 'parameters', - 'rulesFired', - 'currentRuleFlowActivated', - 'fact', + "engine", + "parameters", + "rulesFired", + "currentRuleFlowActivated", + "fact", ]; /***************************** @@ -137,9 +146,9 @@ export default class RuleHarvester { if (_.isString(originalValue)) { newValue = this.dereferenceString(facts, originalValue); } else if (_.isArray(originalValue)) { - newValue = this.dereferenceArray(facts, originalValue); + newValue = this.dereferenceArray(facts, [...originalValue]); } else if (_.isObject(originalValue)) { - newValue = this.dereferenceObject(facts, originalValue); + newValue = this.dereferenceObject(facts, { ...(originalValue ?? {}) }); } return newValue; } @@ -179,7 +188,7 @@ export default class RuleHarvester { public defaultClosureHandlerWrapper( name: string, handler: (facts: any, context: any) => any | Promise, - options?: any + options?: any, ): (facts: any, context: any) => any | Promise { return async (factsAndOrRunContext: any, context: any) => { // _.defaults overrides if a value does not already exist @@ -212,22 +221,9 @@ export default class RuleHarvester { contextExt.closureName = name; contextExt.closureOptions = options; - contextExt.parameters = this.dereferenceObject( - facts, - _.cloneDeep(contextExt.parameters) - ); - // let parameterKeys = Object.keys(contextExt.parameters || {}); - // for (let i = 0; i < parameterKeys.length; i++) { - // const key = parameterKeys[i]; - // if (key.charAt(0) === this.fieldDereferenceChar) { - // const newKey = parameterKeys[i].substr(1); - // contextExt.parameters[newKey] = _.get( - // facts, - // contextExt.parameters[key] - // ); - // delete contextExt.parameters[key]; - // } - // } + contextExt.parameters = this.dereferenceObject(facts, { + ...(contextExt?.parameters ?? {}), + }); result = this.config.closureHandlerWrapper // closureHandlerWrapper exist ? await this.config.closureHandlerWrapper(facts, contextExt, handler) // then call wrapper function @@ -245,7 +241,7 @@ export default class RuleHarvester { if (this.logger) { this.logger.error( `RuleHarvester.defaultClosureHandlerWrapper - Closure Name: ${name} - Error: `, - e + e, ); } throw e; @@ -269,7 +265,7 @@ export default class RuleHarvester { result.handler = this.defaultClosureHandlerWrapper( closure.name, closure.handler, - closure.options + closure.options, ); } return result; @@ -303,17 +299,17 @@ export default class RuleHarvester { this.logger = this.config.providers.logger; this.extraContext = this.config.extraContext; this.ruleGroups = []; - this.fieldDereferenceChar = this.config.fieldDereferenceChar || '^'; + this.fieldDereferenceChar = this.config.fieldDereferenceChar || "^"; // Make sure extraContext is not using forbidden fields let badContext = _.intersection( _.keys(this.extraContext), - this.forbiddenExtraContext + this.forbiddenExtraContext, ); if ((badContext || []).length > 0) { throw new Error( `One of the extraContext fields specified is forbidden and could mess with the rules engine. (${badContext.join( - ', ' - )})` + ", ", + )})`, ); } @@ -334,7 +330,7 @@ export default class RuleHarvester { this.engine.closures.add( closure.name, closure.handler, - closure.options + closure.options, ); } } @@ -349,8 +345,8 @@ export default class RuleHarvester { } catch (e) { if (this.logger) { this.logger.fatal( - 'RuleHarvester - Error during harvester engine setup.', - e + "RuleHarvester - Error during harvester engine setup.", + e, ); } throw e; @@ -386,7 +382,7 @@ export default class RuleHarvester { async applyRule( input: any, thisRunContext: any = null, - ruleGroupOverrides: string[] | undefined = undefined + ruleGroupOverrides: string[] | undefined = undefined, ) { if (input) { let fact = input; @@ -394,7 +390,7 @@ export default class RuleHarvester { let error = null; try { let ruleGroups = ruleGroupOverrides || this.ruleGroups; - ruleGroups = typeof ruleGroups === 'string' ? [ruleGroups] : ruleGroups; + ruleGroups = typeof ruleGroups === "string" ? [ruleGroups] : ruleGroups; for (group of ruleGroups) { // Loop over groups and set the fact from previous // rules group to the input fact for the next rules group @@ -412,9 +408,9 @@ export default class RuleHarvester { error = e; if (this.logger) { this.logger.error( - 'RuleHarvester - Error: An error occurred while processing rule', + "RuleHarvester - Error: An error occurred while processing rule", `GROUP: ${group}, fact: ${JSON.stringify(fact, null, 2)}`, - e + e, ); } } @@ -430,7 +426,7 @@ export default class RuleHarvester { error, errorGroup: error ? group : undefined, context: thisRunContext, - }) + }), ); } await Promise.all(proms); @@ -438,9 +434,9 @@ export default class RuleHarvester { error = e; if (this.logger) { this.logger.error( - 'RuleHarvester - Error: An error occurred while processing rule', + "RuleHarvester - Error: An error occurred while processing rule", `GROUP: ${group}, fact: ${JSON.stringify(fact, null, 2)}`, - e + e, ); } } diff --git a/tests/unit/benchmark_when_then.test.ts b/tests/unit/benchmark_when_then.test.ts new file mode 100644 index 0000000..307b968 --- /dev/null +++ b/tests/unit/benchmark_when_then.test.ts @@ -0,0 +1,113 @@ +import { expect } from "chai"; +import "mocha"; +import Utils from "../utils"; +import RulesHarvester, { CoreConditionals, closureGenerator } from "../../src"; + +describe("Rules Harvester benchmarks", () => { + it("benchmarks 20 equal closure calls in when/then chain", async () => { + const ruleCount = 50; + const tryClosure = closureGenerator( + "try", + async (facts: any, context: any) => { + const { try: tryFn, catch: catchFn } = context.parameters; + try { + return await tryFn.process( + facts, + context, + // Object.assign(context, { parameters: {} }), + ); + } catch (exception) { + facts[context.parameters.exceptionKey || "exception"] = exception; + await catchFn.process( + facts, + context, + // Object.assign(context, { parameters: {} }), + ); + + return facts; + } + }, + { required: ["try", "catch"], closureParameters: ["try", "catch"] }, + ); + const corpus = [ + { + name: "Benchmark 50 equal rules", + rules: Array.from({ length: ruleCount }, (_unused, index) => ({ + when: [ + { + closure: "try", + try: { + closure: "equal", + "^value1": "path.in.facts", + value2: "whatever test we want", + }, + catch: { closure: "extendFacts", "result.tryFailed": true }, + }, + ], + then: [ + { + closure: "try", + try: { + closure: "extendFacts", + [`result.benchMatched${index}`]: true, + }, + catch: { closure: "extendFacts", "result.tryFailed": true }, + }, + ], + })), + }, + ]; + + const extraClosures = Array.from({ length: 500 }, (_unused, index) => ({ + name: `benchNoop${index}`, + handler(_facts: any, _context: any) { + return true; + }, + })); + + const { config, rulesInputStub, rulesOutputStub } = + Utils.generateRulesHarvesterConfig({ + corpus, + closures: [ + ...Utils.closures, + ...CoreConditionals, + tryClosure, + ...extraClosures, + ], + }); + + const rulesHarvester = new RulesHarvester(config); + rulesHarvester.start(); + + const applyInput = rulesInputStub.registerInput.lastCall.args[0]; + + const facts = { + path: { in: { facts: "whatever test we want" } }, + }; + + const iterations = 500; + const durationsMs: number[] = []; + + for (let i = 0; i < iterations; i++) { + const start = process.hrtime.bigint(); + await applyInput(facts, { runId: i }); + const end = process.hrtime.bigint(); + durationsMs.push(Number(end - start) / 1_000_000); + } + + const averageMs = + durationsMs.reduce((sum, value) => sum + value, 0) / iterations; + + console.log( + `Average duration for ${iterations} runs with ${ruleCount} rules: ${averageMs.toFixed( + 3, + )}ms`, + ); + + expect(rulesOutputStub.outputResult.callCount).to.equal(iterations); + expect( + rulesOutputStub.outputResult.lastCall.args[0].facts.result.benchMatched0, + ).to.equal(true); + expect(Number.isFinite(averageMs)).to.equal(true); + }); +}); diff --git a/tests/unit/rules_worker.test.ts b/tests/unit/rules_worker.test.ts index 249f2b5..6af087b 100644 --- a/tests/unit/rules_worker.test.ts +++ b/tests/unit/rules_worker.test.ts @@ -511,6 +511,50 @@ describe('Rules Harvester', () => { }); }); + it('Closure parameter mutation does not persist across runs', async () => { + const seenValues: string[] = []; + const corpus = [ + { + name: 'Mutate parameters', + rules: [ + { + when: [{ closure: 'mutateParam', value: 'original' }], + then: [{ closure: 'extendFacts', 'result.mutated': true }], + }, + ], + }, + ]; + + let { config, rulesInputStub, rulesOutputStub } = + Utils.generateRulesHarvesterConfig({ + corpus, + closures: [ + ...Utils.closures, + { + name: 'mutateParam', + handler(_facts: any, context: any) { + seenValues.push(context.parameters.value); + context.parameters.value = 'mutated'; + return true; + }, + }, + ], + }); + + let rulesHarvester = new RulesHarvester(config); + rulesHarvester.start(); + + const applyInput = rulesInputStub.registerInput.lastCall.args[0]; + + await applyInput({ event: { type: 'test' } }); + await applyInput({ event: { type: 'test' } }); + + expect(rulesOutputStub.outputResult.called, 'outputResult was not called') + .to.be.true; + + expect(seenValues).to.deep.equal(['original', 'original']); + }); + it('applyRule hat (^) Missing dereference', async () => { let runTimeContext = { runTimeContextValue: 'SomRuntimeValue' }; const corpus = [