From 2baa2e50acc4cea045ae448ec1aa809d1b521011 Mon Sep 17 00:00:00 2001 From: Cooldude2606 <25043174+Cooldude2606@users.noreply.github.com> Date: Mon, 14 Jul 2025 19:18:57 +0100 Subject: [PATCH] Add InstanceRestartRequest --- packages/host/src/Instance.ts | 9 +++++++++ packages/lib/src/data/messages_instance.ts | 20 ++++++++++++++++++++ packages/lib/src/link/messages.ts | 1 + packages/lib/src/permissions.ts | 5 +++++ 4 files changed, 35 insertions(+) diff --git a/packages/host/src/Instance.ts b/packages/host/src/Instance.ts index 48f675a3..0a47c0b2 100644 --- a/packages/host/src/Instance.ts +++ b/packages/host/src/Instance.ts @@ -289,6 +289,7 @@ export default class Instance extends lib.Link { this.handle(lib.InstanceSaveDetailsListRequest, this.handleInstanceSaveDetailsListRequest.bind(this)); this.handle(lib.InstanceCreateSaveRequest, this.handleInstanceCreateSaveRequest.bind(this)); this.handle(lib.InstanceExportDataRequest, this.handleInstanceExportDataRequest.bind(this)); + this.handle(lib.InstanceRestartRequest, this.handleInstanceRestartRequest.bind(this)); this.handle(lib.InstanceStopRequest, this.handleInstanceStopRequest.bind(this)); this.handle(lib.InstanceKillRequest, this.handleInstanceKillRequest.bind(this)); this.handle(lib.InstanceSendRconRequest, this.handleInstanceSendRconRequest.bind(this)); @@ -1300,6 +1301,14 @@ end`.replace(/\r?\n/g, " "); } } + async handleInstanceRestartRequest(request: lib.InstanceRestartRequest) { + await this.stop(); + // Stopping invalidates this instance object, a new one must be created by the host + // To do this we simulate a waking an instance and sending a start request + const instanceConnection = await this._host._connectInstance(this.id); + await instanceConnection.instance.handleInstanceStartRequest(new lib.InstanceStartRequest(request.save)); + } + async handleInstanceStopRequest() { await this.stop(); } diff --git a/packages/lib/src/data/messages_instance.ts b/packages/lib/src/data/messages_instance.ts index 63643343..19a34eba 100644 --- a/packages/lib/src/data/messages_instance.ts +++ b/packages/lib/src/data/messages_instance.ts @@ -284,6 +284,26 @@ export class InstanceStartRequest { } } +export class InstanceRestartRequest { + declare ["constructor"]: typeof InstanceRestartRequest; + static type = "request" as const; + static src = ["control", "controller"] as const; + static dst = "instance" as const; + static permission = "core.instance.restart" as const; + + constructor( + public save?: string, + ) { } + + static jsonSchema = Type.Object({ + "save": Type.Optional(Type.String()), + }); + + static fromJSON(json: Static) { + return new this(json.save); + } +} + export class SaveDetails { constructor( public instanceId: number, diff --git a/packages/lib/src/link/messages.ts b/packages/lib/src/link/messages.ts index 3fd30de6..65505bac 100644 --- a/packages/lib/src/link/messages.ts +++ b/packages/lib/src/link/messages.ts @@ -63,6 +63,7 @@ export const dataClasses: (RequestClass | EventClass) instance.InstanceAssignRequest, instance.InstanceMetricsRequest, instance.InstanceStartRequest, + instance.InstanceRestartRequest, instance.InstanceSaveDetailsListRequest, instance.InstanceSaveDetailsUpdatesEvent, instance.InstanceCreateSaveRequest, diff --git a/packages/lib/src/permissions.ts b/packages/lib/src/permissions.ts index 23ac4b31..fb7395b9 100644 --- a/packages/lib/src/permissions.ts +++ b/packages/lib/src/permissions.ts @@ -307,6 +307,11 @@ definePermission({ title: "Start instance", description: "Start instances.", }); +definePermission({ + name: "core.instance.restart", + title: "Restart instance", + description: "Restart instances.", +}); definePermission({ name: "core.instance.load_scenario", title: "Load scenario",