From ce449408f02c8ae87e1382a229cdb06e2d2556ba Mon Sep 17 00:00:00 2001 From: Carlos Valente <34649812+cpvalente@users.noreply.github.com> Date: Mon, 7 Jul 2025 15:54:26 +0200 Subject: [PATCH] Chore/remove got dependency (#1667) * Refactor: Remove GOT dependency, use simplified fetch wrapper Replaced GOT with a lightweight, functional, fetch-based utility (`appClient.ts`) for handling JSON POST requests in `SheetService.ts`. - Created `appClient.ts` to encapsulate fetch logic. It mimics GOT's behavior for sending JSON payloads and parsing JSON responses. - Error handling in `appClient.ts` uses standard `Error` objects with descriptive messages, including status and error body details, instead of custom error types. - Updated `SheetService.ts` to use the new `appClient.ts`. - Removed `got` from server dependencies. * cleanup * dont throw when we know the error * rearange logging --------- Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: arc-alex --- apps/server/package.json | 1 - .../services/sheet-service/SheetService.ts | 44 +++--- pnpm-lock.yaml | 132 +----------------- 3 files changed, 30 insertions(+), 147 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 92853557f..58ccf7be8 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -16,7 +16,6 @@ "multer": "2.0.1", "fast-equals": "^5.0.1", "google-auth-library": "^9.4.2", - "got": "^14.4.5", "lowdb": "^7.0.1", "ontime-utils": "workspace:*", "osc-min": "2.1.2", diff --git a/apps/server/src/services/sheet-service/SheetService.ts b/apps/server/src/services/sheet-service/SheetService.ts index 151bf6914..3d1981452 100644 --- a/apps/server/src/services/sheet-service/SheetService.ts +++ b/apps/server/src/services/sheet-service/SheetService.ts @@ -9,8 +9,6 @@ import { ImportMap, getErrorMessage } from 'ontime-utils'; import { sheets, type sheets_v4 } from '@googleapis/sheets'; import { Credentials, OAuth2Client } from 'google-auth-library'; -// TODO: rewrite logic to use fetch and remove dependency -import got from 'got'; import { logger } from '../../classes/Logger.js'; import { parseRundowns } from '../../api-data/rundown/rundown.parser.js'; @@ -20,6 +18,7 @@ import { parseCustomFields } from '../../api-data/custom-fields/customFields.par import { cellRequestFromEvent, type ClientSecret, getA1Notation, isClientSecret } from './sheetUtils.js'; import { catchCommonImportXlsxError } from './googleApi.utils.js'; +import { consoleError, consoleSubdued } from '../../utils/console.js'; const sheetScope = 'https://www.googleapis.com/auth/spreadsheets'; const codesUrl = 'https://oauth2.googleapis.com/device/code'; @@ -125,6 +124,8 @@ function verifyConnection( expires_in: number, postAction: () => Promise, ) { + logger.info(LogOrigin.Server, 'Start polling for auth...'); + // create poller to check for auth pollInterval = setInterval(pollForAuth, interval * 1000); @@ -141,19 +142,30 @@ function verifyConnection( }, expires_in * 1000); async function pollForAuth() { - // server returns 428 if user hasnt yet completed the auth process try { - logger.info(LogOrigin.Server, 'Polling for auth...'); - const auth: Credentials = await got - .post(tokenUrl, { - json: { - client_id: clientSecret.installed.client_id, - client_secret: clientSecret.installed.client_secret, - device_code, - grant_type: grantType, - }, - }) - .json(); + const response = await fetch(tokenUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + client_id: clientSecret.installed.client_id, + client_secret: clientSecret.installed.client_secret, + device_code, + grant_type: grantType, + }), + }); + + // server returns 428 if user hasnt yet completed the auth process + if (response.status === 428) { + consoleSubdued('User not auth yet'); + return; + } + + if (!response.ok) { + logger.error(LogOrigin.Server, `Authentication poll failed with code: ${response.status}`); + return; + } + + const auth: Credentials = await response.json(); logger.info(LogOrigin.Server, 'Successfully Authenticated'); const client = new OAuth2Client({ @@ -182,8 +194,8 @@ function verifyConnection( } await postAction(); - } catch (_error) { - /** we do not handle failure */ + } catch (error) { + logger.error(LogOrigin.Server, `Authentication poll error: ${(error as Error).message}`); } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83115fd21..ef1c23e8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -315,9 +315,6 @@ importers: google-auth-library: specifier: ^9.4.2 version: 9.15.1(encoding@0.1.13) - got: - specifier: ^14.4.5 - version: 14.4.7 lowdb: specifier: ^7.0.1 version: 7.0.1 @@ -1564,9 +1561,6 @@ packages: cpu: [x64] os: [win32] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sentry-internal/browser-utils@8.55.0': resolution: {integrity: sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==} engines: {node: '>=14.18'} @@ -1668,10 +1662,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/is@7.0.1': - resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==} - engines: {node: '>=18'} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1744,10 +1734,6 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - '@table-nav/core@0.0.7': resolution: {integrity: sha512-pCh18jHDRe3tw9sJZXfKi4cSD6VjHbn40CYdqhp5X91SIX7rakDEQAsTx6F7Fv9TUv265l+5rUDcYNaJ0N0cqQ==} @@ -2377,14 +2363,6 @@ packages: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@12.0.1: - resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} - engines: {node: '>=18'} - cacheable-request@7.0.4: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} @@ -3174,10 +3152,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data-encoder@4.0.2: - resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} - engines: {node: '>= 18'} - form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} @@ -3290,10 +3264,6 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -3365,10 +3335,6 @@ packages: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} - got@14.4.7: - resolution: {integrity: sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==} - engines: {node: '>=20'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3457,10 +3423,6 @@ packages: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -3645,10 +3607,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -3853,10 +3811,6 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -3943,10 +3897,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} @@ -4094,10 +4044,6 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - normalize-url@8.0.1: - resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} - engines: {node: '>=14.16'} - nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} @@ -4168,10 +4114,6 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} - p-cancelable@4.0.1: - resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} - engines: {node: '>=14.16'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4549,10 +4491,6 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -5058,10 +4996,6 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - type-fest@4.30.2: - resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} - engines: {node: '>=16'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -5981,7 +5915,7 @@ snapshots: make-fetch-happen: 10.2.1 nopt: 6.0.0 proc-log: 2.0.1 - semver: 7.6.2 + semver: 7.7.2 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -6474,7 +6408,7 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.6.2 + semver: 7.7.2 '@npmcli/move-file@2.0.1': dependencies: @@ -6633,8 +6567,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.41.1': optional: true - '@sec-ant/readable-stream@0.4.1': {} - '@sentry-internal/browser-utils@8.55.0': dependencies: '@sentry/core': 8.55.0 @@ -6744,8 +6676,6 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@sindresorhus/is@7.0.1': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.6)': dependencies: '@babel/core': 7.23.6 @@ -6820,10 +6750,6 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - '@table-nav/core@0.0.7': {} '@table-nav/react@0.0.7(@table-nav/core@0.0.7)': @@ -7691,18 +7617,6 @@ snapshots: cacheable-lookup@5.0.4: {} - cacheable-lookup@7.0.0: {} - - cacheable-request@12.0.1: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 9.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.1 - responselike: 3.0.0 - cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 @@ -8724,8 +8638,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data-encoder@4.0.2: {} - form-data@4.0.2: dependencies: asynckit: 0.4.0 @@ -8857,11 +8769,6 @@ snapshots: dependencies: pump: 3.0.0 - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -8985,20 +8892,6 @@ snapshots: p-cancelable: 2.1.1 responselike: 2.0.1 - got@14.4.7: - dependencies: - '@sindresorhus/is': 7.0.1 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 12.0.1 - decompress-response: 6.0.0 - form-data-encoder: 4.0.2 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 4.0.1 - responselike: 3.0.0 - type-fest: 4.30.2 - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -9093,11 +8986,6 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -9276,8 +9164,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -9502,8 +9388,6 @@ snapshots: lowercase-keys@2.0.0: {} - lowercase-keys@3.0.0: {} - lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -9586,8 +9470,6 @@ snapshots: mimic-response@3.1.0: {} - mimic-response@4.0.0: {} - minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 @@ -9718,8 +9600,6 @@ snapshots: normalize-url@6.1.0: {} - normalize-url@8.0.1: {} - nwsapi@2.2.20: optional: true @@ -9811,8 +9691,6 @@ snapshots: p-cancelable@2.1.1: {} - p-cancelable@4.0.1: {} - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -10170,10 +10048,6 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -10745,8 +10619,6 @@ snapshots: type-fest@0.20.2: {} - type-fest@4.30.2: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0