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"
],