@sebspark/openapi-client 2.3.0 → 2.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/dist/index.d.ts +53 -2
- package/dist/index.js +126 -127
- package/dist/index.mjs +119 -83
- package/package.json +6 -4
- package/dist/index.d.mts +0 -11
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseClient, ClientOptions } from '@sebspark/openapi-core';
|
|
1
|
+
import { BaseClient, ClientOptions, RequestOptions, APIResponse } from '@sebspark/openapi-core';
|
|
2
2
|
import { AxiosInstance } from 'axios';
|
|
3
3
|
import { Logger } from 'winston';
|
|
4
4
|
export * from '@sebspark/retry';
|
|
@@ -8,4 +8,55 @@ type TypedAxiosClient<T> = T & {
|
|
|
8
8
|
};
|
|
9
9
|
declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions, logger?: Logger) => TypedAxiosClient<C>;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
type GatewayGraphqlClient$1 = Pick<BaseClient, 'post' | 'get'> & {
|
|
12
|
+
post: {
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param {string} url
|
|
16
|
+
* @param {Object} [args] - Optional. The arguments for the request.
|
|
17
|
+
* @param {Object} [args.body] - Optional. Request body for the request.
|
|
18
|
+
* @param {string} [args.body.query] - Optional.
|
|
19
|
+
* @param {object} [args.body.variables] - Optional.
|
|
20
|
+
* @param {RequestOptions} [opts] - Optional.
|
|
21
|
+
* @returns {Promise<APIResponse<{
|
|
22
|
+
}>>}
|
|
23
|
+
*/
|
|
24
|
+
(url: '/graphql', args?: {
|
|
25
|
+
body?: {
|
|
26
|
+
query?: string;
|
|
27
|
+
variables?: Record<string, unknown>;
|
|
28
|
+
};
|
|
29
|
+
}, opts?: RequestOptions): Promise<APIResponse<{
|
|
30
|
+
data: Record<string, any>;
|
|
31
|
+
errors?: ({
|
|
32
|
+
message: string;
|
|
33
|
+
} & Record<string, any>)[];
|
|
34
|
+
}>>;
|
|
35
|
+
};
|
|
36
|
+
get: {
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param {string} url
|
|
40
|
+
* @param {RequestOptions} [opts] - Optional.
|
|
41
|
+
* @returns {Promise<undefined>}
|
|
42
|
+
*/
|
|
43
|
+
(url: '/health', opts?: RequestOptions): Promise<undefined>;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
type GatewayGraphqlClientArgs = {
|
|
47
|
+
logger: Logger;
|
|
48
|
+
uri: string;
|
|
49
|
+
apiKey: string;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
declare class GatewayGraphqlClient<T extends GatewayGraphqlClient$1 = GatewayGraphqlClient$1> {
|
|
53
|
+
client: T;
|
|
54
|
+
logger: Logger;
|
|
55
|
+
private uri;
|
|
56
|
+
private options;
|
|
57
|
+
constructor(args: GatewayGraphqlClientArgs);
|
|
58
|
+
graphql<K>(query: string, variables?: Record<string, unknown>): Promise<K>;
|
|
59
|
+
isHealthy(): Promise<boolean>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { GatewayGraphqlClient, TypedAxiosClient, TypedClient };
|
package/dist/index.js
CHANGED
|
@@ -1,45 +1,28 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); }var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
19
18
|
};
|
|
20
|
-
var
|
|
21
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
-
mod
|
|
28
|
-
));
|
|
29
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
-
|
|
31
|
-
// src/index.ts
|
|
32
|
-
var index_exports = {};
|
|
33
|
-
__export(index_exports, {
|
|
34
|
-
TypedClient: () => TypedClient
|
|
35
|
-
});
|
|
36
|
-
module.exports = __toCommonJS(index_exports);
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
37
20
|
|
|
38
21
|
// src/client.ts
|
|
39
|
-
var
|
|
40
|
-
var
|
|
41
|
-
var
|
|
42
|
-
var
|
|
22
|
+
var _openapicore = require('@sebspark/openapi-core');
|
|
23
|
+
var _retry = require('@sebspark/retry'); _createStarExport(_retry);
|
|
24
|
+
var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios);
|
|
25
|
+
var _axiosauthrefresh = require('axios-auth-refresh'); var _axiosauthrefresh2 = _interopRequireDefault(_axiosauthrefresh);
|
|
43
26
|
|
|
44
27
|
// src/paramsSerializer.ts
|
|
45
28
|
var encodeParam = (param) => encodeURIComponent(param);
|
|
@@ -96,59 +79,57 @@ var paramsSerializer = (format) => (params) => {
|
|
|
96
79
|
|
|
97
80
|
// src/client.ts
|
|
98
81
|
var TypedClient = (baseURL, globalOptions, logger) => {
|
|
99
|
-
const axiosInstance =
|
|
100
|
-
logger
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
);
|
|
104
|
-
if (globalOptions?.authorizationTokenGenerator) {
|
|
105
|
-
logger?.debug("authorizationTokenGenerator is set");
|
|
82
|
+
const axiosInstance = _axios2.default.create();
|
|
83
|
+
logger == null ? void 0 : logger.debug("client initialized with arrayFormat", globalOptions == null ? void 0 : globalOptions.arrayFormat);
|
|
84
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) {
|
|
85
|
+
logger == null ? void 0 : logger.debug("authorizationTokenGenerator is set");
|
|
106
86
|
axiosInstance.interceptors.request.use(async (request) => {
|
|
107
87
|
const url = `${request.baseURL}${request.url}`;
|
|
108
|
-
logger
|
|
109
|
-
if (globalOptions
|
|
88
|
+
logger == null ? void 0 : logger.debug(`Intercepting request to ${url}`);
|
|
89
|
+
if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) && url) {
|
|
110
90
|
try {
|
|
111
91
|
const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
|
|
112
92
|
if (authorizationTokenHeaders) {
|
|
113
93
|
for (const key of Object.keys(authorizationTokenHeaders)) {
|
|
114
94
|
const value = authorizationTokenHeaders[key];
|
|
115
|
-
logger
|
|
95
|
+
logger == null ? void 0 : logger.debug(`Setting header ${key} to ${value}`);
|
|
116
96
|
request.headers[key] = value;
|
|
117
97
|
}
|
|
118
98
|
}
|
|
119
99
|
} catch (error) {
|
|
120
|
-
logger
|
|
100
|
+
logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
|
|
121
101
|
throw error;
|
|
122
102
|
}
|
|
123
103
|
}
|
|
124
|
-
logger
|
|
125
|
-
logger
|
|
104
|
+
logger == null ? void 0 : logger.debug("Intercepted request:");
|
|
105
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(request, null, 2));
|
|
126
106
|
return request;
|
|
127
107
|
});
|
|
128
108
|
}
|
|
129
|
-
if (globalOptions
|
|
109
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
|
|
130
110
|
const refreshAuthLogic = async (failedRequest) => {
|
|
131
|
-
|
|
132
|
-
logger
|
|
133
|
-
|
|
134
|
-
|
|
111
|
+
var _a, _b;
|
|
112
|
+
logger == null ? void 0 : logger.debug("Failed request");
|
|
113
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(failedRequest, null, 2));
|
|
114
|
+
if (!_axios2.default.isAxiosError(failedRequest)) {
|
|
115
|
+
logger == null ? void 0 : logger.error("Failed request is not an axios error");
|
|
135
116
|
return;
|
|
136
117
|
}
|
|
137
118
|
const axiosError = failedRequest;
|
|
138
|
-
logger
|
|
139
|
-
logger
|
|
140
|
-
const url = `${axiosError.config
|
|
141
|
-
if (globalOptions
|
|
142
|
-
logger
|
|
119
|
+
logger == null ? void 0 : logger.debug("Failed request config:");
|
|
120
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(axiosError.config, null, 2));
|
|
121
|
+
const url = `${(_a = axiosError.config) == null ? void 0 : _a.baseURL}${(_b = axiosError.config) == null ? void 0 : _b.url}`;
|
|
122
|
+
if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) && url) {
|
|
123
|
+
logger == null ? void 0 : logger.debug(`Refreshing token for URL ${url}`);
|
|
143
124
|
try {
|
|
144
|
-
await globalOptions
|
|
125
|
+
await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
|
|
145
126
|
} catch (error) {
|
|
146
|
-
logger
|
|
127
|
+
logger == null ? void 0 : logger.error(`Error refreshing token for URL: ${url}`);
|
|
147
128
|
throw error;
|
|
148
129
|
}
|
|
149
130
|
}
|
|
150
131
|
};
|
|
151
|
-
(0,
|
|
132
|
+
_axiosauthrefresh2.default.call(void 0, axiosInstance, refreshAuthLogic);
|
|
152
133
|
}
|
|
153
134
|
if (logger) {
|
|
154
135
|
axiosInstance.interceptors.request.use((request) => {
|
|
@@ -171,60 +152,35 @@ var TypedClient = (baseURL, globalOptions, logger) => {
|
|
|
171
152
|
});
|
|
172
153
|
}
|
|
173
154
|
const client = {
|
|
174
|
-
get: (url, args, opts) => callServer(
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
),
|
|
179
|
-
post: (url, args, opts) => callServer(
|
|
180
|
-
axiosInstance,
|
|
181
|
-
mergeArgs(baseURL, url, "post", args, opts, globalOptions),
|
|
182
|
-
logger
|
|
183
|
-
),
|
|
184
|
-
put: (url, args, opts) => callServer(
|
|
185
|
-
axiosInstance,
|
|
186
|
-
mergeArgs(baseURL, url, "put", args, opts, globalOptions),
|
|
187
|
-
logger
|
|
188
|
-
),
|
|
189
|
-
patch: (url, args, opts) => callServer(
|
|
190
|
-
axiosInstance,
|
|
191
|
-
mergeArgs(baseURL, url, "patch", args, opts, globalOptions),
|
|
192
|
-
logger
|
|
193
|
-
),
|
|
194
|
-
delete: (url, args, opts) => callServer(
|
|
195
|
-
axiosInstance,
|
|
196
|
-
mergeArgs(baseURL, url, "delete", args, opts, globalOptions),
|
|
197
|
-
logger
|
|
198
|
-
)
|
|
155
|
+
get: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "get", args, opts, globalOptions), logger),
|
|
156
|
+
post: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "post", args, opts, globalOptions), logger),
|
|
157
|
+
put: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "put", args, opts, globalOptions), logger),
|
|
158
|
+
patch: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "patch", args, opts, globalOptions), logger),
|
|
159
|
+
delete: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "delete", args, opts, globalOptions), logger)
|
|
199
160
|
};
|
|
200
|
-
return {
|
|
161
|
+
return __spreadProps(__spreadValues({}, client), {axiosInstance});
|
|
201
162
|
};
|
|
202
163
|
var callServer = async (axiosInstance, args, logger) => {
|
|
164
|
+
var _a, _b;
|
|
203
165
|
try {
|
|
204
166
|
const serializer = paramsSerializer(args.arrayFormat);
|
|
205
|
-
logger
|
|
206
|
-
logger
|
|
207
|
-
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
httpAgent: args.httpAgent,
|
|
221
|
-
timeout: args.timeout
|
|
222
|
-
}),
|
|
223
|
-
args.retry
|
|
224
|
-
);
|
|
225
|
-
return { headers, data };
|
|
167
|
+
logger == null ? void 0 : logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
|
|
168
|
+
logger == null ? void 0 : logger.debug(`[callServer] sample serialization: ${serializer({test: ["a", "b"]})}`);
|
|
169
|
+
const body = ((_a = args.method) == null ? void 0 : _a.toLowerCase()) === "get" || ((_b = args.method) == null ? void 0 : _b.toLowerCase()) === "delete" ? void 0 : args.body;
|
|
170
|
+
const {headers, data} = await _retry.retry.call(void 0, () => axiosInstance.request({
|
|
171
|
+
baseURL: args.baseUrl,
|
|
172
|
+
url: args.url,
|
|
173
|
+
method: args.method,
|
|
174
|
+
headers: args.headers,
|
|
175
|
+
params: args.params,
|
|
176
|
+
paramsSerializer: serializer,
|
|
177
|
+
data: body,
|
|
178
|
+
httpsAgent: args.httpsAgent,
|
|
179
|
+
httpAgent: args.httpAgent
|
|
180
|
+
}), args.retry);
|
|
181
|
+
return {headers, data};
|
|
226
182
|
} catch (error) {
|
|
227
|
-
throw (0,
|
|
183
|
+
throw _openapicore.fromAxiosError.call(void 0, error);
|
|
228
184
|
}
|
|
229
185
|
};
|
|
230
186
|
var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
|
|
@@ -241,23 +197,66 @@ var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
|
|
|
241
197
|
headers,
|
|
242
198
|
body,
|
|
243
199
|
retry: retry2,
|
|
244
|
-
arrayFormat: global
|
|
245
|
-
httpsAgent: extras
|
|
246
|
-
httpAgent: extras
|
|
247
|
-
timeout: extras?.timeout ?? global?.timeout
|
|
200
|
+
arrayFormat: global == null ? void 0 : global.arrayFormat,
|
|
201
|
+
httpsAgent: extras == null ? void 0 : extras.httpsAgent,
|
|
202
|
+
httpAgent: extras == null ? void 0 : extras.httpAgent
|
|
248
203
|
};
|
|
249
204
|
return merged;
|
|
250
205
|
};
|
|
251
|
-
var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a
|
|
252
|
-
var setParams = (url, params = {}) => Object.entries(params).reduce(
|
|
253
|
-
(url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`),
|
|
254
|
-
url
|
|
255
|
-
);
|
|
206
|
+
var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => (a == null ? void 0 : a[prop]) || {}));
|
|
207
|
+
var setParams = (url, params = {}) => Object.entries(params).reduce((url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`), url);
|
|
256
208
|
|
|
257
209
|
// src/index.ts
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
// src/graphql/client.ts
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
var _openapiauthiam = require('@sebspark/openapi-auth-iam');
|
|
217
|
+
var GatewayGraphqlClient = class {
|
|
218
|
+
constructor(args) {
|
|
219
|
+
this.uri = args.uri;
|
|
220
|
+
this.logger = args.logger;
|
|
221
|
+
this.options = {
|
|
222
|
+
timeout: 10 * 1e3,
|
|
223
|
+
authorizationTokenGenerator: async (url) => {
|
|
224
|
+
this.logger.debug(`Generating token for: ${this.uri}`);
|
|
225
|
+
return _openapiauthiam.apiGatewayTokenByUrlGenerator.call(void 0, args.apiKey)(url);
|
|
226
|
+
},
|
|
227
|
+
authorizationTokenRefresh: async (url) => {
|
|
228
|
+
this.logger.debug(`Refreshing token for: ${this.uri}`);
|
|
229
|
+
return _openapiauthiam.apiGatewayTokenRefresh.call(void 0, )(url);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
this.client = TypedClient(args.uri, this.options, this.logger);
|
|
233
|
+
}
|
|
234
|
+
async graphql(query, variables) {
|
|
235
|
+
try {
|
|
236
|
+
const response = await this.client.post("/graphql", {
|
|
237
|
+
body: {query: query.trim(), variables}
|
|
238
|
+
});
|
|
239
|
+
if (response.data.errors) {
|
|
240
|
+
this.logger.error(`Error posting graphql query to: ${this.uri}`);
|
|
241
|
+
throw new Error(response.data.errors.map((e) => e.message).join("\n"));
|
|
242
|
+
}
|
|
243
|
+
return response.data.data;
|
|
244
|
+
} catch (error) {
|
|
245
|
+
this.logger.error(`Error posting graphql: ${this.uri}`);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async isHealthy() {
|
|
250
|
+
try {
|
|
251
|
+
await this.client.get("/health");
|
|
252
|
+
return true;
|
|
253
|
+
} catch (error) {
|
|
254
|
+
this.logger.error(error);
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
exports.GatewayGraphqlClient = GatewayGraphqlClient; exports.TypedClient = TypedClient;
|
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,26 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
|
|
1
21
|
// src/client.ts
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
} from "@sebspark/openapi-core";
|
|
5
|
-
import { retry } from "@sebspark/retry";
|
|
22
|
+
import {fromAxiosError} from "@sebspark/openapi-core";
|
|
23
|
+
import {retry} from "@sebspark/retry";
|
|
6
24
|
import axios from "axios";
|
|
7
25
|
import createAuthRefreshInterceptor from "axios-auth-refresh";
|
|
8
26
|
|
|
@@ -62,53 +80,51 @@ var paramsSerializer = (format) => (params) => {
|
|
|
62
80
|
// src/client.ts
|
|
63
81
|
var TypedClient = (baseURL, globalOptions, logger) => {
|
|
64
82
|
const axiosInstance = axios.create();
|
|
65
|
-
logger
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
);
|
|
69
|
-
if (globalOptions?.authorizationTokenGenerator) {
|
|
70
|
-
logger?.debug("authorizationTokenGenerator is set");
|
|
83
|
+
logger == null ? void 0 : logger.debug("client initialized with arrayFormat", globalOptions == null ? void 0 : globalOptions.arrayFormat);
|
|
84
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) {
|
|
85
|
+
logger == null ? void 0 : logger.debug("authorizationTokenGenerator is set");
|
|
71
86
|
axiosInstance.interceptors.request.use(async (request) => {
|
|
72
87
|
const url = `${request.baseURL}${request.url}`;
|
|
73
|
-
logger
|
|
74
|
-
if (globalOptions
|
|
88
|
+
logger == null ? void 0 : logger.debug(`Intercepting request to ${url}`);
|
|
89
|
+
if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenGenerator) && url) {
|
|
75
90
|
try {
|
|
76
91
|
const authorizationTokenHeaders = await globalOptions.authorizationTokenGenerator(url);
|
|
77
92
|
if (authorizationTokenHeaders) {
|
|
78
93
|
for (const key of Object.keys(authorizationTokenHeaders)) {
|
|
79
94
|
const value = authorizationTokenHeaders[key];
|
|
80
|
-
logger
|
|
95
|
+
logger == null ? void 0 : logger.debug(`Setting header ${key} to ${value}`);
|
|
81
96
|
request.headers[key] = value;
|
|
82
97
|
}
|
|
83
98
|
}
|
|
84
99
|
} catch (error) {
|
|
85
|
-
logger
|
|
100
|
+
logger == null ? void 0 : logger.error(`Error generating token for URL: ${url}`);
|
|
86
101
|
throw error;
|
|
87
102
|
}
|
|
88
103
|
}
|
|
89
|
-
logger
|
|
90
|
-
logger
|
|
104
|
+
logger == null ? void 0 : logger.debug("Intercepted request:");
|
|
105
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(request, null, 2));
|
|
91
106
|
return request;
|
|
92
107
|
});
|
|
93
108
|
}
|
|
94
|
-
if (globalOptions
|
|
109
|
+
if (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) {
|
|
95
110
|
const refreshAuthLogic = async (failedRequest) => {
|
|
96
|
-
|
|
97
|
-
logger
|
|
111
|
+
var _a, _b;
|
|
112
|
+
logger == null ? void 0 : logger.debug("Failed request");
|
|
113
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(failedRequest, null, 2));
|
|
98
114
|
if (!axios.isAxiosError(failedRequest)) {
|
|
99
|
-
logger
|
|
115
|
+
logger == null ? void 0 : logger.error("Failed request is not an axios error");
|
|
100
116
|
return;
|
|
101
117
|
}
|
|
102
118
|
const axiosError = failedRequest;
|
|
103
|
-
logger
|
|
104
|
-
logger
|
|
105
|
-
const url = `${axiosError.config
|
|
106
|
-
if (globalOptions
|
|
107
|
-
logger
|
|
119
|
+
logger == null ? void 0 : logger.debug("Failed request config:");
|
|
120
|
+
logger == null ? void 0 : logger.debug(JSON.stringify(axiosError.config, null, 2));
|
|
121
|
+
const url = `${(_a = axiosError.config) == null ? void 0 : _a.baseURL}${(_b = axiosError.config) == null ? void 0 : _b.url}`;
|
|
122
|
+
if ((globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh) && url) {
|
|
123
|
+
logger == null ? void 0 : logger.debug(`Refreshing token for URL ${url}`);
|
|
108
124
|
try {
|
|
109
|
-
await globalOptions
|
|
125
|
+
await (globalOptions == null ? void 0 : globalOptions.authorizationTokenRefresh(url));
|
|
110
126
|
} catch (error) {
|
|
111
|
-
logger
|
|
127
|
+
logger == null ? void 0 : logger.error(`Error refreshing token for URL: ${url}`);
|
|
112
128
|
throw error;
|
|
113
129
|
}
|
|
114
130
|
}
|
|
@@ -136,58 +152,33 @@ var TypedClient = (baseURL, globalOptions, logger) => {
|
|
|
136
152
|
});
|
|
137
153
|
}
|
|
138
154
|
const client = {
|
|
139
|
-
get: (url, args, opts) => callServer(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
),
|
|
144
|
-
post: (url, args, opts) => callServer(
|
|
145
|
-
axiosInstance,
|
|
146
|
-
mergeArgs(baseURL, url, "post", args, opts, globalOptions),
|
|
147
|
-
logger
|
|
148
|
-
),
|
|
149
|
-
put: (url, args, opts) => callServer(
|
|
150
|
-
axiosInstance,
|
|
151
|
-
mergeArgs(baseURL, url, "put", args, opts, globalOptions),
|
|
152
|
-
logger
|
|
153
|
-
),
|
|
154
|
-
patch: (url, args, opts) => callServer(
|
|
155
|
-
axiosInstance,
|
|
156
|
-
mergeArgs(baseURL, url, "patch", args, opts, globalOptions),
|
|
157
|
-
logger
|
|
158
|
-
),
|
|
159
|
-
delete: (url, args, opts) => callServer(
|
|
160
|
-
axiosInstance,
|
|
161
|
-
mergeArgs(baseURL, url, "delete", args, opts, globalOptions),
|
|
162
|
-
logger
|
|
163
|
-
)
|
|
155
|
+
get: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "get", args, opts, globalOptions), logger),
|
|
156
|
+
post: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "post", args, opts, globalOptions), logger),
|
|
157
|
+
put: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "put", args, opts, globalOptions), logger),
|
|
158
|
+
patch: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "patch", args, opts, globalOptions), logger),
|
|
159
|
+
delete: (url, args, opts) => callServer(axiosInstance, mergeArgs(baseURL, url, "delete", args, opts, globalOptions), logger)
|
|
164
160
|
};
|
|
165
|
-
return {
|
|
161
|
+
return __spreadProps(__spreadValues({}, client), {axiosInstance});
|
|
166
162
|
};
|
|
167
163
|
var callServer = async (axiosInstance, args, logger) => {
|
|
164
|
+
var _a, _b;
|
|
168
165
|
try {
|
|
169
166
|
const serializer = paramsSerializer(args.arrayFormat);
|
|
170
|
-
logger
|
|
171
|
-
logger
|
|
172
|
-
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
httpAgent: args.httpAgent,
|
|
186
|
-
timeout: args.timeout
|
|
187
|
-
}),
|
|
188
|
-
args.retry
|
|
189
|
-
);
|
|
190
|
-
return { headers, data };
|
|
167
|
+
logger == null ? void 0 : logger.debug(`[callServer] typeof serializer: ${typeof serializer}`);
|
|
168
|
+
logger == null ? void 0 : logger.debug(`[callServer] sample serialization: ${serializer({test: ["a", "b"]})}`);
|
|
169
|
+
const body = ((_a = args.method) == null ? void 0 : _a.toLowerCase()) === "get" || ((_b = args.method) == null ? void 0 : _b.toLowerCase()) === "delete" ? void 0 : args.body;
|
|
170
|
+
const {headers, data} = await retry(() => axiosInstance.request({
|
|
171
|
+
baseURL: args.baseUrl,
|
|
172
|
+
url: args.url,
|
|
173
|
+
method: args.method,
|
|
174
|
+
headers: args.headers,
|
|
175
|
+
params: args.params,
|
|
176
|
+
paramsSerializer: serializer,
|
|
177
|
+
data: body,
|
|
178
|
+
httpsAgent: args.httpsAgent,
|
|
179
|
+
httpAgent: args.httpAgent
|
|
180
|
+
}), args.retry);
|
|
181
|
+
return {headers, data};
|
|
191
182
|
} catch (error) {
|
|
192
183
|
throw fromAxiosError(error);
|
|
193
184
|
}
|
|
@@ -206,21 +197,66 @@ var mergeArgs = (baseUrl, url, method, requestArgs, extras, global) => {
|
|
|
206
197
|
headers,
|
|
207
198
|
body,
|
|
208
199
|
retry: retry2,
|
|
209
|
-
arrayFormat: global
|
|
210
|
-
httpsAgent: extras
|
|
211
|
-
httpAgent: extras
|
|
212
|
-
timeout: extras?.timeout ?? global?.timeout
|
|
200
|
+
arrayFormat: global == null ? void 0 : global.arrayFormat,
|
|
201
|
+
httpsAgent: extras == null ? void 0 : extras.httpsAgent,
|
|
202
|
+
httpAgent: extras == null ? void 0 : extras.httpAgent
|
|
213
203
|
};
|
|
214
204
|
return merged;
|
|
215
205
|
};
|
|
216
|
-
var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => a
|
|
217
|
-
var setParams = (url, params = {}) => Object.entries(params).reduce(
|
|
218
|
-
(url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`),
|
|
219
|
-
url
|
|
220
|
-
);
|
|
206
|
+
var merge = (prop, ...args) => Object.assign({}, ...args.map((a) => (a == null ? void 0 : a[prop]) || {}));
|
|
207
|
+
var setParams = (url, params = {}) => Object.entries(params).reduce((url2, [key, val]) => url2.replace(new RegExp(`/:${key}(?!\\w|\\d)`, "g"), `/${val}`), url);
|
|
221
208
|
|
|
222
209
|
// src/index.ts
|
|
223
210
|
export * from "@sebspark/retry";
|
|
211
|
+
|
|
212
|
+
// src/graphql/client.ts
|
|
213
|
+
import {
|
|
214
|
+
apiGatewayTokenByUrlGenerator,
|
|
215
|
+
apiGatewayTokenRefresh
|
|
216
|
+
} from "@sebspark/openapi-auth-iam";
|
|
217
|
+
var GatewayGraphqlClient = class {
|
|
218
|
+
constructor(args) {
|
|
219
|
+
this.uri = args.uri;
|
|
220
|
+
this.logger = args.logger;
|
|
221
|
+
this.options = {
|
|
222
|
+
timeout: 10 * 1e3,
|
|
223
|
+
authorizationTokenGenerator: async (url) => {
|
|
224
|
+
this.logger.debug(`Generating token for: ${this.uri}`);
|
|
225
|
+
return apiGatewayTokenByUrlGenerator(args.apiKey)(url);
|
|
226
|
+
},
|
|
227
|
+
authorizationTokenRefresh: async (url) => {
|
|
228
|
+
this.logger.debug(`Refreshing token for: ${this.uri}`);
|
|
229
|
+
return apiGatewayTokenRefresh()(url);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
this.client = TypedClient(args.uri, this.options, this.logger);
|
|
233
|
+
}
|
|
234
|
+
async graphql(query, variables) {
|
|
235
|
+
try {
|
|
236
|
+
const response = await this.client.post("/graphql", {
|
|
237
|
+
body: {query: query.trim(), variables}
|
|
238
|
+
});
|
|
239
|
+
if (response.data.errors) {
|
|
240
|
+
this.logger.error(`Error posting graphql query to: ${this.uri}`);
|
|
241
|
+
throw new Error(response.data.errors.map((e) => e.message).join("\n"));
|
|
242
|
+
}
|
|
243
|
+
return response.data.data;
|
|
244
|
+
} catch (error) {
|
|
245
|
+
this.logger.error(`Error posting graphql: ${this.uri}`);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async isHealthy() {
|
|
250
|
+
try {
|
|
251
|
+
await this.client.get("/health");
|
|
252
|
+
return true;
|
|
253
|
+
} catch (error) {
|
|
254
|
+
this.logger.error(error);
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
224
259
|
export {
|
|
260
|
+
GatewayGraphqlClient,
|
|
225
261
|
TypedClient
|
|
226
262
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sebspark/openapi-client",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -19,14 +19,16 @@
|
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@sebspark/openapi-typegen": "*",
|
|
22
|
-
"nock": "14.0.
|
|
22
|
+
"nock": "14.0.5",
|
|
23
23
|
"tsconfig": "*",
|
|
24
|
-
"
|
|
24
|
+
"tsup-node": "^0.1.0",
|
|
25
|
+
"vitest": "3.2.4"
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
28
|
+
"@sebspark/openapi-auth-iam": "*",
|
|
27
29
|
"@sebspark/openapi-core": "*",
|
|
28
30
|
"@sebspark/retry": "*",
|
|
29
|
-
"axios": "1.
|
|
31
|
+
"axios": "1.10.0",
|
|
30
32
|
"axios-auth-refresh": "3.3.6"
|
|
31
33
|
}
|
|
32
34
|
}
|
package/dist/index.d.mts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { BaseClient, ClientOptions } from '@sebspark/openapi-core';
|
|
2
|
-
import { AxiosInstance } from 'axios';
|
|
3
|
-
import { Logger } from 'winston';
|
|
4
|
-
export * from '@sebspark/retry';
|
|
5
|
-
|
|
6
|
-
type TypedAxiosClient<T> = T & {
|
|
7
|
-
axiosInstance: AxiosInstance;
|
|
8
|
-
};
|
|
9
|
-
declare const TypedClient: <C extends Partial<BaseClient>>(baseURL: string, globalOptions?: ClientOptions, logger?: Logger) => TypedAxiosClient<C>;
|
|
10
|
-
|
|
11
|
-
export { type TypedAxiosClient, TypedClient };
|