diff --git a/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js b/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js
index 0178b90d7..38dd7511e 100644
--- a/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js
+++ b/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js
@@ -1,6 +1,19 @@
import styled from 'styled-components';
const Wrapper = styled.div`
+ .textbox {
+ border: 1px solid #ccc;
+ padding: 0.2rem 0.5rem;
+ box-shadow: none;
+ border-radius: 0px;
+ outline: none;
+ box-shadow: none;
+ transition: border-color ease-in-out 0.1s;
+ border-radius: 3px;
+ background-color: ${(props) => props.theme.modal.input.bg};
+ border: 1px solid ${(props) => props.theme.modal.input.border};
+ }
+
.item-path {
.link {
color: ${(props) => props.theme.textLink};
diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx
index e415aeb3c..4b0b68cba 100644
--- a/packages/bruno-app/src/components/RunnerResults/index.jsx
+++ b/packages/bruno-app/src/components/RunnerResults/index.jsx
@@ -23,6 +23,7 @@ const getRelativePath = (fullPath, pathname) => {
export default function RunnerResults({ collection }) {
const dispatch = useDispatch();
const [selectedItem, setSelectedItem] = useState(null);
+ const [delay, setDelay] = useState(null);
// ref for the runner output body
const runnerBodyRef = useRef();
@@ -78,11 +79,11 @@ export default function RunnerResults({ collection }) {
.filter(Boolean);
const runCollection = () => {
- dispatch(runCollectionFolder(collection.uid, null, true));
+ dispatch(runCollectionFolder(collection.uid, null, true, Number(delay)));
};
const runAgain = () => {
- dispatch(runCollectionFolder(collection.uid, runnerInfo.folderUid, runnerInfo.isRecursive));
+ dispatch(runCollectionFolder(collection.uid, runnerInfo.folderUid, runnerInfo.isRecursive, Number(delay)));
};
const resetRunner = () => {
@@ -116,6 +117,20 @@ export default function RunnerResults({ collection }) {
You have {totalRequestsInCollection} requests in this collection.
+
+
+ setDelay(e.target.value)}
+ />
+
+
@@ -167,10 +182,14 @@ export default function RunnerResults({ collection }) {
{item.status !== 'error' && item.status !== 'completed' ? (
- ) : (
+ ) : item.responseReceived?.status ? (
setSelectedItem(item)}>
- ({get(item.responseReceived, 'status')}
- {get(item.responseReceived, 'statusText')})
+ ({item.responseReceived?.status}
+ {item.responseReceived?.statusText})
+
+ ) : (
+ setSelectedItem(item)}>
+ (request failed)
)}
diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
index 526b43a1e..fcd109441 100644
--- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
+++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js
@@ -246,7 +246,7 @@ export const cancelRunnerExecution = (cancelTokenUid) => (dispatch) => {
cancelNetworkRequest(cancelTokenUid).catch((err) => console.log(err));
};
-export const runCollectionFolder = (collectionUid, folderUid, recursive) => (dispatch, getState) => {
+export const runCollectionFolder = (collectionUid, folderUid, recursive, delay) => (dispatch, getState) => {
const state = getState();
const collection = findCollectionByUid(state.collections.collections, collectionUid);
@@ -277,7 +277,8 @@ export const runCollectionFolder = (collectionUid, folderUid, recursive) => (dis
collectionCopy,
environment,
collectionCopy.collectionVariables,
- recursive
+ recursive,
+ delay
)
.then(resolve)
.catch((err) => {
diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js
index 73d8a5923..d94cb73fe 100644
--- a/packages/bruno-electron/src/ipc/network/index.js
+++ b/packages/bruno-electron/src/ipc/network/index.js
@@ -805,7 +805,7 @@ const registerNetworkIpc = (mainWindow) => {
ipcMain.handle(
'renderer:run-collection-folder',
- async (event, folder, collection, environment, collectionVariables, recursive) => {
+ async (event, folder, collection, environment, collectionVariables, recursive, delay) => {
const collectionUid = collection.uid;
const collectionPath = collection.pathname;
const folderUid = folder ? folder.uid : null;
@@ -925,6 +925,18 @@ const registerNetworkIpc = (mainWindow) => {
timeStart = Date.now();
let response, responseTime;
try {
+ if (delay && !Number.isNaN(delay) && delay > 0) {
+ const delayPromise = new Promise((resolve) => setTimeout(resolve, delay));
+
+ const cancellationPromise = new Promise((_, reject) => {
+ abortController.signal.addEventListener('abort', () => {
+ reject(new Error('Cancelled'));
+ });
+ });
+
+ await Promise.race([delayPromise, cancellationPromise]);
+ }
+
/** @type {import('axios').AxiosResponse} */
response = await axiosInstance(request);
timeEnd = Date.now();