@schukai/monster 3.2.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -73,7 +73,7 @@ We do try to work around some browser bugs, but on the whole we don't use polyfi
73
73
  However, many functions can be mapped via [polyfill.io](https://polyfill.io/) and thus the compatibility can be increased.
74
74
 
75
75
  ```html
76
- <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,CustomEvent,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.for,Symbol.hasInstance,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet"
76
+ <script id="polyfill" src="https://polyfill.io/v3/polyfill.min.js?features=Array.from,Array.isArray,Array.prototype.entries,Array.prototype.fill,Array.prototype.filter,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.keys,Array.prototype.lastIndexOf,Array.prototype.map,Array.prototype.reduce,Array.prototype.sort,ArrayBuffer,atob,Blob,CustomEvent,DataView,document,Document,DocumentFragment,Element,Event,fetch,globalThis,HTMLDocument,HTMLTemplateElement,Intl,JSON,Map,Math.log2,Number.isInteger,Object.assign,Object.defineProperty,Object.entries,Object.freeze,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.keys,Promise,Reflect,Reflect.defineProperty,Reflect.get,Reflect.getOwnPropertyDescriptor,Reflect.setPrototypeOf,Set,String.prototype.endsWith,String.prototype.matchAll,String.prototype.padStart,String.prototype.startsWith,String.prototype.trim,Symbol,Symbol.for,Symbol.hasInstance,Symbol.iterator,Uint16Array,Uint8Array,URL,WeakMap,WeakSet"
77
77
  crossorigin="anonymous"
78
78
  referrerpolicy="no-referrer"></script>
79
79
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schukai/monster",
3
- "version": "3.2.0",
3
+ "version": "3.4.0",
4
4
  "description": "Monster is a simple library for creating fast, robust and lightweight websites.",
5
5
  "keywords": [
6
6
  "framework",
@@ -5,41 +5,37 @@
5
5
  * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
6
  */
7
7
 
8
- import {internalSymbol,instanceSymbol} from "../../constants.mjs";
9
- import {isObject} from "../../types/is.mjs";
10
- import {Datasource} from "../datasource.mjs";
11
- import {Pathfinder} from "../pathfinder.mjs";
12
- import {Pipe} from "../pipe.mjs";
13
- import {WriteError} from "./restapi/writeerror.mjs";
8
+ import {internalSymbol, instanceSymbol} from "../../../constants.mjs";
9
+ import {isObject} from "../../../types/is.mjs";
10
+ import {Server} from "../server.mjs";
11
+ import {Pathfinder} from "../../pathfinder.mjs";
12
+ import {Pipe} from "../../pipe.mjs";
13
+ import {WriteError} from "../restapi/writeerror.mjs";
14
14
 
15
15
  export {RestAPI}
16
16
 
17
17
  /**
18
18
  * The RestAPI is a class that enables a REST API server.
19
19
  *
20
- * @externalExample ../../../example/data/storage/restapi.mjs
20
+ * @externalExample ../../../example/data/storage/restapi.mjs
21
21
  * @license AGPLv3
22
22
  * @since 1.22.0
23
23
  * @copyright schukai GmbH
24
- * @memberOf Monster.Data.Datasource
24
+ * @memberOf Monster.Data.Datasource.Server
25
25
  * @summary The RestAPI is a class that binds a REST API server.
26
26
  */
27
- class RestAPI extends Datasource {
27
+ class RestAPI extends Server {
28
28
 
29
29
  /**
30
30
  *
31
- * @param {Object} [readDefinition] An options object containing any custom settings that you want to apply to the read request.
32
- * @param {Object} [writeDefinition] An options object containing any custom settings that you want to apply to the write request.
31
+ * @param {Object} [options] options contains definitions for the datasource.
33
32
  */
34
- constructor(readDefinition, writeDefinition) {
33
+ constructor(options) {
35
34
  super();
36
35
 
37
- const options = {}
38
-
39
- if (isObject(readDefinition)) options.read = readDefinition;
40
- if (isObject(writeDefinition)) options.write = writeDefinition;
41
-
42
- this.setOptions(options);
36
+ if (isObject(options)) {
37
+ this.setOptions(options);
38
+ }
43
39
 
44
40
  }
45
41
 
@@ -49,9 +45,9 @@ class RestAPI extends Datasource {
49
45
  * @since 2.1.0
50
46
  */
51
47
  static get [instanceSymbol]() {
52
- return Symbol.for("@schukai/monster/data/datasource/restapi");
53
- }
54
-
48
+ return Symbol.for("@schukai/monster/data/datasource/server/restapi");
49
+ }
50
+
55
51
  /**
56
52
  * @property {Object} write={} Options
57
53
  * @property {Object} write.init={} An options object containing any custom settings that you want to apply to the request. The parameters are identical to those of the {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request|Request constructor}
@@ -64,9 +60,9 @@ class RestAPI extends Datasource {
64
60
  * @property {Monster.Data.Datasource~exampleCallback[]} write.mapping.callback with the help of the callback, the structures can be adjusted before writing.
65
61
  * @property {Object} write.report
66
62
  * @property {String} write.report.path Path to validations
67
- * @property {Object} write.sheathing
63
+ * @property {Object} write.sheathing
68
64
  * @property {Object} write.sheathing.object Object to be wrapped
69
- * @property {string} write.sheathing.path Path to the data
65
+ * @property {string} write.sheathing.path Path to the data
70
66
  * @property {Object} read={} Options
71
67
  * @property {Object} read.init={} An options object containing any custom settings that you want to apply to the request. The parameters are identical to those of the {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request|Request constructor}
72
68
  * @property {string} read.init.method=GET
@@ -124,45 +120,37 @@ class RestAPI extends Datasource {
124
120
  let init = self.getOption('read.init');
125
121
  if (!isObject(init)) init = {};
126
122
 
127
- return fetch(self.getOption('read.url'), init).then(resp => {
128
- response = resp;
123
+ return new Promise((resolve, reject) => {
124
+ fetch(self.getOption('read.url'), init).then(resp => {
125
+ response = resp;
129
126
 
130
- const acceptedStatus = self.getOption('read.acceptedStatus', [200]);
127
+ const acceptedStatus = self.getOption('read.acceptedStatus', [200]);
131
128
 
132
- if (acceptedStatus.indexOf(resp.status) === -1) {
133
- throw Error('the data cannot be read (response ' + resp.status + ')')
134
- }
129
+ if (acceptedStatus.indexOf(resp.status) === -1) {
130
+ throw Error('the data cannot be read (response ' + resp.status + ')')
131
+ }
135
132
 
136
- return resp.text()
137
- }).then(body => {
133
+ return resp.text()
134
+ }).then(body => {
138
135
 
139
- let obj;
136
+ let obj;
140
137
 
141
- try {
142
- obj = JSON.parse(body);
138
+ try {
139
+ obj = JSON.parse(body);
143
140
 
144
- } catch (e) {
141
+ } catch (e) {
145
142
 
146
- if (body.length > 100) {
147
- body = body.substring(0, 97) + '...';
148
- }
143
+ if (body.length > 100) {
144
+ body = body.substring(0, 97) + '...';
145
+ }
149
146
 
150
- throw new Error('the response does not contain a valid json (actual: ' + body + ').');
151
- }
147
+ throw new Error('the response does not contain a valid json (actual: ' + body + ').');
148
+ }
152
149
 
153
- let transformation = self.getOption('read.mapping.transformer');
154
- if (transformation !== undefined) {
155
- const pipe = new Pipe(transformation);
150
+ self.set(self.transformServerPayload.call(self, obj));
151
+ resolve(response);
152
+ }).catch(reject);
156
153
 
157
- for (const callback of self.getOption('read.mapping.callbacks')) {
158
- pipe.setCallback(callback.constructor.name, callback);
159
- }
160
-
161
- obj = pipe.run(obj);
162
- }
163
-
164
- self.set(obj);
165
- return response;
166
154
  })
167
155
  }
168
156
 
@@ -173,7 +161,6 @@ class RestAPI extends Datasource {
173
161
  write() {
174
162
  const self = this;
175
163
 
176
-
177
164
  let init = self.getOption('write.init');
178
165
  if (!isObject(init)) init = {};
179
166
  if (typeof init['headers'] !== 'object') {
@@ -182,42 +169,28 @@ class RestAPI extends Datasource {
182
169
  }
183
170
  }
184
171
 
185
- let obj = self.get();
186
- let transformation = self.getOption('write.mapping.transformer');
187
- if (transformation !== undefined) {
188
- const pipe = new Pipe(transformation);
189
-
190
- for (const callback of self.getOption('write.mapping.callbacks')) {
191
- pipe.setCallback(callback.constructor.name, callback);
192
- }
193
-
194
- obj = pipe.run(obj);
195
- }
196
-
197
- let sheathingObject = self.getOption('write.sheathing.object');
198
- let sheathingPath = self.getOption('write.sheathing.path');
199
- let reportPath = self.getOption('write.report.path');
200
-
201
- if (sheathingObject && sheathingPath) {
202
- const sub = obj;
203
- obj = sheathingObject;
204
- (new Pathfinder(obj)).setVia(sheathingPath, sub);
205
- }
206
-
172
+ let obj = self.prepareServerPayload(self.get());
207
173
  init['body'] = JSON.stringify(obj);
208
174
 
209
- return fetch(self.getOption('write.url'), init).then(response => {
175
+ return new Promise((resolve, reject) => {
176
+ fetch(self.getOption('write.url'), init).then(response => {
177
+ const acceptedStatus = self.getOption('write.acceptedStatus', [200, 201]);
210
178
 
211
- const acceptedStatus = self.getOption('write.acceptedStatus', [200, 2001]);
212
-
213
- if (acceptedStatus.indexOf(response.status) === -1) {
179
+ if (acceptedStatus.indexOf(response.status) > -1) {
180
+ reject(response);
181
+ return;
182
+ }
214
183
 
215
- return response.text().then((body) => {
184
+ response.text().then((body) => {
216
185
 
217
- let obj, validation;
186
+ let obj = {}, validation = {};
218
187
  try {
219
188
  obj = JSON.parse(body);
220
- validation = new Pathfinder(obj).getVia(reportPath)
189
+
190
+ if (reportPath) {
191
+ validation = (new Pathfinder(obj)).getVia(reportPath);
192
+ }
193
+
221
194
 
222
195
  } catch (e) {
223
196
 
@@ -225,18 +198,20 @@ class RestAPI extends Datasource {
225
198
  body = body.substring(0, 97) + '...';
226
199
  }
227
200
 
228
- throw new Error('the response does not contain a valid json (actual: ' + body + ').');
201
+ reject(new Error('the response does not contain a valid json (actual: ' + body + ').'));
202
+ return;
229
203
  }
230
204
 
231
- throw new WriteError('the data cannot be written (response ' + response.status + ')', response, validation)
205
+ reject(new WriteError('the data cannot be written (response ' + response.status + ')', response, validation))
206
+ return;
232
207
 
233
- })
208
+ }).catch(reject);
234
209
 
235
210
 
236
- }
211
+ }).catch(reject);
212
+
213
+ })
237
214
 
238
- return response;
239
- });
240
215
  }
241
216
 
242
217
 
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/monster
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+
8
+ import {internalSymbol, instanceSymbol} from "../../../constants.mjs";
9
+ import {isString, isObject} from "../../../types/is.mjs";
10
+ import {WebConnect as NetWebConnect} from "../../../net/webconnect.mjs";
11
+ import {Message} from "../../../net/webconnect/message.mjs";
12
+ import {Server} from "../server.mjs";
13
+
14
+
15
+ export {WebConnect}
16
+
17
+
18
+ /**
19
+ * @private
20
+ * @type {Symbol}
21
+ *
22
+ * hint: this name is used in the tests. if you want to change it, please change it in the tests as well.
23
+ */
24
+ const webConnectSymbol = Symbol("connection");
25
+
26
+
27
+
28
+ /**
29
+ * The RestAPI is a class that enables a REST API server.
30
+ *
31
+ * @externalExample ../../../example/data/storage/restapi.mjs
32
+ * @license AGPLv3
33
+ * @since 3.1.0
34
+ * @copyright schukai GmbH
35
+ * @memberOf Monster.Data.Datasource.Server
36
+ * @summary The LocalStorage class encapsulates the access to data objects.
37
+ */
38
+ class WebConnect extends Server {
39
+
40
+ /**
41
+ *
42
+ * @param {Object} [options] options contains definitions for the datasource.
43
+ */
44
+ constructor(options) {
45
+ super();
46
+
47
+ const self = this;
48
+
49
+ if (isString(options)) {
50
+ options = {url: options};
51
+ }
52
+
53
+ if (!isObject(options)) options = {};
54
+ this.setOptions(options);
55
+ this[webConnectSymbol] = new NetWebConnect({
56
+ url: self.getOption('url'),
57
+ connection: {
58
+ timeout: self.getOption('connection.timeout'),
59
+ reconnect: {
60
+ timeout: self.getOption('connection.reconnect.timeout'),
61
+ attempts: self.getOption('connection.reconnect.attempts'),
62
+ enabled: self.getOption('connection.reconnect.enabled')
63
+ }
64
+ }
65
+ });
66
+ }
67
+
68
+ /**
69
+ *
70
+ * @returns {Promise}
71
+ */
72
+ connect() {
73
+ return this[webConnectSymbol].connect();
74
+ }
75
+
76
+ /**
77
+ * @returns {boolean}
78
+ */
79
+ isConnected() {
80
+ return this[webConnectSymbol].isConnected();
81
+ }
82
+
83
+ /**
84
+ * This method is called by the `instanceof` operator.
85
+ * @returns {symbol}
86
+ */
87
+ static get [instanceSymbol]() {
88
+ return Symbol.for("@schukai/monster/data/datasource/server/webconnect");
89
+ }
90
+
91
+ /**
92
+ * @property {string} url=undefined Defines the resource that you wish to fetch.
93
+ * @property {Object} connection
94
+ * @property {Object} connection.timeout=5000 Defines the timeout for the connection.
95
+ * @property {Number} connection.reconnect.timeout The timeout in milliseconds for the reconnect.
96
+ * @property {Number} connection.reconnect.attempts The maximum number of reconnects.
97
+ * @property {Bool} connection.reconnect.enabled If the reconnect is enabled.
98
+ * @property {Object} write={} Options
99
+ * @property {Object} write.mapping the mapping is applied before writing.
100
+ * @property {String} write.mapping.transformer Transformer to select the appropriate entries
101
+ * @property {Monster.Data.Datasource~exampleCallback[]} write.mapping.callback with the help of the callback, the structures can be adjusted before writing.
102
+ * @property {Object} write.sheathing
103
+ * @property {Object} write.sheathing.object Object to be wrapped
104
+ * @property {string} write.sheathing.path Path to the data
105
+ * @property {Object} read={} Options
106
+ * @property {String} read.path Path to data
107
+ * @property {Object} read.mapping the mapping is applied after reading.
108
+ * @property {String} read.mapping.transformer Transformer to select the appropriate entries
109
+ * @property {Monster.Data.Datasource~exampleCallback[]} read.mapping.callback with the help of the callback, the structures can be adjusted after reading.
110
+ */
111
+ get defaults() {
112
+ return Object.assign({}, super.defaults, {
113
+ url: undefined,
114
+ write: {
115
+ mapping: {
116
+ transformer: undefined,
117
+ callbacks: {}
118
+ },
119
+ sheathing: {
120
+ object: undefined,
121
+ path: undefined,
122
+ },
123
+ },
124
+ read: {
125
+ mapping: {
126
+ transformer: undefined,
127
+ callbacks: {}
128
+ },
129
+ path: undefined,
130
+ },
131
+ connection: {
132
+ timeout: 5000,
133
+ reconnect: {
134
+ timeout: 1000,
135
+ attempts: 1,
136
+ enabled: false,
137
+ }
138
+ }
139
+ });
140
+ }
141
+
142
+ /**
143
+ * This method closes the connection.
144
+ *
145
+ * @returns {Promise}
146
+ */
147
+ close() {
148
+ return this[webConnectSymbol].close();
149
+ }
150
+
151
+ /**
152
+ * @return {Promise}
153
+ */
154
+ read() {
155
+ const self = this;
156
+
157
+ return new Promise((resolve, reject) => {
158
+
159
+ while (this[webConnectSymbol].dataReceived() === true) {
160
+ let obj = this[webConnectSymbol].poll();
161
+ if (!isObject(obj)) {
162
+ reject(new Error('The received data is not an object.'));
163
+ return;
164
+ }
165
+
166
+ if (!(obj instanceof Message)) {
167
+ reject(new Error('The received data is not a Message.'));
168
+ return;
169
+ }
170
+
171
+ obj = obj.getData();
172
+ obj = self.transformServerPayload.call(self, obj);
173
+ self.set( obj);
174
+ }
175
+
176
+ resolve(self.get());
177
+
178
+ })
179
+
180
+ };
181
+
182
+
183
+ /**
184
+ * @return {Promise}
185
+ */
186
+ write() {
187
+ const self = this;
188
+ let obj = self.prepareServerPayload(self.get());
189
+ return self[webConnectSymbol].send(obj)
190
+ }
191
+
192
+ /**
193
+ * @return {RestAPI}
194
+ */
195
+ getClone() {
196
+ const self = this;
197
+ return new WebConnect(self[internalSymbol].getRealSubject()['options']);
198
+ }
199
+
200
+ }
201
+
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
3
+ * Node module: @schukai/monster
4
+ * This file is licensed under the AGPLv3 License.
5
+ * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
6
+ */
7
+
8
+ import {internalSymbol,instanceSymbol} from "../../constants.mjs";
9
+ import {isObject} from "../../types/is.mjs";
10
+ import {Datasource} from "../datasource.mjs";
11
+ import {Pathfinder} from "../pathfinder.mjs";
12
+ import {Pipe} from "../pipe.mjs";
13
+
14
+ export {Server}
15
+
16
+ /**
17
+ * Base class for all server datasources
18
+ *
19
+ * @license AGPLv3
20
+ * @since 3.4.0
21
+ * @copyright schukai GmbH
22
+ * @memberOf Monster.Data.Datasource
23
+ * @summary The Server class encapsulates the access to a server datasource
24
+ */
25
+ class Server extends Datasource {
26
+
27
+ /**
28
+ * This method is called by the `instanceof` operator.
29
+ * @returns {symbol}
30
+ */
31
+ static get [instanceSymbol]() {
32
+ return Symbol.for("@schukai/monster/data/datasource/server");
33
+ }
34
+
35
+
36
+ /**
37
+ * This prepares the data that comes from the server.
38
+ * Should not be called directly.
39
+ *
40
+ * @private
41
+ * @param {Object} payload
42
+ * @returns {Object}
43
+ */
44
+ transformServerPayload(payload) {
45
+ const self = this;
46
+ payload = doTransform.call(self, 'read', payload);
47
+
48
+ const dataPath = self.getOption('read.path');
49
+ if (dataPath) {
50
+ payload = (new Pathfinder(payload)).getVia(dataPath);
51
+ }
52
+
53
+ return payload;
54
+ }
55
+
56
+ /**
57
+ * This prepares the data for writing and should not be called directly.
58
+ *
59
+ * @private
60
+ * @param {Object} payload
61
+ * @returns {Object}
62
+ */
63
+ prepareServerPayload(payload) {
64
+ const self = this;
65
+
66
+ payload = doTransform.call(self, 'write', payload);
67
+
68
+ let sheathingObject = self.getOption('write.sheathing.object');
69
+ let sheathingPath = self.getOption('write.sheathing.path');
70
+
71
+ if (sheathingObject && sheathingPath) {
72
+ const sub = payload;
73
+ payload = sheathingObject;
74
+ (new Pathfinder(payload)).setVia(sheathingPath, sub);
75
+ }
76
+
77
+ return payload;
78
+ }
79
+
80
+ }
81
+
82
+
83
+ /**
84
+ *
85
+ * @param self
86
+ * @param obj
87
+ * @returns {*}
88
+ */
89
+ function doTransform(type, obj) {
90
+ const self = this;
91
+ let transformation = self.getOption(type + '.mapping.transformer');
92
+ if (transformation !== undefined) {
93
+ const pipe = new Pipe(transformation);
94
+ const callbacks = self.getOption(type + '.mapping.callbacks')
95
+
96
+ if (isObject(callbacks)) {
97
+ for (const key in callbacks) {
98
+ if (callbacks.hasOwnProperty(key) && typeof callbacks[key] === 'function') {
99
+ pipe.setCallback(key, callbacks[key]);
100
+ }
101
+ }
102
+ }
103
+
104
+ obj = pipe.run(obj);
105
+ }
106
+
107
+ return obj;
108
+ }
@@ -191,7 +191,7 @@ class Locale extends Base {
191
191
  *
192
192
  * ```
193
193
  * <script type="module">
194
- * import {Monster} from '@schukai/monster/source//monster.mjs';
194
+ * import {Monster} from '@schukai/monster/source/monster.mjs';
195
195
  * new Monster.I18n.createLocale()
196
196
  * </script>
197
197
  * ```
@@ -31,7 +31,7 @@ export {Stylesheet} from "./dom/resource/link/stylesheet.mjs"
31
31
  export {Data} from "./dom/resource/data.mjs"
32
32
  export {Link} from "./dom/resource/link.mjs"
33
33
  export {Script} from "./dom/resource/script.mjs"
34
- export {Updater} from "./dom/updater.mjs"
34
+ export {Updater, addObjectWithUpdaterToElement} from "./dom/updater.mjs"
35
35
  export {CustomControl} from "./dom/customcontrol.mjs"
36
36
  export {getLocaleOfDocument} from "./dom/locale.mjs"
37
37
  export {Theme, getDocumentTheme} from "./dom/theme.mjs"
@@ -91,6 +91,7 @@ export {
91
91
  ATTRIBUTE_EXPORTPARTS,
92
92
  ATTRIBUTE_HIDDEN,
93
93
  objectUpdaterLinkSymbol,
94
+ customElementUpdaterLinkSymbol
94
95
 
95
96
  } from "./dom/constants.mjs"
96
97
  export {
@@ -127,14 +128,18 @@ export {Locale, parseLocale} from "./i18n/locale.mjs"
127
128
  export {Formatter as I18nFormatter} from "./i18n/formatter.mjs"
128
129
  export {Fetch} from "./i18n/providers/fetch.mjs"
129
130
  export {Provider} from "./i18n/provider.mjs"
131
+ export {Message} from "./net/webconnect/message.mjs"
132
+ export {WebConnect as NetWebConnect} from "./net/webconnect.mjs"
130
133
  export {
131
134
  internalSymbol,
132
- internalStateSymbol
135
+ internalStateSymbol,
136
+ instanceSymbol
133
137
  } from "./constants.mjs"
134
138
  export {MediaType, parseMediaType} from "./types/mediatype.mjs"
135
139
  export {typeOf} from "./types/typeof.mjs"
136
140
  export {ObserverList} from "./types/observerlist.mjs"
137
141
  export {RandomID} from "./types/randomid.mjs"
142
+ export {ObservableQueue} from "./types/observablequeue.mjs"
138
143
  export {UUID} from "./types/uuid.mjs"
139
144
  export {Observer} from "./types/observer.mjs"
140
145
  export {TokenList} from "./types/tokenlist.mjs"
@@ -182,13 +187,16 @@ export {buildTree} from "./data/buildtree.mjs"
182
187
  export {Transformer} from "./data/transformer.mjs"
183
188
  export {Pathfinder, DELIMITER, WILDCARD} from "./data/pathfinder.mjs"
184
189
  export {diff} from "./data/diff.mjs"
185
- export {RestAPI} from "./data/datasource/restapi.mjs"
190
+ export {Server} from "./data/datasource/server.mjs"
186
191
  export {SessionStorage} from "./data/datasource/storage/sessionstorage.mjs"
187
192
  export {LocalStorage} from "./data/datasource/storage/localstorage.mjs"
193
+ export {RestAPI} from "./data/datasource/server/restapi.mjs"
194
+ export {WebConnect} from "./data/datasource/server/webconnect.mjs"
188
195
  export {WriteError} from "./data/datasource/restapi/writeerror.mjs"
189
196
  export {Storage, storageObjectSymbol} from "./data/datasource/storage.mjs"
190
197
  export {random} from "./math/random.mjs"
191
198
 
199
+
192
200
  export {Monster}
193
201
 
194
202
  /**