From 14205bb64f543a888d72f54f0f325cbac2e1b669 Mon Sep 17 00:00:00 2001 From: Pavlo Kutsenko Date: Thu, 6 Oct 2022 11:45:37 +0200 Subject: [PATCH 1/5] Move configuration data to a separate config --- .gitignore | 1 + JavaScript/9-logger/config.js | 13 +++++++++++++ JavaScript/9-logger/db.js | 17 ++++++++++++----- JavaScript/9-logger/hash.js | 11 ++++++++--- JavaScript/9-logger/main.js | 5 +++-- 5 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 JavaScript/9-logger/config.js diff --git a/.gitignore b/.gitignore index ac1e8f7..5bd0e3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules *.log .DS_Store +.idea diff --git a/JavaScript/9-logger/config.js b/JavaScript/9-logger/config.js new file mode 100644 index 0000000..4d8004a --- /dev/null +++ b/JavaScript/9-logger/config.js @@ -0,0 +1,13 @@ +const crypto = require("node:crypto"); +module.exports = { + SERVER_PORT: 8001, + STATIC_SERVER_PORT: 8000, + DB_HOST: '127.0.0.1', + DB_PORT: 5432, + DB_NAME: 'example', + DB_USER: 'marcus', + DB_PASSWORD: 'marcus', + CRYPTO_SIZE: 16, + CRYPTO_KEY_LENGTH: 64, + CRYPTO_ENCODING: 'base64', +} diff --git a/JavaScript/9-logger/db.js b/JavaScript/9-logger/db.js index 1605d15..a139462 100644 --- a/JavaScript/9-logger/db.js +++ b/JavaScript/9-logger/db.js @@ -1,13 +1,20 @@ 'use strict'; const pg = require('pg'); +const { + DB_HOST: host, + DB_PORT: port, + DB_NAME: database, + DB_USER: user, + DB_PASSWORD: password, +} = require('./config.js') const pool = new pg.Pool({ - host: '127.0.0.1', - port: 5432, - database: 'example', - user: 'marcus', - password: 'marcus', + host, + port, + database, + user, + password, }); module.exports = (table) => ({ diff --git a/JavaScript/9-logger/hash.js b/JavaScript/9-logger/hash.js index bdb4864..225986d 100644 --- a/JavaScript/9-logger/hash.js +++ b/JavaScript/9-logger/hash.js @@ -1,12 +1,17 @@ 'use strict'; const crypto = require('node:crypto'); +const { + CRYPTO_SIZE, + CRYPTO_KEY_LENGTH, + CRYPTO_ENCODING, +} = require('./config') const hash = (password) => new Promise((resolve, reject) => { - const salt = crypto.randomBytes(16).toString('base64'); - crypto.scrypt(password, salt, 64, (err, result) => { + const salt = crypto.randomBytes(CRYPTO_SIZE).toString(CRYPTO_ENCODING); + crypto.scrypt(password, salt, CRYPTO_KEY_LENGTH, (err, result) => { if (err) reject(err); - resolve(salt + ':' + result.toString('base64')); + resolve(salt + ':' + result.toString(CRYPTO_ENCODING)); }); }); diff --git a/JavaScript/9-logger/main.js b/JavaScript/9-logger/main.js index 6e64123..ec5397f 100644 --- a/JavaScript/9-logger/main.js +++ b/JavaScript/9-logger/main.js @@ -8,6 +8,7 @@ const load = require('./load.js'); const db = require('./db.js'); const hash = require('./hash.js'); const logger = require('./logger.js'); +const { SERVER_PORT, STATIC_SERVER_PORT } = require('./config.js'); const sandbox = { console: Object.freeze(logger), @@ -26,6 +27,6 @@ const routing = {}; routing[serviceName] = await load(filePath, sandbox); } - staticServer('./static', 8000); - server(routing, 8001); + staticServer('./static', STATIC_SERVER_PORT); + server(routing, SERVER_PORT); })(); From b8abbc05a6e75bdba27a94614bb868cebcf310aa Mon Sep 17 00:00:00 2001 From: Pavlo Kutsenko Date: Thu, 6 Oct 2022 11:55:25 +0200 Subject: [PATCH 2/5] Add server transport type --- JavaScript/9-logger/config.js | 1 + JavaScript/9-logger/main.js | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/JavaScript/9-logger/config.js b/JavaScript/9-logger/config.js index 4d8004a..c324bef 100644 --- a/JavaScript/9-logger/config.js +++ b/JavaScript/9-logger/config.js @@ -10,4 +10,5 @@ module.exports = { CRYPTO_SIZE: 16, CRYPTO_KEY_LENGTH: 64, CRYPTO_ENCODING: 'base64', + TRANSPORT: 'http', } diff --git a/JavaScript/9-logger/main.js b/JavaScript/9-logger/main.js index ec5397f..1d4c1a5 100644 --- a/JavaScript/9-logger/main.js +++ b/JavaScript/9-logger/main.js @@ -2,13 +2,16 @@ const fsp = require('node:fs').promises; const path = require('node:path'); -const server = require('./ws.js'); +const server = { + http: require('./http.js'), + ws: require('./ws.js'), +}; const staticServer = require('./static.js'); const load = require('./load.js'); const db = require('./db.js'); const hash = require('./hash.js'); const logger = require('./logger.js'); -const { SERVER_PORT, STATIC_SERVER_PORT } = require('./config.js'); +const { SERVER_PORT, STATIC_SERVER_PORT, TRANSPORT } = require('./config.js'); const sandbox = { console: Object.freeze(logger), @@ -28,5 +31,5 @@ const routing = {}; } staticServer('./static', STATIC_SERVER_PORT); - server(routing, SERVER_PORT); + (server[TRANSPORT] || server.ws)(routing, SERVER_PORT); })(); From 40813d4b3c9cb716032f9892c5f5d4fbe28897ac Mon Sep 17 00:00:00 2001 From: Pavlo Kutsenko Date: Thu, 6 Oct 2022 13:22:15 +0200 Subject: [PATCH 3/5] Modify scaffold to support http --- JavaScript/9-logger/static/client.js | 99 ++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 21 deletions(-) diff --git a/JavaScript/9-logger/static/client.js b/JavaScript/9-logger/static/client.js index 17e68c1..4e8db9f 100644 --- a/JavaScript/9-logger/static/client.js +++ b/JavaScript/9-logger/static/client.js @@ -1,29 +1,81 @@ 'use strict'; -const socket = new WebSocket('ws://127.0.0.1:8001/'); +const createApi = { + ws(url, structure) { + const socket = new WebSocket(url); + const api = {}; + const services = Object.keys(structure); + for (const serviceName of services) { + api[serviceName] = {}; + const service = structure[serviceName]; + const methods = Object.keys(service); + for (const methodName of methods) { + api[serviceName][methodName] = (...args) => new Promise((resolve) => { + const packet = { name: serviceName, method: methodName, args }; + socket.send(JSON.stringify(packet)); + socket.onmessage = (event) => { + const data = JSON.parse(event.data); + resolve(data); + }; + }); + } + } + return api; + }, + http(url, structure) { + const api = {}; + const services = Object.keys(structure); + const methodMap = { + create: 'POST', + update: 'PUT', + delete: 'DELETE', + } + for (const serviceName of services) { + api[serviceName] = {}; + const service = structure[serviceName]; + const methods = Object.keys(service); + for (const methodName of methods) { + api[serviceName][methodName] = (...args) => new Promise((resolve) => { + let pathname = `/${serviceName}/${methodName}`; + const method = methodMap[methodName] || 'GET'; + if (method !== 'POST') { + pathname += `/${args[0]}` + } + const data = { + method, + headers: { 'Content-Type': 'application/json' }, + } -const scaffold = (structure) => { - const api = {}; - const services = Object.keys(structure); - for (const serviceName of services) { - api[serviceName] = {}; - const service = structure[serviceName]; - const methods = Object.keys(service); - for (const methodName of methods) { - api[serviceName][methodName] = (...args) => new Promise((resolve) => { - const packet = { name: serviceName, method: methodName, args }; - socket.send(JSON.stringify(packet)); - socket.onmessage = (event) => { - const data = JSON.parse(event.data); - resolve(data); - }; - }); + if (['POST', 'PUT'].includes(method)) { + data.body = JSON.stringify(structure[serviceName][methodName].reduce((acc, name, index) => { + acc[name] = args[index]; + return acc; + }, {})) + } + console.log(pathname, args); + fetch(url + pathname, { + data, + }).then((res) => { + const { status } = res; + if (status !== 200) { + reject(new Error(`Status Code: ${status}`)); + return; + } + resolve(res.json()); + }); + }); + } } + return api; } - return api; +} + +const scaffold = (url, structure) => { + const transport = url.startsWith('http') ? 'http' : 'ws' + return createApi[transport](url, structure); }; -const api = scaffold({ +const api = scaffold('http://127.0.0.1:8001', { user: { create: ['record'], read: ['id'], @@ -38,7 +90,12 @@ const api = scaffold({ }, }); -socket.addEventListener('open', async () => { +/* socket.addEventListener('open', async () => { const data = await api.user.read(3); console.dir({ data }); -}); +}); */ + +(async () => { + const data = await api.user.read(1); + console.dir({ data }); +})() From 1f2fde3b7f10acdcb735df46af6c601ba1b942f9 Mon Sep 17 00:00:00 2001 From: Pavlo Kutsenko Date: Thu, 6 Oct 2022 15:38:01 +0200 Subject: [PATCH 4/5] Use common.js approach for /api --- JavaScript/9-logger/api/city.js | 2 +- JavaScript/9-logger/api/country.js | 4 ++-- JavaScript/9-logger/api/user.js | 4 ++-- JavaScript/9-logger/main.js | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/JavaScript/9-logger/api/city.js b/JavaScript/9-logger/api/city.js index bc1bcb4..809f2e5 100644 --- a/JavaScript/9-logger/api/city.js +++ b/JavaScript/9-logger/api/city.js @@ -1 +1 @@ -db('city'); +module.exports = db('city'); diff --git a/JavaScript/9-logger/api/country.js b/JavaScript/9-logger/api/country.js index d431ade..218f3a6 100644 --- a/JavaScript/9-logger/api/country.js +++ b/JavaScript/9-logger/api/country.js @@ -1,6 +1,6 @@ const country = db('country'); -({ +module.exports = { read(id) { console.log({ db }); return country.read(id); @@ -10,4 +10,4 @@ const country = db('country'); const sql = 'SELECT * from country where name like $1'; return country.query(sql, [mask]); }, -}); +} diff --git a/JavaScript/9-logger/api/user.js b/JavaScript/9-logger/api/user.js index cc7791e..356df6f 100644 --- a/JavaScript/9-logger/api/user.js +++ b/JavaScript/9-logger/api/user.js @@ -1,4 +1,4 @@ -({ +module.exports = { read(id) { return db('users').read(id, ['id', 'login']); }, @@ -21,4 +21,4 @@ const sql = 'SELECT login from users where login like $1'; return db('users').query(sql, [mask]); }, -}); +}; diff --git a/JavaScript/9-logger/main.js b/JavaScript/9-logger/main.js index 1d4c1a5..4b196dd 100644 --- a/JavaScript/9-logger/main.js +++ b/JavaScript/9-logger/main.js @@ -17,6 +17,7 @@ const sandbox = { console: Object.freeze(logger), db: Object.freeze(db), common: { hash }, + module: {} }; const apiPath = path.join(process.cwd(), './api'); const routing = {}; From b49eb4d89b8f1a1bb9f7bcf22f4e7a5b7b5c391b Mon Sep 17 00:00:00 2001 From: Pavlo Kutsenko Date: Thu, 6 Oct 2022 15:45:36 +0200 Subject: [PATCH 5/5] Use pino logger --- JavaScript/9-logger/config.js | 3 +- JavaScript/9-logger/main.js | 14 +- JavaScript/9-logger/package-lock.json | 345 ++++++++++++++++++++++++++ JavaScript/9-logger/package.json | 1 + 4 files changed, 359 insertions(+), 4 deletions(-) diff --git a/JavaScript/9-logger/config.js b/JavaScript/9-logger/config.js index c324bef..13bb553 100644 --- a/JavaScript/9-logger/config.js +++ b/JavaScript/9-logger/config.js @@ -1,4 +1,4 @@ -const crypto = require("node:crypto"); + module.exports = { SERVER_PORT: 8001, STATIC_SERVER_PORT: 8000, @@ -11,4 +11,5 @@ module.exports = { CRYPTO_KEY_LENGTH: 64, CRYPTO_ENCODING: 'base64', TRANSPORT: 'http', + LOGGER_TYPE: 'pino' } diff --git a/JavaScript/9-logger/main.js b/JavaScript/9-logger/main.js index 4b196dd..0583494 100644 --- a/JavaScript/9-logger/main.js +++ b/JavaScript/9-logger/main.js @@ -10,11 +10,19 @@ const staticServer = require('./static.js'); const load = require('./load.js'); const db = require('./db.js'); const hash = require('./hash.js'); -const logger = require('./logger.js'); -const { SERVER_PORT, STATIC_SERVER_PORT, TRANSPORT } = require('./config.js'); +const logger = { + file: require('./logger.js'), + pino: require('pino'), +} +const { + SERVER_PORT, + STATIC_SERVER_PORT, + TRANSPORT, + LOGGER_TYPE +} = require('./config.js'); const sandbox = { - console: Object.freeze(logger), + console: Object.freeze(logger[LOGGER_TYPE]), db: Object.freeze(db), common: { hash }, module: {} diff --git a/JavaScript/9-logger/package-lock.json b/JavaScript/9-logger/package-lock.json index f2c5f94..407d8b0 100644 --- a/JavaScript/9-logger/package-lock.json +++ b/JavaScript/9-logger/package-lock.json @@ -10,9 +10,71 @@ "license": "MIT", "dependencies": { "pg": "^8.8.0", + "pino": "^8.6.1", "ws": "^8.8.1" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -21,6 +83,54 @@ "node": ">=4" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, "node_modules/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", @@ -100,6 +210,41 @@ "split2": "^4.1.0" } }, + "node_modules/pino": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.6.1.tgz", + "integrity": "sha512-fi+V2K98eMZjQ/uEHHSiMALNrz7HaFdKNYuyA3ZUrbH0f1e8sPFDmeRGzg7ZH2q4QDxGnJPOswmqlEaTAZeDPA==", + "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-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "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==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", + "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -135,6 +280,62 @@ "node": ">=0.10.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.0.0.tgz", + "integrity": "sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", + "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/sonic-boom": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", + "integrity": "sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", @@ -143,6 +344,14 @@ "node": ">= 10.x" } }, + "node_modules/thread-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", + "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", @@ -173,11 +382,63 @@ } }, "dependencies": { + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, "packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", @@ -238,6 +499,38 @@ "split2": "^4.1.0" } }, + "pino": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.6.1.tgz", + "integrity": "sha512-fi+V2K98eMZjQ/uEHHSiMALNrz7HaFdKNYuyA3ZUrbH0f1e8sPFDmeRGzg7ZH2q4QDxGnJPOswmqlEaTAZeDPA==", + "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-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + } + }, + "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==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "pino-std-serializers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", + "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" + }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -261,11 +554,63 @@ "xtend": "^4.0.0" } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-warning": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.0.0.tgz", + "integrity": "sha512-+MmoAXoUX+VTHAlwns0h+kFUWFs/3FZy+ZuchkgjyOu3oioLAo2LB5aCfKPh2+P9O18i3m43tUEv3YqttSy0Ww==" + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } + }, + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" + }, + "safe-stable-stringify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.0.tgz", + "integrity": "sha512-eehKHKpab6E741ud7ZIMcXhKcP6TSIezPkNZhy5U8xC6+VvrRdUA2tMgxGxaGl4cz7c2Ew5+mg5+wNB16KQqrA==" + }, + "sonic-boom": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", + "integrity": "sha512-SbbZ+Kqj/XIunvIAgUZRlqd6CGQYq71tRRbXR92Za8J/R3Yh4Av+TWENiSiEgnlwckYLyP0YZQWVfyNC0dzLaA==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, "split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" }, + "thread-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", + "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "requires": { + "real-require": "^0.2.0" + } + }, "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", diff --git a/JavaScript/9-logger/package.json b/JavaScript/9-logger/package.json index 937093e..23e3a5f 100644 --- a/JavaScript/9-logger/package.json +++ b/JavaScript/9-logger/package.json @@ -7,6 +7,7 @@ "main": "main.js", "dependencies": { "pg": "^8.8.0", + "pino": "^8.6.1", "ws": "^8.8.1" } }