@berish/serber
Version:
Serializable and deserializable adaptive adapter with plugins
221 lines • 10.2 kB
JavaScript
"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