diff --git a/application/source/data/datasource/dom.mjs b/application/source/data/datasource/dom.mjs new file mode 100644 index 0000000000000000000000000000000000000000..56d0aa407502e8e727470d7af84e306c1147b0df --- /dev/null +++ b/application/source/data/datasource/dom.mjs @@ -0,0 +1,122 @@ +/** + * Copyright schukai GmbH and contributors 2022. All Rights Reserved. + * Node module: @schukai/monster + * This file is licensed under the AGPLv3 License. + * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html + */ + +import { instanceSymbol } from "../../constants.mjs"; +import { isObject } from "../../types/is.mjs"; +import { Datasource } from "../datasource.mjs"; + +export {DomStorage}; + + +/** + * The DomStorage is a class that stores data in memory. + * + * @license AGPLv3 + * @copyright schukai GmbH + * @memberOf Monster.Data.Datasource + */ +class DomStorage extends Datasource { + /** + * @param {Object} [options] options contains definitions for the datasource. + */ + constructor(options) { + super(); + + if (isObject(options)) { + this.setOptions(options); + } + } + + /** + * This method is called by the `instanceof` operator. + * @returns {symbol} + */ + static get [instanceSymbol]() { + return Symbol.for("@schukai/monster/data/datasource/storage/dom-storage"); + } + + /** + * @property {Object} defaults + * @property {Object} defaults.read + * @property {string} defaults.read.selector + * @property {Object} defaults.write + * @property {string} defaults.write.selector + */ + get defaults() { + return Object.assign({}, super.defaults, { + read: { + selector: undefined, + }, + write: { + selector: undefined, + } + }); + } + + /** + * @return {Promise} + * @throws {Error} The read selector is not defined + * @throws {Error} There are no storage element + */ + read() { + const self = this; + + let selector = self.getOption("read.selector", undefined); + if (!selector) { + throw new Error("The read selector is not defined"); + } + + let storage = document.querySelector(selector); + if (!storage) { + throw new Error("There are no storage element"); + } + + return new Promise((resolve, reject) => { + try { + let data = JSON.parse(storage.innerHTML); + self.set(data) + resolve(data); + } catch (e) { + reject(e); + } + ; + }) + } + + /** + * @return {Promise} + * @throws {Error} The write selector is not defined + * @throws {Error} There are no storage element + */ + write() { + + const self = this; + + let selector = self.getOption("write.selector"); + if (!selector) { + throw new Error("The write selector is not defined"); + } + + let storage = document.querySelector(selector); + if (!storage) { + throw new Error("There are no storage element"); + } + + return new Promise((resolve, reject) => { + try { + storage.innerHTML = JSON.stringify(self.get()); + resolve(storage); + } catch (e) { + reject(e); + } + }) + + + } + +} + diff --git a/development/test/cases/data/datasource/dom.mjs b/development/test/cases/data/datasource/dom.mjs new file mode 100644 index 0000000000000000000000000000000000000000..02258e42cd7c326c6072ecee64e1121cf61bd290 --- /dev/null +++ b/development/test/cases/data/datasource/dom.mjs @@ -0,0 +1,18 @@ +import {expect} from "chai" +import {DomStorage} from "../../../../../application/source/data/datasource/dom.mjs"; + + +describe('ServeDomr', function () { + + it('should init', function () { + + const dom = new DomStorage({ + + }) + + expect(dom).to.be.not.null + + + }) + +});