@shapediver/viewer.session-engine.session-engine 1.9.0 → 1.10.6

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.
@@ -12,19 +12,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.Session = void 0;
13
13
  const tsyringe_1 = require("tsyringe");
14
14
  const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
15
- const api_geometry_api_dto_v1_1 = require("@shapediver/api.geometry-api-dto-v1");
16
15
  const OutputDelayException_1 = require("./OutputDelayException");
17
16
  const OutputLoader_1 = require("./OutputLoader");
18
17
  const SessionTreeNode_1 = require("./SessionTreeNode");
19
18
  const SessionData_1 = require("./SessionData");
19
+ const sdk_geometry_api_sdk_v2_1 = require("@shapediver/sdk.geometry-api-sdk-v2");
20
20
  class Session {
21
21
  constructor(properties) {
22
22
  this._exports = {};
23
23
  this._httpClient = tsyringe_1.container.resolve(viewer_shared_services_1.HttpClient);
24
24
  this._logger = tsyringe_1.container.resolve(viewer_shared_services_1.Logger);
25
25
  this._outputs = {};
26
- this._parameters = {};
27
26
  this._parameterValues = {};
27
+ this._parameters = {};
28
28
  this._performanceEvaluator = tsyringe_1.container.resolve(viewer_shared_services_1.PerformanceEvaluator);
29
29
  this._sessionEngineId = tsyringe_1.container.resolve(viewer_shared_services_1.UuidGenerator).create();
30
30
  this._closed = false;
@@ -35,7 +35,6 @@ class Session {
35
35
  "X-ShapeDiver-BuildDate": ''
36
36
  };
37
37
  this._initialized = false;
38
- this._settingsConfig = {};
39
38
  this._id = properties.id;
40
39
  this._ticket = properties.ticket;
41
40
  this._modelViewUrl = properties.modelViewUrl;
@@ -43,12 +42,8 @@ class Session {
43
42
  this._headers['X-ShapeDiver-BuildDate'] = properties.buildDate;
44
43
  this._headers['X-ShapeDiver-BuildVersion'] = properties.buildVersion;
45
44
  this._outputLoader = new OutputLoader_1.OutputLoader();
46
- }
47
- get authorTicket() {
48
- return this._authorTicket;
49
- }
50
- set authorTicket(value) {
51
- this._authorTicket = value;
45
+ this._sdk = sdk_geometry_api_sdk_v2_1.create(this._modelViewUrl, this._bearerToken);
46
+ this._sdk.setConfigurationValue(sdk_geometry_api_sdk_v2_1.ShapeDiverSdkConfigType.REQUEST_HEADERS, this._headers);
52
47
  }
53
48
  get bearerToken() {
54
49
  return this._bearerToken;
@@ -56,6 +51,15 @@ class Session {
56
51
  set bearerToken(value) {
57
52
  this._bearerToken = value;
58
53
  }
54
+ get canUploadGLTF() {
55
+ try {
56
+ this.checkAvailability('gltf-upload');
57
+ return true;
58
+ }
59
+ catch (e) {
60
+ return false;
61
+ }
62
+ }
59
63
  get exports() {
60
64
  return this._exports;
61
65
  }
@@ -71,43 +75,54 @@ class Session {
71
75
  get outputs() {
72
76
  return this._outputs;
73
77
  }
74
- get parameters() {
75
- return this._parameters;
76
- }
77
78
  get parameterValues() {
78
79
  return this._parameterValues;
79
80
  }
81
+ get parameters() {
82
+ return this._parameters;
83
+ }
80
84
  set refreshBearerToken(value) {
81
85
  this._refreshBearerToken = value;
82
86
  }
83
- get sessionResponse() {
84
- return this._sessionResponse;
85
- }
86
- get settingsConfig() {
87
- return this._settingsConfig;
88
- }
89
87
  get ticket() {
90
88
  return this._ticket;
91
89
  }
92
- close() {
93
- var _a, _b;
90
+ get viewerSettings() {
91
+ return this._viewerSettings;
92
+ }
93
+ handleError(topic, scope, e) {
94
94
  return __awaiter(this, void 0, void 0, function* () {
95
- this._closed = true;
96
- if (this._initialized) {
95
+ if (e.status && e.status === 410) {
96
+ this._logger.warn(topic, `The session has been closed, trying to initialize.`);
97
97
  try {
98
- yield this.sessionCommunication((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'close')[0].href, (_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'close')[0].method, null, 'application/json');
98
+ this._initialized = false;
99
+ yield this.init(this.parameterValues);
99
100
  }
100
101
  catch (e) {
101
- if (e.response && e.response.status) {
102
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.close: Session closing failed.`, e.response.status, false);
103
- }
104
- else {
105
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.close: Session closing failed.`, false);
106
- }
107
- return false;
102
+ if (e instanceof viewer_shared_services_1.ShapeDiverViewerError || e instanceof sdk_geometry_api_sdk_v2_1.ShapeDiverError)
103
+ throw e;
104
+ throw this._logger.handleError(topic, scope, e);
108
105
  }
109
106
  }
110
- return true;
107
+ else if (e.status && e.status === 403) {
108
+ throw this._logger.handleError(topic, scope, e);
109
+ }
110
+ else {
111
+ throw this._logger.handleError(topic, scope, e);
112
+ }
113
+ });
114
+ }
115
+ close() {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ this.checkAvailability('close');
118
+ try {
119
+ yield this._sdk.session.close(this._sessionId);
120
+ this._closed = true;
121
+ return true;
122
+ }
123
+ catch (e) {
124
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.close', e);
125
+ }
111
126
  });
112
127
  }
113
128
  customize(cancelRequest) {
@@ -119,313 +134,225 @@ class Session {
119
134
  var _a, _b;
120
135
  return __awaiter(this, void 0, void 0, function* () {
121
136
  if (this._initialized === true) {
122
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.init: Session already initialized.'));
123
- return;
137
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError('Session.init: Session already initialized.');
138
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.init', error);
124
139
  }
125
140
  try {
126
- let sessionResponse;
127
- try {
128
- this._performanceEvaluator.startSection('sessionResponse');
129
- sessionResponse = (yield this.sessionCommunication(this._modelViewUrl + "/ticket/" + this._ticket, 'post', parameterValues || null)).data;
130
- this._performanceEvaluator.endSection('sessionResponse');
131
- }
132
- catch (e) {
133
- if (e.response && e.response.status) {
134
- throw this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.init: Session init failed.`, e.response.status, true);
135
- }
136
- else {
137
- throw this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.init: Session init failed.`, true, false);
138
- }
139
- }
140
- this._settingsConfig = sessionResponse.config;
141
- this._parameters = {};
142
- this._outputs = {};
143
- this._exports = {};
144
- this._sessionResponse = this.mergeResponses(sessionResponse, sessionResponse, this._parameters, this._outputs, this._exports);
145
- this._authorTicket = !!(((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'defaultparam')[0]) && ((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'configure')[0]));
141
+ this._performanceEvaluator.startSection('sessionResponse');
142
+ this._responseDto = yield this._sdk.session.init(this._ticket);
143
+ this._performanceEvaluator.endSection('sessionResponse');
144
+ this._viewerSettings = (_a = this._responseDto.viewer) === null || _a === void 0 ? void 0 : _a.config;
145
+ this._sessionId = this._responseDto.sessionId;
146
+ this._modelId = (_b = this._responseDto.model) === null || _b === void 0 ? void 0 : _b.id;
147
+ if (!this._sessionId)
148
+ throw new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.init: Initialization of session failed. ResponseDto did not have a sessionId.`);
149
+ if (!this._modelId)
150
+ throw new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.init: Initialization of session failed. ResponseDto did not have a model.id.`);
151
+ this.updateResponseDto(this._responseDto);
146
152
  this._initialized = true;
153
+ if (parameterValues) {
154
+ const responseDto = yield this._sdk.utils.submitAndWaitForCustomization(this._sdk, this._sessionId, parameterValues);
155
+ this.updateResponseDto(responseDto);
156
+ }
147
157
  }
148
158
  catch (e) {
149
- throw this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, 'Session.init: Something went wrong at session init.', true);
159
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.init', e);
150
160
  }
151
161
  });
152
162
  }
153
- mergeResponses(r1, r2, parameters, outputs, exports) {
154
- if (!r1)
155
- r1 = { version: r2.version };
156
- if (r2.version)
157
- r1.version = r2.version;
158
- if (r2.collection)
159
- r1.collection = r2.collection;
160
- if (r2.actions) {
161
- for (let i = 0, len = r2.actions.length; i < len; i++) {
162
- r1.actions = r1.actions || [];
163
- if (r1.actions.findIndex((value) => value.name === r2.actions[i].name) === -1)
164
- r1.actions.push(r2.actions[i]);
165
- }
166
- }
167
- if (r2.templates) {
168
- for (let i = 0, len = r2.templates.length; i < len; i++) {
169
- r1.templates = r1.templates || [];
170
- if (r1.templates.findIndex((value) => value.name === r2.actions[i].name) === -1)
171
- r1.templates.push(r2.templates[i]);
172
- }
173
- }
174
- if (r2.config && !r1.config)
175
- r1.config = r2.config;
176
- if (r2.name && !r1.name)
177
- r1.name = r2.name;
178
- if (r2.parameters) {
179
- for (let parameterId in r2.parameters) {
180
- r1.parameters = r1.parameters || {};
181
- r1.parameters[parameterId] = r1.parameters[parameterId] || r2.parameters[parameterId];
182
- }
183
- }
184
- if (r2.outputs) {
185
- for (let outputId in r2.outputs) {
186
- r1.outputs = r1.outputs || {};
187
- if ('version' in r2.outputs[outputId] || !(r1.outputs[outputId] && 'version' in r1.outputs[outputId]))
188
- r1.outputs[outputId] = r2.outputs[outputId];
189
- }
190
- }
191
- if (r2.exports) {
192
- for (let exportId in r2.exports) {
193
- r1.exports = r1.exports || {};
194
- if ('version' in r2.exports[exportId] || !(r1.exports[exportId] && 'version' in r1.exports[exportId]))
195
- r1.exports[exportId] = r2.exports[exportId];
196
- }
197
- }
198
- if (parameters) {
199
- for (let parameterId in r1.parameters) {
200
- if (parameters[parameterId])
201
- continue;
202
- parameters[parameterId] = r1.parameters[parameterId];
203
- parameters[parameterId].id = parameterId;
204
- }
205
- }
206
- if (exports) {
207
- for (let exportId in r1.exports)
208
- if (r1.exports[exportId].type === api_geometry_api_dto_v1_1.ShapeDiverResponseExportDefinitionType.EMAIL || r1.exports[exportId].type === api_geometry_api_dto_v1_1.ShapeDiverResponseExportDefinitionType.DOWNLOAD) {
209
- exports[exportId] = r1.exports[exportId];
210
- exports[exportId].id = exportId;
211
- }
212
- }
213
- if (outputs) {
214
- for (let outputId in r1.outputs) {
215
- outputs[outputId] = r1.outputs[outputId];
216
- outputs[outputId].id = outputId;
217
- }
218
- }
219
- return r1;
220
- }
221
- saveDefaultParameters() {
222
- var _a, _b, _c;
163
+ loadOutputs(cancelRequest = () => false) {
223
164
  return __awaiter(this, void 0, void 0, function* () {
224
- if (!((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'defaultparam')[0])) {
225
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.saveDefaultParameters: Session has to be in edit mode to be able to save the settings.'));
226
- return false;
227
- }
165
+ this.checkAvailability();
166
+ const o = Object.assign({}, this._outputs);
228
167
  try {
229
- yield this.sessionCommunication((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'defaultparam')[0].href, (_c = this._sessionResponse.actions) === null || _c === void 0 ? void 0 : _c.filter(v => v.name === 'defaultparam')[0].method, this._parameterValues, 'application/json');
230
- return true;
168
+ const node = yield this._outputLoader.loadOutputs(this._responseDto, o);
169
+ node.data.push(new SessionData_1.SessionData(this._responseDto));
170
+ return node;
231
171
  }
232
172
  catch (e) {
233
- if (e.response && e.response.status) {
234
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveDefaultParameters: Saving of default parameters failed.`, e.response.status, false);
173
+ if (e instanceof OutputDelayException_1.OutputDelayException) {
174
+ yield this.timeout(e.delay);
235
175
  }
236
176
  else {
237
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveDefaultParameters: Saving of default parameters failed.`, false);
177
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.loadOutputs', e);
178
+ }
179
+ if (cancelRequest())
180
+ return new SessionTreeNode_1.SessionTreeNode();
181
+ let outputMapping = {};
182
+ for (let output in o)
183
+ outputMapping[output] = o[output].version;
184
+ try {
185
+ const responseDto = yield this._sdk.output.getCache(this._sessionId, outputMapping);
186
+ if (cancelRequest())
187
+ return new SessionTreeNode_1.SessionTreeNode();
188
+ this.updateResponseDto(responseDto);
189
+ return yield this.loadOutputs(cancelRequest);
190
+ }
191
+ catch (e) {
192
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.loadOutputs', e);
238
193
  }
239
- return false;
240
194
  }
241
195
  });
242
196
  }
243
- saveParameterProperties(parameters) {
244
- var _a, _b, _c;
197
+ requestExport(exportId, parameters) {
245
198
  return __awaiter(this, void 0, void 0, function* () {
246
- if (!((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'parameter-definition')[0])) {
247
- this._logger.warn(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveParameterProperties: Session does not have the required action.');
248
- return false;
199
+ this.checkAvailability('export');
200
+ try {
201
+ const responseDto = yield this._sdk.utils.submitAndWaitForExport(this._sdk, this._sessionId, { exports: { id: exportId }, parameters });
202
+ this.updateResponseDto(responseDto);
203
+ return this.exports[exportId];
204
+ }
205
+ catch (e) {
206
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.requestExport', e);
249
207
  }
208
+ });
209
+ }
210
+ saveDefaultParameters() {
211
+ return __awaiter(this, void 0, void 0, function* () {
212
+ this.checkAvailability('defaultparam', true);
250
213
  try {
251
- yield this.sessionCommunication((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'parameter-definition')[0].href, (_c = this._sessionResponse.actions) === null || _c === void 0 ? void 0 : _c.filter(v => v.name === 'parameter-definition')[0].method, parameters, 'application/json');
214
+ yield this._sdk.model.setDefaultParams(this._modelId, this._parameterValues);
252
215
  return true;
253
216
  }
254
217
  catch (e) {
255
- if (e.response && e.response.status) {
256
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveParameterProperties: Saving of parameter properties failed.`, e.response.status, false);
257
- }
258
- else {
259
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveParameterProperties: Saving of parameter properties failed.`, false);
260
- }
261
- return false;
218
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveDefaultParameters', e);
262
219
  }
263
220
  });
264
221
  }
265
222
  saveExportProperties(exports) {
266
- var _a, _b, _c;
267
223
  return __awaiter(this, void 0, void 0, function* () {
268
- if (!((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'export-definition')[0])) {
269
- this._logger.warn(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveExportProperties: Session does not have the required action.');
270
- return false;
271
- }
224
+ this.checkAvailability('export-definition', true);
272
225
  try {
273
- yield this.sessionCommunication((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'export-definition')[0].href, (_c = this._sessionResponse.actions) === null || _c === void 0 ? void 0 : _c.filter(v => v.name === 'export-definition')[0].method, exports, 'application/json');
226
+ yield this._sdk.export.updateDefinitions(this._modelId, exports);
274
227
  return true;
275
228
  }
276
229
  catch (e) {
277
- if (e.response && e.response.status) {
278
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveExportProperties: Saving of export properties failed.`, e.response.status, false);
279
- }
280
- else {
281
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveExportProperties: Saving of export properties failed.`, false);
282
- }
283
- return false;
230
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveExportProperties', e);
284
231
  }
285
232
  });
286
233
  }
287
234
  saveOutputProperties(outputs) {
288
- var _a, _b, _c;
289
235
  return __awaiter(this, void 0, void 0, function* () {
290
- if (!((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'output-definition')[0])) {
291
- this._logger.warn(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveOutputProperties: Session does not have the required action.');
292
- return false;
293
- }
236
+ this.checkAvailability('output-definition', true);
294
237
  try {
295
- yield this.sessionCommunication((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'output-definition')[0].href, (_c = this._sessionResponse.actions) === null || _c === void 0 ? void 0 : _c.filter(v => v.name === 'output-definition')[0].method, outputs, 'application/json');
238
+ yield this._sdk.output.updateDefinitions(this._modelId, outputs);
296
239
  return true;
297
240
  }
298
241
  catch (e) {
299
- if (e.response && e.response.status) {
300
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveOutputProperties: Saving of output properties failed.`, e.response.status, false);
301
- }
302
- else {
303
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveOutputProperties: Saving of output properties failed.`, false);
304
- }
305
- return false;
242
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveOutputProperties', e);
306
243
  }
307
244
  });
308
245
  }
309
- saveSettings(json) {
310
- var _a, _b, _c;
246
+ saveParameterProperties(parameters) {
311
247
  return __awaiter(this, void 0, void 0, function* () {
312
- if (!((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'configure')[0])) {
313
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.saveSettings: Session has to be in edit mode to be able to save the settings.'));
314
- return false;
315
- }
248
+ this.checkAvailability('parameter-definition', true);
316
249
  try {
317
- yield this.sessionCommunication((_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'configure')[0].href, (_c = this._sessionResponse.actions) === null || _c === void 0 ? void 0 : _c.filter(v => v.name === 'configure')[0].method, json, 'application/json');
250
+ yield this._sdk.model.updateParameterDefinitions(this._modelId, parameters);
318
251
  return true;
319
252
  }
320
253
  catch (e) {
321
- if (e.response && e.response.status) {
322
- this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveSettings: Saving of settings failed.`, e.response.status, false);
323
- }
324
- else {
325
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.saveSettings: Saving of settings failed.`, false);
326
- }
327
- return false;
254
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveParameterProperties', e);
328
255
  }
329
256
  });
330
257
  }
331
- sessionCommunication(href, method, data, contentType) {
258
+ saveSettings(json) {
332
259
  return __awaiter(this, void 0, void 0, function* () {
333
- let headers = this._bearerToken ? Object.assign({ "Authorization": this._bearerToken }, this._headers) : this._headers;
334
- if (contentType)
335
- headers = Object.assign({ "Content-Type": contentType }, this._headers);
336
- method = method.toLowerCase();
337
- if (method !== 'post' && method !== 'get' && method !== 'patch')
338
- throw this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session: Method ' + method + ' not recognized.'));
260
+ this.checkAvailability('configure', true);
339
261
  try {
340
- return yield this._httpClient[method](href, { data, headers });
262
+ yield this._sdk.model.updateConfig(this._modelId, json);
263
+ return true;
341
264
  }
342
265
  catch (e) {
343
- if (e.response && e.response.status && e.response.status === 403 && e.response.data && (e.response.data.error === 'SdJwtValidationError' || e.response.data.error === 'SdErrorUnauthorized')) {
344
- if (!this._refreshBearerToken) {
345
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.sessionCommunication: Session request failed. Bearer Token invalid, please try to supply a valid token or assign the "refreshBearerToken" callback.'));
346
- throw e;
347
- }
348
- else {
349
- const bearerToken = this.bearerToken;
350
- const newToken = this._refreshBearerToken();
351
- if (bearerToken === newToken) {
352
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.sessionCommunication: Session request failed. Bearer Token invalid, callback "refreshBearerToken" supplied the same token.'));
353
- throw e;
354
- }
355
- else {
356
- this.bearerToken = newToken;
357
- return this.sessionCommunication(href, method, data, contentType);
358
- }
359
- }
360
- }
361
- throw e;
266
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.saveSettings', e);
362
267
  }
363
268
  });
364
269
  }
365
- customizeSession(parameters, cancelRequest) {
366
- var _a;
270
+ uploadFile(parameterId, data, type) {
367
271
  return __awaiter(this, void 0, void 0, function* () {
368
- if (this._initialized === false) {
369
- this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, new viewer_shared_services_1.SDError('Session.customizeSession: Session not initialized.'));
370
- return new SessionTreeNode_1.SessionTreeNode();
371
- }
272
+ this.checkAvailability('upload');
372
273
  try {
373
- let responseCustomize;
374
- try {
375
- this._performanceEvaluator.startSection('sessionResponse');
376
- responseCustomize = (yield this.sessionCommunication((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'customize')[0].href, 'post', parameters, 'application/json')).data;
377
- this._performanceEvaluator.endSection('sessionResponse');
378
- if (cancelRequest())
379
- return new SessionTreeNode_1.SessionTreeNode();
274
+ const responseDto = yield this._sdk.file.requestUpload(this._sessionId, {
275
+ [parameterId]: { size: data.size, format: type }
276
+ });
277
+ if (responseDto && responseDto.asset && responseDto.asset.file && responseDto.asset.file[parameterId]) {
278
+ const fileAsset = responseDto.asset.file[parameterId];
279
+ yield this._sdk.utils.upload(fileAsset.href, yield data.arrayBuffer(), type);
280
+ return fileAsset.id;
380
281
  }
381
- catch (e) {
382
- if (e.response && e.response.status) {
383
- if (e.response && e.response.status && e.response.status === 410 && !this._closed) {
384
- this._logger.info(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.customizeSession: Session customization failed. Session expired. Re-initializing session.');
385
- this._initialized = false;
386
- yield this.init(parameters);
387
- if (cancelRequest())
388
- return new SessionTreeNode_1.SessionTreeNode();
389
- return this.loadOutputs(parameters, cancelRequest);
390
- }
391
- }
392
- if (e.response && e.response.status) {
393
- throw this._logger.httpError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.customizeSession: Session customization failed.`, e.response.status, true);
394
- }
395
- else {
396
- throw this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, `Session.customizeSession: Session customization failed.`, true, false);
397
- }
282
+ else {
283
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.uploadFile: Upload reply has not the required format.`);
284
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.uploadFile', error);
398
285
  }
399
- this._sessionResponse = this.mergeResponses(this._sessionResponse, responseCustomize, this._parameters, this._outputs, this._exports);
400
- return this.loadOutputs(parameters, cancelRequest);
401
286
  }
402
287
  catch (e) {
403
- throw this._logger.error(viewer_shared_services_1.LOGGINGTOPIC.SESSION, e, 'Session.customizeSession: Something went wrong at session customization.', true);
288
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.uploadFile', e);
404
289
  }
405
290
  });
406
291
  }
407
- loadOutputs(parameters, cancelRequest = () => false) {
408
- var _a, _b;
292
+ uploadGLTF(blob, conversion = sdk_geometry_api_sdk_v2_1.ShapeDiverRequestGltfUploadQueryConversion.NONE) {
409
293
  return __awaiter(this, void 0, void 0, function* () {
410
- const o = Object.assign({}, this._outputs);
294
+ this.checkAvailability('gltf-upload');
411
295
  try {
412
- const node = yield this._outputLoader.loadOutputs(this._sessionResponse, o);
413
- node.data.push(new SessionData_1.SessionData(this._sessionResponse));
414
- return node;
296
+ const responseDto = yield this._sdk.gltf.upload(this._sessionId, yield blob.arrayBuffer(), 'model/gltf-binary', conversion);
297
+ if (!responseDto || !responseDto.gltf || !responseDto.gltf.href) {
298
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.uploadGLTF: Upload reply has not the required format.`);
299
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.uploadGLTF', error);
300
+ }
301
+ return responseDto.gltf.href;
415
302
  }
416
303
  catch (e) {
417
- if (e instanceof OutputDelayException_1.OutputDelayException)
418
- yield this.timeout(e.delay);
419
- if (cancelRequest())
420
- return new SessionTreeNode_1.SessionTreeNode();
421
- let outputMapping = {};
422
- for (let output in o)
423
- outputMapping[output] = o[output].version;
424
- let responseCache = (yield this.sessionCommunication((_a = this._sessionResponse.actions) === null || _a === void 0 ? void 0 : _a.filter(v => v.name === 'cache')[0].href, (_b = this._sessionResponse.actions) === null || _b === void 0 ? void 0 : _b.filter(v => v.name === 'cache')[0].method.toLowerCase(), outputMapping, 'application/json')).data;
304
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.uploadGLTF', e);
305
+ }
306
+ });
307
+ }
308
+ checkAvailability(action, checkForModelId = false) {
309
+ var _a;
310
+ if (!this._responseDto) {
311
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: responseDto not available.`);
312
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.checkAvailability', error);
313
+ }
314
+ if (!this._sessionId) {
315
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: sessionId not available.`);
316
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.checkAvailability', error);
317
+ }
318
+ if (checkForModelId && !this._modelId) {
319
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: modelId not available.`);
320
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.checkAvailability', error);
321
+ }
322
+ if (action && !this._responseDto.actions) {
323
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: actions not available.`);
324
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.checkAvailability', error);
325
+ }
326
+ const responseDtoAction = (_a = this._responseDto.actions) === null || _a === void 0 ? void 0 : _a.find(a => a.name === action);
327
+ if (action && !responseDtoAction) {
328
+ const error = new viewer_shared_services_1.ShapeDiverViewerSessionError(`Session.checkAvailability: action ${action} not available.`);
329
+ throw this._logger.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.checkAvailability', error);
330
+ }
331
+ }
332
+ customizeSession(parameters, cancelRequest) {
333
+ return __awaiter(this, void 0, void 0, function* () {
334
+ this.checkAvailability('customize');
335
+ try {
336
+ this._performanceEvaluator.startSection('sessionResponse');
337
+ const responseDto = yield this._sdk.utils.submitAndWaitForCustomization(this._sdk, this._sessionId, parameters);
338
+ this._performanceEvaluator.endSection('sessionResponse');
425
339
  if (cancelRequest())
426
340
  return new SessionTreeNode_1.SessionTreeNode();
427
- this._sessionResponse = this.mergeResponses(this._sessionResponse, responseCache, this._parameters, this._outputs, this._exports);
428
- return yield this.loadOutputs(parameters, cancelRequest);
341
+ this.updateResponseDto(responseDto);
342
+ return this.loadOutputs(cancelRequest);
343
+ }
344
+ catch (e) {
345
+ if (e.response && e.response.status) {
346
+ if (e.response && e.response.status && e.response.status === 410 && !this._closed) {
347
+ this._logger.info(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.customizeSession: Session customization failed. Session expired. Re-initializing session.');
348
+ this._initialized = false;
349
+ yield this.init(parameters);
350
+ if (cancelRequest())
351
+ return new SessionTreeNode_1.SessionTreeNode();
352
+ return this.loadOutputs(cancelRequest);
353
+ }
354
+ }
355
+ throw yield this.handleError(viewer_shared_services_1.LOGGINGTOPIC.SESSION, 'Session.customizeSession', e);
429
356
  }
430
357
  });
431
358
  }
@@ -434,6 +361,47 @@ class Session {
434
361
  return new Promise(resolve => setTimeout(resolve, ms));
435
362
  });
436
363
  }
364
+ updateResponseDto(responseDto) {
365
+ if (!this._responseDto) {
366
+ this._responseDto = responseDto;
367
+ return;
368
+ }
369
+ if (responseDto.parameters) {
370
+ for (let parameterId in responseDto.parameters) {
371
+ this._responseDto.parameters = this._responseDto.parameters || {};
372
+ this._responseDto.parameters[parameterId] = this._responseDto.parameters[parameterId] || responseDto.parameters[parameterId];
373
+ }
374
+ }
375
+ if (responseDto.outputs) {
376
+ for (let outputId in responseDto.outputs) {
377
+ this._responseDto.outputs = this._responseDto.outputs || {};
378
+ if ('version' in responseDto.outputs[outputId] || !(this._responseDto.outputs[outputId] && 'version' in this._responseDto.outputs[outputId]))
379
+ this._responseDto.outputs[outputId] = responseDto.outputs[outputId];
380
+ }
381
+ }
382
+ if (responseDto.exports) {
383
+ for (let exportId in responseDto.exports) {
384
+ this._responseDto.exports = this._responseDto.exports || {};
385
+ if ('version' in responseDto.exports[exportId] || !(this._responseDto.exports[exportId] && 'version' in this._responseDto.exports[exportId]))
386
+ this._responseDto.exports[exportId] = responseDto.exports[exportId];
387
+ }
388
+ }
389
+ for (let parameterId in this._responseDto.parameters) {
390
+ if (this.parameters[parameterId])
391
+ continue;
392
+ this.parameters[parameterId] = this._responseDto.parameters[parameterId];
393
+ this.parameters[parameterId].id = parameterId;
394
+ }
395
+ for (let exportId in this._responseDto.exports)
396
+ 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) {
397
+ this.exports[exportId] = this._responseDto.exports[exportId];
398
+ this.exports[exportId].id = exportId;
399
+ }
400
+ for (let outputId in this._responseDto.outputs) {
401
+ this.outputs[outputId] = this._responseDto.outputs[outputId];
402
+ this.outputs[outputId].id = outputId;
403
+ }
404
+ }
437
405
  }
438
406
  exports.Session = Session;
439
407
  //# sourceMappingURL=Session.js.map