UNPKG

@berish/serber

Version:

Serializable and deserializable adaptive adapter with plugins

221 lines 10.2 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const const_1 = require("./const"); class Serber { constructor() { this._plugins = []; this.serialize = (obj, params, options) => { params = params || {}; options = options || {}; params = Object.assign({ [const_1.SERBER_INSTANCE_SYMBOL]: this, [const_1.SERBER_ROOT_OBJECT_SYMBOL]: obj }, params); const errors = []; for (const plugin of this.plugins) { try { const isForSerialize = plugin.isForSerialize && plugin.isForSerialize(obj, params); if (isForSerialize) { if (plugin.serialize) { if (plugin.beforeSerialize) plugin.beforeSerialize(obj, params); const result = plugin.serialize(obj, params); if (plugin.afterSerialize) plugin.afterSerialize(obj, result, params); return result; } return obj; } else { const isAlreadySerialized = plugin.isAlreadySerialized && plugin.isAlreadySerialized(obj, params); if (isAlreadySerialized) { return obj; } } } catch (err) { if (options.throwWhenError) throw err; errors.push(err); } } if (errors.length > 0) { errors.forEach((err, i) => console.error(`[${i}]: `, err)); return void 0; } return obj; }; this.serializeAsync = (obj, params, options) => __awaiter(this, void 0, void 0, function* () { params = params || {}; options = options || {}; params = Object.assign({ [const_1.SERBER_INSTANCE_SYMBOL]: this, [const_1.SERBER_ROOT_OBJECT_SYMBOL]: obj }, params); const errors = []; for (const plugin of this.plugins) { try { const isForSerialize = plugin.isForSerializeAsync ? yield plugin.isForSerializeAsync(obj, params) : plugin.isForSerialize && plugin.isForSerialize(obj, params); if (isForSerialize) { if (plugin.serializeAsync || plugin.serialize) { if (plugin.beforeSerializeAsync) yield plugin.beforeSerializeAsync(obj, params); else if (plugin.beforeSerialize) plugin.beforeSerialize(obj, params); const result = plugin.serializeAsync ? yield plugin.serializeAsync(obj, params) : plugin.serialize(obj, params); if (plugin.afterSerializeAsync) yield plugin.afterSerializeAsync(obj, result, params); else if (plugin.afterSerialize) plugin.afterSerialize(obj, result, params); return result; } return obj; } else { const isAlreadySerialized = plugin.isAlreadySerializedAsync ? yield plugin.isAlreadySerializedAsync(obj, params) : plugin.isAlreadySerialized && plugin.isAlreadySerialized(obj, params); if (isAlreadySerialized) { return obj; } } } catch (err) { if (options.throwWhenError) throw err; errors.push(err); } } if (errors.length > 0) { errors.forEach((err, i) => console.error(`[${i}]: `, err)); return void 0; } return obj; }); this.deserialize = (obj, params, options) => { params = params || {}; options = options || {}; params = Object.assign({ [const_1.SERBER_INSTANCE_SYMBOL]: this, [const_1.SERBER_ROOT_OBJECT_SYMBOL]: obj }, params); const errors = []; for (const plugin of this.plugins) { try { const isForDeserialize = plugin.isForDeserialize && plugin.isForDeserialize(obj, params); if (isForDeserialize) { if (plugin.deserialize) { if (plugin.beforeDeserialize) plugin.beforeDeserialize(obj, params); const result = plugin.deserialize(obj, params); if (plugin.afterDeserialize) plugin.afterDeserialize(obj, result, params); return result; } return obj; } else { const isAlreadyDeserialized = plugin.isAlreadyDeserialized && plugin.isAlreadyDeserialized(obj, params); if (isAlreadyDeserialized) { return obj; } } } catch (err) { if (options.throwWhenError) throw err; errors.push(err); } } if (errors.length > 0) { errors.forEach((err, i) => console.error(`[${i}]: `, err)); return obj; } return obj; }; this.deserializeAsync = (obj, params, options) => __awaiter(this, void 0, void 0, function* () { params = params || {}; options = options || {}; params = Object.assign({ [const_1.SERBER_INSTANCE_SYMBOL]: this, [const_1.SERBER_ROOT_OBJECT_SYMBOL]: obj }, params); const errors = []; for (const plugin of this.plugins) { try { const isForDeserialize = plugin.isForDeserializeAsync ? yield plugin.isForDeserializeAsync(obj, params) : plugin.isForDeserialize && plugin.isForDeserialize(obj, params); if (isForDeserialize) { if (plugin.deserializeAsync || plugin.deserialize) { if (plugin.beforeDeserializeAsync) yield plugin.beforeDeserializeAsync(obj, params); else if (plugin.beforeDeserialize) plugin.beforeDeserialize(obj, params); const result = plugin.deserializeAsync ? yield plugin.deserializeAsync(obj, params) : plugin.deserialize(obj, params); if (plugin.afterDeserializeAsync) yield plugin.afterDeserializeAsync(obj, result, params); else if (plugin.afterDeserialize) plugin.afterDeserialize(obj, result, params); return result; } return obj; } else { const isAlreadyDeserialized = plugin.isAlreadyDeserializedAsync ? yield plugin.isAlreadyDeserializedAsync(obj, params) : plugin.isAlreadyDeserialized && plugin.isAlreadyDeserialized(obj, params); if (isAlreadyDeserialized) { return obj; } } } catch (err) { if (options.throwWhenError) throw err; errors.push(err); } } if (errors.length > 0) { errors.forEach((err, i) => console.error(`[${i}]: `, err)); return void 0; } return obj; }); } get plugins() { return this._plugins; } addPlugin(plugin) { if (!this.hasPlugin(plugin)) this._plugins.push(plugin); return this; } hasPlugin(plugin) { return this._plugins.indexOf(plugin) !== -1; } removePlugin(plugin) { if (this.hasPlugin(plugin)) this._plugins = this._plugins.filter(m => m !== plugin); return this; } with(plugin) { if (this.hasPlugin(plugin)) return this; const newInstance = new Serber(); newInstance._plugins = [...this._plugins, plugin]; return newInstance; } without(plugin) { if (!this.hasPlugin(plugin)) return this; const newInstance = new Serber(); newInstance._plugins = this.plugins.filter(m => m !== plugin); return newInstance; } } exports.Serber = Serber; //# sourceMappingURL=serber.js.map