diff --git a/scripts/k6/libs/functions.js b/scripts/k6/libs/functions.js index 9316a1cae3..96cc5978e7 100644 --- a/scripts/k6/libs/functions.js +++ b/scripts/k6/libs/functions.js @@ -257,6 +257,24 @@ export function getIssuerConnectionId(issuerAccessToken, invitationMsgId) { } } + +export function getIssuerConnectionIdViaDid(issuerAccessToken, holderDid) { + const url = `${config.api.cloudApiUrl}/tenant/v1/connections?holder_did=${holderDid}`; + const params = { + headers: { + "x-api-key": issuerAccessToken, + }, + }; + + try { + const response = http.get(url, params); + return response; + } catch (error) { + console.error(`Error creating invitation: ${error.message}`); + throw error; + } +} + export function acceptInvitation(holderAccessToken, invitationObj) { const url = `${config.api.cloudApiUrl}/tenant/v1/oob/accept-invitation`; const params = { @@ -824,6 +842,7 @@ export function checkRevoked(issuerAccessToken, credentialExchangeId) { export function genericPolling({ accessToken, + headers, walletId, topic, field, @@ -834,7 +853,16 @@ export function genericPolling({ sseTag, requestTimeout = 14 // max 14s - will need to deal with SSE ping at 15s }) { - const endpoint = `${config.api.cloudApiUrl}/tenant/v1/sse/${walletId}/${topic}/${field}/${fieldId}/${state}?look_back=${lookBack}`; + // Determine the endpoint based on whether we have headers (tenant-admin) or accessToken (tenant) + const baseUrl = headers + ? `${config.api.cloudApiUrl}/tenant-admin/v1/sse` + : `${config.api.cloudApiUrl}/tenant/v1/sse`; + const endpoint = `${baseUrl}/${walletId}/${topic}/${field}/${fieldId}/${state}?look_back=${lookBack}`; + + // Determine the request headers + const requestHeaders = headers + ? { ...headers, "Content-Type": "application/json" } + : { "x-api-key": accessToken, "Content-Type": "application/json" }; // Backoff delays in seconds: 0.5, 1, 2, 5 const delays = [0.5, 1, 2, 3]; @@ -850,10 +878,7 @@ export function genericPolling({ // Make the HTTP request const response = http.get(endpoint, { - headers: { - "x-api-key": accessToken, - "Content-Type": "application/json" - }, + headers: requestHeaders, timeout: requestTimeout * 1000, // Convert seconds to milliseconds tags: sseTag ? { name: sseTag } : { name: `GET_${topic}_${state}_Event` } }); diff --git a/scripts/k6/scenarios/create-invitations.js b/scripts/k6/scenarios/create-invitations.js index a267689169..1b29cd6080 100644 --- a/scripts/k6/scenarios/create-invitations.js +++ b/scripts/k6/scenarios/create-invitations.js @@ -13,9 +13,11 @@ import { getIssuerPublicDid, createDidExchangeRequest, getIssuerConnectionId, + getIssuerConnectionIdViaDid, pollAndCheck, getHolderConnections, } from "../libs/functions.js"; +import { getAuthHeaders } from '../libs/auth.js'; import { config } from "../libs/config.js"; const vus = config.test.vus; @@ -65,8 +67,9 @@ export function setup() { file.writeString(outputFilepath, ""); const walletName = issuerPrefix; + const { tenantAdminHeaders } = getAuthHeaders(); - return { issuers, holders }; + return { issuers, holders, tenantAdminHeaders }; } function getIssuerIndex(vu, iter) { @@ -117,6 +120,7 @@ export default function (data) { let holderConnectionId; let invitationMsgId; + let holderDid; if (useOobInvitation) { // OOB Invitation flow @@ -219,8 +223,8 @@ export default function (data) { return true; }, }); - const { invitation_msg_id: invitationMsgIdTemp, connection_id: holderConnectionIdTemp } = JSON.parse(createInvitationResponse.body); - invitationMsgId = invitationMsgIdTemp; + const { my_did: holderDidTemp, connection_id: holderConnectionIdTemp, } = JSON.parse(createInvitationResponse.body); + holderDid = holderDidTemp; holderConnectionId = holderConnectionIdTemp; } @@ -237,11 +241,11 @@ export default function (data) { }, { perspective: "Holder" }); pollAndCheck({ - accessToken: issuer.access_token, + headers: data.tenantAdminHeaders, walletId: issuer.wallet_id, topic: "connections", - field: "invitation_msg_id", - fieldId: invitationMsgId, + field: "their_did", + fieldId: holderDid, state: "completed", maxAttempts: 3, lookBack: 60, @@ -250,19 +254,38 @@ export default function (data) { // Issuer is now going to check // sleep(2); + // TODO: OOB still uses invitationMsgId let getIssuerConnectionIdResponse; + // try { + // getIssuerConnectionIdResponse = retry(() => { + // const response = getIssuerConnectionId(issuer.access_token, invitationMsgId); + // if (response.status !== 200) { + // throw new Error(`getIssuerConnectionId Non-200 status: ${response.status} ${response.body}`); + // } + // if (response.body === "[]") { + // throw new Error(`getIssuerConnectionId: Empty response body: ${response.body}`); + // } + // return response; + // } + // , 5, 1000, "getIssuerConnectionId"); + // } + // catch (e) { + // console.error(`Failed after retries: ${e.message}`); + // getIssuerConnectionIdResponse = e.response || e; + // } + let shortHolderDid = holderDid.split(':').slice(0, 3).join(':'); try { getIssuerConnectionIdResponse = retry(() => { - const response = getIssuerConnectionId(issuer.access_token, invitationMsgId); + const response = getIssuerConnectionIdViaDid(issuer.access_token, shortHolderDid); if (response.status !== 200) { - throw new Error(`getIssuerConnectionId Non-200 status: ${response.status} ${response.body}`); + throw new Error(`getIssuerConnectionIdViaDid Non-200 status: ${response.status} ${response.body}`); } if (response.body === "[]") { - throw new Error(`getIssuerConnectionId: Empty response body: ${response.body}`); + throw new Error(`getIssuerConnectionIdViaDid: Empty response body: ${response.body}`); } return response; } - , 5, 1000, "getIssuerConnectionId"); + , 5, 1000, "getIssuerConnectionIdViaDid"); } catch (e) { console.error(`Failed after retries: ${e.message}`);