diff --git a/packages/shared/src/logger/index.ts b/packages/shared/src/logger/index.ts index 037ec3c..86f4dd4 100644 --- a/packages/shared/src/logger/index.ts +++ b/packages/shared/src/logger/index.ts @@ -17,6 +17,11 @@ const rootLogger = pino({ export type Logger = ReturnType; +/** + * Alias for backwards compatibility (discord-gateway uses this name). + */ +export type CustomLogger = Logger; + /** * Returns a child logger bound to the root singleton via pino's .child(). * Preserves parent context and is efficient (no transport re-init per call). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7883579..be07a4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,6 +160,9 @@ importers: pg: specifier: ^8.21.0 version: 8.21.0 + pino: + specifier: ^9.6.0 + version: 9.14.0 piscina: specifier: ^5.1.4 version: 5.1.4 @@ -169,9 +172,6 @@ importers: sharp: specifier: ^0.34.5 version: 0.34.5 - winston: - specifier: ^3.19.0 - version: 3.19.0 ws: specifier: ^8.20.1 version: 8.20.1 @@ -541,13 +541,6 @@ packages: cpu: [x64] os: [win32] - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@dabh/diagnostics@2.0.8': - resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} - '@discordjs/builders@1.14.1': resolution: {integrity: sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ==} engines: {node: '>=16.11.0'} @@ -1943,9 +1936,6 @@ packages: resolution: {integrity: sha512-oBN+msHzPnm1M5DDx3wVD7iBwpNXFUtkh2MrAbUJu0OhKjliLChi28hq++mu1+qdMpAVQO5JKAvQQxYVbyneiw==} engines: {node: '>= 10'} - '@so-ric/colorspace@1.1.6': - resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2139,9 +2129,6 @@ packages: '@types/serve-static@2.2.0': resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -2300,9 +2287,6 @@ packages: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asyncc@2.0.9: resolution: {integrity: sha512-nTQfwHtnL+MSqPaUJhV22GWP3jThj0GnS4Nw1uJyBus6EQ40hQFnbBGUvWxC5P3m+1neSqH1p8asMXg/ypmsQw==} engines: {node: '>=6.0.0'} @@ -2481,32 +2465,16 @@ packages: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-convert@3.1.3: - resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} - engines: {node: '>=14.6'} - color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-name@2.1.0: - resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} - engines: {node: '>=12.20'} - - color-string@2.1.4: - resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} - engines: {node: '>=18'} - color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - color@5.0.3: - resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} - engines: {node: '>=18'} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -2809,9 +2777,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -2990,9 +2955,6 @@ packages: picomatch: optional: true - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - fetch-cookie@3.2.0: resolution: {integrity: sha512-n61pQIxP25C6DRhcJxn7BDzgHP/+S56Urowb5WFxtcRMpU6drqXD90xjyAsVQYsNSNNVbaCcYY1DuHsdkZLuiA==} @@ -3059,9 +3021,6 @@ packages: fluent-ffmpeg-simplified@0.1.0: resolution: {integrity: sha512-u3McLUh6H6/hhXYxfZcSGwCJAAlN8wsCCPZjVpaK9HIIvmjOB3G584H3PAWZb/ZQTHVKUrzhjNEYMXZXZjOR+g==} - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -3351,10 +3310,6 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -3461,9 +3416,6 @@ packages: klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -3582,10 +3534,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} @@ -3845,9 +3793,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -4490,9 +4435,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -4631,9 +4573,6 @@ packages: engines: {node: '>=4.0.0'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -4714,10 +4653,6 @@ packages: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -5022,14 +4957,6 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - winston-transport@4.9.0: - resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} - engines: {node: '>= 12.0.0'} - - winston@3.19.0: - resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} - engines: {node: '>= 12.0.0'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5237,14 +5164,6 @@ snapshots: '@biomejs/cli-win32-x64@2.4.16': optional: true - '@colors/colors@1.6.0': {} - - '@dabh/diagnostics@2.0.8': - dependencies: - '@so-ric/colorspace': 1.1.6 - enabled: 2.0.0 - kuler: 2.0.0 - '@discordjs/builders@1.14.1': dependencies: '@discordjs/formatters': 0.6.2 @@ -6316,11 +6235,6 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - '@so-ric/colorspace@1.1.6': - dependencies: - color: 5.0.3 - text-hex: 1.0.0 - '@standard-schema/spec@1.1.0': {} '@tailwindcss/node@4.3.0': @@ -6504,8 +6418,6 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 25.9.0 - '@types/triple-beam@1.3.5': {} - '@types/ws@8.18.1': dependencies: '@types/node': 25.8.0 @@ -6649,8 +6561,6 @@ snapshots: astral-regex@1.0.0: {} - async@3.2.6: {} - asyncc@2.0.9: {} asynckit@0.4.0: {} @@ -6840,27 +6750,12 @@ snapshots: dependencies: color-name: 1.1.4 - color-convert@3.1.3: - dependencies: - color-name: 2.1.0 - color-name@1.1.3: {} color-name@1.1.4: {} - color-name@2.1.0: {} - - color-string@2.1.4: - dependencies: - color-name: 2.1.0 - color-support@1.1.3: {} - color@5.0.3: - dependencies: - color-convert: 3.1.3 - color-string: 2.1.4 - colorette@2.0.20: {} combined-stream@1.0.8: @@ -7064,8 +6959,6 @@ snapshots: emoji-regex@8.0.0: {} - enabled@2.0.0: {} - encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -7369,8 +7262,6 @@ snapshots: optionalDependencies: picomatch: 4.0.4 - fecha@4.2.3: {} - fetch-cookie@3.2.0: dependencies: set-cookie-parser: 2.7.2 @@ -7453,8 +7344,6 @@ snapshots: execa: 9.6.1 string-argv: 0.3.2 - fn.name@1.1.0: {} - follow-redirects@1.16.0: {} form-data@4.0.5: @@ -7737,8 +7626,6 @@ snapshots: is-property@1.0.2: {} - is-stream@2.0.1: {} - is-stream@4.0.1: {} is-unicode-supported@0.1.0: {} @@ -7864,8 +7751,6 @@ snapshots: dependencies: graceful-fs: 4.2.11 - kuler@2.0.0: {} - levn@0.3.0: dependencies: prelude-ls: 1.1.2 @@ -7956,15 +7841,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - loglevel@1.9.2: {} lru-cache@6.0.0: @@ -8199,10 +8075,6 @@ snapshots: dependencies: wrappy: 1.0.2 - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -8903,8 +8775,6 @@ snapshots: sprintf-js@1.0.3: {} - stack-trace@0.0.10: {} - stackback@0.0.2: {} standard-as-callback@2.1.0: {} @@ -9044,8 +8914,6 @@ snapshots: array-back: 2.0.0 typical: 2.6.1 - text-hex@1.0.0: {} - text-table@0.2.0: {} thirty-two@1.0.2: {} @@ -9107,8 +8975,6 @@ snapshots: trim-newlines@3.0.1: {} - triple-beam@1.4.1: {} - ts-mixer@6.0.4: {} tsd@0.33.0: @@ -9381,26 +9247,6 @@ snapshots: dependencies: string-width: 4.2.3 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.19.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.8 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - word-wrap@1.2.5: {} wordwrap@1.0.0: {} diff --git a/services/discord-gateway/package.json b/services/discord-gateway/package.json index 951b5ce..9c99bf4 100644 --- a/services/discord-gateway/package.json +++ b/services/discord-gateway/package.json @@ -30,10 +30,10 @@ "p-limit": "^7.3.0", "p-retry": "^8.0.0", "pg": "^8.21.0", + "pino": "^9.6.0", "piscina": "^5.1.4", "prism-media": "2.0.0-alpha.0", "sharp": "^0.34.5", - "winston": "^3.19.0", "ws": "^8.20.1", "zod": "^4.4.3" }, diff --git a/services/discord-gateway/src/app/bootstrap.ts b/services/discord-gateway/src/app/bootstrap.ts index 2204b96..bddf3d0 100644 --- a/services/discord-gateway/src/app/bootstrap.ts +++ b/services/discord-gateway/src/app/bootstrap.ts @@ -17,7 +17,7 @@ import { } from "../shared/database/drizzle.js"; import { runMigrations } from "../shared/database/migrate.js"; import { createDiscordClientOptions } from "../shared/discord/clientOptions.js"; -import { createChildLogger } from "../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { createGracefulShutdown } from "./shutdown.js"; const logger = createChildLogger("discord-gateway"); diff --git a/services/discord-gateway/src/app/shutdown.ts b/services/discord-gateway/src/app/shutdown.ts index 17f6f99..2c611cb 100644 --- a/services/discord-gateway/src/app/shutdown.ts +++ b/services/discord-gateway/src/app/shutdown.ts @@ -3,7 +3,7 @@ import type { CommandHandler } from "../modules/command-handler/commandHandler.j import type { EventBroadcaster } from "../modules/event-broadcaster/index.js"; import type { VoiceController } from "../modules/voice-recording/voiceController.js"; import type { closeDatabase } from "../shared/database/drizzle.js"; -import type { createChildLogger } from "../shared/logger/logger.js"; +import type { createChildLogger } from "@bete/shared/logger"; type Logger = ReturnType; type CloseDatabase = typeof closeDatabase; diff --git a/services/discord-gateway/src/index.ts b/services/discord-gateway/src/index.ts index 3e4a57e..a0bb29c 100644 --- a/services/discord-gateway/src/index.ts +++ b/services/discord-gateway/src/index.ts @@ -3,7 +3,7 @@ import "libsodium-wrappers"; import "@snazzah/davey"; import "dotenv/config"; import { initializeDiscordGateway } from "./app/bootstrap.js"; -import { createChildLogger } from "./shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const logger = createChildLogger("discord-gateway"); diff --git a/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts b/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts index 94d8c8f..b8bfb48 100644 --- a/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts +++ b/services/discord-gateway/src/modules/ai-moderation/aiAnalyzer.ts @@ -4,8 +4,8 @@ import type { Client } from "discord.js-selfbot-v13"; import { AbortError } from "p-retry"; import { Piscina } from "piscina"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { createChildLogger } from "@bete/shared/logger"; +import { retryWithBackoff } from "@bete/shared/utils"; import type { EventBroadcaster } from "../event-broadcaster/index.js"; import { invalidateAnalyticsCache } from "../message-capture/analyticsStore.js"; import { isAgeRestrictedMetadata } from "../message-capture/messageMetadata.js"; @@ -380,7 +380,6 @@ async function processIndividualFallback( retries: 0, minTimeout: 0, maxTimeout: 0, - logger, }, ); diff --git a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts index 9f09098..da23443 100644 --- a/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts +++ b/services/discord-gateway/src/modules/ai-moderation/autoDeleteManager.ts @@ -1,6 +1,6 @@ import type { Client, PermissionString } from "discord.js-selfbot-v13"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { createModerationAction } from "../message-capture/messageStore.js"; import type { MessageRecord } from "../message-capture/types.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts index b7e4baf..ec8a47a 100644 --- a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts +++ b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts @@ -1,4 +1,4 @@ -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { getCachedText, upsertCachedText } from "./textCacheStore.js"; import { llmDetectBadwords } from "./llmClient.js"; diff --git a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts index d3573ee..dcefc8d 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmClient.ts @@ -8,9 +8,9 @@ import OpenAI from "openai"; import { config } from "../../shared/config/config.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { retryWithBackoff } from "@bete/shared/utils"; import { withLlmConcurrency } from "./concurrencyLimiter.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const log = createChildLogger("llm-client"); @@ -136,7 +136,6 @@ export async function llmChat( minTimeout: 0, maxTimeout: 0, factor: 2, - logger: log, }, ); } diff --git a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts index 1573e64..9809170 100644 --- a/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts +++ b/services/discord-gateway/src/modules/ai-moderation/llmModerationClient.ts @@ -2,8 +2,8 @@ import type { ChatCompletion } from "openai/resources/chat/completions"; import { AbortError } from "p-retry"; import { z } from "zod"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { createChildLogger } from "@bete/shared/logger"; +import { retryWithBackoff } from "@bete/shared/utils"; import { resizeImageForVision } from "../attachment-upload/imageResizer.js"; import { extractMessageMediaEvidence } from "../message-capture/messageMetadata.js"; import type { @@ -677,7 +677,6 @@ async function callModerationLLM( minTimeout: 3000, maxTimeout: 8000, factor: 2, - logger: log, }, ); parsed = analysis.parsed; diff --git a/services/discord-gateway/src/modules/ai-moderation/responseLogger.ts b/services/discord-gateway/src/modules/ai-moderation/responseLogger.ts index 8423bf1..d88f2c5 100644 --- a/services/discord-gateway/src/modules/ai-moderation/responseLogger.ts +++ b/services/discord-gateway/src/modules/ai-moderation/responseLogger.ts @@ -10,7 +10,7 @@ * Enables full audit trail and debugging of moderation decisions. */ -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import type { AnalysisResult } from "../message-capture/types.js"; const logger = createChildLogger("response-logger"); diff --git a/services/discord-gateway/src/modules/ai-moderation/stickerCache.ts b/services/discord-gateway/src/modules/ai-moderation/stickerCache.ts index 814f76d..43d12ff 100644 --- a/services/discord-gateway/src/modules/ai-moderation/stickerCache.ts +++ b/services/discord-gateway/src/modules/ai-moderation/stickerCache.ts @@ -1,5 +1,5 @@ import { executeAll, executeGet } from "../../shared/database/drizzle.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const logger = createChildLogger("sticker-cache"); diff --git a/services/discord-gateway/src/modules/ai-moderation/textCacheStore.ts b/services/discord-gateway/src/modules/ai-moderation/textCacheStore.ts index 68c9d5e..78b7bf5 100644 --- a/services/discord-gateway/src/modules/ai-moderation/textCacheStore.ts +++ b/services/discord-gateway/src/modules/ai-moderation/textCacheStore.ts @@ -1,6 +1,6 @@ import { createHash } from "node:crypto"; import { executeAll, executeGet } from "../../shared/database/drizzle.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const logger = createChildLogger("text-cache-store"); diff --git a/services/discord-gateway/src/modules/ai-moderation/urlFetcher.ts b/services/discord-gateway/src/modules/ai-moderation/urlFetcher.ts index af88c1e..c49c0d9 100644 --- a/services/discord-gateway/src/modules/ai-moderation/urlFetcher.ts +++ b/services/discord-gateway/src/modules/ai-moderation/urlFetcher.ts @@ -1,6 +1,6 @@ import { resolve } from "node:dns/promises"; import { isIP } from "node:net"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const log = createChildLogger("urlFetcher"); diff --git a/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts b/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts index ab38c8f..6cb36fa 100644 --- a/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts +++ b/services/discord-gateway/src/modules/attachment-upload/attachmentUploader.ts @@ -1,5 +1,5 @@ import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { uploadToTele } from "./teleUpload.js"; import { updateAttachmentAsFailedUpload, @@ -45,7 +45,6 @@ export async function uploadAttachmentToTele( uploadUrl: config.TELE_UPLOAD_URL, timeoutMs: config.ATTACHMENT_UPLOAD_TIMEOUT_MS, retries: 0, - logger, }); return result.url; diff --git a/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts b/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts index cd7fd08..3c48fe2 100644 --- a/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts +++ b/services/discord-gateway/src/modules/attachment-upload/imageResizer.ts @@ -1,5 +1,5 @@ import sharp from "sharp"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; const log = createChildLogger("imageResizer"); diff --git a/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts b/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts index a40721a..91716d8 100644 --- a/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts +++ b/services/discord-gateway/src/modules/attachment-upload/teleUpload.ts @@ -1,5 +1,4 @@ -import type { CustomLogger } from "../../shared/logger/logger.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { retryWithBackoff } from "@bete/shared/utils"; export interface TeleUploadResponse { download_url: string; @@ -37,7 +36,6 @@ export async function uploadToTele(input: { uploadUrl: string; timeoutMs?: number; retries: number; - logger: CustomLogger; }): Promise { const { buffer, @@ -46,7 +44,6 @@ export async function uploadToTele(input: { uploadUrl, timeoutMs, retries, - logger, } = input; const response = await retryWithBackoff( @@ -77,7 +74,6 @@ export async function uploadToTele(input: { retries, minTimeout: 0, maxTimeout: 0, - logger, }, ); diff --git a/services/discord-gateway/src/modules/command-handler/commandHandler.ts b/services/discord-gateway/src/modules/command-handler/commandHandler.ts index 380c518..8d69411 100644 --- a/services/discord-gateway/src/modules/command-handler/commandHandler.ts +++ b/services/discord-gateway/src/modules/command-handler/commandHandler.ts @@ -1,7 +1,7 @@ import type { Client } from "discord.js-selfbot-v13"; import Redis from "ioredis"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { discordPlayer } from "../voice-recording/player.js"; import type { VoiceController } from "../voice-recording/voiceController.js"; diff --git a/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts b/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts index 4b5e918..20a92b6 100644 --- a/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts +++ b/services/discord-gateway/src/modules/event-broadcaster/eventBroadcaster.ts @@ -1,5 +1,5 @@ import Redis from "ioredis"; -import type { CustomLogger } from "../../shared/logger/logger.js"; +import type { CustomLogger } from "@bete/shared/logger"; export interface DiscordGatewayEvent { type: string; diff --git a/services/discord-gateway/src/modules/message-capture/analyticsStore.ts b/services/discord-gateway/src/modules/message-capture/analyticsStore.ts index 19b88a2..bdbed84 100644 --- a/services/discord-gateway/src/modules/message-capture/analyticsStore.ts +++ b/services/discord-gateway/src/modules/message-capture/analyticsStore.ts @@ -1,5 +1,5 @@ import { executeAll, executeGet } from "../../shared/database/drizzle.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import type { MessageRecord } from "./types.js"; const logger = createChildLogger("analytics-store"); diff --git a/services/discord-gateway/src/modules/message-capture/broadcaster.ts b/services/discord-gateway/src/modules/message-capture/broadcaster.ts index 280c8de..ff01918 100644 --- a/services/discord-gateway/src/modules/message-capture/broadcaster.ts +++ b/services/discord-gateway/src/modules/message-capture/broadcaster.ts @@ -1,5 +1,5 @@ import type { WebSocket } from "ws"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import type { MediaState } from "../voice-recording/mediaTypes.js"; import type { AnalysisQueueStatus, diff --git a/services/discord-gateway/src/modules/message-capture/messageCapture.ts b/services/discord-gateway/src/modules/message-capture/messageCapture.ts index 81d9f59..bb7a528 100644 --- a/services/discord-gateway/src/modules/message-capture/messageCapture.ts +++ b/services/discord-gateway/src/modules/message-capture/messageCapture.ts @@ -1,6 +1,6 @@ import type { Client, Message } from "discord.js-selfbot-v13"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { queueMessageAnalysis } from "../ai-moderation/aiAnalyzer.js"; import { processAttachmentUpload } from "../attachment-upload/attachmentUploader.js"; import type { EventBroadcaster } from "../event-broadcaster/eventBroadcaster.js"; diff --git a/services/discord-gateway/src/modules/message-capture/messageStore.ts b/services/discord-gateway/src/modules/message-capture/messageStore.ts index 9359c55..e534d73 100644 --- a/services/discord-gateway/src/modules/message-capture/messageStore.ts +++ b/services/discord-gateway/src/modules/message-capture/messageStore.ts @@ -17,7 +17,7 @@ import { moderationActionsTable, retentionPoliciesTable, } from "../../shared/database/schema.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { decodeCursor, encodeCursor } from "../message-capture/pagination.js"; import type { AttachmentRecord, diff --git a/services/discord-gateway/src/modules/voice-recording/recorder.ts b/services/discord-gateway/src/modules/voice-recording/recorder.ts index 150400e..f48bb7c 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder.ts @@ -11,7 +11,7 @@ import { } from "@discordjs/voice"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { PacketFilter } from "./packetFilter.js"; import { subscribeToAudioStream } from "./recorder/audioStream.js"; import { OpusDecoder } from "./recorder/decoder.js"; @@ -26,7 +26,7 @@ import { type RecordingSession, } from "./recorder/sessionRecording.js"; import { uploadRecordingSegment } from "./recorder/uploader.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { retryWithBackoff } from "@bete/shared/utils"; import type { PcmBroadcaster } from "../message-capture/types.js"; const logger = createChildLogger("recorder"); @@ -95,7 +95,6 @@ export async function startRecording( retries: 0, minTimeout: 0, maxTimeout: 0, - logger, }, ); logger.info("Connected to voice channel. Recording started"); diff --git a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts index 167d579..9eab419 100644 --- a/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts +++ b/services/discord-gateway/src/modules/voice-recording/recorder/uploader.ts @@ -6,7 +6,7 @@ import { updateVoiceRecordingAsFailed, updateVoiceRecordingAsUploaded, } from "../../../shared/database/voiceRecordingRepo.js"; -import { createChildLogger } from "../../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { uploadToTele } from "../teleUpload.js"; const logger = createChildLogger("recording-uploader"); @@ -61,7 +61,6 @@ export async function uploadRecordingSegment(input: { contentType: "audio/ogg", uploadUrl: config.TELE_UPLOAD_URL, retries: 0, - logger, }); const downloadUrl = uploadResult.url; diff --git a/services/discord-gateway/src/modules/voice-recording/teleUpload.ts b/services/discord-gateway/src/modules/voice-recording/teleUpload.ts index a40721a..91716d8 100644 --- a/services/discord-gateway/src/modules/voice-recording/teleUpload.ts +++ b/services/discord-gateway/src/modules/voice-recording/teleUpload.ts @@ -1,5 +1,4 @@ -import type { CustomLogger } from "../../shared/logger/logger.js"; -import { retryWithBackoff } from "../../shared/utils/retry.js"; +import { retryWithBackoff } from "@bete/shared/utils"; export interface TeleUploadResponse { download_url: string; @@ -37,7 +36,6 @@ export async function uploadToTele(input: { uploadUrl: string; timeoutMs?: number; retries: number; - logger: CustomLogger; }): Promise { const { buffer, @@ -46,7 +44,6 @@ export async function uploadToTele(input: { uploadUrl, timeoutMs, retries, - logger, } = input; const response = await retryWithBackoff( @@ -77,7 +74,6 @@ export async function uploadToTele(input: { retries, minTimeout: 0, maxTimeout: 0, - logger, }, ); diff --git a/services/discord-gateway/src/modules/voice-recording/voiceController.ts b/services/discord-gateway/src/modules/voice-recording/voiceController.ts index cbc4722..25f8761 100644 --- a/services/discord-gateway/src/modules/voice-recording/voiceController.ts +++ b/services/discord-gateway/src/modules/voice-recording/voiceController.ts @@ -1,7 +1,7 @@ import { getVoiceConnection, type VoiceConnection } from "@discordjs/voice"; import type { Client, Guild, VoiceChannel } from "discord.js-selfbot-v13"; import { AppError } from "@bete/shared/errors"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { discordPlayer } from "./player.js"; import { startRecording, stopRecording } from "./recorder.js"; diff --git a/services/discord-gateway/src/shared/database/drizzle.ts b/services/discord-gateway/src/shared/database/drizzle.ts index 9858f2e..3843779 100644 --- a/services/discord-gateway/src/shared/database/drizzle.ts +++ b/services/discord-gateway/src/shared/database/drizzle.ts @@ -2,7 +2,7 @@ import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import type { PoolClient } from "pg"; import { Pool } from "pg"; import { config } from "../../shared/config/config.js"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import * as schema from "./schema.js"; const logger = createChildLogger("drizzle"); diff --git a/services/discord-gateway/src/shared/database/migrate.ts b/services/discord-gateway/src/shared/database/migrate.ts index 399ed39..65c8f0f 100644 --- a/services/discord-gateway/src/shared/database/migrate.ts +++ b/services/discord-gateway/src/shared/database/migrate.ts @@ -2,7 +2,7 @@ import "dotenv/config"; import type { PoolClient } from "pg"; import { drizzle as drizzlePostgres } from "drizzle-orm/node-postgres"; import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { closeDatabase, initializeDatabase, diff --git a/services/discord-gateway/src/shared/database/migrateCli.ts b/services/discord-gateway/src/shared/database/migrateCli.ts index 0d6638b..cc7c6d8 100644 --- a/services/discord-gateway/src/shared/database/migrateCli.ts +++ b/services/discord-gateway/src/shared/database/migrateCli.ts @@ -1,4 +1,4 @@ -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { runMigrations } from "./migrate.js"; const logger = createChildLogger("migrate-cli"); diff --git a/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts b/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts index a9ade95..8030a17 100644 --- a/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts +++ b/services/discord-gateway/src/shared/database/voiceRecordingRepo.ts @@ -1,5 +1,5 @@ import { desc, eq } from "drizzle-orm"; -import { createChildLogger } from "../../shared/logger/logger.js"; +import { createChildLogger } from "@bete/shared/logger"; import { getDatabase } from "./drizzle.js"; import { type VoiceRecording, diff --git a/services/discord-gateway/src/shared/logger/logger.ts b/services/discord-gateway/src/shared/logger/logger.ts deleted file mode 100644 index 90616d5..0000000 --- a/services/discord-gateway/src/shared/logger/logger.ts +++ /dev/null @@ -1,132 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import winston from "winston"; -import { formatLogMetadata, serializeLogValue } from "./serialization.js"; - -const isDev = process.env.NODE_ENV !== "production"; -const logLevel = process.env.LOG_LEVEL || (isDev ? "debug" : "info"); -const logsDir = path.resolve(process.cwd(), "logs"); - -fs.mkdirSync(logsDir, { recursive: true }); - -const metadataFormat = winston.format((info) => { - const { - level: _level, - message: _message, - timestamp: _timestamp, - ...metadata - } = info; - - for (const key of Object.keys(metadata)) { - delete info[key]; - } - - Object.assign(info, formatLogMetadata(metadata)); - return info; -}); - -const consoleFormat = winston.format.printf((info) => { - const { level, message, timestamp, context, ...metadata } = info; - const contextLabel = context ? ` [${String(context)}]` : ""; - const metadataText = Object.keys(metadata).length - ? ` ${JSON.stringify(formatLogMetadata(metadata))}` - : ""; - - return `${timestamp} ${level}${contextLabel}: ${message}${metadataText}`; -}); - -export interface CustomLogger { - error: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - warn: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - info: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - debug: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - trace: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - fatal: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - silent: (msgOrObj: any, msgOrArgs?: any, ...args: any[]) => void; - child(options: { context: string } & Record): CustomLogger; - [key: string]: any; -} - -const winstonLogger = winston.createLogger({ - level: logLevel, - levels: winston.config.npm.levels, - format: winston.format.combine( - winston.format.timestamp(), - winston.format.errors({ stack: true }), - metadataFormat(), - ), - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.colorize(), - winston.format.timestamp(), - metadataFormat(), - consoleFormat, - ), - }), - new winston.transports.File({ - filename: path.join(logsDir, "app.log"), - format: winston.format.json(), - }), - new winston.transports.File({ - filename: path.join(logsDir, "error.log"), - level: "error", - format: winston.format.json(), - }), - ], -}); - -function wrapLogger(wLogger: winston.Logger): CustomLogger { - const logAtLevel = (level: string) => { - return (arg1: any, arg2?: any) => { - if (arg1 instanceof Error) { - wLogger.log(level, arg1.message, { error: arg1 }); - } else if (typeof arg1 === "object" && arg1 !== null) { - const message = typeof arg2 === "string" ? arg2 : ""; - wLogger.log(level, message, { ...arg1 }); - } else { - const message = typeof arg1 === "string" ? arg1 : String(arg1); - const metadata = typeof arg2 === "object" && arg2 !== null ? arg2 : {}; - wLogger.log(level, message, metadata); - } - }; - }; - - const wrapped: CustomLogger = { - error: logAtLevel("error"), - warn: logAtLevel("warn"), - info: logAtLevel("info"), - debug: logAtLevel("debug"), - trace: logAtLevel("debug"), - fatal: logAtLevel("error"), - silent: () => {}, - child: (options: any) => { - const childWinston = wLogger.child(options); - return wrapLogger(childWinston); - }, - }; - - const proxy = new Proxy(wrapped, { - get(target, prop) { - if (prop in target) { - return (target as any)[prop]; - } - const val = (wLogger as any)[prop]; - if (typeof val === "function") { - return val.bind(wLogger); - } - return val; - }, - }); - - return proxy; -} - -export const logger: CustomLogger = wrapLogger(winstonLogger); - -export const createChildLogger = (context: string): CustomLogger => { - return logger.child({ context }); -}; - -export const serializeLogValueForTest = serializeLogValue; -export const formatLogMetadataForTest = formatLogMetadata; diff --git a/services/discord-gateway/src/shared/logger/serialization.ts b/services/discord-gateway/src/shared/logger/serialization.ts deleted file mode 100644 index 990ceae..0000000 --- a/services/discord-gateway/src/shared/logger/serialization.ts +++ /dev/null @@ -1,109 +0,0 @@ -export type LogMetadata = Record; - -type SerializedError = { - name: string; - message: string; - stack?: string; - code?: unknown; - statusCode?: unknown; -} & Record; - -const serializeError = (error: Error): SerializedError => { - const serialized: SerializedError = { - name: error.name, - message: error.message, - }; - - if (error.stack) { - serialized.stack = error.stack; - } - - const errorWithFields = error as Error & { - code?: unknown; - statusCode?: unknown; - [key: string]: unknown; - }; - - if (errorWithFields.code !== undefined) { - serialized.code = errorWithFields.code; - } - - if (errorWithFields.statusCode !== undefined) { - serialized.statusCode = errorWithFields.statusCode; - } - - for (const [key, value] of Object.entries(errorWithFields)) { - if (serialized[key] === undefined) { - serialized[key] = value; - } - } - - return serialized; -}; - -const isPlainObject = (value: unknown): value is Record => { - if (!value || typeof value !== "object") { - return false; - } - - const prototype = Object.getPrototypeOf(value); - return prototype === Object.prototype || prototype === null; -}; - -export const serializeLogValue = ( - value: unknown, - _seen: WeakSet = new WeakSet(), -): unknown => { - if (value === null || value === undefined) return value; - - if (value instanceof Error) { - return serializeError(value); - } - - if (value instanceof Date) { - return value.toISOString(); - } - - if (value instanceof RegExp) { - return value.toString(); - } - - if (typeof value === "object") { - if (_seen.has(value as object)) { - return "[Circular]"; - } - _seen.add(value as object); - } - - if (Array.isArray(value)) { - return value.map((item) => serializeLogValue(item, _seen)); - } - - if (isPlainObject(value)) { - return Object.fromEntries( - Object.entries(value).map(([key, nestedValue]) => [ - key, - serializeLogValue(nestedValue, _seen), - ]), - ); - } - - if (typeof value === "object") { - try { - return `[Object ${(value as any)?.constructor?.name ?? "unknown"}]`; - } catch { - return "[Object]"; - } - } - - return value; -}; - -export const formatLogMetadata = (metadata: LogMetadata): LogMetadata => { - return Object.fromEntries( - Object.entries(metadata).map(([key, value]) => [ - key, - serializeLogValue(value), - ]), - ); -}; diff --git a/services/discord-gateway/src/shared/utils/retry.ts b/services/discord-gateway/src/shared/utils/retry.ts deleted file mode 100644 index fe0b60c..0000000 --- a/services/discord-gateway/src/shared/utils/retry.ts +++ /dev/null @@ -1,42 +0,0 @@ -import pRetry from "p-retry"; -import type { CustomLogger } from "../../shared/logger/logger.js"; - -export interface RetryOptions { - retries?: number; - minTimeout?: number; - maxTimeout?: number; - factor?: number; - logger?: CustomLogger; -} - -export async function retryWithBackoff( - fn: () => Promise, - options: RetryOptions = {}, -): Promise { - const { - retries = 3, - minTimeout = 0, - maxTimeout = 0, - factor = 1, - logger, - } = options; - - return pRetry(fn, { - retries, - minTimeout, - maxTimeout, - factor, - onFailedAttempt: (error) => { - if (logger) { - logger.warn( - { - attempt: error.attemptNumber, - retriesLeft: error.retriesLeft, - error: error.error, - }, - "Retry attempt", - ); - } - }, - }); -}