@atlaskit/util-service-support 7.2.1 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/cjs/buildHeaders.js +30 -0
- package/dist/cjs/buildUrl.js +46 -0
- package/dist/cjs/extractTracingHeaders.js +23 -0
- package/dist/cjs/multipartServiceUtils.js +6 -4
- package/dist/cjs/requestService.js +71 -0
- package/dist/cjs/serviceUtils.js +13 -80
- package/dist/cjs/shared.js +2 -66
- package/dist/es2019/buildHeaders.js +24 -0
- package/dist/es2019/buildUrl.js +37 -0
- package/dist/es2019/extractTracingHeaders.js +16 -0
- package/dist/es2019/multipartServiceUtils.js +4 -2
- package/dist/es2019/requestService.js +67 -0
- package/dist/es2019/serviceUtils.js +5 -76
- package/dist/es2019/shared.js +1 -62
- package/dist/esm/buildHeaders.js +24 -0
- package/dist/esm/buildUrl.js +40 -0
- package/dist/esm/extractTracingHeaders.js +17 -0
- package/dist/esm/multipartServiceUtils.js +4 -2
- package/dist/esm/requestService.js +66 -0
- package/dist/esm/serviceUtils.js +5 -76
- package/dist/esm/shared.js +1 -65
- package/dist/types/buildHeaders.d.ts +2 -0
- package/dist/types/buildUrl.d.ts +2 -0
- package/dist/types/extractTracingHeaders.d.ts +5 -0
- package/dist/types/requestService.d.ts +5 -0
- package/dist/types/serviceUtils.d.ts +4 -6
- package/dist/types/shared.d.ts +1 -3
- package/extractTracingHeaders/package.json +7 -0
- package/package.json +3 -8
- package/requestService/package.json +7 -0
- package/afm-cc/tsconfig.json +0 -35
- package/report.api.md +0 -133
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atlaskit/util-service-support
|
|
2
2
|
|
|
3
|
+
## 7.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`a8a0effc7b45c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a8a0effc7b45c) -
|
|
8
|
+
Update @atlaskit/util-service-support to conform to Volt Component standards
|
|
9
|
+
|
|
10
|
+
## 7.3.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- [`bd2c5b0112185`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bd2c5b0112185) -
|
|
15
|
+
Remove stale API report artifacts from published Platform packages.
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
|
|
3
21
|
## 7.2.1
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildHeaders = void 0;
|
|
7
|
+
var addToHeaders = function addToHeaders(headers, keyValues) {
|
|
8
|
+
if (keyValues) {
|
|
9
|
+
for (var key in keyValues) {
|
|
10
|
+
if ({}.hasOwnProperty.call(keyValues, key)) {
|
|
11
|
+
var values = keyValues[key];
|
|
12
|
+
if (Array.isArray(values)) {
|
|
13
|
+
for (var i = 0; i < values.length; i++) {
|
|
14
|
+
headers[key] = values[i];
|
|
15
|
+
}
|
|
16
|
+
} else {
|
|
17
|
+
headers[key] = values;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var buildHeaders = exports.buildHeaders = function buildHeaders(secOptions, extraHeaders) {
|
|
24
|
+
var headers = {};
|
|
25
|
+
addToHeaders(headers, extraHeaders);
|
|
26
|
+
if (secOptions) {
|
|
27
|
+
addToHeaders(headers, secOptions.headers);
|
|
28
|
+
}
|
|
29
|
+
return headers;
|
|
30
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.buildUrl = void 0;
|
|
7
|
+
var buildUrl = exports.buildUrl = function buildUrl(baseUrl) {
|
|
8
|
+
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
9
|
+
var queryParams = arguments.length > 2 ? arguments[2] : undefined;
|
|
10
|
+
var secOptions = arguments.length > 3 ? arguments[3] : undefined;
|
|
11
|
+
var searchParam = new URLSearchParams(
|
|
12
|
+
// For relative urls, the URL class requires base to be set. It's ignored if a url is not relative.
|
|
13
|
+
// Since we only care about search params it is fine to have any base url here.
|
|
14
|
+
new URL(baseUrl, 'https://BASE_FALLBACK').search || undefined);
|
|
15
|
+
baseUrl = baseUrl.split('?')[0];
|
|
16
|
+
if (queryParams) {
|
|
17
|
+
for (var key in queryParams) {
|
|
18
|
+
if ({}.hasOwnProperty.call(queryParams, key)) {
|
|
19
|
+
searchParam.append(key, queryParams[key]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (secOptions && secOptions.params) {
|
|
24
|
+
for (var _key in secOptions.params) {
|
|
25
|
+
if ({}.hasOwnProperty.call(secOptions.params, _key)) {
|
|
26
|
+
var values = secOptions.params[_key];
|
|
27
|
+
if (Array.isArray(values)) {
|
|
28
|
+
for (var i = 0; i < values.length; i++) {
|
|
29
|
+
searchParam.append(_key, values[i]);
|
|
30
|
+
}
|
|
31
|
+
} else {
|
|
32
|
+
searchParam.append(_key, values);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
var separator = '';
|
|
38
|
+
if (path && baseUrl.substr(-1) !== '/' && !path.startsWith('/')) {
|
|
39
|
+
separator = '/';
|
|
40
|
+
}
|
|
41
|
+
var params = searchParam.toString();
|
|
42
|
+
if (params) {
|
|
43
|
+
params = '?' + params;
|
|
44
|
+
}
|
|
45
|
+
return "".concat(baseUrl).concat(separator).concat(path).concat(params);
|
|
46
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.extractTracingHeaders = void 0;
|
|
7
|
+
var TRACING_RESPONSE_HEADERS = ['x-trace-id', 'atl-request-id'];
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Extracts tracing headers (x-trace-id, atl-request-id) from a Response object.
|
|
11
|
+
* Returns only headers that are present in the response.
|
|
12
|
+
*/
|
|
13
|
+
var extractTracingHeaders = exports.extractTracingHeaders = function extractTracingHeaders(response) {
|
|
14
|
+
var headers = {};
|
|
15
|
+
for (var _i = 0, _TRACING_RESPONSE_HEA = TRACING_RESPONSE_HEADERS; _i < _TRACING_RESPONSE_HEA.length; _i++) {
|
|
16
|
+
var name = _TRACING_RESPONSE_HEA[_i];
|
|
17
|
+
var value = response.headers.get(name);
|
|
18
|
+
if (value) {
|
|
19
|
+
headers[name] = value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return headers;
|
|
23
|
+
};
|
|
@@ -9,9 +9,11 @@ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"))
|
|
|
9
9
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
10
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
11
|
var _browser = require("meros/browser");
|
|
12
|
-
var _types = require("./types");
|
|
13
|
-
var _shared = require("./shared");
|
|
14
12
|
var _experienceTraceIdContext = require("@atlaskit/react-ufo/experience-trace-id-context");
|
|
13
|
+
var _buildHeaders = require("./buildHeaders");
|
|
14
|
+
var _buildUrl = require("./buildUrl");
|
|
15
|
+
var _shared = require("./shared");
|
|
16
|
+
var _types = require("./types");
|
|
15
17
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
18
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
19
|
/** Copied from meros types, as there are difficulties with resolving the type in CI */
|
|
@@ -52,8 +54,8 @@ var _requestServiceMultipart = exports.requestServiceMultipart = /*#__PURE__*/fu
|
|
|
52
54
|
url = serviceConfig.url, securityProvider = serviceConfig.securityProvider, refreshedSecurityProvider = serviceConfig.refreshedSecurityProvider;
|
|
53
55
|
path = options.path, queryParams = options.queryParams, requestInit = options.requestInit;
|
|
54
56
|
secOptions = securityProvider && securityProvider();
|
|
55
|
-
requestUrl = (0,
|
|
56
|
-
headers = (0,
|
|
57
|
+
requestUrl = (0, _buildUrl.buildUrl)(url, path, queryParams, secOptions);
|
|
58
|
+
headers = (0, _buildHeaders.buildHeaders)(secOptions, requestInit && requestInit.headers);
|
|
57
59
|
credentials = (0, _types.buildCredentials)(secOptions); // Get tracing headers from UFO
|
|
58
60
|
tracingHeaders = (0, _experienceTraceIdContext.getActiveTraceHttpRequestHeaders)(url);
|
|
59
61
|
requestOptions = _objectSpread(_objectSpread({}, requestInit), {}, {
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.requestService = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _experienceTraceIdContext = require("@atlaskit/react-ufo/experience-trace-id-context");
|
|
10
|
+
var _buildHeaders = require("./buildHeaders");
|
|
11
|
+
var _buildUrl = require("./buildUrl");
|
|
12
|
+
var _extractTracingHeaders = require("./extractTracingHeaders");
|
|
13
|
+
var _shared = require("./shared");
|
|
14
|
+
var _types = require("./types");
|
|
15
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
/**
|
|
18
|
+
* @returns Promise containing the json response
|
|
19
|
+
*/
|
|
20
|
+
var _requestService = exports.requestService = function requestService(serviceConfig, options) {
|
|
21
|
+
var url = serviceConfig.url,
|
|
22
|
+
securityProvider = serviceConfig.securityProvider,
|
|
23
|
+
refreshedSecurityProvider = serviceConfig.refreshedSecurityProvider;
|
|
24
|
+
var _ref = options || _shared.defaultRequestServiceOptions,
|
|
25
|
+
path = _ref.path,
|
|
26
|
+
queryParams = _ref.queryParams,
|
|
27
|
+
requestInit = _ref.requestInit;
|
|
28
|
+
var secOptions = securityProvider && securityProvider();
|
|
29
|
+
var requestUrl = (0, _buildUrl.buildUrl)(url, path, queryParams, secOptions);
|
|
30
|
+
var headers = (0, _buildHeaders.buildHeaders)(secOptions, requestInit && requestInit.headers);
|
|
31
|
+
var credentials = (0, _types.buildCredentials)(secOptions);
|
|
32
|
+
var ignoreResponsePayload = (options === null || options === void 0 ? void 0 : options.ignoreResponsePayload) || false;
|
|
33
|
+
|
|
34
|
+
// Get tracing headers from UFO
|
|
35
|
+
var tracingHeaders = (0, _experienceTraceIdContext.getActiveTraceHttpRequestHeaders)(url);
|
|
36
|
+
var requestOptions = _objectSpread(_objectSpread({}, requestInit), {}, {
|
|
37
|
+
// populate headers mainly for the collab provider however
|
|
38
|
+
// other components which uses this util can get the header as well.
|
|
39
|
+
// Those tracing headers shall not incur any issues as long as backends handle them properly
|
|
40
|
+
headers: _objectSpread(_objectSpread({}, headers), tracingHeaders),
|
|
41
|
+
credentials: credentials
|
|
42
|
+
});
|
|
43
|
+
return fetch(requestUrl, requestOptions).then(function (response) {
|
|
44
|
+
if (options !== null && options !== void 0 && options.reportTracingHeaders) {
|
|
45
|
+
var _tracingHeaders = (0, _extractTracingHeaders.extractTracingHeaders)(response);
|
|
46
|
+
if (Object.keys(_tracingHeaders).length > 0) {
|
|
47
|
+
options.reportTracingHeaders(_tracingHeaders);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (response.status === 204) {
|
|
51
|
+
return Promise.resolve();
|
|
52
|
+
} else if (response.ok) {
|
|
53
|
+
return ignoreResponsePayload ? Promise.resolve() : response.json();
|
|
54
|
+
} else if (response.status === 401 && refreshedSecurityProvider) {
|
|
55
|
+
// auth issue - try once
|
|
56
|
+
return refreshedSecurityProvider().then(function (newSecOptions) {
|
|
57
|
+
var retryServiceConfig = {
|
|
58
|
+
url: url,
|
|
59
|
+
securityProvider: function securityProvider() {
|
|
60
|
+
return newSecOptions;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return _requestService(retryServiceConfig, options);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return Promise.reject({
|
|
67
|
+
code: response.status,
|
|
68
|
+
reason: response.statusText
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
};
|
package/dist/cjs/serviceUtils.js
CHANGED
|
@@ -1,86 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
7
|
-
exports
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _shared = require("./shared");
|
|
12
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
-
var TRACING_RESPONSE_HEADERS = ['x-trace-id', 'atl-request-id'];
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Extracts tracing headers (x-trace-id, atl-request-id) from a Response object.
|
|
18
|
-
* Returns only headers that are present in the response.
|
|
19
|
-
*/
|
|
20
|
-
var extractTracingHeaders = exports.extractTracingHeaders = function extractTracingHeaders(response) {
|
|
21
|
-
var headers = {};
|
|
22
|
-
for (var _i = 0, _TRACING_RESPONSE_HEA = TRACING_RESPONSE_HEADERS; _i < _TRACING_RESPONSE_HEA.length; _i++) {
|
|
23
|
-
var name = _TRACING_RESPONSE_HEA[_i];
|
|
24
|
-
var value = response.headers.get(name);
|
|
25
|
-
if (value) {
|
|
26
|
-
headers[name] = value;
|
|
27
|
-
}
|
|
6
|
+
Object.defineProperty(exports, "extractTracingHeaders", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _extractTracingHeaders.extractTracingHeaders;
|
|
28
10
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
refreshedSecurityProvider = serviceConfig.refreshedSecurityProvider;
|
|
39
|
-
var _ref = options || _shared.defaultRequestServiceOptions,
|
|
40
|
-
path = _ref.path,
|
|
41
|
-
queryParams = _ref.queryParams,
|
|
42
|
-
requestInit = _ref.requestInit;
|
|
43
|
-
var secOptions = securityProvider && securityProvider();
|
|
44
|
-
var requestUrl = (0, _shared.buildUrl)(url, path, queryParams, secOptions);
|
|
45
|
-
var headers = (0, _shared.buildHeaders)(secOptions, requestInit && requestInit.headers);
|
|
46
|
-
var credentials = (0, _types.buildCredentials)(secOptions);
|
|
47
|
-
var ignoreResponsePayload = (options === null || options === void 0 ? void 0 : options.ignoreResponsePayload) || false;
|
|
48
|
-
|
|
49
|
-
// Get tracing headers from UFO
|
|
50
|
-
var tracingHeaders = (0, _experienceTraceIdContext.getActiveTraceHttpRequestHeaders)(url);
|
|
51
|
-
var requestOptions = _objectSpread(_objectSpread({}, requestInit), {}, {
|
|
52
|
-
// populate headers mainly for the collab provider however
|
|
53
|
-
// other components which uses this util can get the header as well.
|
|
54
|
-
// Those tracing headers shall not incur any issues as long as backends handle them properly
|
|
55
|
-
headers: _objectSpread(_objectSpread({}, headers), tracingHeaders),
|
|
56
|
-
credentials: credentials
|
|
57
|
-
});
|
|
58
|
-
return fetch(requestUrl, requestOptions).then(function (response) {
|
|
59
|
-
if (options !== null && options !== void 0 && options.reportTracingHeaders) {
|
|
60
|
-
var _tracingHeaders = extractTracingHeaders(response);
|
|
61
|
-
if (Object.keys(_tracingHeaders).length > 0) {
|
|
62
|
-
options.reportTracingHeaders(_tracingHeaders);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
if (response.status === 204) {
|
|
66
|
-
return Promise.resolve();
|
|
67
|
-
} else if (response.ok) {
|
|
68
|
-
return ignoreResponsePayload ? Promise.resolve() : response.json();
|
|
69
|
-
} else if (response.status === 401 && refreshedSecurityProvider) {
|
|
70
|
-
// auth issue - try once
|
|
71
|
-
return refreshedSecurityProvider().then(function (newSecOptions) {
|
|
72
|
-
var retryServiceConfig = {
|
|
73
|
-
url: url,
|
|
74
|
-
securityProvider: function securityProvider() {
|
|
75
|
-
return newSecOptions;
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
return _requestService(retryServiceConfig, options);
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return Promise.reject({
|
|
82
|
-
code: response.status,
|
|
83
|
-
reason: response.statusText
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
};
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "requestService", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _requestService.requestService;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var _extractTracingHeaders = require("./extractTracingHeaders");
|
|
19
|
+
var _requestService = require("./requestService");
|
package/dist/cjs/shared.js
CHANGED
|
@@ -3,69 +3,5 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.defaultRequestServiceOptions =
|
|
7
|
-
var defaultRequestServiceOptions = exports.defaultRequestServiceOptions = {};
|
|
8
|
-
var buildUrl = exports.buildUrl = function buildUrl(baseUrl) {
|
|
9
|
-
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
10
|
-
var queryParams = arguments.length > 2 ? arguments[2] : undefined;
|
|
11
|
-
var secOptions = arguments.length > 3 ? arguments[3] : undefined;
|
|
12
|
-
var searchParam = new URLSearchParams(
|
|
13
|
-
// For relative urls, the URL class requires base to be set. It's ignored if a url is not relative.
|
|
14
|
-
// Since we only care about search params it is fine to have any base url here.
|
|
15
|
-
new URL(baseUrl, 'https://BASE_FALLBACK').search || undefined);
|
|
16
|
-
baseUrl = baseUrl.split('?')[0];
|
|
17
|
-
if (queryParams) {
|
|
18
|
-
for (var key in queryParams) {
|
|
19
|
-
if ({}.hasOwnProperty.call(queryParams, key)) {
|
|
20
|
-
searchParam.append(key, queryParams[key]);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
if (secOptions && secOptions.params) {
|
|
25
|
-
for (var _key in secOptions.params) {
|
|
26
|
-
if ({}.hasOwnProperty.call(secOptions.params, _key)) {
|
|
27
|
-
var values = secOptions.params[_key];
|
|
28
|
-
if (Array.isArray(values)) {
|
|
29
|
-
for (var i = 0; i < values.length; i++) {
|
|
30
|
-
searchParam.append(_key, values[i]);
|
|
31
|
-
}
|
|
32
|
-
} else {
|
|
33
|
-
searchParam.append(_key, values);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
var separator = '';
|
|
39
|
-
if (path && baseUrl.substr(-1) !== '/' && !path.startsWith('/')) {
|
|
40
|
-
separator = '/';
|
|
41
|
-
}
|
|
42
|
-
var params = searchParam.toString();
|
|
43
|
-
if (params) {
|
|
44
|
-
params = '?' + params;
|
|
45
|
-
}
|
|
46
|
-
return "".concat(baseUrl).concat(separator).concat(path).concat(params);
|
|
47
|
-
};
|
|
48
|
-
var addToHeaders = function addToHeaders(headers, keyValues) {
|
|
49
|
-
if (keyValues) {
|
|
50
|
-
for (var key in keyValues) {
|
|
51
|
-
if ({}.hasOwnProperty.call(keyValues, key)) {
|
|
52
|
-
var values = keyValues[key];
|
|
53
|
-
if (Array.isArray(values)) {
|
|
54
|
-
for (var i = 0; i < values.length; i++) {
|
|
55
|
-
headers[key] = values[i];
|
|
56
|
-
}
|
|
57
|
-
} else {
|
|
58
|
-
headers[key] = values;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
var buildHeaders = exports.buildHeaders = function buildHeaders(secOptions, extraHeaders) {
|
|
65
|
-
var headers = {};
|
|
66
|
-
addToHeaders(headers, extraHeaders);
|
|
67
|
-
if (secOptions) {
|
|
68
|
-
addToHeaders(headers, secOptions.headers);
|
|
69
|
-
}
|
|
70
|
-
return headers;
|
|
71
|
-
};
|
|
6
|
+
exports.defaultRequestServiceOptions = void 0;
|
|
7
|
+
var defaultRequestServiceOptions = exports.defaultRequestServiceOptions = {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const addToHeaders = (headers, keyValues) => {
|
|
2
|
+
if (keyValues) {
|
|
3
|
+
for (const key in keyValues) {
|
|
4
|
+
if ({}.hasOwnProperty.call(keyValues, key)) {
|
|
5
|
+
const values = keyValues[key];
|
|
6
|
+
if (Array.isArray(values)) {
|
|
7
|
+
for (let i = 0; i < values.length; i++) {
|
|
8
|
+
headers[key] = values[i];
|
|
9
|
+
}
|
|
10
|
+
} else {
|
|
11
|
+
headers[key] = values;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export const buildHeaders = (secOptions, extraHeaders) => {
|
|
18
|
+
const headers = {};
|
|
19
|
+
addToHeaders(headers, extraHeaders);
|
|
20
|
+
if (secOptions) {
|
|
21
|
+
addToHeaders(headers, secOptions.headers);
|
|
22
|
+
}
|
|
23
|
+
return headers;
|
|
24
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const buildUrl = (baseUrl, path = '', queryParams, secOptions) => {
|
|
2
|
+
const searchParam = new URLSearchParams(
|
|
3
|
+
// For relative urls, the URL class requires base to be set. It's ignored if a url is not relative.
|
|
4
|
+
// Since we only care about search params it is fine to have any base url here.
|
|
5
|
+
new URL(baseUrl, 'https://BASE_FALLBACK').search || undefined);
|
|
6
|
+
baseUrl = baseUrl.split('?')[0];
|
|
7
|
+
if (queryParams) {
|
|
8
|
+
for (const key in queryParams) {
|
|
9
|
+
if ({}.hasOwnProperty.call(queryParams, key)) {
|
|
10
|
+
searchParam.append(key, queryParams[key]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (secOptions && secOptions.params) {
|
|
15
|
+
for (const key in secOptions.params) {
|
|
16
|
+
if ({}.hasOwnProperty.call(secOptions.params, key)) {
|
|
17
|
+
const values = secOptions.params[key];
|
|
18
|
+
if (Array.isArray(values)) {
|
|
19
|
+
for (let i = 0; i < values.length; i++) {
|
|
20
|
+
searchParam.append(key, values[i]);
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
searchParam.append(key, values);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
let separator = '';
|
|
29
|
+
if (path && baseUrl.substr(-1) !== '/' && !path.startsWith('/')) {
|
|
30
|
+
separator = '/';
|
|
31
|
+
}
|
|
32
|
+
let params = searchParam.toString();
|
|
33
|
+
if (params) {
|
|
34
|
+
params = '?' + params;
|
|
35
|
+
}
|
|
36
|
+
return `${baseUrl}${separator}${path}${params}`;
|
|
37
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const TRACING_RESPONSE_HEADERS = ['x-trace-id', 'atl-request-id'];
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extracts tracing headers (x-trace-id, atl-request-id) from a Response object.
|
|
5
|
+
* Returns only headers that are present in the response.
|
|
6
|
+
*/
|
|
7
|
+
export const extractTracingHeaders = response => {
|
|
8
|
+
const headers = {};
|
|
9
|
+
for (const name of TRACING_RESPONSE_HEADERS) {
|
|
10
|
+
const value = response.headers.get(name);
|
|
11
|
+
if (value) {
|
|
12
|
+
headers[name] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return headers;
|
|
16
|
+
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { meros } from 'meros/browser';
|
|
2
|
-
import { buildCredentials } from './types';
|
|
3
|
-
import { buildHeaders, buildUrl, defaultRequestServiceOptions } from './shared';
|
|
4
2
|
import { getActiveTraceHttpRequestHeaders } from '@atlaskit/react-ufo/experience-trace-id-context';
|
|
3
|
+
import { buildHeaders } from './buildHeaders';
|
|
4
|
+
import { buildUrl } from './buildUrl';
|
|
5
|
+
import { defaultRequestServiceOptions } from './shared';
|
|
6
|
+
import { buildCredentials } from './types';
|
|
5
7
|
|
|
6
8
|
/** Copied from meros types, as there are difficulties with resolving the type in CI */
|
|
7
9
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { getActiveTraceHttpRequestHeaders } from '@atlaskit/react-ufo/experience-trace-id-context';
|
|
2
|
+
import { buildHeaders } from './buildHeaders';
|
|
3
|
+
import { buildUrl } from './buildUrl';
|
|
4
|
+
import { extractTracingHeaders } from './extractTracingHeaders';
|
|
5
|
+
import { defaultRequestServiceOptions } from './shared';
|
|
6
|
+
import { buildCredentials } from './types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @returns Promise containing the json response
|
|
10
|
+
*/
|
|
11
|
+
export const requestService = (serviceConfig, options) => {
|
|
12
|
+
const {
|
|
13
|
+
url,
|
|
14
|
+
securityProvider,
|
|
15
|
+
refreshedSecurityProvider
|
|
16
|
+
} = serviceConfig;
|
|
17
|
+
const {
|
|
18
|
+
path,
|
|
19
|
+
queryParams,
|
|
20
|
+
requestInit
|
|
21
|
+
} = options || defaultRequestServiceOptions;
|
|
22
|
+
const secOptions = securityProvider && securityProvider();
|
|
23
|
+
const requestUrl = buildUrl(url, path, queryParams, secOptions);
|
|
24
|
+
const headers = buildHeaders(secOptions, requestInit && requestInit.headers);
|
|
25
|
+
const credentials = buildCredentials(secOptions);
|
|
26
|
+
const ignoreResponsePayload = (options === null || options === void 0 ? void 0 : options.ignoreResponsePayload) || false;
|
|
27
|
+
|
|
28
|
+
// Get tracing headers from UFO
|
|
29
|
+
const tracingHeaders = getActiveTraceHttpRequestHeaders(url);
|
|
30
|
+
const requestOptions = {
|
|
31
|
+
...requestInit,
|
|
32
|
+
// populate headers mainly for the collab provider however
|
|
33
|
+
// other components which uses this util can get the header as well.
|
|
34
|
+
// Those tracing headers shall not incur any issues as long as backends handle them properly
|
|
35
|
+
headers: {
|
|
36
|
+
...headers,
|
|
37
|
+
...tracingHeaders
|
|
38
|
+
},
|
|
39
|
+
credentials
|
|
40
|
+
};
|
|
41
|
+
return fetch(requestUrl, requestOptions).then(response => {
|
|
42
|
+
if (options !== null && options !== void 0 && options.reportTracingHeaders) {
|
|
43
|
+
const tracingHeaders = extractTracingHeaders(response);
|
|
44
|
+
if (Object.keys(tracingHeaders).length > 0) {
|
|
45
|
+
options.reportTracingHeaders(tracingHeaders);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (response.status === 204) {
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
} else if (response.ok) {
|
|
51
|
+
return ignoreResponsePayload ? Promise.resolve() : response.json();
|
|
52
|
+
} else if (response.status === 401 && refreshedSecurityProvider) {
|
|
53
|
+
// auth issue - try once
|
|
54
|
+
return refreshedSecurityProvider().then(newSecOptions => {
|
|
55
|
+
const retryServiceConfig = {
|
|
56
|
+
url,
|
|
57
|
+
securityProvider: () => newSecOptions
|
|
58
|
+
};
|
|
59
|
+
return requestService(retryServiceConfig, options);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return Promise.reject({
|
|
63
|
+
code: response.status,
|
|
64
|
+
reason: response.statusText
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
};
|
|
@@ -1,80 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import { buildCredentials } from './types';
|
|
3
|
-
import { defaultRequestServiceOptions, buildUrl, buildHeaders } from './shared';
|
|
4
|
-
const TRACING_RESPONSE_HEADERS = ['x-trace-id', 'atl-request-id'];
|
|
5
|
-
|
|
1
|
+
/* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
|
|
6
2
|
/**
|
|
7
|
-
*
|
|
8
|
-
* Returns only headers that are present in the response.
|
|
3
|
+
* @deprecated Use `import { extractTracingHeaders } from '@atlaskit/util-service-support/extractTracingHeaders'` instead.
|
|
9
4
|
*/
|
|
10
|
-
export
|
|
11
|
-
const headers = {};
|
|
12
|
-
for (const name of TRACING_RESPONSE_HEADERS) {
|
|
13
|
-
const value = response.headers.get(name);
|
|
14
|
-
if (value) {
|
|
15
|
-
headers[name] = value;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return headers;
|
|
19
|
-
};
|
|
20
|
-
|
|
5
|
+
export { extractTracingHeaders } from './extractTracingHeaders';
|
|
21
6
|
/**
|
|
22
|
-
* @
|
|
7
|
+
* @deprecated Use `import { requestService } from '@atlaskit/util-service-support/requestService'` instead.
|
|
23
8
|
*/
|
|
24
|
-
export
|
|
25
|
-
const {
|
|
26
|
-
url,
|
|
27
|
-
securityProvider,
|
|
28
|
-
refreshedSecurityProvider
|
|
29
|
-
} = serviceConfig;
|
|
30
|
-
const {
|
|
31
|
-
path,
|
|
32
|
-
queryParams,
|
|
33
|
-
requestInit
|
|
34
|
-
} = options || defaultRequestServiceOptions;
|
|
35
|
-
const secOptions = securityProvider && securityProvider();
|
|
36
|
-
const requestUrl = buildUrl(url, path, queryParams, secOptions);
|
|
37
|
-
const headers = buildHeaders(secOptions, requestInit && requestInit.headers);
|
|
38
|
-
const credentials = buildCredentials(secOptions);
|
|
39
|
-
const ignoreResponsePayload = (options === null || options === void 0 ? void 0 : options.ignoreResponsePayload) || false;
|
|
40
|
-
|
|
41
|
-
// Get tracing headers from UFO
|
|
42
|
-
const tracingHeaders = getActiveTraceHttpRequestHeaders(url);
|
|
43
|
-
const requestOptions = {
|
|
44
|
-
...requestInit,
|
|
45
|
-
// populate headers mainly for the collab provider however
|
|
46
|
-
// other components which uses this util can get the header as well.
|
|
47
|
-
// Those tracing headers shall not incur any issues as long as backends handle them properly
|
|
48
|
-
headers: {
|
|
49
|
-
...headers,
|
|
50
|
-
...tracingHeaders
|
|
51
|
-
},
|
|
52
|
-
credentials
|
|
53
|
-
};
|
|
54
|
-
return fetch(requestUrl, requestOptions).then(response => {
|
|
55
|
-
if (options !== null && options !== void 0 && options.reportTracingHeaders) {
|
|
56
|
-
const tracingHeaders = extractTracingHeaders(response);
|
|
57
|
-
if (Object.keys(tracingHeaders).length > 0) {
|
|
58
|
-
options.reportTracingHeaders(tracingHeaders);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (response.status === 204) {
|
|
62
|
-
return Promise.resolve();
|
|
63
|
-
} else if (response.ok) {
|
|
64
|
-
return ignoreResponsePayload ? Promise.resolve() : response.json();
|
|
65
|
-
} else if (response.status === 401 && refreshedSecurityProvider) {
|
|
66
|
-
// auth issue - try once
|
|
67
|
-
return refreshedSecurityProvider().then(newSecOptions => {
|
|
68
|
-
const retryServiceConfig = {
|
|
69
|
-
url,
|
|
70
|
-
securityProvider: () => newSecOptions
|
|
71
|
-
};
|
|
72
|
-
return requestService(retryServiceConfig, options);
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
return Promise.reject({
|
|
76
|
-
code: response.status,
|
|
77
|
-
reason: response.statusText
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
};
|
|
9
|
+
export { requestService } from './requestService';
|