refactor: upgrade AddonAPIKit and propogate changes

This commit is contained in:
ForestOfLight
2026-05-30 12:51:36 +02:00
Unverified
parent 4f1d5d6ab1
commit 5bd8452312
2 changed files with 79 additions and 28 deletions
@@ -1,21 +1,20 @@
import { InstanceExistsError } from "../../classes/Errors/InstanceExistsError"; import { InstanceExistsError } from "../../classes/Errors/InstanceExistsError";
import { InstanceNotFoundError } from "../../classes/Errors/InstanceNotFoundError"; import { InstanceNotFoundError } from "../../classes/Errors/InstanceNotFoundError";
import { StructureNotFoundError } from "../../classes/Errors/StructureNotFoundError"; import { StructureNotFoundError } from "../../classes/Errors/StructureNotFoundError";
import { APICallerError, VoidModel } from "../../lib/AddonAPIKit"; import { APICallerError, VoidModel, APIController } from "../../lib/AddonAPIKit";
import { AddInstanceParameterModel, InstanceModel, InstanceNameParameterModel, InstancesModel, StructureMaterialsModel } from "../models/InstancesModel"; import { AddInstanceParameterModel, InstanceModel, InstanceNameParameterModel, InstancesModel, StructureMaterialsModel } from "../models/InstancesModel";
export class InstancesController extends APIController { export class InstancesController extends APIController {
#context; #context;
constructor(context) { constructor(context) {
super({ super();
"instances": { callback: this.getInstances, parameterModel: VoidModel, returnModel: InstancesModel }, this.addEndpoint("instances", this.getInstances, VoidModel, InstancesModel);
"instance:get": { callback: this.getInstance, parameterModel: InstanceNameParameterModel, returnModel: InstanceModel }, this.addEndpoint("instance:get", this.getInstance, InstanceNameParameterModel, InstanceModel);
"instance:add": { callback: this.addInstance, parameterModel: AddInstanceParameterModel, returnModel: InstanceModel }, this.addEndpoint("instance:add", this.addInstance, AddInstanceParameterModel, InstanceModel);
"instance:edit": { callback: this.editInstance, parameterModel: InstanceModel, returnModel: InstanceModel }, this.addEndpoint("instance:edit", this.editInstance, InstanceModel, InstanceModel);
"instance:delete": { callback: this.deleteInstance, parameterModel: InstanceNameParameterModel, returnModel: VoidModel }, this.addEndpoint("instance:delete", this.deleteInstance, InstanceNameParameterModel, VoidModel);
"instance:materials": { callback: this.getMaterials, parameterModel: InstanceNameParameterModel, returnModel: StructureMaterialsModel } this.addEndpoint("instance:materials", this.getMaterials, InstanceNameParameterModel, StructureMaterialsModel);
});
this.#context = context; this.#context = context;
} }
+70 -18
View File
@@ -4,7 +4,7 @@
* See LICENSE for details. * See LICENSE for details.
*/ */
// MCBE-IPC/ipc.js // src/MCBE-IPC/ipc.js
import { ScriptEventSource, system } from "@minecraft/server"; import { ScriptEventSource, system } from "@minecraft/server";
var UTIL; var UTIL;
(function(UTIL2) { (function(UTIL2) {
@@ -629,7 +629,7 @@ var IPC;
IPC2.handle = handle; IPC2.handle = handle;
})(IPC || (IPC = {})); })(IPC || (IPC = {}));
// Errors/APIErrorEnum.js // src/Errors/APIErrorEnum.js
var APIErrorEnum = Object.freeze({ var APIErrorEnum = Object.freeze({
Unknown: 0, Unknown: 0,
Success: 1, Success: 1,
@@ -637,7 +637,7 @@ var APIErrorEnum = Object.freeze({
Server: 3 Server: 3
}); });
// Errors/APICallerError.js // src/Errors/APICallerError.js
var APICallerError = class extends Error { var APICallerError = class extends Error {
constructor(error) { constructor(error) {
super(error.message); super(error.message);
@@ -648,7 +648,7 @@ var APICallerError = class extends Error {
} }
}; };
// Errors/APIServerError.js // src/Errors/APIServerError.js
var APIServerError = class extends Error { var APIServerError = class extends Error {
constructor(error) { constructor(error) {
super(error.message); super(error.message);
@@ -658,7 +658,7 @@ var APIServerError = class extends Error {
} }
}; };
// Errors/APIVersionMismatchError.js // src/Errors/APIVersionMismatchError.js
var APIVersionMismatchError = class extends Error { var APIVersionMismatchError = class extends Error {
constructor(serverApiVersion, callerApiVersion) { constructor(serverApiVersion, callerApiVersion) {
super(`API version numbers do not match (${callerApiVersion} != ${serverApiVersion}). Please use API version ${serverApiVersion}.`); super(`API version numbers do not match (${callerApiVersion} != ${serverApiVersion}). Please use API version ${serverApiVersion}.`);
@@ -666,7 +666,7 @@ var APIVersionMismatchError = class extends Error {
} }
}; };
// APIModels.js // src/APIModels.js
var VoidModel = PROTO.Void; var VoidModel = PROTO.Void;
var ErrorModel = PROTO.Optional(PROTO.Object({ var ErrorModel = PROTO.Optional(PROTO.Object({
code: PROTO.Int8, code: PROTO.Int8,
@@ -682,14 +682,50 @@ var CallModelShell = {
apiVersion: PROTO.String, apiVersion: PROTO.String,
parameterMap: void 0 parameterMap: void 0
}; };
var EndpointModel = PROTO.String;
var EndpointsModel = PROTO.Array(EndpointModel);
// AddonAPI.js // src/APIController.js
var APIController = class _APIController {
#endpoints = {};
constructor() {
if (this.constructor === _APIController)
throw new Error("Cannot instantiate abstract class 'APIController'");
}
get endpoints() {
return this.#endpoints;
}
addEndpoint(endpoint, callback, parameterModel, returnModel) {
this.#endpoints[endpoint] = { callback, parameterModel, returnModel };
}
};
// src/EndpointsController.js
var EndpointsController = class extends APIController {
#api;
constructor(api) {
this.#api = api;
this.addEndpoint("endpoints", this.getEndpoints, VoidModel, EndpointsModel);
this.addEndpoint("endpoints:has", this.hasEndpoint, EndpointModel, PROTO.Boolean);
}
getEndpoints() {
return this.#api.endpoints;
}
hasEndpoint(endpoint) {
return this.getEndpoints().includes(endpoint);
}
};
// src/AddonAPI.js
var AddonAPI = class { var AddonAPI = class {
#name; #name;
#version; #version;
#allEndpoints;
constructor(name, version) { constructor(name, version) {
this.#name = name; this.#name = name;
this.#version = version; this.#version = version;
const endpointsController = new EndpointsController(this);
this.setupController(endpointsController);
} }
get name() { get name() {
return this.#name; return this.#name;
@@ -700,6 +736,9 @@ var AddonAPI = class {
get endpointBase() { get endpointBase() {
return this.#name + ":"; return this.#name + ":";
} }
get endpoints() {
return this.#allEndpoints;
}
setupController(apiController) { setupController(apiController) {
for (const [endpoint, features] of Object.entries(apiController.endpoints)) { for (const [endpoint, features] of Object.entries(apiController.endpoints)) {
const { callback, parameterModel, returnModel } = features; const { callback, parameterModel, returnModel } = features;
@@ -715,6 +754,7 @@ var AddonAPI = class {
const parameters = Object.values(callPacket.parameterMap); const parameters = Object.values(callPacket.parameterMap);
return this.#handleCallback(apiVersion, callback, parameters); return this.#handleCallback(apiVersion, callback, parameters);
}); });
this.#allEndpoints.push(endpointPath);
} }
#handleCallback(apiVersion, callback, parameters) { #handleCallback(apiVersion, callback, parameters) {
try { try {
@@ -760,28 +800,40 @@ var AddonAPI = class {
} }
}; };
// APIController.js // src/AddonAPICaller.js
var APIController = class _APIController { import { system as system2 } from "@minecraft/server";
#endpoints;
constructor(endpoints) { // src/Errors/APIEndpointNotFoundError.js
if (this.constructor === _APIController) var APIEndpointNotFoundError = class extends Error {
throw new Error("Cannot instantiate abstract class 'APIController'"); constructor(endpoint) {
this.#endpoints = endpoints; super(`Endpoint "${endpoint}" was not found.`);
} this.name = "APIEndpointNotFoundError";
get endpoints() {
return this.#endpoints;
} }
}; };
// AddonAPICaller.js // src/AddonAPICaller.js
var AddonAPICaller = class { var AddonAPICaller = class {
static #validEndpointCache = [];
static async call(endpoint, parameterModel, parameterMap, returnDataModel) { static async call(endpoint, parameterModel, parameterMap, returnDataModel) {
if (this.#validEndpointCache.length === 0) {
const endpointBase = endpoint.split(":")[0];
await this.#populateValidEndpointCache(endpointBase);
}
if (this.#validEndpointCache.includes(endpoint))
return await IPC.invoke(endpoint, parameterModel, parameterMap, returnDataModel).then((result) => result.value); return await IPC.invoke(endpoint, parameterModel, parameterMap, returnDataModel).then((result) => result.value);
else
throw new APIEndpointNotFoundError(endpoint);
}
static async #populateValidEndpointCache(endpointBase) {
const endpointsEndpoint = endpointBase + ":endpoints";
const validEndpoints = await IPC.invoke(endpointsEndpoint, VoidModel, void 0, PROTO.Boolean);
this.#validEndpointCache.push(...validEndpoints);
} }
}; };
export { export {
APICallerError, APICallerError,
APIController, APIController,
APIErrorEnum,
AddonAPI, AddonAPI,
AddonAPICaller, AddonAPICaller,
PROTO, PROTO,