-
Notifications
You must be signed in to change notification settings - Fork 1
/
client.js
142 lines (128 loc) · 3.88 KB
/
client.js
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
var http = require('http');
var URN = require('./urn');
var Promise = require('promise');
var extend = require('util-extend');
var xtend = require('xtend');
var url = require('url');
// require('debug').enable('livefyre-subscriptions/client')
var log = require('debug')('livefyre-subscriptions/client');
exports.token = process.env.LFTOKEN || 'SET LFTOKEN';
/**
* Request the API to a specific user's subscriptions
* @param opts.network {string}
* @param opts.user {string} URN of user
*/
exports.getForUser = function (user) {
var userId = user.userId;
var network = user.network;
if ( ! user.lftoken) {
user = userWithToken(user);
}
return getResponse(userSubscriptionsRequest(user))
.then(function (res) {
if (res.statusCode !== 200) {
throw new Error('HTTP '+res.statusCode+' Error when getting subscriptions for '+JSON.stringify(user));
}
return parseResponse(res);
})
.then(function (resObj) {
return resObj.data;
});
};
/**
* Request the API to create a new subscription for a user
*/
exports.createForUser = function (user, subscription) {
if ( ! user.lftoken) {
user = userWithToken(user);
}
var fakePromise = new Promise(function (resolve, reject) {
reject(new Error('IMPLEMENT THIS'));
});
var req = subscribeRequest({
user: user,
subscription: subscription
});
return new Promise(function (resolve, reject) {
req.once('response', resolve);
req.once('error', reject);
}).then(function (res) {
return parseResponse(res).then(function (resText) {
if (res.statusCode !== 200) {
throw new Error('HTTP '+res.statusCode+' Error when creating subscription: '+JSON.stringify(resText));
}
return resText;
});
});
};
function userWithToken(user) {
return xtend(user, {
lftoken: exports.token
});
}
function getResponse(opts) {
var req = http.request(opts);
return new Promise(function (resolve, reject) {
req.once('response', resolve);
req.once('error', reject);
req.end();
});
}
function parseResponse(res) {
var resText = '';
res.on('data', function (d) {
resText += d;
});
return new Promise(function (resolve, reject) {
res.on('end', function () {
var resObject;
try {
resObject = JSON.parse(resText);
} catch (e) {
reject(e);
}
resolve(resObject);
});
});
}
var userSubscriptionsUrlTemplate = 'http://{quillHost}/api/v4/{userUrn}:subscriptions/?lftoken={lftoken}';
function userSubscriptionsUrl (opts) {
return userSubscriptionsUrlTemplate
.replace('{quillHost}', quillHost(opts))
.replace('{lftoken}', opts.lftoken)
.replace('{userUrn}', URN.forUser({
network: opts.network,
userId: opts.userId
}));
}
function userSubscriptionsRequest(opts) {
var req = url.parse(userSubscriptionsUrl(opts));
log('userSubscriptionsRequest', req);
return req;
}
function networkName(network) {
return network.split('.')[0];
}
function quillHost(opts) {
if (opts.network === 'livefyre.com') {
return 'quill.livefyre.com';
}
return networkName(opts.network) + '.quill.fyre.co';
}
function subscribeRequest(opts) {
var user = opts.user;
var requestData = {
subscriptions: [opts.subscription]
};
var requestString = JSON.stringify(requestData);
var requestOptions = url.parse(userSubscriptionsUrl(user));
requestOptions.method = 'POST';
requestOptions.headers = {
'Content-Type': 'application/json',
'Content-Length': requestString.length
};
var req = http.request(requestOptions);
req.write(requestString);
req.end();
return req;
}