@shapediver/viewer.session-engine.session-engine 1.15.7 → 2.0.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.
Files changed (97) hide show
  1. package/dist/implementation/OutputLoader.d.ts +1 -1
  2. package/dist/implementation/OutputLoader.d.ts.map +1 -1
  3. package/dist/implementation/OutputLoader.js +2 -5
  4. package/dist/implementation/OutputLoader.js.map +1 -1
  5. package/dist/implementation/SessionData.d.ts +4 -3
  6. package/dist/implementation/SessionData.d.ts.map +1 -1
  7. package/dist/implementation/SessionData.js.map +1 -1
  8. package/dist/implementation/{Session.d.ts → SessionEngine.d.ts} +79 -17
  9. package/dist/implementation/SessionEngine.d.ts.map +1 -0
  10. package/dist/implementation/SessionEngine.js +1132 -0
  11. package/dist/implementation/SessionEngine.js.map +1 -0
  12. package/dist/implementation/SessionOutputData.d.ts +4 -3
  13. package/dist/implementation/SessionOutputData.d.ts.map +1 -1
  14. package/dist/implementation/SessionOutputData.js.map +1 -1
  15. package/dist/implementation/SessionTreeNode.d.ts +4 -4
  16. package/dist/implementation/SessionTreeNode.d.ts.map +1 -1
  17. package/dist/implementation/SessionTreeNode.js +1 -4
  18. package/dist/implementation/SessionTreeNode.js.map +1 -1
  19. package/dist/implementation/dto/Export.d.ts +37 -0
  20. package/dist/implementation/dto/Export.d.ts.map +1 -0
  21. package/dist/implementation/dto/Export.js +204 -0
  22. package/dist/implementation/dto/Export.js.map +1 -0
  23. package/dist/implementation/dto/FileParameter.d.ts +10 -0
  24. package/dist/implementation/dto/FileParameter.d.ts.map +1 -0
  25. package/dist/implementation/dto/FileParameter.js +99 -0
  26. package/dist/implementation/dto/FileParameter.js.map +1 -0
  27. package/dist/implementation/dto/Output.d.ts +40 -0
  28. package/dist/implementation/dto/Output.d.ts.map +1 -0
  29. package/dist/implementation/dto/Output.js +194 -0
  30. package/dist/implementation/dto/Output.js.map +1 -0
  31. package/dist/implementation/dto/Parameter.d.ts +39 -0
  32. package/dist/implementation/dto/Parameter.d.ts.map +1 -0
  33. package/dist/implementation/dto/Parameter.js +341 -0
  34. package/dist/implementation/dto/Parameter.js.map +1 -0
  35. package/dist/index.d.ts +15 -5
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +14 -3
  38. package/dist/index.js.map +1 -1
  39. package/dist/interfaces/ISessionData.d.ts +7 -0
  40. package/dist/interfaces/ISessionData.d.ts.map +1 -0
  41. package/dist/interfaces/ISessionData.js +3 -0
  42. package/dist/interfaces/ISessionData.js.map +1 -0
  43. package/dist/interfaces/ISessionEngine.d.ts +123 -0
  44. package/dist/interfaces/ISessionEngine.d.ts.map +1 -0
  45. package/dist/interfaces/ISessionEngine.js +59 -0
  46. package/dist/interfaces/ISessionEngine.js.map +1 -0
  47. package/dist/interfaces/ISessionOutputData.d.ts +7 -0
  48. package/dist/interfaces/ISessionOutputData.d.ts.map +1 -0
  49. package/dist/interfaces/ISessionOutputData.js +3 -0
  50. package/dist/interfaces/ISessionOutputData.js.map +1 -0
  51. package/dist/interfaces/ISessionTreeNode.d.ts +5 -0
  52. package/dist/interfaces/ISessionTreeNode.d.ts.map +1 -0
  53. package/dist/interfaces/ISessionTreeNode.js +3 -0
  54. package/dist/interfaces/ISessionTreeNode.js.map +1 -0
  55. package/dist/interfaces/dto/IExport.d.ts +10 -0
  56. package/dist/interfaces/dto/IExport.d.ts.map +1 -0
  57. package/dist/interfaces/{ISession.js → dto/IExport.js} +1 -1
  58. package/dist/interfaces/dto/IExport.js.map +1 -0
  59. package/dist/interfaces/dto/IFileParameter.d.ts +5 -0
  60. package/dist/interfaces/dto/IFileParameter.d.ts.map +1 -0
  61. package/dist/interfaces/dto/IFileParameter.js +3 -0
  62. package/dist/interfaces/dto/IFileParameter.js.map +1 -0
  63. package/dist/interfaces/dto/IOutput.d.ts +25 -0
  64. package/dist/interfaces/dto/IOutput.d.ts.map +1 -0
  65. package/dist/interfaces/dto/IOutput.js +3 -0
  66. package/dist/interfaces/dto/IOutput.js.map +1 -0
  67. package/dist/interfaces/dto/IParameter.d.ts +10 -0
  68. package/dist/interfaces/dto/IParameter.d.ts.map +1 -0
  69. package/dist/interfaces/dto/IParameter.js +3 -0
  70. package/dist/interfaces/dto/IParameter.js.map +1 -0
  71. package/package.json +18 -11
  72. package/src/implementation/OutputDelayException.ts +22 -0
  73. package/src/implementation/OutputLoader.ts +281 -0
  74. package/src/implementation/SessionData.ts +43 -0
  75. package/src/implementation/SessionEngine.ts +1267 -0
  76. package/src/implementation/SessionOutputData.ts +43 -0
  77. package/src/implementation/SessionTreeNode.ts +41 -0
  78. package/src/implementation/dto/Export.ts +223 -0
  79. package/src/implementation/dto/FileParameter.ts +71 -0
  80. package/src/implementation/dto/Output.ts +213 -0
  81. package/src/implementation/dto/Parameter.ts +340 -0
  82. package/src/index.ts +26 -0
  83. package/src/interfaces/ISessionData.ts +16 -0
  84. package/src/interfaces/ISessionEngine.ts +123 -0
  85. package/src/interfaces/ISessionOutputData.ts +16 -0
  86. package/src/interfaces/ISessionTreeNode.ts +9 -0
  87. package/src/interfaces/dto/IExport.ts +17 -0
  88. package/src/interfaces/dto/IFileParameter.ts +9 -0
  89. package/src/interfaces/dto/IOutput.ts +45 -0
  90. package/src/interfaces/dto/IParameter.ts +19 -0
  91. package/tsconfig.json +17 -0
  92. package/dist/implementation/Session.d.ts.map +0 -1
  93. package/dist/implementation/Session.js +0 -536
  94. package/dist/implementation/Session.js.map +0 -1
  95. package/dist/interfaces/ISession.d.ts +0 -32
  96. package/dist/interfaces/ISession.d.ts.map +0 -1
  97. package/dist/interfaces/ISession.js.map +0 -1
@@ -0,0 +1,1132 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
14
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
15
+ };
16
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
17
+ if (kind === "m") throw new TypeError("Private method is not writable");
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
20
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
21
+ };
22
+ var _SessionEngine_customizationProcess, _SessionEngine_parameterHistory, _SessionEngine_parameterHistoryCall, _SessionEngine_parameterHistoryForward;
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.SessionEngine = void 0;
25
+ const tsyringe_1 = require("tsyringe");
26
+ const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
27
+ const OutputDelayException_1 = require("./OutputDelayException");
28
+ const OutputLoader_1 = require("./OutputLoader");
29
+ const SessionTreeNode_1 = require("./SessionTreeNode");
30
+ const ISessionEngine_1 = require("../interfaces/ISessionEngine");
31
+ const SessionData_1 = require("./SessionData");
32
+ const sdk_geometry_api_sdk_v2_1 = require("@shapediver/sdk.geometry-api-sdk-v2");
33
+ const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
34
+ const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
35
+ const FileParameter_1 = require("./dto/FileParameter");
36
+ const Parameter_1 = require("./dto/Parameter");
37
+ const Export_1 = require("./dto/Export");
38
+ const Output_1 = require("./dto/Output");
39
+ const viewer_settings_1 = require("@shapediver/viewer.settings");
40
+ class SessionEngine {
41
+ // #endregion Properties (40)
42
+ // #region Constructors (1)
43
+ /**
44
+ * Can be use to initialize a session with the ticket and modelViewUrl and returns a scene graph node with the result.
45
+ * Can be use to customize the session with updated parameters to get the updated scene graph node.
46
+ */
47
+ constructor(properties) {
48
+ // #region Properties (40)
49
+ this._converter = tsyringe_1.container.resolve(viewer_shared_services_1.Converter);
50
+ this._eventEngine = tsyringe_1.container.resolve(viewer_shared_services_1.EventEngine);
51
+ this._exports = {};
52
+ this._httpClient = tsyringe_1.container.resolve(viewer_shared_services_1.HttpClient);
53
+ this._logger = tsyringe_1.container.resolve(viewer_shared_services_1.Logger);
54
+ this._outputs = {};
55
+ this._outputsFreeze = {};
56
+ this._parameterValues = {};
57
+ this._parameters = {};
58
+ this._performanceEvaluator = tsyringe_1.container.resolve(viewer_shared_services_1.PerformanceEvaluator);
59
+ this._sceneTree = tsyringe_1.container.resolve(viewer_shared_node_tree_1.Tree);
60
+ this._sessionEngineId = tsyringe_1.container.resolve(viewer_shared_services_1.UuidGenerator).create();
61
+ this._settingsEngine = new viewer_shared_services_1.SettingsEngine();
62
+ this._stateEngine = tsyringe_1.container.resolve(viewer_shared_services_1.StateEngine);
63
+ this._uuidGenerator = tsyringe_1.container.resolve(viewer_shared_services_1.UuidGenerator);
64
+ this._automaticSceneUpdate = true;
65
+ this._closeOnFailure = () => __awaiter(this, void 0, void 0, function* () { });
66
+ this._closed = false;
67
+ this._customizeOnParameterChange = false;
68
+ this._dataCache = {};
69
+ this._excludeViewports = [];
70
+ this._headers = {
71
+ "X-ShapeDiver-Origin": tsyringe_1.container.resolve(viewer_shared_services_1.SystemInfo).origin,
72
+ "X-ShapeDiver-SessionEngineId": this._sessionEngineId,
73
+ "X-ShapeDiver-BuildVersion": '',
74
+ "X-ShapeDiver-BuildDate": ''
75
+ };
76
+ this._initialized = false;
77
+ this._retryCounter = 0;
78
+ this._updateCallback = null;
79
+ _SessionEngine_customizationProcess.set(this, void 0);
80
+ _SessionEngine_parameterHistory.set(this, []);
81
+ _SessionEngine_parameterHistoryCall.set(this, false);
82
+ _SessionEngine_parameterHistoryForward.set(this, []);
83
+ this._id = properties.id;
84
+ this._node = new viewer_shared_node_tree_1.TreeNode(properties.id);
85
+ this._ticket = properties.ticket;
86
+ this._modelViewUrl = properties.modelViewUrl;
87
+ this._excludeViewports = properties.excludeViewports || [];
88
+ this._bearerToken = properties.bearerToken;
89
+ this._headers['X-ShapeDiver-BuildDate'] = properties.buildDate;
90
+ this._headers['X-ShapeDiver-BuildVersion'] = properties.buildVersion;
91
+ this._outputLoader = new OutputLoader_1.OutputLoader();
92
+ this._sdk = (0, sdk_geometry_api_sdk_v2_1.create)(this._modelViewUrl, this._bearerToken);
93
+ this._sdk.setConfigurationValue(sdk_geometry_api_sdk_v2_1.ShapeDiverSdkConfigType.REQUEST_HEADERS, this._headers);
94
+ }
95
+ // #endregion Constructors (1)
96
+ // #region Public Accessors (23)
97
+ get automaticSceneUpdate() {
98
+ return this._automaticSceneUpdate;
99
+ }
100
+ set automaticSceneUpdate(value) {
101
+ this._automaticSceneUpdate = value;
102
+ value ? this._sceneTree.addNode(this._node) : this._sceneTree.removeNode(this._node);
103
+ }
104
+ get bearerToken() {
105
+ return this._bearerToken;
106
+ }
107
+ set bearerToken(value) {
108
+ this._bearerToken = value;
109
+ this._sdk.setConfigurationValue(sdk_geometry_api_sdk_v2_1.ShapeDiverSdkConfigType.JWT_TOKEN, value);
110
+ }
111
+ get canUploadGLTF() {
112
+ try {
113
+ this.checkAvailability('gltf-upload');
114
+ return true;
115
+ }
116
+ catch (e) {
117
+ return false;
118
+ }
119
+ }
120
+ get customizeOnParameterChange() {
121
+ return this._customizeOnParameterChange;
122
+ }
123
+ set customizeOnParameterChange(value) {
124
+ this._customizeOnParameterChange = value;
125
+ }
126
+ get excludeViewports() {
127
+ return this._excludeViewports;
128
+ }
129
+ set excludeViewports(value) {
130
+ this._excludeViewports = value;
131
+ this._node.excludeViewports = value;
132
+ }
133
+ get exports() {
134
+ return this._exports;
135
+ }
136
+ get id() {
137
+ return this._id;
138
+ }
139
+ get initialized() {
140
+ return this._initialized;
141
+ }
142
+ get modelViewUrl() {
143
+ return this._modelViewUrl;
144
+ }
145
+ get node() {
146
+ return this._node;
147
+ }
148
+ get outputs() {
149
+ return this._outputs;
150
+ }
151
+ get outputsFreeze() {
152
+ return this._outputsFreeze;
153
+ }
154
+ get parameterValues() {
155
+ return this._parameterValues;
156
+ }
157
+ get parameters() {
158
+ return this._parameters;
159
+ }
160
+ get refreshBearerToken() {
161
+ return this._refreshBearerToken;
162
+ }
163
+ set refreshBearerToken(value) {
164
+ this._refreshBearerToken = value;
165
+ }
166
+ get settingsEngine() {
167
+ return this._settingsEngine;
168
+ }
169
+ get ticket() {
170
+ return this._ticket;
171
+ }
172
+ get updateCallback() {
173
+ return this._updateCallback;
174
+ }
175
+ set updateCallback(value) {
176
+ this._updateCallback = value;
177
+ }
178
+ get viewerSettings() {
179
+ return this._viewerSettings;
180
+ }
181
+ // #endregion Public Accessors (23)
182
+ // #region Public Methods (22)
183
+ applySettings(response, sections) {
184
+ try {
185
+ sections = sections || {};
186
+ if (sections.session === undefined) {
187
+ sections.session = {
188
+ parameter: { displayname: false, order: false, hidden: false },
189
+ export: { displayname: false, order: false, hidden: false }
190
+ };
191
+ }
192
+ if (sections.session.parameter === undefined)
193
+ sections.session.parameter = { displayname: false, order: false, hidden: false, value: false };
194
+ if (sections.session.export === undefined)
195
+ sections.session.export = { displayname: false, order: false, hidden: false };
196
+ if (sections.viewport === undefined)
197
+ sections.viewport = { ar: false, scene: false, camera: false, light: false, environment: false, general: false };
198
+ let config;
199
+ if (response.viewer !== undefined) {
200
+ config = response.viewer.config;
201
+ }
202
+ else {
203
+ const error = new viewer_shared_services_1.ShapeDiverViewerSettingsError('Api.applySettings: No config object available.');
204
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SETTINGS, 'Api.applySettings', error);
205
+ }
206
+ try {
207
+ (0, viewer_settings_1.validate)(config);
208
+ }
209
+ catch (e) {
210
+ const error = new viewer_shared_services_1.ShapeDiverViewerSettingsError('Api.applySettings: Was not able to validate config object.');
211
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SETTINGS, 'Api.applySettings', error);
212
+ }
213
+ const settings = (0, viewer_settings_1.convert)(config, '3.1');
214
+ const exportMappingUid = {};
215
+ if (sections.session.export.displayname || sections.session.export.order || sections.session.export.hidden)
216
+ if (response.exports)
217
+ for (let exportId in response.exports)
218
+ if (response.exports[exportId].uid !== undefined)
219
+ exportMappingUid[response.exports[exportId].uid] = exportId;
220
+ const currentSettings = this._settingsEngine.settings;
221
+ // apply parameter settings
222
+ if (sections.session.parameter.displayname || sections.session.parameter.order || sections.session.parameter.hidden || sections.session.parameter.value) {
223
+ for (let p in this.parameters) {
224
+ if (settings.session[p]) {
225
+ if (sections.session.parameter.displayname)
226
+ this.parameters[p].displayname = settings.session[p].displayname;
227
+ if (sections.session.parameter.order)
228
+ this.parameters[p].order = settings.session[p].order;
229
+ if (sections.session.parameter.hidden)
230
+ this.parameters[p].hidden = settings.session[p].hidden || false;
231
+ }
232
+ if (response.parameters && response.parameters[p]) {
233
+ if (sections.session.parameter.value)
234
+ this.parameters[p].value = response.parameters[p].defval !== undefined ? response.parameters[p].defval : this.parameters[p].value;
235
+ }
236
+ }
237
+ }
238
+ // apply export settings
239
+ if (sections.session.export.displayname || sections.session.export.order || sections.session.export.hidden) {
240
+ for (let p in this.exports) {
241
+ let idForSettings = '';
242
+ if (settings.session[p]) {
243
+ idForSettings = p;
244
+ }
245
+ else {
246
+ const uid = this.exports[p].uid;
247
+ if (!uid)
248
+ continue;
249
+ if (!exportMappingUid[uid])
250
+ continue;
251
+ idForSettings = exportMappingUid[uid];
252
+ }
253
+ if (settings.session[idForSettings]) {
254
+ if (sections.session.export.displayname)
255
+ this.exports[p].displayname = settings.session[idForSettings].displayname;
256
+ if (sections.session.export.order)
257
+ this.exports[p].order = settings.session[idForSettings].order;
258
+ if (sections.session.export.hidden)
259
+ this.exports[p].hidden = settings.session[idForSettings].hidden || false;
260
+ }
261
+ }
262
+ }
263
+ // apply ar settings
264
+ if (sections.viewport.ar) {
265
+ currentSettings.ar = settings.ar;
266
+ currentSettings.general.transformation = settings.general.transformation;
267
+ }
268
+ // apply camera settings
269
+ if (sections.viewport.camera)
270
+ currentSettings.camera = settings.camera;
271
+ // apply light settings
272
+ if (sections.viewport.light)
273
+ currentSettings.light = settings.light;
274
+ // apply scene settings
275
+ if (sections.viewport.scene) {
276
+ currentSettings.environmentGeometry.gridColor = settings.environmentGeometry.gridColor;
277
+ currentSettings.environmentGeometry.gridVisibility = settings.environmentGeometry.gridVisibility;
278
+ currentSettings.environmentGeometry.groundPlaneColor = settings.environmentGeometry.groundPlaneColor;
279
+ currentSettings.environmentGeometry.groundPlaneVisibility = settings.environmentGeometry.groundPlaneVisibility;
280
+ currentSettings.rendering.shadows = settings.rendering.shadows;
281
+ currentSettings.rendering.ambientOcclusion = settings.rendering.ambientOcclusion;
282
+ currentSettings.rendering.textureEncoding = settings.rendering.textureEncoding;
283
+ currentSettings.rendering.outputEncoding = settings.rendering.outputEncoding;
284
+ currentSettings.rendering.physicallyCorrectLights = settings.rendering.physicallyCorrectLights;
285
+ currentSettings.rendering.toneMapping = settings.rendering.toneMapping;
286
+ currentSettings.rendering.toneMappingExposure = settings.rendering.toneMappingExposure;
287
+ }
288
+ if (sections.viewport.general) {
289
+ currentSettings.general.commitParameters = settings.general.commitParameters;
290
+ currentSettings.general.pointSize = settings.general.pointSize;
291
+ }
292
+ // apply environment settings
293
+ if (sections.viewport.environment) {
294
+ currentSettings.environment.clearAlpha = settings.environment.clearAlpha;
295
+ currentSettings.environment.clearColor = settings.environment.clearColor;
296
+ currentSettings.environment.map = settings.environment.map;
297
+ currentSettings.environment.mapAsBackground = settings.environment.mapAsBackground;
298
+ }
299
+ }
300
+ catch (e) {
301
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
302
+ throw e;
303
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.GENERAL, 'Api.applySettings', e);
304
+ }
305
+ }
306
+ canGoBack() {
307
+ // the first entry is always the one from the init call
308
+ // all additional entries can be undone
309
+ return __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").length > 1;
310
+ }
311
+ canGoForward() {
312
+ return __classPrivateFieldGet(this, _SessionEngine_parameterHistoryForward, "f").length > 0;
313
+ }
314
+ close(retry = false) {
315
+ return __awaiter(this, void 0, void 0, function* () {
316
+ this.checkAvailability('close');
317
+ try {
318
+ this._httpClient.removeDataLoading(this._sessionId);
319
+ yield this._sdk.session.close(this._sessionId);
320
+ if (this._automaticSceneUpdate)
321
+ this._sceneTree.removeNode(this._node);
322
+ this._closed = true;
323
+ }
324
+ catch (e) {
325
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.close', e, retry);
326
+ return yield this.close(true);
327
+ }
328
+ });
329
+ }
330
+ /**
331
+ * Customizes the session with updated parameters to get the updated scene graph node.
332
+ *
333
+ * @param parameters the parameter set to update the session
334
+ * @returns promise with a scene graph node
335
+ */
336
+ customize() {
337
+ return __awaiter(this, void 0, void 0, function* () {
338
+ const eventId = this._uuidGenerator.create();
339
+ const customizationId = this._uuidGenerator.create();
340
+ try {
341
+ const eventStart = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 0, data: { sessionId: this.id }, status: 'Customizing session' };
342
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_START, eventStart);
343
+ const oldNode = this.node.cloneInstance();
344
+ __classPrivateFieldSet(this, _SessionEngine_customizationProcess, customizationId, "f");
345
+ this._logger.debugLow(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Customizing session.`);
346
+ for (let r in this._stateEngine.renderingEngines)
347
+ this._stateEngine.renderingEngines[r].busy.push(customizationId);
348
+ const eventFileUpload = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 0.1, data: { sessionId: this.id }, status: 'Uploading file parameters' };
349
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_PROCESS, eventFileUpload);
350
+ const fileParameterIds = {};
351
+ // load file parameter first
352
+ for (const parameterId in this.parameters) {
353
+ if (this.parameters[parameterId] instanceof FileParameter_1.FileParameter) {
354
+ fileParameterIds[parameterId] = yield this.parameters[parameterId].upload();
355
+ // OPTION TO SKIP - PART 1a
356
+ if (__classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId) {
357
+ for (let r in this._stateEngine.renderingEngines)
358
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
359
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
360
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Session customization was exceeded by other customization request.`);
361
+ const eventCancel1a = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Session customization was exceeded by other customization request' };
362
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_CANCEL, eventCancel1a);
363
+ return new SessionTreeNode_1.SessionTreeNode();
364
+ }
365
+ }
366
+ }
367
+ // OPTION TO SKIP - PART 1b
368
+ if (__classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId) {
369
+ for (let r in this._stateEngine.renderingEngines)
370
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
371
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
372
+ const eventCancel1b = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Session customization was exceeded by other customization request' };
373
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_CANCEL, eventCancel1b);
374
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Session customization was exceeded by other customization request.`);
375
+ return new SessionTreeNode_1.SessionTreeNode();
376
+ }
377
+ // assign the uploaded parameters
378
+ for (const parameterId in fileParameterIds)
379
+ this.parameters[parameterId].value = fileParameterIds[parameterId];
380
+ const parameterSet = {};
381
+ // create a set of the current validated parameter values
382
+ for (const parameterId in this.parameters) {
383
+ parameterSet[parameterId] = {
384
+ value: this.parameters[parameterId].value,
385
+ valueString: this.parameters[parameterId].stringify()
386
+ };
387
+ }
388
+ // update the session engine parameter values if everything succeeded
389
+ for (const parameterId in this.parameters)
390
+ this.parameterValues[parameterId] = parameterSet[parameterId].valueString;
391
+ this._logger.info(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Customizing session with parameters ${JSON.stringify(this.parameterValues)}.`);
392
+ const eventRequest = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 0.25, data: { sessionId: this.id }, status: 'Sending customization request' };
393
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_PROCESS, eventRequest);
394
+ const newNode = yield this.customizeInternal(() => __classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId);
395
+ const eventSceneUpdate = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 0.75, data: { sessionId: this.id }, status: 'Updating scene' };
396
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_PROCESS, eventSceneUpdate);
397
+ // OPTION TO SKIP - PART 2
398
+ if (__classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId) {
399
+ for (let r in this._stateEngine.renderingEngines)
400
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
401
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
402
+ const eventCancel2 = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Session customization was exceeded by other customization request' };
403
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_CANCEL, eventCancel2);
404
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Session customization was exceeded by other customization request.`);
405
+ return newNode;
406
+ }
407
+ // if this is not a call by the goBack or goForward functions, add the parameter values to the history and delete the forward history
408
+ if (!__classPrivateFieldGet(this, _SessionEngine_parameterHistoryCall, "f")) {
409
+ __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").push(parameterSet);
410
+ __classPrivateFieldSet(this, _SessionEngine_parameterHistoryForward, [], "f");
411
+ }
412
+ if (this.automaticSceneUpdate)
413
+ this._sceneTree.removeNode(this.node);
414
+ this._node = newNode;
415
+ if (this.automaticSceneUpdate)
416
+ this._sceneTree.addNode(this.node);
417
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Customization request finished, updating geometry.`);
418
+ // set the session values to the current ones in all parameters
419
+ for (const parameterId in this.parameters)
420
+ this.parameters[parameterId].sessionValue = parameterSet[parameterId].value;
421
+ if (this._updateCallback)
422
+ this._updateCallback(newNode, oldNode);
423
+ // set the output content to what has been updated
424
+ for (const outputId in this.outputs)
425
+ this.outputs[outputId].updateOutput(newNode.children.find(c => c.name === outputId), oldNode.children.find(c => c.name === outputId));
426
+ // set the export definitions
427
+ for (const exportId in this.exports)
428
+ this.exports[exportId].updateExport();
429
+ this._warningCreator();
430
+ this.node.excludeViewports = this._excludeViewports;
431
+ for (let r in this._stateEngine.renderingEngines)
432
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
433
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
434
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize: Session customized.`);
435
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.SESSION.SESSION_CUSTOMIZED, { sessionId: this.id });
436
+ const eventEnd = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Session customized' };
437
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_END, eventEnd);
438
+ return this.node;
439
+ }
440
+ catch (e) {
441
+ const eventCancel = { type: viewer_shared_types_1.TASK_TYPE.SESSION_CUSTOMIZATION, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Session customization failed' };
442
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_CANCEL, eventCancel);
443
+ for (let r in this._stateEngine.renderingEngines)
444
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
445
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
446
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
447
+ throw e;
448
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).customize`, e);
449
+ }
450
+ });
451
+ }
452
+ customizeParallel(parameterValues) {
453
+ // https://shapediver.atlassian.net/browse/SS-5408
454
+ throw new Error('Method not implemented.');
455
+ }
456
+ goBack() {
457
+ return __awaiter(this, void 0, void 0, function* () {
458
+ if (!this.canGoBack()) {
459
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).goBack: Cannot go further back.`);
460
+ return new viewer_shared_node_tree_1.TreeNode();
461
+ }
462
+ // get the current parameter set and store it in the forward history later on
463
+ const currentParameterSet = __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").pop();
464
+ // adjust the parameters according to the last parameter set
465
+ const lastParameterSet = __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f")[__classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").length - 1];
466
+ for (const parameterId in lastParameterSet)
467
+ this.parameters[parameterId].value = lastParameterSet[parameterId].value;
468
+ // call the customization function with the parameterHistoryCall value set to true
469
+ __classPrivateFieldSet(this, _SessionEngine_parameterHistoryCall, true, "f");
470
+ const node = yield this.customize();
471
+ __classPrivateFieldSet(this, _SessionEngine_parameterHistoryCall, false, "f");
472
+ // add the current (not anymore current) parameter set to the forward history
473
+ __classPrivateFieldGet(this, _SessionEngine_parameterHistoryForward, "f").push(currentParameterSet);
474
+ return node;
475
+ });
476
+ }
477
+ goForward() {
478
+ return __awaiter(this, void 0, void 0, function* () {
479
+ if (!this.canGoForward()) {
480
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).goForward: Cannot go further forward.`);
481
+ return new viewer_shared_node_tree_1.TreeNode();
482
+ }
483
+ // get the last undone parameter set and apply the values to the parameters
484
+ const lastParameterSet = __classPrivateFieldGet(this, _SessionEngine_parameterHistoryForward, "f").pop();
485
+ for (const parameterId in lastParameterSet)
486
+ this.parameters[parameterId].value = lastParameterSet[parameterId].value;
487
+ // call the customization function with the parameterHistoryCall value set to true
488
+ __classPrivateFieldSet(this, _SessionEngine_parameterHistoryCall, true, "f");
489
+ const node = yield this.customize();
490
+ __classPrivateFieldSet(this, _SessionEngine_parameterHistoryCall, false, "f");
491
+ // add the current parameter set to the history
492
+ __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").push(lastParameterSet);
493
+ return node;
494
+ });
495
+ }
496
+ /**
497
+ * Initializes the session with the ticket and modelViewUrl.
498
+ *
499
+ * @returns promise with a scene graph node
500
+ */
501
+ init(parameterValues, retry = false) {
502
+ var _a, _b;
503
+ return __awaiter(this, void 0, void 0, function* () {
504
+ if (this._initialized === true) {
505
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError('Session.init: Session already initialized.');
506
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.init', error);
507
+ }
508
+ try {
509
+ this._performanceEvaluator.startSection('sessionResponse');
510
+ this._responseDto = yield this._sdk.session.init(this._ticket, parameterValues);
511
+ this._performanceEvaluator.endSection('sessionResponse');
512
+ this._viewerSettings = (_a = this._responseDto.viewer) === null || _a === void 0 ? void 0 : _a.config;
513
+ this._settingsEngine.loadSettings(this._viewerSettings);
514
+ this._sessionId = this._responseDto.sessionId;
515
+ this._modelId = (_b = this._responseDto.model) === null || _b === void 0 ? void 0 : _b.id;
516
+ this._httpClient.addDataLoading(this._sessionId, {
517
+ getOutput: this._sdk.asset.getOutput.bind(this._sdk.asset),
518
+ getTexture: this._sdk.asset.getTexture.bind(this._sdk.asset),
519
+ getExport: this._sdk.asset.getExport.bind(this._sdk.asset),
520
+ downloadTexture: this._sdk.asset.downloadImage.bind(this._sdk.asset),
521
+ });
522
+ if (!this._sessionId)
523
+ throw new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.init: Initialization of session failed. ResponseDto did not have a sessionId.`);
524
+ if (!this._modelId)
525
+ throw new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.init: Initialization of session failed. ResponseDto did not have a model.id.`);
526
+ this.updateResponseDto(this._responseDto, parameterValues);
527
+ this._initialized = true;
528
+ }
529
+ catch (e) {
530
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.init', e, retry);
531
+ return yield this.init(parameterValues, true);
532
+ }
533
+ });
534
+ }
535
+ /**
536
+ * Load the outputs and return the scene graph node of the result.
537
+ * In case the outputs have a delay property, another customization request with the parameter set is sent.
538
+ *
539
+ * @param parameters the parameter set to update the session
540
+ * @param outputs the outputs to load
541
+ * @returns promise with a scene graph node
542
+ */
543
+ loadOutputs(cancelRequest = () => false, retry = false) {
544
+ return __awaiter(this, void 0, void 0, function* () {
545
+ this.checkAvailability();
546
+ const o = Object.assign({}, this._outputs);
547
+ const of = Object.assign({}, this._outputsFreeze);
548
+ try {
549
+ const node = yield this._outputLoader.loadOutputs(this._responseDto, o, of);
550
+ node.data.push(new SessionData_1.SessionData(this._responseDto));
551
+ if (cancelRequest())
552
+ return node;
553
+ if (this._automaticSceneUpdate)
554
+ this._sceneTree.removeNode(this._node);
555
+ this._node = node;
556
+ if (this._automaticSceneUpdate)
557
+ this._sceneTree.addNode(this._node);
558
+ this.node.excludeViewports = this._excludeViewports;
559
+ return node;
560
+ }
561
+ catch (e) {
562
+ if (e instanceof OutputDelayException_1.OutputDelayException) {
563
+ yield this.timeout(e.delay);
564
+ }
565
+ else {
566
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.loadOutputs', e, retry);
567
+ if (cancelRequest())
568
+ return new SessionTreeNode_1.SessionTreeNode();
569
+ return yield this.loadOutputs(cancelRequest, true);
570
+ }
571
+ if (cancelRequest())
572
+ return new SessionTreeNode_1.SessionTreeNode();
573
+ let outputMapping = {};
574
+ for (let output in o)
575
+ outputMapping[output] = o[output].version;
576
+ try {
577
+ const responseDto = yield this._sdk.output.getCache(this._sessionId, outputMapping);
578
+ if (cancelRequest())
579
+ return new SessionTreeNode_1.SessionTreeNode();
580
+ this.updateResponseDto(responseDto);
581
+ return yield this.loadOutputs(cancelRequest);
582
+ }
583
+ catch (e) {
584
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.loadOutputs', e, retry);
585
+ if (cancelRequest())
586
+ return new SessionTreeNode_1.SessionTreeNode();
587
+ return yield this.loadOutputs(cancelRequest, true);
588
+ }
589
+ }
590
+ });
591
+ }
592
+ requestExport(exportId, parameters, maxWaitTime, retry = false) {
593
+ return __awaiter(this, void 0, void 0, function* () {
594
+ this.checkAvailability('export');
595
+ try {
596
+ const responseDto = yield this._sdk.utils.submitAndWaitForExport(this._sdk, this._sessionId, { exports: { id: exportId }, parameters }, maxWaitTime);
597
+ this.updateResponseDto(responseDto);
598
+ return this.exports[exportId];
599
+ }
600
+ catch (e) {
601
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.requestExport', e, retry);
602
+ return yield this.requestExport(exportId, parameters, maxWaitTime, true);
603
+ }
604
+ });
605
+ }
606
+ saveDefaultParameterValues() {
607
+ return __awaiter(this, void 0, void 0, function* () {
608
+ try {
609
+ this._logger.debugLow(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveDefaultParameters: Saving default parameters.`);
610
+ const response = yield this.saveDefaultParameters();
611
+ if (response) {
612
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveDefaultParameters: Saved default parameters.`);
613
+ }
614
+ else {
615
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session(${this.id}).saveDefaultParameters: Could not save default parameters.`);
616
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveDefaultParameters`, error);
617
+ }
618
+ return response;
619
+ }
620
+ catch (e) {
621
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
622
+ throw e;
623
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveDefaultParameters`, e);
624
+ }
625
+ });
626
+ }
627
+ saveDefaultParameters(retry = false) {
628
+ return __awaiter(this, void 0, void 0, function* () {
629
+ this.checkAvailability('defaultparam', true);
630
+ try {
631
+ yield this._sdk.model.setDefaultParams(this._modelId, this._parameterValues);
632
+ return true;
633
+ }
634
+ catch (e) {
635
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.saveDefaultParameters', e, retry);
636
+ return yield this.saveDefaultParameters(true);
637
+ }
638
+ });
639
+ }
640
+ /**
641
+ * Save the export properties for displayname, order, tooltip and hidden
642
+ *
643
+ * @param exports
644
+ * @returns
645
+ */
646
+ saveExportProperties(exports, retry = false) {
647
+ return __awaiter(this, void 0, void 0, function* () {
648
+ this.checkAvailability('export-definition', true);
649
+ try {
650
+ yield this._sdk.export.updateDefinitions(this._modelId, exports);
651
+ return true;
652
+ }
653
+ catch (e) {
654
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.saveExportProperties', e, retry);
655
+ return yield this.saveExportProperties(exports, true);
656
+ }
657
+ });
658
+ }
659
+ /**
660
+ * Save the output properties for displayname, order, tooltip and hidden
661
+ *
662
+ * @param outputs
663
+ * @returns
664
+ */
665
+ saveOutputProperties(outputs, retry = false) {
666
+ return __awaiter(this, void 0, void 0, function* () {
667
+ this.checkAvailability('output-definition', true);
668
+ try {
669
+ yield this._sdk.output.updateDefinitions(this._modelId, outputs);
670
+ return true;
671
+ }
672
+ catch (e) {
673
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.saveOutputProperties', e, retry);
674
+ return yield this.saveOutputProperties(outputs, true);
675
+ }
676
+ });
677
+ }
678
+ /**
679
+ * Save the parameter properties for displayname, order, tooltip and hidden
680
+ *
681
+ * @param parameters
682
+ * @returns
683
+ */
684
+ saveParameterProperties(parameters, retry = false) {
685
+ return __awaiter(this, void 0, void 0, function* () {
686
+ this.checkAvailability('parameter-definition', true);
687
+ try {
688
+ yield this._sdk.model.updateParameterDefinitions(this._modelId, parameters);
689
+ return true;
690
+ }
691
+ catch (e) {
692
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.saveParameterProperties', e, retry);
693
+ return yield this.saveParameterProperties(parameters, true);
694
+ }
695
+ });
696
+ }
697
+ saveSettings(json, retry = false) {
698
+ return __awaiter(this, void 0, void 0, function* () {
699
+ this.checkAvailability('configure', true);
700
+ try {
701
+ yield this._sdk.model.updateConfig(this._modelId, json);
702
+ return true;
703
+ }
704
+ catch (e) {
705
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.saveSettings', e, retry);
706
+ return yield this.saveSettings(json, true);
707
+ }
708
+ });
709
+ }
710
+ saveUiProperties(saveInSettings = true) {
711
+ return __awaiter(this, void 0, void 0, function* () {
712
+ try {
713
+ this._logger.debugLow(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveSessionProperties: Saving session properties.`);
714
+ // settings saving
715
+ this._saveSessionSettings();
716
+ let properties = {};
717
+ for (let p in this.parameters) {
718
+ properties[p] = {
719
+ displayname: this.parameters[p].displayname !== undefined ? this.parameters[p].displayname : '',
720
+ hidden: this.parameters[p].hidden !== undefined ? this.parameters[p].hidden : false,
721
+ order: this.parameters[p].order !== undefined ? this.parameters[p].order : 0,
722
+ tooltip: this.parameters[p].tooltip !== undefined ? this.parameters[p].tooltip : '',
723
+ };
724
+ }
725
+ const responseP = Object.values(properties).length !== 0 ? yield this.saveParameterProperties(properties) : true;
726
+ properties = {};
727
+ for (let e in this.exports) {
728
+ properties[e] = {
729
+ displayname: this.exports[e].displayname !== undefined ? this.exports[e].displayname : '',
730
+ hidden: this.exports[e].hidden !== undefined ? this.exports[e].hidden : false,
731
+ order: this.exports[e].order !== undefined ? this.exports[e].order : 0,
732
+ tooltip: this.exports[e].tooltip !== undefined ? this.exports[e].tooltip : '',
733
+ };
734
+ }
735
+ const responseE = Object.values(properties).length !== 0 ? yield this.saveExportProperties(properties) : true;
736
+ properties = {};
737
+ for (let o in this.outputs) {
738
+ properties[o] = {
739
+ displayname: this.outputs[o].displayname !== undefined ? this.outputs[o].displayname : '',
740
+ hidden: this.outputs[o].hidden !== undefined ? this.outputs[o].hidden : false,
741
+ order: this.outputs[o].order !== undefined ? this.outputs[o].order : 0,
742
+ tooltip: this.outputs[o].tooltip !== undefined ? this.outputs[o].tooltip : '',
743
+ };
744
+ }
745
+ const responseO = Object.values(properties).length !== 0 ? yield this.saveOutputProperties(properties) : true;
746
+ // save partial settings
747
+ const response = saveInSettings ? yield this.saveSettings(this._settingsEngine.convertToTargetVersion()) : true;
748
+ if (response && responseP && responseO && responseE) {
749
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveSessionProperties: Saved session properties.`);
750
+ }
751
+ else {
752
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveSessionProperties: Could not save session properties.`);
753
+ }
754
+ return response && responseP && responseO && responseE;
755
+ }
756
+ catch (e) {
757
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
758
+ throw e;
759
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).saveSessionProperties`, e);
760
+ }
761
+ });
762
+ }
763
+ updateOutputs() {
764
+ return __awaiter(this, void 0, void 0, function* () {
765
+ const eventId = this._uuidGenerator.create();
766
+ const customizationId = this._uuidGenerator.create();
767
+ const eventStart = { type: viewer_shared_types_1.TASK_TYPE.SESSION_OUTPUTS_UPDATE, id: eventId, progress: 0, data: { sessionId: this.id }, status: 'Updating outputs' };
768
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_START, eventStart);
769
+ const oldNode = this.node.cloneInstance();
770
+ __classPrivateFieldSet(this, _SessionEngine_customizationProcess, customizationId, "f");
771
+ this._logger.debugLow(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).updateOutputs: Updating Outputs.`);
772
+ for (let r in this._stateEngine.renderingEngines)
773
+ this._stateEngine.renderingEngines[r].busy.push(customizationId);
774
+ const eventRequest = { type: viewer_shared_types_1.TASK_TYPE.SESSION_OUTPUTS_UPDATE, id: eventId, progress: 0.25, data: { sessionId: this.id }, status: 'Loading outputs' };
775
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_PROCESS, eventRequest);
776
+ const newNode = yield this.loadOutputs(() => __classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId);
777
+ const eventSceneUpdate = { type: viewer_shared_types_1.TASK_TYPE.SESSION_OUTPUTS_UPDATE, id: eventId, progress: 0.75, data: { sessionId: this.id }, status: 'Updating scene' };
778
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_PROCESS, eventSceneUpdate);
779
+ // OPTION TO SKIP - PART 1
780
+ if (__classPrivateFieldGet(this, _SessionEngine_customizationProcess, "f") !== customizationId) {
781
+ for (let r in this._stateEngine.renderingEngines)
782
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
783
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
784
+ const eventCancel1 = { type: viewer_shared_types_1.TASK_TYPE.SESSION_OUTPUTS_UPDATE, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Output updating was exceeded by other customization request' };
785
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_CANCEL, eventCancel1);
786
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).updateOutputs: Output updating was exceeded by other request.`);
787
+ return newNode;
788
+ }
789
+ if (this.automaticSceneUpdate)
790
+ this._sceneTree.removeNode(this.node);
791
+ this._node = newNode;
792
+ if (this.automaticSceneUpdate)
793
+ this._sceneTree.addNode(this.node);
794
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).updateOutputs: Updating outputs finished, updating geometry.`);
795
+ if (this._updateCallback)
796
+ this._updateCallback(newNode, oldNode);
797
+ // set the output content to what has been updated
798
+ for (const outputId in this.outputs) {
799
+ this.outputs[outputId].updateOutput(newNode.children.find(c => c.name === outputId), oldNode.children.find(c => c.name === outputId));
800
+ }
801
+ // set the export definitions
802
+ for (const exportId in this.exports)
803
+ this.exports[exportId].updateExport();
804
+ this._warningCreator();
805
+ this.node.excludeViewports = this.excludeViewports;
806
+ for (let r in this._stateEngine.renderingEngines)
807
+ if (this._stateEngine.renderingEngines[r].busy.includes(customizationId))
808
+ this._stateEngine.renderingEngines[r].busy.splice(this._stateEngine.renderingEngines[r].busy.indexOf(customizationId), 1);
809
+ this._logger.debug(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `Session(${this.id}).updateOutputs: Updated outputs.`);
810
+ const eventEnd = { type: viewer_shared_types_1.TASK_TYPE.SESSION_OUTPUTS_UPDATE, id: eventId, progress: 1, data: { sessionId: this.id }, status: 'Outputs updated' };
811
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.TASK.TASK_END, eventEnd);
812
+ return this.node;
813
+ });
814
+ }
815
+ uploadFile(parameterId, data, type, retry = false) {
816
+ return __awaiter(this, void 0, void 0, function* () {
817
+ this.checkAvailability('file-upload');
818
+ try {
819
+ const responseDto = yield this._sdk.file.requestUpload(this._sessionId, {
820
+ [parameterId]: { size: data.size, format: type }
821
+ });
822
+ if (responseDto && responseDto.asset && responseDto.asset.file && responseDto.asset.file[parameterId]) {
823
+ const fileAsset = responseDto.asset.file[parameterId];
824
+ yield this._sdk.utils.upload(fileAsset.href, yield data.arrayBuffer(), type);
825
+ return fileAsset.id;
826
+ }
827
+ else {
828
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.uploadFile: Upload reply has not the required format.`);
829
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.uploadFile', error);
830
+ }
831
+ }
832
+ catch (e) {
833
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.uploadFile', e, retry);
834
+ return yield this.uploadFile(parameterId, data, type, true);
835
+ }
836
+ });
837
+ }
838
+ uploadGLTF(blob, conversion = sdk_geometry_api_sdk_v2_1.ShapeDiverRequestGltfUploadQueryConversion.NONE, retry = false) {
839
+ return __awaiter(this, void 0, void 0, function* () {
840
+ this.checkAvailability('gltf-upload');
841
+ try {
842
+ const responseDto = yield this._sdk.gltf.upload(this._sessionId, yield blob.arrayBuffer(), 'model/gltf-binary', conversion);
843
+ if (!responseDto || !responseDto.gltf || !responseDto.gltf.href) {
844
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.uploadGLTF: Upload reply has not the required format.`);
845
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.uploadGLTF', error);
846
+ }
847
+ return responseDto.gltf.href;
848
+ }
849
+ catch (e) {
850
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.uploadGLTF', e, retry);
851
+ return yield this.uploadGLTF(blob, conversion, true);
852
+ }
853
+ });
854
+ }
855
+ // #endregion Public Methods (22)
856
+ // #region Private Methods (8)
857
+ _saveSessionSettings() {
858
+ const parameters = this.parameters;
859
+ const exports = this.exports;
860
+ const sessionProperties = {};
861
+ for (let p in parameters) {
862
+ sessionProperties[p] = {
863
+ order: parameters[p].order || 0,
864
+ displayname: parameters[p].displayname || '',
865
+ hidden: parameters[p].hidden
866
+ };
867
+ }
868
+ for (let e in exports) {
869
+ sessionProperties[e] = {
870
+ order: exports[e].order || 0,
871
+ displayname: exports[e].displayname || '',
872
+ hidden: exports[e].hidden
873
+ };
874
+ }
875
+ this._settingsEngine.session = sessionProperties;
876
+ let orderedOutputs = [];
877
+ for (let o in this.outputs)
878
+ orderedOutputs.push(this.outputs[o]);
879
+ orderedOutputs.sort((a, b) => ((a.order || Infinity) - (b.order || Infinity)));
880
+ let zerosOutputs = orderedOutputs.filter(x => x.order === 0);
881
+ orderedOutputs = orderedOutputs.filter((el) => { return !zerosOutputs.includes(el); });
882
+ orderedOutputs = zerosOutputs.concat(orderedOutputs);
883
+ const controlOrderOutputs = orderedOutputs.map((value) => { return value.id; });
884
+ for (let i = 0; i < controlOrderOutputs.length; i++) {
885
+ if (this.outputs[controlOrderOutputs[i]])
886
+ if (this.outputs[controlOrderOutputs[i]].order !== i)
887
+ this.outputs[controlOrderOutputs[i]].order = i;
888
+ }
889
+ }
890
+ _warningCreator() {
891
+ // set the output content to what has been updated
892
+ for (const outputId in this.outputs) {
893
+ let warning = '';
894
+ if (this.outputs[outputId].msg)
895
+ warning += `\n\t- ${this.outputs[outputId].msg}`;
896
+ if (this.outputs[outputId].status_collect && this.outputs[outputId].status_collect !== sdk_geometry_api_sdk_v2_1.ShapeDiverResponseModelComputationStatus.SUCCESS)
897
+ warning += `\n\t- status_collect is ${this.outputs[outputId].status_collect}`;
898
+ if (this.outputs[outputId].status_computation && this.outputs[outputId].status_computation !== sdk_geometry_api_sdk_v2_1.ShapeDiverResponseModelComputationStatus.SUCCESS)
899
+ warning += `\n\t- status_computation is ${this.outputs[outputId].status_computation}`;
900
+ if (warning)
901
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `\nOutput(${outputId}):${warning}`);
902
+ }
903
+ // set the export definitions
904
+ for (const exportId in this.exports) {
905
+ let warning = '';
906
+ if (this.exports[exportId].msg)
907
+ warning += `\n\t- ${this.exports[exportId].msg}`;
908
+ if (this.exports[exportId].status_collect && this.exports[exportId].status_collect !== sdk_geometry_api_sdk_v2_1.ShapeDiverResponseModelComputationStatus.SUCCESS)
909
+ warning += `\n\t- status_collect is ${this.exports[exportId].status_collect}`;
910
+ if (this.exports[exportId].status_computation && this.exports[exportId].status_computation !== sdk_geometry_api_sdk_v2_1.ShapeDiverResponseModelComputationStatus.SUCCESS)
911
+ warning += `\n\t- status_computation is ${this.exports[exportId].status_computation}`;
912
+ if (warning)
913
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, `\nExport(${exportId}):${warning}`);
914
+ }
915
+ }
916
+ checkAvailability(action, checkForModelId = false) {
917
+ var _a;
918
+ if (!this._responseDto) {
919
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: responseDto not available.`);
920
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.checkAvailability', error);
921
+ }
922
+ if (!this._sessionId) {
923
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: sessionId not available.`);
924
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.checkAvailability', error);
925
+ }
926
+ if (checkForModelId && !this._modelId) {
927
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: modelId not available.`);
928
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.checkAvailability', error);
929
+ }
930
+ if (action && !this._responseDto.actions) {
931
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: actions not available.`);
932
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.checkAvailability', error);
933
+ }
934
+ const responseDtoAction = (_a = this._responseDto.actions) === null || _a === void 0 ? void 0 : _a.find(a => a.name === action);
935
+ if (action && !responseDtoAction) {
936
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: action ${action} not available.`);
937
+ throw this._logger.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.checkAvailability', error);
938
+ }
939
+ }
940
+ customizeInternal(cancelRequest) {
941
+ return __awaiter(this, void 0, void 0, function* () {
942
+ return this.customizeSession(this._parameterValues, cancelRequest);
943
+ });
944
+ }
945
+ customizeSession(parameters, cancelRequest, retry = false) {
946
+ return __awaiter(this, void 0, void 0, function* () {
947
+ this.checkAvailability('customize');
948
+ try {
949
+ this._performanceEvaluator.startSection('sessionResponse');
950
+ const responseDto = yield this._sdk.utils.submitAndWaitForCustomization(this._sdk, this._sessionId, parameters);
951
+ this._performanceEvaluator.endSection('sessionResponse');
952
+ if (cancelRequest())
953
+ return new SessionTreeNode_1.SessionTreeNode();
954
+ this.updateResponseDto(responseDto);
955
+ return this.loadOutputs(cancelRequest);
956
+ }
957
+ catch (e) {
958
+ yield this.handleError(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Session.customizeSession', e, retry);
959
+ if (cancelRequest())
960
+ return new SessionTreeNode_1.SessionTreeNode();
961
+ return yield this.customizeSession(parameters, cancelRequest, true);
962
+ }
963
+ });
964
+ }
965
+ handleError(topic, scope, e, retry = false) {
966
+ return __awaiter(this, void 0, void 0, function* () {
967
+ if (e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverResponseError) {
968
+ if (e.error === sdk_geometry_api_sdk_v2_1.ShapeDiverResponseErrorType.SESSION_GONE_ERROR) {
969
+ // case 1: the session is no longer available
970
+ // we try to re-initialize the session 3 times, if that does not work, we close it
971
+ this._logger.warn(topic, `The session has been closed, trying to re-initialize.`);
972
+ if (this._retryCounter < 3) {
973
+ // we retry this 3 times, the `retry` option in the init function is set to true and passed on
974
+ this._retryCounter = retry ? this._retryCounter + 1 : 1;
975
+ try {
976
+ this._initialized = false;
977
+ yield this.init(this.parameterValues, true);
978
+ }
979
+ catch (e) {
980
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
981
+ throw e;
982
+ throw this._logger.handleError(topic, scope, e);
983
+ }
984
+ }
985
+ else {
986
+ // the retries were exceeded, we close the session
987
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Tried to retry the connect multiple times, bearer token still not valid. Closing Session.');
988
+ try {
989
+ yield this._closeOnFailure();
990
+ }
991
+ catch (e) { }
992
+ throw this._logger.handleError(topic, scope, e);
993
+ }
994
+ }
995
+ else if (e.error === sdk_geometry_api_sdk_v2_1.ShapeDiverResponseErrorType.JWT_VALIDATION_ERROR) {
996
+ // if any of the above errors occur, we try to get a new bearer token
997
+ // if we get a new one, we retry 3 times (by requiring new bearer tokens every time)
998
+ if (this._retryCounter < 3) {
999
+ if (this._refreshBearerToken) {
1000
+ this.bearerToken = yield this._refreshBearerToken();
1001
+ this._retryCounter = retry ? this._retryCounter + 1 : 1;
1002
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Re-trying with new bearer token.');
1003
+ }
1004
+ else {
1005
+ // no bearer tokens are supplied, we close the session
1006
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'No retry possible, no new bearer token was supplied. Closing Session.');
1007
+ try {
1008
+ yield this._closeOnFailure();
1009
+ }
1010
+ catch (e) { }
1011
+ throw this._logger.handleError(topic, scope, e);
1012
+ }
1013
+ }
1014
+ else {
1015
+ // the retries were exceeded, we close the session
1016
+ this._logger.warn(viewer_shared_services_1.LOGGING_TOPIC.SESSION, 'Tried to retry the connect multiple times, bearer token still not valid. Closing Session.');
1017
+ try {
1018
+ yield this._closeOnFailure();
1019
+ }
1020
+ catch (e) { }
1021
+ throw this._logger.handleError(topic, scope, e);
1022
+ }
1023
+ }
1024
+ else {
1025
+ throw this._logger.handleError(topic, scope, e);
1026
+ }
1027
+ }
1028
+ else {
1029
+ throw this._logger.handleError(topic, scope, e);
1030
+ }
1031
+ });
1032
+ }
1033
+ /**
1034
+ * Returns a promise that resolves after the amount of milliseconds provided.
1035
+ *
1036
+ * @param ms the milliseconds
1037
+ * @returns promise that resolve after specified milliseconds
1038
+ */
1039
+ timeout(ms) {
1040
+ return __awaiter(this, void 0, void 0, function* () {
1041
+ return new Promise(resolve => setTimeout(resolve, ms));
1042
+ });
1043
+ }
1044
+ updateResponseDto(responseDto, initialParameters) {
1045
+ if (!this._responseDto) {
1046
+ this._responseDto = responseDto;
1047
+ return;
1048
+ }
1049
+ // convert parameters
1050
+ if (responseDto.parameters) {
1051
+ for (let parameterId in responseDto.parameters) {
1052
+ this._responseDto.parameters = this._responseDto.parameters || {};
1053
+ this._responseDto.parameters[parameterId] = this._responseDto.parameters[parameterId] || responseDto.parameters[parameterId];
1054
+ }
1055
+ }
1056
+ // convert outputs
1057
+ if (responseDto.outputs) {
1058
+ for (let outputId in responseDto.outputs) {
1059
+ this._responseDto.outputs = this._responseDto.outputs || {};
1060
+ if ('version' in responseDto.outputs[outputId] || !(this._responseDto.outputs[outputId] && 'version' in this._responseDto.outputs[outputId]))
1061
+ this._responseDto.outputs[outputId] = responseDto.outputs[outputId];
1062
+ }
1063
+ }
1064
+ // convert exports
1065
+ if (responseDto.exports) {
1066
+ for (let exportId in responseDto.exports) {
1067
+ this._responseDto.exports = this._responseDto.exports || {};
1068
+ if ('version' in responseDto.exports[exportId] || !(this._responseDto.exports[exportId] && 'version' in this._responseDto.exports[exportId]))
1069
+ this._responseDto.exports[exportId] = responseDto.exports[exportId];
1070
+ }
1071
+ }
1072
+ const parameterSet = {};
1073
+ for (let parameterId in this._responseDto.parameters) {
1074
+ if (this.parameters[parameterId])
1075
+ continue;
1076
+ this._responseDto.parameters[parameterId].id = parameterId;
1077
+ switch (true) {
1078
+ case this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.BOOL:
1079
+ this.parameters[parameterId] = new Parameter_1.Parameter(this._responseDto.parameters[parameterId], this);
1080
+ break;
1081
+ case this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.COLOR:
1082
+ this.parameters[parameterId] = new Parameter_1.Parameter(this._responseDto.parameters[parameterId], this);
1083
+ break;
1084
+ case this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.FILE:
1085
+ this.parameters[parameterId] = new FileParameter_1.FileParameter(this._responseDto.parameters[parameterId], this);
1086
+ break;
1087
+ case this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.EVEN || this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.FLOAT || this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.INT || this._responseDto.parameters[parameterId].type === ISessionEngine_1.PARAMETER_TYPE.ODD:
1088
+ this.parameters[parameterId] = new Parameter_1.Parameter(this._responseDto.parameters[parameterId], this);
1089
+ break;
1090
+ default:
1091
+ this.parameters[parameterId] = new Parameter_1.Parameter(this._responseDto.parameters[parameterId], this);
1092
+ break;
1093
+ }
1094
+ if (initialParameters && initialParameters[parameterId] !== undefined)
1095
+ this.parameters[parameterId].value = initialParameters[parameterId];
1096
+ parameterSet[parameterId] = {
1097
+ value: this.parameters[parameterId].value,
1098
+ valueString: this.parameters[parameterId].stringify()
1099
+ };
1100
+ if (!this.initialized)
1101
+ this.parameterValues[parameterId] = parameterSet[parameterId].valueString;
1102
+ }
1103
+ // store the initialization as the first parameter set in the history
1104
+ if (!this.initialized)
1105
+ __classPrivateFieldGet(this, _SessionEngine_parameterHistory, "f").push(parameterSet);
1106
+ for (let exportId in this._responseDto.exports) {
1107
+ if (this._responseDto.exports[exportId].type === sdk_geometry_api_sdk_v2_1.ShapeDiverResponseExportDefinitionType.EMAIL || this._responseDto.exports[exportId].type === sdk_geometry_api_sdk_v2_1.ShapeDiverResponseExportDefinitionType.DOWNLOAD) {
1108
+ if (!this.exports[exportId]) {
1109
+ this._responseDto.exports[exportId].id = exportId;
1110
+ this.exports[exportId] = new Export_1.Export(this._responseDto.exports[exportId], this);
1111
+ }
1112
+ else {
1113
+ this.exports[exportId].updateExportDefinition(this._responseDto.exports[exportId]);
1114
+ }
1115
+ }
1116
+ }
1117
+ for (let outputId in this._responseDto.outputs) {
1118
+ if (!this.outputs[outputId]) {
1119
+ this._responseDto.outputs[outputId].id = outputId;
1120
+ if (this.outputsFreeze[outputId] === undefined)
1121
+ this.outputsFreeze[outputId] = false;
1122
+ this.outputs[outputId] = new Output_1.Output(this._responseDto.outputs[outputId], this);
1123
+ }
1124
+ else {
1125
+ this.outputs[outputId].updateOutputDefinition(this._responseDto.outputs[outputId]);
1126
+ }
1127
+ }
1128
+ }
1129
+ }
1130
+ exports.SessionEngine = SessionEngine;
1131
+ _SessionEngine_customizationProcess = new WeakMap(), _SessionEngine_parameterHistory = new WeakMap(), _SessionEngine_parameterHistoryCall = new WeakMap(), _SessionEngine_parameterHistoryForward = new WeakMap();
1132
+ //# sourceMappingURL=SessionEngine.js.map