UNPKG

2.15 kBJavaScriptView Raw
1var https = require("https");
2var http = require("http");
3var extend = require("./extend");
4var HttpsProxyAgent = require("https-proxy-agent");
5var userAgent = getUA();
6
7function getUA() {
8 var os = require("os");
9 var version = require("../package.json").version;
10
11 return os.platform() + "/" + os.release() + " " +
12 "node/" + process.versions.node + " " +
13 "node-browserstack/" + version;
14}
15
16var BaseClient = function(settings) {
17 if (!settings.username) {
18 throw new Error("Username is required.");
19 }
20 if (!settings.password) {
21 throw new Error("Password is required.");
22 }
23
24 extend(this, settings);
25
26 this.authHeader = "Basic " +
27 Buffer.from(this.username + ":" + this.password).toString("base64");
28};
29
30BaseClient.prototype.request = function(options, data, fn) {
31 if (typeof data === "function") {
32 fn = data;
33 data = null;
34 }
35
36 fn = fn || function() {};
37
38 var reqOptions = extend({
39 host: this.server.host,
40 port: this.server.port,
41 method: "GET",
42 headers: {
43 authorization: this.authHeader,
44 "content-type": "application/json",
45 "user-agent": userAgent,
46 "content-length": typeof data === "string" ? data.length : 0
47 },
48 agent: (this.proxy) ? new HttpsProxyAgent(this.proxy) : null
49 }, options);
50
51 var req = (this.useHttp ? http : https).request(reqOptions, function(res) {
52 var response = "";
53 res.setEncoding("utf8");
54 res.on("data", function(chunk) {
55 response += chunk;
56 });
57 res.on("end", function() {
58 if (res.statusCode !== 200) {
59 var message;
60 if (res.headers["content-type"].indexOf("json") !== -1) {
61 response = JSON.parse(response);
62 message = response.message;
63 if (response.errors && response.errors.length) {
64 message += " - " + response.errors.map(function(error) {
65 return "`" + error.field + "` " + error.code;
66 }).join(", ");
67 }
68 } else {
69 message = response;
70 }
71 if (!message && res.statusCode === 403) {
72 message = "Forbidden";
73 }
74 fn(new Error(message));
75 } else {
76 fn(null, JSON.parse(response));
77 }
78 });
79 });
80
81 req.on("error", fn);
82
83 if (data) {
84 req.write(data);
85 }
86
87 req.end();
88};
89
90module.exports = BaseClient;