Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion api/.env.development
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,13 @@ PATHS_LOGS_FILE=./dev/log/graphql-api.log
PATHS_CONNECT_STATUS_FILE_PATH=./dev/connectStatus.json # Connect plugin status file
PATHS_OIDC_JSON=./dev/configs/oidc.local.json
PATHS_LOCAL_SESSION_FILE=./dev/local-session
PATHS_CONNECT_STATUS=./dev/states/connectStatus.json # Connect status file for development
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add quotes around the value on line 22.

The .env file format requires quoted values for consistent parsing by dotenv libraries.

Apply this fix:

-PATHS_CONNECT_STATUS=./dev/states/connectStatus.json # Connect status file for development
+PATHS_CONNECT_STATUS="./dev/states/connectStatus.json" # Connect status file for development
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
PATHS_CONNECT_STATUS=./dev/states/connectStatus.json # Connect status file for development
PATHS_CONNECT_STATUS="./dev/states/connectStatus.json" # Connect status file for development
🧰 Tools
🪛 dotenv-linter (4.0.0)

[warning] 22-22: [UnorderedKey] The PATHS_CONNECT_STATUS key should go before the PATHS_CONNECT_STATUS_FILE_PATH key

(UnorderedKey)


[warning] 22-22: [ValueWithoutQuotes] This value needs to be surrounded in quotes

(ValueWithoutQuotes)

🤖 Prompt for AI Agents
In api/.env.development around line 22, the PATHS_CONNECT_STATUS value is
unquoted; update the line to wrap the value in quotes so dotenv parsers handle
it consistently (e.g., change
PATHS_CONNECT_STATUS=./dev/states/connectStatus.json to
PATHS_CONNECT_STATUS="./dev/states/connectStatus.json").

ENVIRONMENT="development"
NODE_ENV="development"
PORT="3001"
PLAYGROUND=true
INTROSPECTION=true
MOTHERSHIP_GRAPHQL_LINK="http://authenticator:3000/graphql"
MOTHERSHIP_BASE_URL="http://localhost:8787"
NODE_TLS_REJECT_UNAUTHORIZED=0
BYPASS_PERMISSION_CHECKS=false
BYPASS_CORS_CHECKS=true
Expand Down
11 changes: 11 additions & 0 deletions api/dev/keys/7789353b-40f4-4f3b-a230-b1f22909abff.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"createdAt": "2025-07-19T22:29:38.790Z",
"description": "Internal API Key Used By Unraid Connect to access your server resources for the connect.myunraid.net dashboard",
"id": "7789353b-40f4-4f3b-a230-b1f22909abff",
"key": "e6e0212193fa1cb468194dd5a4e41196305bc3b5e38532c2f86935bbde317bd0",
"name": "ConnectInternal",
"permissions": [],
"roles": [
"CONNECT"
]
}
7 changes: 7 additions & 0 deletions api/dev/states/connectStatus.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"connectionStatus": "PRE_INIT",
"error": null,
"lastPing": null,
"allowedOrigins": "",
"timestamp": 1753974976746
}
133 changes: 133 additions & 0 deletions api/generated-schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -2110,6 +2110,136 @@ type UPSConfiguration {
modelName: String
}

type UPSBattery {
"""
Battery charge level as a percentage (0-100). Unit: percent (%). Example: 100 means battery is fully charged
"""
chargeLevel: Int!

"""
Estimated runtime remaining on battery power. Unit: seconds. Example: 3600 means 1 hour of runtime remaining
"""
estimatedRuntime: Int!

"""
Battery health status. Possible values: 'Good', 'Replace', 'Unknown'. Indicates if the battery needs replacement
"""
health: String!
}

type UPSPower {
"""
Input voltage from the wall outlet/mains power. Unit: volts (V). Example: 120.5 for typical US household voltage
"""
inputVoltage: Float!

"""
Output voltage being delivered to connected devices. Unit: volts (V). Example: 120.5 - should match input voltage when on mains power
"""
outputVoltage: Float!

"""
Current load on the UPS as a percentage of its capacity. Unit: percent (%). Example: 25 means UPS is loaded at 25% of its maximum capacity
"""
loadPercentage: Int!
}

type UPSDevice {
"""
Unique identifier for the UPS device. Usually based on the model name or a generated ID
"""
id: ID!

"""Display name for the UPS device. Can be customized by the user"""
name: String!

"""UPS model name/number. Example: 'APC Back-UPS Pro 1500'"""
model: String!

"""
Current operational status of the UPS. Common values: 'Online', 'On Battery', 'Low Battery', 'Replace Battery', 'Overload', 'Offline'. 'Online' means running on mains power, 'On Battery' means running on battery backup
"""
status: String!

"""Battery-related information"""
battery: UPSBattery!

"""Power-related information"""
power: UPSPower!
}

type UPSConfiguration {
"""
UPS service state. Values: 'enable' or 'disable'. Controls whether the UPS monitoring service is running
"""
service: String

"""
Type of cable connecting the UPS to the server. Common values: 'usb', 'smart', 'ether', 'custom'. Determines communication protocol
"""
upsCable: String

"""
Custom cable configuration string. Only used when upsCable is set to 'custom'. Format depends on specific UPS model
"""
customUpsCable: String

"""
UPS communication type. Common values: 'usb', 'net', 'snmp', 'dumb', 'pcnet', 'modbus'. Defines how the server communicates with the UPS
"""
upsType: String

"""
Device path or network address for UPS connection. Examples: '/dev/ttyUSB0' for USB, '192.168.1.100:3551' for network. Depends on upsType setting
"""
device: String

"""
Override UPS capacity for runtime calculations. Unit: volt-amperes (VA). Example: 1500 for a 1500VA UPS. Leave unset to use UPS-reported capacity
"""
overrideUpsCapacity: Int

"""
Battery level threshold for shutdown. Unit: percent (%). Example: 10 means shutdown when battery reaches 10%. System will shutdown when battery drops to this level
"""
batteryLevel: Int

"""
Runtime threshold for shutdown. Unit: minutes. Example: 5 means shutdown when 5 minutes runtime remaining. System will shutdown when estimated runtime drops below this
"""
minutes: Int

"""
Timeout for UPS communications. Unit: seconds. Example: 0 means no timeout. Time to wait for UPS response before considering it offline
"""
timeout: Int

"""
Kill UPS power after shutdown. Values: 'yes' or 'no'. If 'yes', tells UPS to cut power after system shutdown. Useful for ensuring complete power cycle
"""
killUps: String

"""
Network Information Server (NIS) IP address. Default: '0.0.0.0' (listen on all interfaces). IP address for apcupsd network information server
"""
nisIp: String

"""
Network server mode. Values: 'on' or 'off'. Enable to allow network clients to monitor this UPS
"""
netServer: String

"""
UPS name for network monitoring. Used to identify this UPS on the network. Example: 'SERVER_UPS'
"""
upsName: String

"""
Override UPS model name. Used for display purposes. Leave unset to use UPS-reported model
"""
modelName: String
}

type VmDomain implements Node {
"""The unique identifier for the vm (uuid)"""
id: PrefixedID!
Expand Down Expand Up @@ -2396,6 +2526,9 @@ type Query {
logFile(path: String!, lines: Int, startLine: Int): LogFileContent!
settings: Settings!
isSSOEnabled: Boolean!
upsDevices: [UPSDevice!]!
upsDeviceById(id: String!): UPSDevice
upsConfiguration: UPSConfiguration!

"""Get public OIDC provider information for login buttons"""
publicOidcProviders: [PublicOidcProvider!]!
Expand Down
8 changes: 4 additions & 4 deletions api/src/environment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@ export const LOG_LEVEL = process.env.LOG_LEVEL
? 'INFO'
: 'DEBUG';
export const SUPPRESS_LOGS = process.env.SUPPRESS_LOGS === 'true';
export const MOTHERSHIP_GRAPHQL_LINK = process.env.MOTHERSHIP_GRAPHQL_LINK
? process.env.MOTHERSHIP_GRAPHQL_LINK
export const MOTHERSHIP_BASE_URL = process.env.MOTHERSHIP_BASE_URL
? process.env.MOTHERSHIP_BASE_URL
: ENVIRONMENT === 'staging'
? 'https://staging.mothership.unraid.net/ws'
: 'https://mothership.unraid.net/ws';
? 'https://staging.mothership.unraid.net'
: 'https://mothership.unraid.net';

export const PM2_HOME = process.env.PM2_HOME ?? '/var/log/.pm2';
export const PM2_PATH = join(import.meta.dirname, '../../', 'node_modules', 'pm2', 'bin', 'pm2');
Expand Down
9 changes: 9 additions & 0 deletions api/src/unraid-api/unraid-file-modifier/file-modification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { applyPatch, createPatch, parsePatch, reversePatch } from 'diff';
import { coerce, compare, gte, lte } from 'semver';

import { getUnraidVersion } from '@app/common/dashboard/get-unraid-version.js';
import { NODE_ENV } from '@app/environment.js';

export type ModificationEffect = 'nginx:reload';

Expand Down Expand Up @@ -225,6 +226,14 @@ export abstract class FileModification {
throw new Error('Invalid file modification configuration');
}

// Skip file modifications in development mode
if (NODE_ENV === 'development') {
return {
shouldApply: false,
reason: 'File modifications are disabled in development mode',
};
}

const fileExists = await access(this.filePath, constants.R_OK | constants.W_OK)
.then(() => true)
.catch(() => false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
import { ConfigService } from '@nestjs/config';

import type { ModificationEffect } from '@app/unraid-api/unraid-file-modifier/file-modification.js';
import { NODE_ENV } from '@app/environment.js';
import { FileModificationEffectService } from '@app/unraid-api/unraid-file-modifier/file-modification-effect.service.js';
import { FileModification } from '@app/unraid-api/unraid-file-modifier/file-modification.js';

Expand All @@ -29,6 +30,11 @@ export class UnraidFileModificationService
*/
async onModuleInit() {
try {
if (NODE_ENV === 'development') {
this.logger.log('Skipping file modifications in development mode');
return;
}

this.logger.log('Loading file modifications...');
const mods = await this.loadModifications();
await this.applyModifications(mods);
Expand Down
21 changes: 1 addition & 20 deletions packages/unraid-api-plugin-connect/codegen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,7 @@ const config: CodegenConfig = {
},
},
generates: {
// Generate Types for Mothership GraphQL Client
'src/graphql/generated/client/': {
documents: './src/graphql/**/*.ts',
schema: {
[process.env.MOTHERSHIP_GRAPHQL_LINK ?? 'https://staging.mothership.unraid.net/ws']: {
headers: {
origin: 'https://forums.unraid.net',
},
},
},
preset: 'client',
presetConfig: {
gqlTagName: 'graphql',
},
config: {
useTypeImports: true,
withObjectType: true,
},
plugins: [{ add: { content: '/* eslint-disable */' } }],
},
// No longer generating mothership GraphQL types since we switched to WebSocket-based UnraidServerClient
},
};

Expand Down
3 changes: 2 additions & 1 deletion packages/unraid-api-plugin-connect/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"build": "tsc",
"prepare": "npm run build",
"format": "prettier --write \"src/**/*.{ts,js,json}\"",
"codegen": "MOTHERSHIP_GRAPHQL_LINK='https://staging.mothership.unraid.net/ws' graphql-codegen --config codegen.ts"
"codegen": "graphql-codegen --config codegen.ts"
},
"keywords": [
"unraid",
Expand Down Expand Up @@ -57,6 +57,7 @@
"jose": "6.0.13",
"lodash-es": "4.17.21",
"nest-authz": "2.17.0",
"pify": "^6.1.0",
"prettier": "3.6.2",
"rimraf": "6.0.1",
"rxjs": "7.8.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ export class CloudService {

private async hardCheckCloud(apiVersion: string, apiKey: string): Promise<CloudResponse> {
try {
const mothershipGqlUri = this.configService.getOrThrow<string>('MOTHERSHIP_GRAPHQL_LINK');
const mothershipGqlUri = this.configService.getOrThrow<string>('MOTHERSHIP_BASE_URL');
const ip = await this.checkDns();
const { canReach, baseUrl } = await this.canReachMothership(
mothershipGqlUri,
Expand Down Expand Up @@ -204,7 +204,7 @@ export class CloudService {
}

private async hardCheckDns() {
const mothershipGqlUri = this.configService.getOrThrow<string>('MOTHERSHIP_GRAPHQL_LINK');
const mothershipGqlUri = this.configService.getOrThrow<string>('MOTHERSHIP_BASE_URL');
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Search for all references to MOTHERSHIP_BASE_URL and MOTHERSHIP_GRAPHQL_LINK
echo "=== MOTHERSHIP_BASE_URL references ==="
rg -n "MOTHERSHIP_BASE_URL" --type ts --type tsx --type js --type jsx

echo -e "\n=== MOTHERSHIP_GRAPHQL_LINK references ==="
rg -n "MOTHERSHIP_GRAPHQL_LINK" --type ts --type tsx --type js --type jsx

echo -e "\n=== Environment configuration files ==="
fd -e env -e env.example --type f

Repository: unraid/api

Length of output: 250


🏁 Script executed:

# Retry search without problematic file types
echo "=== MOTHERSHIP_BASE_URL references ==="
rg -n "MOTHERSHIP_BASE_URL"

echo -e "\n=== MOTHERSHIP_GRAPHQL_LINK references ==="
rg -n "MOTHERSHIP_GRAPHQL_LINK"

echo -e "\n=== Environment files ==="
find . -name ".env*" -type f | grep -v node_modules | head -20

Repository: unraid/api

Length of output: 1773


🏁 Script executed:

# Read the cloud.service.ts file to understand the context
cat -n packages/unraid-api-plugin-connect/src/connection-status/cloud.service.ts | sed -n '90,110p'

echo -e "\n=== Context around line 207 ==="
cat -n packages/unraid-api-plugin-connect/src/connection-status/cloud.service.ts | sed -n '200,220p'

echo -e "\n=== Check environment.ts for MOTHERSHIP_BASE_URL ==="
rg -n "MOTHERSHIP_BASE_URL" api/src/environment.ts

Repository: unraid/api

Length of output: 2233


🏁 Script executed:

# Check environment.ts for configuration definitions
cat -n api/src/environment.ts | sed -n '90,105p'

echo -e "\n=== Full search for MOTHERSHIP_BASE_URL in entire repo ==="
find . -type f \( -name "*.ts" -o -name "*.js" -o -name ".env*" \) ! -path "*/node_modules/*" -exec grep -l "MOTHERSHIP_BASE_URL" {} \;

Repository: unraid/api

Length of output: 1184


🏁 Script executed:

# Check .env.development for MOTHERSHIP_BASE_URL
cat -n api/.env.development | grep -A2 -B2 "MOTHERSHIP"

echo -e "\n=== Full content of .env.development ==="
cat api/.env.development

Repository: unraid/api

Length of output: 2102


🏁 Script executed:

# Check other .env files for MOTHERSHIP_BASE_URL
echo "=== .env.staging ==="
grep "MOTHERSHIP" api/.env.staging

echo -e "\n=== .env.production ==="
grep "MOTHERSHIP" api/.env.production

echo -e "\n=== .env.test ==="
grep "MOTHERSHIP" api/.env.test

echo -e "\n=== plugin/.env.example ==="
grep "MOTHERSHIP" plugin/.env.example

echo -e "\n=== Check if MOTHERSHIP_BASE_URL should be in environment.ts ==="
rg -n "export const MOTHERSHIP" api/src/environment.ts

Repository: unraid/api

Length of output: 417


🏁 Script executed:

# Verify configService type and how it accesses config
rg -n "configService.getOrThrow" packages/unraid-api-plugin-connect/src/connection-status/cloud.service.ts | head -5

echo -e "\n=== Check ConfigService implementation ==="
fd -n "config.service" packages/unraid-api-plugin-connect/src --type f

echo -e "\n=== Check if there's a NestJS ConfigModule setup ==="
rg -n "ConfigModule" packages/unraid-api-plugin-connect/src --type ts | head -10

Repository: unraid/api

Length of output: 1415


Critical: Incomplete refactoring with missing environment configuration for MOTHERSHIP_BASE_URL.

Line 207 uses MOTHERSHIP_BASE_URL, but this config key is only defined in .env.development and missing from .env.staging, .env.production, and .env.test. Additionally, it is not exported from environment.ts like MOTHERSHIP_GRAPHQL_LINK is, causing configService.getOrThrow() to fail at runtime in non-development environments.

Furthermore, hardCheckCloud (line 96) still uses MOTHERSHIP_GRAPHQL_LINK, creating an inconsistency where DNS resolution (hardCheckDns, line 207) validates a different configuration than what canReachMothership and checkMothershipAuthentication use (line 98–106). The variable name mothershipGqlUri on line 207 is misleading when assigned a base URL instead of a GraphQL URL.

Required fixes:

  1. Add MOTHERSHIP_BASE_URL to all .env.* files (staging, production, test) with appropriate values
  2. Export MOTHERSHIP_BASE_URL from api/src/environment.ts with defaults, matching the pattern used for MOTHERSHIP_GRAPHQL_LINK
  3. Decide on the intended behavior:
    • If both URLs should be identical, update line 96 to use MOTHERSHIP_BASE_URL and rename variables consistently
    • If URLs intentionally differ, document why DNS checks validate a different hostname than connection attempts
  4. Rename mothershipGqlUri to mothershipBaseUrl on line 207 for clarity
🤖 Prompt for AI Agents
In packages/unraid-api-plugin-connect/src/connection-status/cloud.service.ts
around line 207 (and related usages at lines ~96 and 98–106), the code reads
MOTHERSHIP_BASE_URL via configService.getOrThrow while that key is missing from
non-development .env files and not exported from api/src/environment.ts, and
there is an inconsistency between hardCheckCloud (using MOTHERSHIP_GRAPHQL_LINK)
and DNS checks (using MOTHERSHIP_BASE_URL) plus a misleading variable name
mothershipGqlUri; fix by (1) adding MOTHERSHIP_BASE_URL to all
.env.staging/.env.production/.env.test with appropriate values, (2) export
MOTHERSHIP_BASE_URL from api/src/environment.ts with a sensible default
following the existing MOTHERSHIP_GRAPHQL_LINK pattern, (3) decide whether the
base URL and GraphQL link should be the same—if yes, change hardCheckCloud to
use MOTHERSHIP_BASE_URL and align variable names; if they must differ, add
comments documenting why DNS checks validate a different host than connection
attempts, and (4) rename mothershipGqlUri to mothershipBaseUrl at line 207 and
update any usages to reflect the consistent naming.

const hostname = new URL(mothershipGqlUri).host;
const lookup = promisify(lookupDNS);
const resolve = promisify(resolveDNS);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Injectable, Logger, OnApplicationBootstrap, OnModuleDestroy } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { OnEvent } from '@nestjs/event-emitter';
import { unlink, writeFile } from 'fs/promises';
import { mkdir, unlink, writeFile } from 'fs/promises';
import { dirname } from 'path';

import { ConfigType, ConnectionMetadata } from '../config/connect.config.js';
import { EVENTS } from '../helper/nest-tokens.js';
Expand All @@ -13,8 +14,8 @@ export class ConnectStatusWriterService implements OnApplicationBootstrap, OnMod
private logger = new Logger(ConnectStatusWriterService.name);

get statusFilePath() {
// Use environment variable if provided, otherwise use default path
return process.env.PATHS_CONNECT_STATUS_FILE_PATH ?? '/var/local/emhttp/connectStatus.json';
// Use environment variable if set, otherwise default to /var/local/emhttp/connectStatus.json
return this.configService.get('PATHS_CONNECT_STATUS') || '/var/local/emhttp/connectStatus.json';
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Fix critical path handling issue causing pipeline failures.

The pipeline failures indicate that configService.get('PATHS_CONNECT_STATUS') is returning an object instead of a string, causing a TypeError when passed to dirname().

The issue is likely that the configuration value is not being properly typed or retrieved. Apply this fix:

get statusFilePath() {
-    // Use environment variable if set, otherwise default to /var/local/emhttp/connectStatus.json
-    return this.configService.get('PATHS_CONNECT_STATUS') || '/var/local/emhttp/connectStatus.json';
+    // Use environment variable if set, otherwise default to /var/local/emhttp/connectStatus.json
+    return this.configService.get<string>('PATHS_CONNECT_STATUS') || '/var/local/emhttp/connectStatus.json';
}

Run this script to verify the configuration service implementation:


🏁 Script executed:

#!/bin/bash
# Description: Check how PATHS_CONNECT_STATUS is configured in the environment and config service

# Find configuration files that might define PATHS_CONNECT_STATUS
rg -n "PATHS_CONNECT_STATUS" --type json --type ts

# Look for ConfigService usage patterns
ast-grep --pattern 'configService.get($$$)'

Length of output: 428


Enforce string type and validate PATHS_CONNECT_STATUS to prevent TypeError

Ensure the config value is both statically typed and runtime-validated in connect-status-writer.service.ts so that a non-string never reaches dirname().

• File: packages/unraid-api-plugin-connect/src/connection-status/connect-status-writer.service.ts
Method: statusFilePath

get statusFilePath(): string {
-    // Use environment variable if set, otherwise default to /var/local/emhttp/connectStatus.json
-    return this.configService.get('PATHS_CONNECT_STATUS') || '/var/local/emhttp/connectStatus.json';
+    // Use environment variable if set, otherwise default to /var/local/emhttp/connectStatus.json
+    const rawPath = this.configService.get<string>('PATHS_CONNECT_STATUS');
+    if (typeof rawPath !== 'string') {
+        throw new TypeError(
+            `Invalid config "PATHS_CONNECT_STATUS": expected string, received ${typeof rawPath}`
+        );
+    }
+    return rawPath || '/var/local/emhttp/connectStatus.json';
}

Also verify in your configuration files (JSON, .env or TS) that PATHS_CONNECT_STATUS is defined as a string.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
packages/unraid-api-plugin-connect/src/connection-status/connect-status-writer.service.ts
around lines 17 to 19, the config value for PATHS_CONNECT_STATUS should be
explicitly checked to ensure it is a string before returning it. Update the
statusFilePath method to validate the type of the config value at runtime,
returning the default path only if the config value is either undefined or not a
string. Also, verify that PATHS_CONNECT_STATUS is defined as a string in all
configuration files such as JSON, .env, or TypeScript files.


async onApplicationBootstrap() {
Expand Down Expand Up @@ -59,6 +60,10 @@ export class ConnectStatusWriterService implements OnApplicationBootstrap, OnMod
const data = JSON.stringify(statusData, null, 2);
this.logger.verbose(`Writing connection status: ${data}`);

// Ensure the directory exists before writing
const dir = dirname(this.statusFilePath);
await mkdir(dir, { recursive: true });

await writeFile(this.statusFilePath, data);
this.logger.verbose(`Status written to ${this.statusFilePath}`);
} catch (error) {
Expand Down
Loading
Loading