UNPKG

2.11 kBJavaScriptView Raw
1'use strict';
2
3var path = require('path');
4var fs = require('fs');
5var url = require('url');
6var request = require('request');
7var stream = require('stream');
8var streamToBuffer = require('stream-to-buffer');
9
10
11module.exports = function(file, options, callback) {
12 var verbose = options.verbose;
13
14 if(isReadableStream(file)) {
15 streamToBuffer(file, function (err, buffer) {
16 if(err){
17 callback(err);
18 } else {
19 performPost(buffer);
20 }
21 });
22 } else {
23 performPost(file);
24 }
25
26 function performPost(fileBytes) {
27
28 var requestOptions = {
29 url: getUri(options),
30 headers: {
31 'X-Octopus-ApiKey': options.apikey
32 },
33 formData: extractFormData(fileBytes, options),
34 json: true
35 };
36
37 if (verbose) {
38 console.info('Pushing to: ' + requestOptions.url);
39 }
40
41 request.post(requestOptions, function (err, resp, body) {
42 if (err) {
43 callback(err);
44 } else {
45 if (verbose) {
46 console.info('Push response: ' + resp.statusCode);
47 }
48 if (resp.statusCode === 200 || resp.statusCode === 201) {
49 callback(null, body);
50 } else {
51 callback({
52 statusCode: resp.statusCode,
53 statusMessage: resp.statusMessage,
54 body: body,
55 response: resp
56 });
57 }
58 }
59 });
60 }
61
62 function getUri(options) {
63 var packageUri = options.host.replace(/\/?$/, '/');
64
65 packageUri = url.resolve(packageUri, 'api/packages/raw');
66 if (!!options.replace) {
67 packageUri += '?replace=true';
68 }
69 return packageUri;
70 }
71
72 function extractFormData(file, options) {
73
74 var fileContents, fileName;
75 if (typeof file === 'string') {
76 fileContents = fs.createReadStream(file);
77 fileName = path.basename(options.name || file);
78 } else if (Buffer.isBuffer(file) || isReadableStream(file)) {
79 fileContents = file;
80 fileName = path.basename(options.name);
81 }
82
83 return {
84 file: {
85 value: fileContents,
86 options: {
87 filename: fileName,
88 contentType: 'application/octet-stream'
89 }
90 }
91 };
92 }
93
94 function isReadableStream(obj) {
95 return obj instanceof stream.Stream && typeof (obj._read) === 'function' && typeof (obj._readableState) === 'object';
96 }
97};
\No newline at end of file