From fc024209a7887fa4562d33a407d2ec662d2a5b56 Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Mon, 12 May 2025 09:44:52 +0000 Subject: [PATCH] refactor: drop logging helper in favor of winston using DI --- package-lock.json | 239 +++++++++++++++++++++++++++++++++++++- package.json | 3 +- src/index.ts | 40 +++++-- src/utils/Fetcher.test.ts | 6 - src/utils/Fetcher.ts | 9 +- src/utils/index.ts | 1 - src/utils/log.test.ts | 30 ----- src/utils/log.ts | 11 -- 8 files changed, 273 insertions(+), 66 deletions(-) delete mode 100644 src/utils/log.test.ts delete mode 100644 src/utils/log.ts diff --git a/package-lock.json b/package-lock.json index f85ab83..9817659 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,8 @@ "make-fetch-happen": "^14.0.3", "slugify": "^1.6.6", "unpacker": "^1.0.1", - "user-agents": "^1.1.536" + "user-agents": "^1.1.536", + "winston": "^3.17.0" }, "devDependencies": { "@eslint/js": "^9.26.0", @@ -542,6 +543,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -566,6 +576,17 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -1836,6 +1857,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, "node_modules/@types/user-agents": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/user-agents/-/user-agents-1.0.4.tgz", @@ -2216,7 +2243,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, "license": "MIT" }, "node_modules/asynckit": { @@ -2755,6 +2781,16 @@ "dev": true, "license": "MIT" }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2773,6 +2809,41 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3151,6 +3222,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -3741,6 +3818,12 @@ "bser": "2.1.1" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3842,6 +3925,12 @@ "dev": true, "license": "ISC" }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -4508,7 +4597,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5362,6 +5450,12 @@ "node": ">=6" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5426,6 +5520,23 @@ "dev": true, "license": "MIT" }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5982,6 +6093,15 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -6487,6 +6607,20 @@ "dev": true, "license": "MIT" }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6657,6 +6791,15 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -6816,6 +6959,21 @@ "dev": true, "license": "ISC" }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -6946,6 +7104,15 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -6978,6 +7145,15 @@ "node": ">= 0.8" } }, + "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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -7170,6 +7346,12 @@ "node": "*" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -7209,6 +7391,15 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -7541,6 +7732,12 @@ "lodash.clonedeep": "^4.5.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -7618,6 +7815,42 @@ "node": ">= 8" } }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index e9c17f1..4da7fdf 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "make-fetch-happen": "^14.0.3", "slugify": "^1.6.6", "unpacker": "^1.0.1", - "user-agents": "^1.1.536" + "user-agents": "^1.1.536", + "winston": "^3.17.0" }, "devDependencies": { "@eslint/js": "^9.26.0", diff --git a/src/index.ts b/src/index.ts index c0b0734..6283777 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,11 @@ import express, { NextFunction, Request, Response } from 'express'; import makeFetchHappen from 'make-fetch-happen'; import { flag } from 'country-emoji'; +import winston from 'winston'; import { landingTemplate } from './landingTemplate'; import { Handler, KinoKiste, MeineCloud } from './handler'; import { Dropload, EmbedExtractors, SuperVideo } from './embed-extractor'; -import { buildManifest, Fetcher, logError, logInfo } from './utils'; +import { buildManifest, Fetcher } from './utils'; import { Config, UrlResult } from './types'; import fs from 'node:fs'; import * as os from 'node:os'; @@ -13,10 +14,27 @@ import bytes from 'bytes'; const addon = express(); addon.set('trust proxy', true); -const fetcher = new Fetcher(makeFetchHappen.defaults({ - cachePath: `${fs.realpathSync(os.tmpdir())}/webstreamr`, - maxSockets: 5, -})); +const logger = winston.createLogger({ + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.cli(), + winston.format.timestamp(), + winston.format.printf(({ level, message, timestamp }) => { + return `${timestamp} ${level}: ${message}`; + }), + ), + }), + ], +}); + +const fetcher = new Fetcher( + makeFetchHappen.defaults({ + cachePath: `${fs.realpathSync(os.tmpdir())}/webstreamr`, + maxSockets: 5, + }), + logger, +); const embedExtractors = new EmbedExtractors([ new Dropload(fetcher), @@ -80,13 +98,13 @@ addon.get('/:config/stream/:type/:id.json', async function (req: Request, res: R const type: string = req.params['type'] || ''; const id: string = req.params['id'] || ''; - logInfo(`Search stream for type "${type}" and id "${id}"`); + logger.info(`Search stream for type "${type}" and id "${id}"`); res.setHeader('Content-Type', 'application/json'); const selectedHandlers = handlers.filter(handler => handler.id in config); if (selectedHandlers.length === 0) { - logInfo('No handlers configured, bail out'); + logger.info('No handlers configured, bail out'); res.send(JSON.stringify({ streams: [{ @@ -106,11 +124,11 @@ addon.get('/:config/stream/:type/:id.json', async function (req: Request, res: R try { const handlerUrlResults = await handler.handle({ ip: req.ip as string }, id); - logInfo(`${handler.id} returned ${handlerUrlResults.length} urls`); + logger.info(`${handler.id} returned ${handlerUrlResults.length} urls`); urlResults.push(...handlerUrlResults); } catch (err) { - logError(`${handler.id} error: ` + err); + logger.error(`${handler.id} error: ` + err); } }); await Promise.all(handlerPromises); @@ -124,7 +142,7 @@ addon.get('/:config/stream/:type/:id.json', async function (req: Request, res: R return (b.bytes ?? 0) - (a.bytes ?? 0); }); - logInfo(`Return ${urlResults.length} streams`); + logger.info(`Return ${urlResults.length} streams`); const streams = urlResults.map((urlResult) => { let name = 'WebStreamr'; @@ -155,5 +173,5 @@ addon.get('/:config/stream/:type/:id.json', async function (req: Request, res: R const port = parseInt(process.env['PORT'] || '51546'); addon.listen(port, () => { - logInfo(`Add-on Repository URL: http://127.0.0.1:${port}/manifest.json`); + logger.info(`Add-on Repository URL: http://127.0.0.1:${port}/manifest.json`); }); diff --git a/src/utils/Fetcher.test.ts b/src/utils/Fetcher.test.ts index f56642c..477d57c 100644 --- a/src/utils/Fetcher.test.ts +++ b/src/utils/Fetcher.test.ts @@ -2,12 +2,6 @@ import { Fetcher } from './Fetcher'; import makeFetchHappen from 'make-fetch-happen'; import { Context } from '../types'; -global.console = { - ...console, - error: jest.fn(), - info: jest.fn(), -}; - const mockedFetch = jest.fn(); jest.mock('make-fetch-happen', () => ({ __esModule: true, diff --git a/src/utils/Fetcher.ts b/src/utils/Fetcher.ts index 74042f4..dd3c256 100644 --- a/src/utils/Fetcher.ts +++ b/src/utils/Fetcher.ts @@ -1,21 +1,24 @@ import { FetchInterface, FetchOptions } from 'make-fetch-happen'; import TTLCache from '@isaacs/ttlcache'; import UserAgent from 'user-agents'; -import { logInfo } from './log'; +import { Logger, createLogger } from 'winston'; import { Context } from '../types'; export class Fetcher { private readonly fetch: FetchInterface; + private readonly logger: Logger; + private readonly ipUserAgentCache: TTLCache; - constructor(fetch: FetchInterface) { + constructor(fetch: FetchInterface, logger: Logger | undefined = undefined) { this.fetch = fetch; + this.logger = logger || createLogger(); this.ipUserAgentCache = new TTLCache({ max: 1024, ttl: 86400000 }); // 24h } readonly text = async (ctx: Context, uriOrRequest: string | Request, opts?: FetchOptions): Promise => { - logInfo(`Fetch ${uriOrRequest}`); + this.logger.info(`Fetch ${uriOrRequest}`); const response = await this.fetch( uriOrRequest, diff --git a/src/utils/index.ts b/src/utils/index.ts index fc45ffa..a492636 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,5 +1,4 @@ export * from './Fetcher'; export * from './embed'; export * from './imdb'; -export * from './log'; export * from './manifest'; diff --git a/src/utils/log.test.ts b/src/utils/log.test.ts deleted file mode 100644 index 0a9020a..0000000 --- a/src/utils/log.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { logError, logInfo, logWarn } from './log'; - -describe('log', () => { - test('logError logs via console.error', () => { - const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined); - - logError('some error occurred'); - - expect(consoleErrorSpy).toHaveBeenCalled(); - expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('some error occurred')); - }); - - test('logWarn logs via console.info', () => { - const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => undefined); - - logWarn('something happened'); - - expect(consoleWarnSpy).toHaveBeenCalled(); - expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining('something happened')); - }); - - test('logInfo logs via console.info', () => { - const consoleInfoSpy = jest.spyOn(console, 'info').mockImplementation(() => undefined); - - logInfo('something happened'); - - expect(consoleInfoSpy).toHaveBeenCalled(); - expect(consoleInfoSpy).toHaveBeenCalledWith(expect.stringContaining('something happened')); - }); -}); diff --git a/src/utils/log.ts b/src/utils/log.ts deleted file mode 100644 index 07dbc9e..0000000 --- a/src/utils/log.ts +++ /dev/null @@ -1,11 +0,0 @@ -export const logError = (message: string) => { - console.error(`${new Date().toISOString()}, Error: ${message}`); -}; - -export const logWarn = (message: string) => { - console.warn(`${new Date().toISOString()}, Warn: ${message}`); -}; - -export const logInfo = (message: string) => { - console.info(`${new Date().toISOString()}, Info: ${message}`); -};