diff --git a/README.md b/README.md index 9662caa..1ea367b 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,18 @@ DEBUG=nxapi:api:* nxapi ... DEBUG=* nxapi ... ``` +By default all nxapi logs will be written to a platform-specific location: + +Platform | Log path +----------------|---------------- +macOS | `Library/Logs/nxapi-nodejs` +Windows | `%localappdata%\nxapi-nodejs\Log` +Linux | `$XDG_STATE_HOME/nxapi-nodejs` or `.local/state/nxapi-nodejs` + +This only applies to the command line and Electron app and can be disabled by setting `NXAPI_DEBUG_FILE` to `0`. Each process writes to a new file. nxapi will automatically delete log files older than 14 days. + +nxapi logs may contain sensitive information such as Nintendo Account access tokens. + #### Environment variables Some options can be set using environment variables. These can be stored in a `.env` file in the data location. Environment variables will be read from the `.env` file in the default location, then the `.env` file in `NXAPI_DATA_PATH` location. `.env` files will not be read from the location set in the `--data-path` option. @@ -234,6 +246,7 @@ Environment variable | Description `NXAPI_SPLATNET3_UPGRADE_QUERIES` | Sets when the SplatNet 3 client is allowed to upgrade persisted query IDs to newer versions. If `0` queries are never upgraded (not recommended). If `1` queries are upgraded if they do not contain potentially breaking changes (not recommended, as like `0` this allows older queries to be sent to the API). If `2` queries are upgraded, requests that would include breaking changes are rejected. If `3` all queries are upgraded, even if they contain potentially breaking changes (default). `NXAPI_SPLATNET3_STRICT` | Disables strict handling of errors from the SplatNet 3 GraphQL API if set to `0`. If set to `1` (default) requests will be rejected if the response includes any errors, even if the response includes a result. `DEBUG` | Used by the [debug](https://github.com/debug-js/debug) package. Sets which modules should have debug logging enabled. See [debug logs](#debug-logs). +`NXAPI_DEBUG_FILE` | Disables writing debug logs to a file if set to `0`. Other environment variables may also be used by Node.js, Electron or other packages nxapi depends on. @@ -302,7 +315,7 @@ The reason Nintendo added this is probably to try and stop people automating acc - Nintendo Switch Online app API docs - https://github.com/ZekeSnider/NintendoSwitchRESTAPI - https://dev.to/mathewthe2/intro-to-nintendo-switch-rest-api-2cm7 - - nxapi includes TypeScript definitions of all API resources and JSON Web Token payloads at [src/api](src/api) + - nxapi includes TypeScript definitions for all API resources and JSON Web Token payloads at [src/api](src/api) - Coral client authentication (`f` parameter) - https://github.com/samuelthomas2774/nxapi/discussions/10 - ~~https://github.com/frozenpandaman/splatnet2statink/wiki/api-docs - splatnet2statink and flapg API docs~~ diff --git a/bin/nxapi.js b/bin/nxapi.js index afa8cef..b0fde86 100755 --- a/bin/nxapi.js +++ b/bin/nxapi.js @@ -1,7 +1,3 @@ #!/usr/bin/env node -import createDebug from 'debug'; - -createDebug.log = console.warn.bind(console); - -import('../dist/cli.js').then(cli => cli.main.call(null)); +import('../dist/cli-entry.js'); diff --git a/resources/docker-entrypoint.sh b/resources/docker-entrypoint.sh index 6ab0109..8410801 100755 --- a/resources/docker-entrypoint.sh +++ b/resources/docker-entrypoint.sh @@ -2,4 +2,9 @@ mkdir -p /data/android +# Logs will be captured by Docker if enabled +# This is set here so that running another process with `docker exec` (which +# doesn't capture logs) will still write to a file by default +export NXAPI_DEBUG_FILE=0 + exec /app/bin/nxapi.js --data-path /data "$@" diff --git a/rollup.config.js b/rollup.config.js index 575a09a..0bb6d3d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -65,13 +65,14 @@ const watch = { * @type {import('rollup').RollupOptions} */ const main = { - input: ['dist/cli-entry.js', 'dist/app/main/index.js'], + input: ['dist/cli-entry.js', 'dist/app/app-init.js', 'dist/app/main/index.js'], output: { dir: 'dist/bundle', format: 'es', sourcemap: true, entryFileNames: chunk => { if (chunk.name === 'cli-entry') return 'cli-bundle.js'; + if (chunk.name === 'app-init') return 'app-init-bundle.js'; if (chunk.name === 'index') return 'app-main-bundle.js'; return 'entry-' + chunk.name + '.js'; }, @@ -124,6 +125,7 @@ const app_entry = { include: ['dist/app/app-entry.cjs'], values: { '__NXAPI_BUNDLE_APP_MAIN__': JSON.stringify('./app-main-bundle.js'), + '__NXAPI_BUNDLE_APP_INIT__': JSON.stringify('./app-init-bundle.js'), }, preventAssignment: true, }), @@ -142,6 +144,8 @@ const app_entry = { external: [ 'electron', path.resolve(__dirname, 'dist/app/app-main-bundle.js'), + path.resolve(__dirname, 'dist/app/app-init-bundle.js'), + path.resolve(__dirname, 'dist/app/app-init.js'), path.resolve(__dirname, 'dist/app/main/index.js'), ], watch, diff --git a/src/api/coral.ts b/src/api/coral.ts index f9ffd5c..0a90d46 100644 --- a/src/api/coral.ts +++ b/src/api/coral.ts @@ -1,10 +1,10 @@ import fetch, { Response } from 'node-fetch'; import { v4 as uuidgen } from 'uuid'; -import createDebug from 'debug'; import { f, FResult, HashMethod } from './f.js'; import { AccountLogin, AccountToken, Announcements, CurrentUser, CurrentUserPermissions, Event, Friends, GetActiveEventResult, PresencePermissions, User, WebServices, WebServiceToken, CoralErrorResponse, CoralResponse, CoralStatus, CoralSuccessResponse, FriendCodeUser, FriendCodeUrl, AccountTokenParameter, AccountLoginParameter, WebServiceTokenParameter } from './coral-types.js'; import { getNintendoAccountToken, getNintendoAccountUser, NintendoAccountToken, NintendoAccountUser } from './na.js'; import { ErrorResponse, ResponseSymbol } from './util.js'; +import createDebug from '../util/debug.js'; import { JwtPayload } from '../util/jwt.js'; import { getAdditionalUserAgents } from '../util/useragent.js'; import { timeoutSignal } from '../util/misc.js'; diff --git a/src/api/f.ts b/src/api/f.ts index b1ad2a7..8b5df48 100644 --- a/src/api/f.ts +++ b/src/api/f.ts @@ -1,8 +1,8 @@ import process from 'node:process'; import fetch, { Headers } from 'node-fetch'; -import createDebug from 'debug'; import { v4 as uuidgen } from 'uuid'; import { defineResponse, ErrorResponse } from './util.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; import { getUserAgent } from '../util/useragent.js'; diff --git a/src/api/moon.ts b/src/api/moon.ts index 506dbf9..82dbb19 100644 --- a/src/api/moon.ts +++ b/src/api/moon.ts @@ -1,8 +1,8 @@ import fetch, { Response } from 'node-fetch'; -import createDebug from 'debug'; import { getNintendoAccountToken, getNintendoAccountUser, NintendoAccountToken, NintendoAccountUser } from './na.js'; import { defineResponse, ErrorResponse, HasResponse } from './util.js'; import { DailySummaries, Devices, MonthlySummaries, MonthlySummary, MoonError, ParentalControlSettingState, SmartDevices, User } from './moon-types.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; const debug = createDebug('nxapi:api:moon'); diff --git a/src/api/na.ts b/src/api/na.ts index 269bd69..9ae4fb9 100644 --- a/src/api/na.ts +++ b/src/api/na.ts @@ -1,6 +1,6 @@ import fetch from 'node-fetch'; -import createDebug from 'debug'; import { defineResponse, ErrorResponse } from './util.js'; +import createDebug from '../util/debug.js'; import { JwtPayload } from '../util/jwt.js'; import { timeoutSignal } from '../util/misc.js'; diff --git a/src/api/nooklink.ts b/src/api/nooklink.ts index 4219b83..e5a6625 100644 --- a/src/api/nooklink.ts +++ b/src/api/nooklink.ts @@ -1,10 +1,10 @@ import fetch, { Response } from 'node-fetch'; -import createDebug from 'debug'; import { WebServiceToken } from './coral-types.js'; import { NintendoAccountUser } from './na.js'; import { defineResponse, ErrorResponse, HasResponse } from './util.js'; import CoralApi from './coral.js'; import { WebServiceError, Users, AuthToken, UserProfile, Newspapers, Newspaper, Emoticons, Reaction, IslandProfile } from './nooklink-types.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; const debug = createDebug('nxapi:api:nooklink'); diff --git a/src/api/splatnet2.ts b/src/api/splatnet2.ts index 354c8a6..0816106 100644 --- a/src/api/splatnet2.ts +++ b/src/api/splatnet2.ts @@ -1,11 +1,11 @@ import fetch from 'node-fetch'; -import createDebug from 'debug'; import { v4 as uuidgen } from 'uuid'; import { WebServiceToken } from './coral-types.js'; import { NintendoAccountUser } from './na.js'; import { defineResponse, ErrorResponse } from './util.js'; import CoralApi from './coral.js'; import { ActiveFestivals, CoopResult, CoopResults, CoopSchedules, HeroRecords, LeagueMatchRankings, NicknameAndIcons, PastFestivals, Records, Result, Results, Schedules, ShareResponse, ShopMerchandises, Stages, Timeline, WebServiceError, XPowerRankingRecords, XPowerRankingSummary } from './splatnet2-types.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; import { toSeasonId, Rule as XPowerRankingRule, Season } from './splatnet2-xrank.js'; diff --git a/src/api/splatnet3.ts b/src/api/splatnet3.ts index 39594cc..862b203 100644 --- a/src/api/splatnet3.ts +++ b/src/api/splatnet3.ts @@ -1,12 +1,12 @@ -import createDebug from 'debug'; import fetch, { Response } from 'node-fetch'; import { BankaraBattleHistoriesRefetchResult, BankaraBattleHistoriesRefetchVariables, GraphQLRequest, GraphQLResponse, GraphQLSuccessResponse, KnownRequestId, LatestBattleHistoriesRefetchResult, LatestBattleHistoriesRefetchVariables, MyOutfitInput, PagerUpdateBattleHistoriesByVsModeResult, PagerUpdateBattleHistoriesByVsModeVariables, PrivateBattleHistoriesRefetchResult, PrivateBattleHistoriesRefetchVariables, RegularBattleHistoriesRefetchResult, RegularBattleHistoriesRefetchVariables, RequestId, ResultTypes, VariablesTypes, XBattleHistoriesRefetchResult, XBattleHistoriesRefetchVariables } from 'splatnet3-types/splatnet3'; -import { timeoutSignal } from '../util/misc.js'; import { WebServiceToken } from './coral-types.js'; import CoralApi from './coral.js'; import { NintendoAccountUser } from './na.js'; import { BulletToken } from './splatnet3-types.js'; import { defineResponse, ErrorResponse, HasResponse, ResponseSymbol } from './util.js'; +import createDebug from '../util/debug.js'; +import { timeoutSignal } from '../util/misc.js'; const debug = createDebug('nxapi:api:splatnet3'); const debugGraphQl = createDebug('nxapi:api:splatnet3:graphql'); diff --git a/src/api/znc-proxy.ts b/src/api/znc-proxy.ts index 40c31c7..3a6fb04 100644 --- a/src/api/znc-proxy.ts +++ b/src/api/znc-proxy.ts @@ -1,10 +1,10 @@ import fetch, { Response } from 'node-fetch'; -import createDebug from 'debug'; import { ActiveEvent, Announcements, CurrentUser, Event, Friend, Presence, PresencePermissions, User, WebService, WebServiceToken, CoralErrorResponse, CoralStatus, CoralSuccessResponse, FriendCodeUser, FriendCodeUrl } from './coral-types.js'; import { defineResponse, ErrorResponse, ResponseSymbol } from './util.js'; import CoralApi, { CoralAuthData, CorrelationIdSymbol, PartialCoralAuthData, ResponseDataSymbol, Result } from './coral.js'; import { NintendoAccountUser } from './na.js'; import { SavedToken } from '../common/auth/coral.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; import { getAdditionalUserAgents, getUserAgent } from '../util/useragent.js'; diff --git a/src/app/app-entry.cts b/src/app/app-entry.cts index fd460e8..cfcf62a 100644 --- a/src/app/app-entry.cts +++ b/src/app/app-entry.cts @@ -2,7 +2,11 @@ const electron = require('electron'); // Do anything that must be run before the app is ready... -electron.app.whenReady() +Promise.all([ + // @ts-expect-error + typeof __NXAPI_BUNDLE_APP_INIT__ !== 'undefined' ? import(__NXAPI_BUNDLE_APP_INIT__) : import('./app-init.js'), + electron.app.whenReady(), +]) // @ts-expect-error .then(() => typeof __NXAPI_BUNDLE_APP_MAIN__ !== 'undefined' ? import(__NXAPI_BUNDLE_APP_MAIN__) : import('./main/index.js')) .then(m => m.init.call(null)) diff --git a/src/app/app-init.ts b/src/app/app-init.ts new file mode 100644 index 0000000..2eb3e3a --- /dev/null +++ b/src/app/app-init.ts @@ -0,0 +1,5 @@ +import { join } from 'node:path'; +import { init as initDebug } from '../util/debug.js'; +import { paths } from '../util/product.js'; + +await initDebug(join(paths.log, 'app')); diff --git a/src/app/main/index.ts b/src/app/main/index.ts index aab909f..da60759 100644 --- a/src/app/main/index.ts +++ b/src/app/main/index.ts @@ -2,24 +2,24 @@ import { app, BrowserWindow, dialog, ipcMain, LoginItemSettingsOptions } from '. import process from 'node:process'; import * as path from 'node:path'; import { EventEmitter } from 'node:events'; -import createDebug from 'debug'; import * as persist from 'node-persist'; -import { init as initGlobals } from '../../common/globals.js'; import MenuApp from './menu.js'; import { handleOpenWebServiceUri } from './webservices.js'; import { EmbeddedPresenceMonitor, PresenceMonitorManager } from './monitor.js'; import { createWindow } from './windows.js'; -import { DiscordPresenceConfiguration, LoginItem, LoginItemOptions, WindowType } from '../common/types.js'; -import { initStorage, paths } from '../../util/storage.js'; -import { checkUpdates, UpdateCacheData } from '../../common/update.js'; -import Users, { CoralUser } from '../../common/users.js'; import { setupIpc } from './ipc.js'; -import { dev, dir, git, release, version } from '../../util/product.js'; -import { addUserAgent } from '../../util/useragent.js'; import { askUserForUri } from './util.js'; import { setAppInstance } from './app-menu.js'; import { handleAuthUri } from './na-auth.js'; +import { DiscordPresenceConfiguration, LoginItem, LoginItemOptions, WindowType } from '../common/types.js'; +import { init as initGlobals } from '../../common/globals.js'; import { CREDITS_NOTICE, GITLAB_URL, LICENCE_NOTICE } from '../../common/constants.js'; +import { checkUpdates, UpdateCacheData } from '../../common/update.js'; +import Users, { CoralUser } from '../../common/users.js'; +import createDebug from '../../util/debug.js'; +import { dev, dir, git, release, version } from '../../util/product.js'; +import { addUserAgent } from '../../util/useragent.js'; +import { initStorage, paths } from '../../util/storage.js'; const debug = createDebug('app:main'); diff --git a/src/app/main/ipc.ts b/src/app/main/ipc.ts index 7bb87bb..2754db5 100644 --- a/src/app/main/ipc.ts +++ b/src/app/main/ipc.ts @@ -1,14 +1,15 @@ -import { app, BrowserWindow, clipboard, dialog, IpcMain, KeyboardEvent, Menu, MenuItem, Settings, ShareMenu, SharingItem, shell, systemPreferences } from './electron.js'; +import { BrowserWindow, clipboard, dialog, IpcMain, KeyboardEvent, Menu, MenuItem, ShareMenu, SharingItem, shell, systemPreferences } from './electron.js'; import * as util from 'node:util'; -import createDebug from 'debug'; import { User } from 'discord-rpc'; import openWebService, { QrCodeReaderOptions, WebServiceIpc, WebServiceValidationError } from './webservices.js'; import { createWindow, getWindowConfiguration } from './windows.js'; +import { askAddNsoAccount, askAddPctlAccount } from './na-auth.js'; +import { App } from './index.js'; +import { EmbeddedPresenceMonitor } from './monitor.js'; import { DiscordPresenceConfiguration, DiscordPresenceSource, LoginItemOptions, WindowType } from '../common/types.js'; import { CurrentUser, Friend, Game, PresenceState, WebService } from '../../api/coral-types.js'; -import { askAddNsoAccount, askAddPctlAccount } from './na-auth.js'; -import { App, login_item_options } from './index.js'; import { NintendoAccountUser } from '../../api/na.js'; +import createDebug from '../../util/debug.js'; import { hrduration } from '../../util/misc.js'; import { DiscordPresence } from '../../discord/types.js'; import { getDiscordRpcClients } from '../../discord/rpc.js'; @@ -16,7 +17,6 @@ import { defaultTitle } from '../../discord/titles.js'; import type { FriendProps } from '../browser/friend/index.js'; import type { DiscordSetupProps } from '../browser/discord/index.js'; import type { AddFriendProps } from '../browser/add-friend/index.js'; -import { EmbeddedPresenceMonitor } from './monitor.js'; const debug = createDebug('app:main:ipc'); diff --git a/src/app/main/menu.ts b/src/app/main/menu.ts index 65ac91f..01b9876 100644 --- a/src/app/main/menu.ts +++ b/src/app/main/menu.ts @@ -1,19 +1,19 @@ import { app, dialog, Menu, Tray, nativeImage, MenuItem, BrowserWindow, KeyboardEvent } from './electron.js'; import path from 'node:path'; import * as util from 'node:util'; -import createDebug from 'debug'; import { askAddNsoAccount, askAddPctlAccount } from './na-auth.js'; import { App } from './index.js'; -import { WebService } from '../../api/coral-types.js'; import openWebService, { WebServiceValidationError } from './webservices.js'; -import { SavedToken } from '../../common/auth/coral.js'; -import { SavedMoonToken } from '../../common/auth/moon.js'; -import { dev, dir } from '../../util/product.js'; import { EmbeddedPresenceMonitor, EmbeddedProxyPresenceMonitor } from './monitor.js'; import { createWindow } from './windows.js'; import { WindowType } from '../common/types.js'; import CoralApi from '../../api/coral.js'; +import { WebService } from '../../api/coral-types.js'; +import { SavedToken } from '../../common/auth/coral.js'; +import { SavedMoonToken } from '../../common/auth/moon.js'; import { CachedWebServicesList } from '../../common/users.js'; +import createDebug from '../../util/debug.js'; +import { dev, dir } from '../../util/product.js'; const debug = createDebug('app:main:menu'); diff --git a/src/app/main/monitor.ts b/src/app/main/monitor.ts index f483d8b..75277c2 100644 --- a/src/app/main/monitor.ts +++ b/src/app/main/monitor.ts @@ -1,13 +1,13 @@ import { dialog, Notification } from './electron.js'; -import createDebug from 'debug'; +import { App } from './index.js'; +import { tryGetNativeImageFromUrl } from './util.js'; +import { DiscordPresenceConfiguration, DiscordPresenceExternalMonitorsConfiguration, DiscordPresenceSource } from '../common/types.js'; import { CurrentUser, Friend, Game, CoralErrorResponse } from '../../api/coral-types.js'; import { ErrorResponse } from '../../api/util.js'; import { ZncDiscordPresence, ZncProxyDiscordPresence } from '../../common/presence.js'; import { NotificationManager } from '../../common/notify.js'; +import createDebug from '../../util/debug.js'; import { LoopResult } from '../../util/loop.js'; -import { tryGetNativeImageFromUrl } from './util.js'; -import { App } from './index.js'; -import { DiscordPresenceConfiguration, DiscordPresenceExternalMonitorsConfiguration, DiscordPresenceSource } from '../common/types.js'; import { DiscordPresence, DiscordPresencePlayTime, ErrorResult } from '../../discord/types.js'; import { DiscordRpcClient } from '../../discord/rpc.js'; import SplatNet3Monitor, { getConfigFromAppConfig as getSplatNet3MonitorConfigFromAppConfig } from '../../discord/monitor/splatoon3.js'; diff --git a/src/app/main/na-auth.ts b/src/app/main/na-auth.ts index f99ad5c..8c2f3f9 100644 --- a/src/app/main/na-auth.ts +++ b/src/app/main/na-auth.ts @@ -1,19 +1,20 @@ +import { app, BrowserWindow, dialog, MessageBoxOptions, Notification, session, shell } from './electron.js'; import process from 'node:process'; import * as crypto from 'node:crypto'; -import createDebug from 'debug'; import * as persist from 'node-persist'; -import { app, BrowserWindow, dialog, MessageBoxOptions, Notification, session, shell } from './electron.js'; -import { getNintendoAccountSessionToken, NintendoAccountSessionToken } from '../../api/na.js'; +import { protocol_registration_options } from './index.js'; +import { createWindow } from './windows.js'; +import { tryGetNativeImageFromUrl } from './util.js'; +import { WindowType } from '../common/types.js'; +import { getNintendoAccountSessionToken, NintendoAccountAuthError, NintendoAccountSessionToken } from '../../api/na.js'; import { ZNCA_CLIENT_ID } from '../../api/coral.js'; import { ZNMA_CLIENT_ID } from '../../api/moon.js'; -import { getToken, SavedToken } from '../../common/auth/coral.js'; -import { getPctlToken, SavedMoonToken } from '../../common/auth/moon.js'; +import { ErrorResponse } from '../../api/util.js'; +import { getToken } from '../../common/auth/coral.js'; +import { getPctlToken } from '../../common/auth/moon.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; -import { tryGetNativeImageFromUrl } from './util.js'; import { ZNCA_API_USE_URL } from '../../common/constants.js'; -import { createWindow } from './windows.js'; -import { WindowType } from '../common/types.js'; -import { protocol_registration_options } from './index.js'; const debug = createDebug('app:main:na-auth'); diff --git a/src/app/main/webservices.ts b/src/app/main/webservices.ts index 755fa53..0855182 100644 --- a/src/app/main/webservices.ts +++ b/src/app/main/webservices.ts @@ -1,19 +1,19 @@ +import { app, BrowserWindow, clipboard, dialog, IpcMainInvokeEvent, nativeImage, nativeTheme, Notification, ShareMenu, shell, WebContents } from './electron.js'; import * as path from 'node:path'; import { constants } from 'node:fs'; import * as fs from 'node:fs/promises'; import { Buffer } from 'node:buffer'; import * as util from 'node:util'; -import createDebug from 'debug'; -import { app, BrowserWindow, clipboard, dialog, IpcMainInvokeEvent, nativeImage, nativeTheme, Notification, ShareMenu, shell, WebContents } from './electron.js'; import fetch from 'node-fetch'; -import CoralApi from '../../api/coral.js'; -import { CurrentUser, WebService, WebServiceToken } from '../../api/coral-types.js'; import { Store } from './index.js'; -import type { DownloadImagesRequest, NativeShareRequest, NativeShareUrlRequest, QrCodeReaderCameraOptions, QrCodeReaderCheckinOptions, QrCodeReaderCheckinResult, QrCodeReaderPhotoLibraryOptions, SendMessageOptions } from '../preload-webservice/znca-js-api.js'; -import { SavedToken } from '../../common/auth/coral.js'; import { createWebServiceWindow } from './windows.js'; import { askUserForUri } from './util.js'; +import type { DownloadImagesRequest, NativeShareRequest, NativeShareUrlRequest, QrCodeReaderCameraOptions, QrCodeReaderCheckinOptions, QrCodeReaderCheckinResult, QrCodeReaderPhotoLibraryOptions, SendMessageOptions } from '../preload-webservice/znca-js-api.js'; +import createDebug from '../../util/debug.js'; +import CoralApi from '../../api/coral.js'; +import { CurrentUser, WebService, WebServiceToken } from '../../api/coral-types.js'; import { NintendoAccountUser } from '../../api/na.js'; +import { SavedToken } from '../../common/auth/coral.js'; const debug = createDebug('app:main:webservices'); diff --git a/src/cli-entry.ts b/src/cli-entry.ts index 6ff9091..7a3ac97 100644 --- a/src/cli-entry.ts +++ b/src/cli-entry.ts @@ -1,9 +1,13 @@ -import createDebug from 'debug'; +import { join } from 'node:path'; +import { init as initDebug } from './util/debug.js'; +import { paths } from './util/product.js'; // -// cli entrypoint for Rollup bundle +// cli entrypoint // -createDebug.log = console.warn.bind(console); +if (process.env.NXAPI_DEBUG_FILE !== '0') { + await initDebug(join(paths.log, 'cli')); +} import('./cli.js').then(cli => cli.main.call(null)); diff --git a/src/cli.ts b/src/cli.ts index 923075e..db8d3c5 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,8 +1,8 @@ import process from 'node:process'; -import createDebug from 'debug'; import Yargs from 'yargs'; import * as commands from './cli/index.js'; import { checkUpdates } from './common/update.js'; +import createDebug from './util/debug.js'; import { dev } from './util/product.js'; import { paths } from './util/storage.js'; import { YargsArguments } from './util/yargs.js'; diff --git a/src/cli/android-znca-api-server-frida.ts b/src/cli/android-znca-api-server-frida.ts index 544d9a9..3b904ac 100644 --- a/src/cli/android-znca-api-server-frida.ts +++ b/src/cli/android-znca-api-server-frida.ts @@ -1,5 +1,5 @@ import process from 'node:process'; -import createDebug from 'debug'; +import createDebug from '../util/debug.js'; import type { Arguments as ParentArguments } from '../cli.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../util/yargs.js'; diff --git a/src/cli/app.ts b/src/cli/app.ts index 8e09ebe..d5f1406 100644 --- a/src/cli/app.ts +++ b/src/cli/app.ts @@ -2,8 +2,8 @@ import process from 'node:process'; import { createRequire } from 'node:module'; import * as path from 'node:path'; import { execFileSync } from 'node:child_process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../util/yargs.js'; import { dir } from '../util/product.js'; diff --git a/src/cli/nooklink.ts b/src/cli/nooklink.ts index 65a5314..bea5e75 100644 --- a/src/cli/nooklink.ts +++ b/src/cli/nooklink.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import * as commands from './nooklink/index.js'; diff --git a/src/cli/nooklink/dump-newspapers.ts b/src/cli/nooklink/dump-newspapers.ts index d8eac5b..3e73f9b 100644 --- a/src/cli/nooklink/dump-newspapers.ts +++ b/src/cli/nooklink/dump-newspapers.ts @@ -1,8 +1,8 @@ import * as fs from 'node:fs/promises'; import * as path from 'node:path'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/island.ts b/src/cli/nooklink/island.ts index 13458d1..bab3e39 100644 --- a/src/cli/nooklink/island.ts +++ b/src/cli/nooklink/island.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken, getWebServiceToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/keyboard.ts b/src/cli/nooklink/keyboard.ts index fc434ea..610f8b0 100644 --- a/src/cli/nooklink/keyboard.ts +++ b/src/cli/nooklink/keyboard.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/newspaper.ts b/src/cli/nooklink/newspaper.ts index bd0b0f6..29aaf62 100644 --- a/src/cli/nooklink/newspaper.ts +++ b/src/cli/nooklink/newspaper.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/newspapers.ts b/src/cli/nooklink/newspapers.ts index 7086945..f8aef86 100644 --- a/src/cli/nooklink/newspapers.ts +++ b/src/cli/nooklink/newspapers.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/post-reaction.ts b/src/cli/nooklink/post-reaction.ts index 25ab983..741063f 100644 --- a/src/cli/nooklink/post-reaction.ts +++ b/src/cli/nooklink/post-reaction.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/reactions.ts b/src/cli/nooklink/reactions.ts index bdd8b80..3de844b 100644 --- a/src/cli/nooklink/reactions.ts +++ b/src/cli/nooklink/reactions.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/user-token.ts b/src/cli/nooklink/user-token.ts index 06bddda..375ac73 100644 --- a/src/cli/nooklink/user-token.ts +++ b/src/cli/nooklink/user-token.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/user.ts b/src/cli/nooklink/user.ts index 9168fbe..3fc65fe 100644 --- a/src/cli/nooklink/user.ts +++ b/src/cli/nooklink/user.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nooklink/users.ts b/src/cli/nooklink/users.ts index e5e1fad..f594f5d 100644 --- a/src/cli/nooklink/users.ts +++ b/src/cli/nooklink/users.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nooklink.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getWebServiceToken } from '../../common/auth/nooklink.js'; diff --git a/src/cli/nso.ts b/src/cli/nso.ts index 9f14484..341e65a 100644 --- a/src/cli/nso.ts +++ b/src/cli/nso.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import * as commands from './nso/index.js'; diff --git a/src/cli/nso/active-event.ts b/src/cli/nso/active-event.ts index 1ad0722..946e839 100644 --- a/src/cli/nso/active-event.ts +++ b/src/cli/nso/active-event.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/add-friend.ts b/src/cli/nso/add-friend.ts index 190d1aa..ad4a800 100644 --- a/src/cli/nso/add-friend.ts +++ b/src/cli/nso/add-friend.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/announcements.ts b/src/cli/nso/announcements.ts index 0384de4..5ec1083 100644 --- a/src/cli/nso/announcements.ts +++ b/src/cli/nso/announcements.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/auth.ts b/src/cli/nso/auth.ts index 9d85f41..7288573 100644 --- a/src/cli/nso/auth.ts +++ b/src/cli/nso/auth.ts @@ -1,6 +1,6 @@ import * as crypto from 'node:crypto'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/friendcode.ts b/src/cli/nso/friendcode.ts index 65734d4..862381f 100644 --- a/src/cli/nso/friendcode.ts +++ b/src/cli/nso/friendcode.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/friends.ts b/src/cli/nso/friends.ts index 5b88496..52535e2 100644 --- a/src/cli/nso/friends.ts +++ b/src/cli/nso/friends.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import { PresenceState } from '../../api/coral-types.js'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { hrduration } from '../../util/misc.js'; diff --git a/src/cli/nso/http-server.ts b/src/cli/nso/http-server.ts index d9139f2..740080b 100644 --- a/src/cli/nso/http-server.ts +++ b/src/cli/nso/http-server.ts @@ -1,24 +1,24 @@ import * as net from 'node:net'; import * as os from 'node:os'; -import createDebug from 'debug'; import * as persist from 'node-persist'; import express, { Request, RequestHandler, Response } from 'express'; import bodyParser from 'body-parser'; import { v4 as uuidgen } from 'uuid'; -import { Announcement, CoralStatus, CurrentUser, Friend, FriendCodeUrl, FriendCodeUser, Presence } from '../../api/coral-types.js'; -import CoralApi from '../../api/coral.js'; import type { Arguments as ParentArguments } from '../nso.js'; +import CoralApi from '../../api/coral.js'; +import { Announcement, CoralStatus, CurrentUser, Friend, FriendCodeUrl, FriendCodeUser, Presence } from '../../api/coral-types.js'; +import { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js'; +import { ErrorResponse } from '../../api/util.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; -import { SavedToken } from '../../common/auth/coral.js'; -import { NotificationManager, PresenceEvent, ZncNotifications } from '../../common/notify.js'; import { product } from '../../util/product.js'; import { parseListenAddress } from '../../util/net.js'; -import { AuthPolicy, AuthToken, ZncPresenceEventStreamEvent } from '../../api/znc-proxy.js'; import { addCliFeatureUserAgent } from '../../util/useragent.js'; -import { ErrorResponse } from '../../api/util.js'; -import Users, { CoralUser } from '../../common/users.js'; import { EventStreamResponse, HttpServer, ResponseError } from '../util/http-server.js'; +import { SavedToken } from '../../common/auth/coral.js'; +import { NotificationManager, PresenceEvent, ZncNotifications } from '../../common/notify.js'; +import Users, { CoralUser } from '../../common/users.js'; declare global { namespace Express { diff --git a/src/cli/nso/lookup.ts b/src/cli/nso/lookup.ts index 6d8943a..5c22741 100644 --- a/src/cli/nso/lookup.ts +++ b/src/cli/nso/lookup.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/notify.ts b/src/cli/nso/notify.ts index ae031b1..7c34f97 100644 --- a/src/cli/nso/notify.ts +++ b/src/cli/nso/notify.ts @@ -1,7 +1,7 @@ import * as path from 'node:path'; -import createDebug from 'debug'; import persist from 'node-persist'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/permissions.ts b/src/cli/nso/permissions.ts index 6a131f8..b061436 100644 --- a/src/cli/nso/permissions.ts +++ b/src/cli/nso/permissions.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import { PresencePermissions } from '../../api/coral-types.js'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/presence.ts b/src/cli/nso/presence.ts index 548d272..f8e360d 100644 --- a/src/cli/nso/presence.ts +++ b/src/cli/nso/presence.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/token.ts b/src/cli/nso/token.ts index b299eab..001acac 100644 --- a/src/cli/nso/token.ts +++ b/src/cli/nso/token.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/user.ts b/src/cli/nso/user.ts index dfce6b2..3aa3aed 100644 --- a/src/cli/nso/user.ts +++ b/src/cli/nso/user.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/webservices.ts b/src/cli/nso/webservices.ts index 4417181..ae37ab6 100644 --- a/src/cli/nso/webservices.ts +++ b/src/cli/nso/webservices.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/webservicetoken.ts b/src/cli/nso/webservicetoken.ts index 51d1b4f..ccc2a66 100644 --- a/src/cli/nso/webservicetoken.ts +++ b/src/cli/nso/webservicetoken.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../nso.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/nso/znc-proxy-tokens.ts b/src/cli/nso/znc-proxy-tokens.ts index a8c315f..415085a 100644 --- a/src/cli/nso/znc-proxy-tokens.ts +++ b/src/cli/nso/znc-proxy-tokens.ts @@ -1,9 +1,9 @@ -import createDebug from 'debug'; import fetch from 'node-fetch'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../nso.js'; import { getToken } from '../../common/auth/coral.js'; import { AuthPolicy, AuthToken } from '../../api/znc-proxy.js'; +import createDebug from '../../util/debug.js'; import { Argv } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getUserAgent } from '../../util/useragent.js'; diff --git a/src/cli/pctl.ts b/src/cli/pctl.ts index 32cec16..f36856d 100644 --- a/src/cli/pctl.ts +++ b/src/cli/pctl.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import * as commands from './pctl/index.js'; diff --git a/src/cli/pctl/auth.ts b/src/cli/pctl/auth.ts index d4c3db3..717f1cb 100644 --- a/src/cli/pctl/auth.ts +++ b/src/cli/pctl/auth.ts @@ -1,6 +1,6 @@ import * as crypto from 'node:crypto'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/daily-summaries.ts b/src/cli/pctl/daily-summaries.ts index baf8492..ad1c471 100644 --- a/src/cli/pctl/daily-summaries.ts +++ b/src/cli/pctl/daily-summaries.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { hrduration } from '../../util/misc.js'; diff --git a/src/cli/pctl/devices.ts b/src/cli/pctl/devices.ts index 42e48ec..f4b7f00 100644 --- a/src/cli/pctl/devices.ts +++ b/src/cli/pctl/devices.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/dump-summaries.ts b/src/cli/pctl/dump-summaries.ts index 17ef4d6..6191535 100644 --- a/src/cli/pctl/dump-summaries.ts +++ b/src/cli/pctl/dump-summaries.ts @@ -1,8 +1,8 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/monthly-summaries.ts b/src/cli/pctl/monthly-summaries.ts index c8f39f1..32e35fe 100644 --- a/src/cli/pctl/monthly-summaries.ts +++ b/src/cli/pctl/monthly-summaries.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/monthly-summary.ts b/src/cli/pctl/monthly-summary.ts index 0b74ba0..385f08c 100644 --- a/src/cli/pctl/monthly-summary.ts +++ b/src/cli/pctl/monthly-summary.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/settings.ts b/src/cli/pctl/settings.ts index 92e9959..095cfba 100644 --- a/src/cli/pctl/settings.ts +++ b/src/cli/pctl/settings.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/token.ts b/src/cli/pctl/token.ts index ba709e5..6c67e6d 100644 --- a/src/cli/pctl/token.ts +++ b/src/cli/pctl/token.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../pctl.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getPctlToken } from '../../common/auth/moon.js'; diff --git a/src/cli/pctl/user.ts b/src/cli/pctl/user.ts index 3be9b40..d3fe397 100644 --- a/src/cli/pctl/user.ts +++ b/src/cli/pctl/user.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../pctl.js'; import { getPctlToken } from '../../common/auth/moon.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; diff --git a/src/cli/presence-server.ts b/src/cli/presence-server.ts index 3089237..c91b873 100644 --- a/src/cli/presence-server.ts +++ b/src/cli/presence-server.ts @@ -2,26 +2,26 @@ import * as net from 'node:net'; import * as os from 'node:os'; import * as fs from 'node:fs/promises'; import * as path from 'node:path'; -import createDebug from 'debug'; import express, { Request, Response } from 'express'; import fetch from 'node-fetch'; import * as persist from 'node-persist'; import mkdirp from 'mkdirp'; import { BankaraMatchMode, BankaraMatchSetting_schedule, CoopRule, CoopSetting_schedule, DetailFestRecordDetailResult, DetailVotingStatusResult, FestMatchSetting_schedule, FestRecordResult, FestState, FestTeam_schedule, FestTeam_votingStatus, FestVoteState, Fest_schedule, FriendListResult, FriendOnlineState, Friend_friendList, GraphQLSuccessResponse, KnownRequestId, LeagueMatchSetting_schedule, RegularMatchSetting_schedule, StageScheduleResult, VsMode, XMatchSetting_schedule } from 'splatnet3-types/splatnet3'; +import StageScheduleQuery_730cd98 from 'splatnet3-types/graphql/730cd98e84f1030d3e9ac86b6f1aae13'; import type { Arguments as ParentArguments } from '../cli.js'; -import { ArgumentsCamelCase, Argv, YargsArguments } from '../util/yargs.js'; -import { initStorage } from '../util/storage.js'; -import { addCliFeatureUserAgent, getUserAgent } from '../util/useragent.js'; -import { parseListenAddress } from '../util/net.js'; import { product, version } from '../util/product.js'; import Users, { CoralUser } from '../common/users.js'; import { Friend } from '../api/coral-types.js'; -import { getBulletToken, SavedBulletToken } from '../common/auth/splatnet3.js'; import SplatNet3Api, { PersistedQueryResult, RequestIdSymbol } from '../api/splatnet3.js'; import { ErrorResponse, ResponseSymbol } from '../api/util.js'; +import { getBulletToken, SavedBulletToken } from '../common/auth/splatnet3.js'; +import createDebug from '../util/debug.js'; +import { initStorage } from '../util/storage.js'; +import { addCliFeatureUserAgent, getUserAgent } from '../util/useragent.js'; +import { parseListenAddress } from '../util/net.js'; import { EventStreamResponse, HttpServer, ResponseError } from './util/http-server.js'; +import { ArgumentsCamelCase, Argv, YargsArguments } from '../util/yargs.js'; import { getTitleIdFromEcUrl } from '../util/misc.js'; -import StageScheduleQuery_730cd98 from 'splatnet3-types/graphql/730cd98e84f1030d3e9ac86b6f1aae13'; const debug = createDebug('cli:presence-server'); const debugSplatnet3Proxy = createDebug('cli:presence-server:splatnet3-proxy'); diff --git a/src/cli/splatnet2.ts b/src/cli/splatnet2.ts index 8bc806f..1ad7d70 100644 --- a/src/cli/splatnet2.ts +++ b/src/cli/splatnet2.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import * as commands from './splatnet2/index.js'; diff --git a/src/cli/splatnet2/battles.ts b/src/cli/splatnet2/battles.ts index 08fef7e..eb82e93 100644 --- a/src/cli/splatnet2/battles.ts +++ b/src/cli/splatnet2/battles.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/challenges.ts b/src/cli/splatnet2/challenges.ts index 4372570..7aa7390 100644 --- a/src/cli/splatnet2/challenges.ts +++ b/src/cli/splatnet2/challenges.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/dump-records.ts b/src/cli/splatnet2/dump-records.ts index 04a1ad5..798acce 100644 --- a/src/cli/splatnet2/dump-records.ts +++ b/src/cli/splatnet2/dump-records.ts @@ -1,8 +1,8 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/dump-results.ts b/src/cli/splatnet2/dump-results.ts index c33e1df..118243e 100644 --- a/src/cli/splatnet2/dump-results.ts +++ b/src/cli/splatnet2/dump-results.ts @@ -1,7 +1,7 @@ import * as path from 'node:path'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/hero.ts b/src/cli/splatnet2/hero.ts index 164db7d..970e43e 100644 --- a/src/cli/splatnet2/hero.ts +++ b/src/cli/splatnet2/hero.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/monitor.ts b/src/cli/splatnet2/monitor.ts index 8374929..d686ad1 100644 --- a/src/cli/splatnet2/monitor.ts +++ b/src/cli/splatnet2/monitor.ts @@ -1,6 +1,6 @@ import * as path from 'node:path'; -import createDebug from 'debug'; import { getIksmToken } from '../../common/auth/splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { Arguments as ParentArguments } from '../splatnet2.js'; diff --git a/src/cli/splatnet2/schedule.ts b/src/cli/splatnet2/schedule.ts index 5913dde..85272b5 100644 --- a/src/cli/splatnet2/schedule.ts +++ b/src/cli/splatnet2/schedule.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/stages.ts b/src/cli/splatnet2/stages.ts index f07bccb..23f215c 100644 --- a/src/cli/splatnet2/stages.ts +++ b/src/cli/splatnet2/stages.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/token.ts b/src/cli/splatnet2/token.ts index ec81aac..7472d92 100644 --- a/src/cli/splatnet2/token.ts +++ b/src/cli/splatnet2/token.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/user.ts b/src/cli/splatnet2/user.ts index 640f6f9..bf0950e 100644 --- a/src/cli/splatnet2/user.ts +++ b/src/cli/splatnet2/user.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/weapons.ts b/src/cli/splatnet2/weapons.ts index 1e12eda..ed0db96 100644 --- a/src/cli/splatnet2/weapons.ts +++ b/src/cli/splatnet2/weapons.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getIksmToken } from '../../common/auth/splatnet2.js'; diff --git a/src/cli/splatnet2/x-rank-seasons.ts b/src/cli/splatnet2/x-rank-seasons.ts index 2410ab7..def49bd 100644 --- a/src/cli/splatnet2/x-rank-seasons.ts +++ b/src/cli/splatnet2/x-rank-seasons.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet2.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { getAllSeasons } from '../../api/splatnet2-xrank.js'; diff --git a/src/cli/splatnet3.ts b/src/cli/splatnet3.ts index 8e8fb79..9778c39 100644 --- a/src/cli/splatnet3.ts +++ b/src/cli/splatnet3.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import * as commands from './splatnet3/index.js'; diff --git a/src/cli/splatnet3/battles.ts b/src/cli/splatnet3/battles.ts index faaece5..c9bf886 100644 --- a/src/cli/splatnet3/battles.ts +++ b/src/cli/splatnet3/battles.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import { Judgement } from 'splatnet3-types/splatnet3'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/dump-album.ts b/src/cli/splatnet3/dump-album.ts index 848e440..52f29ee 100644 --- a/src/cli/splatnet3/dump-album.ts +++ b/src/cli/splatnet3/dump-album.ts @@ -1,10 +1,10 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import fetch from 'node-fetch'; import { PhotoAlbumResult } from 'splatnet3-types/splatnet3'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/dump-fests.ts b/src/cli/splatnet3/dump-fests.ts index e2f10a3..a00bc59 100644 --- a/src/cli/splatnet3/dump-fests.ts +++ b/src/cli/splatnet3/dump-fests.ts @@ -1,9 +1,9 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import { FestState, Fest_detail, RequestId } from 'splatnet3-types/splatnet3'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/dump-records.ts b/src/cli/splatnet3/dump-records.ts index 2b66b7e..f43b770 100644 --- a/src/cli/splatnet3/dump-records.ts +++ b/src/cli/splatnet3/dump-records.ts @@ -1,8 +1,8 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/dump-results.ts b/src/cli/splatnet3/dump-results.ts index 69228e8..70d2160 100644 --- a/src/cli/splatnet3/dump-results.ts +++ b/src/cli/splatnet3/dump-results.ts @@ -1,9 +1,9 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import { BankaraBattleHistoriesRefetchResult, CoopHistoryResult, LatestBattleHistoriesRefetchResult, LatestBattleHistoriesResult, PrivateBattleHistoriesRefetchResult, RefetchableCoopHistory_CoopResultResult, RegularBattleHistoriesRefetchResult, RequestId, XBattleHistoriesRefetchResult } from 'splatnet3-types/splatnet3'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/festival.ts b/src/cli/splatnet3/festival.ts index 5f18145..10b8287 100644 --- a/src/cli/splatnet3/festival.ts +++ b/src/cli/splatnet3/festival.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import { FestState } from 'splatnet3-types/splatnet3'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/festivals.ts b/src/cli/splatnet3/festivals.ts index 95c750d..3528554 100644 --- a/src/cli/splatnet3/festivals.ts +++ b/src/cli/splatnet3/festivals.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/friends.ts b/src/cli/splatnet3/friends.ts index 243ddf1..e2939a8 100644 --- a/src/cli/splatnet3/friends.ts +++ b/src/cli/splatnet3/friends.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import { FriendOnlineState, Friend_friendList } from 'splatnet3-types/splatnet3'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/monitor.ts b/src/cli/splatnet3/monitor.ts index 03b0778..027bc8d 100644 --- a/src/cli/splatnet3/monitor.ts +++ b/src/cli/splatnet3/monitor.ts @@ -1,7 +1,7 @@ import * as path from 'node:path'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/schedule.ts b/src/cli/splatnet3/schedule.ts index 99b56f2..d4b7a42 100644 --- a/src/cli/splatnet3/schedule.ts +++ b/src/cli/splatnet3/schedule.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import Table from '../util/table.js'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/token.ts b/src/cli/splatnet3/token.ts index 2b9782b..c8e647e 100644 --- a/src/cli/splatnet3/token.ts +++ b/src/cli/splatnet3/token.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/splatnet3/user.ts b/src/cli/splatnet3/user.ts index 7e261a0..c039e1f 100644 --- a/src/cli/splatnet3/user.ts +++ b/src/cli/splatnet3/user.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../splatnet3.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getBulletToken } from '../../common/auth/splatnet3.js'; diff --git a/src/cli/users.ts b/src/cli/users.ts index 956c3a9..4254ec8 100644 --- a/src/cli/users.ts +++ b/src/cli/users.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import * as persist from 'node-persist'; import Table from './util/table.js'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv } from '../util/yargs.js'; import { initStorage, iterateLocalStorage } from '../util/storage.js'; import { SavedToken } from '../common/auth/coral.js'; diff --git a/src/cli/util.ts b/src/cli/util.ts index e4816e5..35febf7 100644 --- a/src/cli/util.ts +++ b/src/cli/util.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../cli.js'; +import createDebug from '../util/debug.js'; import { Argv, YargsArguments } from '../util/yargs.js'; import { dev } from '../util/product.js'; import * as commands from './util/index.js'; diff --git a/src/cli/util/captureid.ts b/src/cli/util/captureid.ts index 8082ce2..5acf11f 100644 --- a/src/cli/util/captureid.ts +++ b/src/cli/util/captureid.ts @@ -1,7 +1,7 @@ import * as crypto from 'node:crypto'; import { Buffer } from 'node:buffer'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../util.js'; +import createDebug from '../../util/debug.js'; import { Argv } from '../../util/yargs.js'; const debug = createDebug('cli:util:captureid'); diff --git a/src/cli/util/discord-activity.ts b/src/cli/util/discord-activity.ts index ee71484..f24f55b 100644 --- a/src/cli/util/discord-activity.ts +++ b/src/cli/util/discord-activity.ts @@ -1,11 +1,11 @@ import process from 'node:process'; -import createDebug from 'debug'; import fetch from 'node-fetch'; import { getPresenceFromUrl } from '../../api/znc-proxy.js'; import { ActiveEvent, CurrentUser, Friend, Game, Presence, PresenceState } from '../../api/coral-types.js'; import type { Arguments as ParentArguments } from '../util.js'; import { getDiscordPresence, getInactiveDiscordPresence } from '../../discord/util.js'; import { DiscordPresenceContext, DiscordPresencePlayTime } from '../../discord/types.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { initStorage } from '../../util/storage.js'; import { getToken, Login } from '../../common/auth/coral.js'; diff --git a/src/cli/util/discord-rpc.ts b/src/cli/util/discord-rpc.ts index 4995251..f488345 100644 --- a/src/cli/util/discord-rpc.ts +++ b/src/cli/util/discord-rpc.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../util.js'; import { DiscordRpcClient, getAllIpcSockets } from '../../discord/rpc.js'; import { defaultTitle } from '../../discord/titles.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; const debug = createDebug('cli:util:discord-rpc'); diff --git a/src/cli/util/export-discord-titles.ts b/src/cli/util/export-discord-titles.ts index 1520541..a7005fc 100644 --- a/src/cli/util/export-discord-titles.ts +++ b/src/cli/util/export-discord-titles.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import fetch from 'node-fetch'; import type { Arguments as ParentArguments } from '../util.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; import { titles as unsorted_titles } from '../../discord/titles.js'; import { DiscordApplicationRpc, getDiscordApplicationRpc } from './discord-activity.js'; diff --git a/src/cli/util/http-server.ts b/src/cli/util/http-server.ts index f66d00f..00d65be 100644 --- a/src/cli/util/http-server.ts +++ b/src/cli/util/http-server.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import { NextFunction, Request, RequestHandler, Response } from 'express'; import { ErrorResponse } from '../../api/util.js'; +import createDebug from '../../util/debug.js'; import { temporary_http_errors, temporary_system_errors } from '../../util/errors.js'; const debug = createDebug('cli:util:http-server'); diff --git a/src/cli/util/remote-config.ts b/src/cli/util/remote-config.ts index 080beb4..f2e1e38 100644 --- a/src/cli/util/remote-config.ts +++ b/src/cli/util/remote-config.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../util.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase, Argv, YargsArguments } from '../../util/yargs.js'; const debug = createDebug('cli:util:remote-config'); diff --git a/src/cli/util/storage.ts b/src/cli/util/storage.ts index f6bdfe1..b468e92 100644 --- a/src/cli/util/storage.ts +++ b/src/cli/util/storage.ts @@ -1,6 +1,6 @@ import * as util from 'node:util'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../util.js'; +import createDebug from '../../util/debug.js'; import { Argv } from '../../util/yargs.js'; import { initStorage, iterateLocalStorage } from '../../util/storage.js'; import Table from './table.js'; diff --git a/src/cli/util/validate-discord-titles.ts b/src/cli/util/validate-discord-titles.ts index 8b683b9..9cc2f14 100644 --- a/src/cli/util/validate-discord-titles.ts +++ b/src/cli/util/validate-discord-titles.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -import createDebug from 'debug'; import type { Arguments as ParentArguments } from '../util.js'; +import createDebug from '../../util/debug.js'; import { ArgumentsCamelCase } from '../../util/yargs.js'; import * as publishers from '../../discord/titles/index.js'; diff --git a/src/client/coral.ts b/src/client/coral.ts index 88521d7..6a87ed3 100644 --- a/src/client/coral.ts +++ b/src/client/coral.ts @@ -1,10 +1,10 @@ -import createDebug from 'debug'; import { Response } from 'node-fetch'; import CoralApi, { CoralAuthData, Result, ZNCA_CLIENT_ID } from '../api/coral.js'; import { Announcements, Friends, Friend, GetActiveEventResult, WebServices, CoralErrorResponse } from '../api/coral-types.js'; +import ZncProxyApi from '../api/znc-proxy.js'; import { NintendoAccountSession, Storage } from './storage/index.js'; import { checkUseLimit } from './util.js'; -import ZncProxyApi from '../api/znc-proxy.js'; +import createDebug from '../util/debug.js'; import { ArgumentsCamelCase } from '../util/yargs.js'; import { initStorage } from '../util/storage.js'; import NintendoAccountOIDC from './na.js'; diff --git a/src/client/na.ts b/src/client/na.ts index a4e6c09..e8053f3 100644 --- a/src/client/na.ts +++ b/src/client/na.ts @@ -1,4 +1,4 @@ -import createDebug from 'debug'; +import createDebug from '../util/debug.js'; import { NintendoAccountSession } from './storage/index.js'; import { getNintendoAccountToken, getNintendoAccountUser, NintendoAccountToken, NintendoAccountUser } from '../api/na.js'; diff --git a/src/client/splatnet3.ts b/src/client/splatnet3.ts index 4dfc71e..e4cbf12 100644 --- a/src/client/splatnet3.ts +++ b/src/client/splatnet3.ts @@ -1,6 +1,6 @@ -import createDebug from 'debug'; import { Response } from 'node-fetch'; import { ConfigureAnalyticsResult, CurrentFestResult, DetailVotingStatusResult, FriendListResult, Friend_friendList, HomeResult, StageScheduleResult } from 'splatnet3-types/splatnet3'; +import createDebug from '../util/debug.js'; import { ZNCA_CLIENT_ID } from '../api/coral.js'; import { NintendoAccountSession, Storage } from './storage/index.js'; import SplatNet3Api, { PersistedQueryResult, SplatNet3AuthData } from '../api/splatnet3.js'; diff --git a/src/client/storage/index.ts b/src/client/storage/index.ts index 02ee5ca..3182806 100644 --- a/src/client/storage/index.ts +++ b/src/client/storage/index.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; import { SavedToken as SavedNaToken } from '../na.js'; diff --git a/src/client/storage/local.ts b/src/client/storage/local.ts index 546de93..746c3ed 100644 --- a/src/client/storage/local.ts +++ b/src/client/storage/local.ts @@ -1,8 +1,8 @@ import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; +import createDebug from '../../util/debug.js'; import { StorageProvider } from './index.js'; const debug = createDebug('nxapi:client:storage:local'); diff --git a/src/client/util.ts b/src/client/util.ts index 11f4240..4538574 100644 --- a/src/client/util.ts +++ b/src/client/util.ts @@ -1,4 +1,4 @@ -import createDebug from 'debug'; +import createDebug from '../util/debug.js'; import { LIMIT_PERIOD, LIMIT_REQUESTS } from '../common/auth/util.js'; import { NintendoAccountSession } from './storage/index.js'; diff --git a/src/common/auth/coral.ts b/src/common/auth/coral.ts index 4111117..dd0e759 100644 --- a/src/common/auth/coral.ts +++ b/src/common/auth/coral.ts @@ -1,11 +1,11 @@ -import createDebug from 'debug'; import * as persist from 'node-persist'; import { Response } from 'node-fetch'; -import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; -import { Jwt } from '../../util/jwt.js'; -import { CoralErrorResponse } from '../../api/coral-types.js'; import CoralApi, { CoralAuthData, ZNCA_CLIENT_ID } from '../../api/coral.js'; +import { CoralErrorResponse } from '../../api/coral-types.js'; import ZncProxyApi from '../../api/znc-proxy.js'; +import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; +import createDebug from '../../util/debug.js'; +import { Jwt } from '../../util/jwt.js'; import { checkUseLimit, SHOULD_LIMIT_USE } from './util.js'; const debug = createDebug('nxapi:auth:coral'); diff --git a/src/common/auth/moon.ts b/src/common/auth/moon.ts index 6bbf568..378a547 100644 --- a/src/common/auth/moon.ts +++ b/src/common/auth/moon.ts @@ -1,8 +1,8 @@ -import createDebug from 'debug'; import * as persist from 'node-persist'; import { Response } from 'node-fetch'; import { MoonAuthData, ZNMA_CLIENT_ID } from '../../api/moon.js'; import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; import MoonApi from '../../api/moon.js'; import { checkUseLimit, LIMIT_REQUESTS, SHOULD_LIMIT_USE } from './util.js'; diff --git a/src/common/auth/nooklink.ts b/src/common/auth/nooklink.ts index aa17bb4..70f2f22 100644 --- a/src/common/auth/nooklink.ts +++ b/src/common/auth/nooklink.ts @@ -1,10 +1,10 @@ -import createDebug from 'debug'; import persist from 'node-persist'; import { Response } from 'node-fetch'; import { getToken, Login } from './coral.js'; import NooklinkApi, { NooklinkAuthData, NooklinkUserApi, NooklinkUserAuthData } from '../../api/nooklink.js'; import { Users, WebServiceError } from '../../api/nooklink-types.js'; import { checkUseLimit, SHOULD_LIMIT_USE } from './util.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; diff --git a/src/common/auth/splatnet2.ts b/src/common/auth/splatnet2.ts index 2948a68..a1a3892 100644 --- a/src/common/auth/splatnet2.ts +++ b/src/common/auth/splatnet2.ts @@ -1,10 +1,10 @@ import process from 'node:process'; import * as fs from 'node:fs'; -import createDebug from 'debug'; import persist from 'node-persist'; import { getToken, Login } from './coral.js'; import SplatNet2Api, { SplatNet2AuthData, updateIksmSessionLastUsed } from '../../api/splatnet2.js'; import { checkUseLimit, SHOULD_LIMIT_USE } from './util.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; diff --git a/src/common/auth/splatnet3.ts b/src/common/auth/splatnet3.ts index f1b3343..67f7ae8 100644 --- a/src/common/auth/splatnet3.ts +++ b/src/common/auth/splatnet3.ts @@ -1,9 +1,9 @@ -import createDebug from 'debug'; import persist from 'node-persist'; import { Response } from 'node-fetch'; import { getToken, Login, SavedToken } from './coral.js'; import SplatNet3Api, { SplatNet3AuthData } from '../../api/splatnet3.js'; import { checkUseLimit, SHOULD_LIMIT_USE } from './util.js'; +import createDebug from '../../util/debug.js'; import { Jwt } from '../../util/jwt.js'; import { NintendoAccountSessionTokenJwtPayload } from '../../api/na.js'; import { ErrorResponse } from '../../api/util.js'; diff --git a/src/common/auth/util.ts b/src/common/auth/util.ts index 464c05b..67dc284 100644 --- a/src/common/auth/util.ts +++ b/src/common/auth/util.ts @@ -1,5 +1,5 @@ -import createDebug from 'debug'; import * as persist from 'node-persist'; +import createDebug from '../../util/debug.js'; const debug = createDebug('nxapi:auth:util'); diff --git a/src/common/globals.ts b/src/common/globals.ts index 9a10568..6586ec4 100644 --- a/src/common/globals.ts +++ b/src/common/globals.ts @@ -1,7 +1,7 @@ import * as path from 'node:path'; -import createDebug from 'debug'; import dotenv from 'dotenv'; import dotenvExpand from 'dotenv-expand'; +import createDebug from '../util/debug.js'; import { paths } from '../util/storage.js'; let done = false; diff --git a/src/common/notify.ts b/src/common/notify.ts index 3b01e38..21b7aa2 100644 --- a/src/common/notify.ts +++ b/src/common/notify.ts @@ -1,4 +1,3 @@ -import createDebug from 'debug'; import persist from 'node-persist'; import CoralApi from '../api/coral.js'; import { ActiveEvent, Announcements, CurrentUser, Friend, Game, Presence, PresenceState, WebServices, CoralErrorResponse, GetActiveEventResult } from '../api/coral-types.js'; @@ -6,10 +5,11 @@ import ZncProxyApi from '../api/znc-proxy.js'; import { ErrorResponse } from '../api/util.js'; import { SavedToken } from './auth/coral.js'; import { SplatNet2RecordsMonitor } from './splatnet2/monitor.js'; +import createDebug from '../util/debug.js'; import Loop, { LoopResult } from '../util/loop.js'; import { getTitleIdFromEcUrl, hrduration } from '../util/misc.js'; -import { CoralUser } from './users.js'; import { handleError } from '../util/errors.js'; +import { CoralUser } from './users.js'; const debug = createDebug('nxapi:nso:notify'); const debugFriends = createDebug('nxapi:nso:notify:friends'); diff --git a/src/common/presence.ts b/src/common/presence.ts index 20cecae..7bc3c3a 100644 --- a/src/common/presence.ts +++ b/src/common/presence.ts @@ -1,17 +1,16 @@ -import createDebug from 'debug'; import EventSource from 'eventsource'; import { DiscordRpcClient, findDiscordRpcClient } from '../discord/rpc.js'; import { getDiscordPresence, getInactiveDiscordPresence } from '../discord/util.js'; import { DiscordPresencePlayTime, DiscordPresenceContext, DiscordPresence, ExternalMonitorConstructor, ExternalMonitor, ErrorResult } from '../discord/types.js'; import { EmbeddedSplatNet2Monitor, ZncNotifications } from './notify.js'; -import { getPresenceFromUrl } from '../api/znc-proxy.js'; import { ActiveEvent, CurrentUser, Friend, Game, Presence, PresenceState, CoralErrorResponse } from '../api/coral-types.js'; +import { getPresenceFromUrl } from '../api/znc-proxy.js'; +import createDebug from '../util/debug.js'; import { ErrorResponse, ResponseSymbol } from '../api/util.js'; import Loop, { LoopResult } from '../util/loop.js'; -import { getTitleIdFromEcUrl } from '../index.js'; import { parseLinkHeader } from '../util/http.js'; import { getUserAgent } from '../util/useragent.js'; -import { TemporaryErrorSymbol } from '../util/misc.js'; +import { getTitleIdFromEcUrl, TemporaryErrorSymbol } from '../util/misc.js'; import { handleError } from '../util/errors.js'; const debug = createDebug('nxapi:nso:presence'); diff --git a/src/common/remote-config.ts b/src/common/remote-config.ts index f407f8b..53a619f 100644 --- a/src/common/remote-config.ts +++ b/src/common/remote-config.ts @@ -1,9 +1,9 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; import fetch from 'node-fetch'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; import { ErrorResponse, ResponseSymbol } from '../api/util.js'; +import createDebug from '../util/debug.js'; import { timeoutSignal } from '../util/misc.js'; import { getUserAgent } from '../util/useragent.js'; import { paths } from '../util/storage.js'; diff --git a/src/common/splatnet2/dump-records.ts b/src/common/splatnet2/dump-records.ts index 1c5c873..986a7a8 100644 --- a/src/common/splatnet2/dump-records.ts +++ b/src/common/splatnet2/dump-records.ts @@ -2,10 +2,10 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; import * as crypto from 'node:crypto'; import { Buffer } from 'node:buffer'; -import createDebug from 'debug'; import fetch from 'node-fetch'; import SplatNet2Api, { ShareColour } from '../../api/splatnet2.js'; import { Challenge, NicknameAndIcon, Records, Stages } from '../../api/splatnet2-types.js'; +import createDebug from '../../util/debug.js'; import { timeoutSignal } from '../../util/misc.js'; const debug = createDebug('nxapi:splatnet2:dump-records'); diff --git a/src/common/splatnet2/dump-results.ts b/src/common/splatnet2/dump-results.ts index c6c3bcf..62a4e84 100644 --- a/src/common/splatnet2/dump-results.ts +++ b/src/common/splatnet2/dump-results.ts @@ -1,10 +1,10 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; import { Buffer } from 'node:buffer'; -import createDebug from 'debug'; import fetch from 'node-fetch'; import SplatNet2Api from '../../api/splatnet2.js'; import { NicknameAndIcon } from '../../api/splatnet2-types.js'; +import createDebug from '../../util/debug.js'; import { timeoutSignal } from '../../util/misc.js'; const debug = createDebug('nxapi:splatnet2:dump-results'); diff --git a/src/common/splatnet2/monitor.ts b/src/common/splatnet2/monitor.ts index 2d12fa8..ccd452e 100644 --- a/src/common/splatnet2/monitor.ts +++ b/src/common/splatnet2/monitor.ts @@ -1,6 +1,5 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import persist from 'node-persist'; import mkdirp from 'mkdirp'; import SplatNet2Api from '../../api/splatnet2.js'; @@ -9,6 +8,7 @@ import { Records, Stages, WebServiceError } from '../../api/splatnet2-types.js'; import { dumpCoopResults, dumpResults } from './dump-results.js'; import { dumpProfileImage, dumpRecords } from './dump-records.js'; import { ErrorResponse } from '../../api/util.js'; +import createDebug from '../../util/debug.js'; import Loop, { LoopResult } from '../../util/loop.js'; const debug = createDebug('nxapi:splatnet2:monitor'); diff --git a/src/common/update.ts b/src/common/update.ts index c87ddd9..c5b8de7 100644 --- a/src/common/update.ts +++ b/src/common/update.ts @@ -1,8 +1,8 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; import fetch from 'node-fetch'; -import createDebug from 'debug'; import mkdirp from 'mkdirp'; +import createDebug from '../util/debug.js'; import { dir, docker, version } from '../util/product.js'; import { paths } from '../util/storage.js'; import { timeoutSignal } from '../util/misc.js'; diff --git a/src/common/users.ts b/src/common/users.ts index 9cd5174..994a1c7 100644 --- a/src/common/users.ts +++ b/src/common/users.ts @@ -1,6 +1,6 @@ import * as crypto from 'node:crypto'; -import createDebug from 'debug'; import * as persist from 'node-persist'; +import createDebug from '../util/debug.js'; import CoralApi, { Result } from '../api/coral.js'; import ZncProxyApi from '../api/znc-proxy.js'; import { Announcements, Friends, Friend, GetActiveEventResult, CoralSuccessResponse, WebService, WebServices } from '../api/coral-types.js'; diff --git a/src/discord/monitor/splatoon3.ts b/src/discord/monitor/splatoon3.ts index a54a328..f3135b8 100644 --- a/src/discord/monitor/splatoon3.ts +++ b/src/discord/monitor/splatoon3.ts @@ -1,18 +1,18 @@ -import createDebug from 'debug'; import persist from 'node-persist'; import DiscordRPC from 'discord-rpc'; import { BankaraMatchMode, BankaraMatchSetting, CoopRule, CoopSchedule_schedule, CoopSetting_schedule, DetailVotingStatusResult, FestMatchSetting, FestTeam_schedule, FestTeam_votingStatus, Fest_schedule, FriendListResult, FriendOnlineState, GraphQLSuccessResponse, LeagueMatchSetting, RegularMatchSetting, StageScheduleResult, VsSchedule_bankara, VsSchedule_fest, VsSchedule_league, VsSchedule_regular, VsSchedule_xMatch, XMatchSetting } from 'splatnet3-types/splatnet3'; +import StageScheduleQuery_730cd98 from 'splatnet3-types/graphql/730cd98e84f1030d3e9ac86b6f1aae13'; import { Game } from '../../api/coral-types.js'; import SplatNet3Api from '../../api/splatnet3.js'; import { DiscordPresenceExternalMonitorsConfiguration } from '../../app/common/types.js'; import { Arguments } from '../../cli/nso/presence.js'; import { getBulletToken, SavedBulletToken } from '../../common/auth/splatnet3.js'; import { ExternalMonitorPresenceInterface } from '../../common/presence.js'; +import createDebug from '../../util/debug.js'; import { EmbeddedLoop, LoopResult } from '../../util/loop.js'; import { ArgumentsCamelCase } from '../../util/yargs.js'; -import { DiscordPresenceContext, ErrorResult } from '../types.js'; import { product } from '../../util/product.js'; -import StageScheduleQuery_730cd98 from 'splatnet3-types/graphql/730cd98e84f1030d3e9ac86b6f1aae13'; +import { DiscordPresenceContext, ErrorResult } from '../types.js'; const debug = createDebug('nxapi:discord:splatnet3'); diff --git a/src/discord/rpc.ts b/src/discord/rpc.ts index dff2e83..06bb5e3 100644 --- a/src/discord/rpc.ts +++ b/src/discord/rpc.ts @@ -1,11 +1,11 @@ import process from 'node:process'; import * as net from 'node:net'; import { EventEmitter } from 'node:events'; -import createDebug from 'debug'; import fetch from 'node-fetch'; import DiscordRPC from 'discord-rpc'; // @ts-expect-error import __BaseIpcTransport from 'discord-rpc/src/transports/ipc.js'; +import createDebug from '../util/debug.js'; const debug = createDebug('nxapi:discord:rpc'); diff --git a/src/discord/util.ts b/src/discord/util.ts index bfe6193..0686dcc 100644 --- a/src/discord/util.ts +++ b/src/discord/util.ts @@ -1,7 +1,7 @@ -import createDebug from 'debug'; import DiscordRPC from 'discord-rpc'; import { Game, PresenceState } from '../api/coral-types.js'; import { defaultTitle, titles } from './titles.js'; +import createDebug from '../util/debug.js'; import { product, version } from '../util/product.js'; import { getTitleIdFromEcUrl, hrduration } from '../util/misc.js'; import { DiscordPresence, DiscordPresenceContext, DiscordPresencePlayTime } from './types.js'; diff --git a/src/util/debug.ts b/src/util/debug.ts new file mode 100644 index 0000000..713ecd7 --- /dev/null +++ b/src/util/debug.ts @@ -0,0 +1,181 @@ +import { WriteStream } from 'node:fs'; +import { FileHandle, open, opendir, stat, unlink } from 'node:fs/promises'; +import * as util from 'node:util'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import createDebug from 'debug'; +import mkdirp from 'mkdirp'; +import { dev, dir, docker, git, product, release, version } from './product.js'; + +const MAX_FILE_SIZE = 1000 * 1000 * 2; // 2 MB +const DELETE_AFTER_MS = 1000 * 60 * 60 * 24 * 14; // 14 days + +createDebug.log = console.warn.bind(console); + +export default new Proxy(createDebug, { + apply(target, thisArg, args: [string]) { + const debug = target.apply(thisArg, args); + + return new Proxy(debug, handler); + }, +}); + +const handler: ProxyHandler = { + apply(target, thisArg, args: [formatter: any, ...args: any[]]) { + if (log_file) { + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + applyFormatters(args, target); + + writeToFile(target.namespace, args); + + args[0] = args[0].replace(/%/g, '%%'); + } + + return target.apply(thisArg, args); + }, +}; + +const debug = new Proxy(createDebug('nxapi:util:debug'), handler); +debug.enabled = true; + +function applyFormatters(args: [formatter: string, ...args: unknown[]], self = debug) { + // https://github.com/debug-js/debug/blob/d1616622e4d404863c5a98443f755b4006e971dc/src/common.js#L89-L107 + + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return '%'; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + return args; +} + +function writeToFile(namespace: string, _args: [formatter: string, ...args: unknown[]], skip_new = false) { + if (!log_file) return; + + const [formatter, ...args] = _args; + + const data = (new Date()).toISOString() + ' ' + namespace + ' ' + + util.format(formatter, ...args).replace(/\u001B\[[0-9;]*m/g, '') + '\n'; + const buffer = (new TextEncoder()).encode(data); + + const [, stream, path, start, i] = log_file; + + stream.write(buffer); + log_file[5] += buffer.length; + + if (!skip_new && log_file[5] !== buffer.length && log_file[5] >= MAX_FILE_SIZE && !log_file[6]) { + log_file[6] = openLogFile(path, start, i + 1).catch(err => { + if (log_file) log_file[6] = null; + + debug('Error opening next log file', path, start, i + 1, err); + }); + } +} + +let log_file: [ + handle: FileHandle, stream: WriteStream, + path: string, start: Date, i: number, bytes: number, replace: Promise | null, +] | null = null; + +export async function init(path: string | URL, ignore_errors = true) { + if (log_file) throw new Error('Already initialised log file'); + + if (path instanceof URL) path = fileURLToPath(path); + + const start = new Date(); + + try { + await openLogFile(path, start); + } catch (err) { + if (!ignore_errors) throw err; + + debug('Error opening log file', path); + } + + deleteOldLogs(path).catch(err => { + debug('Error deleting old logs', path, err); + }); +} + +async function openLogFile(path: string, start: Date, i = 0) { + const filename = + start.toISOString().replace(/^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)\..*/, '$1$2$3-$4$5') + + '-' + process.pid + '-' + i + '.log'; + const file = join(path, filename); + + await mkdirp(path, {mode: 0o700}); + + const file_handle = await open(file, 'a', 0o600); + const stream = file_handle.createWriteStream(); + + if (log_file) { + const [prev_handle, prev_stream] = log_file; + prev_stream.close(); + prev_handle.close(); + } + + log_file = [file_handle, stream, path, start, i, 0, null]; + + debug('start log file %s', file); + + if (i === 0) { + writeToFile('nxapi:util:debug', applyFormatters(['product %O, versions %O', { + dir, version, release, docker, git, dev, product, + }, process.versions]), true); + writeToFile('nxapi:util:debug', applyFormatters(['argv %O', process.argv]), true); + writeToFile('nxapi:util:debug', applyFormatters(['env %O', process.env]), true); + } +} + +async function deleteOldLogs(path: string) { + // Files that will be excluded by recently_accessed may not be included + const log_files: [id: string, name: string][] = []; + const recently_accessed: string[] = []; + + for await (const dirent of await opendir(path)) { + if (!dirent.isFile()) continue; + + const match = dirent.name.match(/^(((\d+)-(\d+))-(\d+))(-(\d+))?\.log$/); + if (!match) continue; + + const [, id, datetime, date, time, pid, i] = match; + if (recently_accessed.includes(id)) continue; + + const stats = await stat(join(path, dirent.name)); + + if ((stats.mtimeMs + DELETE_AFTER_MS) >= Date.now()) { + recently_accessed.push(id); + continue; + } + + log_files.push([id, dirent.name]); + } + + const to_delete = log_files.filter(([id, name]) => !recently_accessed.includes(id)); + + for (const [id, name] of to_delete) { + const file = join(path, name); + debug('delete old log file', file); + await unlink(file); + } +} diff --git a/src/util/errors.ts b/src/util/errors.ts index c845829..ed4fcca 100644 --- a/src/util/errors.ts +++ b/src/util/errors.ts @@ -1,9 +1,9 @@ -import createDebug from 'debug'; import { AbortError } from 'node-fetch'; +import createDebug from './debug.js'; import Loop, { LoopResult } from './loop.js'; +import { TemporaryErrorSymbol } from './misc.js'; import { CoralErrorResponse } from '../api/coral-types.js'; import { ErrorResponse } from '../api/util.js'; -import { TemporaryErrorSymbol } from './misc.js'; const debug = createDebug('nxapi:util:errors'); diff --git a/src/util/jwt.ts b/src/util/jwt.ts index c912991..d35d8ca 100644 --- a/src/util/jwt.ts +++ b/src/util/jwt.ts @@ -1,8 +1,8 @@ import * as crypto from 'node:crypto'; import { Buffer } from 'node:buffer'; -import createDebug from 'debug'; import persist from 'node-persist'; import fetch from 'node-fetch'; +import createDebug from './debug.js'; import { timeoutSignal } from './misc.js'; const debug = createDebug('nxapi:util:jwt'); diff --git a/src/util/loop.ts b/src/util/loop.ts index 44acf27..6084488 100644 --- a/src/util/loop.ts +++ b/src/util/loop.ts @@ -1,4 +1,4 @@ -import createDebug from 'debug'; +import createDebug from './debug.js'; const debug = createDebug('nxapi:util:loop'); diff --git a/src/util/product.ts b/src/util/product.ts index ba941ee..e44a092 100644 --- a/src/util/product.ts +++ b/src/util/product.ts @@ -3,6 +3,11 @@ import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as fs from 'node:fs/promises'; import * as util from 'node:util'; +import getPaths from 'env-paths'; + +// This file is used by debug.ts +// debug is only used before this module completes execution, so logging to a +// file will not have been initialised then anyway import createDebug from 'debug'; const debug = createDebug('nxapi:util:product'); @@ -79,3 +84,5 @@ export const dev = process.env.NODE_ENV !== 'production' && export const product = 'nxapi ' + version + (!release && git ? '-' + git.revision.substr(0, 7) + (git.branch ? ' (' + git.branch + ')' : '') : !release ? '-?' : ''); + +export const paths = getPaths('nxapi'); diff --git a/src/util/storage.ts b/src/util/storage.ts index b0791b8..35f21e7 100644 --- a/src/util/storage.ts +++ b/src/util/storage.ts @@ -1,12 +1,11 @@ import * as path from 'node:path'; import * as fs from 'node:fs/promises'; -import createDebug from 'debug'; import persist from 'node-persist'; -import getPaths from 'env-paths'; +import createDebug from './debug.js'; const debug = createDebug('nxapi:util:storage'); -export const paths = getPaths('nxapi'); +export { paths } from './product.js'; export async function initStorage(dir: string) { const storage = persist.create({