diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 83e10eb..ef3a34f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -54,7 +54,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/init@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -68,7 +68,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/autobuild@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9 # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -81,6 +81,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/analyze@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6eb4f6c..741aab5 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -73,6 +73,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/upload-sarif@c0d1daa7f7e14667747d73a7dbbe8c074bc8bfe2 # v2.22.9 with: sarif_file: results.sarif diff --git a/package-lock.json b/package-lock.json index 27e9e1f..a12bdb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,14 +20,14 @@ "src/pattern" ], "devDependencies": { - "@nodesecure/eslint-config": "^1.8.0", - "@types/node": "^20.9.4", + "@nodesecure/eslint-config": "^1.9.0", + "@types/node": "^20.10.4", "c8": "^8.0.1", "cross-env": "^7.0.3", "glob": "^10.3.10", "tsup": "^8.0.1", - "tsx": "^4.4.0", - "typescript": "^5.3.2" + "tsx": "^4.6.2", + "typescript": "^5.3.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -53,12 +53,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -66,31 +66,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -104,10 +104,16 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -123,12 +129,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -200,16 +206,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -243,9 +249,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -261,35 +267,35 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -298,9 +304,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -324,19 +330,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -345,12 +351,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -744,18 +750,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -776,9 +782,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -791,9 +797,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -808,12 +814,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -835,9 +841,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -977,12 +983,15 @@ } }, "node_modules/@myunisoft/loki": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@myunisoft/loki/-/loki-2.1.0.tgz", - "integrity": "sha512-QWWo3/fN+ZABIFgK4vX8J/F0YLUeU7HgVbdDbRoddwe4Q6S6SuUV91xc4bZ/48cn6J91fvjx3rfbJVESparaBw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/loki/-/loki-3.0.0.tgz", + "integrity": "sha512-hyPwBkXOejI04A5b4o1SZXXtiAs8CnKnvW/cgaeeY3vX9cbjdEx2zO7ejkaX67hCjvBTgwOYH/7P+K6FCF1e3A==", "dependencies": { "@myunisoft/httpie": "^2.0.1", - "dayjs": "^1.11.9", + "@openally/auto-url": "^1.0.1", + "@sigyn/logql": "^2.0.0", + "@sigyn/pattern": "^1.0.0", + "dayjs": "^1.11.10", "ms": "^2.1.3" }, "engines": { @@ -1039,18 +1048,26 @@ } }, "node_modules/@nodesecure/eslint-config": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@nodesecure/eslint-config/-/eslint-config-1.8.0.tgz", - "integrity": "sha512-0DywqsYSZQGVODGjAetKaqx8nfQ9ZejoDie2JJ86993UfvWh3tVjwEj9/a+6RAJKwZ9Rr4yQ3RHyKBamexGRfA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@nodesecure/eslint-config/-/eslint-config-1.9.0.tgz", + "integrity": "sha512-OzPsejWVSfdACHGBxLbg/jeKzTfDpvyasxkWdeLvDXiA0x0RxvWPm55kPH6QISa2e5SoILM8E8HEDsSWIJiOlg==", "dev": true, "dependencies": { - "@babel/core": "^7.22.8", - "@babel/eslint-parser": "^7.22.7", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0", - "eslint": "^8.44.0" + "@babel/core": "^7.23.5", + "@babel/eslint-parser": "^7.23.3", + "@typescript-eslint/eslint-plugin": "^6.13.1", + "@typescript-eslint/parser": "^6.13.1", + "eslint": "^8.55.0" + }, + "engines": { + "node": ">=18.0.0" } }, + "node_modules/@openally/auto-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@openally/auto-url/-/auto-url-1.0.1.tgz", + "integrity": "sha512-0o+C0mZGDts+ToAxXPg3KGa1PHnVNHGRn4p5SCHGn8GLxSPK1w6T5+eGa6JQa+ddyW46KvcV0jvZ2MhyoGB1pA==" + }, "node_modules/@openally/result": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@openally/result/-/result-1.2.0.tgz", @@ -1320,9 +1337,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", - "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1335,38 +1352,39 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1408,25 +1426,26 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1435,16 +1454,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1452,25 +1471,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1479,12 +1498,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1492,21 +1511,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1552,29 +1571,28 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { @@ -1611,16 +1629,16 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1639,6 +1657,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1651,9 +1675,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1811,9 +1835,9 @@ ] }, "node_modules/better-sqlite3": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.1.1.tgz", - "integrity": "sha512-FhW7bS7cXwkB2SFnPJrSGPmQerVSCzwBgmQ1cIRcYKxLsyiKjljzCbyEqqhYXo5TTBqt5BISiBj2YE2Sy2ynaA==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.2.2.tgz", + "integrity": "sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==", "hasInstallScript": true, "dependencies": { "bindings": "^1.5.0", @@ -1906,9 +1930,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -1925,10 +1949,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2046,9 +2070,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001568", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", + "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", "dev": true, "funding": [ { @@ -2475,9 +2499,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.609", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", + "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==", "dev": true }, "node_modules/emoji-regex": { @@ -2559,18 +2583,19 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2851,9 +2876,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3151,23 +3176,23 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/foreground-child": { @@ -3989,9 +4014,9 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -4419,12 +4444,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-abi": { "version": "3.47.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", @@ -4467,9 +4486,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-package-data": { @@ -5912,6 +5931,18 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -5939,12 +5970,6 @@ "node": ">=14.16" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/tsup": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.1.tgz", @@ -6392,25 +6417,10 @@ "node": ">=8" } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/tsx": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.4.0.tgz", - "integrity": "sha512-4fwcEjRUxW20ciSaMB8zkpGwCPxuRGnadDuj/pBk5S9uT29zvWz15PK36GrKJo45mSJomDxVejZ73c6lr3811Q==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.6.2.tgz", + "integrity": "sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==", "dev": true, "dependencies": { "esbuild": "~0.18.20", @@ -6462,9 +6472,9 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6492,9 +6502,9 @@ "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -6810,8 +6820,10 @@ "version": "3.2.1", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^2.1.0", - "better-sqlite3": "^9.1.1", + "@myunisoft/httpie": "^3.0.0", + "@myunisoft/loki": "^3.0.0", + "@openally/result": "^1.2.0", + "better-sqlite3": "^9.2.2", "cron-parser": "^4.9.0", "croner": "^7.0.5", "dayjs": "^1.11.10", @@ -6830,28 +6842,78 @@ "node": ">=18" } }, + "src/agent/node_modules/@myunisoft/httpie": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/httpie/-/httpie-3.0.0.tgz", + "integrity": "sha512-GNJO+a8H3U0n9TBq/H0E6MrEPnwkfgI6stm9L6RWYTI0co2DiAdlQ2LfN853paLGn3gUwj35wYOYuyeE2teoCg==", + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "src/agent/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, "src/agent/node_modules/ms": { "version": "2.1.3", "license": "MIT" }, + "src/agent/node_modules/undici": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.0.1.tgz", + "integrity": "sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, "src/config": { "name": "@sigyn/config", "version": "3.1.0", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^2.1.0", + "@myunisoft/loki": "^3.0.0", "ajv": "^8.12.0", "ajv-keywords": "^5.1.0", "minimatch": "^9.0.3" }, "devDependencies": { - "@myunisoft/httpie": "^2.0.3", + "@myunisoft/httpie": "^3.0.0", "dotenv": "^16.3.1" }, "engines": { "node": ">=18" } }, + "src/config/node_modules/@myunisoft/httpie": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/httpie/-/httpie-3.0.0.tgz", + "integrity": "sha512-GNJO+a8H3U0n9TBq/H0E6MrEPnwkfgI6stm9L6RWYTI0co2DiAdlQ2LfN853paLGn3gUwj35wYOYuyeE2teoCg==", + "dev": true, + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" + }, + "engines": { + "node": ">=18" + } + }, "src/config/node_modules/ajv": { "version": "8.12.0", "license": "MIT", @@ -6888,6 +6950,15 @@ "version": "1.0.0", "license": "MIT" }, + "src/config/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "src/config/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -6902,17 +6973,63 @@ "url": "https://github.com/sponsors/isaacs" } }, + "src/config/node_modules/undici": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.0.1.tgz", + "integrity": "sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, "src/discord": { "name": "@sigyn/discord", "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" }, "engines": { "node": ">=18" } }, + "src/discord/node_modules/@myunisoft/httpie": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/httpie/-/httpie-3.0.0.tgz", + "integrity": "sha512-GNJO+a8H3U0n9TBq/H0E6MrEPnwkfgI6stm9L6RWYTI0co2DiAdlQ2LfN853paLGn3gUwj35wYOYuyeE2teoCg==", + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "src/discord/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "src/discord/node_modules/undici": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.0.1.tgz", + "integrity": "sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, "src/logql": { "name": "@sigyn/logql", "version": "2.1.0", @@ -6959,22 +7076,90 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" }, "engines": { "node": ">=18" } }, + "src/slack/node_modules/@myunisoft/httpie": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/httpie/-/httpie-3.0.0.tgz", + "integrity": "sha512-GNJO+a8H3U0n9TBq/H0E6MrEPnwkfgI6stm9L6RWYTI0co2DiAdlQ2LfN853paLGn3gUwj35wYOYuyeE2teoCg==", + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "src/slack/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "src/slack/node_modules/undici": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.0.1.tgz", + "integrity": "sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } + }, "src/teams": { "name": "@sigyn/teams", "version": "2.0.0", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "src/teams/node_modules/@myunisoft/httpie": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@myunisoft/httpie/-/httpie-3.0.0.tgz", + "integrity": "sha512-GNJO+a8H3U0n9TBq/H0E6MrEPnwkfgI6stm9L6RWYTI0co2DiAdlQ2LfN853paLGn3gUwj35wYOYuyeE2teoCg==", + "dependencies": { + "@openally/result": "^1.2.0", + "content-type": "^1.0.5", + "lru-cache": "^10.1.0", + "statuses": "^2.0.1", + "undici": "^6.0.1" }, "engines": { "node": ">=18" } + }, + "src/teams/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "engines": { + "node": "14 || >=16.14" + } + }, + "src/teams/node_modules/undici": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.0.1.tgz", + "integrity": "sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=18.0" + } } } } diff --git a/package.json b/package.json index b66cad5..e2af178 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,13 @@ "src/pattern" ], "devDependencies": { - "@nodesecure/eslint-config": "^1.8.0", - "@types/node": "^20.9.4", + "@nodesecure/eslint-config": "^1.9.0", + "@types/node": "^20.10.4", "c8": "^8.0.1", "cross-env": "^7.0.3", "glob": "^10.3.10", "tsup": "^8.0.1", - "tsx": "^4.4.0", - "typescript": "^5.3.2" + "tsx": "^4.6.2", + "typescript": "^5.3.3" } } diff --git a/src/agent/README.md b/src/agent/README.md index de29f3a..607043c 100644 --- a/src/agent/README.md +++ b/src/agent/README.md @@ -77,6 +77,7 @@ Run Sigyn agent. It will fetch logs depending your rules `polling` and send aler - `location: string` Optional, default to `process.cwd()`. The path to your SQLite database, it will create the file if it doesn't exists but the directory **must** exists. - `options.logger: Logger` Optional, default to `pino`. You can use your own logger which must be an object with theses 3 methods: `debug`, `info` & `error`. - `options.level` Optional, only works if no logger given. Set log level: `"info" | "debug" | "error"`. +- `options.timeout` Optional, you can provide a timeout for Grafana API requests. Default: `30_000`. The returned scheduler instance allow you to put some extra logic if needed, see [API for scheduler](https://github.com/kibertoad/toad-scheduler/blob/main/README.md#api-for-scheduler). @@ -92,6 +93,7 @@ interface Logger { interface StartOptions { logger?: Logger; level?: "info" | "debug" | "error"; + timeout?: number; } ``` diff --git a/src/agent/package.json b/src/agent/package.json index 065d995..9d3ca32 100644 --- a/src/agent/package.json +++ b/src/agent/package.json @@ -40,8 +40,10 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^2.1.0", - "better-sqlite3": "^9.1.1", + "@myunisoft/httpie": "^3.0.0", + "@myunisoft/loki": "^3.0.0", + "@openally/result": "^1.2.0", + "better-sqlite3": "^9.2.2", "cron-parser": "^4.9.0", "croner": "^7.0.5", "dayjs": "^1.11.10", diff --git a/src/agent/src/datasource.ts b/src/agent/src/datasource.ts index aa1d969..16771f3 100644 --- a/src/agent/src/datasource.ts +++ b/src/agent/src/datasource.ts @@ -1,19 +1,19 @@ // Import Third-party Dependencies -import { GrafanaLoki } from "@myunisoft/loki"; +import { GrafanaApi } from "@myunisoft/loki"; export class Datasource { - #lokiApi: GrafanaLoki; + #lokiApi: GrafanaApi; private static datasource: Datasource; private constructor(host: string) { - this.#lokiApi = new GrafanaLoki({ + this.#lokiApi = new GrafanaApi({ remoteApiURL: host }); } fetchDatasources() { - return this.#lokiApi.datasources(); + return this.#lokiApi.Datasources.all(); } static async Loki(host: string) { diff --git a/src/agent/src/index.ts b/src/agent/src/index.ts index aaf1414..0dfb69f 100644 --- a/src/agent/src/index.ts +++ b/src/agent/src/index.ts @@ -4,7 +4,8 @@ import timers from "node:timers/promises"; // Import Third-party Dependencies import { initConfig } from "@sigyn/config"; -import { GrafanaLoki } from "@myunisoft/loki"; +import { GrafanaApi } from "@myunisoft/loki"; +import { Agent, setGlobalDispatcher } from "@myunisoft/httpie"; import { ToadScheduler, CronJob, SimpleIntervalJob } from "toad-scheduler"; import { pino } from "pino"; import ms from "ms"; @@ -27,6 +28,7 @@ export interface Logger { export interface StartOptions { logger?: Logger; level?: "info" | "debug" | "error"; + timeout?: number; } function defaultLogger(level: StartOptions["level"]) { @@ -42,17 +44,19 @@ export async function start( location = process.cwd(), options: StartOptions = {} ) { - const { logger, level = "info" } = options; + const { logger, level = "info", timeout = 30_000 } = options; const agentLogger = logger ?? defaultLogger(level); agentLogger.info(`Starting sigyn agent at '${location}'`); + + setGlobalDispatcher(new Agent({ connect: { timeout } })); initDB(agentLogger); const { rules, loki } = await initConfig( path.join(location, "/sigyn.config.json") ); - const lokiApi = new GrafanaLoki({ + const lokiApi = new GrafanaApi({ remoteApiURL: loki.apiUrl }); diff --git a/src/agent/src/rules.ts b/src/agent/src/rules.ts index ad3f701..58d24fc 100644 --- a/src/agent/src/rules.ts +++ b/src/agent/src/rules.ts @@ -6,6 +6,7 @@ import dayjs from "dayjs"; import ms from "ms"; import cronParser from "cron-parser"; import { Database } from "better-sqlite3"; +import { Result, Ok, Err } from "@openally/result"; // Import Internal Dependencies import { DbRule, DbRuleLabel, getDB, getOldestLabelTimestamp } from "./database"; @@ -21,6 +22,7 @@ export class Rule { config: SigynInitializedRule; #logger: Logger; #lastFetchedStream: Record | null = null; + #now: number; constructor(rule: SigynInitializedRule, options: RuleOptions) { const { logger } = options; @@ -90,59 +92,23 @@ export class Rule { } } - async walkOnLogs(logs: LokiStreamResult[]): Promise { + walkOnLogs(logs: LokiStreamResult[]): Result { this.#lastFetchedStream = null; + this.#now = dayjs().valueOf(); const db = getDB(); - const now = dayjs().valueOf(); const rule = this.getRuleFromDatabase(); - if (rule.muteUntil > now) { - return false; - } - const ruleLabels = this.getDistinctLabelsFromDatabase(rule.id); - const lastCounter = rule.counter; - const existingLabels = new Set(); - for (const label of ruleLabels) { - existingLabels.add(`${label.key}:${label.value}`); + if (rule.muteUntil > this.#now) { + return Err("Rule is muted by higher level composite rule"); } - const ruleLabelsInsertStmt = db.prepare("INSERT INTO ruleLabels (ruleId, key, value, timestamp) VALUES (?, ?, ?, ?)"); - const ruleLogInsertStmt = db.prepare("INSERT INTO ruleLogs (ruleId, log, timestamp) VALUES (?, ?, ?)"); - - db.transaction(() => { - for (const { stream, values } of logs) { - if (this.#lastFetchedStream === null) { - this.#lastFetchedStream = stream; - } - for (const [key, value] of Object.entries(stream)) { - if (!(this.#lastFetchedStream![key] ??= value).split(",").includes(value)) { - this.#lastFetchedStream![key] += `,${value}`; - } - - // If rule is based on label, insert as many label as there is values - // because we receive only one stream for N values (but the stream is the same for each value) - if (this.config.alert.on.label === key) { - let insertedCount = 0; - - while (insertedCount++ < values.length) { - ruleLabelsInsertStmt.run(rule.id, key, value, now); - } - } - else if (!existingLabels.has(`${key}:${value}`)) { - ruleLabelsInsertStmt.run(rule.id, key, value, now); - existingLabels.add(`${key}:${value}`); - } - } - - for (const log of values) { - ruleLogInsertStmt.run(rule.id, log, now); - } - } - })(); + this.#insertLogsInDB(logs); if (this.config.alert.on.label) { - return this.#checkLabelThreshold(rule); + const checkLabelThreshold = this.#checkLabelThreshold(rule); + + return checkLabelThreshold ? Ok(true) : Err("Label threshold does not match"); } const timeThreshold = utils.cron @@ -150,11 +116,12 @@ export class Rule { .valueOf(); if (rule.lastIntervalReset === null || rule.lastIntervalReset - timeThreshold < 0) { - db.prepare("UPDATE rules SET lastIntervalReset = ?, firstReset = ? WHERE id = ?").run(now, rule.lastIntervalReset === null ? 1 : 0, rule.id); + db.prepare("UPDATE rules SET lastIntervalReset = ?, firstReset = ? WHERE id = ?").run(this.#now, rule.lastIntervalReset === null ? 1 : 0, rule.id); rule.firstReset = rule.lastIntervalReset === null ? 1 : 0; - rule.lastIntervalReset = now; + rule.lastIntervalReset = this.#now; } + const previousCounter = rule.counter; rule.counter = ( db.prepare("SELECT COUNT(id) as counter FROM ruleLogs WHERE ruleId = ? AND processed = 0 AND timestamp >= ?") .get(rule.id, timeThreshold) as { counter: null | number } @@ -163,37 +130,74 @@ export class Rule { db.prepare("UPDATE rules SET counter = ? WHERE id = ?").run(rule.counter, rule.id); const alertThreshold = this.config.alert.on.count!; - this.#logger.info(`[${rule.name}](state: handle|logs: ${logs.reduce((acc, curr) => acc + curr.values.length, 0)}|polling: ${this.#getCurrentPolling()[1]}|previous: ${lastCounter}|new: ${rule.counter - lastCounter}|next: ${rule.counter}|alertThreshold: ${alertThreshold}|timeThreshold: ${timeThreshold})`); + this.#logger.info(`[${rule.name}](state: handle|polling: ${this.#getCurrentPolling()[1]}|previous: ${previousCounter}|new: ${rule.counter - previousCounter}|next: ${rule.counter}|alertThreshold: ${alertThreshold}|timeThreshold: ${timeThreshold})`); const [operator, value] = utils.rules.countThresholdOperator(alertThreshold); - if (operator.startsWith("<")) { - // we checking for a max value, so we want to wait the whole interval before sending an alert - if (rule.lastIntervalReset !== now || rule.firstReset === 1) { - return false; - } - - if (!utils.rules.countMatchOperator(operator, rule.counter, value)) { - return false; - } + // we checking for a max value, so we want to wait the whole interval before sending an alert + if (operator.startsWith("<") && (rule.lastIntervalReset !== this.#now || rule.firstReset === 1)) { + return Err("Waiting the whole interval before comparing logs"); } else if (!utils.rules.countMatchOperator(operator, rule.counter, value)) { - return false; + return Err(`Logs does not match operator value (o:${operator}|c:${rule.counter}|v:${value})`); } const cancelAlert = this.#checkThrottle(rule, db); if (cancelAlert) { - return false; + return Err(`Rule throttle activated`); } this.#logger.error(`[${rule.name}](state: alert|threshold: ${alertThreshold}|actual: ${rule.counter})`); db.transaction(() => { - db.prepare("UPDATE rules SET counter = 0, threshold = ?, lastIntervalReset = ? WHERE id = ?").run(rule.counter, now, rule.id); + db.prepare("UPDATE rules SET counter = 0, threshold = ?, lastIntervalReset = ? WHERE id = ?").run(rule.counter, this.#now, rule.id); db.prepare("UPDATE ruleLogs SET processed = 1 WHERE ruleId = ?").run(rule.id); })(); - return true; + return Ok(true); + } + + #insertLogsInDB(logs: LokiStreamResult[]): void { + const rule = this.getRuleFromDatabase(); + const ruleLabels = this.getDistinctLabelsFromDatabase(rule.id); + const existingLabels = new Set(); + for (const label of ruleLabels) { + existingLabels.add(`${label.key}:${label.value}`); + } + const db = getDB(); + const ruleLabelsInsertStmt = db.prepare("INSERT INTO ruleLabels (ruleId, key, value, timestamp) VALUES (?, ?, ?, ?)"); + const ruleLogInsertStmt = db.prepare("INSERT INTO ruleLogs (ruleId, log, timestamp) VALUES (?, ?, ?)"); + + db.transaction(() => { + for (const { stream, values } of logs) { + if (this.#lastFetchedStream === null) { + this.#lastFetchedStream = stream; + } + for (const [key, value] of Object.entries(stream)) { + if (!(this.#lastFetchedStream![key] ??= value).split(",").includes(value)) { + this.#lastFetchedStream![key] += `,${value}`; + } + + // If rule is based on label, insert as many label as there is values + // because we receive only one stream for N values (but the stream is the same for each value) + if (this.config.alert.on.label === key) { + let insertedCount = 0; + + while (insertedCount++ < values.length) { + ruleLabelsInsertStmt.run(rule.id, key, value, this.#now); + } + } + else if (!existingLabels.has(`${key}:${value}`)) { + ruleLabelsInsertStmt.run(rule.id, key, value, this.#now); + existingLabels.add(`${key}:${value}`); + } + } + + for (const log of values) { + ruleLogInsertStmt.run(rule.id, log, this.#now); + } + } + })(); } #checkLabelThreshold(rule: DbRule): boolean { diff --git a/src/agent/src/tasks/asyncTask.ts b/src/agent/src/tasks/asyncTask.ts index 88055f3..b3fba49 100644 --- a/src/agent/src/tasks/asyncTask.ts +++ b/src/agent/src/tasks/asyncTask.ts @@ -1,7 +1,11 @@ +// Import Node.js Dependencies +import { performance } from "node:perf_hooks"; + // Import Third-party Dependencies import { SigynInitializedRule } from "@sigyn/config"; -import { GrafanaLoki } from "@myunisoft/loki"; +import { GrafanaApi } from "@myunisoft/loki"; import { AsyncTask } from "toad-scheduler"; +import ms from "ms"; // Import Internal Dependencies import { Rule } from "../rules"; @@ -12,7 +16,7 @@ import { handleAgentFailure } from "../utils/selfMonitoring"; export interface AsyncTaskOptions { logger: Logger; rule: Rule; - lokiApi: GrafanaLoki; + lokiApi: GrafanaApi; } export function asyncTask(ruleConfig: SigynInitializedRule, options: AsyncTaskOptions) { @@ -26,19 +30,25 @@ export function asyncTask(ruleConfig: SigynInitializedRule, options: AsyncTaskOp logger.info(`[${ruleConfig.name}](state: polling|start: ${start}|int: ${Date.now() - start}|query: ${ruleConfig.logql})`); + const t0 = performance.now(); try { - const { logs } = await lokiApi.queryRangeStream(ruleConfig.logql, { + const { logs } = await lokiApi.Loki.queryRangeStream(ruleConfig.logql, { start }); + const logsCount = logs.reduce((acc, curr) => acc + curr.values.length, 0); + logger.info(`[${ruleConfig.name}](logs: ${logsCount}|execTime: ${ms(performance.now() - t0)})`); - const createAlert = await rule.walkOnLogs(logs); - if (createAlert) { + const createAlertResult = rule.walkOnLogs(logs); + if (createAlertResult.ok) { createRuleAlert(rule.getAlertFormattedRule(), ruleConfig, logger); rule.clearLabels(); } + else { + logger.debug(`[${ruleConfig.name}](debug: ${createAlertResult.val})`); + } } catch (error) { - logger.error(`[${ruleConfig.name}](error: ${error.message})`); + logger.error(`[${ruleConfig.name}](error: ${error.message}|execTime: ${ms(performance.now() - t0)})`); logger.debug(error); handleAgentFailure(error.message, rule, logger); diff --git a/src/agent/test/FT/rule.walkOnLogs.spec.ts b/src/agent/test/FT/rule.walkOnLogs.spec.ts index 7153a36..54bdd3d 100644 --- a/src/agent/test/FT/rule.walkOnLogs.spec.ts +++ b/src/agent/test/FT/rule.walkOnLogs.spec.ts @@ -9,6 +9,7 @@ import { after, before, describe, it } from "node:test"; import dayjs from "dayjs"; import { SigynInitializedConfig, SigynRule, initConfig } from "@sigyn/config"; import { MockAgent, getGlobalDispatcher, setGlobalDispatcher } from "@myunisoft/httpie"; +import { Result } from "@openally/result"; // Import Internal Dependencies import { DbRule, DbRuleLabel, getDB, initDB } from "../../src/database"; @@ -31,10 +32,10 @@ function getRule(rule: SigynRule): DbRule { return getDB().prepare("SELECT * FROM rules WHERE name = ?").get(rule.name) as DbRule; } -async function pollingIn200ms(rule: Rule, logs: string[], stream: Record = {}): Promise { +async function pollingIn200ms(rule: Rule, logs: string[], stream: Record = {}): Promise> { const t0 = performance.now(); - const createAlert = await rule.walkOnLogs([{ values: logs, stream }]); + const createAlert = rule.walkOnLogs([{ values: logs, stream }]); const timeToHandleLogsInMs = Math.floor(performance.now() - t0); @@ -109,13 +110,13 @@ describe("Rule.walkOnLogs()", () => { while (pollingCount++ < 4) { const createAlert = await pollingIn200ms(rule, ["one new log"]); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(ruleConfig).counter, pollingCount); } const createAlert = await pollingIn200ms(rule, ["one new log"]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); }); @@ -132,7 +133,7 @@ describe("Rule.walkOnLogs()", () => { while (pollingCount++ < 4) { const createAlert = await pollingIn200ms(rule, ["one new log outside interval limit"]); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(ruleConfig).counter, pollingCount); } @@ -143,13 +144,13 @@ describe("Rule.walkOnLogs()", () => { const createAlertAfter1200Ms = await pollingIn200ms(rule, ["one new log"]); // counter is still 4 because it has removed one counter added 1.200s later while interval is 1s - assert.equal(createAlertAfter1200Ms, false); + assert.equal(createAlertAfter1200Ms.ok, false); assert.equal(getRule(ruleConfig).counter, 4); const createAlertAfter1400Ms = await pollingIn200ms(rule, ["one new log"]); // counter is still 4 because it has removed one counter added 1.200s later while interval is 1s - assert.equal(createAlertAfter1400Ms, false); + assert.equal(createAlertAfter1400Ms.ok, false); assert.equal(getRule(ruleConfig).counter, 4); }); }); @@ -165,7 +166,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); }); @@ -181,7 +182,7 @@ describe("Rule.walkOnLogs()", () => { .run(Date.now() + 50000, ruleConfig.name); const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); // reset mute for next tests getDB() @@ -200,7 +201,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); @@ -217,7 +218,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(ruleConfig).throttleCount, i + 1); } }); @@ -230,7 +231,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(15)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); }); @@ -266,7 +267,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); @@ -282,7 +283,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); @@ -300,7 +301,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(ruleConfig).throttleCount, i + 1); } }); @@ -312,7 +313,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); }); @@ -329,7 +330,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); @@ -346,7 +347,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log")); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); } @@ -375,7 +376,7 @@ describe("Rule.walkOnLogs()", () => { for (let i = 0; i < 4; i++) { const createAlert = await pollingIn200ms(rule, ["one log"]); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, i + 1); } @@ -384,7 +385,7 @@ describe("Rule.walkOnLogs()", () => { assert.equal(getRule(ruleConfig).counter, 4); const createAlert = await pollingIn200ms(rule, ["one log should trigger alert"]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, 0); }); @@ -410,7 +411,7 @@ describe("Rule.walkOnLogs()", () => { for (let i = 0; i < 4; i++) { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log")); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); // once alert triggers, counter should be reset to 0 assert.equal(getRule(ruleConfig).counter, (i + 1) * 10); } @@ -419,7 +420,7 @@ describe("Rule.walkOnLogs()", () => { assert.equal(getRule(ruleConfig).counter, 40); const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log")); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(ruleConfig).counter, 50); }); }); @@ -479,7 +480,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { state: "ko" }); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); }); it("should not send alert when count not reached", async() => { @@ -488,7 +489,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log"), { state: "ko" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); const createAlertWhenThrehsholdReached = await pollingIn200ms( rule, @@ -496,7 +497,7 @@ describe("Rule.walkOnLogs()", () => { { state: "ko" } ); - assert.equal(createAlertWhenThrehsholdReached, true); + assert.equal(createAlertWhenThrehsholdReached.ok, true); }); it("should send alert when interval and threshold reached", async() => { @@ -515,13 +516,13 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { state: "ko" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); - assert.equal(await pollingIn200ms(rule, []), false); + assert.equal((await pollingIn200ms(rule, [])).ok, false); // We need 3 intervals because there is some MS difference between the first polling and the first label timestamp const createAlertAfterIntervalReached = await pollingIn200ms(rule, []); - assert.equal(createAlertAfterIntervalReached, true); + assert.equal(createAlertAfterIntervalReached.ok, true); }); }); @@ -540,7 +541,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "foo" } } ]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); assert.equal(getRule(config.rules[0]).counter, 0); // Since throttle is based on alerts table, we need to create it ourself @@ -555,7 +556,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "foo" } } ]); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(config.rules[0]).counter, 1); }); @@ -567,7 +568,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "bar" } } ]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); assert.equal(getRule(config.rules[0]).counter, 0); // Since throttle is based on alerts table, we need to create it ourself @@ -582,7 +583,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "bar" } } ]); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); assert.equal(getRule(config.rules[0]).counter, 1); }); @@ -597,7 +598,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "foo" } } ]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // Since throttle is based on alerts table, we need to create it ourself createAlertInDB(getRule(config.rules[0]), { app: "foo" }); } @@ -608,7 +609,7 @@ describe("Rule.walkOnLogs()", () => { { values: ["one new log"], stream: { app: "bar" } } ]); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); // Since throttle is based on alerts table, we need to create it ourself createAlertInDB(getRule(config.rules[0]), { app: "bar" }); } @@ -628,7 +629,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { responseTime: "1500" }); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); }); it("should not send alert when count not reached", async() => { @@ -637,7 +638,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log"), { responseTime: "1500" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); const createAlertWhenThrehsholdReached = await pollingIn200ms( rule, @@ -645,7 +646,7 @@ describe("Rule.walkOnLogs()", () => { { responseTime: "1500" } ); - assert.equal(createAlertWhenThrehsholdReached, true); + assert.equal(createAlertWhenThrehsholdReached.ok, true); }); it("should send alert when interval and threshold reached", async() => { @@ -664,13 +665,13 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { responseTime: "1500" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); - assert.equal(await pollingIn200ms(rule, []), false); + assert.equal((await pollingIn200ms(rule, [])).ok, false); // We need 3 intervals because there is some MS difference between the first polling and the first label timestamp const createAlertAfterIntervalReached = await pollingIn200ms(rule, []); - assert.equal(createAlertAfterIntervalReached, true); + assert.equal(createAlertAfterIntervalReached.ok, true); }); }); @@ -687,7 +688,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { statusCode: "500" }); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); }); it("should not send alert when count not reached", async() => { @@ -696,7 +697,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(5)).map(() => "one new log"), { statusCode: "500" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); const createAlertWhenThrehsholdReached = await pollingIn200ms( rule, @@ -704,7 +705,7 @@ describe("Rule.walkOnLogs()", () => { { statusCode: "500" } ); - assert.equal(createAlertWhenThrehsholdReached, true); + assert.equal(createAlertWhenThrehsholdReached.ok, true); }); it("should send alert when interval and threshold reached", async() => { @@ -723,13 +724,13 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { statusCode: "500" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); - assert.equal(await pollingIn200ms(rule, []), false); + assert.equal((await pollingIn200ms(rule, [])).ok, false); // We need 3 intervals because there is some MS difference between the first polling and the first label timestamp const createAlertAfterIntervalReached = await pollingIn200ms(rule, []); - assert.equal(createAlertAfterIntervalReached, true); + assert.equal(createAlertAfterIntervalReached.ok, true); }); }); @@ -746,7 +747,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, Array.from(Array(10)).map(() => "one new log"), { responseTime: "50" }); - assert.equal(createAlert, false); + assert.equal(createAlert.ok, false); }); it("should send alert when count is reached", async() => { @@ -755,7 +756,7 @@ describe("Rule.walkOnLogs()", () => { const createAlert = await pollingIn200ms(rule, ["one new log"], { responseTime: "550" }); - assert.equal(createAlert, true); + assert.equal(createAlert.ok, true); }); }); }); diff --git a/src/agent/test/FT/selfMonitoring.spec.ts b/src/agent/test/FT/selfMonitoring.spec.ts index 0ea985e..d30757c 100644 --- a/src/agent/test/FT/selfMonitoring.spec.ts +++ b/src/agent/test/FT/selfMonitoring.spec.ts @@ -26,8 +26,10 @@ const kRuleThrottleConfigLocation = path.join(kFixturePath, "/self-monitoring-th const kRuleActivationThresholdConfigLocation = path.join(kFixturePath, "/self-monitoring-activation-threshold/sigyn.config.json"); const kLogger = new MockLogger(); const kMockLokiApi = { - queryRangeStream() { - throw new Error("Failed"); + Loki: { + queryRangeStream() { + throw new Error("Failed"); + } } }; // time to wait for the task to be fully executed (alert sent) diff --git a/src/config/package.json b/src/config/package.json index bc51582..2cec5b5 100644 --- a/src/config/package.json +++ b/src/config/package.json @@ -38,13 +38,13 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/loki": "^2.1.0", + "@myunisoft/loki": "^3.0.0", "ajv": "^8.12.0", "ajv-keywords": "^5.1.0", "minimatch": "^9.0.3" }, "devDependencies": { - "@myunisoft/httpie": "^2.0.3", + "@myunisoft/httpie": "^3.0.0", "dotenv": "^16.3.1" } } diff --git a/src/config/src/utils/rules.ts b/src/config/src/utils/rules.ts index 3265231..331edf1 100644 --- a/src/config/src/utils/rules.ts +++ b/src/config/src/utils/rules.ts @@ -1,5 +1,5 @@ // Import Third-party Dependencies -import { GrafanaLoki } from "@myunisoft/loki"; +import { GrafanaApi } from "@myunisoft/loki"; // Import Internal Dependencies import { SigynConfig, SigynInitializedRule, SigynRule } from "../types"; @@ -69,7 +69,7 @@ function* getLabelFilters(rule: SigynRule) { } export async function fetchLabels(config: Pick) { - const lokiApi = new GrafanaLoki({ + const lokiApi = new GrafanaApi({ remoteApiURL: config.loki.apiUrl }); @@ -86,7 +86,7 @@ export async function fetchLabels(config: Pick) { } try { - const labelValues = await lokiApi.labelValues(label); + const labelValues = await lokiApi.Loki.labelValues(label); labels.set(label, labelValues); } diff --git a/src/discord/package.json b/src/discord/package.json index f7fb867..e69e68c 100644 --- a/src/discord/package.json +++ b/src/discord/package.json @@ -38,6 +38,6 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" } } diff --git a/src/slack/package.json b/src/slack/package.json index 9464944..6700105 100644 --- a/src/slack/package.json +++ b/src/slack/package.json @@ -38,6 +38,6 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" } } diff --git a/src/teams/package.json b/src/teams/package.json index 4502074..33a5a4a 100644 --- a/src/teams/package.json +++ b/src/teams/package.json @@ -38,6 +38,6 @@ "author": "GENTILHOMME Thomas ", "license": "MIT", "dependencies": { - "@myunisoft/httpie": "^2.0.3" + "@myunisoft/httpie": "^3.0.0" } }