1 | var fs = require('fs-promise')
|
2 | var PassThrough = require('stream').PassThrough
|
3 | var urlUtils = require('url')
|
4 |
|
5 | function writeStreamToFile (filename, stream) {
|
6 | return new Promise(function (resolve, reject) {
|
7 | var file = fs.createWriteStream(filename)
|
8 | stream.on('error', reject)
|
9 | stream.on('end', resolve)
|
10 | stream.pipe(file)
|
11 | })
|
12 | }
|
13 |
|
14 | module.exports = function (options) {
|
15 | var url = typeof options === 'object' && options.hasOwnProperty('url') ? options.url : undefined
|
16 | var parsedUrl = urlUtils.parse(url)
|
17 | var path = parsedUrl.path
|
18 |
|
19 | return {
|
20 | filename: function (url) {
|
21 | return path + '/' + encodeURIComponent(url)
|
22 | },
|
23 |
|
24 | responseExists: function (url) {
|
25 | return fs.exists(this.filename(url))
|
26 | },
|
27 |
|
28 | writeResponse: function (url, response) {
|
29 | var filename = this.filename(url)
|
30 | var body = response.body
|
31 | delete response.body
|
32 |
|
33 | var fileStream = body.pipe(new PassThrough())
|
34 | var responseStream = body.pipe(new PassThrough())
|
35 |
|
36 | var responseJson = JSON.stringify(response, null, 2)
|
37 |
|
38 | return fs
|
39 | .mkdirs(path)
|
40 | .then(function () {
|
41 | return fs.writeFile(filename + '.json', responseJson)
|
42 | })
|
43 | .then(function () {
|
44 | writeStreamToFile(filename, fileStream).catch(function (e) {
|
45 | console.error((e && e.stack) || e)
|
46 | })
|
47 |
|
48 | response.body = responseStream
|
49 | return response
|
50 | })
|
51 | },
|
52 |
|
53 | readResponse: function (url) {
|
54 | var filename = this.filename(url)
|
55 |
|
56 | return fs.readFile(filename + '.json', 'utf-8').then(function (contents) {
|
57 | var response = JSON.parse(contents)
|
58 | response.body = fs.createReadStream(filename)
|
59 | return response
|
60 | })
|
61 | }
|
62 | }
|
63 | }
|