@eggjs/controller-decorator
Version:
tegg controller decorator
106 lines • 11.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WebSocketFetchControllerMetaBuilder = void 0;
const node_assert_1 = __importDefault(require("node:assert"));
const core_decorator_1 = require("@eggjs/core-decorator");
const tegg_common_util_1 = require("@eggjs/tegg-common-util");
const tegg_metadata_1 = require("@eggjs/tegg-metadata");
const tegg_types_1 = require("@eggjs/tegg-types");
const ControllerMetaBuilderFactory_1 = require("../../builder/ControllerMetaBuilderFactory");
const model_1 = require("../../model");
const ControllerInfoUtil_1 = __importDefault(require("../../util/ControllerInfoUtil"));
const ControllerMetadataUtil_1 = require("../../util/ControllerMetadataUtil");
const ControllerValidator_1 = require("../../util/validator/ControllerValidator");
const WebSocketInfoUtil_1 = __importDefault(require("../../util/WebSocketInfoUtil"));
const WebSocketFetchControllerMethodMetaBuilder_1 = require("./WebSocketFetchControllerMethodMetaBuilder");
class WebSocketFetchControllerMetaBuilder {
constructor(clazz) {
this.clazz = clazz;
}
buildMethods() {
const methodNames = tegg_common_util_1.ObjectUtils.getProperties(this.clazz.prototype);
const methods = [];
let connectionMethod;
let openMethod;
let errorMethod;
let closeMethod;
for (const methodName of methodNames) {
const builder = new WebSocketFetchControllerMethodMetaBuilder_1.WebSocketFetchControllerMethodMetaBuilder(this.clazz, methodName);
const methodMeta = builder.build();
if (!methodMeta) {
continue;
}
switch (methodMeta.methodType) {
case tegg_types_1.WebSocketFetchMethodType.DATA: {
methods.push(methodMeta);
break;
}
case tegg_types_1.WebSocketFetchMethodType.CONNECTION: {
this.assertSingleLifecycleMethod(connectionMethod, methodMeta.methodType);
connectionMethod = methodMeta;
break;
}
case tegg_types_1.WebSocketFetchMethodType.OPEN: {
this.assertSingleLifecycleMethod(openMethod, methodMeta.methodType);
openMethod = methodMeta;
break;
}
case tegg_types_1.WebSocketFetchMethodType.ERROR: {
this.assertSingleLifecycleMethod(errorMethod, methodMeta.methodType);
errorMethod = methodMeta;
break;
}
case tegg_types_1.WebSocketFetchMethodType.CLOSE: {
this.assertSingleLifecycleMethod(closeMethod, methodMeta.methodType);
closeMethod = methodMeta;
break;
}
default:
node_assert_1.default.fail('never arrive');
}
}
return { methods, connectionMethod, openMethod, errorMethod, closeMethod };
}
assertSingleLifecycleMethod(methodMeta, methodType) {
if (!methodMeta) {
return;
}
const classDesc = tegg_metadata_1.ClassUtil.classDescription(this.clazz);
throw new Error(`build websocket fetch controller ${classDesc} failed: duplicate ${methodType} lifecycle method`);
}
build() {
ControllerValidator_1.ControllerValidator.validate(this.clazz);
const controllerType = ControllerInfoUtil_1.default.getControllerType(this.clazz);
(0, node_assert_1.default)(controllerType === tegg_types_1.ControllerType.WEBSOCKET_FETCH, 'invalid controller type');
const webSocketPath = WebSocketInfoUtil_1.default.getWebSocketPath(this.clazz);
(0, node_assert_1.default)(webSocketPath, `build websocket fetch controller ${tegg_metadata_1.ClassUtil.classDescription(this.clazz)} failed: path is required`);
const middlewares = ControllerInfoUtil_1.default.getControllerMiddlewares(this.clazz);
const { methods, connectionMethod, openMethod, errorMethod, closeMethod } = this.buildMethods();
(0, node_assert_1.default)(methods.length === 1, 'websocket fetch controller must have exactly one @WebSocketFetchMethod');
const clazzName = this.clazz.name;
const controllerName = ControllerInfoUtil_1.default.getControllerName(this.clazz) || clazzName;
const property = core_decorator_1.PrototypeUtil.getProperty(this.clazz);
const protoName = property.name;
const hosts = ControllerInfoUtil_1.default.getControllerHosts(this.clazz);
const timeout = ControllerInfoUtil_1.default.getControllerTimeout(this.clazz);
const metadata = new model_1.WebSocketFetchControllerMeta(clazzName, protoName, controllerName, webSocketPath, middlewares, methods, hosts, connectionMethod, openMethod, errorMethod, closeMethod, timeout);
ControllerMetadataUtil_1.ControllerMetadataUtil.setControllerMetadata(this.clazz, metadata);
for (const method of metadata.methods) {
const realPath = metadata.getMethodRealPath(method);
if (!realPath.startsWith('/')) {
const desc = tegg_metadata_1.ClassUtil.classDescription(this.clazz);
throw new Error(`class ${desc} method ${method.name} path ${realPath} not start with /`);
}
}
return metadata;
}
static create(clazz) {
return new WebSocketFetchControllerMetaBuilder(clazz);
}
}
exports.WebSocketFetchControllerMetaBuilder = WebSocketFetchControllerMetaBuilder;
ControllerMetaBuilderFactory_1.ControllerMetaBuilderFactory.registerControllerMetaBuilder(tegg_types_1.ControllerType.WEBSOCKET_FETCH, WebSocketFetchControllerMetaBuilder.create);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0RmV0Y2hDb250cm9sbGVyTWV0YUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaW1wbC93ZWJzb2NrZXQtZmV0Y2gvV2ViU29ja2V0RmV0Y2hDb250cm9sbGVyTWV0YUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBQ2pDLDBEQUFzRDtBQUN0RCw4REFBc0Q7QUFDdEQsd0RBQWlEO0FBRWpELGtEQUE2RTtBQUM3RSw2RkFBMEY7QUFDMUYsdUNBQXFGO0FBQ3JGLHVGQUErRDtBQUMvRCw4RUFBMkU7QUFDM0Usa0ZBQStFO0FBQy9FLHFGQUE2RDtBQUM3RCwyR0FBd0c7QUFFeEcsTUFBYSxtQ0FBbUM7SUFHOUMsWUFBWSxLQUF3QjtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRU8sWUFBWTtRQUNsQixNQUFNLFdBQVcsR0FBRyw4QkFBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sT0FBTyxHQUErQixFQUFFLENBQUM7UUFDL0MsSUFBSSxnQkFBc0QsQ0FBQztRQUMzRCxJQUFJLFVBQWdELENBQUM7UUFDckQsSUFBSSxXQUFpRCxDQUFDO1FBQ3RELElBQUksV0FBaUQsQ0FBQztRQUV0RCxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUkscUZBQXlDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN0RixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixTQUFTO1lBQ1gsQ0FBQztZQUNELFFBQVEsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM5QixLQUFL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