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.
This commit is contained in:
Hornwitser committed 2023-11-24 20:53:16 +01:00
1 parent 82ed0adfc3
commit 56d3997675
2 files changed
+12 -18

No files matched your search

+9 -13
View File
@@ -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}`);
}
+3 -5
View File
@@ -5,12 +5,11 @@ import type Instance from "./Instance";
export default class InstanceConnection extends lib.Link {
plugins = new Map<string, string>();
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);
}
}
}