mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-14 23:24:52 +09:00
Refactor message registration and validation
Split up the action of registring an event or request data class to be decoded by the Link class and the action of registring a handler for those requests and events. This moves the validation work from Link instantiation time to startup initialisation which makes logic errors fail on startup instead of failing instantiation of the link when a connection attempt is made. Additionally implement a partial validation logic for messages received using the newly refactored message registration. This unfortunately ended up merged with the registration refactor.
This commit is contained in:
1 parent
bcd94709d2
commit
7f8a700716
39 files changed
+648
-332
No files matched your search
@@ -19,13 +19,13 @@ class BaseConnection extends libLink.Link {
|
||||
super(connector);
|
||||
this.router = new ControllerRouter(controller);
|
||||
this._controller = controller;
|
||||
for (let [Request, handler] of controller._registeredRequests) { this.register(Request, handler); }
|
||||
for (let [Request, handler] of controller._registeredRequests) { this.handle(Request, handler); }
|
||||
for (let [Request, handler] of controller._fallbackedRequests) { this.fallbackRequest(Request, handler); }
|
||||
for (let [Event, handler] of controller._registeredEvents) { this.register(Event, handler); }
|
||||
for (let [Event, handler] of controller._registeredEvents) { this.handle(Event, handler); }
|
||||
for (let [Event, handler] of controller._snoopedEvents) { this.snoopEvent(Event, handler); }
|
||||
|
||||
this.register(libData.ModPackGetRequest, this.handleModPackGetRequest.bind(this));
|
||||
this.register(libData.ModPackGetDefaultRequest, this.handleModPackGetDefaultRequest.bind(this));
|
||||
this.handle(libData.ModPackGetRequest, this.handleModPackGetRequest.bind(this));
|
||||
this.handle(libData.ModPackGetDefaultRequest, this.handleModPackGetDefaultRequest.bind(this));
|
||||
}
|
||||
|
||||
async disconnect(code, reason) {
|
||||
|
||||
@@ -104,69 +104,69 @@ class ControlConnection extends BaseConnection {
|
||||
});
|
||||
}
|
||||
|
||||
this.register(libData.ControllerConfigGetRequest, this.handleControllerConfigGetRequest.bind(this));
|
||||
this.register(libData.ControllerConfigSetFieldRequest, this.handleControllerConfigSetFieldRequest.bind(this));
|
||||
this.register(libData.ControllerConfigSetPropRequest, this.handleControllerConfigSetPropRequest.bind(this));
|
||||
this.register(libData.HostListRequest, this.handleHostListRequest.bind(this));
|
||||
this.register(libData.HostSetSubscriptionsRequest, this.handleHostSetSubscriptionsRequest.bind(this));
|
||||
this.register(libData.HostGenerateTokenRequest, this.handleHostGenerateTokenRequest.bind(this));
|
||||
this.register(libData.HostConfigCreateRequest, this.handleHostConfigCreateRequest.bind(this));
|
||||
this.register(libData.InstanceDetailsGetRequest, this.handleInstanceDetailsGetRequest.bind(this));
|
||||
this.register(libData.InstanceDetailsListRequest, this.handleInstanceDetailsListRequest.bind(this));
|
||||
this.register(
|
||||
this.handle(libData.ControllerConfigGetRequest, this.handleControllerConfigGetRequest.bind(this));
|
||||
this.handle(libData.ControllerConfigSetFieldRequest, this.handleControllerConfigSetFieldRequest.bind(this));
|
||||
this.handle(libData.ControllerConfigSetPropRequest, this.handleControllerConfigSetPropRequest.bind(this));
|
||||
this.handle(libData.HostListRequest, this.handleHostListRequest.bind(this));
|
||||
this.handle(libData.HostSetSubscriptionsRequest, this.handleHostSetSubscriptionsRequest.bind(this));
|
||||
this.handle(libData.HostGenerateTokenRequest, this.handleHostGenerateTokenRequest.bind(this));
|
||||
this.handle(libData.HostConfigCreateRequest, this.handleHostConfigCreateRequest.bind(this));
|
||||
this.handle(libData.InstanceDetailsGetRequest, this.handleInstanceDetailsGetRequest.bind(this));
|
||||
this.handle(libData.InstanceDetailsListRequest, this.handleInstanceDetailsListRequest.bind(this));
|
||||
this.handle(
|
||||
libData.InstanceDetailsSetSubscriptionsRequest, this.handleInstanceDetailsSetSubscriptionsRequest.bind(this)
|
||||
);
|
||||
this.register(libData.InstanceCreateRequest, this.handleInstanceCreateRequest.bind(this));
|
||||
this.register(libData.InstanceDeleteRequest, this.handleInstanceDeleteRequest.bind(this));
|
||||
this.register(libData.InstanceConfigGetRequest, this.handleInstanceConfigGetRequest.bind(this));
|
||||
this.register(libData.InstanceConfigSetFieldRequest, this.handleInstanceConfigSetFieldRequest.bind(this));
|
||||
this.register(libData.InstanceConfigSetPropRequest, this.handleInstanceConfigSetPropRequest.bind(this));
|
||||
this.register(libData.InstanceAssignRequest, this.handleInstanceAssignRequest.bind(this));
|
||||
this.register(
|
||||
this.handle(libData.InstanceCreateRequest, this.handleInstanceCreateRequest.bind(this));
|
||||
this.handle(libData.InstanceDeleteRequest, this.handleInstanceDeleteRequest.bind(this));
|
||||
this.handle(libData.InstanceConfigGetRequest, this.handleInstanceConfigGetRequest.bind(this));
|
||||
this.handle(libData.InstanceConfigSetFieldRequest, this.handleInstanceConfigSetFieldRequest.bind(this));
|
||||
this.handle(libData.InstanceConfigSetPropRequest, this.handleInstanceConfigSetPropRequest.bind(this));
|
||||
this.handle(libData.InstanceAssignRequest, this.handleInstanceAssignRequest.bind(this));
|
||||
this.handle(
|
||||
libData.InstanceSetSaveListSubscriptionsRequest,
|
||||
this.handleInstanceSetSaveListSubscriptionsRequest.bind(this)
|
||||
);
|
||||
this.register(
|
||||
this.handle(
|
||||
libData.InstanceRenameSaveRequest, this._controller.sendToHostByInstanceId.bind(this._controller)
|
||||
);
|
||||
this.register(libData.InstanceCopySaveRequest, this._controller.sendToHostByInstanceId.bind(this._controller));
|
||||
this.register(
|
||||
this.handle(libData.InstanceCopySaveRequest, this._controller.sendToHostByInstanceId.bind(this._controller));
|
||||
this.handle(
|
||||
libData.InstanceDeleteSaveRequest, this._controller.sendToHostByInstanceId.bind(this._controller)
|
||||
);
|
||||
this.register(libData.InstanceDownloadSaveRequest, this.handleInstanceDownloadSaveRequest.bind(this));
|
||||
this.register(libData.InstanceTransferSaveRequest, this.handleInstanceTransferSaveRequest.bind(this));
|
||||
this.register(libData.ModPackListRequest, this.handleModPackListRequest.bind(this));
|
||||
this.register(libData.ModPackSetSubscriptionsRequest, this.handleModPackSetSubscriptionsRequest.bind(this));
|
||||
this.register(libData.ModPackCreateRequest, this.handleModPackCreateRequest.bind(this));
|
||||
this.register(libData.ModPackUpdateRequest, this.handleModPackUpdateRequest.bind(this));
|
||||
this.register(libData.ModPackDeleteRequest, this.handleModPackDeleteRequest.bind(this));
|
||||
this.register(libData.ModGetRequest, this.handleModGetRequest.bind(this));
|
||||
this.register(libData.ModListRequest, this.handleModListRequest.bind(this));
|
||||
this.register(libData.ModSearchRequest, this.handleModSearchRequest.bind(this));
|
||||
this.register(libData.ModSetSubscriptionsRequest, this.handleModSetSubscriptionsRequest.bind(this));
|
||||
this.register(libData.ModDownloadRequest, this.handleModDownloadRequest.bind(this));
|
||||
this.register(libData.ModDeleteRequest, this.handleModDeleteRequest.bind(this));
|
||||
this.register(libData.LogSetSubscriptionsRequest, this.handleLogSetSubscriptionsRequest.bind(this));
|
||||
this.register(libData.LogQueryRequest, this.handleLogQueryRequest.bind(this));
|
||||
this.register(libData.PermissionListRequest, this.handlePermissionListRequest.bind(this));
|
||||
this.register(libData.RoleListRequest, this.handleRoleListRequest.bind(this));
|
||||
this.register(libData.RoleCreateRequest, this.handleRoleCreateRequest.bind(this));
|
||||
this.register(libData.RoleUpdateRequest, this.handleRoleUpdateRequest.bind(this));
|
||||
this.register(
|
||||
this.handle(libData.InstanceDownloadSaveRequest, this.handleInstanceDownloadSaveRequest.bind(this));
|
||||
this.handle(libData.InstanceTransferSaveRequest, this.handleInstanceTransferSaveRequest.bind(this));
|
||||
this.handle(libData.ModPackListRequest, this.handleModPackListRequest.bind(this));
|
||||
this.handle(libData.ModPackSetSubscriptionsRequest, this.handleModPackSetSubscriptionsRequest.bind(this));
|
||||
this.handle(libData.ModPackCreateRequest, this.handleModPackCreateRequest.bind(this));
|
||||
this.handle(libData.ModPackUpdateRequest, this.handleModPackUpdateRequest.bind(this));
|
||||
this.handle(libData.ModPackDeleteRequest, this.handleModPackDeleteRequest.bind(this));
|
||||
this.handle(libData.ModGetRequest, this.handleModGetRequest.bind(this));
|
||||
this.handle(libData.ModListRequest, this.handleModListRequest.bind(this));
|
||||
this.handle(libData.ModSearchRequest, this.handleModSearchRequest.bind(this));
|
||||
this.handle(libData.ModSetSubscriptionsRequest, this.handleModSetSubscriptionsRequest.bind(this));
|
||||
this.handle(libData.ModDownloadRequest, this.handleModDownloadRequest.bind(this));
|
||||
this.handle(libData.ModDeleteRequest, this.handleModDeleteRequest.bind(this));
|
||||
this.handle(libData.LogSetSubscriptionsRequest, this.handleLogSetSubscriptionsRequest.bind(this));
|
||||
this.handle(libData.LogQueryRequest, this.handleLogQueryRequest.bind(this));
|
||||
this.handle(libData.PermissionListRequest, this.handlePermissionListRequest.bind(this));
|
||||
this.handle(libData.RoleListRequest, this.handleRoleListRequest.bind(this));
|
||||
this.handle(libData.RoleCreateRequest, this.handleRoleCreateRequest.bind(this));
|
||||
this.handle(libData.RoleUpdateRequest, this.handleRoleUpdateRequest.bind(this));
|
||||
this.handle(
|
||||
libData.RoleGrantDefaultPermissionsRequest, this.handleRoleGrantDefaultPermissionsRequest.bind(this)
|
||||
);
|
||||
this.register(libData.RoleDeleteRequest, this.handleRoleDeleteRequest.bind(this));
|
||||
this.register(libData.UserGetRequest, this.handleUserGetRequest.bind(this));
|
||||
this.register(libData.UserListRequest, this.handleUserListRequest.bind(this));
|
||||
this.register(libData.UserSetSubscriptionsRequest, this.handleUserSetSubscriptionsRequest.bind(this));
|
||||
this.register(libData.UserCreateRequest, this.handleUserCreateRequest.bind(this));
|
||||
this.register(libData.UserRevokeTokenRequest, this.handleUserRevokeTokenRequest.bind(this));
|
||||
this.register(libData.UserUpdateRolesRequest, this.handleUserUpdateRolesRequest.bind(this));
|
||||
this.register(libData.UserSetAdminRequest, this.handleUserSetAdminRequest.bind(this));
|
||||
this.register(libData.UserSetBannedRequest, this.handleUserSetBannedRequest.bind(this));
|
||||
this.register(libData.UserSetWhitelistedRequest, this.handleUserSetWhitelistedRequest.bind(this));
|
||||
this.register(libData.UserDeleteRequest, this.handleUserDeleteRequest.bind(this));
|
||||
this.register(libData.DebugDumpWsRequest, this.handleDebugDumpWsRequest.bind(this));
|
||||
this.handle(libData.RoleDeleteRequest, this.handleRoleDeleteRequest.bind(this));
|
||||
this.handle(libData.UserGetRequest, this.handleUserGetRequest.bind(this));
|
||||
this.handle(libData.UserListRequest, this.handleUserListRequest.bind(this));
|
||||
this.handle(libData.UserSetSubscriptionsRequest, this.handleUserSetSubscriptionsRequest.bind(this));
|
||||
this.handle(libData.UserCreateRequest, this.handleUserCreateRequest.bind(this));
|
||||
this.handle(libData.UserRevokeTokenRequest, this.handleUserRevokeTokenRequest.bind(this));
|
||||
this.handle(libData.UserUpdateRolesRequest, this.handleUserUpdateRolesRequest.bind(this));
|
||||
this.handle(libData.UserSetAdminRequest, this.handleUserSetAdminRequest.bind(this));
|
||||
this.handle(libData.UserSetBannedRequest, this.handleUserSetBannedRequest.bind(this));
|
||||
this.handle(libData.UserSetWhitelistedRequest, this.handleUserSetWhitelistedRequest.bind(this));
|
||||
this.handle(libData.UserDeleteRequest, this.handleUserDeleteRequest.bind(this));
|
||||
this.handle(libData.DebugDumpWsRequest, this.handleDebugDumpWsRequest.bind(this));
|
||||
}
|
||||
|
||||
async handleControllerConfigGetRequest() {
|
||||
|
||||
@@ -13,6 +13,7 @@ const libConfig = require("@clusterio/lib/config");
|
||||
const libData = require("@clusterio/lib/data");
|
||||
const libErrors = require("@clusterio/lib/errors");
|
||||
const libFileOps = require("@clusterio/lib/file_ops");
|
||||
const libLink = require("@clusterio/lib/link");
|
||||
const libLoggingUtils = require("@clusterio/lib/logging_utils");
|
||||
const libPlugin = require("@clusterio/lib/plugin");
|
||||
const libPluginLoader = require("@clusterio/lib/plugin_loader");
|
||||
@@ -970,17 +971,20 @@ class Controller {
|
||||
};
|
||||
}
|
||||
|
||||
register(Class, handler) {
|
||||
handle(Class, handler) {
|
||||
if (Class.type === "request") {
|
||||
this.registerRequest(Class, handler);
|
||||
this.handleRequest(Class, handler);
|
||||
} else if (Class.type === "event") {
|
||||
this.registerEvent(Class, handler);
|
||||
this.handleEvent(Class, handler);
|
||||
} else {
|
||||
throw new Error(`Class ${Class.name} has unrecognized type ${Class.type}`);
|
||||
}
|
||||
}
|
||||
|
||||
registerRequest(Request, handler) {
|
||||
handleRequest(Request, handler) {
|
||||
if (!libLink.Link._requestsByClass.has(Request)) {
|
||||
throw new Error(`Unregistered Request class ${Request.name}`);
|
||||
}
|
||||
if (this._registeredRequests.has(Request)) {
|
||||
throw new Error(`Request ${Request.name} is already registered`);
|
||||
}
|
||||
@@ -988,13 +992,19 @@ class Controller {
|
||||
}
|
||||
|
||||
fallbackRequest(Request, handler) {
|
||||
if (!libLink.Link._requestsByClass.has(Request)) {
|
||||
throw new Error(`Unregistered Request class ${Request.name}`);
|
||||
}
|
||||
if (this._fallbackedRequests.has(Request)) {
|
||||
throw new Error(`Request ${Request.name} is already fallbacked`);
|
||||
}
|
||||
this._fallbackedRequests.set(Request, handler);
|
||||
}
|
||||
|
||||
registerEvent(Event, handler) {
|
||||
handleEvent(Event, handler) {
|
||||
if (!libLink.Link._eventsByClass.has(Event)) {
|
||||
throw new Error(`Unregistered Event class ${Event.name}`);
|
||||
}
|
||||
if (this._registeredEvents.has(Event)) {
|
||||
throw new Error(`Event ${Event.name} is already registered`);
|
||||
}
|
||||
@@ -1002,6 +1012,9 @@ class Controller {
|
||||
}
|
||||
|
||||
snoopEvent(Event, handler) {
|
||||
if (!libLink.Link._eventsByClass.has(Event)) {
|
||||
throw new Error(`Unregistered Event class ${Event.name}`);
|
||||
}
|
||||
if (this._snoopedEvents.has(Event)) {
|
||||
throw new Error(`Event ${Event.name} is already snooped`);
|
||||
}
|
||||
|
||||
@@ -58,11 +58,11 @@ class HostConnection extends BaseConnection {
|
||||
}
|
||||
});
|
||||
|
||||
this.register(libData.InstanceStatusChangedEvent, this.handleInstanceStatusChangedEvent.bind(this));
|
||||
this.register(libData.InstancesUpdateRequest, this.handleInstancesUpdateRequest.bind(this));
|
||||
this.register(libData.InstanceSaveListUpdateEvent, this.handleInstanceSaveListUpdateEvent.bind(this));
|
||||
this.register(libData.LogMessageEvent, this.handleLogMessageEvent.bind(this));
|
||||
this.register(libData.InstancePlayerUpdateEvent, this.handleInstancePlayerUpdateEvent.bind(this));
|
||||
this.handle(libData.InstanceStatusChangedEvent, this.handleInstanceStatusChangedEvent.bind(this));
|
||||
this.handle(libData.InstancesUpdateRequest, this.handleInstancesUpdateRequest.bind(this));
|
||||
this.handle(libData.InstanceSaveListUpdateEvent, this.handleInstanceSaveListUpdateEvent.bind(this));
|
||||
this.handle(libData.LogMessageEvent, this.handleLogMessageEvent.bind(this));
|
||||
this.handle(libData.InstancePlayerUpdateEvent, this.handleInstancePlayerUpdateEvent.bind(this));
|
||||
}
|
||||
|
||||
_checkPluginVersions() {
|
||||
|
||||
Reference in new issue
Block a user