diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 081cfae8..08461f03 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -1,34 +1,44 @@ GEM remote: https://rubygems.org/ specs: - activesupport (7.0.7.2) + activesupport (7.1.3) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - addressable (2.8.4) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + bigdecimal (3.1.6) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) commonmarker (0.23.10) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) dnsruby (1.70.0) simpleidn (~> 0.2.1) + drb (2.2.0) + ruby2_keywords em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) ethon (0.16.0) ffi (>= 1.15.0) eventmachine (1.2.7) - execjs (2.8.1) - faraday (2.7.5) - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) - ffi (1.15.5) + execjs (2.9.1) + faraday (2.9.0) + faraday-net_http (>= 2.0, < 3.2) + faraday-net_http (3.1.0) + net-http + ffi (1.16.3) forwardable-extended (2.6.0) gemoji (3.0.1) github-pages (228) @@ -196,10 +206,11 @@ GEM gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - just-the-docs (0.3.3) + just-the-docs (0.7.0) jekyll (>= 3.8.5) - jekyll-seo-tag (~> 2.0) - rake (>= 12.3.1, < 13.1.0) + jekyll-include-cache + jekyll-seo-tag (>= 2.0) + rake (>= 12.3.1) kramdown (2.3.2) rexml kramdown-parser-gfm (1.1.0) @@ -214,7 +225,10 @@ GEM jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.19.0) + minitest (5.22.2) + mutex_m (0.2.0) + net-http (0.4.1) + uri nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -231,11 +245,11 @@ GEM forwardable-extended (~> 2.6) public_suffix (4.0.7) racc (1.7.3) - rake (13.0.6) + rake (13.1.0) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) + rexml (3.2.6) rouge (3.26.0) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -252,15 +266,16 @@ GEM unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8.2) + unf_ext (0.0.9.1) unicode-display_width (1.8.0) - webrick (1.7.0) + uri (0.13.0) + webrick (1.8.1) PLATFORMS ruby diff --git a/docs/_config.yml b/docs/_config.yml index 719ea7f5..02cc98b5 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -18,7 +18,7 @@ # You can create any custom variable you would like, and they will be accessible # in the templates via {{ site.myvariable }}. -title: cf-nodejs-logging-support +title: "CF Node.js Logging Support" description: >- # this means to ignore newlines until "baseurl:" Node.js Logging Support for Cloud Foundry provides the creation of structured log messages and the collection of request metrics. baseurl: "/cf-nodejs-logging-support" # the subpath of your site, e.g. /blog @@ -60,7 +60,7 @@ back_to_top: true back_to_top_text: "Back to top" # Footer copyright -footer_content: "Copyright © 2021 SAP SE | SAP Privacy Statement" +footer_content: "Copyright © 2024 SAP SE | SAP Privacy Statement" # Footer last edited timestamp last_edit_timestamp: true # show or hide edit time - page must have `last_modified_date` defined in the frontmatter diff --git a/docs/_sass/custom/custom.scss b/docs/_sass/custom/custom.scss new file mode 100644 index 00000000..011892c1 --- /dev/null +++ b/docs/_sass/custom/custom.scss @@ -0,0 +1,4 @@ + +.site-title { + font-size: 1.2em !important; +} diff --git a/docs/configuration/fields.md b/docs/configuration/fields.md index a13b1c31..6a992e94 100644 --- a/docs/configuration/fields.md +++ b/docs/configuration/fields.md @@ -259,6 +259,7 @@ Our supported server frameworks are: * [Express](https://expressjs.com/): declare as `express` * [Restify](http://restify.com/): declare as `restify` * [Connect](https://www.npmjs.com/package/connect): declare as `connect` +* [Fastify](https://fastify.dev/): declare as `fastify` * [Node.js HTTP](https://nodejs.org/api/http.html): declare as `plainhttp` Example of field with multiple framework specific sources: diff --git a/docs/configuration/framework.md b/docs/configuration/framework.md index ad42e744..42939876 100644 --- a/docs/configuration/framework.md +++ b/docs/configuration/framework.md @@ -29,4 +29,5 @@ Our supported server frameworks are: * [Express](https://expressjs.com/): declare as `express` * [Restify](http://restify.com/): declare as `restify` * [Connect](https://www.npmjs.com/package/connect): declare as `connect` +* [Fastify](https://fastify.dev/): declare as `fastify` * [Node.js HTTP](https://nodejs.org/api/http.html): declare as `plainhttp` diff --git a/docs/getting-started/01-installation.md b/docs/getting-started/01-installation.md index a0aedc3b..6bd1955d 100644 --- a/docs/getting-started/01-installation.md +++ b/docs/getting-started/01-installation.md @@ -7,18 +7,26 @@ permalink: /getting-started/installation/ --- # Installation + The latest release version can be downloaded from [npm](https://www.npmjs.com/package/cf-nodejs-logging-support) and [github](https://github.com/SAP/cf-nodejs-logging-support/releases). ## Requirements -To take full advantage of cf-nodejs-logging-support in your application you need to fulfill following requirements: - * Node.js app to be deployed on Cloud Foundry - * Installed [npm](https://docs.npmjs.com/) package manager - * Use [node.js](https://nodejs.org/) version 10.0 or higher - * Use [express](https://expressjs.com/), [connect](https://www.npmjs.com/package/connect), [restify](http://restify.com/) or pure [Node.js HTTP](https://nodejs.org/api/http.html) server framework +To take full advantage of cf-nodejs-logging-support make sure to fulfill following requirements: + +* Node.js app to be deployed on Cloud Foundry +* Use [node.js](https://nodejs.org/) version 14.14 or higher +* Use one of the supported server frameworks: + * [Express](https://expressjs.com/) + * [Connect](https://www.npmjs.com/package/connect) + * [Restify](http://restify.com/) + * [Fastify](https://fastify.dev/) + * [Node.js HTTP](https://nodejs.org/api/http.html) ## Install using npm + Use following command to add cf-nodejs-logging-support and its dependencies to your app. + ```bash npm install cf-nodejs-logging-support --save ``` diff --git a/docs/getting-started/02-framework-samples.md b/docs/getting-started/02-framework-samples.md index 1a588de6..8611e264 100644 --- a/docs/getting-started/02-framework-samples.md +++ b/docs/getting-started/02-framework-samples.md @@ -8,8 +8,8 @@ permalink: /getting-started/framework-samples/ # Samples for supported Server Frameworks {: .no_toc } -This library can be used in combination with different server frameworks: -[express](https://expressjs.com/), [connect](https://www.npmjs.com/package/connect), [restify](http://restify.com/) and also pure [Node.js HTTP](https://nodejs.org/api/http.html). + +This library can be used in combination with several different server frameworks. You can find small code samples for each supported framework below.
@@ -21,96 +21,139 @@ You can find small code samples for each supported framework below. {:toc}
- ## Express + ```js -const HTTP_PORT = 3000; -var express = require('express'); -var log = require('cf-nodejs-logging-support'); -var app = express(); +const app = require('express')() +const log = require('cf-nodejs-logging-support') -// Set the minimum logging level (Levels: off, error, warn, info, verbose, debug, silly) -log.setLoggingLevel("info"); +// Configure logger for working with Express framework +log.setFramework(log.Framework.Express) -// Bind to express app -app.use(log.logNetwork); +// Add the logger middleware to write access logs +app.use(log.logNetwork) -app.get('/', function (req, res) { - // Context bound custom message - req.logger.info("Hello World will be sent"); - - res.send('Hello World'); -}); +// Handle '/' path +app.get("/", (req, res) => { + // Write a log message bound to request context + req.logger.info(`Sending a greeting`) + res.send("Hello Express") +}) // Listen on specified port -app.listen(HTTP_PORT); - -// Formatted log message -log.info("Server is listening on port %d", HTTP_PORT); +const listener = app.listen(3000, () => { + // Formatted log message + log.info("Server is listening on port %d", listener.address().port) +}) ``` ## Connect + ```js -const HTTP_PORT = 3000; -var connect = require('connect'); -var http = require('http'); -var log = require('cf-nodejs-logging-support'); -var app = connect(); +const app = require('connect')() +const http = require('http') +const log = require('cf-nodejs-logging-support') -// Force logger to run the connect version. (default is express, forcing express is also legal) -log.forceLogger("connect"); +// Configure logger for working with Connect framework +log.setFramework(log.Framework.Connect) -// Add the logger middleware, so each time a request is received, it will get logged. -app.use(log.logNetwork); +// Add the logger middleware to write access logs +app.use(log.logNetwork) -// Create node.js http server and listen on port -http.createServer(app).listen(HTTP_PORT, () => { - // Formatted log message - log.info("Server is listening on port %d", HTTP_PORT); -}); +// Handle '/' path +app.use("/", (req, res) => { + // Write a log message bound to request context + req.logger.info(`Sending a greeting`) + res.end("Hello Connect") +}) + +// Listen on specified port +const server = http.createServer(app).listen(3000, () => { + // Formatted log message + log.info("Server is listening on port %d", server.address().port) +}) ``` ## Restify + ```js -const HTTP_PORT = 3000; -var restify = require('restify'); -var log = require('cf-nodejs-logging-support'); -var app = restify.createServer(); +const restify = require('restify') +const log = require('cf-nodejs-logging-support') +const app = restify.createServer() + +// Configure logger for working with Restify framework +log.setFramework(log.Framework.Restify) -// Force logger to run the restify version. (default is express, forcing express is also legal) -log.forceLogger("restify"); +// Add the logger middleware to write access logs +app.use(log.logNetwork) -// Add the logger middleware, so each time a request is received, it will get logged. -app.use(log.logNetwork); +// Handle '/' path +app.get("/", (req, res, next) => { + // Write a log message bound to request context + req.logger.info(`Sending a greeting`) + res.send("Hello Restify") + next() +}) // Listen on specified port -server.listen(HTTP_PORT, () => { +app.listen(3000, () => { // Formatted log message - log.info("Server is listening on port %d", HTTP_PORT); -}); + log.info("Server is listening on port %d", app.address().port) +}) +``` + +## Fastify + +```js +const log = require('cf-nodejs-logging-support') +const app = require('fastify')() + +// Configure logger for working with Fastify framework +log.setFramework(log.Framework.Fastify) + +// Add the logger middleware to write access logs +app.addHook("onRequest", log.logNetwork) + +// Handle '/' path +app.get("/", (request, reply) => { + // Write a log message bound to request context + request.logger.info(`Sending a greeting`) + reply.send("Hello Fastify") +}) + +// Listen on specified port +app.listen({ port: 3000 }, (err, address) => { + if (err) { + // Formatted error message + log.error("Failed to run server", err.message) + process.exit(1) + } + // Formatted log message + log.info(`Server is listening on ${address}`) +}) ``` ## Node.js HTTP + ```js -const HTTP_PORT = 3000; -const http = require('http'); -var log = require("cf-nodejs-logging-support"); +const log = require('cf-nodejs-logging-support') +const http = require('http') -// Force logger to run the http version. -log.forceLogger("plainhttp"); +// Configure logger for working with Node.js http framework +log.setFramework(log.Framework.NodeJsHttp) const server = http.createServer((req, res) => { - // Binds logging to the given request for request tracking - log.logNetwork(req, res); - - // Context bound custom message - req.logger.info("Hello World will be sent"); - res.end('Hello World'); -}); + // Call logger middleware to write access logs + log.logNetwork(req, res) + + // Write a log message bound to request context + req.logger.info(`Sending a greeting`) + res.send("Hello Node.js HTTP") +}) // Listen on specified port -server.listen(HTTP_PORT, () => { - // Formatted log message - log.info("Server is listening on port %d", HTTP_PORT); -}); +server.listen(3000, () => { + // Formatted log message + log.info("Server is listening on port %d", server.address().port) +}) ``` diff --git a/package-lock.json b/package-lock.json index 676679b5..2ad8e3db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.26.0", "express": "^4.18.2", + "fastify": "^4.26.1", "import-fresh": "^3.3.0", "mocha": "^9.2.2", "node-mocks-http": "^1.11.0", @@ -624,6 +625,41 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dev": true, + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "dev": true + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dev": true, + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -1145,6 +1181,12 @@ "node": ">=6.5" } }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "dev": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1216,6 +1258,23 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1444,6 +1503,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/avvio": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.3.0.tgz", + "integrity": "sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==", + "dev": true, + "dependencies": { + "@fastify/error": "^3.3.0", + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.17.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2835,6 +2906,12 @@ "node >=0.6.0" ] }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "dev": true + }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -2880,6 +2957,21 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-json-stringify": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.12.0.tgz", + "integrity": "sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==", + "dev": true, + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -2910,10 +3002,70 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "node_modules/fast-uri": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.3.0.tgz", + "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==", + "dev": true + }, + "node_modules/fastify": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.26.1.tgz", + "integrity": "sha512-tznA/G55dsxzM5XChBfcvVSloG2ejeeotfPPJSFaWmHyCDVGMpvf3nRNbsCb/JTBF9RmQFBfuujWt3Nphjesng==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^8.17.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify/node_modules/find-my-way": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.1.0.tgz", + "integrity": "sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/fastify/node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4206,6 +4358,15 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -4296,6 +4457,17 @@ "node": ">= 0.8.0" } }, + "node_modules/light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5170,21 +5342,21 @@ } }, "node_modules/pino": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", - "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.18.0.tgz", + "integrity": "sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.0.0", + "pino-abstract-transport": "v1.1.0", "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", + "sonic-boom": "^3.7.0", "thread-stream": "^2.0.0" }, "bin": { @@ -5192,9 +5364,9 @@ } }, "node_modules/pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", "dev": true, "dependencies": { "readable-stream": "^4.0.0", @@ -5207,6 +5379,12 @@ "integrity": "sha512-wHuWB+CvSVb2XqXM0W/WOYUkVSPbiJb9S5fNB7TBhd8s892Xq910bRxwHtC4l71hgztObTjXL6ZheZXFjhDrDQ==", "dev": true }, + "node_modules/pino/node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5418,20 +5596,30 @@ } }, "node_modules/readable-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", - "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/readable-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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5853,6 +6041,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5954,6 +6148,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -5961,9 +6161,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6065,6 +6265,12 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -6139,9 +6345,9 @@ } }, "node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", + "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0" @@ -6528,6 +6734,15 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -7644,6 +7859,41 @@ "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true }, + "@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dev": true, + "requires": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "dev": true + }, + "@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dev": true, + "requires": { + "fast-json-stringify": "^5.7.0" + } + }, + "@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -8021,6 +8271,12 @@ "event-target-shim": "^5.0.0" } }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "dev": true + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -8071,6 +8327,15 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -8239,6 +8504,18 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "avvio": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.3.0.tgz", + "integrity": "sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==", + "dev": true, + "requires": { + "@fastify/error": "^3.3.0", + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.17.1" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -9311,6 +9588,12 @@ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, + "fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", + "dev": true + }, "fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -9352,6 +9635,21 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-json-stringify": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.12.0.tgz", + "integrity": "sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==", + "dev": true, + "requires": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -9379,10 +9677,59 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "fast-uri": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.3.0.tgz", + "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==", + "dev": true + }, + "fastify": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.26.1.tgz", + "integrity": "sha512-tznA/G55dsxzM5XChBfcvVSloG2ejeeotfPPJSFaWmHyCDVGMpvf3nRNbsCb/JTBF9RmQFBfuujWt3Nphjesng==", + "dev": true, + "requires": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^8.17.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + }, + "dependencies": { + "find-my-way": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.1.0.tgz", + "integrity": "sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + } + }, + "process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + } + } + }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -10319,6 +10666,15 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -10393,6 +10749,17 @@ "type-check": "~0.4.0" } }, + "light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "dev": true, + "requires": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11069,28 +11436,36 @@ } }, "pino": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.14.1.tgz", - "integrity": "sha512-8LYNv7BKWXSfS+k6oEc6occy5La+q2sPwU3q2ljTX5AZk7v+5kND2o5W794FyRaqha6DJajmkNRsWtPpFyMUdw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.18.0.tgz", + "integrity": "sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==", "dev": true, "requires": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.0.0", + "pino-abstract-transport": "v1.1.0", "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", + "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.1.0", + "sonic-boom": "^3.7.0", "thread-stream": "^2.0.0" + }, + "dependencies": { + "process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + } } }, "pino-abstract-transport": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", - "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", "dev": true, "requires": { "readable-stream": "^4.0.0", @@ -11254,15 +11629,27 @@ } }, "readable-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", - "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "requires": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", - "process": "^0.11.10" + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "readdirp": { @@ -11587,6 +11974,12 @@ } } }, + "rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11648,6 +12041,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -11655,9 +12054,9 @@ "dev": true }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "requires": { "lru-cache": "^6.0.0" }, @@ -11750,6 +12149,12 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11806,9 +12211,9 @@ } }, "sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", + "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", "dev": true, "requires": { "atomic-sleep": "^1.0.0" @@ -12112,6 +12517,12 @@ "is-number": "^7.0.0" } }, + "toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "dev": true + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index 7e0b819a..cc47face 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.26.0", "express": "^4.18.2", + "fastify": "^4.26.1", "import-fresh": "^3.3.0", "mocha": "^9.2.2", "node-mocks-http": "^1.11.0", diff --git a/src/lib/config/default/config-request.json b/src/lib/config/default/config-request.json index b7a4fcbe..d7be7abc 100644 --- a/src/lib/config/default/config-request.json +++ b/src/lib/config/default/config-request.json @@ -23,14 +23,21 @@ ], "output": [ "req-log" - ] + ], + "convert": "parseInt" }, { "name": "request", - "source": { - "type": "req-object", - "fieldName": "originalUrl" - }, + "source": [ + { + "type": "req-object", + "fieldName": "originalUrl" + }, + { + "type": "req-object", + "fieldName": "url" + } + ], "output": [ "req-log" ] @@ -69,7 +76,8 @@ ], "output": [ "req-log" - ] + ], + "convert": "parseInt" }, { "name": "response_content_type", @@ -363,4 +371,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/lib/config/default/config-schema.json b/src/lib/config/default/config-schema.json index c2b64db7..6692fa33 100644 --- a/src/lib/config/default/config-schema.json +++ b/src/lib/config/default/config-schema.json @@ -122,6 +122,7 @@ "enum": [ "connect", "express", + "fastify", "plainhttp", "restify" ], diff --git a/src/lib/config/interfaces.ts b/src/lib/config/interfaces.ts index cd500d45..2b4d1acc 100644 --- a/src/lib/config/interfaces.ts +++ b/src/lib/config/interfaces.ts @@ -43,7 +43,8 @@ export enum Framework { Express = "express", Restify = "restify", Connect = "connect", - NodeJsHttp = "plainhttp" + Fastify = "fastify", + NodeJsHttp = "plainhttp" } export enum Output { diff --git a/src/lib/middleware/framework-services/connect.ts b/src/lib/middleware/framework-services/connect.ts index e638be26..3aa26190 100644 --- a/src/lib/middleware/framework-services/connect.ts +++ b/src/lib/middleware/framework-services/connect.ts @@ -1,8 +1,7 @@ import { FrameworkService } from "../interfaces"; export default class ConnectService implements FrameworkService { - - getReqHeaderField(req: any, fieldName: string): string { + getReqHeaderField(req: any, fieldName: string): string | undefined { return req.headers[fieldName]; } @@ -30,11 +29,16 @@ export default class ConnectService implements FrameworkService { return value } - getResHeaderField(res: any, fieldName: string): string { - return res.getHeader ? res.getHeader(fieldName) : ""; + getResHeaderField(res: any, fieldName: string): string | undefined { + return res.getHeader ? res.getHeader(fieldName) : undefined; } getResField(res: any, fieldName: string): any { return res[fieldName]; } + + onResFinish(res: any, handler: () => void): void { + res.on("header", handler); + res.on("finish", handler); + } } diff --git a/src/lib/middleware/framework-services/express.ts b/src/lib/middleware/framework-services/express.ts index dfabcd53..13947aa3 100644 --- a/src/lib/middleware/framework-services/express.ts +++ b/src/lib/middleware/framework-services/express.ts @@ -2,8 +2,8 @@ import { FrameworkService } from "../interfaces"; export default class ExpressService implements FrameworkService { - getReqHeaderField(req: any, fieldName: string): string { - return req.header(fieldName); + getReqHeaderField(req: any, fieldName: string): string | undefined { + return req.header ? req.header(fieldName) : undefined; } getReqField(req: any, fieldName: string): any { @@ -30,11 +30,16 @@ export default class ExpressService implements FrameworkService { return value } - getResHeaderField(res: any, fieldName: string): string { - return res.get(fieldName); + getResHeaderField(res: any, fieldName: string): string | undefined { + return res.get ? res.get(fieldName) : undefined; } getResField(res: any, fieldName: string): any { return res[fieldName]; } + + onResFinish(res: any, handler: () => void): void { + res.on("header", handler); + res.on("finish", handler); + } } diff --git a/src/lib/middleware/framework-services/fastify.ts b/src/lib/middleware/framework-services/fastify.ts new file mode 100644 index 00000000..216aafc8 --- /dev/null +++ b/src/lib/middleware/framework-services/fastify.ts @@ -0,0 +1,45 @@ +import { FrameworkService } from "../interfaces"; + +export default class FastifyService implements FrameworkService { + + getReqHeaderField(req: any, fieldName: string): string | undefined { + return req.headers[fieldName] + } + + getReqField(req: any, fieldName: string): any { + let value: string | number | boolean | undefined = undefined; + switch (fieldName) { + case "protocol": + value = "HTTP" + (req.raw.httpVersion == null ? "" : "/" + req.raw.httpVersion); + break; + case "remote_host": + value = req.raw.connection?.remoteAddress; + break; + case "remote_port": + value = req.raw.connection?.remotePort?.toString(); + break; + case "remote_user": + if (req.raw.user && req.raw.user.id) { + value = req.raw.user.id; + } + break; + default: + value = req.raw[fieldName] + break; + } + return value + } + + getResHeaderField(res: any, fieldName: string): string | undefined { + return res.getHeader ? res.getHeader(fieldName) : undefined + } + + getResField(res: any, fieldName: string): any { + return res.raw[fieldName]; + } + + onResFinish(res: any, handler: () => void): void { + res.raw.on("header", handler); + res.raw.on("finish", handler); + } +} diff --git a/src/lib/middleware/framework-services/plainhttp.ts b/src/lib/middleware/framework-services/plainhttp.ts index 4785fd06..62555ce7 100644 --- a/src/lib/middleware/framework-services/plainhttp.ts +++ b/src/lib/middleware/framework-services/plainhttp.ts @@ -2,7 +2,7 @@ import { FrameworkService } from "../interfaces"; export default class HttpService implements FrameworkService { - getReqHeaderField(req: any, fieldName: string): string { + getReqHeaderField(req: any, fieldName: string): string | undefined { return req.headers[fieldName]; } @@ -30,11 +30,16 @@ export default class HttpService implements FrameworkService { return value } - getResHeaderField(res: any, fieldName: string): string { - return res.getHeader ? res.getHeader(fieldName) : ""; + getResHeaderField(res: any, fieldName: string): string | undefined { + return res.getHeader ? res.getHeader(fieldName) : undefined; } getResField(res: any, fieldName: string): any { return res[fieldName]; } + + onResFinish(res: any, handler: () => void): void { + res.on("header", handler); + res.on("finish", handler); + } } diff --git a/src/lib/middleware/framework-services/restify.ts b/src/lib/middleware/framework-services/restify.ts index 4e5e03da..711d3641 100644 --- a/src/lib/middleware/framework-services/restify.ts +++ b/src/lib/middleware/framework-services/restify.ts @@ -2,8 +2,8 @@ import { FrameworkService } from "../interfaces"; export default class RestifyService implements FrameworkService { - getReqHeaderField(req: any, fieldName: string): string { - return req.header(fieldName); + getReqHeaderField(req: any, fieldName: string): string | undefined { + return req ? req.header(fieldName): undefined; } getReqField(req: any, fieldName: string): any { @@ -30,11 +30,16 @@ export default class RestifyService implements FrameworkService { return value } - getResHeaderField(res: any, fieldName: string): string { - return res.get ? res.get(fieldName) : ""; + getResHeaderField(res: any, fieldName: string): string | undefined { + return res.get ? res.get(fieldName) : undefined; } getResField(res: any, fieldName: string): any { return res[fieldName]; } + + onResFinish(res: any, handler: () => void): void { + res.on("header", handler); + res.on("finish", handler); + } } diff --git a/src/lib/middleware/interfaces.ts b/src/lib/middleware/interfaces.ts index e14d0d8f..68c75fa4 100644 --- a/src/lib/middleware/interfaces.ts +++ b/src/lib/middleware/interfaces.ts @@ -1,6 +1,7 @@ export interface FrameworkService { - getReqHeaderField(req: any, fieldName: string): string; + getReqHeaderField(req: any, fieldName: string): string | undefined; getReqField(req: any, fieldName: string): string | number | boolean | undefined; - getResHeaderField(req: any, fieldName: string): string; + getResHeaderField(req: any, fieldName: string): string | undefined; getResField(req: any, fieldName: string): string | number | boolean | undefined; + onResFinish(res: any, handler: () => void): void; } diff --git a/src/lib/middleware/middleware.ts b/src/lib/middleware/middleware.ts index 70faf565..913a9d4b 100644 --- a/src/lib/middleware/middleware.ts +++ b/src/lib/middleware/middleware.ts @@ -7,6 +7,7 @@ import Context from '../logger/context'; import RootLogger from '../logger/rootLogger'; import RequestAccessor from './requestAccessor'; import Config from '../config/config'; +import ResponseAccessor from './responseAccessor'; export default class Middleware { @@ -46,9 +47,7 @@ export default class Middleware { } } - res.on("finish", finishLog); - - res.on("header", finishLog); + ResponseAccessor.getInstance().onFinish(res, finishLog); next ? next() : null; } diff --git a/src/lib/middleware/requestAccessor.ts b/src/lib/middleware/requestAccessor.ts index 2d17d165..25371fd0 100644 --- a/src/lib/middleware/requestAccessor.ts +++ b/src/lib/middleware/requestAccessor.ts @@ -16,7 +16,7 @@ export default class RequestAccessor { return RequestAccessor.instance; } - getHeaderField(req: any, fieldName: string): string { + getHeaderField(req: any, fieldName: string): string | undefined { return this.frameworkService.getReqHeaderField(req, fieldName); } @@ -24,7 +24,7 @@ export default class RequestAccessor { return this.frameworkService.getReqField(req, fieldName); } - setFrameworkService() { + setFrameworkService(): void { this.frameworkService = assignFrameworkService(); } } diff --git a/src/lib/middleware/responseAccessor.ts b/src/lib/middleware/responseAccessor.ts index 1d70f2fa..b66a23f7 100644 --- a/src/lib/middleware/responseAccessor.ts +++ b/src/lib/middleware/responseAccessor.ts @@ -16,7 +16,7 @@ export default class ResponseAccessor { return ResponseAccessor.instance; } - getHeaderField(res: any, fieldName: string): string { + getHeaderField(res: any, fieldName: string): string | undefined { return this.frameworkService.getResHeaderField(res, fieldName); } @@ -24,7 +24,11 @@ export default class ResponseAccessor { return this.frameworkService.getResField(res, fieldName); } - setFrameworkService() { + onFinish(res: any, handler: () => void): void { + this.frameworkService.onResFinish(res, handler); + } + + setFrameworkService(): void { this.frameworkService = assignFrameworkService(); } } diff --git a/src/lib/middleware/utils.ts b/src/lib/middleware/utils.ts index 278698a7..8d06cc1a 100644 --- a/src/lib/middleware/utils.ts +++ b/src/lib/middleware/utils.ts @@ -2,6 +2,7 @@ import Config from '../config/config'; import { Framework } from '../config/interfaces'; import ConnectService from './framework-services/connect'; import ExpressService from './framework-services/express'; +import FastifyService from './framework-services/fastify'; import HttpService from './framework-services/plainhttp'; import RestifyService from './framework-services/restify'; import { FrameworkService } from './interfaces'; @@ -15,6 +16,8 @@ export function assignFrameworkService(): FrameworkService { return new HttpService(); case Framework.Connect: return new ConnectService(); + case Framework.Fastify: + return new FastifyService(); case Framework.Express: default: return new ExpressService(); diff --git a/src/test/acceptance-test/fastify/app.js b/src/test/acceptance-test/fastify/app.js new file mode 100644 index 00000000..586d095a --- /dev/null +++ b/src/test/acceptance-test/fastify/app.js @@ -0,0 +1,39 @@ + +const importFresh = require('import-fresh'); +const fastify = importFresh('fastify'); +const log = importFresh('../../../../build/main/index'); +const app = fastify(); + +// Force logger to run the fastify version. +log.forceLogger("fastify"); + +// Add the logger middleware, so each time a request is received, it is will get logged. +app.addHook("onRequest", log.logNetwork); + +app.get('/log', function (request, reply) { + request.logger.setLoggingLevel("info"); + request.logger.logMessage("info", "fastify-message"); + reply.send(); +}) + +app.get("/setcorrelationandtenantid", function (request, reply) { + request.logger.setCorrelationId("cbc2654f-1c35-45d0-96fc-f32efac20986"); + request.logger.setTenantId("abc8714f-5t15-12h0-78gt-n73jeuc01847"); + request.logger.logMessage("info", "fastify-message"); + reply.send(); +}); + +app.get("/getcorrelationandtenantid", function (request, reply) { + var correlationId = "cbc2654f-1c35-45d0-96fc-f32efac20986"; + var tenantId = "abc8714f-5t15-12h0-78gt-n73jeuc01847"; + + request.logger.setCorrelationId(correlationId); + request.logger.setTenantId(tenantId); + + if (request.logger.getCorrelationId() == correlationId && request.logger.getTenantId() == tenantId) { + request.logger.logMessage("info", "successful"); + } + reply.send(); +}); + +module.exports = app; diff --git a/src/test/acceptance-test/request-context.test.js b/src/test/acceptance-test/request-context.test.js index 11fc311f..d5333f3d 100644 --- a/src/test/acceptance-test/request-context.test.js +++ b/src/test/acceptance-test/request-context.test.js @@ -7,13 +7,13 @@ const supertest = require('supertest'); const expressApp = require("./express/app.js"); const restifyApp = require("./restify/app.js"); const connectApp = require("./connect/app.js"); +const fastifyApp = require("./fastify/app.js"); const httpApp = require("./nodejs-http/app.js"); const log = importFresh("../../../build/main/index"); -var lastLogs; +var lastLogs = []; describe('Test request context', function () { - // catch logs written by supertest app process.writeLog = function (level, output) { lastLogs.push(JSON.parse(output)); @@ -25,13 +25,12 @@ describe('Test request context', function () { }); }); - describe("Express", function () { + describe("Use Express framework", function () { before(function () { log.forceLogger("express"); }); describe("Logs in request context", function () { - before(function (done) { lastLogs = []; supertest(expressApp) @@ -88,7 +87,6 @@ describe('Test request context', function () { }); describe("Set log level treshold in request handler", function () { - before(function (done) { lastLogs = []; supertest(expressApp) @@ -109,7 +107,6 @@ describe('Test request context', function () { }); describe("Set implicit correlation-, tenant-id and tenant-subdomain through methods", function () { - before(function (done) { supertest(expressApp) .get("/setcorrelationandtenantid") @@ -137,7 +134,6 @@ describe('Test request context', function () { }); describe("Set implicit correlation- and tenant-id through request header", function () { - var correlation_id = "cbc4343f-1c31-27d0-96fc-f32efac20986"; var tenant_id = "abc2654f-5t15-12h0-78gt-n73jeuc01847"; @@ -166,7 +162,6 @@ describe('Test request context', function () { }); describe("Get correlation-, tenant-id and tenant-subdomain", function () { - before(function (done) { supertest(expressApp) .get("/getcorrelationandtenantid") @@ -187,7 +182,6 @@ describe('Test request context', function () { }); describe("Test sensitive data redaction without activated env vars", function () { - before(function (done) { supertest(expressApp) .get("/requestcontext") @@ -234,7 +228,6 @@ describe('Test request context', function () { }); describe("Set dynamic log level with JWT", function () { - describe("Set treshold to level error", function () { before(function (done) { supertest(expressApp) @@ -276,15 +269,13 @@ describe('Test request context', function () { }); }) - describe("RESTIFY", function () { - + describe("Use Restify framework", function () { before(function (done) { log.forceLogger("restify"); done(); }); describe("Set implicit correlation- and tenant-id through request header", function () { - var correlation_id = "cbc4343f-1c31-27d0-96fc-f32efac20986"; var tenant_id = "abc2654f-5t15-12h0-78gt-n73jeuc01847"; @@ -311,6 +302,7 @@ describe('Test request context', function () { lastLogs = []; }); }); + describe("Set implicit correlation- and tenant-id through methods", function () { var correlation_id = "cbc2654f-1c35-45d0-96fc-f32efac20986"; @@ -337,6 +329,7 @@ describe('Test request context', function () { lastLogs = []; }); }); + describe("Get correlation- and tenant-id", function () { before(function (done) { @@ -359,15 +352,13 @@ describe('Test request context', function () { }); }); - describe("CONNECT", function () { - + describe("Use Connect framework", function () { before(function (done) { log.forceLogger("connect"); done(); }); describe("Set implicit correlation- and tenant-id through request header", function () { - var correlation_id = "cbc4343f-1c31-27d0-96fc-f32efac20986"; var tenant_id = "abc2654f-5t15-12h0-78gt-n73jeuc01847"; @@ -395,8 +386,8 @@ describe('Test request context', function () { }); }); - describe("Set implicit correlation- and tenant-id through methods", function () { + describe("Set implicit correlation- and tenant-id through methods", function () { var correlation_id = "cbc2654f-1c35-45d0-96fc-f32efac20986"; var tenant_id = "abc8714f-5t15-12h0-78gt-n73jeuc01847"; @@ -422,8 +413,8 @@ describe('Test request context', function () { }); }); - describe("Get correlation- and tenant-id", function () { + describe("Get correlation- and tenant-id", function () { before(function (done) { supertest(connectApp) .get("/getcorrelationandtenantid") @@ -444,13 +435,100 @@ describe('Test request context', function () { }); }); - describe("NODEJSHTTP", function () { + describe("Use Fastify framework", function () { before(function (done) { - log.forceLogger("plainhttp"); + log.forceLogger("fastify"); done(); }); + describe("Set implicit correlation- and tenant-id through request header", function () { + var correlation_id = "cbc4343f-1c31-27d0-96fc-f32efac20986"; + var tenant_id = "abc2654f-5t15-12h0-78gt-n73jeuc01847"; + before(function (done) { + fastifyApp.ready().then(() => { + supertest(fastifyApp.server) + .get("/log") + .set("x-correlationid", correlation_id) + .set("tenantid", tenant_id) + .expect(200) + .then(done()) + .catch(err => done(err)); + }) + }); + + it("sets correlation_id via header", function () { + expect(lastLogs.length).to.be.gt(1); + expect(lastLogs[1]).to.have.property('correlation_id', correlation_id); + }); + + it("sets tenant_id via header", function () { + expect(lastLogs[1]).to.have.property('tenant_id', tenant_id); + }); + + after(function () { + lastLogs = []; + }); + }); + + describe("Set implicit correlation- and tenant-id through methods", function () { + var correlation_id = "cbc2654f-1c35-45d0-96fc-f32efac20986"; + var tenant_id = "abc8714f-5t15-12h0-78gt-n73jeuc01847"; + + before(function (done) { + fastifyApp.ready().then(() => { + supertest(fastifyApp.server) + .get("/setcorrelationandtenantid") + .expect(200) + .then(done()) + .catch(err => done(err)); + }) + }); + + it("writes a log with correlation id", function () { + expect(lastLogs.length).to.be.gt(1); + expect(lastLogs[1]).to.have.property('correlation_id', correlation_id); + }); + + it("sets tenant_id via header", function () { + expect(lastLogs[1]).to.have.property('tenant_id', tenant_id); + }); + + after(function () { + lastLogs = []; + }); + }); + + describe("Get correlation- and tenant-id", function () { + before(function (done) { + fastifyApp.ready().then(() => { + supertest(fastifyApp.server) + .get("/getcorrelationandtenantid") + .expect(200) + .then(done()) + .catch(err => done(err)); + }) + }); + + it("get methods returned expected values", function () { + expect(lastLogs.length).to.be.gt(0); + expect(lastLogs[0]).to.have.property('msg', 'successful'); + }); + + + after(function () { + lastLogs = []; + }); + }); + }); + + describe("Use Node.js http", function () { + before(function (done) { + log.forceLogger("plainhttp"); + done(); + }); + + describe("Set implicit correlation- and tenant-id through request header", function () { var correlation_id = "cbc4343f-1c31-27d0-96fc-f32efac20986"; var tenant_id = "abc2654f-5t15-12h0-78gt-n73jeuc01847"; @@ -476,10 +554,9 @@ describe('Test request context', function () { after(function () { lastLogs = []; }); - }); - describe("Set implicit correlation- and tenant-id through methods", function () { + describe("Set implicit correlation- and tenant-id through methods", function () { var correlation_id = "cbc2654f-1c35-45d0-96fc-f32efac20986"; var tenant_id = "abc8714f-5t15-12h0-78gt-n73jeuc01847"; @@ -503,8 +580,8 @@ describe('Test request context', function () { after(function () { lastLogs = []; }); - }); + describe("Get correlation- and tenant-id", function () { before(function (done) { diff --git a/src/test/unit-test/config.test.js b/src/test/unit-test/config.test.js index de888b45..17b04e69 100644 --- a/src/test/unit-test/config.test.js +++ b/src/test/unit-test/config.test.js @@ -52,10 +52,16 @@ describe('Test Config class', function () { } }, { "name": "request", - "source": { - "type": "req-object", - "fieldName": "originalUrl" - }, + "source": [ + { + "fieldName": "originalUrl", + "type": "req-object" + }, + { + "fieldName": "url", + "type": "req-object" + } + ], "output": [ "req-log" ],