@schukai/monster 3.2.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  /**