11import clone from 'clone' ;
2- import electron from 'electron' ;
32import fs from 'fs' ;
43import { join as pathJoin } from 'path' ;
5- import { v4 as uuidv4 } from 'uuid' ;
64
75import { database as db } from '../common/database' ;
86import {
7+ generateId ,
98 getContentTypeHeader ,
109 getLocationHeader ,
1110 getSetCookieHeaders ,
@@ -15,7 +14,7 @@ import {
1514 getRenderedRequestAndContext ,
1615 RENDER_PURPOSE_NO_RENDER ,
1716} from '../common/render' ;
18- import type { HeaderResult , ResponsePatch , ResponseTimelineEntry } from '../main/network/libcurl-promise' ;
17+ import type { HeaderResult , ResponsePatch } from '../main/network/libcurl-promise' ;
1918import * as models from '../models' ;
2019import { CaCertificate } from '../models/ca-certificate' ;
2120import { ClientCertificate } from '../models/client-certificate' ;
@@ -65,8 +64,11 @@ export const fetchRequestData = async (requestId: string) => {
6564 invariant ( settings , 'failed to create settings' ) ;
6665 const clientCertificates = await models . clientCertificate . findByParentId ( workspaceId ) ;
6766 const caCert = await models . caCertificate . findByParentId ( workspaceId ) ;
68-
69- return { request, environment, settings, clientCertificates, caCert, activeEnvironmentId } ;
67+ const responseId = generateId ( 'res' ) ;
68+ const responsesDir = pathJoin ( process . env [ 'INSOMNIA_DATA_PATH' ] || window . app . getPath ( 'userData' ) , 'responses' ) ;
69+ const timelinePath = pathJoin ( responsesDir , responseId + '.timeline' ) ;
70+ const timelineFileStream = fs . createWriteStream ( timelinePath ) ;
71+ return { request, environment, settings, clientCertificates, caCert, activeEnvironmentId, timelineFileStream, timelinePath, responseId } ;
7072} ;
7173
7274export const tryToInterpolateRequest = async ( request : Request , environmentId : string , purpose ?: RenderPurpose , extraInfo ?: ExtraRenderInfo ) => {
@@ -97,18 +99,19 @@ export async function sendCurlAndWriteTimeline(
9799 clientCertificates : ClientCertificate [ ] ,
98100 caCert : CaCertificate | null ,
99101 settings : Settings ,
102+ timelineFileStream : fs . WriteStream ,
103+ timelinePath : string ,
104+ responseId : string ,
100105) {
101106 const requestId = renderedRequest . _id ;
102- const timeline : ResponseTimelineEntry [ ] = [ ] ;
103107
104108 const { finalUrl, socketPath } = transformUrl ( renderedRequest . url , renderedRequest . parameters , renderedRequest . authentication , renderedRequest . settingEncodeUrl ) ;
105-
106- timeline . push ( { value : `Preparing request to ${ finalUrl } ` , name : 'Text' , timestamp : Date . now ( ) } ) ;
107- timeline . push ( { value : `Current time is ${ new Date ( ) . toISOString ( ) } ` , name : 'Text' , timestamp : Date . now ( ) } ) ;
108- timeline . push ( { value : `${ renderedRequest . settingEncodeUrl ? 'Enable' : 'Disable' } automatic URL encoding` , name : 'Text' , timestamp : Date . now ( ) } ) ;
109+ timelineFileStream . write ( JSON . stringify ( { value : `Preparing request to ${ finalUrl } ` , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ;
110+ timelineFileStream . write ( JSON . stringify ( { value : `Current time is ${ new Date ( ) . toISOString ( ) } ` , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ;
111+ timelineFileStream . write ( JSON . stringify ( { value : `${ renderedRequest . settingEncodeUrl ? 'Enable' : 'Disable' } automatic URL encoding` , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ;
109112
110113 if ( ! renderedRequest . settingSendCookies ) {
111- timeline . push ( { value : 'Disable cookie sending due to user setting' , name : 'Text' , timestamp : Date . now ( ) } ) ;
114+ timelineFileStream . write ( JSON . stringify ( { value : 'Disable cookie sending due to user setting' , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ;
112115 }
113116
114117 const authHeader = await getAuthHeader ( renderedRequest , finalUrl ) ;
@@ -130,9 +133,9 @@ export async function sendCurlAndWriteTimeline(
130133 const output = await nodejsCurlRequest ( requestOptions ) ;
131134
132135 if ( 'error' in output ) {
133- const timelinePath = await storeTimeline ( timeline ) ;
134-
136+ timelineFileStream . end ( ) ;
135137 return {
138+ _id : responseId ,
136139 parentId : requestId ,
137140 url : requestOptions . finalUrl ,
138141 error : output . error ,
@@ -143,17 +146,20 @@ export async function sendCurlAndWriteTimeline(
143146 } ;
144147 }
145148 const { patch, debugTimeline, headerResults, responseBodyPath } = output ;
146- const timelinePath = await storeTimeline ( [ ...timeline , ...debugTimeline ] ) ;
149+ // todo: move to main process
150+ debugTimeline . forEach ( entry => timelineFileStream . write ( JSON . stringify ( entry ) + '\n' ) ) ;
147151 // transform output
148152 const { cookies, rejectedCookies, totalSetCookies } = await extractCookies ( headerResults , renderedRequest . cookieJar , finalUrl , renderedRequest . settingStoreCookies ) ;
149- rejectedCookies . forEach ( errorMessage => timeline . push ( { value : `Rejected cookie: ${ errorMessage } ` , name : 'Text' , timestamp : Date . now ( ) } ) ) ;
153+ rejectedCookies . forEach ( errorMessage => timelineFileStream . write ( JSON . stringify ( { value : `Rejected cookie: ${ errorMessage } ` , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ) ;
150154 if ( totalSetCookies ) {
151155 await models . cookieJar . update ( renderedRequest . cookieJar , { cookies } ) ;
152- timeline . push ( { value : `Saved ${ totalSetCookies } cookies` , name : 'Text' , timestamp : Date . now ( ) } ) ;
156+ timelineFileStream . write ( JSON . stringify ( { value : `Saved ${ totalSetCookies } cookies` , name : 'Text' , timestamp : Date . now ( ) } ) + '\n' ) ;
153157 }
154158 const lastRedirect = headerResults [ headerResults . length - 1 ] ;
159+ timelineFileStream . end ( ) ;
155160
156161 return {
162+ _id : responseId ,
157163 parentId : renderedRequest . _id ,
158164 timelinePath,
159165 bodyPath : responseBodyPath ,
@@ -305,23 +311,23 @@ async function _applyResponsePluginHooks(
305311
306312}
307313
308- export function storeTimeline ( timeline : ResponseTimelineEntry [ ] ) : Promise < string > {
309- const timelineStr = JSON . stringify ( timeline , null , '\t' ) ;
310- const timelineHash = uuidv4 ( ) ;
311- const responsesDir = pathJoin ( process . env [ 'INSOMNIA_DATA_PATH' ] || ( process . type === 'renderer' ? window : electron ) . app . getPath ( 'userData' ) , 'responses' ) ;
314+ // export function storeTimeline(timeline: ResponseTimelineEntry[]): Promise<string> {
315+ // const timelineStr = JSON.stringify(timeline, null, '\t');
316+ // const timelineHash = uuidv4();
317+ // const responsesDir = pathJoin(process.env['INSOMNIA_DATA_PATH'] || (process.type === 'renderer' ? window : electron).app.getPath('userData'), 'responses');
312318
313- fs . mkdirSync ( responsesDir , { recursive : true } ) ;
319+ // fs.mkdirSync(responsesDir, { recursive: true });
314320
315- const timelinePath = pathJoin ( responsesDir , timelineHash + '.timeline' ) ;
316- if ( process . type === 'renderer' ) {
317- return window . main . writeFile ( { path : timelinePath , content : timelineStr } ) ;
318- }
319- return new Promise < string > ( ( resolve , reject ) => {
320- fs . writeFile ( timelinePath , timelineStr , err => {
321- if ( err != null ) {
322- return reject ( err ) ;
323- }
324- resolve ( timelinePath ) ;
325- } ) ;
326- } ) ;
327- }
321+ // const timelinePath = pathJoin(responsesDir, timelineHash + '.timeline');
322+ // if (process.type === 'renderer') {
323+ // return window.main.writeFile({ path: timelinePath, content: timelineStr });
324+ // }
325+ // return new Promise<string>((resolve, reject) => {
326+ // fs.writeFile(timelinePath, timelineStr, err => {
327+ // if (err != null) {
328+ // return reject(err);
329+ // }
330+ // resolve(timelinePath);
331+ // });
332+ // });
333+ // }
0 commit comments