๐Ÿ“ฆ jtai / node-bravia-androidtv

๐Ÿ“„ braviaAuth.js ยท 97 lines
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
92
93
94
95
96
97var Request = require('request');
var Q = require('q');
var StringFormat = require('string-format');

const os = require('os');

function BraviaAuth(discovery) {
  this.discovery = discovery;
  this.clientId = '{hostname}:642a76ca-9102-11e6-ae22-56b6b6499611';
  this.nickname = 'node-bravia-androidtv ({hostname})';
}

BraviaAuth.prototype.getCookie = function(code) {
  var deferred = Q.defer();

  if (this.cookie) {
    deferred.resolve(this.cookie);
  } else {
    var self = this;
    this.discovery.getUrl().then(function(url) {
      var clientId = self.clientId.format({hostname: hostname()});
      var nickname = self.nickname.format({hostname: os.hostname()});
      authRequest(url, clientId, nickname, code).then(function(response) {
        if (response.statusCode == 200) {
          var cookie = parseCookie(response.headers);
          self.cookie = cookie;
          deferred.resolve(cookie);
        } else if (response.statusCode == 401) {
          deferred.resolve();
        } else {
          deferred.reject('Unexpected '+response.statusCode+' response');
        }
      }, deferred.reject);
    }, deferred.reject);
  }

  return deferred.promise;
};

BraviaAuth.prototype.clearCookie = function() {
  this.cookie = null;
};

function hostname() {
  os.hostname()
    .toLowerCase()
    .replace(/\..*$/, '')
    .replace(/[^a-z0-9]/g, '');
}

function authRequest(url, clientId, nickname, code) {
  var deferred = Q.defer();

  var headers = {};
  if (code !== undefined) {
    headers['Authorization'] = 'Basic ' + new Buffer(':' + code).toString('base64');
  }

  Request.post({
    method: 'POST',
    uri: url + '/accessControl',
    json: {
      id: 1,
      method: 'actRegister',
      version: '1.0',
      params: [
        {
          clientid: clientId,
          nickname: nickname,
          level: 'private'
        },
        [
          {
            value: 'yes',
            function: 'WOL'
          }
        ]
      ]
    },
    headers: headers
  }, function (error, response, body) {
    if (!error) {
      deferred.resolve(response);
    } else{
      deferred.reject(error);
    }
  });

  return deferred.promise;
}

function parseCookie(headers) {
  return headers['set-cookie'][0].split(';')[0];
};

module.exports = BraviaAuth;