Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions scripts/k6/libs/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -824,6 +842,7 @@ export function checkRevoked(issuerAccessToken, credentialExchangeId) {

export function genericPolling({
accessToken,
headers,
walletId,
topic,
field,
Expand All @@ -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];
Expand All @@ -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` }
});
Expand Down
43 changes: 33 additions & 10 deletions scripts/k6/scenarios/create-invitations.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -117,6 +120,7 @@ export default function (data) {

let holderConnectionId;
let invitationMsgId;
let holderDid;

if (useOobInvitation) {
// OOB Invitation flow
Expand Down Expand Up @@ -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;
}

Expand All @@ -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,
Expand All @@ -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}`);
Expand Down
Loading