diff --git a/packages/controller/src/Controller.ts b/packages/controller/src/Controller.ts index 09f79563..c3ee42a0 100644 --- a/packages/controller/src/Controller.ts +++ b/packages/controller/src/Controller.ts @@ -87,7 +87,7 @@ export default class Controller { logDirectory: string = ""; clusterLogIndex: lib.LogIndex | null = null; - clusterLogBuildInterval: NodeJS.Timer | null = null; + clusterLogBuildInterval: ReturnType | null = null; constructor( clusterLogger: winston.Logger, diff --git a/packages/controller/src/WsServerConnector.ts b/packages/controller/src/WsServerConnector.ts index 5776f93a..578e7568 100644 --- a/packages/controller/src/WsServerConnector.ts +++ b/packages/controller/src/WsServerConnector.ts @@ -17,7 +17,7 @@ export interface WebSocketClusterio extends WebSocket { * @alias module:controller/src/WsServerConnector */ export default class WsServerConnector extends lib.WebSocketBaseConnector { - _timeoutId: NodeJS.Timeout | null = null; + _timeoutId: ReturnType | null = null; declare _socket: WebSocketClusterio | null; constructor( diff --git a/packages/controller/src/routes.ts b/packages/controller/src/routes.ts index 5a1de286..084b0817 100644 --- a/packages/controller/src/routes.ts +++ b/packages/controller/src/routes.ts @@ -255,7 +255,7 @@ interface ProxyStream { mime: string | null; filename: string | null; events: events.EventEmitter; - timeout: NodeJS.Timeout; + timeout: ReturnType; } export async function createProxyStream(app: Application): Promise { diff --git a/packages/host/src/Instance.js b/packages/host/src/Instance.js index 132873fc..add7aceb 100644 --- a/packages/host/src/Instance.js +++ b/packages/host/src/Instance.js @@ -662,7 +662,11 @@ rcon.print(game.table_to_json(players))`.replace(/\r?\n/g, " "); // not something we want to have. For this reason the mods // are hard linked instead. } else { - await fs.link(target, link); + try { + await fs.link(target, link); + } catch (err) { + this.logger.warn(`Failed to link mod ${modFile}.`); + } } } diff --git a/packages/lib/src/RateLimiter.ts b/packages/lib/src/RateLimiter.ts index 24390c6b..16271d0f 100644 --- a/packages/lib/src/RateLimiter.ts +++ b/packages/lib/src/RateLimiter.ts @@ -30,7 +30,7 @@ export default class RateLimiter { action?: Function; private _lastRun = 0; - private _runTimeout?: NodeJS.Timeout; + private _runTimeout?: ReturnType; /** * Construct RateLimiter helper diff --git a/packages/lib/src/helpers.ts b/packages/lib/src/helpers.ts index 31afdabc..37c41e51 100644 --- a/packages/lib/src/helpers.ts +++ b/packages/lib/src/helpers.ts @@ -37,7 +37,7 @@ export async function wait(duration: number) { * @param {*=} timeoutResult - Value to return if the operation timed out. */ export async function timeout(promise: Promise, time: number, timeoutResult: T) { - let timer: NodeJS.Timer | undefined; + let timer: ReturnType | undefined; try { return await Promise.race([ promise, diff --git a/packages/lib/src/link/connectors.ts b/packages/lib/src/link/connectors.ts index 203f9c48..742b5c30 100644 --- a/packages/lib/src/link/connectors.ts +++ b/packages/lib/src/link/connectors.ts @@ -99,7 +99,7 @@ export abstract class WebSocketBaseConnector extends BaseConnector { _closing = false; _socket: WebSocket | null = null; _lastHeartbeat: number | null = null; - _heartbeatId: NodeJS.Timer | null = null; + _heartbeatId: ReturnType | null = null; _heartbeatInterval: number | null = null; _lastReceivedSeq = undefined; _sendBuffer: (ReliableMessages)[] = []; @@ -287,7 +287,7 @@ export abstract class WebSocketBaseConnector extends BaseConnector { this.setClosing(); this._sendInternal(new libData.MessageDisconnect("prepare")); - let timeout: NodeJS.Timeout | undefined; + let timeout: ReturnType | undefined; let waitTimeout = new Promise(resolve => { timeout = setTimeout(resolve, 10000); }); // Make Configurable? try { await Promise.race([ @@ -331,7 +331,7 @@ export abstract class WebSocketBaseConnector extends BaseConnector { * @extends module:lib.WebSocketBaseConnector */ export abstract class WebSocketClientConnector extends WebSocketBaseConnector { - _reconnectId?: NodeJS.Timeout; + _reconnectId?: ReturnType; _sessionToken: string | null = null; _sessionTimeout: number | null = null; _startedResuming: number | null = null; diff --git a/test/integration/clusterio.js b/test/integration/clusterio.js index 864a432f..6ac2a57d 100644 --- a/test/integration/clusterio.js +++ b/test/integration/clusterio.js @@ -788,9 +788,13 @@ describe("Integration of Clusterio", function() { it("should have triggered for the previous instance status updates", function() { slowTest(this); let statusesToCheck = new Set([ - "unassigned", "unknown", "stopped", "creating_save", "exporting_data", + "unassigned", "stopped", "creating_save", "exporting_data", "starting", "running", "stopping", "deleted", ]); + // Windows does not see the unknown status because alt-host is not spawned. + if (process.platform !== "win32") { + statusesToCheck.add("unknown"); + } let statusesNotSeen = new Set(statusesToCheck); for (let update of getControl().instanceUpdates) { diff --git a/test/lib/plugin_loader.js b/test/lib/plugin_loader.js index 6e2e1348..5632e17d 100644 --- a/test/lib/plugin_loader.js +++ b/test/lib/plugin_loader.js @@ -79,30 +79,32 @@ describe("lib/plugin_loader", function() { ); }); it("should throw if class is missing from entrypoint", async function() { + const requirePath = path.resolve(missingClass); await assert.rejects( lib.loadControllerPluginClass({ name: "test", controllerEntrypoint: "controller", - requirePath: path.resolve(missingClass), + requirePath, }), { message: - `PluginError: Expected ${path.resolve(missingClass, "controller")} ` + + `PluginError: Expected ${path.posix.join(requirePath, "controller")} ` + "to export a class named ControllerPlugin", } ); }); it("should throw if class is not a subclass of BaseControllerPlugin", async function() { + const requirePath = path.resolve(wrongParentClass); await assert.rejects( lib.loadControllerPluginClass({ name: "test", controllerEntrypoint: "controller", - requirePath: path.resolve(wrongParentClass), + requirePath, }), { message: "PluginError: Expected ControllerPlugin exported from " + - `${path.resolve(wrongParentClass, "controller")} to be a subclass of BaseControllerPlugin`, + `${path.posix.join(requirePath, "controller")} to be a subclass of BaseControllerPlugin`, } ); });