Update claritas integration to support large result sets.

The output is now pulled from a json file.
This commit is contained in:
Daniel Scalzi
2020-07-18 00:41:46 -04:00
parent 0ac31e5eb7
commit 0e83a071d7
6 changed files with 43 additions and 14 deletions

Binary file not shown.

6
package-lock.json generated
View File

@@ -1408,9 +1408,9 @@
"dev": true "dev": true
}, },
"typescript": { "typescript": {
"version": "3.9.6", "version": "3.9.7",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
"integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
"dev": true "dev": true
}, },
"universalify": { "universalify": {

View File

@@ -34,7 +34,7 @@
"@typescript-eslint/parser": "^3.6.1", "@typescript-eslint/parser": "^3.6.1",
"eslint": "^7.4.0", "eslint": "^7.4.0",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"typescript": "^3.9.6" "typescript": "^3.9.7"
}, },
"dependencies": { "dependencies": {
"axios": "^0.19.2", "axios": "^0.19.2",

View File

@@ -128,7 +128,7 @@ export abstract class ModuleStructure extends BaseModelStructure<Module> {
protected async invokeClaritas(moduleCandidates: ModuleCandidate[]): Promise<void> { protected async invokeClaritas(moduleCandidates: ModuleCandidate[]): Promise<void> {
if(this.getClaritasType() != null) { if(this.getClaritasType() != null) {
const claritasExecutor = new ClaritasWrapper() const claritasExecutor = new ClaritasWrapper(this.absoluteRoot)
let claritasCandidates = moduleCandidates let claritasCandidates = moduleCandidates
const exceptionCandidates: [ModuleCandidate, ClaritasException][] = [] const exceptionCandidates: [ModuleCandidate, ClaritasException][] = []

View File

@@ -1,20 +1,36 @@
import { JarExecutor } from './JarExecutor' import { JarExecutor } from './JarExecutor'
import { join } from 'path' import { join, resolve } from 'path'
import { ClaritasResult } from '../../model/claritas/ClaritasResult' import { ClaritasResult } from '../../model/claritas/ClaritasResult'
import { MinecraftVersion } from '../MinecraftVersion' import { MinecraftVersion } from '../MinecraftVersion'
import { LibraryType } from '../../model/claritas/ClaritasLibraryType' import { LibraryType } from '../../model/claritas/ClaritasLibraryType'
import { pathExists, remove, readFile } from 'fs-extra'
export class ClaritasWrapper extends JarExecutor<ClaritasResult> { export class ClaritasWrapper extends JarExecutor<ClaritasResult> {
constructor() { private readonly WORK_DIR: string
private readonly OUTPUT_FILE: string
constructor(cwd: string) {
super('Claritas') super('Claritas')
this.stdoutListeners.push((data) => {
const clean = data.toString('utf8').trim() as string this.WORK_DIR = resolve(cwd, 'claritasWork')
const spike = 'results::' this.OUTPUT_FILE = resolve(this.WORK_DIR, 'claritasOutput.json')
if(clean.startsWith(spike)) {
this.lastExecutionResult = JSON.parse(clean.substr(spike.length)) as ClaritasResult this.onCloseListeners.push(async (code) => {
if(code !== 0) {
this.logger.error('Claritas finished with non-zero exit code, ', code)
this.lastExecutionResult = undefined!
} else {
if(pathExists(this.OUTPUT_FILE)) {
this.lastExecutionResult = JSON.parse((await readFile(this.OUTPUT_FILE)).toString('utf8'))
} else {
this.logger.error('Claritas output file not found when exit code is 0, is this a bug?')
this.lastExecutionResult = undefined!
}
} }
await this.cleanOutput()
}) })
} }
protected getJarPath(): string { protected getJarPath(): string {
@@ -25,8 +41,16 @@ export class ClaritasWrapper extends JarExecutor<ClaritasResult> {
return super.executeJar( return super.executeJar(
'--absoluteJarPaths', absoluteJarPaths.join(','), '--absoluteJarPaths', absoluteJarPaths.join(','),
'--libraryType', libraryType, '--libraryType', libraryType,
'--mcVersion', mcVersion.toString() '--mcVersion', mcVersion.toString(),
'--outputFile', this.OUTPUT_FILE,
'--previewOutput', 'true'
) )
} }
private async cleanOutput(): Promise<void> {
if(pathExists(this.WORK_DIR)) {
remove(this.WORK_DIR)
}
}
} }

View File

@@ -11,6 +11,7 @@ export abstract class JarExecutor<T> {
protected stdoutListeners: ((chunk: any) => void)[] = [] protected stdoutListeners: ((chunk: any) => void)[] = []
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
protected stderrListeners: ((chunk: any) => void)[] = [] protected stderrListeners: ((chunk: any) => void)[] = []
protected onCloseListeners: ((code: number) => Promise<void>)[] = []
protected lastExecutionResult!: T protected lastExecutionResult!: T
@@ -34,10 +35,14 @@ export abstract class JarExecutor<T> {
child.stderr.on('data', (data) => this.logger.error(data.toString('utf8').trim())) child.stderr.on('data', (data) => this.logger.error(data.toString('utf8').trim()))
this.stderrListeners.forEach(l => child.stderr.on('data', l)) this.stderrListeners.forEach(l => child.stderr.on('data', l))
child.on('close', code => { child.on('close', async code => {
this.logger.info('Exited with code', code) this.logger.info('Exited with code', code)
for(const l of this.onCloseListeners) {
await l(code)
}
resolve(this.lastExecutionResult) resolve(this.lastExecutionResult)
}) })
child.on('error', (err) => { child.on('error', (err) => {
this.logger.info('Error during process execution', err) this.logger.info('Error during process execution', err)
reject(err) reject(err)