UNPKG

2.43 kBJavaScriptView Raw
1'use strict'
2
3const fs = require('fs')
4const async = require('async')
5const rimraf = require('rimraf')
6const events = require('events')
7const ClinicDoctor = require('../index.js')
8const getLoggingPaths = require('@nearform/clinic-common').getLoggingPaths('doctor')
9const SystemInfoDecoder = require('../format/system-info-decoder.js')
10const TraceEventDecoder = require('../format/trace-event-decoder.js')
11const ProcessStatDecoder = require('../format/process-stat-decoder.js')
12
13class CollectAndRead extends events.EventEmitter {
14 constructor (options, ...args) {
15 super()
16 const self = this
17 const tool = this.tool = new ClinicDoctor(options)
18
19 tool.collect([process.execPath, ...args], function (err, dirname) {
20 self.files = getLoggingPaths({ path: dirname })
21 if (err) return self.emit('error', err)
22
23 self.noError = true
24
25 const systemInfo = fs.createReadStream(self.files['/systeminfo'])
26 .pipe(new SystemInfoDecoder())
27 const traceEvent = fs.createReadStream(self.files['/traceevent'])
28 .pipe(new TraceEventDecoder(systemInfo))
29 const processStat = fs.createReadStream(self.files['/processstat'])
30 .pipe(new ProcessStatDecoder())
31
32 self.systemInfo = systemInfo
33 self.traceEvent = traceEvent
34 self.processStat = processStat
35
36 self._setupAutoCleanup()
37 self.emit('ready')
38 })
39 }
40
41 cleanup () {
42 rimraf.sync(this.files['/'])
43 }
44
45 _setupAutoCleanup () {
46 const self = this
47
48 async.parallel({
49 systemInfo (done) {
50 self.systemInfo.once('end', function () {
51 fs.unlink(self.files['/systeminfo'], function (err) {
52 if (err) return done(err)
53 done(null)
54 })
55 })
56 },
57 traceEvent (done) {
58 self.traceEvent.once('end', function () {
59 fs.unlink(self.files['/traceevent'], function (err) {
60 if (err) return done(err)
61 done(null)
62 })
63 })
64 },
65 processStat (done) {
66 self.processStat.once('end', function () {
67 fs.unlink(self.files['/processstat'], function (err) {
68 if (err) return done(err)
69 done(null)
70 })
71 })
72 }
73 }, function (err, output) {
74 if (err) return self.emit('error', err)
75
76 fs.rmdir(self.files['/'], function (err) {
77 if (err) return self.emit('error', err)
78 })
79 })
80 }
81}
82
83module.exports = CollectAndRead