@olc-sales/api-client 1.0.0 → 1.1.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/README.md +5 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/jsonApiClient.d.ts +13 -4
- package/dist/jsonApiClient.d.ts.map +1 -1
- package/dist/jsonApiClient.js +50 -4
- package/dist/jsonApiClient.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,8 +7,11 @@ copies in `olc-events`, `olc-search`, `olc-notifications`, `olc-data` and
|
|
|
7
7
|
- `createJsonApiClient(opts)` – `getResource` / `getResources` / `getRelated`
|
|
8
8
|
against an OLC JSON API. 404 on single/related fetches resolves to `null`.
|
|
9
9
|
`version: 'auto'` uses v2 for capitalised resource types, else v1.
|
|
10
|
-
`maxConcurrent` optionally throttles via Bottleneck.
|
|
11
|
-
|
|
10
|
+
`maxConcurrent` optionally throttles via Bottleneck. Also has
|
|
11
|
+
`createResource(type, data, headers?)` / `updateResource(type, id, data,
|
|
12
|
+
headers?)` (JSON:API body, 404 also resolves to `null`),
|
|
13
|
+
`retryOnAuthFailure` (one retry with a fresh `getToken()` on 401/403) and an
|
|
14
|
+
optional `logger` (`info`/`error`). Memoisation is left to the consumer.
|
|
12
15
|
- `createServiceToken(tokenUri, clientId, clientSecret)` – OAuth
|
|
13
16
|
client-credentials token provider (cached until 1 min before expiry,
|
|
14
17
|
concurrent callers share one fetch). Pass it as `getToken`.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createJsonApiClient } from './jsonApiClient';
|
|
2
|
-
export type { JsonApiClient, JsonApiClientOptions, Query } from './jsonApiClient';
|
|
2
|
+
export type { JsonApiClient, JsonApiClientOptions, Logger, Query } from './jsonApiClient';
|
|
3
3
|
export { createServiceToken } from './serviceToken';
|
|
4
4
|
export type { TokenProvider } from './serviceToken';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/jsonApiClient.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { TokenProvider } from './serviceToken';
|
|
2
2
|
export interface JsonApiClientOptions {
|
|
3
3
|
baseUrl: string;
|
|
4
|
-
/** Sent as `X-Application-ID
|
|
5
|
-
applicationId
|
|
4
|
+
/** Sent as `X-Application-ID` when set. */
|
|
5
|
+
applicationId?: string;
|
|
6
6
|
/** Needed when developing locally and connecting through the API gateway. */
|
|
7
7
|
apiKey?: string;
|
|
8
8
|
bearerToken?: string;
|
|
@@ -13,14 +13,23 @@ export interface JsonApiClientOptions {
|
|
|
13
13
|
headers?: Record<string, string>;
|
|
14
14
|
/** Caps in-flight requests when set. */
|
|
15
15
|
maxConcurrent?: number;
|
|
16
|
+
/** Retry once with a fresh `getToken()` when a request gets a 401/403. */
|
|
17
|
+
retryOnAuthFailure?: boolean;
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
export interface Logger {
|
|
21
|
+
info: (...args: any[]) => void;
|
|
22
|
+
error: (...args: any[]) => void;
|
|
16
23
|
}
|
|
17
24
|
export type Query = Record<string, unknown>;
|
|
18
25
|
type Headers = Record<string, string>;
|
|
19
26
|
export interface JsonApiClient {
|
|
20
|
-
getResource: (type: string, id: string, query?: Query, headers?: Headers) => Promise<any>;
|
|
27
|
+
getResource: (type: string, id: string, query?: Query, headers?: Headers, encode?: boolean) => Promise<any>;
|
|
21
28
|
getResources: (type: string, query?: Query, headers?: Headers) => Promise<any>;
|
|
22
29
|
getRelated: (type: string, id: string, relationship: string, query?: Query, headers?: Headers) => Promise<any>;
|
|
30
|
+
updateResource: (type: string, id: string, data: unknown, headers?: Headers) => Promise<any>;
|
|
31
|
+
createResource: (type: string, data: unknown, headers?: Headers) => Promise<any>;
|
|
23
32
|
}
|
|
24
|
-
export declare const createJsonApiClient: ({ baseUrl, applicationId, apiKey, bearerToken, getToken, version, headers: extraHeaders, maxConcurrent }: JsonApiClientOptions) => JsonApiClient;
|
|
33
|
+
export declare const createJsonApiClient: ({ baseUrl, applicationId, apiKey, bearerToken, getToken, version, headers: extraHeaders, maxConcurrent, retryOnAuthFailure, logger }: JsonApiClientOptions) => JsonApiClient;
|
|
25
34
|
export {};
|
|
26
35
|
//# sourceMappingURL=jsonApiClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonApiClient.d.ts","sourceRoot":"","sources":["../src/jsonApiClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,
|
|
1
|
+
{"version":3,"file":"jsonApiClient.d.ts","sourceRoot":"","sources":["../src/jsonApiClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,sEAAsE;IACtE,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChC;AAED,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC3C,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAErC,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,MAAM,CAAC,EAAE,OAAO,KACb,OAAO,CAAC,GAAG,CAAC,CAAA;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAC9E,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,KAAK,EACb,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,GAAG,CAAC,CAAA;IACjB,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,GAAG,CAAC,CAAA;IACjB,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,GAAG,CAAC,CAAA;CAClB;AAYD,eAAO,MAAM,mBAAmB,GAAI,sIAWjC,oBAAoB,KAAG,aAyHzB,CAAA"}
|
package/dist/jsonApiClient.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.createJsonApiClient = void 0;
|
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
const bottleneck_1 = __importDefault(require("bottleneck"));
|
|
9
9
|
const qs_1 = __importDefault(require("qs"));
|
|
10
|
+
const JSON_API_HEADERS = { 'Content-Type': 'application/vnd.api+json' };
|
|
10
11
|
// A missing resource is a null result rather than an error.
|
|
11
12
|
const handleGetFailure = (err) => {
|
|
12
13
|
if (err.response && err.response.status === 404) {
|
|
@@ -14,9 +15,9 @@ const handleGetFailure = (err) => {
|
|
|
14
15
|
}
|
|
15
16
|
throw err;
|
|
16
17
|
};
|
|
17
|
-
const createJsonApiClient = ({ baseUrl, applicationId, apiKey, bearerToken, getToken, version = 'v1', headers: extraHeaders = {}, maxConcurrent }) => {
|
|
18
|
+
const createJsonApiClient = ({ baseUrl, applicationId, apiKey, bearerToken, getToken, version = 'v1', headers: extraHeaders = {}, maxConcurrent, retryOnAuthFailure = false, logger }) => {
|
|
18
19
|
const defaultHeaders = {
|
|
19
|
-
'X-Application-ID': applicationId,
|
|
20
|
+
...(applicationId && { 'X-Application-ID': applicationId }),
|
|
20
21
|
...extraHeaders
|
|
21
22
|
};
|
|
22
23
|
if (apiKey) {
|
|
@@ -31,6 +32,39 @@ const createJsonApiClient = ({ baseUrl, applicationId, apiKey, bearerToken, getT
|
|
|
31
32
|
request.headers.Authorization = `Bearer ${await getToken()}`;
|
|
32
33
|
return request;
|
|
33
34
|
});
|
|
35
|
+
if (retryOnAuthFailure) {
|
|
36
|
+
axiosInstance.interceptors.response.use(undefined, async (error) => {
|
|
37
|
+
const config = error.config;
|
|
38
|
+
const status = error.response && error.response.status;
|
|
39
|
+
if ((status === 401 || status === 403) && config && !config._retry) {
|
|
40
|
+
config._retry = true;
|
|
41
|
+
return axiosInstance.request(config);
|
|
42
|
+
}
|
|
43
|
+
return Promise.reject(error);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (logger) {
|
|
48
|
+
axiosInstance.interceptors.response.use(response => {
|
|
49
|
+
logger.info({
|
|
50
|
+
type: 'client-response',
|
|
51
|
+
baseUrl,
|
|
52
|
+
status: response.status,
|
|
53
|
+
method: response.config.method,
|
|
54
|
+
url: response.config.url,
|
|
55
|
+
retry: response.config._retry || false,
|
|
56
|
+
success: response.statusText === 'OK'
|
|
57
|
+
}, 'jsonApiClient');
|
|
58
|
+
return response;
|
|
59
|
+
}, error => {
|
|
60
|
+
logger.error({
|
|
61
|
+
type: 'client-response-error',
|
|
62
|
+
baseUrl,
|
|
63
|
+
status: (error.response && error.response.status) || 500,
|
|
64
|
+
success: false
|
|
65
|
+
}, 'jsonApiClient');
|
|
66
|
+
return Promise.reject(error);
|
|
67
|
+
});
|
|
34
68
|
}
|
|
35
69
|
const limiter = maxConcurrent ? new bottleneck_1.default({ maxConcurrent }) : null;
|
|
36
70
|
const schedule = (fn) => limiter ? limiter.schedule(fn) : fn();
|
|
@@ -38,10 +72,22 @@ const createJsonApiClient = ({ baseUrl, applicationId, apiKey, bearerToken, getT
|
|
|
38
72
|
const get = (uri, headers) => schedule(() => axiosInstance
|
|
39
73
|
.get(uri, { headers })
|
|
40
74
|
.then(res => res.data));
|
|
75
|
+
const write = (method, uri, data, headers) => schedule(() => axiosInstance
|
|
76
|
+
.request({
|
|
77
|
+
method,
|
|
78
|
+
url: uri,
|
|
79
|
+
data: JSON.stringify({ data }),
|
|
80
|
+
headers
|
|
81
|
+
})
|
|
82
|
+
.then(res => res.data)).catch(handleGetFailure);
|
|
41
83
|
return {
|
|
42
|
-
getResource: (type, id, query = {}, headers = {}) => get(`${baseUrl}/${apiVersion(type)}/${type}/${id}?${qs_1.default.stringify(query
|
|
84
|
+
getResource: (type, id, query = {}, headers = {}, encode = true) => get(`${baseUrl}/${apiVersion(type)}/${type}/${id}?${qs_1.default.stringify(query, {
|
|
85
|
+
encode
|
|
86
|
+
})}`, headers).catch(handleGetFailure),
|
|
43
87
|
getResources: (type, query = {}, headers = {}) => get(`${baseUrl}/${apiVersion(type)}/${type}?${qs_1.default.stringify(query)}`, headers),
|
|
44
|
-
getRelated: (type, id, relationship, query = {}, headers = {}) => get(`${baseUrl}/${apiVersion(type)}/${type}/${id}/${relationship}?${qs_1.default.stringify(query)}`, headers).catch(handleGetFailure)
|
|
88
|
+
getRelated: (type, id, relationship, query = {}, headers = {}) => get(`${baseUrl}/${apiVersion(type)}/${type}/${id}/${relationship}?${qs_1.default.stringify(query)}`, headers).catch(handleGetFailure),
|
|
89
|
+
updateResource: (type, id, data, headers = JSON_API_HEADERS) => write('patch', `${baseUrl}/${apiVersion(type)}/${type}/${id}`, data, headers),
|
|
90
|
+
createResource: (type, data, headers = JSON_API_HEADERS) => write('post', `${baseUrl}/${apiVersion(type)}/${type}/`, data, headers)
|
|
45
91
|
};
|
|
46
92
|
};
|
|
47
93
|
exports.createJsonApiClient = createJsonApiClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonApiClient.js","sourceRoot":"","sources":["../src/jsonApiClient.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AACjD,4DAAmC;AACnC,4CAAmB;
|
|
1
|
+
{"version":3,"file":"jsonApiClient.js","sourceRoot":"","sources":["../src/jsonApiClient.ts"],"names":[],"mappings":"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"}
|