@shapediver/viewer.shared.services 3.3.4 → 3.3.7
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/package.json +5 -6
- package/src/converter/Converter.ts +0 -407
- package/src/dom-event-engine/DomEventEngine.ts +0 -310
- package/src/dom-event-engine/IDomEventListener.ts +0 -14
- package/src/event-engine/EventEngine.ts +0 -131
- package/src/event-engine/EventTypes.ts +0 -334
- package/src/event-engine/interfaces/ICallback.ts +0 -5
- package/src/event-engine/interfaces/IEvent.ts +0 -1
- package/src/event-engine/interfaces/IListener.ts +0 -8
- package/src/http-client/HttpClient.ts +0 -353
- package/src/http-client/HttpResponse.ts +0 -6
- package/src/index.ts +0 -166
- package/src/input-validator/InputValidator.ts +0 -123
- package/src/logger/ErrorTypeGuards.ts +0 -130
- package/src/logger/Logger.ts +0 -174
- package/src/logger/ShapeDiverBackendErrors.ts +0 -40
- package/src/logger/ShapeDiverError.ts +0 -58
- package/src/logger/ShapeDiverViewerErrors.ts +0 -121
- package/src/performance-evaluator/PerformanceEvaluator.ts +0 -146
- package/src/settings-engine/SettingsEngine.ts +0 -182
- package/src/state-engine/ISessionGlobalAccessObjectDefinition.ts +0 -25
- package/src/state-engine/IViewportGlobalAccessObjectDefinition.ts +0 -29
- package/src/state-engine/StateEngine.ts +0 -47
- package/src/state-engine/StatePromise.ts +0 -54
- package/src/system-info/SystemInfo.ts +0 -143
- package/src/type-check/TypeChecker.ts +0 -27
- package/src/utilities/base64.ts +0 -15
- package/src/uuid-generator/UuidGenerator.ts +0 -57
- package/tsconfig.json +0 -17
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
import axios, { AxiosRequestConfig } from 'axios';
|
|
2
|
-
import { ShapeDiverError as ShapeDiverBackendError, isGBResponseError, isGBRequestError, isGBError } from '@shapediver/sdk.geometry-api-sdk-v2';
|
|
3
|
-
import { ShapeDiverGeometryBackendError, ShapeDiverGeometryBackendRequestError, ShapeDiverGeometryBackendResponseError } from '../logger/ShapeDiverBackendErrors';
|
|
4
|
-
import { HttpResponse } from './HttpResponse';
|
|
5
|
-
import { btoaCustom } from '../utilities/base64';
|
|
6
|
-
import { Logger } from '../logger/Logger';
|
|
7
|
-
|
|
8
|
-
export class HttpClient {
|
|
9
|
-
// #region Properties (7)
|
|
10
|
-
|
|
11
|
-
private readonly _logger: Logger = Logger.instance;
|
|
12
|
-
|
|
13
|
-
private static _instance: HttpClient;
|
|
14
|
-
|
|
15
|
-
private _dataCache: Map<
|
|
16
|
-
string,
|
|
17
|
-
{
|
|
18
|
-
value: Promise<HttpResponse<unknown>>,
|
|
19
|
-
timestamp: number,
|
|
20
|
-
resolved: boolean,
|
|
21
|
-
size?: number
|
|
22
|
-
}> = new Map();
|
|
23
|
-
private _enableCaching: boolean = true;
|
|
24
|
-
private _excludedQueryParameters: string[] = ['Expires', 'Signature', 'Key-Pair-Id'];
|
|
25
|
-
private _maxCacheSize: number = 1024 * 1024 * 32;
|
|
26
|
-
private _sessionLoading: {
|
|
27
|
-
[key: string]: {
|
|
28
|
-
getAsset: (url: string) => Promise<[ArrayBuffer, string, string]>,
|
|
29
|
-
downloadTexture: (sessionId: string, url: string) => Promise<[ArrayBuffer, string]>,
|
|
30
|
-
}
|
|
31
|
-
} = {};
|
|
32
|
-
|
|
33
|
-
// #endregion Properties (7)
|
|
34
|
-
|
|
35
|
-
// #region Constructors (1)
|
|
36
|
-
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
38
|
-
private constructor() { }
|
|
39
|
-
|
|
40
|
-
// #endregion Constructors (1)
|
|
41
|
-
|
|
42
|
-
// #region Public Static Getters And Setters (1)
|
|
43
|
-
|
|
44
|
-
public static get instance() {
|
|
45
|
-
return this._instance || (this._instance = new this());
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// #endregion Public Static Getters And Setters (1)
|
|
49
|
-
|
|
50
|
-
// #region Public Getters And Setters (6)
|
|
51
|
-
|
|
52
|
-
public get enableCaching(): boolean {
|
|
53
|
-
return this._enableCaching;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public set enableCaching(value: boolean) {
|
|
57
|
-
this._enableCaching = value;
|
|
58
|
-
if (this._enableCaching === false)
|
|
59
|
-
this._dataCache.clear();
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
public get excludedQueryParameters(): string[] {
|
|
63
|
-
return this._excludedQueryParameters;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
public set excludedQueryParameters(value: string[]) {
|
|
67
|
-
this._excludedQueryParameters = value;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
public get maxCacheSize(): number {
|
|
71
|
-
return this._maxCacheSize;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
public set maxCacheSize(value: number) {
|
|
75
|
-
this._maxCacheSize = value;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// #endregion Public Getters And Setters (6)
|
|
79
|
-
|
|
80
|
-
// #region Public Methods (5)
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Add the data loading options from a session.
|
|
84
|
-
*
|
|
85
|
-
* @param sessionId
|
|
86
|
-
* @param callbacks
|
|
87
|
-
*/
|
|
88
|
-
public addDataLoading(sessionId: string, callbacks: {
|
|
89
|
-
getAsset: (url: string) => Promise<[ArrayBuffer, string, string]>,
|
|
90
|
-
downloadTexture: (sessionId: string, url: string) => Promise<[ArrayBuffer, string]>,
|
|
91
|
-
}) {
|
|
92
|
-
this._sessionLoading[sessionId] = callbacks;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Maps the geometry backend error to the corresponding viewer errors:
|
|
97
|
-
* - ShapeDiverResponseError is mapped to ShapeDiverGeometryBackendResponseError
|
|
98
|
-
* - ShapeDiverRequestError is mapped to ShapeDiverGeometryBackendRequestError
|
|
99
|
-
*
|
|
100
|
-
* Other error types are thrown as is.
|
|
101
|
-
*
|
|
102
|
-
* @param e
|
|
103
|
-
*/
|
|
104
|
-
public convertError(e: ShapeDiverBackendError | Error | unknown) {
|
|
105
|
-
if (isGBResponseError(e)) {
|
|
106
|
-
throw new ShapeDiverGeometryBackendResponseError(e.message, e.status, e.error, e.desc);
|
|
107
|
-
} else if (isGBRequestError(e)) {
|
|
108
|
-
throw new ShapeDiverGeometryBackendRequestError(e.message, e.desc);
|
|
109
|
-
} else if (isGBError(e)) {
|
|
110
|
-
throw new ShapeDiverGeometryBackendError(e.message);
|
|
111
|
-
} else {
|
|
112
|
-
throw e;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Get the requested resource either as a download or from the cache.
|
|
118
|
-
* If available, the registered session loading is used for download.
|
|
119
|
-
* Textures are downloaded via a specific endpoint and can be converted in this step as well.
|
|
120
|
-
* Depending on the provided caching options, the requested resource might already be cached.
|
|
121
|
-
*
|
|
122
|
-
* @param href
|
|
123
|
-
* @param config
|
|
124
|
-
* @param textureLoading
|
|
125
|
-
* @param textureConversion
|
|
126
|
-
* @returns
|
|
127
|
-
*/
|
|
128
|
-
public async get(href: string, config: AxiosRequestConfig = { responseType: 'arraybuffer' }, textureLoading: boolean = false): Promise<HttpResponse<unknown>> {
|
|
129
|
-
const dataKey = this.hrefToDataKey(href);
|
|
130
|
-
|
|
131
|
-
// return element if it exists in cache
|
|
132
|
-
if (this._dataCache.has(dataKey)) return this.getFromCache(dataKey);
|
|
133
|
-
|
|
134
|
-
// try to get sessionId from href
|
|
135
|
-
let sessionId = this.getSessionId(href);
|
|
136
|
-
|
|
137
|
-
// if href does not have sessionId, use the first session, if available
|
|
138
|
-
if (!sessionId && Object.keys(this._sessionLoading).length > 0)
|
|
139
|
-
sessionId = Object.keys(this._sessionLoading)[0];
|
|
140
|
-
|
|
141
|
-
// get the session loading functions, if available
|
|
142
|
-
let sessionLoading: {
|
|
143
|
-
getAsset: (url: string) => Promise<[ArrayBuffer, string, string]>,
|
|
144
|
-
downloadTexture: (sessionId: string, url: string) => Promise<[ArrayBuffer, string]>,
|
|
145
|
-
} | undefined;
|
|
146
|
-
if (sessionId)
|
|
147
|
-
sessionLoading = this._sessionLoading[sessionId];
|
|
148
|
-
|
|
149
|
-
let loadingPromise;
|
|
150
|
-
|
|
151
|
-
// separation texture vs everything else
|
|
152
|
-
if (textureLoading) {
|
|
153
|
-
// if we have a sessionId and the sessionLoading functions and the image is not a blob or data, we load it via the sdk
|
|
154
|
-
if (sessionLoading !== undefined && sessionId !== undefined && !href.startsWith('blob:') && !href.startsWith('data:')) {
|
|
155
|
-
// take first session to load a texture that is not session related
|
|
156
|
-
loadingPromise = new Promise<HttpResponse<ArrayBuffer>>((resolve, reject) => {
|
|
157
|
-
sessionLoading!.downloadTexture(sessionId!, href).then(async (result) => {
|
|
158
|
-
resolve({
|
|
159
|
-
data: result[0],
|
|
160
|
-
headers: {
|
|
161
|
-
'content-type': result[1]
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
}).catch(e => reject(e));
|
|
165
|
-
}).catch(e => { throw this.convertError(e); });
|
|
166
|
-
} else {
|
|
167
|
-
// we can load blobs and data urls directly
|
|
168
|
-
// or load it directly if we don't have a session
|
|
169
|
-
loadingPromise = axios(href, Object.assign({ method: 'get' }, config))
|
|
170
|
-
.then(async (result) => {
|
|
171
|
-
return result;
|
|
172
|
-
})
|
|
173
|
-
.catch(e => { throw this.convertError(e); });
|
|
174
|
-
}
|
|
175
|
-
} else {
|
|
176
|
-
if (!sessionLoading) {
|
|
177
|
-
// if there is no session to load from, we use the fallback option
|
|
178
|
-
loadingPromise = axios(href, Object.assign({ method: 'get' }, config))
|
|
179
|
-
.catch(e => { throw this.convertError(e); });
|
|
180
|
-
} else {
|
|
181
|
-
// all data links where we could somehow find a session to load it with
|
|
182
|
-
loadingPromise = new Promise<HttpResponse<ArrayBuffer>>((resolve, reject) => {
|
|
183
|
-
sessionLoading!.getAsset(href)
|
|
184
|
-
.then((result) => {
|
|
185
|
-
resolve({
|
|
186
|
-
data: result[0],
|
|
187
|
-
headers: {
|
|
188
|
-
'content-type': result[1]
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
})
|
|
192
|
-
.catch(() => {
|
|
193
|
-
// if this fails, we just load it directly
|
|
194
|
-
const axiosPromise = axios(href, Object.assign({ method: 'get' }, config));
|
|
195
|
-
axiosPromise.catch(e => reject(e));
|
|
196
|
-
resolve(axiosPromise);
|
|
197
|
-
});
|
|
198
|
-
}).catch(e => { throw this.convertError(e); });
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
if (this.enableCaching)
|
|
203
|
-
this.addToCache(dataKey, loadingPromise);
|
|
204
|
-
|
|
205
|
-
return loadingPromise;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Get the requested texture either as a download or from the cache.
|
|
210
|
-
* If the texture is not available, undefined is returned.
|
|
211
|
-
*
|
|
212
|
-
* @param href The URL of the texture to load.
|
|
213
|
-
* @returns Either the texture as a buffer and blob or undefined if the texture could not be loaded.
|
|
214
|
-
*/
|
|
215
|
-
public async loadTexture(href: string): Promise<HttpResponse<{ buffer: ArrayBuffer, blob: Blob }> | undefined> {
|
|
216
|
-
let result: HttpResponse<{ buffer: ArrayBuffer, blob: Blob }> | undefined;
|
|
217
|
-
|
|
218
|
-
try {
|
|
219
|
-
const response = await this.get(href, undefined, true) as HttpResponse<ArrayBuffer>;
|
|
220
|
-
const buffer = response.data;
|
|
221
|
-
const arrayBufferView = new Uint8Array(response.data);
|
|
222
|
-
const blob = new Blob([arrayBufferView], { type: response.headers['content-type'] });
|
|
223
|
-
|
|
224
|
-
// assign the result
|
|
225
|
-
result = {
|
|
226
|
-
data: {
|
|
227
|
-
buffer,
|
|
228
|
-
blob
|
|
229
|
-
},
|
|
230
|
-
size: response.data.byteLength,
|
|
231
|
-
headers: response.headers
|
|
232
|
-
};
|
|
233
|
-
} catch (e) {
|
|
234
|
-
// log the error and return undefined
|
|
235
|
-
this._logger.error(`Failed to load texture: ${e}`);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// return undefined if the texture could not be loaded
|
|
239
|
-
// that way the loading can be continued without the texture
|
|
240
|
-
return result;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Add the data loading options from a session.
|
|
245
|
-
*
|
|
246
|
-
* @param sessionId
|
|
247
|
-
*/
|
|
248
|
-
public removeDataLoading(sessionId: string) {
|
|
249
|
-
delete this._sessionLoading[sessionId];
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// #endregion Public Methods (5)
|
|
253
|
-
|
|
254
|
-
// #region Private Methods (5)
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Add
|
|
258
|
-
*
|
|
259
|
-
* @param key
|
|
260
|
-
* @param value
|
|
261
|
-
*/
|
|
262
|
-
private addToCache(key: string, value: Promise<HttpResponse<unknown>>) {
|
|
263
|
-
// Remove items from the cache until the cache size is smaller than the maximum cache size.
|
|
264
|
-
// Only resolved promises are evaluated, as unresolved promises don't add any size.
|
|
265
|
-
while (this.calculateCacheSize() >= this._maxCacheSize) {
|
|
266
|
-
// Remove the oldest entry if the cache is full
|
|
267
|
-
const oldestKey = this._dataCache.keys().next().value;
|
|
268
|
-
this._dataCache.delete(oldestKey);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const timestamp = Date.now();
|
|
272
|
-
this._dataCache.set(key, { value, timestamp, resolved: false });
|
|
273
|
-
|
|
274
|
-
// once the promise resolves, set resolved and size properties
|
|
275
|
-
value.then((promiseResult) => {
|
|
276
|
-
const size = promiseResult.size ? promiseResult.size : (promiseResult.data as ArrayBuffer).byteLength;
|
|
277
|
-
this._dataCache.set(key, { value, timestamp, resolved: true, size });
|
|
278
|
-
}).catch(e => { throw this.convertError(e); });
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Calculate the current cache size from all resolved promises.
|
|
283
|
-
*
|
|
284
|
-
* @returns
|
|
285
|
-
*/
|
|
286
|
-
private calculateCacheSize() {
|
|
287
|
-
let size = 0;
|
|
288
|
-
this._dataCache.forEach(value => {
|
|
289
|
-
if (value.resolved === true)
|
|
290
|
-
size += value.size!;
|
|
291
|
-
});
|
|
292
|
-
return size;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Get the value of an object from the cache.
|
|
297
|
-
*
|
|
298
|
-
* @param key
|
|
299
|
-
* @returns
|
|
300
|
-
*/
|
|
301
|
-
private getFromCache(key: string): Promise<HttpResponse<unknown>> {
|
|
302
|
-
const cachedObject = this._dataCache.get(key)!;
|
|
303
|
-
this._dataCache.set(key, { value: cachedObject.value, timestamp: Date.now(), resolved: cachedObject.resolved, size: cachedObject.size });
|
|
304
|
-
return cachedObject.value;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/**
|
|
308
|
-
* Get the session id of the provided href.
|
|
309
|
-
*
|
|
310
|
-
* @param href
|
|
311
|
-
* @returns
|
|
312
|
-
*/
|
|
313
|
-
private getSessionId(href: string): string | undefined {
|
|
314
|
-
// searching for "/session/SESSION_ID/{'output' | 'export' | 'texture'}/ASSET_DATA"
|
|
315
|
-
const parts = href.split('/');
|
|
316
|
-
const sessionPartIndex = parts.indexOf('session');
|
|
317
|
-
|
|
318
|
-
// There have to be at exactly 4 parts, including the session
|
|
319
|
-
if (sessionPartIndex !== -1 && parts.length === sessionPartIndex + 4) {
|
|
320
|
-
const sessionId = parts[sessionPartIndex + 1];
|
|
321
|
-
// no such session has been registered, should never happen
|
|
322
|
-
if (!this._sessionLoading[sessionId]) return;
|
|
323
|
-
return sessionId;
|
|
324
|
-
}
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Convert the provided href to a data cache key.
|
|
330
|
-
* In this conversion the excludedQueryParameters are removed from the href.
|
|
331
|
-
*
|
|
332
|
-
* @param href
|
|
333
|
-
* @returns
|
|
334
|
-
*/
|
|
335
|
-
private hrefToDataKey(href: string) {
|
|
336
|
-
const url = new URL(href);
|
|
337
|
-
|
|
338
|
-
// Create a URLSearchParams object from the existing query parameters
|
|
339
|
-
const params = new URLSearchParams(url.search);
|
|
340
|
-
|
|
341
|
-
for (let i = 0; i < this._excludedQueryParameters.length; i++)
|
|
342
|
-
// Remove specific query parameters
|
|
343
|
-
params.delete(this._excludedQueryParameters[i]);
|
|
344
|
-
|
|
345
|
-
// Reconstruct the URL with the modified query parameters
|
|
346
|
-
url.search = params.toString();
|
|
347
|
-
|
|
348
|
-
const hrefAsKey = url.toString();
|
|
349
|
-
return btoaCustom(hrefAsKey);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// #endregion Private Methods (5)
|
|
353
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { Converter } from './converter/Converter';
|
|
2
|
-
import { DomEventEngine } from './dom-event-engine/DomEventEngine';
|
|
3
|
-
import { EventEngine } from './event-engine/EventEngine';
|
|
4
|
-
import {
|
|
5
|
-
EVENTTYPE,
|
|
6
|
-
EVENTTYPE_CAMERA,
|
|
7
|
-
EVENTTYPE_DRAWING_TOOLS,
|
|
8
|
-
EVENTTYPE_GUMBALL,
|
|
9
|
-
EVENTTYPE_INTERACTION,
|
|
10
|
-
EVENTTYPE_OUTPUT,
|
|
11
|
-
EVENTTYPE_PARAMETER,
|
|
12
|
-
EVENTTYPE_RENDERING,
|
|
13
|
-
EVENTTYPE_SCENE,
|
|
14
|
-
EVENTTYPE_SESSION,
|
|
15
|
-
EVENTTYPE_TASK,
|
|
16
|
-
EVENTTYPE_VIEWPORT,
|
|
17
|
-
MainEventTypes
|
|
18
|
-
} from './event-engine/EventTypes';
|
|
19
|
-
import { HttpClient } from './http-client/HttpClient';
|
|
20
|
-
import { HttpResponse } from './http-client/HttpResponse';
|
|
21
|
-
import { IDomEventListener } from './dom-event-engine/IDomEventListener';
|
|
22
|
-
import { IEvent } from './event-engine/interfaces/IEvent';
|
|
23
|
-
import { InputValidator } from './input-validator/InputValidator';
|
|
24
|
-
import {
|
|
25
|
-
isARError,
|
|
26
|
-
isViewerCameraError,
|
|
27
|
-
isViewerDataProcessingError,
|
|
28
|
-
isViewerDrawingToolsError,
|
|
29
|
-
isViewerEnvironmentMapError,
|
|
30
|
-
isViewerError,
|
|
31
|
-
isViewerGeometryBackendError,
|
|
32
|
-
isViewerGeometryBackendGenericError,
|
|
33
|
-
isViewerGeometryBackendRequestError,
|
|
34
|
-
isViewerGeometryBackendResponseError,
|
|
35
|
-
isViewerInteractionError,
|
|
36
|
-
isViewerLightError,
|
|
37
|
-
isViewerSessionError,
|
|
38
|
-
isViewerSettingsError,
|
|
39
|
-
isViewerUnknownError,
|
|
40
|
-
isViewerValidationError,
|
|
41
|
-
isViewerViewportError,
|
|
42
|
-
isViewerWebGLError
|
|
43
|
-
} from './logger/ErrorTypeGuards';
|
|
44
|
-
import { ISessionGlobalAccessObjectDefinition } from './state-engine/ISessionGlobalAccessObjectDefinition';
|
|
45
|
-
import { IViewportGlobalAccessObjectDefinition } from './state-engine/IViewportGlobalAccessObjectDefinition';
|
|
46
|
-
import { Logger, LOGGING_LEVEL } from './logger/Logger';
|
|
47
|
-
import { PerformanceEvaluator } from './performance-evaluator/PerformanceEvaluator';
|
|
48
|
-
import { SESSION_SETTINGS_MODE, SettingsEngine } from './settings-engine/SettingsEngine';
|
|
49
|
-
import { ShapeDiverGeometryBackendError, ShapeDiverGeometryBackendRequestError, ShapeDiverGeometryBackendResponseError } from './logger/ShapeDiverBackendErrors';
|
|
50
|
-
import { ShapeDiverResponseErrorType as ShapeDiverGeometryBackendResponseErrorType } from '@shapediver/sdk.geometry-api-sdk-v2';
|
|
51
|
-
import {
|
|
52
|
-
ShapeDiverViewerArError,
|
|
53
|
-
ShapeDiverViewerCameraError,
|
|
54
|
-
ShapeDiverViewerDataProcessingError,
|
|
55
|
-
ShapeDiverViewerDrawingToolsError,
|
|
56
|
-
ShapeDiverViewerEnvironmentMapError,
|
|
57
|
-
ShapeDiverViewerInteractionError,
|
|
58
|
-
ShapeDiverViewerLightError,
|
|
59
|
-
ShapeDiverViewerSessionError,
|
|
60
|
-
ShapeDiverViewerSettingsError,
|
|
61
|
-
ShapeDiverViewerUnknownError,
|
|
62
|
-
ShapeDiverViewerValidationError,
|
|
63
|
-
ShapeDiverViewerViewportError,
|
|
64
|
-
ShapeDiverViewerWebGLError
|
|
65
|
-
} from './logger/ShapeDiverViewerErrors';
|
|
66
|
-
import { ShapeDiverViewerError, ShapeDiverViewerErrorType } from './logger/ShapeDiverError';
|
|
67
|
-
import { StateEngine } from './state-engine/StateEngine';
|
|
68
|
-
import { StatePromise } from './state-engine/StatePromise';
|
|
69
|
-
import { SystemInfo } from './system-info/SystemInfo';
|
|
70
|
-
import { TypeChecker } from './type-check/TypeChecker';
|
|
71
|
-
import { UuidGenerator } from './uuid-generator/UuidGenerator';
|
|
72
|
-
import { atobCustom, btoaCustom } from './utilities/base64';
|
|
73
|
-
|
|
74
|
-
export {
|
|
75
|
-
EventEngine, EVENTTYPE, MainEventTypes, IEvent,
|
|
76
|
-
EVENTTYPE_CAMERA, EVENTTYPE_OUTPUT, EVENTTYPE_PARAMETER, EVENTTYPE_RENDERING, EVENTTYPE_SCENE, EVENTTYPE_SESSION, EVENTTYPE_VIEWPORT, EVENTTYPE_INTERACTION, EVENTTYPE_GUMBALL, EVENTTYPE_DRAWING_TOOLS, EVENTTYPE_TASK
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export {
|
|
80
|
-
SettingsEngine, SESSION_SETTINGS_MODE
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export {
|
|
84
|
-
StateEngine, StatePromise,
|
|
85
|
-
IViewportGlobalAccessObjectDefinition, ISessionGlobalAccessObjectDefinition
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export {
|
|
89
|
-
SystemInfo
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
export {
|
|
93
|
-
IDomEventListener, DomEventEngine
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export {
|
|
97
|
-
HttpClient, HttpResponse
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export {
|
|
101
|
-
UuidGenerator
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
export {
|
|
105
|
-
Converter
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
export {
|
|
109
|
-
TypeChecker
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export {
|
|
113
|
-
InputValidator
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
export {
|
|
117
|
-
Logger, LOGGING_LEVEL,
|
|
118
|
-
ShapeDiverViewerErrorType,
|
|
119
|
-
ShapeDiverViewerError,
|
|
120
|
-
ShapeDiverViewerDataProcessingError,
|
|
121
|
-
ShapeDiverViewerEnvironmentMapError,
|
|
122
|
-
ShapeDiverViewerWebGLError,
|
|
123
|
-
ShapeDiverViewerSettingsError,
|
|
124
|
-
ShapeDiverViewerSessionError,
|
|
125
|
-
ShapeDiverViewerViewportError,
|
|
126
|
-
ShapeDiverViewerUnknownError,
|
|
127
|
-
ShapeDiverViewerArError,
|
|
128
|
-
ShapeDiverViewerLightError,
|
|
129
|
-
ShapeDiverViewerCameraError,
|
|
130
|
-
ShapeDiverViewerValidationError,
|
|
131
|
-
ShapeDiverViewerInteractionError,
|
|
132
|
-
ShapeDiverViewerDrawingToolsError,
|
|
133
|
-
ShapeDiverGeometryBackendError,
|
|
134
|
-
ShapeDiverGeometryBackendRequestError,
|
|
135
|
-
ShapeDiverGeometryBackendResponseError,
|
|
136
|
-
ShapeDiverGeometryBackendResponseErrorType
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
export {
|
|
140
|
-
isViewerError,
|
|
141
|
-
isViewerUnknownError,
|
|
142
|
-
isViewerDataProcessingError,
|
|
143
|
-
isViewerEnvironmentMapError,
|
|
144
|
-
isViewerWebGLError,
|
|
145
|
-
isViewerSettingsError,
|
|
146
|
-
isViewerSessionError,
|
|
147
|
-
isViewerViewportError,
|
|
148
|
-
isViewerLightError,
|
|
149
|
-
isViewerCameraError,
|
|
150
|
-
isARError,
|
|
151
|
-
isViewerValidationError,
|
|
152
|
-
isViewerInteractionError,
|
|
153
|
-
isViewerDrawingToolsError,
|
|
154
|
-
isViewerGeometryBackendError,
|
|
155
|
-
isViewerGeometryBackendGenericError,
|
|
156
|
-
isViewerGeometryBackendRequestError,
|
|
157
|
-
isViewerGeometryBackendResponseError
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
export {
|
|
161
|
-
PerformanceEvaluator
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
export {
|
|
165
|
-
atobCustom, btoaCustom
|
|
166
|
-
};
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import DOMPurify from 'dompurify';
|
|
2
|
-
import { Logger } from '../logger/Logger'
|
|
3
|
-
import { ShapeDiverViewerValidationError } from '../logger/ShapeDiverViewerErrors';
|
|
4
|
-
import { TypeChecker } from '../type-check/TypeChecker'
|
|
5
|
-
|
|
6
|
-
export type Types = 'string' | 'boolean' | 'function' |
|
|
7
|
-
'HTMLCanvasElement' | 'enum' |
|
|
8
|
-
'number' | 'factor' | 'positive' |
|
|
9
|
-
'vec3' | 'mat4' | 'cubeMap' | 'array' | 'stringArray' | 'object' | 'file' | 'color' | 'quat';
|
|
10
|
-
|
|
11
|
-
export class InputValidator {
|
|
12
|
-
// #region Properties (3)
|
|
13
|
-
|
|
14
|
-
private readonly _logger: Logger = Logger.instance;
|
|
15
|
-
private readonly _typeChecker: TypeChecker = TypeChecker.instance;
|
|
16
|
-
|
|
17
|
-
private static _instance: InputValidator;
|
|
18
|
-
|
|
19
|
-
// #endregion Properties (3)
|
|
20
|
-
|
|
21
|
-
// #region Public Static Accessors (1)
|
|
22
|
-
|
|
23
|
-
public static get instance() {
|
|
24
|
-
return this._instance || (this._instance = new this());
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
// #endregion Public Static Accessors (1)
|
|
28
|
-
|
|
29
|
-
// #region Public Methods (2)
|
|
30
|
-
|
|
31
|
-
public sanitize(input: string): string {
|
|
32
|
-
return DOMPurify.sanitize(input);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public validateAndError(scope: string, value: any, type: Types, defined: boolean = true, enumValues: string[] = []) {
|
|
36
|
-
const res = this.validate(value, type, defined, enumValues);
|
|
37
|
-
if(res) return;
|
|
38
|
-
|
|
39
|
-
throw new ShapeDiverViewerValidationError(`${scope}: Input could not be validated. ${value} is not of type ${type}.${defined === false ? ' (Can also be undefined)' : ''}`, value, type);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// #endregion Public Methods (2)
|
|
43
|
-
|
|
44
|
-
// #region Private Methods (1)
|
|
45
|
-
|
|
46
|
-
private validate(value: any, stringLiteral: Types, defined: boolean = true, enumValues: string[] = []): boolean {
|
|
47
|
-
if (defined === false && typeof value === 'undefined') return true;
|
|
48
|
-
|
|
49
|
-
switch (stringLiteral) {
|
|
50
|
-
case 'array':
|
|
51
|
-
if(Array.isArray(value)) return true;
|
|
52
|
-
break;
|
|
53
|
-
case 'string':
|
|
54
|
-
if(this._typeChecker.isTypeOf(value, 'string')) return true;
|
|
55
|
-
break;
|
|
56
|
-
case 'boolean':
|
|
57
|
-
if(this._typeChecker.isTypeOf(value, 'boolean')) return true;
|
|
58
|
-
break;
|
|
59
|
-
case 'function':
|
|
60
|
-
if(this._typeChecker.isTypeOf(value, 'function')) return true;
|
|
61
|
-
break;
|
|
62
|
-
case 'number':
|
|
63
|
-
if(this._typeChecker.isTypeOf(value, 'number') && !isNaN(value)) return true;
|
|
64
|
-
break;
|
|
65
|
-
case 'factor':
|
|
66
|
-
if(this._typeChecker.isTypeOf(value, 'number') && value >= 0 && value <= 1) return true;
|
|
67
|
-
break;
|
|
68
|
-
case 'positive':
|
|
69
|
-
if(this._typeChecker.isTypeOf(value, 'number') && value >= 0) return true;
|
|
70
|
-
break;
|
|
71
|
-
case 'HTMLCanvasElement':
|
|
72
|
-
if(this._typeChecker.isHTMLCanvasElement(value)) return true;
|
|
73
|
-
break;
|
|
74
|
-
case 'enum':
|
|
75
|
-
if(this._typeChecker.isTypeOf(value, 'string') && enumValues.includes(value)) return true;
|
|
76
|
-
break;
|
|
77
|
-
case 'vec3':
|
|
78
|
-
if (value.constructor === Float32Array)
|
|
79
|
-
value = Array.from(value);
|
|
80
|
-
if(Array.isArray(value) && this._typeChecker.isTypeOf(value[0], 'number') && this._typeChecker.isTypeOf(value[1], 'number') && this._typeChecker.isTypeOf(value[2], 'number')) return true;
|
|
81
|
-
break;
|
|
82
|
-
case 'quat':
|
|
83
|
-
if (value.constructor === Float32Array)
|
|
84
|
-
value = Array.from(value);
|
|
85
|
-
if(Array.isArray(value) && this._typeChecker.isTypeOf(value[0], 'number') && this._typeChecker.isTypeOf(value[1], 'number') && this._typeChecker.isTypeOf(value[2], 'number') && this._typeChecker.isTypeOf(value[3], 'number')) return true;
|
|
86
|
-
break;
|
|
87
|
-
case 'cubeMap':
|
|
88
|
-
if(Array.isArray(value) && value.length === 6 && this._typeChecker.isTypeOf(value[0], 'string') && this._typeChecker.isTypeOf(value[1], 'string') && this._typeChecker.isTypeOf(value[2], 'string') && this._typeChecker.isTypeOf(value[3], 'string') && this._typeChecker.isTypeOf(value[4], 'string') && this._typeChecker.isTypeOf(value[5], 'string')) return true;
|
|
89
|
-
if(this._typeChecker.isTypeOf(value, 'string')) return true;
|
|
90
|
-
break;
|
|
91
|
-
case 'stringArray':
|
|
92
|
-
if(Array.isArray(value)) {
|
|
93
|
-
let check = true;
|
|
94
|
-
for(let i = 0; i < value.length; i++)
|
|
95
|
-
if(typeof value[i] !== 'string') check = false;
|
|
96
|
-
if (check === true) return true;
|
|
97
|
-
}
|
|
98
|
-
break;
|
|
99
|
-
case 'object':
|
|
100
|
-
if(this._typeChecker.isTypeOf(value, 'object')) return true;
|
|
101
|
-
break;
|
|
102
|
-
case 'file':
|
|
103
|
-
if(this._typeChecker.isTypeOf(value, 'string') || value instanceof File || value instanceof Blob) return true;
|
|
104
|
-
break;
|
|
105
|
-
case 'color':
|
|
106
|
-
if(this._typeChecker.isTypeOf(value, 'string') || (Array.isArray(value) && this._typeChecker.isTypeOf(value[0], 'number') && this._typeChecker.isTypeOf(value[1], 'number') && this._typeChecker.isTypeOf(value[2], 'number')) || this._typeChecker.isTypeOf(value, 'number')) return true;
|
|
107
|
-
break;
|
|
108
|
-
case 'mat4':
|
|
109
|
-
if (value.constructor === Float32Array)
|
|
110
|
-
value = Array.from(value);
|
|
111
|
-
if(Array.isArray(value) && this._typeChecker.isTypeOf(value[0], 'number') && this._typeChecker.isTypeOf(value[1], 'number') && this._typeChecker.isTypeOf(value[2], 'number') && this._typeChecker.isTypeOf(value[3], 'number')
|
|
112
|
-
&& this._typeChecker.isTypeOf(value[4], 'number') && this._typeChecker.isTypeOf(value[5], 'number') && this._typeChecker.isTypeOf(value[6], 'number') && this._typeChecker.isTypeOf(value[7], 'number')
|
|
113
|
-
&& this._typeChecker.isTypeOf(value[8], 'number') && this._typeChecker.isTypeOf(value[9], 'number') && this._typeChecker.isTypeOf(value[10], 'number') && this._typeChecker.isTypeOf(value[11], 'number')
|
|
114
|
-
&& this._typeChecker.isTypeOf(value[12], 'number') && this._typeChecker.isTypeOf(value[13], 'number') && this._typeChecker.isTypeOf(value[14], 'number') && this._typeChecker.isTypeOf(value[15], 'number')) return true;
|
|
115
|
-
break;
|
|
116
|
-
default:
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// #endregion Private Methods (1)
|
|
123
|
-
}
|