@hahnpro/hpc-api 2024.4.0-1 → 2025.2.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 +1 -1
- package/README.md +502 -6
- package/package.json +7 -4
- package/src/index.js +27 -20
- package/src/index.js.map +1 -0
- package/src/lib/Queue.js +21 -10
- package/src/lib/Queue.js.map +1 -0
- package/src/lib/api-base.js +15 -3
- package/src/lib/api-base.js.map +1 -0
- package/src/lib/api.js +53 -42
- package/src/lib/api.js.map +1 -0
- package/src/lib/asset.interface.js +6 -1
- package/src/lib/asset.interface.js.map +1 -0
- package/src/lib/asset.service.js +45 -20
- package/src/lib/asset.service.js.map +1 -0
- package/src/lib/assettypes.service.js +26 -12
- package/src/lib/assettypes.service.js.map +1 -0
- package/src/lib/content.interface.js +15 -3
- package/src/lib/content.interface.js.map +1 -0
- package/src/lib/content.service.js +62 -32
- package/src/lib/content.service.js.map +1 -0
- package/src/lib/data.interface.js +13 -1
- package/src/lib/data.interface.js.map +1 -0
- package/src/lib/data.service.js +45 -24
- package/src/lib/data.service.js.map +1 -0
- package/src/lib/endpoint.interface.js +6 -1
- package/src/lib/endpoint.interface.js.map +1 -0
- package/src/lib/endpoint.service.js +16 -4
- package/src/lib/endpoint.service.js.map +1 -0
- package/src/lib/events.interface.js +6 -1
- package/src/lib/events.interface.js.map +1 -0
- package/src/lib/events.service.js +16 -4
- package/src/lib/events.service.js.map +1 -0
- package/src/lib/flow-deployment.interface.js +6 -1
- package/src/lib/flow-deployment.interface.js.map +1 -0
- package/src/lib/flow-deployment.service.js +58 -25
- package/src/lib/flow-deployment.service.js.map +1 -0
- package/src/lib/flow-function.interface.js +6 -1
- package/src/lib/flow-function.interface.js.map +1 -0
- package/src/lib/flow-function.service.js +20 -6
- package/src/lib/flow-function.service.js.map +1 -0
- package/src/lib/flow-module.interface.js +6 -1
- package/src/lib/flow-module.interface.js.map +1 -0
- package/src/lib/flow-module.service.js +20 -6
- package/src/lib/flow-module.service.js.map +1 -0
- package/src/lib/flow.interface.js +6 -1
- package/src/lib/flow.interface.js.map +1 -0
- package/src/lib/flow.service.js +27 -13
- package/src/lib/flow.service.js.map +1 -0
- package/src/lib/http.service.js +101 -66
- package/src/lib/http.service.js.map +1 -0
- package/src/lib/label.interface.js +6 -1
- package/src/lib/label.interface.js.map +1 -0
- package/src/lib/label.service.js +17 -5
- package/src/lib/label.service.js.map +1 -0
- package/src/lib/mock/api-base.mock.js +17 -6
- package/src/lib/mock/api-base.mock.js.map +1 -0
- package/src/lib/mock/api.mock.js +204 -193
- package/src/lib/mock/api.mock.js.map +1 -0
- package/src/lib/mock/asset.mock.service.js +55 -38
- package/src/lib/mock/asset.mock.service.js.map +1 -0
- package/src/lib/mock/assetTypes.mock.service.js +45 -27
- package/src/lib/mock/assetTypes.mock.service.js.map +1 -0
- package/src/lib/mock/content.mock.service.js +45 -37
- package/src/lib/mock/content.mock.service.js.map +1 -0
- package/src/lib/mock/data.mock.service.js +49 -40
- package/src/lib/mock/data.mock.service.js.map +1 -0
- package/src/lib/mock/endpoint.mock.service.js +17 -5
- package/src/lib/mock/endpoint.mock.service.js.map +1 -0
- package/src/lib/mock/events.mock.service.js +16 -4
- package/src/lib/mock/events.mock.service.js.map +1 -0
- package/src/lib/mock/flow-deployment.mock.service.js +81 -36
- package/src/lib/mock/flow-deployment.mock.service.js.map +1 -0
- package/src/lib/mock/flow-functions.mock.service.js +33 -20
- package/src/lib/mock/flow-functions.mock.service.js.map +1 -0
- package/src/lib/mock/flow-modules.mock.service.js +18 -6
- package/src/lib/mock/flow-modules.mock.service.js.map +1 -0
- package/src/lib/mock/flow.mock.service.js +44 -29
- package/src/lib/mock/flow.mock.service.js.map +1 -0
- package/src/lib/mock/index.js +18 -11
- package/src/lib/mock/index.js.map +1 -0
- package/src/lib/mock/label.mock.service.js +17 -5
- package/src/lib/mock/label.mock.service.js.map +1 -0
- package/src/lib/mock/notification.mock.service.js +16 -4
- package/src/lib/mock/notification.mock.service.js.map +1 -0
- package/src/lib/mock/secret.mock.service.js +24 -12
- package/src/lib/mock/secret.mock.service.js.map +1 -0
- package/src/lib/mock/task.mock.service.js +24 -12
- package/src/lib/mock/task.mock.service.js.map +1 -0
- package/src/lib/mock/timeseries.mock.service.js +88 -43
- package/src/lib/mock/timeseries.mock.service.js.map +1 -0
- package/src/lib/mock/trash.mock.service.js +28 -14
- package/src/lib/mock/trash.mock.service.js.map +1 -0
- package/src/lib/mock/user.mock.service.js +17 -6
- package/src/lib/mock/user.mock.service.js.map +1 -0
- package/src/lib/mock/vault.mock.service.js +17 -5
- package/src/lib/mock/vault.mock.service.js.map +1 -0
- package/src/lib/notification.interface.js +6 -1
- package/src/lib/notification.interface.js.map +1 -0
- package/src/lib/notification.service.js +16 -4
- package/src/lib/notification.service.js.map +1 -0
- package/src/lib/proxy.service.js +19 -7
- package/src/lib/proxy.service.js.map +1 -0
- package/src/lib/resource.interface.js +6 -1
- package/src/lib/resource.interface.js.map +1 -0
- package/src/lib/schema.interface.js +6 -1
- package/src/lib/schema.interface.js.map +1 -0
- package/src/lib/secret.interface.js +6 -1
- package/src/lib/secret.interface.js.map +1 -0
- package/src/lib/secret.service.js +23 -11
- package/src/lib/secret.service.js.map +1 -0
- package/src/lib/storage.interface.js +6 -1
- package/src/lib/storage.interface.js.map +1 -0
- package/src/lib/task.interface.js +6 -1
- package/src/lib/task.interface.js.map +1 -0
- package/src/lib/task.service.js +23 -11
- package/src/lib/task.service.js.map +1 -0
- package/src/lib/timeseries.interface.js +6 -1
- package/src/lib/timeseries.interface.js.map +1 -0
- package/src/lib/timeseries.service.js +97 -66
- package/src/lib/timeseries.service.js.map +1 -0
- package/src/lib/token-set.js +15 -3
- package/src/lib/token-set.js.map +1 -0
- package/src/lib/trash.service.js +23 -5
- package/src/lib/trash.service.js.map +1 -0
- package/src/lib/user-settings.interface.js +6 -1
- package/src/lib/user-settings.interface.js.map +1 -0
- package/src/lib/user.service.js +18 -7
- package/src/lib/user.service.js.map +1 -0
- package/src/lib/vault.interface.js +6 -1
- package/src/lib/vault.interface.js.map +1 -0
- package/src/lib/vault.service.js +23 -6
- package/src/lib/vault.service.js.map +1 -0
package/src/lib/http.service.js
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "HttpClient", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return HttpClient;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
|
|
12
|
+
const _axios = /*#__PURE__*/ _interop_require_default._(require("axios"));
|
|
13
|
+
const _eventsource = require("eventsource");
|
|
14
|
+
const _jose = require("jose");
|
|
15
|
+
const _Queue = require("./Queue");
|
|
16
|
+
const _tokenset = require("./token-set");
|
|
17
|
+
let HttpClient = class HttpClient {
|
|
18
|
+
constructor(baseURL, authBaseURL, realm, clientId, clientSecret, tokenSubject){
|
|
8
19
|
this.baseURL = baseURL;
|
|
9
20
|
this.authBaseURL = authBaseURL;
|
|
10
21
|
this.realm = realm;
|
|
@@ -13,24 +24,30 @@ export class HttpClient {
|
|
|
13
24
|
this.tokenSubject = tokenSubject;
|
|
14
25
|
this.discoveredIssuers = new Map();
|
|
15
26
|
this.eventSourcesMap = new Map();
|
|
16
|
-
this.getQueueStats = ()
|
|
17
|
-
this.delete = (url, config)
|
|
18
|
-
this.get = (url, config)
|
|
19
|
-
this.post = (url, data, config)
|
|
20
|
-
this.put = (url, data, config)
|
|
21
|
-
this.request = (method, url, config = {}, data)
|
|
22
|
-
return this.requestQueue.add(()
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
this.getQueueStats = ()=>this.requestQueue?.getStats();
|
|
28
|
+
this.delete = (url, config)=>this.request('DELETE', url, config);
|
|
29
|
+
this.get = (url, config)=>this.request('GET', url, config);
|
|
30
|
+
this.post = (url, data, config)=>this.request('POST', url, config, data);
|
|
31
|
+
this.put = (url, data, config)=>this.request('PUT', url, config, data);
|
|
32
|
+
this.request = (method, url, config = {}, data)=>{
|
|
33
|
+
return this.requestQueue.add(()=>new Promise((resolve, reject)=>{
|
|
34
|
+
const tokenP = config.token ? Promise.resolve(config.token) : this.getAccessToken();
|
|
35
|
+
tokenP.then((token)=>{
|
|
36
|
+
const headers = {
|
|
37
|
+
Authorization: `Bearer ${token}`,
|
|
38
|
+
...config.headers
|
|
39
|
+
};
|
|
40
|
+
return this.axiosInstance.request({
|
|
41
|
+
...config,
|
|
42
|
+
headers,
|
|
43
|
+
method,
|
|
44
|
+
url,
|
|
45
|
+
data
|
|
46
|
+
});
|
|
47
|
+
}).then((response)=>resolve(response.data)).catch(reject);
|
|
48
|
+
}));
|
|
32
49
|
};
|
|
33
|
-
this.getAccessToken = async (forceRefresh = false)
|
|
50
|
+
this.getAccessToken = async (forceRefresh = false)=>{
|
|
34
51
|
let accessToken;
|
|
35
52
|
if (forceRefresh || !this.tokenSet || this.tokenSet.isExpired()) {
|
|
36
53
|
if (this.tokenSet?.provided) {
|
|
@@ -38,8 +55,7 @@ export class HttpClient {
|
|
|
38
55
|
}
|
|
39
56
|
this.tokenSet = await this.requestAccessToken();
|
|
40
57
|
accessToken = this.tokenSet.accessToken;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
58
|
+
} else {
|
|
43
59
|
accessToken = this.tokenSet.accessToken;
|
|
44
60
|
}
|
|
45
61
|
if (this.tokenSubject) {
|
|
@@ -47,36 +63,47 @@ export class HttpClient {
|
|
|
47
63
|
this.exchangedTokenSet = await this.exchangeAccessToken(accessToken);
|
|
48
64
|
}
|
|
49
65
|
return this.exchangedTokenSet.accessToken;
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
66
|
+
} else {
|
|
52
67
|
return accessToken;
|
|
53
68
|
}
|
|
54
69
|
};
|
|
55
|
-
this.axiosInstance =
|
|
56
|
-
|
|
57
|
-
|
|
70
|
+
this.axiosInstance = _axios.default.create({
|
|
71
|
+
baseURL,
|
|
72
|
+
timeout: 60000
|
|
73
|
+
});
|
|
74
|
+
this.authAxiosInstance = _axios.default.create({
|
|
75
|
+
baseURL: authBaseURL || baseURL,
|
|
76
|
+
timeout: 10000
|
|
77
|
+
});
|
|
78
|
+
this.requestQueue = new _Queue.Queue({
|
|
79
|
+
concurrency: 1,
|
|
80
|
+
timeout: 70000,
|
|
81
|
+
throwOnTimeout: true
|
|
82
|
+
});
|
|
58
83
|
}
|
|
59
84
|
async addEventSource(url, listener, errorListener, options = {}) {
|
|
60
85
|
const id = generateUUID();
|
|
61
|
-
const errListener = errorListener
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
throw new Error(JSON.stringify(event, null, 2));
|
|
65
|
-
};
|
|
86
|
+
const errListener = errorListener ? errorListener : (event)=>{
|
|
87
|
+
throw new Error(JSON.stringify(event, null, 2));
|
|
88
|
+
};
|
|
66
89
|
const token = options.token ? options.token : await this.getAccessToken();
|
|
67
|
-
const es = new EventSource(`${this.baseURL}${url}`, {
|
|
68
|
-
fetch: (input, init)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
const es = new _eventsource.EventSource(`${this.baseURL}${url}`, {
|
|
91
|
+
fetch: (input, init)=>fetch(input, {
|
|
92
|
+
...init,
|
|
93
|
+
headers: {
|
|
94
|
+
...init.headers,
|
|
95
|
+
Authorization: 'Bearer ' + token
|
|
96
|
+
}
|
|
97
|
+
})
|
|
75
98
|
});
|
|
76
99
|
es.addEventListener('message', listener);
|
|
77
100
|
es.addEventListener('error', errListener);
|
|
78
101
|
// the listeners have to be saved otherwise they cannot be removed
|
|
79
|
-
this.eventSourcesMap.set(id, {
|
|
102
|
+
this.eventSourcesMap.set(id, {
|
|
103
|
+
eventSource: es,
|
|
104
|
+
listener,
|
|
105
|
+
errListener
|
|
106
|
+
});
|
|
80
107
|
return id;
|
|
81
108
|
}
|
|
82
109
|
destroyEventSource(id) {
|
|
@@ -91,14 +118,12 @@ export class HttpClient {
|
|
|
91
118
|
this.eventSourcesMap.delete(id);
|
|
92
119
|
}
|
|
93
120
|
destroyAllEventSources() {
|
|
94
|
-
for (const key of this.eventSourcesMap.keys())
|
|
121
|
+
for (const key of this.eventSourcesMap.keys()){
|
|
95
122
|
this.destroyEventSource(key);
|
|
96
123
|
}
|
|
97
124
|
}
|
|
98
125
|
validateIssuer(issuer) {
|
|
99
|
-
if (!issuer.issuer ||
|
|
100
|
-
!issuer.grant_types_supported?.includes('client_credentials') ||
|
|
101
|
-
!issuer.token_endpoint_auth_methods_supported?.includes('client_secret_jwt')) {
|
|
126
|
+
if (!issuer.issuer || !issuer.grant_types_supported?.includes('client_credentials') || !issuer.token_endpoint_auth_methods_supported?.includes('client_secret_jwt')) {
|
|
102
127
|
throw new Error('Issuer does not support client_secret_jwt');
|
|
103
128
|
}
|
|
104
129
|
return issuer;
|
|
@@ -110,7 +135,9 @@ export class HttpClient {
|
|
|
110
135
|
const wellKnownUri = `${uri}/.well-known/openid-configuration`;
|
|
111
136
|
const issuerResponse = await this.authAxiosInstance.get(wellKnownUri, {
|
|
112
137
|
responseType: 'json',
|
|
113
|
-
headers: {
|
|
138
|
+
headers: {
|
|
139
|
+
Accept: 'application/json'
|
|
140
|
+
}
|
|
114
141
|
});
|
|
115
142
|
const validIssuer = this.validateIssuer(issuerResponse.data);
|
|
116
143
|
this.discoveredIssuers.set(uri, validIssuer);
|
|
@@ -119,38 +146,44 @@ export class HttpClient {
|
|
|
119
146
|
async requestAccessToken(additionalOpts = {}) {
|
|
120
147
|
const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);
|
|
121
148
|
const timestamp = Date.now() / 1000;
|
|
122
|
-
const audience = [
|
|
149
|
+
const audience = [
|
|
150
|
+
...new Set([
|
|
151
|
+
issuer.issuer,
|
|
152
|
+
issuer.token_endpoint
|
|
153
|
+
].filter(Boolean))
|
|
154
|
+
];
|
|
123
155
|
const assertionPayload = {
|
|
124
156
|
iat: timestamp,
|
|
125
157
|
exp: timestamp + 60,
|
|
126
158
|
jti: generateUUID(),
|
|
127
159
|
iss: this.clientId,
|
|
128
160
|
sub: this.clientId,
|
|
129
|
-
aud: audience
|
|
161
|
+
aud: audience
|
|
130
162
|
};
|
|
131
163
|
const supportedAlgos = issuer.token_endpoint_auth_signing_alg_values_supported;
|
|
132
|
-
const alg = issuer.token_endpoint_auth_signing_alg ??
|
|
133
|
-
(Array.isArray(supportedAlgos) && supportedAlgos.find((signAlg) => /^HS(?:256|384|512)/.test(signAlg)));
|
|
164
|
+
const alg = issuer.token_endpoint_auth_signing_alg ?? (Array.isArray(supportedAlgos) && supportedAlgos.find((signAlg)=>/^HS(?:256|384|512)/.test(signAlg)));
|
|
134
165
|
if (!alg) {
|
|
135
166
|
throw new Error('Issuer has to support HS256, HS384 or HS512');
|
|
136
167
|
}
|
|
137
|
-
const assertion = await new CompactSign(Buffer.from(JSON.stringify(assertionPayload)))
|
|
138
|
-
|
|
139
|
-
|
|
168
|
+
const assertion = await new _jose.CompactSign(Buffer.from(JSON.stringify(assertionPayload))).setProtectedHeader({
|
|
169
|
+
alg
|
|
170
|
+
}).sign(new TextEncoder().encode(this.clientSecret));
|
|
140
171
|
const opts = {
|
|
141
172
|
client_id: this.clientId,
|
|
142
173
|
client_assertion: assertion,
|
|
143
174
|
client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
|
|
144
175
|
grant_type: 'client_credentials',
|
|
145
|
-
...additionalOpts
|
|
176
|
+
...additionalOpts
|
|
146
177
|
};
|
|
147
178
|
const authResponse = await this.authAxiosInstance.post(issuer.token_endpoint, new URLSearchParams(opts).toString(), {
|
|
148
|
-
headers: {
|
|
179
|
+
headers: {
|
|
180
|
+
Accept: 'application/json',
|
|
181
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
182
|
+
}
|
|
149
183
|
});
|
|
150
184
|
if (authResponse?.data?.access_token && authResponse.data.expires_in) {
|
|
151
|
-
return new TokenSet(authResponse.data.access_token, authResponse.data.expires_in);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
185
|
+
return new _tokenset.TokenSet(authResponse.data.access_token, authResponse.data.expires_in);
|
|
186
|
+
} else {
|
|
154
187
|
throw new Error('Invalid access token received');
|
|
155
188
|
}
|
|
156
189
|
}
|
|
@@ -163,22 +196,24 @@ export class HttpClient {
|
|
|
163
196
|
subject_token: accessToken,
|
|
164
197
|
audience: this.clientId,
|
|
165
198
|
requested_token_type: 'urn:ietf:params:oauth:token-type:access_token',
|
|
166
|
-
requested_subject: this.tokenSubject
|
|
199
|
+
requested_subject: this.tokenSubject
|
|
167
200
|
};
|
|
168
201
|
return this.requestAccessToken(opts);
|
|
169
202
|
}
|
|
170
203
|
async provideExternalToken(token) {
|
|
171
204
|
const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);
|
|
172
|
-
const { iss: providedIssuer, exp } = decodeJwt(token);
|
|
205
|
+
const { iss: providedIssuer, exp } = (0, _jose.decodeJwt)(token);
|
|
173
206
|
if (issuer.issuer !== providedIssuer) {
|
|
174
207
|
throw new Error(`Provided token is not issued by currently configured issuer. Provided token issued by ${providedIssuer}, but ${issuer.issuer} is configured.`);
|
|
175
208
|
}
|
|
176
|
-
this.tokenSet = new TokenSet(token, exp - Date.now() / 1000, true);
|
|
209
|
+
this.tokenSet = new _tokenset.TokenSet(token, exp - Date.now() / 1000, true);
|
|
177
210
|
}
|
|
178
|
-
}
|
|
211
|
+
};
|
|
179
212
|
function generateUUID() {
|
|
180
213
|
if (typeof globalThis.crypto?.randomUUID === 'function') {
|
|
181
214
|
return globalThis.crypto.randomUUID();
|
|
182
215
|
}
|
|
183
216
|
throw new Error('randomUUID() not available in this environment. Please upgrade to Node 20+ or a modern browser.');
|
|
184
217
|
}
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=http.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../lib/hpc-api/src/lib/http.service.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, Method, RawAxiosRequestHeaders } from 'axios';\nimport { EventSource } from 'eventsource';\nimport { CompactSign, decodeJwt } from 'jose';\n\nimport { Queue } from './Queue';\nimport { TokenSet } from './token-set';\n\nexport type TokenOption = { token?: string };\nexport type Config = TokenOption & AxiosRequestConfig;\n\nexport class HttpClient {\n protected readonly axiosInstance: AxiosInstance;\n protected readonly authAxiosInstance: AxiosInstance;\n protected readonly requestQueue: Queue;\n private tokenSet: TokenSet;\n private exchangedTokenSet: TokenSet;\n private discoveredIssuers = new Map<string, Issuer>();\n\n public eventSourcesMap: Map<\n string,\n { eventSource: EventSource; listener: (event: MessageEvent) => void; errListener: (event: MessageEvent) => void }\n > = new Map();\n\n constructor(\n protected readonly baseURL: string,\n protected readonly authBaseURL: string,\n protected readonly realm: string,\n protected readonly clientId: string,\n protected readonly clientSecret: string,\n protected readonly tokenSubject?: string,\n ) {\n this.axiosInstance = axios.create({ baseURL, timeout: 60000 });\n this.authAxiosInstance = axios.create({ baseURL: authBaseURL || baseURL, timeout: 10000 });\n this.requestQueue = new Queue({ concurrency: 1, timeout: 70000, throwOnTimeout: true });\n }\n\n public getQueueStats = () => this.requestQueue?.getStats();\n\n public delete = <T>(url: string, config?: Config) => this.request<T>('DELETE', url, config);\n public get = <T>(url: string, config?: Config) => this.request<T>('GET', url, config);\n public post = <T>(url: string, data: any, config?: Config) => this.request<T>('POST', url, config, data);\n public put = <T>(url: string, data: any, config?: Config) => this.request<T>('PUT', url, config, data);\n\n protected request = <T>(method: Method, url: string, config: Config = {}, data?): Promise<T> => {\n return this.requestQueue.add(\n () =>\n new Promise((resolve, reject) => {\n const tokenP = config.token ? Promise.resolve(config.token) : this.getAccessToken();\n tokenP\n .then((token) => {\n const headers = { Authorization: `Bearer ${token}`, ...config.headers } as RawAxiosRequestHeaders;\n return this.axiosInstance.request<T>({ ...config, headers, method, url, data });\n })\n .then((response) => resolve(response.data))\n .catch(reject);\n }),\n ) as Promise<T>;\n };\n\n public async addEventSource(\n url: string,\n listener: (event: MessageEvent) => void,\n errorListener?: (event: MessageEvent) => void,\n options: TokenOption = {},\n ) {\n const id = generateUUID();\n const errListener = errorListener\n ? errorListener\n : (event) => {\n throw new Error(JSON.stringify(event, null, 2));\n };\n const token = options.token ? options.token : await this.getAccessToken();\n const es = new EventSource(`${this.baseURL}${url}`, {\n fetch: (input, init) =>\n fetch(input, {\n ...init,\n headers: {\n ...init.headers,\n Authorization: 'Bearer ' + token,\n },\n }),\n });\n es.addEventListener('message', listener);\n es.addEventListener('error', errListener);\n // the listeners have to be saved otherwise they cannot be removed\n this.eventSourcesMap.set(id, { eventSource: es, listener, errListener });\n return id;\n }\n\n public destroyEventSource(id: string) {\n if (!this.eventSourcesMap.has(id)) {\n return;\n }\n const es = this.eventSourcesMap.get(id);\n // close and unbind listeners so that the process quits cleanly\n es.eventSource.close();\n es.eventSource.removeEventListener('message', es.listener);\n es.eventSource.removeEventListener('error', es.errListener);\n this.eventSourcesMap.delete(id);\n }\n\n public destroyAllEventSources() {\n for (const key of this.eventSourcesMap.keys()) {\n this.destroyEventSource(key);\n }\n }\n\n public getAccessToken = async (forceRefresh = false): Promise<string> => {\n let accessToken: string;\n if (forceRefresh || !this.tokenSet || this.tokenSet.isExpired()) {\n if (this.tokenSet?.provided) {\n throw new Error('provided token is expired and cannot be refreshed, provide a new token.');\n }\n this.tokenSet = await this.requestAccessToken();\n accessToken = this.tokenSet.accessToken;\n } else {\n accessToken = this.tokenSet.accessToken;\n }\n\n if (this.tokenSubject) {\n if (forceRefresh || !this.exchangedTokenSet || this.exchangedTokenSet.isExpired()) {\n this.exchangedTokenSet = await this.exchangeAccessToken(accessToken);\n }\n return this.exchangedTokenSet.accessToken;\n } else {\n return accessToken;\n }\n };\n\n protected validateIssuer(issuer: Issuer): Issuer {\n if (\n !issuer.issuer ||\n !issuer.grant_types_supported?.includes('client_credentials') ||\n !issuer.token_endpoint_auth_methods_supported?.includes('client_secret_jwt')\n ) {\n throw new Error('Issuer does not support client_secret_jwt');\n }\n\n return issuer;\n }\n\n protected async discoverIssuer(uri: string): Promise<Issuer> {\n if (this.discoveredIssuers.has(uri)) {\n return this.discoveredIssuers.get(uri);\n }\n const wellKnownUri = `${uri}/.well-known/openid-configuration`;\n const issuerResponse = await this.authAxiosInstance.get(wellKnownUri, {\n responseType: 'json',\n headers: { Accept: 'application/json' },\n });\n const validIssuer = this.validateIssuer(issuerResponse.data);\n this.discoveredIssuers.set(uri, validIssuer);\n return validIssuer;\n }\n\n protected async requestAccessToken(additionalOpts = {}): Promise<TokenSet> {\n const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);\n\n const timestamp = Date.now() / 1000;\n const audience = [...new Set([issuer.issuer, issuer.token_endpoint].filter(Boolean))];\n\n const assertionPayload = {\n iat: timestamp,\n exp: timestamp + 60,\n jti: generateUUID(),\n iss: this.clientId,\n sub: this.clientId,\n aud: audience,\n };\n\n const supportedAlgos = issuer.token_endpoint_auth_signing_alg_values_supported;\n const alg =\n issuer.token_endpoint_auth_signing_alg ??\n (Array.isArray(supportedAlgos) && supportedAlgos.find((signAlg) => /^HS(?:256|384|512)/.test(signAlg)));\n\n if (!alg) {\n throw new Error('Issuer has to support HS256, HS384 or HS512');\n }\n\n const assertion = await new CompactSign(Buffer.from(JSON.stringify(assertionPayload)))\n .setProtectedHeader({ alg })\n .sign(new TextEncoder().encode(this.clientSecret));\n\n const opts = {\n client_id: this.clientId,\n client_assertion: assertion,\n client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',\n grant_type: 'client_credentials',\n ...additionalOpts,\n };\n const authResponse = await this.authAxiosInstance.post(issuer.token_endpoint, new URLSearchParams(opts).toString(), {\n headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' },\n });\n\n if (authResponse?.data?.access_token && authResponse.data.expires_in) {\n return new TokenSet(authResponse.data.access_token, authResponse.data.expires_in);\n } else {\n throw new Error('Invalid access token received');\n }\n }\n\n protected async exchangeAccessToken(accessToken: string): Promise<TokenSet> {\n if (!accessToken || !this.tokenSubject) {\n throw new Error('Could not exchange access token');\n }\n\n const opts = {\n grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',\n subject_token: accessToken,\n audience: this.clientId,\n requested_token_type: 'urn:ietf:params:oauth:token-type:access_token',\n requested_subject: this.tokenSubject,\n };\n return this.requestAccessToken(opts);\n }\n\n async provideExternalToken(token: string) {\n const issuer = await this.discoverIssuer(`${this.authBaseURL}/realms/${this.realm}`);\n\n const { iss: providedIssuer, exp } = decodeJwt(token);\n\n if (issuer.issuer !== providedIssuer) {\n throw new Error(\n `Provided token is not issued by currently configured issuer. Provided token issued by ${providedIssuer}, but ${issuer.issuer} is configured.`,\n );\n }\n\n this.tokenSet = new TokenSet(token, exp - Date.now() / 1000, true);\n }\n}\n\nfunction generateUUID(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n throw new Error('randomUUID() not available in this environment. Please upgrade to Node 20+ or a modern browser.');\n}\n\ninterface Issuer {\n issuer: string;\n token_endpoint: string;\n grant_types_supported: string[];\n token_endpoint_auth_methods_supported: string[];\n token_endpoint_auth_signing_alg?: string;\n token_endpoint_auth_signing_alg_values_supported: string[];\n}\n"],"names":["HttpClient","constructor","baseURL","authBaseURL","realm","clientId","clientSecret","tokenSubject","discoveredIssuers","Map","eventSourcesMap","getQueueStats","requestQueue","getStats","delete","url","config","request","get","post","data","put","method","add","Promise","resolve","reject","tokenP","token","getAccessToken","then","headers","Authorization","axiosInstance","response","catch","forceRefresh","accessToken","tokenSet","isExpired","provided","Error","requestAccessToken","exchangedTokenSet","exchangeAccessToken","axios","create","timeout","authAxiosInstance","Queue","concurrency","throwOnTimeout","addEventSource","listener","errorListener","options","id","generateUUID","errListener","event","JSON","stringify","es","EventSource","fetch","input","init","addEventListener","set","eventSource","destroyEventSource","has","close","removeEventListener","destroyAllEventSources","key","keys","validateIssuer","issuer","grant_types_supported","includes","token_endpoint_auth_methods_supported","discoverIssuer","uri","wellKnownUri","issuerResponse","responseType","Accept","validIssuer","additionalOpts","timestamp","Date","now","audience","Set","token_endpoint","filter","Boolean","assertionPayload","iat","exp","jti","iss","sub","aud","supportedAlgos","token_endpoint_auth_signing_alg_values_supported","alg","token_endpoint_auth_signing_alg","Array","isArray","find","signAlg","test","assertion","CompactSign","Buffer","from","setProtectedHeader","sign","TextEncoder","encode","opts","client_id","client_assertion","client_assertion_type","grant_type","authResponse","URLSearchParams","toString","access_token","expires_in","TokenSet","subject_token","requested_token_type","requested_subject","provideExternalToken","providedIssuer","decodeJwt","globalThis","crypto","randomUUID"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../lib/hpc-api/src/lib/label.interface.ts"],"names":[],"mappings":""}
|
package/src/lib/label.service.js
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LabelService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LabelService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _dataservice = require("./data.service");
|
|
12
|
+
let LabelService = class LabelService extends _dataservice.DataService {
|
|
13
|
+
constructor(httpClient){
|
|
4
14
|
super(httpClient, '/labels');
|
|
5
15
|
}
|
|
6
16
|
addMany(dtos, options = {}) {
|
|
7
|
-
return Promise.all(dtos.map((dto)
|
|
17
|
+
return Promise.all(dtos.map((dto)=>this.addOne(dto, options)));
|
|
8
18
|
}
|
|
9
19
|
getOneByName(name, options = {}) {
|
|
10
20
|
return this.httpClient.get(`${this.basePath}/name/${name}`, options);
|
|
@@ -12,4 +22,6 @@ export class LabelService extends DataService {
|
|
|
12
22
|
count(options = {}) {
|
|
13
23
|
return this.httpClient.get(`${this.basePath}/count`, options);
|
|
14
24
|
}
|
|
15
|
-
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=label.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../lib/hpc-api/src/lib/label.service.ts"],"sourcesContent":["import { DataService } from './data.service';\nimport { HttpClient, TokenOption } from './http.service';\nimport { Label } from './label.interface';\n\nexport class LabelService extends DataService<Label> {\n constructor(httpClient: HttpClient) {\n super(httpClient, '/labels');\n }\n\n public addMany(dtos: Label[], options: TokenOption = {}): Promise<Label[]> {\n return Promise.all(dtos.map((dto) => this.addOne(dto, options)));\n }\n\n public getOneByName(name: string, options: TokenOption = {}): Promise<Label> {\n return this.httpClient.get(`${this.basePath}/name/${name}`, options);\n }\n\n public count(options: TokenOption = {}): Promise<number> {\n return this.httpClient.get(`${this.basePath}/count`, options);\n }\n}\n"],"names":["LabelService","DataService","constructor","httpClient","addMany","dtos","options","Promise","all","map","dto","addOne","getOneByName","name","get","basePath","count"],"mappings":";;;;+BAIaA;;;eAAAA;;;6BAJe;AAIrB,IAAA,AAAMA,eAAN,MAAMA,qBAAqBC,wBAAW;IAC3CC,YAAYC,UAAsB,CAAE;QAClC,KAAK,CAACA,YAAY;IACpB;IAEOC,QAAQC,IAAa,EAAEC,UAAuB,CAAC,CAAC,EAAoB;QACzE,OAAOC,QAAQC,GAAG,CAACH,KAAKI,GAAG,CAAC,CAACC,MAAQ,IAAI,CAACC,MAAM,CAACD,KAAKJ;IACxD;IAEOM,aAAaC,IAAY,EAAEP,UAAuB,CAAC,CAAC,EAAkB;QAC3E,OAAO,IAAI,CAACH,UAAU,CAACW,GAAG,CAAC,GAAG,IAAI,CAACC,QAAQ,CAAC,MAAM,EAAEF,MAAM,EAAEP;IAC9D;IAEOU,MAAMV,UAAuB,CAAC,CAAC,EAAmB;QACvD,OAAO,IAAI,CAACH,UAAU,CAACW,GAAG,CAAC,GAAG,IAAI,CAACC,QAAQ,CAAC,MAAM,CAAC,EAAET;IACvD;AACF"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "APIBaseMock", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return APIBaseMock;
|
|
6
9
|
}
|
|
7
|
-
}
|
|
10
|
+
});
|
|
11
|
+
const _apibase = require("../api-base");
|
|
12
|
+
let APIBaseMock = class APIBaseMock extends _apibase.APIBase {
|
|
13
|
+
constructor(data = []){
|
|
14
|
+
super(null, null), this.data = data;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=api-base.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../lib/hpc-api/src/lib/mock/api-base.mock.ts"],"sourcesContent":["import { APIBase } from '../api-base';\n\nexport class APIBaseMock<T> extends APIBase {\n constructor(public data: T[] = []) {\n super(null, null);\n }\n}\n"],"names":["APIBaseMock","APIBase","constructor","data"],"mappings":";;;;+BAEaA;;;eAAAA;;;yBAFW;AAEjB,IAAA,AAAMA,cAAN,MAAMA,oBAAuBC,gBAAO;IACzCC,YAAY,AAAOC,OAAY,EAAE,CAAE;QACjC,KAAK,CAAC,MAAM,YADKA,OAAAA;IAEnB;AACF"}
|