diff --git a/packages/bruno-app/src/components/Icons/Grpc/index.js b/packages/bruno-app/src/components/Icons/Grpc/index.js index a376c5767..1424ce288 100644 --- a/packages/bruno-app/src/components/Icons/Grpc/index.js +++ b/packages/bruno-app/src/components/Icons/Grpc/index.js @@ -2,17 +2,17 @@ import React from 'react'; // UNARY - Single request, single response (Blue) export const IconGrpcUnary = ({ size = 18, strokeWidth = 1.5, className = '' }) => ( - - + {/* Request arrow (top) - right */} @@ -24,17 +24,17 @@ export const IconGrpcUnary = ({ size = 18, strokeWidth = 1.5, className = '' }) // CLIENT_STREAMING - Streaming request, single response (Purple) export const IconGrpcClientStreaming = ({ size = 18, strokeWidth = 1.5, className = '' }) => ( - - + {/* Request arrow (top) - right with double heads */} @@ -47,17 +47,17 @@ export const IconGrpcClientStreaming = ({ size = 18, strokeWidth = 1.5, classNam // SERVER_STREAMING - Single request, streaming response (Green) export const IconGrpcServerStreaming = ({ size = 18, strokeWidth = 1.5, className = '' }) => ( - - + {/* Request arrow (top) - right */} @@ -70,17 +70,17 @@ export const IconGrpcServerStreaming = ({ size = 18, strokeWidth = 1.5, classNam // BIDI_STREAMING - Streaming request, streaming response (Orange) export const IconGrpcBidiStreaming = ({ size = 18, strokeWidth = 1.5, className = '' }) => ( - - + {/* Request arrow (top) - right with double heads */} @@ -90,4 +90,4 @@ export const IconGrpcBidiStreaming = ({ size = 18, strokeWidth = 1.5, className -); \ No newline at end of file +); \ No newline at end of file diff --git a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js index 2a2583cc6..70cae8332 100644 --- a/packages/bruno-app/src/components/ResponsePane/Timeline/index.js +++ b/packages/bruno-app/src/components/ResponsePane/Timeline/index.js @@ -45,40 +45,42 @@ const getEffectiveAuthSource = (collection, item) => { const Timeline = ({ collection, item }) => { // Get the effective auth source if auth mode is inherit const authSource = getEffectiveAuthSource(collection, item); - // TODO: reaper, might want to split it out and replicate the same timeline item as grpc const isGrpcRequest = item.type === 'grpc-request' || item.type === 'ws-request'; - + // Filter timeline entries based on new rules - const combinedTimeline = [...(collection?.timeline || [])] - .filter((obj) => { - // Always show entries for this item - if (obj.itemUid === item.uid) return true; + const combinedTimeline = ([...(collection?.timeline || [])]).filter(obj => { + // Always show entries for this item + if (obj.itemUid === item.uid) return true; - // For OAuth2 entries, also show if auth is inherited - if (obj.type === 'oauth2' && authSource) { - if (authSource.type === 'folder' && obj.folderUid === authSource.uid) return true; - if (authSource.type === 'collection' && !obj.folderUid) return true; - } + // For OAuth2 entries, also show if auth is inherited + if (obj.type === 'oauth2' && authSource) { + if (authSource.type === 'folder' && obj.folderUid === authSource.uid) return true; + if (authSource.type === 'collection' && !obj.folderUid) return true; + } - return false; - }) - .sort((a, b) => b.timestamp - a.timestamp); + return false; + }).sort((a, b) => b.timestamp - a.timestamp) return ( - + {/* Timeline container with scrollbar */} -
+
{combinedTimeline.map((event, index) => { // Handle regular requests if (event.type === 'request') { - const { data, timestamp, eventType } = event; - const { request, response, eventData = {}, timestamp: eventTimestamp = timestamp } = data; + const { data, timestamp, eventType } = event; + const { request, response, eventData = {}, timestamp: eventTimestamp = timestamp } = data; + if (isGrpcRequest) { return (
{
); } - + // Regular HTTP request return (
@@ -117,7 +119,7 @@ const Timeline = ({ collection, item }) => {
{debugInfo && debugInfo.length > 0 ? ( debugInfo.map((data, idx) => ( -
+
{
); } - + return null; })}
@@ -143,4 +145,4 @@ const Timeline = ({ collection, item }) => { ); }; -export default Timeline; +export default Timeline; \ No newline at end of file diff --git a/packages/bruno-app/src/utils/network/index.js b/packages/bruno-app/src/utils/network/index.js index 078d48725..eaea8d3ce 100644 --- a/packages/bruno-app/src/utils/network/index.js +++ b/packages/bruno-app/src/utils/network/index.js @@ -27,16 +27,16 @@ export const sendNetworkRequest = async (item, collection, environment, runtimeV export const sendGrpcRequest = async (item, collection, environment, runtimeVariables) => { return new Promise((resolve, reject) => { - startGrpcRequest(item, collection, environment, runtimeVariables) - .then((initialState) => { - // Return an initial state object to update the UI - // The real response data will be handled by event listeners - resolve({ - ...initialState, - timeline: [] - }); - }) - .catch((err) => reject(err)); + startGrpcRequest(item, collection, environment, runtimeVariables) + .then((initialState) => { + // Return an initial state object to update the UI + // The real response data will be handled by event listeners + resolve({ + ...initialState, + timeline: [] + }); + }) + .catch((err) => reject(err)); }); }; @@ -79,19 +79,18 @@ export const startGrpcRequest = async (item, collection, environment, runtimeVar const { ipcRenderer } = window; const request = item.draft ? item.draft : item; - ipcRenderer - .invoke('grpc:start-connection', { - request, - collection, - environment, - runtimeVariables - }) - .then(() => { - resolve(); - }) - .catch((err) => { - reject(err); - }); + ipcRenderer.invoke('grpc:start-connection', { + request, + collection, + environment, + runtimeVariables + }) + .then(() => { + resolve(); + }) + .catch(err => { + reject(err); + }); }); }; @@ -104,7 +103,9 @@ export const startGrpcRequest = async (item, collection, environment, runtimeVar export const sendGrpcMessage = async (item, collectionUid, message) => { return new Promise((resolve, reject) => { const { ipcRenderer } = window; - ipcRenderer.invoke('grpc:send-message', item.uid, collectionUid, message).then(resolve).catch(reject); + ipcRenderer.invoke('grpc:send-message', item.uid, collectionUid, message) + .then(resolve) + .catch(reject); }); }; @@ -116,7 +117,9 @@ export const sendGrpcMessage = async (item, collectionUid, message) => { export const cancelGrpcRequest = async (requestId) => { return new Promise((resolve, reject) => { const { ipcRenderer } = window; - ipcRenderer.invoke('grpc:cancel', requestId).then(resolve).catch(reject); + ipcRenderer.invoke('grpc:cancel', requestId) + .then(resolve) + .catch(reject); }); }; @@ -128,7 +131,9 @@ export const cancelGrpcRequest = async (requestId) => { export const endGrpcStream = async (requestId) => { return new Promise((resolve, reject) => { const { ipcRenderer } = window; - ipcRenderer.invoke('grpc:end', requestId).then(resolve).catch(reject); + ipcRenderer.invoke('grpc:end', requestId) + .then(resolve) + .catch(reject); }); }; @@ -168,9 +173,8 @@ export const endGrpcConnection = async (connectionId) => { export const isGrpcConnectionActive = async (connectionId) => { return new Promise((resolve, reject) => { const { ipcRenderer } = window; - ipcRenderer - .invoke('grpc:is-connection-active', connectionId) - .then((response) => { + ipcRenderer.invoke('grpc:is-connection-active', connectionId) + .then(response => { if (response.success) { resolve(response.isActive); } else { @@ -179,7 +183,7 @@ export const isGrpcConnectionActive = async (connectionId) => { resolve(false); } }) - .catch((err) => { + .catch(err => { console.error('Failed to check connection status:', err); // On error, assume the connection is not active resolve(false); @@ -198,14 +202,13 @@ export const generateGrpcSampleMessage = async (methodPath, existingMessage = nu return new Promise((resolve, reject) => { const { ipcRenderer } = window; - ipcRenderer - .invoke('grpc:generate-sample-message', { - methodPath, - existingMessage, - options - }) - .then(resolve) - .catch(reject); + ipcRenderer.invoke('grpc:generate-sample-message', { + methodPath, + existingMessage, + options + }) + .then(resolve) + .catch(reject); }); };