Skip to content

Commit

Permalink
refactor: made the server temp file a one-off and explicitly delete it
Browse files Browse the repository at this point in the history
  • Loading branch information
Ellpeck committed Jul 5, 2024
1 parent 1606c4f commit ef95b72
Showing 1 changed file with 11 additions and 18 deletions.
29 changes: 11 additions & 18 deletions src/cli/repl/server/connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@ export class FlowRServerConnection {
pipeline: PipelineExecutor<typeof DEFAULT_SLICING_PIPELINE>
}>()

private tempFile: tmp.FileResult | undefined

// we do not have to ensure synchronized shell-access as we are always running synchronized
constructor(socket: Socket, name: string, shell: RShell) {
this.socket = socket
Expand Down Expand Up @@ -82,7 +80,7 @@ export class FlowRServerConnection {
}
switch(request.message.type) {
case 'request-file-analysis':
this.handleFileAnalysisRequest(request.message as FileAnalysisRequestMessage)
void this.handleFileAnalysisRequest(request.message as FileAnalysisRequestMessage)
break
case 'request-slice':
this.handleSliceRequest(request.message as SliceRequestMessage)
Expand All @@ -101,7 +99,7 @@ export class FlowRServerConnection {
}
}

private handleFileAnalysisRequest(base: FileAnalysisRequestMessage) {
private async handleFileAnalysisRequest(base: FileAnalysisRequestMessage) {
const requestResult = validateMessage(base, requestAnalysisMessage)
if(requestResult.type === 'error') {
answerForValidationError(this.socket, requestResult, base.id)
Expand All @@ -113,9 +111,11 @@ export class FlowRServerConnection {
if(message.filetoken && this.fileMap.has(message.filetoken)) {
this.logger.warn(`File token ${message.filetoken} already exists. Overwriting.`)
}
const slicer = this.createPipelineExecutorForRequest(message)

void slicer.allRemainingSteps(false).then(async results => await this.sendFileAnalysisResponse(results, message))
const tempFile = tmp.fileSync({ postfix: '.R' })
const slicer = this.createPipelineExecutorForRequest(message, tempFile.name)

await slicer.allRemainingSteps(false).then(async results => await this.sendFileAnalysisResponse(results, message))
.catch(e => {
this.logger.error(`[${this.name}] Error while analyzing file ${message.filename ?? 'unknown file'}: ${String(e)}`)
sendMessage<FlowrErrorMessage>(this.socket, {
Expand All @@ -125,6 +125,8 @@ export class FlowRServerConnection {
reason: `Error while analyzing file ${message.filename ?? 'unknown file'}: ${String(e)}`
})
})

tempFile.removeCallback()
}

private async sendFileAnalysisResponse(results: Partial<PipelineOutput<typeof DEFAULT_SLICING_PIPELINE>>, message: FileAnalysisRequestMessage): Promise<void> {
Expand Down Expand Up @@ -159,13 +161,12 @@ export class FlowRServerConnection {
}
}

private createPipelineExecutorForRequest(message: FileAnalysisRequestMessage) {
private createPipelineExecutorForRequest(message: FileAnalysisRequestMessage, tempFile: string) {
let request: RParseRequest
if(message.content !== undefined){
// we store the code in a temporary file in case it's too big for the shell to handle
const temp = this.getTempFile()
fs.writeFileSync(temp.name, message.content ?? '')
request = { request: 'file', content: temp.name }
fs.writeFileSync(tempFile, message.content ?? '')
request = { request: 'file', content: tempFile }
} else {
request = { request: 'file', content: message.filepath as string }
}
Expand All @@ -185,14 +186,6 @@ export class FlowRServerConnection {
return slicer
}

private getTempFile(): tmp.FileResult {
if(!this.tempFile) {
this.tempFile = tmp.fileSync({ postfix: '.R', keep: false })
this.socket.on('close', () => this.tempFile?.removeCallback())
}
return this.tempFile
}

private handleSliceRequest(base: SliceRequestMessage) {
const requestResult = validateMessage(base, requestSliceMessage)
if(requestResult.type === 'error') {
Expand Down

0 comments on commit ef95b72

Please sign in to comment.