@versori/run 0.2.19 → 0.2.20

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.
@@ -4,6 +4,9 @@ import { BaseUrlFetcher, ConfigReader, DynamicFetcher, RoundTripperFactory } fro
4
4
  import { CredentialsProvider, Token } from './contextcredentials.js';
5
5
  import { VersoriCredentialClient } from './credentials/mod.js';
6
6
  import { PlatformAPIClient } from './platformapi.js';
7
+ type denoFetch = (input: RequestInfo | URL, init?: RequestInit & {
8
+ client?: Deno.HttpClient;
9
+ }) => Promise<Response>;
7
10
  /**
8
11
  * VersoriRoundTripper is an implementation of the RoundTripperFactory interface for Versori connections.
9
12
  * This is the intended implementation for when projects/services are hosted on Versori infrastructure.
@@ -27,7 +30,7 @@ export declare class VersoriCredentialsFactory implements RoundTripperFactory {
27
30
  static fromEnv(logger: Logger, tracer: Tracer): VersoriCredentialsFactory;
28
31
  private changeRequestInit;
29
32
  private changeBaseUrl;
30
- create(connName: string): Promise<typeof fetch | undefined>;
33
+ create(connName: string): Promise<denoFetch | undefined>;
31
34
  createDynamic(templateName: string): Promise<DynamicFetcher | undefined>;
32
35
  private traceFetch;
33
36
  credentials(): CredentialsProvider;
@@ -39,7 +42,9 @@ export declare class VersoriCredentialsFactory implements RoundTripperFactory {
39
42
  private basicAuthFetcher;
40
43
  private bearerTokenFetcher;
41
44
  private oauth2Fetcher;
45
+ private mtlsFetcher;
42
46
  private getToken;
43
47
  private getRaw;
44
48
  }
49
+ export {};
45
50
  //# sourceMappingURL=roundtripper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roundtripper.d.ts","sourceRoot":"","sources":["../../../../../src/src/dsl/http/versori/roundtripper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AAElE,OAAO,EAEH,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,mBAAmB,EACtB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;;;;;;;GAUG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAK7B;gBAGE,WAAW,EAAE,uBAAuB,EACpC,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY;IAe3B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB;IAoCzE,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAwBrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,KAAK,GAAG,SAAS,CAAC;IAqC3D,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAgDxE,OAAO,CAAC,UAAU;IAqClB,WAAW,IAAI,mBAAmB;IAOlC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAuC9C,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,UAAQ,EACpB,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,KAAK,CAAC;IAiBX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAqB9D,uBAAuB;IAoDrC,OAAO,CAAC,aAAa;YAoDP,gBAAgB;YAmChB,kBAAkB;YAiClB,aAAa;YAwEb,QAAQ;YA2BR,MAAM;CA0BvB"}
1
+ {"version":3,"file":"roundtripper.d.ts","sourceRoot":"","sources":["../../../../../src/src/dsl/http/versori/roundtripper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AAElE,OAAO,EAEH,cAAc,EACd,YAAY,EAGZ,cAAc,EACd,mBAAmB,EACtB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,KAAK,SAAS,GAAG,CACb,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,QAAQ,CAAC,CAAC;AAIvB;;;;;;;;;;GAUG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAK7B;gBAGE,WAAW,EAAE,uBAAuB,EACpC,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY;IAe3B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB;IAoCzE,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAwBrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAkDxD,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IA6DxE,OAAO,CAAC,UAAU;IAqClB,WAAW,IAAI,mBAAmB;IAOlC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAyC9C,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,UAAQ,EACpB,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,KAAK,CAAC;IAiBX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAqB9D,uBAAuB;IAoDrC,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAqErB,OAAO,CAAC,WAAW;YA6BL,QAAQ;YA2BR,MAAM;CA0BvB"}
@@ -151,18 +151,29 @@ export class VersoriCredentialsFactory {
151
151
  return this.traceFetch(input, init);
152
152
  }
153
153
  const _input = this.changeRequestInit(input, conn);
154
- switch (conn.credentials[0].authSchemeConfig.type) {
155
- case 'api-key':
156
- return (await this.apiKeyFetcher(conn, this.traceFetch))(_input, init);
157
- case 'basic-auth':
158
- return (await this.basicAuthFetcher(conn, this.traceFetch))(_input, init);
159
- case 'jwt-bearer':
160
- return (await this.bearerTokenFetcher(conn, this.traceFetch))(_input, init);
161
- case 'oauth2':
162
- return (await this.oauth2Fetcher(conn, this.traceFetch))(_input, init);
163
- default:
164
- return this.traceFetch(_input, init);
165
- }
154
+ let _fetch = this.traceFetch;
155
+ conn.credentials.forEach((cred) => {
156
+ switch (cred.authSchemeConfig.type) {
157
+ case 'api-key':
158
+ _fetch = this.apiKeyFetcher(cred, _fetch);
159
+ break;
160
+ case 'basic-auth':
161
+ _fetch = this.basicAuthFetcher(cred, _fetch);
162
+ break;
163
+ case 'jwt-bearer':
164
+ _fetch = this.bearerTokenFetcher(cred, _fetch);
165
+ break;
166
+ case 'oauth2':
167
+ _fetch = this.oauth2Fetcher(cred, _fetch);
168
+ break;
169
+ case 'certificate':
170
+ _fetch = this.mtlsFetcher(cred, _fetch);
171
+ break;
172
+ default:
173
+ break;
174
+ }
175
+ });
176
+ return _fetch(_input, init);
166
177
  };
167
178
  return Promise.resolve(_fn);
168
179
  }
@@ -184,18 +195,29 @@ export class VersoriCredentialsFactory {
184
195
  })(activation, input, init);
185
196
  }
186
197
  const _input = this.changeRequestInit(input, conn);
187
- switch (conn.credentials[0].authSchemeConfig.type) {
188
- case 'api-key':
189
- return (await this.apiKeyFetcher(conn, this.traceFetch))(_input, init);
190
- case 'basic-auth':
191
- return (await this.basicAuthFetcher(conn, this.traceFetch))(_input, init);
192
- case 'jwt-bearer':
193
- return (await this.bearerTokenFetcher(conn, this.traceFetch))(_input, init);
194
- case 'oauth2':
195
- return (await this.oauth2Fetcher(conn, this.traceFetch))(_input, init);
196
- default:
197
- return this.traceFetch(_input, init);
198
- }
198
+ let _fetch = this.traceFetch;
199
+ conn.credentials.forEach((cred) => {
200
+ switch (cred.authSchemeConfig.type) {
201
+ case 'api-key':
202
+ _fetch = this.apiKeyFetcher(cred, _fetch);
203
+ break;
204
+ case 'basic-auth':
205
+ _fetch = this.basicAuthFetcher(cred, _fetch);
206
+ break;
207
+ case 'jwt-bearer':
208
+ _fetch = this.bearerTokenFetcher(cred, _fetch);
209
+ break;
210
+ case 'oauth2':
211
+ _fetch = this.oauth2Fetcher(cred, _fetch);
212
+ break;
213
+ case 'certificate':
214
+ _fetch = this.mtlsFetcher(cred, _fetch);
215
+ break;
216
+ default:
217
+ break;
218
+ }
219
+ });
220
+ return _fetch(_input, init);
199
221
  };
200
222
  return Promise.resolve(_fn);
201
223
  }
@@ -283,7 +305,7 @@ export class VersoriCredentialsFactory {
283
305
  if (!raw) {
284
306
  throw new Error(`Raw data not found for connection ${name} with credential ID ${credId}`);
285
307
  }
286
- let buffer = raw?.credential?.data['raw'] ?? undefined;
308
+ const buffer = raw?.credential?.data['raw'] ?? undefined;
287
309
  if (!buffer) {
288
310
  throw new Error(`Credential ${raw?.credential?.id} is missing raw data, please contact your administrator`);
289
311
  }
@@ -322,11 +344,11 @@ export class VersoriCredentialsFactory {
322
344
  }
323
345
  return staticConn.credentials[0].credential.id;
324
346
  }
325
- apiKeyFetcher(conn, fn) {
347
+ apiKeyFetcher(cred, fn) {
326
348
  const _fn = async (input, init) => {
327
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
349
+ const tokenResponse = await this.getToken(cred.credential.id);
328
350
  const token = tokenResponse.token?.accessToken;
329
- const asc = conn.credentials[0].authSchemeConfig.apiKey;
351
+ const asc = cred.authSchemeConfig.apiKey;
330
352
  if (!token) {
331
353
  throw new Error('Token not found');
332
354
  }
@@ -368,11 +390,11 @@ export class VersoriCredentialsFactory {
368
390
  }
369
391
  return fn(input, init);
370
392
  };
371
- return Promise.resolve(_fn);
393
+ return _fn;
372
394
  }
373
- async basicAuthFetcher(conn, fn) {
395
+ basicAuthFetcher(cred, fn) {
374
396
  const _fn = async (input, init) => {
375
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
397
+ const tokenResponse = await this.getToken(cred.credential.id);
376
398
  const token = tokenResponse.token?.accessToken;
377
399
  if (!token) {
378
400
  throw new Error('Token not found');
@@ -397,12 +419,12 @@ export class VersoriCredentialsFactory {
397
419
  }
398
420
  return fn(input, init);
399
421
  };
400
- return Promise.resolve(_fn);
422
+ return _fn;
401
423
  }
402
424
  // TODO: need to make the prefix and header name configurable from authschemeconfig
403
- async bearerTokenFetcher(conn, fn) {
425
+ bearerTokenFetcher(cred, fn) {
404
426
  const _fn = async (input, init) => {
405
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
427
+ const tokenResponse = await this.getToken(cred.credential.id);
406
428
  const token = tokenResponse.token?.accessToken;
407
429
  if (!token) {
408
430
  throw new Error('Token not found');
@@ -427,11 +449,11 @@ export class VersoriCredentialsFactory {
427
449
  }
428
450
  return fn(input, init);
429
451
  };
430
- return Promise.resolve(_fn);
452
+ return _fn;
431
453
  }
432
- async oauth2Fetcher(conn, fn) {
454
+ oauth2Fetcher(cred, fn) {
433
455
  const refreshFn = async (input, init, forceRefresh = false) => {
434
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id, forceRefresh);
456
+ const tokenResponse = await this.getToken(cred.credential.id, forceRefresh);
435
457
  const token = tokenResponse.token?.accessToken;
436
458
  const tokenType = tokenResponse.token?.tokenType;
437
459
  if (!token) {
@@ -482,7 +504,28 @@ export class VersoriCredentialsFactory {
482
504
  }
483
505
  return Promise.resolve(resp);
484
506
  };
485
- return Promise.resolve(_fn);
507
+ return _fn;
508
+ }
509
+ mtlsFetcher(cred, fn) {
510
+ const _fn = async (input, init) => {
511
+ const raw = await this.getRaw(cred.credential.id);
512
+ if (!raw?.credential?.data) {
513
+ throw new Error(`Cannot fetch MTLS credentials for connection ${cred.credential.name}, no data found`);
514
+ }
515
+ const cert = new TextDecoder().decode(raw.credential.data['certificate']);
516
+ const key = new TextDecoder().decode(raw.credential.data['key']);
517
+ const caCerts = new TextDecoder().decode(raw.credential.data['ca'] || '');
518
+ const httpClient = Deno.createHttpClient({
519
+ cert,
520
+ key,
521
+ caCerts: caCerts ? [caCerts] : [],
522
+ });
523
+ return fn(input, {
524
+ ...init,
525
+ client: httpClient,
526
+ });
527
+ };
528
+ return _fn;
486
529
  }
487
530
  async getToken(id, forceRefresh = false) {
488
531
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versori/run",
3
- "version": "v0.2.19",
3
+ "version": "v0.2.20",
4
4
  "description": "Versori Run",
5
5
  "homepage": "https://github.com/versori/versori-run#readme",
6
6
  "repository": {
@@ -4,6 +4,9 @@ import { BaseUrlFetcher, ConfigReader, DynamicFetcher, RoundTripperFactory } fro
4
4
  import { CredentialsProvider, Token } from './contextcredentials.js';
5
5
  import { VersoriCredentialClient } from './credentials/mod.js';
6
6
  import { PlatformAPIClient } from './platformapi.js';
7
+ type denoFetch = (input: RequestInfo | URL, init?: RequestInit & {
8
+ client?: Deno.HttpClient;
9
+ }) => Promise<Response>;
7
10
  /**
8
11
  * VersoriRoundTripper is an implementation of the RoundTripperFactory interface for Versori connections.
9
12
  * This is the intended implementation for when projects/services are hosted on Versori infrastructure.
@@ -27,7 +30,7 @@ export declare class VersoriCredentialsFactory implements RoundTripperFactory {
27
30
  static fromEnv(logger: Logger, tracer: Tracer): VersoriCredentialsFactory;
28
31
  private changeRequestInit;
29
32
  private changeBaseUrl;
30
- create(connName: string): Promise<typeof fetch | undefined>;
33
+ create(connName: string): Promise<denoFetch | undefined>;
31
34
  createDynamic(templateName: string): Promise<DynamicFetcher | undefined>;
32
35
  private traceFetch;
33
36
  credentials(): CredentialsProvider;
@@ -39,7 +42,9 @@ export declare class VersoriCredentialsFactory implements RoundTripperFactory {
39
42
  private basicAuthFetcher;
40
43
  private bearerTokenFetcher;
41
44
  private oauth2Fetcher;
45
+ private mtlsFetcher;
42
46
  private getToken;
43
47
  private getRaw;
44
48
  }
49
+ export {};
45
50
  //# sourceMappingURL=roundtripper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roundtripper.d.ts","sourceRoot":"","sources":["../../../../../src/src/dsl/http/versori/roundtripper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AAElE,OAAO,EAEH,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,mBAAmB,EACtB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;;;;;;;GAUG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAK7B;gBAGE,WAAW,EAAE,uBAAuB,EACpC,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY;IAe3B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB;IAoCzE,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAwBrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,KAAK,GAAG,SAAS,CAAC;IAqC3D,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAgDxE,OAAO,CAAC,UAAU;IAqClB,WAAW,IAAI,mBAAmB;IAOlC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAuC9C,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,UAAQ,EACpB,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,KAAK,CAAC;IAiBX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAqB9D,uBAAuB;IAoDrC,OAAO,CAAC,aAAa;YAoDP,gBAAgB;YAmChB,kBAAkB;YAiClB,aAAa;YAwEb,QAAQ;YA2BR,MAAM;CA0BvB"}
1
+ {"version":3,"file":"roundtripper.d.ts","sourceRoot":"","sources":["../../../../../src/src/dsl/http/versori/roundtripper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AAElE,OAAO,EAEH,cAAc,EACd,YAAY,EAGZ,cAAc,EACd,mBAAmB,EACtB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAM/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,KAAK,SAAS,GAAG,CACb,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,CAAA;CAAE,KAChD,OAAO,CAAC,QAAQ,CAAC,CAAC;AAIvB;;;;;;;;;;GAUG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO,CAAC,GAAG,CAAS;IAEpB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAK7B;gBAGE,WAAW,EAAE,uBAAuB,EACpC,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,YAAY;IAe3B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,yBAAyB;IAoCzE,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAwBrB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAkDxD,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IA6DxE,OAAO,CAAC,UAAU;IAqClB,WAAW,IAAI,mBAAmB;IAOlC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc;IAyC9C,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,YAAY,UAAQ,EACpB,YAAY,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,KAAK,CAAC;IAiBX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YAqB9D,uBAAuB;IAoDrC,OAAO,CAAC,aAAa;IAoDrB,OAAO,CAAC,gBAAgB;IAmCxB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAqErB,OAAO,CAAC,WAAW;YA6BL,QAAQ;YA2BR,MAAM;CA0BvB"}
@@ -154,18 +154,29 @@ class VersoriCredentialsFactory {
154
154
  return this.traceFetch(input, init);
155
155
  }
156
156
  const _input = this.changeRequestInit(input, conn);
157
- switch (conn.credentials[0].authSchemeConfig.type) {
158
- case 'api-key':
159
- return (await this.apiKeyFetcher(conn, this.traceFetch))(_input, init);
160
- case 'basic-auth':
161
- return (await this.basicAuthFetcher(conn, this.traceFetch))(_input, init);
162
- case 'jwt-bearer':
163
- return (await this.bearerTokenFetcher(conn, this.traceFetch))(_input, init);
164
- case 'oauth2':
165
- return (await this.oauth2Fetcher(conn, this.traceFetch))(_input, init);
166
- default:
167
- return this.traceFetch(_input, init);
168
- }
157
+ let _fetch = this.traceFetch;
158
+ conn.credentials.forEach((cred) => {
159
+ switch (cred.authSchemeConfig.type) {
160
+ case 'api-key':
161
+ _fetch = this.apiKeyFetcher(cred, _fetch);
162
+ break;
163
+ case 'basic-auth':
164
+ _fetch = this.basicAuthFetcher(cred, _fetch);
165
+ break;
166
+ case 'jwt-bearer':
167
+ _fetch = this.bearerTokenFetcher(cred, _fetch);
168
+ break;
169
+ case 'oauth2':
170
+ _fetch = this.oauth2Fetcher(cred, _fetch);
171
+ break;
172
+ case 'certificate':
173
+ _fetch = this.mtlsFetcher(cred, _fetch);
174
+ break;
175
+ default:
176
+ break;
177
+ }
178
+ });
179
+ return _fetch(_input, init);
169
180
  };
170
181
  return Promise.resolve(_fn);
171
182
  }
@@ -187,18 +198,29 @@ class VersoriCredentialsFactory {
187
198
  })(activation, input, init);
188
199
  }
189
200
  const _input = this.changeRequestInit(input, conn);
190
- switch (conn.credentials[0].authSchemeConfig.type) {
191
- case 'api-key':
192
- return (await this.apiKeyFetcher(conn, this.traceFetch))(_input, init);
193
- case 'basic-auth':
194
- return (await this.basicAuthFetcher(conn, this.traceFetch))(_input, init);
195
- case 'jwt-bearer':
196
- return (await this.bearerTokenFetcher(conn, this.traceFetch))(_input, init);
197
- case 'oauth2':
198
- return (await this.oauth2Fetcher(conn, this.traceFetch))(_input, init);
199
- default:
200
- return this.traceFetch(_input, init);
201
- }
201
+ let _fetch = this.traceFetch;
202
+ conn.credentials.forEach((cred) => {
203
+ switch (cred.authSchemeConfig.type) {
204
+ case 'api-key':
205
+ _fetch = this.apiKeyFetcher(cred, _fetch);
206
+ break;
207
+ case 'basic-auth':
208
+ _fetch = this.basicAuthFetcher(cred, _fetch);
209
+ break;
210
+ case 'jwt-bearer':
211
+ _fetch = this.bearerTokenFetcher(cred, _fetch);
212
+ break;
213
+ case 'oauth2':
214
+ _fetch = this.oauth2Fetcher(cred, _fetch);
215
+ break;
216
+ case 'certificate':
217
+ _fetch = this.mtlsFetcher(cred, _fetch);
218
+ break;
219
+ default:
220
+ break;
221
+ }
222
+ });
223
+ return _fetch(_input, init);
202
224
  };
203
225
  return Promise.resolve(_fn);
204
226
  }
@@ -286,7 +308,7 @@ class VersoriCredentialsFactory {
286
308
  if (!raw) {
287
309
  throw new Error(`Raw data not found for connection ${name} with credential ID ${credId}`);
288
310
  }
289
- let buffer = raw?.credential?.data['raw'] ?? undefined;
311
+ const buffer = raw?.credential?.data['raw'] ?? undefined;
290
312
  if (!buffer) {
291
313
  throw new Error(`Credential ${raw?.credential?.id} is missing raw data, please contact your administrator`);
292
314
  }
@@ -325,11 +347,11 @@ class VersoriCredentialsFactory {
325
347
  }
326
348
  return staticConn.credentials[0].credential.id;
327
349
  }
328
- apiKeyFetcher(conn, fn) {
350
+ apiKeyFetcher(cred, fn) {
329
351
  const _fn = async (input, init) => {
330
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
352
+ const tokenResponse = await this.getToken(cred.credential.id);
331
353
  const token = tokenResponse.token?.accessToken;
332
- const asc = conn.credentials[0].authSchemeConfig.apiKey;
354
+ const asc = cred.authSchemeConfig.apiKey;
333
355
  if (!token) {
334
356
  throw new Error('Token not found');
335
357
  }
@@ -371,11 +393,11 @@ class VersoriCredentialsFactory {
371
393
  }
372
394
  return fn(input, init);
373
395
  };
374
- return Promise.resolve(_fn);
396
+ return _fn;
375
397
  }
376
- async basicAuthFetcher(conn, fn) {
398
+ basicAuthFetcher(cred, fn) {
377
399
  const _fn = async (input, init) => {
378
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
400
+ const tokenResponse = await this.getToken(cred.credential.id);
379
401
  const token = tokenResponse.token?.accessToken;
380
402
  if (!token) {
381
403
  throw new Error('Token not found');
@@ -400,12 +422,12 @@ class VersoriCredentialsFactory {
400
422
  }
401
423
  return fn(input, init);
402
424
  };
403
- return Promise.resolve(_fn);
425
+ return _fn;
404
426
  }
405
427
  // TODO: need to make the prefix and header name configurable from authschemeconfig
406
- async bearerTokenFetcher(conn, fn) {
428
+ bearerTokenFetcher(cred, fn) {
407
429
  const _fn = async (input, init) => {
408
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id);
430
+ const tokenResponse = await this.getToken(cred.credential.id);
409
431
  const token = tokenResponse.token?.accessToken;
410
432
  if (!token) {
411
433
  throw new Error('Token not found');
@@ -430,11 +452,11 @@ class VersoriCredentialsFactory {
430
452
  }
431
453
  return fn(input, init);
432
454
  };
433
- return Promise.resolve(_fn);
455
+ return _fn;
434
456
  }
435
- async oauth2Fetcher(conn, fn) {
457
+ oauth2Fetcher(cred, fn) {
436
458
  const refreshFn = async (input, init, forceRefresh = false) => {
437
- const tokenResponse = await this.getToken(conn.credentials[0].credential.id, forceRefresh);
459
+ const tokenResponse = await this.getToken(cred.credential.id, forceRefresh);
438
460
  const token = tokenResponse.token?.accessToken;
439
461
  const tokenType = tokenResponse.token?.tokenType;
440
462
  if (!token) {
@@ -485,7 +507,28 @@ class VersoriCredentialsFactory {
485
507
  }
486
508
  return Promise.resolve(resp);
487
509
  };
488
- return Promise.resolve(_fn);
510
+ return _fn;
511
+ }
512
+ mtlsFetcher(cred, fn) {
513
+ const _fn = async (input, init) => {
514
+ const raw = await this.getRaw(cred.credential.id);
515
+ if (!raw?.credential?.data) {
516
+ throw new Error(`Cannot fetch MTLS credentials for connection ${cred.credential.name}, no data found`);
517
+ }
518
+ const cert = new TextDecoder().decode(raw.credential.data['certificate']);
519
+ const key = new TextDecoder().decode(raw.credential.data['key']);
520
+ const caCerts = new TextDecoder().decode(raw.credential.data['ca'] || '');
521
+ const httpClient = Deno.createHttpClient({
522
+ cert,
523
+ key,
524
+ caCerts: caCerts ? [caCerts] : [],
525
+ });
526
+ return fn(input, {
527
+ ...init,
528
+ client: httpClient,
529
+ });
530
+ };
531
+ return _fn;
489
532
  }
490
533
  async getToken(id, forceRefresh = false) {
491
534
  try {