UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

90 lines 2.41 kB
import { DataSerializer } from './data'; import { Node } from './Node'; import { Service } from './service'; /** * Model serializer allows you to serialize a positioning model to JSON. */ export class ModelSerializer { static get options() { return { serialize: DataSerializer.serialize, deserialize: 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) { this.NODES.set(key, { constructor: childModule }); } else if (childModule && childModule.prototype instanceof 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 => DataSerializer.registerType(service.constructor)); this.NODES.forEach(node => DataSerializer.registerType(node.constructor)); } } } ModelSerializer.NODES = new Map(); ModelSerializer.SERVICES = new Map(); ModelSerializer._modules = new Set();