From 56d399767570f3de17aef5c26c027012bbee1bdb Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Fri, 24 Nov 2023 18:15:50 +0100 Subject: [PATCH] Refactor to keep handle to Instance in connection Keep a handle to the Instance in the connection the host has to the instance so that methods can be called directly on the Instance. This simplifies logic that exists outside of the link system like the host shutting down all of its instances when it exits. Fixes validation error thrown on host shutdown with running instances. --- packages/host/src/Host.ts | 22 +++++++++------------- packages/host/src/InstanceConnection.ts | 8 +++----- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/host/src/Host.ts b/packages/host/src/Host.ts index 602d1217..c834b25b 100644 --- a/packages/host/src/Host.ts +++ b/packages/host/src/Host.ts @@ -214,6 +214,9 @@ class HostRouter { ); } logger.warn(`Failed to deliver ${(message as any).name || "message"} (${message.type}): ${err.message}`); + if (err instanceof lib.InvalidMessage && err.errors) { + logger.warn(JSON.stringify(err.errors, null, 4)); + } } } @@ -470,7 +473,7 @@ export default class Host extends lib.Link { let instanceConnection = this.instanceConnections.get(instanceId); this.send( new lib.InstanceStatusChangedEvent( - instanceId, instanceConnection ? instanceConnection.status : "stopped", undefined + instanceId, instanceConnection ? instanceConnection.instance.status : "stopped", undefined ) ); @@ -490,7 +493,7 @@ export default class Host extends lib.Link { let instanceInfo = this.instanceInfos.get(instanceId); if (instanceInfo) { let instanceConnection = this.instanceConnections.get(instanceId); - if (instanceConnection && ["starting", "running"].includes(instanceConnection.status)) { + if (instanceConnection && ["starting", "running"].includes(instanceConnection.instance.status)) { await instanceConnection.send(new lib.InstanceStopRequest()); } @@ -530,10 +533,10 @@ export default class Host extends lib.Link { let hostAddress = new lib.Address(lib.Address.host, this.config.get("host.id")); let instanceAddress = new lib.Address(lib.Address.instance, instanceId); let [connectionClient, connectionServer] = lib.VirtualConnector.makePair(instanceAddress, hostAddress); - let instanceConnection = new InstanceConnection(connectionServer, this, instanceId); let instance = new Instance( this, connectionClient, instanceInfo.path, this.config.get("host.factorio_directory"), instanceInfo.config ); + let instanceConnection = new InstanceConnection(connectionServer, this, instance); this.instanceConnections.set(instanceId, instanceConnection); await instance.init(this.pluginInfos); @@ -750,13 +753,6 @@ export default class Host extends lib.Link { }); } - async stopInstance(instanceId: number) { - let instanceConnection = this.instanceConnections.get(instanceId); - if (instanceConnection) { - await instanceConnection.send(new lib.InstanceStopRequest()); - } - } - async handleInstanceDeleteInternalRequest(request: lib.InstanceDeleteInternalRequest) { let instanceId = request.instanceId; if (this.instanceConnections.has(instanceId)) { @@ -786,7 +782,7 @@ export default class Host extends lib.Link { let instanceConnection = this.instanceConnections.get(instanceId); list.push(new lib.RawInstanceInfo( instanceInfo.config.serialize("controller"), - instanceConnection ? instanceConnection.status : "stopped", + instanceConnection ? instanceConnection.instance.status : "stopped", )); } await this.send(new lib.InstancesUpdateRequest(list)); @@ -828,9 +824,9 @@ export default class Host extends lib.Link { } this._shuttingDown = true; - for (let instanceId of this.instanceConnections.keys()) { + for (let instanceConnection of this.instanceConnections.values()) { try { - await this.stopInstance(instanceId); + await instanceConnection.instance.stop(); } catch (err: any) { logger.error(`Unexpected error stopping instance:\n${err.stack}`); } diff --git a/packages/host/src/InstanceConnection.ts b/packages/host/src/InstanceConnection.ts index 57780263..e9f01053 100644 --- a/packages/host/src/InstanceConnection.ts +++ b/packages/host/src/InstanceConnection.ts @@ -5,12 +5,11 @@ import type Instance from "./Instance"; export default class InstanceConnection extends lib.Link { plugins = new Map(); - status: Instance["status"] = "stopped"; constructor( connector: lib.VirtualConnector, public host: Host, - public instanceId: number + public instance: Instance, ) { super(connector); this.router = this.host.router; @@ -24,9 +23,8 @@ export default class InstanceConnection extends lib.Link { } async snoopInstanceStatusChangedEvent(event: lib.InstanceStatusChangedEvent) { - this.status = event.status as Instance["status"]; - if (this.status === "stopped") { - this.host.instanceConnections.delete(this.instanceId); + if (this.instance.status === "stopped") { + this.host.instanceConnections.delete(this.instance.id); } } }