@devgrid/netron
Version:
A powerful TypeScript library for building distributed systems with event bus, streaming capabilities, and remote object invocation. Features WebSocket-based bidirectional communication between Node.js and browser environments, service discovery, and type
63 lines • 2.72 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.NetronMethod = exports.NetronService = exports.Public = exports.Service = void 0;
const semver_1 = __importDefault(require("semver"));
const constants_1 = require("./constants");
const Service = (qualifiedName) => (target) => {
const [name, version] = qualifiedName.split('@');
const nameRegex = /^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*$/;
if (!name || !nameRegex.test(name)) {
throw new Error(`Invalid service name "${name}". Only latin letters and dots are allowed.`);
}
if (version && !semver_1.default.valid(version)) {
throw new Error(`Invalid version "${version}". Version must follow semver.`);
}
const metadata = {
name,
version: version ?? '',
properties: {},
methods: {}
};
for (const key of Object.getOwnPropertyNames(target.prototype)) {
const descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);
if (!descriptor)
continue;
const isPublic = Reflect.getMetadata('public', target.prototype, key);
if (!isPublic)
continue;
if (typeof descriptor.value === 'function') {
const paramTypes = Reflect.getMetadata('design:paramtypes', target.prototype, key) || [];
const returnType = Reflect.getMetadata('design:returntype', target.prototype, key)?.name || 'void';
metadata.methods[key] = {
type: returnType,
arguments: paramTypes.map((type) => type?.name || 'unknown'),
};
}
}
for (const key of Object.keys(new target())) {
const isPublic = Reflect.getMetadata('public', target.prototype, key);
if (!isPublic)
continue;
const type = Reflect.getMetadata('design:type', target.prototype, key)?.name || 'unknown';
const isReadonly = Reflect.getMetadata('readonly', target.prototype, key);
metadata.properties[key] = {
type,
readonly: !!isReadonly,
};
}
Reflect.defineMetadata(constants_1.SERVICE_ANNOTATION, metadata, target);
};
exports.Service = Service;
const Public = (options) => (target, propertyKey, descriptor) => {
Reflect.defineMetadata('public', true, target, propertyKey);
if (!descriptor) {
Reflect.defineMetadata('readonly', options?.readonly, target, propertyKey);
}
};
exports.Public = Public;
exports.NetronService = exports.Service;
exports.NetronMethod = exports.Public;
//# sourceMappingURL=decorators.js.map