1 | 'use strict';
|
2 |
|
3 | var path = require('path');
|
4 | var fs = require('fs');
|
5 | var url = require('url');
|
6 | var request = require('request');
|
7 | var stream = require('stream');
|
8 | var streamToBuffer = require('stream-to-buffer');
|
9 |
|
10 |
|
11 | module.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 |