Implement subscription handlers for resources

Send the hosts, instances, saves, mods, mod packs and users that has
updated since the lastRequestTime provided in the request.
This commit is contained in:
Hornwitser committed 2023-12-11 20:21:43 +01:00
1 parent 0c4387769e
commit 0df672ecca
1 file changed
+49 -6
+49 -6
View File
@@ -155,12 +155,14 @@ export default class Controller {
});
// Handle subscriptions for all internal properties
this.subscriptions.handle(lib.HostUpdatesEvent);
this.subscriptions.handle(lib.InstanceDetailsUpdatesEvent);
this.subscriptions.handle(lib.InstanceSaveDetailsUpdatesEvent);
this.subscriptions.handle(lib.ModPackUpdatesEvent);
this.subscriptions.handle(lib.ModUpdatesEvent);
this.subscriptions.handle(lib.UserUpdatesEvent);
this.subscriptions.handle(lib.HostUpdatesEvent, this.handleHostSubscription.bind(this));
this.subscriptions.handle(lib.InstanceDetailsUpdatesEvent, this.handleInstanceDetailsSubscription.bind(this));
this.subscriptions.handle(
lib.InstanceSaveDetailsUpdatesEvent, this.handleInstanceSaveDetailsSubscription.bind(this)
);
this.subscriptions.handle(lib.ModPackUpdatesEvent, this.handleModPackSubscription.bind(this));
this.subscriptions.handle(lib.ModUpdatesEvent, this.handleModSubscription.bind(this));
this.subscriptions.handle(lib.UserUpdatesEvent, this.handleUserSubscription.bind(this));
}
async start(args: ControllerArgs) {
@@ -659,6 +661,13 @@ export default class Controller {
this.subscriptions.broadcast(new lib.HostUpdatesEvent(updates));
}
async handleHostSubscription(request: lib.SubscriptionRequest) {
const hosts = [...this.hosts.values()].filter(
host => host.updatedAt > request.lastRequestTime,
).map(host => host.toHostDetails());
return new lib.HostUpdatesEvent(hosts);
}
/**
* Get instance by ID for a request
*
@@ -870,11 +879,24 @@ export default class Controller {
this.subscriptions.broadcast(new lib.InstanceDetailsUpdatesEvent(updates));
}
async handleInstanceDetailsSubscription(request: lib.SubscriptionRequest) {
const instances = [...this.instances.values()].filter(
instance => instance.updatedAt > request.lastRequestTime,
).map(instance => instance.toInstanceDetails());
return new lib.InstanceDetailsUpdatesEvent(instances);
}
savesUpdated(saves: lib.SaveDetails[]) {
this.savesDirty = true;
this.subscriptions.broadcast(new lib.InstanceSaveDetailsUpdatesEvent(saves));
}
async handleInstanceSaveDetailsSubscription(request: lib.SubscriptionRequest) {
const saves = [...this.saves.values()].filter(save => save.updatedAt > request.lastRequestTime);
return new lib.InstanceSaveDetailsUpdatesEvent(saves);
}
modPacksUpdated(modPacks: lib.ModPack[]) {
const now = Date.now();
for (const modPack of modPacks) {
@@ -885,12 +907,26 @@ export default class Controller {
lib.invokeHook(this.plugins, "onModPacksUpdated", modPacks);
}
async handleModPackSubscription(request: lib.SubscriptionRequest) {
const modPacks = [...this.modPacks.values()].filter(
modPack => modPack.updatedAt > request.lastRequestTime,
);
return new lib.ModPackUpdatesEvent(modPacks);
}
modsUpdated(mods: lib.ModInfo[]) {
// ModStore sets updatedAt for mods
this.subscriptions.broadcast(new lib.ModUpdatesEvent(mods));
lib.invokeHook(this.plugins, "onModsUpdated", mods);
}
async handleModSubscription(request: lib.SubscriptionRequest) {
const mods = [...this.modStore.files.values()].filter(
mod => mod.updatedAt > request.lastRequestTime,
);
return new lib.ModUpdatesEvent(mods);
}
usersUpdated(users: ControllerUser[]) {
const now = Date.now();
for (const user of users) {
@@ -900,6 +936,13 @@ export default class Controller {
this.subscriptions.broadcast(new lib.UserUpdatesEvent(users));
}
async handleUserSubscription(request: lib.SubscriptionRequest) {
const users = [...this.userManager.users.values()].filter(
user => user.updatedAt > request.lastRequestTime,
);
return new lib.UserUpdatesEvent(users);
}
/**
* Notify connected control clients under the given user that the
* permissions for this user may have changed.