@scaleway/sdk 1.9.0 → 1.10.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.
@@ -37,7 +37,9 @@ const withProfile = profile => settings => {
37
37
  newSettings.defaultZone = profile.defaultZone;
38
38
  }
39
39
  if (hasAuthenticationSecrets(profile)) {
40
- newSettings.requestInterceptors = [authenticateWithSecrets(profile), ...settings.requestInterceptors];
40
+ newSettings.interceptors = [{
41
+ request: authenticateWithSecrets(profile)
42
+ }, ...newSettings.interceptors];
41
43
  }
42
44
  return newSettings;
43
45
  };
@@ -102,4 +104,71 @@ const withUserAgentSuffix = userAgent => settings => ({
102
104
  userAgent: settings.userAgent ? `${settings.userAgent} ${userAgent}` : userAgent
103
105
  });
104
106
 
105
- export { withDefaultPageSize, withHTTPClient, withProfile, withUserAgent, withUserAgentSuffix };
107
+ /**
108
+ * Instantiates the SDK with additional interceptors.
109
+ *
110
+ * @param interceptors - The additional {@link NetworkInterceptors} interceptors
111
+ * @returns A factory {@link ClientConfig}
112
+ *
113
+ * @remarks
114
+ * It doesn't override the existing interceptors, but instead push more to the list.
115
+ * This method should be used in conjunction with the initializer `createAdvancedClient`.
116
+ *
117
+ * @example
118
+ * ```
119
+ * withAdditionalInterceptors([
120
+ * {
121
+ * request: ({ request }) => {
122
+ * console.log(`Do something with ${JSON.stringify(request)}`)
123
+ * return request
124
+ * },
125
+ * response: ({ response }) => {
126
+ * console.log(`Do something with ${JSON.stringify(response)}`)
127
+ * return response
128
+ * },
129
+ * responseError: async ({
130
+ * request,
131
+ * error,
132
+ * }: {
133
+ * request: Request
134
+ * error: unknown
135
+ * }) => {
136
+ * console.log(
137
+ * `Do something with ${JSON.stringify(request)} and ${JSON.stringify(
138
+ * error,
139
+ * )}`,
140
+ * )
141
+ * throw error // or return Promise.resolve(someData)
142
+ * },
143
+ * },
144
+ * ])
145
+ * ```
146
+ *
147
+ * @public
148
+ */
149
+ const withAdditionalInterceptors = interceptors => settings => ({
150
+ ...settings,
151
+ interceptors: settings.interceptors.concat(interceptors)
152
+ });
153
+
154
+ /**
155
+ * Instantiates the SDK with legacy interceptors.
156
+ */
157
+ /* eslint-disable deprecation/deprecation */
158
+ const withLegacyInterceptors = () => settings => {
159
+ if (!settings.requestInterceptors && !settings.responseInterceptors) {
160
+ return settings;
161
+ }
162
+ const allInterceptors = settings.interceptors.concat((settings.requestInterceptors ?? []).map(obj => ({
163
+ request: obj
164
+ })), (settings.responseInterceptors ?? []).map(obj => ({
165
+ response: obj
166
+ })));
167
+ return {
168
+ ...settings,
169
+ interceptors: allInterceptors
170
+ };
171
+ };
172
+ /* eslint-enable deprecation/deprecation */
173
+
174
+ export { withAdditionalInterceptors, withDefaultPageSize, withHTTPClient, withLegacyInterceptors, withProfile, withUserAgent, withUserAgentSuffix };
@@ -1,5 +1,5 @@
1
1
  import { getLogger } from '../internal/logger/index.js';
2
- import { withProfile } from './client-ini-factory.js';
2
+ import { withLegacyInterceptors, withProfile } from './client-ini-factory.js';
3
3
  import { assertValidSettings } from './client-settings.js';
4
4
  import { version, userAgent } from './constants.js';
5
5
  import { buildFetcher } from './fetch/build-fetcher.js';
@@ -8,8 +8,7 @@ import { buildFetcher } from './fetch/build-fetcher.js';
8
8
  const DEFAULT_SETTINGS = {
9
9
  apiURL: 'https://api.scaleway.com',
10
10
  httpClient: fetch,
11
- requestInterceptors: [],
12
- responseInterceptors: [],
11
+ interceptors: [],
13
12
  userAgent
14
13
  };
15
14
 
@@ -45,7 +44,7 @@ const createAdvancedClient = function () {
45
44
  for (var _len = arguments.length, configs = new Array(_len), _key = 0; _key < _len; _key++) {
46
45
  configs[_key] = arguments[_key];
47
46
  }
48
- const settings = configs.reduce((currentSettings, config) => config(currentSettings), DEFAULT_SETTINGS);
47
+ const settings = configs.concat([withLegacyInterceptors()]).reduce((currentSettings, config) => config(currentSettings), DEFAULT_SETTINGS);
49
48
  assertValidSettings(settings);
50
49
  getLogger().info(`init Scaleway SDK version ${version}`);
51
50
  return {
@@ -1,4 +1,4 @@
1
- const version = 'v1.8.0';
1
+ const version = 'v1.9.0';
2
2
  const userAgent = `scaleway-sdk-js/${version}`;
3
3
 
4
4
  export { userAgent, version };
@@ -1,5 +1,5 @@
1
1
  import { isBrowser } from '../../helpers/is-browser.js';
2
- import { composeInterceptors } from '../../internal/interceptors/interceptor.js';
2
+ import { composeRequestInterceptors, composeResponseInterceptors, composeResponseErrorInterceptors } from '../../internal/interceptors/composer.js';
3
3
  import { obfuscateAuthHeadersEntry } from '../auth.js';
4
4
  import { logRequest, logResponse, obfuscateInterceptor } from './http-interceptors.js';
5
5
  import { responseParser } from './response-parser.js';
@@ -44,14 +44,28 @@ const asIs = response => response;
44
44
  */
45
45
  const buildFetcher = (settings, httpClient) => {
46
46
  let requestNumber = 0;
47
- const prepareRequest = requestId => composeInterceptors([...settings.requestInterceptors, logRequest(requestId, obfuscateInterceptor(obfuscateAuthHeadersEntry))]);
48
- const prepareResponse = requestId => composeInterceptors([...settings.responseInterceptors, logResponse(requestId)]);
47
+ const prepareRequest = requestId => composeRequestInterceptors([...settings.interceptors.map(obj => obj.request).filter(obj => obj), logRequest(requestId, obfuscateInterceptor(obfuscateAuthHeadersEntry))]);
48
+ const prepareResponse = requestId => composeResponseInterceptors([...settings.interceptors.map(obj => obj.response).filter(obj => obj), logResponse(requestId)]);
49
+ const prepareResponseErrors = () => composeResponseErrorInterceptors(settings.interceptors.map(obj => obj.responseError).filter(obj => obj));
49
50
  return async function (request, unwrapper) {
50
51
  if (unwrapper === void 0) {
51
52
  unwrapper = asIs;
52
53
  }
53
54
  const requestId = `${requestNumber += 1}`;
54
- return Promise.resolve(buildRequest(request, settings)).then(prepareRequest(requestId)).then(httpClient).then(prepareResponse(requestId)).then(responseParser(unwrapper, request.responseType ?? 'json'));
55
+ const reqInterceptors = prepareRequest(requestId);
56
+ const finalRequest = await reqInterceptors(buildRequest(request, settings));
57
+ try {
58
+ const response = await httpClient(finalRequest);
59
+ const resInterceptors = prepareResponse(requestId);
60
+ const finalResponse = await resInterceptors(response);
61
+ const resUnmarshaller = responseParser(unwrapper, request.responseType ?? 'json');
62
+ const unmarshaledResponse = await resUnmarshaller(finalResponse);
63
+ return unmarshaledResponse;
64
+ } catch (err) {
65
+ const resErrorInterceptors = prepareResponseErrors();
66
+ const handledError = await resErrorInterceptors(finalRequest, err);
67
+ return handledError;
68
+ }
55
69
  };
56
70
  };
57
71
 
@@ -35,8 +35,18 @@ class ObfuscatedRequest extends Request {
35
35
  *
36
36
  * @internal
37
37
  */
38
- const obfuscateInterceptor = obfuscate => request => new ObfuscatedRequest(request, obfuscate);
39
- const identity = instance => instance;
38
+ const obfuscateInterceptor = obfuscate => _ref => {
39
+ let {
40
+ request
41
+ } = _ref;
42
+ return new ObfuscatedRequest(request, obfuscate);
43
+ };
44
+ const identity = _ref2 => {
45
+ let {
46
+ request
47
+ } = _ref2;
48
+ return request;
49
+ };
40
50
 
41
51
  /**
42
52
  * Creates an interceptor to log the requests.
@@ -51,10 +61,15 @@ const logRequest = function (identifier, obfuscate) {
51
61
  if (obfuscate === void 0) {
52
62
  obfuscate = identity;
53
63
  }
54
- return async request => {
64
+ return async _ref3 => {
65
+ let {
66
+ request
67
+ } = _ref3;
55
68
  if (shouldLog(LevelResolver[getLogger().logLevel], 'debug')) {
56
69
  getLogger().debug(`--------------- Scaleway SDK REQUEST ${identifier} ---------------
57
- ${await dumpRequest(await obfuscate(request))}
70
+ ${await dumpRequest(await obfuscate({
71
+ request
72
+ }))}
58
73
  ---------------------------------------------------------`);
59
74
  }
60
75
  return request;
@@ -69,7 +84,10 @@ ${await dumpRequest(await obfuscate(request))}
69
84
  *
70
85
  * @internal
71
86
  */
72
- const logResponse = identifier => async response => {
87
+ const logResponse = identifier => async _ref4 => {
88
+ let {
89
+ response
90
+ } = _ref4;
73
91
  if (shouldLog(LevelResolver[getLogger().logLevel], 'debug')) {
74
92
  getLogger().debug(`--------------- Scaleway SDK RESPONSE ${identifier} ---------------
75
93
  ${await dumpResponse(response)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scaleway/sdk",
3
- "version": "1.9.0",
3
+ "version": "1.10.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Scaleway SDK.",
6
6
  "keywords": [
@@ -35,5 +35,5 @@
35
35
  "bundledDependencies": [
36
36
  "@scaleway/random-name"
37
37
  ],
38
- "gitHead": "307b3c269ecfde7c1ebb24a92c83bc1fcf35edd4"
38
+ "gitHead": "3fcccb0fe3ba944bea778ea0d6bb55273ec01db6"
39
39
  }
@@ -1,13 +0,0 @@
1
- /**
2
- * Composes interceptors.
3
- *
4
- * @param interceptors - A list of interceptors (that modify an object instance)
5
- * @returns An async composed interceptor
6
- *
7
- * @internal
8
- */
9
- const composeInterceptors = interceptors => async instance => interceptors.reduce(async (asyncResult, interceptor) => interceptor(await asyncResult), new Promise(resolve => {
10
- resolve(instance);
11
- }));
12
-
13
- export { composeInterceptors };