var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ // } /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ ; var lib_plankton; (function (lib_plankton) { var base; (function (base) { /** * @author fenris */ function environment() { return "node"; } base.environment = environment; })(base = lib_plankton.base || (lib_plankton.base = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ /** * @author fenris */ /*export*/ function pseudopointer_null() { return { "value": null }; } /** * @author fenris */ /*export*/ function pseudopointer_make(value) { return { "value": value }; } /** * @author fenris */ /*export*/ function pseudopointer_isset(pseudopointer) { return (pseudopointer.value != null); } /** * @author fenris */ /*export*/ function pseudopointer_read(pseudopointer) { if (pseudopointer.value != null) { return pseudopointer.value; } else { var message = "nullpointer dereferencation"; throw (new Error(message)); } } /** * @author fenris */ /*export*/ function pseudopointer_write(pseudopointer, value) { pseudopointer.value = value; } /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ /** * @author fenris */ var instance_verbosity = 0; /** * @author fenris */ function instance_collate(value1, value2) { if (typeof (value1) === "object") { if (value1 == null) { return (value2 == null); } else { if ("_collate" in value1) { return value1["_collate"](value2); } else { throw (new Error("[collate]" + " " + "object has no such method")); } } } else { if (instance_verbosity >= 1) { // lib_plankton.log.warn("[collate]" + " " + "primitive value; using default implementation"); } return (value1 === value2); } } /** * @author fenris */ function instance_compare(value1, value2) { if (typeof (value1) === "object") { if ("_compare" in value1) { return value1["_compare"](value2); } else { throw (new Error("[compare]" + " " + "object has no such method")); } } else { if (instance_verbosity >= 1) { // lib_plankton.log.warn("[compare]" + " " + "primitive value; using default implementation"); } return (value1 <= value2); } } /** * @author fenris */ function instance_clone(value) { if (typeof (value) === "object") { if ("_clone" in value) { return value["_clone"](); } else { throw (new Error("[clone]" + " " + "object has no such method")); } } else { if (instance_verbosity >= 1) { // lib_plankton.log.warn("[clone]" + " " + "primitive value; using default implementation"); } return value; } } /** * @desc the ability to generate a string out of the element, which identifies it to a high degree * @author fenris */ function instance_hash(value) { if (typeof (value) === "object") { if ("_hash" in value) { return value["_hash"](); } else { throw (new Error("[hash]" + " " + "object has no such method")); } } else { if (instance_verbosity >= 1) { // lib_plankton.log.warn("[hash]" + " " + "primitive value; using default implementation"); } return String(value); } } /** * @desc the ability to map the element to a textual representation (most likely not injective) * @author fenris */ function instance_show(value) { if (typeof (value) === "object") { if (value == null) { return "NULL"; } else { if ("_show" in value) { return value["_show"](); } else { // throw (new Error("[show]" + " " + "object has no such method")); return JSON.stringify(value); } } } else { if (instance_verbosity >= 1) { // lib_plankton.log.warn("[show]" + " " + "primitive value; using default implementation"); } return String(value); } } /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ /** * @author frac */ var class_observer = /** @class */ (function () { /** * @author frac */ function class_observer() { this.counter = 0; this.actions = {}; this.buffer = []; } /** * @author frac */ class_observer.prototype.empty = function () { return (Object.keys(this.actions).length == 0); }; /** * @author frac */ class_observer.prototype.flush = function () { this.actions = {}; }; /** * @author frac */ class_observer.prototype.set = function (id, action) { this.actions[id] = action; }; /** * @author frac */ class_observer.prototype.del = function (id) { delete this.actions[id]; }; /** * @author frac */ class_observer.prototype.add = function (action) { this.set((this.counter++).toString(), action); }; /** * @author frac */ class_observer.prototype.notify = function (information, delayed) { var _this = this; if (information === void 0) { information = {}; } if (delayed === void 0) { delayed = false; } if (delayed) { this.buffer.push(information); } else { Object.keys(this.actions).forEach(function (id) { return _this.actions[id](information); }); } }; /** * @author frac */ class_observer.prototype.rollout = function () { var _this = this; this.buffer.forEach(function (information) { return _this.notify(information, false); }); this.buffer = []; }; return class_observer; }()); /** * @author frac */ /* export interface interface_readable { |** * @author frac *| read() : type_executor; } */ /** * @author frac */ /* export interface interface_writeable { |** * @author frac *| write(value : type_value) : type_executor; } */ /* This file is part of »bacterio-plankton:base«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:base« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:base« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:base«. If not, see . */ /** * @author frac */ var class_error = /** @class */ (function (_super) { __extends(class_error, _super); /** * @author frac */ function class_error(message, suberrors) { if (suberrors === void 0) { suberrors = []; } var _this = _super.call(this, message) || this; _this.suberrors = suberrors; _this.mess = message; return _this; } /** * @override * @author frac */ class_error.prototype.toString = function () { return ( /*super.toString()*/this.mess + " " + ("[" + this.suberrors.map(function (x) { return x.toString(); }).join(",") + "]")); }; return class_error; }(Error)); var lib_plankton; (function (lib_plankton) { var base; (function (base) { /** * returns the current UNIX timestamp * * @author fenris */ function get_current_timestamp(rounded) { if (rounded === void 0) { rounded = false; } var x = (Date.now() / 1000); return (rounded ? Math.round(x) : x); ; } base.get_current_timestamp = get_current_timestamp; /** */ function object_merge(core, mantle) { return Object.assign(core, mantle); } base.object_merge = object_merge; })(base = lib_plankton.base || (lib_plankton.base = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:pod«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:pod« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:pod« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:pod«. If not, see . */ var lib_plankton; (function (lib_plankton) { var pod; (function (pod_1) { /** * @author fenris */ function make_empty() { return { "kind": "empty" }; } pod_1.make_empty = make_empty; /** * @author fenris */ function make_filled(value) { return { "kind": "filled", "value": value }; } pod_1.make_filled = make_filled; /** * whether the pod is filled * * @author fenris */ function is_filled(pod) { return (pod.kind === "filled"); } pod_1.is_filled = is_filled; /** * return the value, stored in the pod-wrapper * * @author fenris */ function cull(pod) { if (!is_filled(pod)) { throw (new Error("cull from empty")); } else { return pod.value; } } pod_1.cull = cull; /** * to pass on a empty-pod or to use a filled-pod * * @author fenris */ function propagate(pod, function_) { if (!is_filled(pod)) { return make_empty(); } else { return make_filled(function_(pod.value)); } } pod_1.propagate = propagate; /** * @author fenris */ function distinguish(pod, function_empty, function_filled) { return ((!is_filled(pod)) ? function_empty() : function_filled(pod.value)); } pod_1.distinguish = distinguish; /** */ function show(pod, options = {}) { options = Object.assign({ "show_value": value => String(value), }, options); if (!is_filled(pod)) { return "<·>"; } else { return ("<- " + options.show_value(pod.value) + " ->"); } } pod_1.show = show; })(pod = lib_plankton.pod || (lib_plankton.pod = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:pod«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:pod« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:pod« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:pod«. If not, see . */ var lib_plankton; (function (lib_plankton) { var pod; (function (pod) { /** */ class class_pod { constructor(subject) { this.subject = subject; } is_empty() { return (!pod.is_filled(this.subject)); } is_filled() { return pod.is_filled(this.subject); } cull() { return pod.cull(this.subject); } show(show_value = undefined) { return pod.show(this.subject, show_value); } toString() { return this.show(); } propagate(function_) { return new class_pod(pod.propagate(this.subject, function_)); } distinguish(function_empty, function_filled) { return pod.distinguish(this.subject, function_empty, function_filled); } } pod.class_pod = class_pod; })(pod = lib_plankton.pod || (lib_plankton.pod = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ "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()); }); }; var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** * @author fenris */ function executor_resolve(result) { return ((resolve, reject) => resolve(result)); } call.executor_resolve = executor_resolve; /** * @author fenris */ function executor_reject(reason) { return ((resolve, reject) => reject(reason)); } call.executor_reject = executor_reject; /** * @author fenris */ function executor_transform(executor, transform_result, transform_reason) { return ((resolve, reject) => { executor(result => resolve(transform_result(result)), reason => reject(transform_reason(reason))); }); } call.executor_transform = executor_transform; /** * @author fenris */ function executor_transform_default(executor, transform_result, wrap_string = null) { let transform_reason = (error => ((wrap_string == null) ? error : new class_error(wrap_string, [error]))); return (executor_transform(executor, transform_result, transform_reason)); } call.executor_transform_default = executor_transform_default; /** * @author fenris */ function executor_compose_sequential(first, second) { return ((resolve, reject) => { first(result => { second(result)(resolve, reject); }, reason => { reject(reason); }); }); } call.executor_compose_sequential = executor_compose_sequential; /** * @author fenris */ function executor_chain(state, executors) { return ((resolve, reject) => { if (executors.length == 0) { return resolve(state); } else { return executors[0](state)(result => { executor_chain(result, executors.slice(1))(resolve, reject); }, reject); } }); /* */ /* if (executors.length == 0) { return executor_resolve(state); } else if (executors.length == 1) { return executors[0](state); } else { return ( executor_chain( state, [ state => (resolve, reject) => executors[0](state)(result => executors[1](result)(resolve, reject), reject) ].concat(executors.slice(2)) ) ); } */ /* return ( executors.reduce( (chain, current) => executor_compose_sequential(chain, current, deferred), executor_resolve(state) ) ); */ } call.executor_chain = executor_chain; /** * @author fenris */ function executor_first(executors) { /* return ( (resolve, reject) => { if (executors.length == 0) { reject(new Error("all failed")); } else { executors[0]( result => { resolve(result); }, reason => { executor_first(executors.slice(1))(resolve, reject); } ) } } ); */ return ((resolve, reject) => { executor_chain([], executors.map(executor => reasons => (resolve_, reject_) => { executor(result => reject_(result), reason => resolve_(reasons.concat([reason]))); }))(errors => reject(errors), result => resolve(result)); }); } call.executor_first = executor_first; /** * @author fenris */ function executor_condense(executors) { return (executor_chain([], executors.map(executor => result => (resolve, reject) => { executor(element => resolve(result.concat([element])), reject); }))); } call.executor_condense = executor_condense; /** * @author fenris * @deprecated use condense */ function executor_filter(executors, predicate) { return (executor_chain([], executors.map(executor => result => (resolve, reject) => { executor(element => resolve(predicate(element) ? result.concat([element]) : result), reject); }))); } call.executor_filter = executor_filter; /** * @author fenris * @deprecated use condense */ function executor_map(executors, transformator) { return (executor_chain([], executors.map(executor => result => (resolve, reject) => { executor(element1 => resolve(result.concat([transformator(element1)])), reject); }))); } call.executor_map = executor_map; /** * @author fenris * @deprecated use condense */ function executor_reduce(executors, initial, accumulator) { return (executor_chain(initial, executors.map(executor => result => (resolve, reject) => { executor(element => resolve(accumulator(result, element)), reject); }))); } call.executor_reduce = executor_reduce; })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** * @author fenris */ function promise_reject(reason) { return Promise.reject(reason); } call.promise_reject = promise_reject; /** * @author fenris */ function promise_resolve(result) { return Promise.resolve(result); } call.promise_resolve = promise_resolve; /** * @author fenris */ function promise_make(executor) { return (new Promise(executor)); } call.promise_make = promise_make; /** * @author fenris */ function promise_then_close(promise, resolver, rejector) { promise.then(resolver, rejector); } call.promise_then_close = promise_then_close; /** * @author fenris */ function promise_then_append(promise, resolver, rejector = null) { if (rejector == null) { rejector = (reason) => promise_reject(reason); } return (promise.then(resolver, rejector)); } call.promise_then_append = promise_then_append; /** * @author fenris */ function promise_all(promises) { return Promise.all(promises); } call.promise_all = promise_all; /** * @author fenris */ function promise_chain(promises, start = undefined) { return (promises.reduce((chain, promise) => promise_then_append(chain, promise), promise_resolve(start))); } call.promise_chain = promise_chain; /** * @author fenris */ function promise_condense(promises) { return (promise_chain(promises.map(promise => result => promise_then_append(promise(), element => promise_resolve(result.concat([element])))), [])); } call.promise_condense = promise_condense; /** * @author fenris */ function promise_group(promises, serial = false) { const decorate = function (promise, name) { return (() => promise_then_append(promise(), value => promise_resolve({ "key": name, "value": value }))); }; const convert = function (array) { let object = {}; array.forEach(({ "key": key, "value": value }) => { object[key] = value; }); return object; }; if (serial) { return (promise_then_append(promise_condense(Object.keys(promises) .map(name => decorate(promises[name], name))), list => promise_resolve(convert(list)))); } else { return (promise_then_append(promise_all(Object.keys(promises) .map(name => decorate(promises[name], name)) .map(promise => promise())), list => promise_resolve(convert(list)))); } } call.promise_group = promise_group; /** * @author fenris */ function promise_wrap(promise, transformator_result, transformator_reason = lib_plankton.call.id) { return (promise_make((resolve, reject) => { promise_then_close(promise, result => resolve(transformator_result(result)), reason => reject(transformator_reason(reason))); })); } call.promise_wrap = promise_wrap; /** * @author fenris */ /* export function promise_show(label : string) : (result : type_result)=>type_promise { return ( result => promise_make( (resolve, reject) => { // lib_plankton.log.info(label + ": " + instance_show(result)); process.stdout.write(label + ": " + instance_show(result)); resolve(result); } ) ); } */ /** * @author fenris */ /* export function promise_log(result : type_result) : (result : type_result)=>type_promise { return promise_show("log"); } */ /** * @author fenris */ function promise_attach(state, promise, name) { return (promise_wrap(promise, result => { state[name] = result; return state; })); } call.promise_attach = promise_attach; /** * @author fenris */ function promise_delay(promise, delay) { return promise_make((resolve, reject) => { call.timeout(() => { promise_then_close(promise, resolve, reject); return null; }, delay); }); } call.promise_delay = promise_delay; /** * @author fenris */ function promise_to_executor(promise) { return ((resolve, reject) => promise.then(resolve, reject)); } call.promise_to_executor = promise_to_executor; })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** */ class CancellablePromise extends Promise { /** */ constructor(executor) { super((resolve, reject) => { }); this.subject = (new Promise((resolve, reject) => { Promise.race([ new Promise(executor), new Promise((resolve_, reject_) => { this.interval = setInterval(() => { if (!this.cancelled) { // do nothing } else { reject_(new Error("cancelled")); this.clear(); } }, 0); }), ]) .then(resolve, reject); })); this.cancelled = false; this.interval = null; } /** */ clear() { if (this.interval === null) { // do nothing } else { clearInterval(this.interval); this.interval = null; } } /** */ then(onfulfilled, onrejected) { this.clear(); return this.subject.then(onfulfilled, onrejected); } /** */ catch(x) { this.clear(); return this.subject.catch(x); } /** */ cancel() { this.cancelled = true; this.clear(); } } call.CancellablePromise = CancellablePromise; })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** * @author fenris */ let enum_initializer_state; (function (enum_initializer_state) { enum_initializer_state[enum_initializer_state["initial"] = 0] = "initial"; enum_initializer_state[enum_initializer_state["waiting"] = 1] = "waiting"; enum_initializer_state[enum_initializer_state["successful"] = 2] = "successful"; enum_initializer_state[enum_initializer_state["failed"] = 3] = "failed"; })(enum_initializer_state = call.enum_initializer_state || (call.enum_initializer_state = {})); /** * @author fenris */ function initializer_make(fetcher) { let subject = { "fetcher": fetcher, "state": enum_initializer_state.initial, "queue": [], "result": undefined, "reason": undefined, }; return subject; } call.initializer_make = initializer_make; /** * @author fenris */ function initializer_actuate(subject) { switch (subject.state) { case enum_initializer_state.successful: { subject.queue.forEach(entry => entry.resolve(subject.result)); break; } case enum_initializer_state.failed: { subject.queue.forEach(entry => entry.reject(subject.reason)); break; } default: { throw (new Error(`unhandled state ${subject.state}`)); break; } } } /** * @author fenris */ function initializer_reset(subject) { subject.state = enum_initializer_state.initial; subject.queue = []; } call.initializer_reset = initializer_reset; /** * @author fenris */ function initializer_state(subject) { return subject.state; } call.initializer_state = initializer_state; /** * @author fenris */ function initializer_get(subject) { switch (subject.state) { case enum_initializer_state.initial: { subject.state = enum_initializer_state.waiting; return (call.promise_make((resolve, reject) => { subject.queue.push({ "resolve": resolve, "reject": reject }); subject.fetcher().then(result => { subject.state = enum_initializer_state.successful; subject.result = result; initializer_actuate(subject); }, reason => { subject.state = enum_initializer_state.failed; subject.reason = reason; initializer_actuate(subject); }); })); break; } case enum_initializer_state.waiting: { return (call.promise_make((resolve, reject) => { subject.queue.push({ "resolve": resolve, "reject": reject }); })); break; } case enum_initializer_state.successful: { return (call.promise_resolve(subject.result)); break; } case enum_initializer_state.failed: { return (call.promise_reject(subject.reason)); break; } default: { throw (new Error(`unhandled state ${subject.state}`)); break; } } } call.initializer_get = initializer_get; /** * @author fenris */ function initializer_get_sync(subject) { switch (subject.state) { case enum_initializer_state.successful: { return subject.result; break; } case enum_initializer_state.failed: { throw subject.reason; break; } default: { throw (new Error(`unhandled state ${subject.state}`)); break; } } } /** * @author fenris */ function initializer_set_sync(subject, result) { switch (subject.state) { case enum_initializer_state.successful: { subject.result = result; break; } case enum_initializer_state.failed: { subject.state = enum_initializer_state.successful; subject.result = result; break; } default: { throw (new Error(`unhandled state ${subject.state}`)); break; } } } })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /* The core idea of this library is to provide means for asynchronous program flow. The old-school way to do is, is to use callbacks. While this approach is simple and easy to understand, it has some disadvantages. As an attempt to relief and improve this, the promise-system was introduced. In principle it solves most of the problems found in the callback-approach; however it has some downsides as well: - Convolution of multiple principles Promises unite the ideas of asynchronous program flow and error handling. - Instant execution Creating a promise results in the instant execution of the given executor prodecure. While this might be convenient in some cases, it can be quite disturbing and counter-intuitive in others. - Broken typing The Promise system doesn't distinguish between an appending "then" (i.e. passing a function, which returns a new promise) and a closing "then" (i.e. passing a function, which has no return value). On top of that it allows returning simple values in an appending "then", which results in an implicit call of the executors "resolve"-function. The price for these "pragmatic" features is that the whole system can't be typed well. And even though JavaScript is not a strictly typed language, it was a quite questionable decision to design the promise system in a way, which breaks typing from the start. The deferral-system forseeks to solve these issues while retaining the advantages of the promise-system. */ /** * @author fenris * @desc activates the deferral and handles its output according to a given procedure * @param {(value : type_value)=>void} procedure a function which receives the output of the deferral as argument */ function deferral_use(deferral, input, procedure) { deferral.representation(input).then(value => { procedure(value); }, reason => { throw reason; }); } call.deferral_use = deferral_use; /** * @author fenris * @desc creates a deferral-subject (similar to "new Promise", where "convey" reflects "resolve"/"reject") */ function deferral_make(handler) { return ({ "representation": ((input) => (new Promise((resolve, reject) => { handler(input, resolve); }))) }); } call.deferral_make = deferral_make; /** * @author fenris * @desc wraps a simple function into a deferral (similar to "Promise.resolve"/"Promise.reject") */ function deferral_wrap(function_) { return (deferral_make((input, convey) => convey(function_(input)))); } call.deferral_wrap = deferral_wrap; /** * @author fenris */ function deferral_id() { return (deferral_make((input, convey) => convey(input))); } call.deferral_id = deferral_id; /** * @author fenris */ function deferral_const(value) { return (deferral_make((input, convey) => convey(value))); } call.deferral_const = deferral_const; /** * @author fenris */ function deferral_delay(output, delay) { return (deferral_make((input, convey) => { setTimeout(() => convey(output), delay); })); } call.deferral_delay = deferral_delay; /** * @author fenris * @desc connects two deferrals to form a new one; the output of the first is taken as input for the second * (similar to "Promise.then" when passing a function which returns a new promise) * @param {type_deferral} first a simple deferral * @param {(value1 : type_value1)=>type_deferral} second a function depending from a value returning a deferral */ function deferral_compose_serial(first, second) { return { "representation": ((input) => first.representation(input).then((between) => second.representation(between))) }; } call.deferral_compose_serial = deferral_compose_serial; /** * @author fenris */ function deferral_compose_parallel({ "left": deferral_left, "right": deferral_right, }) { return (deferral_make((input, convey) => { let object = { "left": lib_plankton.pod.make_empty(), "right": lib_plankton.pod.make_empty(), }; let finish = function () { if (lib_plankton.pod.is_filled(object.left) && lib_plankton.pod.is_filled(object.right)) { let result = { "left": lib_plankton.pod.cull(object.left), "right": lib_plankton.pod.cull(object.right), }; convey(result); } else { // do nothing } }; deferral_use(deferral_left, input, output_left => { object.left = lib_plankton.pod.make_filled(output_left); finish(); }); deferral_use(deferral_right, input, output_right => { object.right = lib_plankton.pod.make_filled(output_right); finish(); }); })); } call.deferral_compose_parallel = deferral_compose_parallel; /** * @author fenris * @desc repeatedly applied serial composition */ function deferral_chain(members) { return (members.reduce( // (result, current) => deferral_compose_serial(result, current), deferral_compose_serial, deferral_id())); } call.deferral_chain = deferral_chain; /** * @author fenris */ /* export function deferral_bunch( members : {[name : string] : type_deferral} ) : type_deferral { } */ })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** * @author fenris */ class class_deferral { /** * @author fenris */ constructor(subject) { this.subject = subject; } /** * @author fenris */ static _cram(subject) { return (new class_deferral(subject)); } /** * @author fenris */ static _tear(instance) { return instance.subject; } /** * @author fenris */ static make(handler) { return (class_deferral._cram(call.deferral_make(handler))); } /** * @author fenris */ use(input, procedure) { return (call.deferral_use(class_deferral._tear(this), input, procedure)); } /** * @author fenris */ compose_serial(second) { return (class_deferral._cram(call.deferral_compose_serial(class_deferral._tear(this), class_deferral._tear(second)))); } /** * @author fenris */ static chain(members) { return (class_deferral._cram(call.deferral_chain(members.map(member => class_deferral._tear(member))))); } /** * @author fenris */ static wrap(function_) { return (class_deferral._cram(call.deferral_wrap(function_))); } /** * @author fenris */ static const_(value) { return (class_deferral._cram(call.deferral_const(value))); } /** * @author fenris */ static delay(output, delay) { return (class_deferral._cram(call.deferral_delay(output, delay))); } } call.class_deferral = class_deferral; })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:call«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:call« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:call« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:call«. If not, see . */ var lib_plankton; (function (lib_plankton) { var call; (function (call) { /** * converts the "arguments"-map into an array * * @param {Object} args * @author fenris */ function args2list(args) { return Object.keys(args).map(key => args[key]); } call.args2list = args2list; /** * just the empty function; useful for some callbacks etc. * * @author fenris */ function nothing() { } call.nothing = nothing; /** * just the identity; useful for some callbacks etc.; defined as function instead of const for using type parameters * * @author fenris */ function id(x) { return x; } call.id = id; /** * just the identity; useful for some callbacks etc. * * @author fenris */ function const_(x) { return (y => x); } call.const_ = const_; /** * composes two functions (i.e. returns a function that return the result of the successive execution of both input-functions) * * @param {function} function_f * @param {function} function_g * @author fenris */ function compose(function_f, function_g) { return (function (x) { // return function_g(function_f(x)); return function_g(function_f.apply(function_f, args2list(arguments))); }); } call.compose = compose; /** * @author fenris */ function curryfy_real(f, n) { switch (n) { case 0: { throw (new Error("[curryfy] impossible")); // break; } case 1: { return f; // break; } default: { return (function (x) { return (curryfy_real(function () { return f.apply(f, [x].concat(args2list(arguments))); }, n - 1)); }); // break; } } } /** * transforms a function with sequential input into a function with leveled input; example: add(2,3) = curryfy(add)(2)(3) * * @param {function} f * @return {function} the currified version of the in put function * @author fenris */ function curryfy(f) { return curryfy_real(f, f.length); } call.curryfy = curryfy; /** * @author fenris */ function convey(value, functions) { let result = value; functions.forEach(function_ => { result = function_(result); }); return result; } call.convey = convey; /** * @author fenris */ function timeout(procedure, delay) { return ( /*window.*/ setTimeout(procedure, delay)); } call.timeout = timeout; /** * a definition for a value being "defined" * * @author neuc */ function is_def(obj, options = {}) { options = Object.assign({ "null_is_valid": false, }, options); return (!((typeof (obj) === "undefined") || (!options.null_is_valid && (obj === null)))); } call.is_def = is_def; /** * returns the value if set and, when a type is specified, if the type is correct, if not return default_value * * @author neuc */ function def_val(value, default_value, options = {}) { options = Object.assign({ "type": null, "null_is_valid": false, }, options); if (is_def(value, { "null_is_valid": options.null_is_valid }) && (is_def(options.type) ? ((typeof (value) === options.type) || ((value === null) && options.null_is_valid)) : true)) { return value; } else { return default_value; } } call.def_val = def_val; ; /** * provides the call for an attribute of a class as a regular function; useful for processing lists of objects * * @param {string} name the name of the attribute * @return {function} * @author fenris */ function attribute(name) { return (object => object[name]); } call.attribute = attribute; /** * provides a method of a class as a regular function; useful for processing lists of objects * * @param {string} name the name of the method * @return {function} * @author fenris */ function method(name) { return (function (object) { return object[name].apply(object, args2list(arguments).slice(1)); }); } call.method = method; /** * @author fenris */ function distinguish(coproduct, handlers, options = {}) { options = Object.assign({ "fallback": null, }, options); if (coproduct.kind in handlers) { const handler = handlers[coproduct.kind]; return handler(coproduct.data); } else { const message = ("unhandled kind '" + coproduct.kind + "'"); if (options.fallback !== null) { console.warn(message); return options.fallback(coproduct); } else { throw (new Error(message)); } } } call.distinguish = distinguish; /** * Promise version of "setTimeout" * * @author fenris */ function defer(seconds, action) { return (new Promise((resolve, reject) => { setTimeout(() => resolve(action()), Math.floor(seconds * 1000)); })); } call.defer = defer; /** * rate limiting algorithm, based on the idea of mana (magic power) in video games: * - an actor has a fixed mana capacity, i.e. the maximum amount of available power * - an actor has a fixed rate of mana regeneration, i.e. how fast the power is filled up (linear growth) * - an action has a defined mana heft, i.e. how much power is required and deducted in order to execute it * - mana states are represented by snapshots, i.e. the amount of power at a certain point in time * * @author fenris */ function rate_limit_check(setup, heft) { return __awaiter(this, void 0, void 0, function* () { if (heft > setup.capacity) { return Promise.resolve({ "granted": false, "seconds": null, }); } else { // get current value const current_timestamp = (Date.now() / 1000); const old_snapshot_raw = (yield setup.get_snapshot()); const old_snapshot = (old_snapshot_raw !== null && old_snapshot_raw !== void 0 ? old_snapshot_raw : { "timestamp": current_timestamp, "value": setup.capacity }); const seconds_passed = (current_timestamp - old_snapshot.timestamp); const current_value = Math.min(setup.capacity, (old_snapshot.value + (setup.regeneration_rate * seconds_passed))); // analyze if (current_value < heft) { // too less const seconds_needed = ((setup.regeneration_rate <= 0) ? null : ((heft - old_snapshot.value) / setup.regeneration_rate)); return Promise.resolve({ "granted": false, "seconds": ((seconds_needed === null) ? null : (seconds_needed - seconds_passed)), }); } else { // enough -> update snapshot const new_value = (current_value - heft); // set_snapshot if (old_snapshot_raw === null) { yield setup.set_snapshot({ "timestamp": current_timestamp, "value": new_value }); } else { yield setup.update_snapshot(current_timestamp, (new_value - old_snapshot.value)); } return Promise.resolve({ "granted": true, "seconds": 0, }); } } }); } call.rate_limit_check = rate_limit_check; })(call = lib_plankton.call || (lib_plankton.call = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ function inverse_encode(decode, to) { return decode(to); } code.inverse_encode = inverse_encode; /** * @author fenris */ function inverse_decode(encode, from) { return encode(from); } code.inverse_decode = inverse_decode; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ var class_code_inverse = /** @class */ (function () { /** * @author fenris */ function class_code_inverse(subject) { this.subject = subject; } /** * @implementation * @author fenris */ class_code_inverse.prototype.encode = function (to) { var _this = this; return code.inverse_encode(function (x) { return _this.subject.decode(x); }, to); }; /** * @implementation * @author fenris */ class_code_inverse.prototype.decode = function (from) { var _this = this; return code.inverse_decode(function (x) { return _this.subject.encode(x); }, from); }; return class_code_inverse; }()); code.class_code_inverse = class_code_inverse; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ function pair_encode(encode_first, encode_second, from) { var between = encode_first(from); var to = encode_second(between); return to; } code.pair_encode = pair_encode; /** * @author fenris */ function pair_decode(decode_first, decode_second, to) { var between = decode_second(to); var from = decode_first(between); return from; } code.pair_decode = pair_decode; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ var class_code_pair = /** @class */ (function () { /** * @author fenris */ function class_code_pair(first, second) { this.first = first; this.second = second; } /** * @implementation * @author fenris */ class_code_pair.prototype.encode = function (from) { var _this = this; return code.pair_encode(function (x) { return _this.first.encode(x); }, function (x) { return _this.second.encode(x); }, from); }; /** * @implementation * @author fenris */ class_code_pair.prototype.decode = function (to) { var _this = this; return code.pair_decode(function (x) { return _this.first.decode(x); }, function (x) { return _this.second.decode(x); }, to); }; return class_code_pair; }()); code.class_code_pair = class_code_pair; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ function chain_encode(encode_links, from) { var value = from; encode_links .forEach(function (link) { value = link(value); }); return value; } code.chain_encode = chain_encode; /** * @author fenris */ function chain_decode(decode_links, to) { var value = to; decode_links .reverse() .forEach(function (link) { value = link(value); }); return value; } code.chain_decode = chain_decode; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ var class_code_chain = /** @class */ (function () { /** * @author fenris */ function class_code_chain(links) { this.links = links; } /** * @implementation * @author fenris */ class_code_chain.prototype.encode = function (from) { return code.chain_encode(this.links.map(function (link) { return (function (x) { return link.encode(x); }); }), from); }; /** * @implementation * @author fenris */ class_code_chain.prototype.decode = function (to) { return code.chain_decode(this.links.map(function (link) { return (function (x) { return link.decode(x); }); }), to); }; return class_code_chain; }()); code.class_code_chain = class_code_chain; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author Christian Fraß */ function flatten_encode(from, keys) { if (keys === void 0) { keys = null; } if (keys === null) { if (from.length > 0) { keys = Object.keys(from[0]); } else { throw (new Error("encoding impossible")); } } return { "keys": keys, "data": from.map(function (line) { return keys.map(function (name) { return line[name]; }); }), }; } code.flatten_encode = flatten_encode; /** * @author Christian Fraß */ function flatten_decode(to) { return (to.data .map(function (dataset) { var dataset_ = {}; dataset .forEach(function (value, index) { var name = to.keys[index]; dataset_[name] = value; }); return dataset_; })); } code.flatten_decode = flatten_decode; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:code«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:code« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:code« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:code«. If not, see . */ var lib_plankton; (function (lib_plankton) { var code; (function (code) { /** * @author fenris */ var class_code_flatten = /** @class */ (function () { /** * @author fenris */ function class_code_flatten() { } /** * @implementation * @author fenris */ class_code_flatten.prototype.encode = function (x) { return code.flatten_encode(x); }; /** * @implementation * @author fenris */ class_code_flatten.prototype.decode = function (x) { return code.flatten_decode(x); }; return class_code_flatten; }()); code.class_code_flatten = class_code_flatten; })(code = lib_plankton.code || (lib_plankton.code = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:json«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:json« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:json« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:json«. If not, see . */ var lib_plankton; (function (lib_plankton) { var json; (function (json) { /** * @author fenris */ function encode(x, formatted = false) { return JSON.stringify(x, undefined, formatted ? "\t" : undefined); } json.encode = encode; /** * @author fenris */ function decode(x) { return JSON.parse(x); } json.decode = decode; })(json = lib_plankton.json || (lib_plankton.json = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:json«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:json« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:json« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:json«. If not, see . */ var lib_plankton; (function (lib_plankton) { var json; (function (json) { /** * @author fenris */ class class_json { /** * @author fenris */ constructor() { } /** * @implementation * @author fenris */ encode(x) { return json.encode(x); } /** * @implementation * @author fenris */ decode(x) { return json.decode(x); } } json.class_json = class_json; })(json = lib_plankton.json || (lib_plankton.json = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:file«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:file« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:file« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:file«. If not, see . */ var lib_plankton; (function (lib_plankton) { var file; (function (file) { /** * @author fenris */ function read(path) { var nm_fs = require("fs"); return (new Promise(function (resolve, reject) { nm_fs.readFile(path, { "encoding": "utf8", "flag": "r", }, function (error, content) { if (error == null) { resolve(content); } else { reject(error); } }); })); } file.read = read; /** * @author fenris */ function read_buffer(path) { var nm_fs = require("fs"); return (new Promise(function (resolve, reject) { nm_fs.readFile(path, { "flag": "r", }, function (error, content) { if (error == null) { resolve(content); } else { reject(error); } }); })); } file.read_buffer = read_buffer; /** * @author fenris */ function read_stdin() { return (new Promise(function (resolve, reject) { var input_raw = ""; process.stdin.setEncoding("utf8"); process.stdin.on("readable", function () { var chunk; while ((chunk = process.stdin.read()) !== null) { input_raw += chunk; } }); process.stdin.on("end", function () { resolve(input_raw); }); })); } file.read_stdin = read_stdin; /** * @author fenris */ function write(path, content, options) { if (options === void 0) { options = {}; } options = Object.assign({ "encoding": "utf-8", }, options); var nm_fs = require("fs"); return (new Promise(function (resolve, reject) { nm_fs.writeFile(path, content, { "encoding": options.encoding, "flag": "w", }, function (error) { if (error == null) { resolve(undefined); } else { reject(error); } }); })); } file.write = write; /** * @author fenris */ function write_buffer(path, content, options) { if (options === void 0) { options = {}; } options = Object.assign({}, options); var nm_fs = require("fs"); return (new Promise(function (resolve, reject) { nm_fs.writeFile(path, content, { "flag": "w", }, function (error) { if (error == null) { resolve(undefined); } else { reject(error); } }); })); } file.write_buffer = write_buffer; /** */ function delete_(path) { var nm_fs = require("fs"); return (new Promise(function (resolve, reject) { nm_fs.unlink(path, function () { resolve(undefined); }); })); } file.delete_ = delete_; })(file = lib_plankton.file || (lib_plankton.file = {})); })(lib_plankton || (lib_plankton = {})); var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** */ var enum_level; (function (enum_level) { enum_level[enum_level["debug"] = 0] = "debug"; enum_level[enum_level["info"] = 1] = "info"; enum_level[enum_level["notice"] = 2] = "notice"; enum_level[enum_level["warning"] = 3] = "warning"; enum_level[enum_level["error"] = 4] = "error"; })(enum_level = log.enum_level || (log.enum_level = {})); ; /** */ function level_order(level1, level2) { return (level1 <= level2); } log.level_order = level_order; /** */ function level_show(level) { switch (level) { case enum_level.debug: return "debug"; case enum_level.info: return "info"; case enum_level.notice: return "notice"; case enum_level.warning: return "warning"; case enum_level.error: return "error"; default: return "(unknown)"; } } log.level_show = level_show; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:lang«. If not, see . */ /** * @deprecated * @todo remove */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** * @author fenris */ /*export*/ var level_stack = [0]; function level_push(level) { level_stack.push(level); } log.level_push = level_push; function level_pop() { if (level_stack.length > 1) { level_stack.pop(); } } log.level_pop = level_pop; function level_get() { return level_stack.slice(-1)[0]; } /* export function level_inc() : void {level_push(level_get()+1);} export function level_dec() : void {level_push(level_get()-1);} */ /** * @author fenris */ var indent_stack = [0]; function indent_push(indent) { indent_stack.push(indent); } log.indent_push = indent_push; function indent_pop() { if (indent_stack.length > 1) { indent_stack.pop(); } } log.indent_pop = indent_pop; function indent_get() { return level_stack.slice(-1)[0]; } function indent_inc() { level_push(level_get() + 1); } log.indent_inc = indent_inc; function indent_dec() { level_push(level_get() - 1); } log.indent_dec = indent_dec; /** * @author fenris */ function write(_a) { var message = _a["message"], _b = _a["type"], type = _b === void 0 ? null : _b, _c = _a["prefix"], prefix = _c === void 0 ? null : _c, _d = _a["level"], level = _d === void 0 ? 0 : _d, _e = _a["indent"], indent = _e === void 0 ? 0 : _e; var entry = { "level": ((type === null) ? lib_plankton.log.enum_level.info : { "debug": lib_plankton.log.enum_level.debug, "info": lib_plankton.log.enum_level.info, "notice": lib_plankton.log.enum_level.notice, "warning": lib_plankton.log.enum_level.warning, "error": lib_plankton.log.enum_level.error, }[type]), "incident": message, "details": { "prefix": prefix, "level": level, "indent": indent, }, }; lib_plankton.log.add(entry); } log.write = write; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** */ var class_channel = /** @class */ (function () { function class_channel() { } return class_channel; }()); log.class_channel = class_channel; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** * output for writing log entries to stdout */ var class_channel_stdout = /** @class */ (function (_super) { __extends(class_channel_stdout, _super); function class_channel_stdout() { return _super !== null && _super.apply(this, arguments) || this; } /** */ class_channel_stdout.prototype.add = function (entry) { process.stdout.write(("<" + (new Date(Date.now())).toISOString().slice(0, 19) + ">") + " " + ("[" + log.level_show(entry.level) + "]") + " " + ("" + entry.incident + "") + ": " + JSON.stringify(entry.details, undefined, " ") + "\n"); }; return class_channel_stdout; }(log.class_channel)); log.class_channel_stdout = class_channel_stdout; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** */ var class_channel_file = /** @class */ (function (_super) { __extends(class_channel_file, _super); /** * [constructor] */ function class_channel_file(path) { var _this = _super.call(this) || this; _this.path = path; return _this; } /** */ class_channel_file.prototype.add = function (entry) { var _this = this; var nm_fs = require("fs"); nm_fs.writeFile(this.path, { "flag": "a+", }, (("<" + (new Date(Date.now())).toISOString().slice(0, 19) + ">") + " " + ("[" + log.level_show(entry.level) + "]") + " " + ("" + entry.incident + "") + ": " + JSON.stringify(entry.details, undefined, " ") + "\n"), function (error) { process.stderr.write('-- [plankton] could not add log entry to file ' + _this.path + "\n"); }); }; return class_channel_file; }(log.class_channel)); log.class_channel_file = class_channel_file; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** * output for desktop notifications via "libnotify" */ var class_channel_notify = /** @class */ (function (_super) { __extends(class_channel_notify, _super); function class_channel_notify() { return _super !== null && _super.apply(this, arguments) || this; } /** */ class_channel_notify.prototype.add = function (entry) { var nm_child_process = require("child_process"); var command = ("notify-send" + " " + ("'" + ("[" + log.level_show(entry.level) + "]") + " " + entry.incident + "'") + " " + ("'" + (Object.keys(entry.details) .map(function (key) { return (key + ": " + JSON.stringify(entry.details[key])); }) .join("\n")) + "'")); nm_child_process.exec(command, function (error, stdout, stderr) { // do noting }); }; return class_channel_notify; }(log.class_channel)); log.class_channel_notify = class_channel_notify; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** * decorator for filtering out log entries below a certain level threshold */ var class_channel_minlevel = /** @class */ (function (_super) { __extends(class_channel_minlevel, _super); /** */ function class_channel_minlevel(core, threshold) { var _this = _super.call(this) || this; _this.core = core; _this.threshold = threshold; return _this; } /** */ class_channel_minlevel.prototype.add = function (entry) { if (!log.level_order(this.threshold, entry.level)) { // do nothing } else { this.core.add(entry); } }; return class_channel_minlevel; }(log.class_channel)); log.class_channel_minlevel = class_channel_minlevel; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** */ function translate_level(level_string) { return { "debug": log.enum_level.debug, "info": log.enum_level.info, "notice": log.enum_level.notice, "warning": log.enum_level.warning, "error": log.enum_level.error, }[level_string]; } /** */ function channel_make(description) { var _a, _b, _c, _d; switch (description.kind) { default: { throw (new Error("unhandled log channel kind: " + description.kind)); break; } case "stdout": { return (new log.class_channel_minlevel(new log.class_channel_stdout(), translate_level((_a = description.data["threshold"]) !== null && _a !== void 0 ? _a : "debug"))); break; } case "file": { return (new log.class_channel_minlevel(new log.class_channel_file((_b = description.data["path"]) !== null && _b !== void 0 ? _b : "/tmp/plankton.log"), translate_level((_c = description.data["threshold"]) !== null && _c !== void 0 ? _c : "debug"))); break; } case "notify": { return (new log.class_channel_minlevel(new log.class_channel_notify(), translate_level((_d = description.data["threshold"]) !== null && _d !== void 0 ? _d : "debug"))); break; } } } log.channel_make = channel_make; /** */ function conf_default() { return [ new log.class_channel_minlevel(new log.class_channel_stdout(), log.enum_level.notice), new log.class_channel_minlevel(new log.class_channel_notify(), log.enum_level.error), ]; } log.conf_default = conf_default; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:log«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:log« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:lang« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:log«. If not, see . */ var lib_plankton; (function (lib_plankton) { var log; (function (log) { /** */ var _channel_stack = null; /** * pushes a new configuration on the stack and activates it */ function conf_push(channels) { if (_channel_stack === null) { _channel_stack = []; } _channel_stack.push(channels); } log.conf_push = conf_push; /** * pops the current active configuration from the stack */ function conf_pop() { if (_channel_stack.length > 0) { _channel_stack.pop(); } else { // do nothing } } log.conf_pop = conf_pop; /** * makes the logging system ready */ function setup() { if (_channel_stack === null) { _channel_stack = []; conf_push(log.conf_default()); } else { // do nothing } } /** * consumes a log entry, i.e. sends it to the currently active outputs */ function add(entry) { setup(); _channel_stack.slice(-1)[0].forEach(function (channel) { return channel.add(entry); }); } log.add = add; /** */ function debug(incident, details) { if (details === void 0) { details = {}; } add({ "level": log.enum_level.debug, "incident": incident, "details": details }); } log.debug = debug; /** */ function info(incident, details) { if (details === void 0) { details = {}; } add({ "level": log.enum_level.info, "incident": incident, "details": details }); } log.info = info; /** */ function notice(incident, details) { if (details === void 0) { details = {}; } add({ "level": log.enum_level.notice, "incident": incident, "details": details }); } log.notice = notice; /** */ function warning(incident, details) { if (details === void 0) { details = {}; } add({ "level": log.enum_level.warning, "incident": incident, "details": details }); } log.warning = warning; /** */ function error(incident, details) { if (details === void 0) { details = {}; } add({ "level": log.enum_level.error, "incident": incident, "details": details }); } log.error = error; })(log = lib_plankton.log || (lib_plankton.log = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:args«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:args« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:args« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:args«. If not, see . */ var lib_plankton; (function (lib_plankton) { var args; (function (args) { /** */ var enum_environment; (function (enum_environment) { enum_environment["cli"] = "cli"; enum_environment["url"] = "url"; })(enum_environment = args.enum_environment || (args.enum_environment = {})); ; /** */ var enum_kind; (function (enum_kind) { enum_kind["positional"] = "positional"; enum_kind["volatile"] = "volatile"; })(enum_kind = args.enum_kind || (args.enum_kind = {})); ; /** */ var enum_type; (function (enum_type) { enum_type["boolean"] = "boolean"; enum_type["integer"] = "int"; enum_type["float"] = "float"; enum_type["string"] = "string"; })(enum_type = args.enum_type || (args.enum_type = {})); ; /** */ var enum_mode; (function (enum_mode) { enum_mode["replace"] = "replace"; enum_mode["accumulate"] = "accumulate"; })(enum_mode = args.enum_mode || (args.enum_mode = {})); ; })(args = lib_plankton.args || (lib_plankton.args = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:args«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:args« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:args« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:args«. If not, see . */ var lib_plankton; (function (lib_plankton) { var args; (function (args) { /* export enum_mode { replace = "replace", accumulate = "accumulate", }; */ /** * @author fenris */ var class_argument = /** @class */ (function () { /** * @author fenris */ function class_argument(_a) { var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["kind"], kind = _c === void 0 ? args.enum_kind.positional : _c, _d = _a["mode"], mode = _d === void 0 ? args.enum_mode.replace : _d, _e = _a["default"], default_ = _e === void 0 ? null : _e, _f = _a["info"], info = _f === void 0 ? null : _f, _g = _a["parameters"], parameters = _g === void 0 ? {} : _g, _h = _a["hidden"], hidden = _h === void 0 ? false : _h; this.name = name; this.type = type; this.kind = kind; this.mode = mode; this.default_ = default_; this.info = info; this.parameters = parameters; this.hidden = hidden; if (!this.check()) { throw (new Error("invalid argument-setup")); } } /** * @author fenris */ class_argument.positional = function (_a) { var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["mode"], mode = _c === void 0 ? args.enum_mode.replace : _c, _d = _a["default"], default_ = _d === void 0 ? null : _d, _e = _a["info"], info = _e === void 0 ? null : _e, _f = _a["hidden"], hidden = _f === void 0 ? false : _f, index = _a["index"]; return (new class_argument({ "name": name, "kind": args.enum_kind.positional, "type": type, "mode": mode, "default": default_, "info": info, "hidden": hidden, "parameters": { "index": index, }, })); }; /** * @author fenris */ class_argument.volatile = function (_a) { var name = _a["name"], _b = _a["type"], type = _b === void 0 ? args.enum_type.string : _b, _c = _a["mode"], mode = _c === void 0 ? args.enum_mode.replace : _c, _d = _a["default"], default_ = _d === void 0 ? null : _d, _e = _a["info"], info = _e === void 0 ? null : _e, _f = _a["hidden"], hidden = _f === void 0 ? false : _f, indicators_short = _a["indicators_short"], indicators_long = _a["indicators_long"]; return (new class_argument({ "name": name, "kind": args.enum_kind.volatile, "type": type, "mode": mode, "default": default_, "info": info, "hidden": hidden, "parameters": { "indicators_short": indicators_short, "indicators_long": indicators_long, }, })); }; /** * @author fenris */ class_argument.prototype.check = function () { var _this = this; return [ function () { return ((!(_this.kind == args.enum_kind.volatile)) || (("indicators_long" in _this.parameters) && (_this.parameters["indicators_long"]["length"] >= 0))); }, ].every(function (condition) { return condition(); }); }; /** * @author fenris */ class_argument.prototype.name_get = function () { return this.name; }; /** * @author fenris */ class_argument.prototype.kind_get = function () { return this.kind; }; /** * @author fenris */ class_argument.prototype.type_get = function () { return this.type; }; /** * @author fenris */ class_argument.prototype.mode_get = function () { return this.mode; }; /** * @author fenris */ class_argument.prototype.default_get = function () { return this.default_; }; /** * @author fenris */ class_argument.prototype.parameters_get = function () { return this.parameters; }; /** * @author fenris */ class_argument.prototype.hidden_get = function () { return this.hidden; }; /** * @author fenris */ class_argument.prototype.toString = function () { return "<".concat(this.name, ">"); }; /** * @author fenris */ class_argument.prototype.indicator_main = function () { if (this.kind === args.enum_kind.volatile) { return this.parameters["indicators_long"][0]; } else { return null; } }; /** * @author fenris */ class_argument.prototype.pattern_value = function () { switch (this.type) { case args.enum_type.boolean: { return "false|true"; break; } case args.enum_type.integer: { return "[0-9]+"; break; } case args.enum_type.float: { return "\\d*(?:\\.\\d+)?"; break; } case args.enum_type.string: { return "\\S+"; break; } default: { throw (new Error("unhandled type ".concat(this.type))); break; } } }; /** * @author fenris */ class_argument.prototype.extract = function (raw) { switch (this.type) { case args.enum_type.boolean: { return (raw != "false"); break; } case args.enum_type.integer: { return parseInt(raw); break; } case args.enum_type.float: { return parseFloat(raw); break; } case args.enum_type.string: { return raw; break; } default: { throw (new Error("unhandled type ".concat(this.type))); break; } } }; /** * @author fenris */ class_argument.prototype.assign = function (data, target, raw) { var value = this.extract(raw); switch (this.mode) { case args.enum_mode.replace: { data[target] = value; break; } case args.enum_mode.accumulate: { /* if (! (this.name in data)) { data[this.name] = []; } */ data[target].push(value); break; } default: { throw (new Error("unhandled mode ".concat(this.mode))); } } }; /** * @author fenris */ class_argument.prototype.make = function (data, target) { var value = data[target]; return value.toString(); }; /** * @author fenris */ class_argument.prototype.generate_help = function () { var _this = this; var _a, _b, _c, _d; var output = ""; { switch (this.kind) { case args.enum_kind.positional: { var line = ""; line += "\t"; line += "<".concat(this.name, ">"); line += "\n"; output += line; } case args.enum_kind.volatile: { var line = ""; line += "\t"; if (this.type === args.enum_type.boolean) { line += ([] .concat(((_a = this.parameters["indicators_short"]) !== null && _a !== void 0 ? _a : []).map(function (indicator) { return ("-" + indicator); })) .concat(((_b = this.parameters["indicators_long"]) !== null && _b !== void 0 ? _b : []).map(function (indicator) { return ("--" + indicator); })) .join(" | ")); } else { line += ([] .concat(((_c = this.parameters["indicators_short"]) !== null && _c !== void 0 ? _c : []).map(function (indicator) { return ("-" + indicator + " " + ("<" + _this.name + ">")); })) .concat(((_d = this.parameters["indicators_long"]) !== null && _d !== void 0 ? _d : []).map(function (indicator) { return ("--" + indicator + "=" + ("<" + _this.name + ">")); })) .join(" | ")); } line += "\n"; output += line; } } } { var line = ""; line += "\t\t"; var infotext = ((this.info == null) ? "(no info available)" : this.info); line += infotext; if ((this.type != "boolean") && (this.default_ != null)) { line += "; default: ".concat(this.default_.toString()); } line += "\n"; output += line; } return output; }; return class_argument; }()); args.class_argument = class_argument; })(args = lib_plankton.args || (lib_plankton.args = {})); })(lib_plankton || (lib_plankton = {})); /* This file is part of »bacterio-plankton:args«. Copyright 2016-2023 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' »bacterio-plankton:args« is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. »bacterio-plankton:args« is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with »bacterio-plankton:args«. If not, see . */ var lib_plankton; (function (lib_plankton) { var args; (function (args) { /** * @author fenris */ var settings = { "environment": { "cli": { "symbols": { "delimiter": " ", "prefix": "--", "assignment": "=", }, }, "url": { "symbols": { "delimiter": "&", "prefix": "", "assignment": "=", } } }, }; /** * @author fenris */ args.verbosity = 0; /** * @author fenris * @todo check validity */ var class_handler = /** @class */ (function () { /** * @author fenris */ function class_handler(arguments_) { this.arguments_ = arguments_; } /** * @author fenris */ class_handler.prototype.filter = function (kind) { var arguments_ = {}; for (var _i = 0, _a = Object.entries(this.arguments_); _i < _a.length; _i++) { var _b = _a[_i], name = _b[0], argument = _b[1]; if (argument.kind_get() == kind) { arguments_[name] = argument; } } return arguments_; }; /** * @author fenris */ class_handler.prototype.read = function (environment, input, data) { var _this = this; if (data === void 0) { data = {}; } switch (environment) { case args.enum_environment.cli: case args.enum_environment.url: { // default values { for (var _i = 0, _a = Object.entries(this.arguments_); _i < _a.length; _i++) { var _b = _a[_i], name = _b[0], argument = _b[1]; data[name] = argument.default_get(); } } // preprocessing { // short indicators (lil hacky ...) { if (environment == args.enum_environment.cli) { for (var _c = 0, _d = Object.entries(this.filter(args.enum_kind.volatile)); _c < _d.length; _c++) { var _e = _d[_c], name = _e[0], argument = _e[1]; // console.info(argument.parameters_get()["indicators_short"].join("|")); var pattern_from = ""; { pattern_from += "(?:^|".concat(settings["environment"][environment]["symbols"]["delimiter"], ")"); pattern_from += "-".concat(argument.parameters_get()["indicators_short"].join("|")); pattern_from += "(?:$|".concat(settings["environment"][environment]["symbols"]["delimiter"], ")"); } var pattern_to = ""; { pattern_to += settings["environment"][environment]["symbols"]["delimiter"]; pattern_to += settings["environment"][environment]["symbols"]["prefix"]; pattern_to += argument.indicator_main(); if (argument.type_get() == args.enum_type.boolean) { pattern_to += settings["environment"][environment]["symbols"]["delimiter"]; } else { pattern_to += settings["environment"][environment]["symbols"]["assignment"]; } } var result = input.replace(new RegExp(pattern_from, "g"), pattern_to); lib_plankton.log.debug("lib_args:read:replacing", { "pattern_from": pattern_from, "pattern_to": pattern_to, "input": input, "result": result, }); input = result; } } } lib_plankton.log.debug("lib_args:read:current_input", { "input": input, }); } // parsing { var parts = input .split(settings["environment"][environment]["symbols"]["delimiter"]) .filter(function (x) { return (x != ""); }); var index_expected_1 = 0; parts.forEach(function (part) { lib_plankton.log.debug("lib_args:read:analyzing", { "part": part, }); var found = [ function () { lib_plankton.log.debug("lib_args:read:probing_as_volatile", { "part": part, }); for (var _i = 0, _a = Object.entries(_this.filter(args.enum_kind.volatile)); _i < _a.length; _i++) { var _b = _a[_i], name = _b[0], argument = _b[1]; lib_plankton.log.debug("lib_args:read:probing_as_volatile:trying", { "part": part, "argument": argument.toString(), }); var pattern = ""; { var pattern_front = ""; pattern_front += "".concat(settings["environment"][environment]["symbols"]["prefix"]); pattern_front += "(?:".concat(argument.parameters_get()["indicators_long"].join("|"), ")"); pattern += pattern_front; } { var pattern_back = ""; pattern_back += "".concat(settings["environment"][environment]["symbols"]["assignment"]); pattern_back += "(".concat(argument.pattern_value(), ")"); if (argument.type_get() == args.enum_type.boolean) { pattern_back = "(?:".concat(pattern_back, ")?"); } pattern += pattern_back; } lib_plankton.log.debug("lib_args:read:probing_as_volatile:pattern", { "pattern": pattern, }); var regexp = new RegExp(pattern); var matching = regexp.exec(part); lib_plankton.log.debug("lib_args:read:probing_as_volatile:matching", { "matching": matching, }); if (matching == null) { // do nothing } else { argument.assign(data, name, matching[1]); return true; } } return false; }, function () { lib_plankton.log.debug("lib_args:read:probing_as_positional", { "part": part, }); var positional = _this.filter(args.enum_kind.positional); for (var _i = 0, _a = Object.entries(positional); _i < _a.length; _i++) { var _b = _a[_i], name = _b[0], argument = _b[1]; if (argument.parameters_get()['index'] !== index_expected_1) { // do nothing } else { lib_plankton.log.debug("lib_args:read:probing_as_positional:trying", { "part": part, "argument": argument.toString(), }); var pattern = ""; { var pattern_back = ""; pattern_back += "(".concat(argument.pattern_value(), ")"); pattern += pattern_back; } lib_plankton.log.debug("lib_args:read:probing_as_positional:pattern", { "pattern": pattern, }); var regexp = new RegExp(pattern); var matching = regexp.exec(part); lib_plankton.log.debug("lib_args:read:probing_as_positional:matching", { "matching": matching, }); if (matching == null) { return false; } else { argument.assign(data, name, matching[1]); index_expected_1 += 1; return true; } } } return false; }, ].some(function (x) { return x(); }); if (!found) { lib_plankton.log.warning("lib_args:read:could_not_parse", { "part": part, }); } }); } return data; break; } default: { throw (new Error("unhandled environment ".concat(environment))); break; } } }; /** * @author fenris * @todo handle if the data object doesn't have the required field or the type is wrong or sth. */ class_handler.prototype.write = function (environment, data) { switch (environment) { case args.enum_environment.cli: { return (([] .concat(Object.entries(this.filter(args.enum_kind.volatile)).map(function (_a) { var name = _a[0], argument = _a[1]; var values; switch (argument.mode_get()) { case args.enum_mode.replace: { values = [data[argument.name_get()]]; break; } case args.enum_mode.accumulate: { values = data[argument.name_get()]; break; } } return (values .map(function (value) { return ((settings["environment"][environment]["symbols"]["prefix"] + argument.parameters_get()["indicators_long"][0]) + (settings["environment"][environment]["symbols"]["assignment"] + value.toString())); }) .join(" ")); })) .concat(Object.entries(this.filter(args.enum_kind.positional)).map(function (_a) { var name = _a[0], argument = _a[1]; var raw = ""; { var raw_back = ""; raw_back += argument.make(data, name); raw += raw_back; } return raw; }))) .join(settings["environment"][environment]["symbols"]["delimiter"])); break; } default: { throw (new Error("unhandled environment ".concat(environment))); break; } } }; /** * @desc manpage-like info-sheet * @author fenris */ class_handler.prototype.generate_help = function (_a) { var _b = _a["programname"], programname = _b === void 0 ? null : _b, _c = _a["author"], author = _c === void 0 ? null : _c, _d = _a["description"], description = _d === void 0 ? null : _d, _e = _a["executable"], executable = _e === void 0 ? null : _e; var environment = args.enum_environment.cli; var output = ""; { var section = ""; { var line = ""; line += ""; line += "INFO"; line += "\n"; section += line; } { var line = ""; line += "\t"; line += "".concat(programname, " -- ").concat(description); line += "\n"; section += line; } section += "\n"; output += section; } { if (author != null) { var section = ""; { var line = ""; line += ""; line += "AUTHOR"; line += "\n"; section += line; } { var line = ""; line += "\t"; line += "".concat(author); line += "\n"; section += line; } section += "\n"; output += section; } } { var section = ""; { var line = ""; line += ""; line += "SYNOPSIS"; line += "\n"; section += line; } { var line = ""; line += "\t"; line += executable; line += settings["environment"][environment]["symbols"]["delimiter"]; line += Object.entries(this.filter(args.enum_kind.positional)) .map(function (_a) { var name = _a[0], argument = _a[1]; var part = ""; part += "<".concat(argument.name_get(), ">"); return part; }) .join(settings["environment"][environment]["symbols"]["delimiter"]); line += settings["environment"][environment]["symbols"]["delimiter"]; line += Object.entries(this.filter(args.enum_kind.volatile)) .filter(function (_a) { var name = _a[0], argument = _a[1]; return (!argument.hidden_get()); }) .map(function (_a) { var name = _a[0], argument = _a[1]; var part = ""; // part += settings["environment"][environment]["symbols"]["prefix"]; part += "-"; part += argument.parameters_get()["indicators_short"][0]; if (argument.type_get() != "boolean") { /* part += settings["environment"][environment]["symbols"]["assignment"]; part += `<${argument.name_get()}>`; */ part += " "; part += "<".concat(argument.name_get(), ">"); } part = "[".concat(part, "]"); return part; }) .join(settings["environment"][environment]["symbols"]["delimiter"]); line += "\n"; section += line; } section += "\n"; output += section; } { var section = ""; { var line = ""; line += ""; line += "OPTIONS"; line += "\n"; section += line; } { section += (Object.entries(this.arguments_) .filter(function (_a) { var name = _a[0], argument = _a[1]; return (!argument.hidden_get()); }) .map(function (_a) { var name = _a[0], argument = _a[1]; return argument.generate_help(); }) .join("\n")); } section += "\n"; output += section; } return output; }; return class_handler; }()); args.class_handler = class_handler; })(args = lib_plankton.args || (lib_plankton.args = {})); })(lib_plankton || (lib_plankton = {}));