forked from clearlydefined/crawler
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbaseHandler.js
More file actions
91 lines (77 loc) · 2.31 KB
/
baseHandler.js
File metadata and controls
91 lines (77 loc) · 2.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright (c) Microsoft Corporation and others. Licensed under the MIT license.
// SPDX-License-Identifier: MIT
const tmp = require('tmp')
const semver = require('semver')
const EntitySpec = require('../lib/entitySpec')
const fs = require('fs')
const crypto = require('crypto')
const config = require('painless-config')
tmp.setGracefulCleanup()
class BaseHandler {
constructor(options) {
this.options = options
this.logger = options.logger
}
/**
* Handle the given request in a way appropriate for the given request
* @param {Request} request
*/
// eslint-disable-next-line no-unused-vars
handle(request) {}
get tmpOptions() {
const tmpBase = config.get('TEMPDIR') || (process.platform === 'win32' ? 'c:/temp/' : '/tmp/')
return {
unsafeCleanup: true,
tmpdir: tmpBase,
prefix: 'cd-'
}
}
// Compute interesting hashes for the given file
async computeHashes(file) {
if (!file) return null
const sha1 = await this._hashFile(file, 'sha1')
const sha256 = await this._hashFile(file, 'sha256')
return { sha1, sha256 }
}
_hashFile(path, algorithm) {
const file = fs.createReadStream(path)
const hash = crypto.createHash(algorithm)
hash.setEncoding('hex')
return new Promise((resolve, reject) => {
file.on('end', () => {
hash.end()
resolve(hash.read())
})
file.on('error', error => reject(error))
file.pipe(hash)
})
}
createTempFile(request) {
const result = tmp.fileSync(this.tmpOptions)
request.trackCleanup(result.removeCallback)
return result
}
createTempDir(request) {
const result = tmp.dirSync(this.tmpOptions)
request.trackCleanup(result.removeCallback)
return result
}
toSpec(request) {
return request.casedSpec || EntitySpec.fromUrl(request.url)
}
getLatestVersion(versions) {
if (!Array.isArray(versions)) return versions
if (versions.length === 0) return null
if (versions.length === 1) return versions[0]
return versions
.filter(v => !this.isPreReleaseVersion(v))
.reduce((max, current) => (semver.gt(current, max) ? current : max), versions[0])
}
isPreReleaseVersion(version) {
return semver.prerelease(version) !== null
}
markSkip(request) {
return request.markSkip('Missing ')
}
}
module.exports = BaseHandler