@emilgroup/action-sdk 1.8.1-beta.1 → 1.8.1-beta.13

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.
@@ -250,7 +250,7 @@ export declare class ExecutionsApi extends BaseAPI {
250
250
  * @throws {RequiredError}
251
251
  * @memberof ExecutionsApi
252
252
  */
253
- getActionExecutionStatus(requestParameters?: ExecutionsApiGetActionExecutionStatusRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<GetActionExecutionStatusResponseClass, any, {}>>;
253
+ getActionExecutionStatus(requestParameters?: ExecutionsApiGetActionExecutionStatusRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<GetActionExecutionStatusResponseClass, any, {}, any>>;
254
254
  /**
255
255
  * Lists action executions (latest status per execution only) with optional filters **Required Permissions** \"action-management.actions.view\"
256
256
  * @summary List actionExecutions
@@ -259,7 +259,7 @@ export declare class ExecutionsApi extends BaseAPI {
259
259
  * @throws {RequiredError}
260
260
  * @memberof ExecutionsApi
261
261
  */
262
- listActionExecutions(requestParameters?: ExecutionsApiListActionExecutionsRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<ListActionExecutionsResponseClass, any, {}>>;
262
+ listActionExecutions(requestParameters?: ExecutionsApiListActionExecutionsRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<ListActionExecutionsResponseClass, any, {}, any>>;
263
263
  /**
264
264
  * Triggers an action execution. When the action has an input_validation_schema, the input payload is validated against it; invalid payloads return HTTP 400 with a body containing message and errors (JSON Schema validation errors). **Required Permissions** \"action-management.actions.run\"
265
265
  * @summary Create the actionExecution
@@ -268,5 +268,5 @@ export declare class ExecutionsApi extends BaseAPI {
268
268
  * @throws {RequiredError}
269
269
  * @memberof ExecutionsApi
270
270
  */
271
- triggerAction(requestParameters: ExecutionsApiTriggerActionRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<TriggerActionResponseClass, any, {}>>;
271
+ triggerAction(requestParameters: ExecutionsApiTriggerActionRequest, options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<TriggerActionResponseClass, any, {}, any>>;
272
272
  }
@@ -104,7 +104,7 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
104
104
  getActionExecutionStatus: function (authorization, executionCode, correlationId, options) {
105
105
  if (options === void 0) { options = {}; }
106
106
  return __awaiter(_this, void 0, void 0, function () {
107
- var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, headersFromBaseOptions;
107
+ var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, authorizationValue, headersFromBaseOptions;
108
108
  return __generator(this, function (_a) {
109
109
  switch (_a.label) {
110
110
  case 0:
@@ -130,8 +130,9 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
130
130
  if (correlationId !== undefined) {
131
131
  localVarQueryParameter['correlationId'] = correlationId;
132
132
  }
133
- if (authorization !== undefined && authorization !== null || baseAccessToken !== undefined && baseAccessToken !== null) {
134
- localVarHeaderParameter['Authorization'] = String(authorization ? authorization : baseAccessToken);
133
+ authorizationValue = 'Authorization'.toLowerCase() === 'authorization' ? (authorization || baseAccessToken) : authorization;
134
+ if (authorizationValue) {
135
+ localVarHeaderParameter['Authorization'] = String(authorizationValue);
135
136
  }
136
137
  (0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
137
138
  headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
@@ -161,7 +162,7 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
161
162
  listActionExecutions: function (authorization, pageSize, pageToken, filter, search, order, expand, filters, options) {
162
163
  if (options === void 0) { options = {}; }
163
164
  return __awaiter(_this, void 0, void 0, function () {
164
- var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, headersFromBaseOptions;
165
+ var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, authorizationValue, headersFromBaseOptions;
165
166
  return __generator(this, function (_a) {
166
167
  switch (_a.label) {
167
168
  case 0:
@@ -202,8 +203,9 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
202
203
  if (filters !== undefined) {
203
204
  localVarQueryParameter['filters'] = filters;
204
205
  }
205
- if (authorization !== undefined && authorization !== null || baseAccessToken !== undefined && baseAccessToken !== null) {
206
- localVarHeaderParameter['Authorization'] = String(authorization ? authorization : baseAccessToken);
206
+ authorizationValue = 'Authorization'.toLowerCase() === 'authorization' ? (authorization || baseAccessToken) : authorization;
207
+ if (authorizationValue) {
208
+ localVarHeaderParameter['Authorization'] = String(authorizationValue);
207
209
  }
208
210
  (0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
209
211
  headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
@@ -227,7 +229,7 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
227
229
  triggerAction: function (triggerActionRequestDto, authorization, options) {
228
230
  if (options === void 0) { options = {}; }
229
231
  return __awaiter(_this, void 0, void 0, function () {
230
- var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, headersFromBaseOptions;
232
+ var localVarPath, localVarUrlObj, baseOptions, baseAccessToken, localVarRequestOptions, localVarHeaderParameter, localVarQueryParameter, authorizationValue, headersFromBaseOptions;
231
233
  return __generator(this, function (_a) {
232
234
  switch (_a.label) {
233
235
  case 0:
@@ -244,13 +246,16 @@ var ExecutionsApiAxiosParamCreator = function (configuration) {
244
246
  localVarQueryParameter = {};
245
247
  // authentication bearer required
246
248
  // http bearer authentication required
247
- return [4 /*yield*/, (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration)];
249
+ return [4 /*yield*/, (0, common_1.setBearerAuthToObject)(localVarHeaderParameter, configuration)
250
+ // Only Authorization falls back to the configured token; an empty value is never sent.
251
+ ];
248
252
  case 1:
249
253
  // authentication bearer required
250
254
  // http bearer authentication required
251
255
  _a.sent();
252
- if (authorization !== undefined && authorization !== null || baseAccessToken !== undefined && baseAccessToken !== null) {
253
- localVarHeaderParameter['Authorization'] = String(authorization ? authorization : baseAccessToken);
256
+ authorizationValue = 'Authorization'.toLowerCase() === 'authorization' ? (authorization || baseAccessToken) : authorization;
257
+ if (authorizationValue) {
258
+ localVarHeaderParameter['Authorization'] = String(authorizationValue);
254
259
  }
255
260
  localVarHeaderParameter['Content-Type'] = 'application/json';
256
261
  (0, common_1.setSearchParams)(localVarUrlObj, localVarQueryParameter);
@@ -66,5 +66,5 @@ export declare class HealthApi extends BaseAPI {
66
66
  * @throws {RequiredError}
67
67
  * @memberof HealthApi
68
68
  */
69
- check(options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<InlineResponse200, any, {}>>;
69
+ check(options?: AxiosRequestConfig): Promise<import("axios").AxiosResponse<InlineResponse200, any, {}, any>>;
70
70
  }
package/dist/base.d.ts CHANGED
@@ -22,9 +22,19 @@ export declare const COLLECTION_FORMATS: {
22
22
  tsv: string;
23
23
  pipes: string;
24
24
  };
25
+ export interface SessionClass {
26
+ sub: string;
27
+ username?: string;
28
+ email?: string;
29
+ tenantSlug?: string;
30
+ permissions?: string;
31
+ expiresAt?: number;
32
+ }
25
33
  export interface LoginClass {
26
34
  accessToken: string;
27
35
  permissions: string;
36
+ authMode?: string;
37
+ session?: SessionClass;
28
38
  }
29
39
  export interface SwitchWorkspaceRequest {
30
40
  username: string;
@@ -33,6 +43,8 @@ export interface SwitchWorkspaceRequest {
33
43
  export interface SwitchWorkspaceResponseClass {
34
44
  accessToken: string;
35
45
  permissions: string;
46
+ authMode?: string;
47
+ session?: SessionClass;
36
48
  }
37
49
  export declare enum Environment {
38
50
  Production = "https://apiv2.emil.de",
@@ -63,6 +75,18 @@ export declare class BaseAPI {
63
75
  protected configuration: Configuration | undefined;
64
76
  private tokenData?;
65
77
  constructor(configuration?: Configuration, basePath?: string, axios?: AxiosInstance);
78
+ private sessionAccount;
79
+ private authBasePath;
80
+ private usesSession;
81
+ private useSessionAuth;
82
+ private useHeaderAuth;
83
+ private applyTokenReply;
84
+ private sessionHeaders;
85
+ private withCurrentAuth;
86
+ private canRetryWithToken;
87
+ private canResend;
88
+ private switchToToken;
89
+ private retryWithToken;
66
90
  selectEnvironment(env: Environment): void;
67
91
  selectBasePath(path: string): void;
68
92
  getPermissions(): Array<string>;
package/dist/base.js CHANGED
@@ -74,6 +74,17 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
74
74
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
75
75
  }
76
76
  };
77
+ var __rest = (this && this.__rest) || function (s, e) {
78
+ var t = {};
79
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
80
+ t[p] = s[p];
81
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
82
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
83
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
84
+ t[p[i]] = s[p[i]];
85
+ }
86
+ return t;
87
+ };
77
88
  var __importDefault = (this && this.__importDefault) || function (mod) {
78
89
  return (mod && mod.__esModule) ? mod : { "default": mod };
79
90
  };
@@ -112,6 +123,12 @@ function resetRetry() {
112
123
  exports.resetRetry = resetRetry;
113
124
  var NETWORK_ERROR_MESSAGE = "Network Error";
114
125
  var TOKEN_DATA = 'APP_TOKEN';
126
+ // Sent only to authservice, to ask for a server session.
127
+ var AUTH_MODE_HEADER = 'X-Emil-Auth-Mode';
128
+ // Names the account on every call; one browser session can hold several.
129
+ var ACCOUNT_HEADER = 'X-Emil-Account';
130
+ var SESSION_MODES = ['both', 'session'];
131
+ var RESEND_SAFE_METHODS = ['get', 'head', 'options'];
115
132
  /**
116
133
  *
117
134
  * @export
@@ -128,10 +145,18 @@ var BaseAPI = /** @class */ (function () {
128
145
  var accessToken = this.tokenData.accessToken;
129
146
  this.configuration = configuration;
130
147
  this.basePath = configuration.basePath || this.basePath;
131
- // Use config token if provided, otherwise use tokenData token
132
- var configToken = this.configuration.accessToken;
133
- var storedToken = accessToken ? "Bearer ".concat(accessToken) : '';
134
- this.configuration.accessToken = configToken || storedToken;
148
+ if (configuration.cookieAuth) {
149
+ this.configuration.username = this.configuration.username || this.tokenData.username;
150
+ }
151
+ if (this.usesSession()) {
152
+ this.useSessionAuth();
153
+ }
154
+ else {
155
+ // Use config token if provided, otherwise use tokenData token
156
+ var configToken = this.configuration.accessToken;
157
+ var storedToken = accessToken ? "Bearer ".concat(accessToken) : '';
158
+ this.configuration.accessToken = configToken || storedToken;
159
+ }
135
160
  }
136
161
  else {
137
162
  var _a = this.tokenData, accessToken = _a.accessToken, username = _a.username;
@@ -143,6 +168,95 @@ var BaseAPI = /** @class */ (function () {
143
168
  }
144
169
  this.attachInterceptor(axios);
145
170
  }
171
+ // The app's own account wins over APP_TOKEN, which holds whichever tab wrote last.
172
+ BaseAPI.prototype.sessionAccount = function () {
173
+ return this.configuration.account || this.tokenData.sub;
174
+ };
175
+ // Apps may pass the address as the second argument only; authservice is on the same host.
176
+ BaseAPI.prototype.authBasePath = function () {
177
+ return this.configuration.basePath || this.basePath;
178
+ };
179
+ BaseAPI.prototype.usesSession = function () {
180
+ return !!this.configuration.cookieAuth && SESSION_MODES.indexOf(this.tokenData.authMode) !== -1 && !!this.sessionAccount();
181
+ };
182
+ BaseAPI.prototype.useSessionAuth = function () {
183
+ var _a;
184
+ var _b = this.configuration.baseOptions || {}, headers = _b.headers, baseOptions = __rest(_b, ["headers"]);
185
+ this.configuration.accessToken = '';
186
+ this.configuration.baseOptions = __assign(__assign({}, baseOptions), { withCredentials: true, headers: __assign(__assign({}, headers), (_a = {}, _a[ACCOUNT_HEADER] = this.sessionAccount(), _a)) });
187
+ };
188
+ BaseAPI.prototype.useHeaderAuth = function (accessToken) {
189
+ this.configuration.accessToken = accessToken ? "Bearer ".concat(accessToken) : '';
190
+ this.tokenData.accessToken = accessToken;
191
+ delete this.tokenData.authMode;
192
+ delete this.tokenData.sub;
193
+ if (this.configuration.cookieAuth) {
194
+ var _a = this.configuration.baseOptions || {}, withCredentials = _a.withCredentials, headers = _a.headers, baseOptions = __rest(_a, ["withCredentials", "headers"]);
195
+ var _b = headers || {}, _c = ACCOUNT_HEADER, account = _b[_c], otherHeaders = __rest(_b, [typeof _c === "symbol" ? _c : _c + ""]);
196
+ this.configuration.baseOptions = __assign(__assign({}, baseOptions), { headers: otherHeaders });
197
+ }
198
+ };
199
+ BaseAPI.prototype.applyTokenReply = function (_a) {
200
+ var accessToken = _a.accessToken, authMode = _a.authMode, session = _a.session;
201
+ if (this.configuration.cookieAuth && SESSION_MODES.indexOf(authMode) !== -1 && (session === null || session === void 0 ? void 0 : session.sub)) {
202
+ this.tokenData.authMode = authMode;
203
+ this.tokenData.sub = session.sub;
204
+ if (this.configuration.account) {
205
+ // A workspace switch moves the app to another account.
206
+ this.configuration.account = session.sub;
207
+ }
208
+ // Both keeps the token for apps not moved yet; session mode keeps no token at all.
209
+ if (authMode === 'both' && accessToken) {
210
+ this.tokenData.accessToken = accessToken;
211
+ }
212
+ else {
213
+ delete this.tokenData.accessToken;
214
+ }
215
+ this.useSessionAuth();
216
+ }
217
+ else {
218
+ this.useHeaderAuth(accessToken);
219
+ }
220
+ };
221
+ BaseAPI.prototype.sessionHeaders = function () {
222
+ var _a, _b;
223
+ if (!this.configuration.cookieAuth) {
224
+ return {};
225
+ }
226
+ return __assign((_a = {}, _a[AUTH_MODE_HEADER] = 'session', _a), (this.usesSession() && (_b = {}, _b[ACCOUNT_HEADER] = this.sessionAccount(), _b)));
227
+ };
228
+ BaseAPI.prototype.withCurrentAuth = function (config) {
229
+ delete config.headers['Authorization'];
230
+ delete config.headers[ACCOUNT_HEADER];
231
+ if (this.usesSession()) {
232
+ config.headers[ACCOUNT_HEADER] = this.sessionAccount();
233
+ config.withCredentials = true;
234
+ }
235
+ else if (this.configuration.accessToken) {
236
+ config.headers['Authorization'] = this.configuration.accessToken;
237
+ }
238
+ return config;
239
+ };
240
+ // Both keeps the token, so a session call the browser could not complete can be sent again with it.
241
+ BaseAPI.prototype.canRetryWithToken = function (config) {
242
+ var _a;
243
+ return !!config.withCredentials && !!((_a = config.headers) === null || _a === void 0 ? void 0 : _a[ACCOUNT_HEADER])
244
+ && !!this.tokenData.accessToken && this.tokenData.authMode !== 'session';
245
+ };
246
+ // A network error can come after the server ran the call, so only a call that is safe to repeat is sent again.
247
+ BaseAPI.prototype.canResend = function (config) {
248
+ return RESEND_SAFE_METHODS.indexOf((config.method || 'get').toLowerCase()) !== -1
249
+ || Object.keys(config.headers || {}).some(function (name) { return name.toLowerCase() === 'idempotency-key'; });
250
+ };
251
+ BaseAPI.prototype.switchToToken = function () {
252
+ this.useHeaderAuth(this.tokenData.accessToken);
253
+ this.storeTokenData(this.tokenData);
254
+ };
255
+ BaseAPI.prototype.retryWithToken = function (axios, config) {
256
+ this.switchToToken();
257
+ config.withCredentials = false;
258
+ return axios(this.withCurrentAuth(config));
259
+ };
146
260
  BaseAPI.prototype.selectEnvironment = function (env) {
147
261
  this.selectBasePath(env);
148
262
  };
@@ -158,14 +272,15 @@ var BaseAPI = /** @class */ (function () {
158
272
  };
159
273
  BaseAPI.prototype.authorize = function (username, password, targetWorkspace) {
160
274
  return __awaiter(this, void 0, void 0, function () {
161
- var options, response, _a, accessToken, permissions;
275
+ var options, response;
276
+ var _a;
162
277
  return __generator(this, function (_b) {
163
278
  switch (_b.label) {
164
279
  case 0:
165
280
  options = {
166
281
  method: 'POST',
167
- url: "".concat(this.configuration.basePath, "/authservice/v1/login"),
168
- headers: { 'Content-Type': 'application/json' },
282
+ url: "".concat(this.authBasePath(), "/authservice/v1/login"),
283
+ headers: __assign({ 'Content-Type': 'application/json' }, (this.configuration.cookieAuth && (_a = {}, _a[AUTH_MODE_HEADER] = 'session', _a))),
169
284
  data: {
170
285
  username: username,
171
286
  password: password,
@@ -175,12 +290,10 @@ var BaseAPI = /** @class */ (function () {
175
290
  return [4 /*yield*/, axios_1.default.request(options)];
176
291
  case 1:
177
292
  response = _b.sent();
178
- _a = response.data, accessToken = _a.accessToken, permissions = _a.permissions;
179
293
  this.configuration.username = username;
180
- this.configuration.accessToken = "Bearer ".concat(accessToken);
181
294
  this.tokenData.username = username;
182
- this.tokenData.accessToken = accessToken;
183
- this.tokenData.permissions = permissions;
295
+ this.tokenData.permissions = response.data.permissions;
296
+ this.applyTokenReply(response.data);
184
297
  if (!targetWorkspace) return [3 /*break*/, 3];
185
298
  return [4 /*yield*/, this.switchWorkspace(targetWorkspace)];
186
299
  case 2:
@@ -199,17 +312,14 @@ var BaseAPI = /** @class */ (function () {
199
312
  };
200
313
  BaseAPI.prototype.switchWorkspace = function (targetWorkspace) {
201
314
  return __awaiter(this, void 0, void 0, function () {
202
- var options, response, _a, accessToken, permissions;
203
- return __generator(this, function (_b) {
204
- switch (_b.label) {
315
+ var options, response;
316
+ return __generator(this, function (_a) {
317
+ switch (_a.label) {
205
318
  case 0:
206
319
  options = {
207
320
  method: 'POST',
208
- url: "".concat(this.configuration.basePath, "/authservice/v1/workspaces/switch"),
209
- headers: {
210
- 'Content-Type': 'application/json',
211
- 'Authorization': "Bearer ".concat(this.configuration.accessToken),
212
- },
321
+ url: "".concat(this.authBasePath(), "/authservice/v1/workspaces/switch"),
322
+ headers: __assign(__assign({ 'Content-Type': 'application/json' }, this.sessionHeaders()), (!this.usesSession() && !!this.configuration.accessToken && { 'Authorization': this.configuration.accessToken })),
213
323
  data: {
214
324
  username: this.configuration.username,
215
325
  targetWorkspace: targetWorkspace,
@@ -218,11 +328,9 @@ var BaseAPI = /** @class */ (function () {
218
328
  };
219
329
  return [4 /*yield*/, axios_1.default.request(options)];
220
330
  case 1:
221
- response = _b.sent();
222
- _a = response.data, accessToken = _a.accessToken, permissions = _a.permissions;
223
- this.configuration.accessToken = "Bearer ".concat(accessToken);
224
- this.tokenData.accessToken = accessToken;
225
- this.tokenData.permissions = permissions;
331
+ response = _a.sent();
332
+ this.tokenData.permissions = response.data.permissions;
333
+ this.applyTokenReply(response.data);
226
334
  this.storeTokenData(__assign({}, this.tokenData));
227
335
  return [2 /*return*/];
228
336
  }
@@ -249,10 +357,8 @@ var BaseAPI = /** @class */ (function () {
249
357
  });
250
358
  options = {
251
359
  method: 'POST',
252
- url: "".concat(this.configuration.basePath, "/authservice/v1/refresh-token"),
253
- headers: {
254
- 'Content-Type': 'application/json',
255
- },
360
+ url: "".concat(this.authBasePath(), "/authservice/v1/refresh-token"),
361
+ headers: __assign({ 'Content-Type': 'application/json' }, this.sessionHeaders()),
256
362
  data: { username: username },
257
363
  withCredentials: true,
258
364
  };
@@ -285,62 +391,75 @@ var BaseAPI = /** @class */ (function () {
285
391
  axios.interceptors.response.use(function (res) {
286
392
  return res;
287
393
  }, function (err) { return __awaiter(_this, void 0, void 0, function () {
288
- var originalConfig, _a, tokenString, permissions, accessToken, _error_1, _b, tokenString, permissions, accessToken, _error_2;
289
- return __generator(this, function (_c) {
290
- switch (_c.label) {
394
+ var originalConfig, reply, _error_1, reply, _error_2;
395
+ var _this = this;
396
+ return __generator(this, function (_a) {
397
+ switch (_a.label) {
291
398
  case 0:
292
399
  originalConfig = err.config;
293
400
  if (!(err.response && !(err.response instanceof XMLHttpRequest))) return [3 /*break*/, 5];
294
401
  if (!((err.response.status === 401 || err.response.status === 403)
295
402
  && !originalConfig._retry)) return [3 /*break*/, 4];
296
403
  originalConfig._retry = true;
297
- _c.label = 1;
404
+ _a.label = 1;
298
405
  case 1:
299
- _c.trys.push([1, 3, , 4]);
406
+ _a.trys.push([1, 3, , 4]);
300
407
  return [4 /*yield*/, this.refreshTokenInternal()];
301
408
  case 2:
302
- _a = _c.sent(), tokenString = _a.accessToken, permissions = _a.permissions;
303
- accessToken = "Bearer ".concat(tokenString);
304
- this.tokenData.permissions = permissions;
305
- delete originalConfig.headers['Authorization'];
306
- originalConfig.headers['Authorization'] = accessToken;
307
- this.configuration.accessToken = accessToken;
308
- this.tokenData.accessToken = tokenString;
409
+ reply = _a.sent();
410
+ this.tokenData.permissions = reply.permissions;
411
+ this.applyTokenReply(reply);
309
412
  this.storeTokenData(this.tokenData);
310
- return [2 /*return*/, axios(originalConfig)];
413
+ if (!this.usesSession()) {
414
+ return [2 /*return*/, axios(this.withCurrentAuth(originalConfig))];
415
+ }
416
+ // Both mode: if the browser does not send the session cookie (another site), use the token.
417
+ return [2 /*return*/, axios(this.withCurrentAuth(originalConfig)).catch(function (retryError) {
418
+ var _a;
419
+ if (((_a = retryError === null || retryError === void 0 ? void 0 : retryError.response) === null || _a === void 0 ? void 0 : _a.status) !== 401 || !_this.tokenData.accessToken) {
420
+ return Promise.reject(retryError);
421
+ }
422
+ return _this.retryWithToken(axios, originalConfig);
423
+ })];
311
424
  case 3:
312
- _error_1 = _c.sent();
425
+ _error_1 = _a.sent();
313
426
  if (_error_1.response && _error_1.response.data) {
314
427
  return [2 /*return*/, Promise.reject(_error_1.response.data)];
315
428
  }
316
429
  return [2 /*return*/, Promise.reject(_error_1)];
317
- case 4: return [3 /*break*/, 9];
430
+ case 4: return [3 /*break*/, 10];
318
431
  case 5:
432
+ if (!(err.message === NETWORK_ERROR_MESSAGE && this.canRetryWithToken(originalConfig))) return [3 /*break*/, 6];
433
+ // Both mode: the browser blocked the session call or hid its reply; later calls use the token.
434
+ if (!this.canResend(originalConfig)) {
435
+ this.switchToToken();
436
+ return [2 /*return*/, Promise.reject(err)];
437
+ }
438
+ return [2 /*return*/, this.retryWithToken(axios, originalConfig)];
439
+ case 6:
319
440
  if (!(err.message === NETWORK_ERROR_MESSAGE
320
- && originalConfig.headers.hasOwnProperty('Authorization')
321
- && _retry_count < 4)) return [3 /*break*/, 9];
441
+ && (originalConfig.headers.hasOwnProperty('Authorization')
442
+ || (this.configuration.cookieAuth && originalConfig.withCredentials && this.canResend(originalConfig)))
443
+ && _retry_count < 4)) return [3 /*break*/, 10];
322
444
  _retry_count++;
323
- _c.label = 6;
324
- case 6:
325
- _c.trys.push([6, 8, , 9]);
326
- return [4 /*yield*/, this.refreshTokenInternal()];
445
+ _a.label = 7;
327
446
  case 7:
328
- _b = _c.sent(), tokenString = _b.accessToken, permissions = _b.permissions;
329
- accessToken = "Bearer ".concat(tokenString);
330
- this.tokenData.permissions = permissions;
447
+ _a.trys.push([7, 9, , 10]);
448
+ return [4 /*yield*/, this.refreshTokenInternal()];
449
+ case 8:
450
+ reply = _a.sent();
451
+ this.tokenData.permissions = reply.permissions;
331
452
  _retry = true;
332
- originalConfig.headers['Authorization'] = accessToken;
333
- this.configuration.accessToken = accessToken;
334
- this.tokenData.accessToken = tokenString;
453
+ this.applyTokenReply(reply);
335
454
  this.storeTokenData(this.tokenData);
336
- return [2 /*return*/, axios.request(__assign({}, originalConfig))];
337
- case 8:
338
- _error_2 = _c.sent();
455
+ return [2 /*return*/, axios.request(__assign({}, this.withCurrentAuth(originalConfig)))];
456
+ case 9:
457
+ _error_2 = _a.sent();
339
458
  if (_error_2.response && _error_2.response.data) {
340
459
  return [2 /*return*/, Promise.reject(_error_2.response.data)];
341
460
  }
342
461
  return [2 /*return*/, Promise.reject(_error_2)];
343
- case 9: return [2 /*return*/, Promise.reject(err)];
462
+ case 10: return [2 /*return*/, Promise.reject(err)];
344
463
  }
345
464
  });
346
465
  }); });
package/dist/common.d.ts CHANGED
@@ -62,7 +62,7 @@ export declare const toPathString: (url: URL) => string;
62
62
  *
63
63
  * @export
64
64
  */
65
- export declare const createRequestFunction: (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) => <T = unknown, R = AxiosResponse<T, any, {}>>(axios?: AxiosInstance, basePath?: string) => Promise<R>;
65
+ export declare const createRequestFunction: (axiosArgs: RequestArgs, globalAxios: AxiosInstance, BASE_PATH: string, configuration?: Configuration) => <T = unknown, R = AxiosResponse<T, any, {}, any>>(axios?: AxiosInstance, basePath?: string) => Promise<R>;
66
66
  /**
67
67
  * EMIL ActionService
68
68
  * The EMIL ActionService API description
package/dist/common.js CHANGED
@@ -233,6 +233,7 @@ exports.toPathString = toPathString;
233
233
  * @export
234
234
  */
235
235
  var createRequestFunction = function (axiosArgs, globalAxios, BASE_PATH, configuration) {
236
+ // Typed by hand: since axios 1.20, request() returns an internal axios type that SDK declarations cannot name.
236
237
  return function (axios, basePath) {
237
238
  if (axios === void 0) { axios = globalAxios; }
238
239
  if (basePath === void 0) { basePath = BASE_PATH; }
@@ -17,6 +17,8 @@ export interface ConfigurationParameters {
17
17
  basePath?: string;
18
18
  baseOptions?: any;
19
19
  formDataCtor?: new () => any;
20
+ cookieAuth?: boolean;
21
+ account?: string;
20
22
  }
21
23
  export declare class Configuration {
22
24
  /**
@@ -68,6 +70,21 @@ export declare class Configuration {
68
70
  * @type {new () => FormData}
69
71
  */
70
72
  formDataCtor?: new () => any;
73
+ /**
74
+ * Use a server session when authservice makes one; otherwise the token, as without this option.
75
+ * Set `account` too, so each SDK object keeps its own account.
76
+ *
77
+ * @type {boolean}
78
+ * @memberof Configuration
79
+ */
80
+ cookieAuth?: boolean;
81
+ /**
82
+ * The session account (Cognito sub) this app shows, so the SDK never takes another tab's account.
83
+ *
84
+ * @type {string}
85
+ * @memberof Configuration
86
+ */
87
+ account?: string;
71
88
  constructor(param?: ConfigurationParameters);
72
89
  /**
73
90
  * Check if the given MIME is a JSON MIME.
@@ -24,6 +24,8 @@ var Configuration = /** @class */ (function () {
24
24
  this.basePath = param.basePath;
25
25
  this.baseOptions = param.baseOptions;
26
26
  this.formDataCtor = param.formDataCtor;
27
+ this.cookieAuth = param.cookieAuth;
28
+ this.account = param.account;
27
29
  }
28
30
  /**
29
31
  * Check if the given MIME is a JSON MIME.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emilgroup/action-sdk",
3
- "version": "1.8.1-beta.1",
3
+ "version": "1.8.1-beta.13",
4
4
  "description": "OpenAPI client for @emilgroup/action-sdk",
5
5
  "author": "OpenAPI-Generator Contributors",
6
6
  "keywords": [
@@ -18,7 +18,7 @@
18
18
  "prepare": "npm run build"
19
19
  },
20
20
  "dependencies": {
21
- "axios": "1.18.0"
21
+ "axios": "1.20.0"
22
22
  },
23
23
  "devDependencies": {
24
24