@openhps/core
Version:
Open Hybrid Positioning System - Core component
96 lines • 3.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelSerializer = void 0;
const data_1 = require("./data");
const Node_1 = require("./Node");
const service_1 = require("./service");
/**
* Model serializer allows you to serialize a positioning model to JSON.
*/
class ModelSerializer {
static get options() {
return {
serialize: data_1.DataSerializer.serialize,
deserialize: data_1.DataSerializer.deserialize,
};
}
static serialize(model) {
return this.serializeNode(model);
}
static serializeNode(node) {
this.initialize();
return this.options.serialize(node);
}
/**
* Deserialize a model
* @param model
* @returns
*/
static deserialize(model) {
const deserializedModel = this.deserializeNode(model);
deserializedModel.nodes.forEach((node) => {
node.graph = deserializedModel;
});
return deserializedModel;
}
/**
* Deserialize a node
* @param node
* @returns
*/
static deserializeNode(node) {
this.initialize();
return this.options.deserialize(node);
}
/**
* Load all classes from the module
* @param module
* @returns
*/
static loadClasses(module = require.main) {
if (module === undefined) {
// Use cache instead
Object.values(require.cache).map((m) => this.loadClasses(m));
return;
}
this._modules.add(module.id);
if (module.exports) {
Object.keys(module.exports).forEach((key) => {
const childModule = module.exports[key];
if (childModule && childModule.prototype instanceof Node_1.Node) {
this.NODES.set(key, {
constructor: childModule,
});
}
else if (childModule && childModule.prototype instanceof service_1.Service) {
this.SERVICES.set(key, {
constructor: childModule,
});
}
});
}
if (module.children) {
module.children.forEach((module) => {
if (!this._modules.has(module.id)) {
this.loadClasses(module);
}
});
}
}
/**
* Initialize the serializer
*/
static initialize() {
if (this.SERVICES.size === 0 || this.NODES.size === 0) {
this.loadClasses();
this._modules.clear();
this.SERVICES.forEach((service) => data_1.DataSerializer.registerType(service.constructor));
this.NODES.forEach((node) => data_1.DataSerializer.registerType(node.constructor));
}
}
}
exports.ModelSerializer = ModelSerializer;
ModelSerializer.NODES = new Map();
ModelSerializer.SERVICES = new Map();
ModelSerializer._modules = new Set();
//# sourceMappingURL=ModelSerializer.js.map