UNPKG

7.55 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.lsdRegister_ = exports.lsdRegister = void 0;
4const debug_ = require("debug");
5const request = require("request");
6const requestPromise = require("request-promise-native");
7const BufferUtils_1 = require("r2-utils-js/dist/es8-es2017/src/_utils/stream/BufferUtils");
8const lsd_1 = require("../parser/epub/lsd");
9const serializable_1 = require("../serializable");
10const URITemplate = require("urijs/src/URITemplate");
11const debug = debug_("r2:lcp#lsd/register");
12const IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev");
13async function lsdRegister(lsdJSON, deviceIDManager, httpHeaders) {
14 if (lsdJSON instanceof lsd_1.LSD) {
15 return lsdRegister_(lsdJSON, deviceIDManager);
16 }
17 let lsd;
18 try {
19 lsd = (0, serializable_1.TaJsonDeserialize)(lsdJSON, lsd_1.LSD);
20 }
21 catch (err) {
22 debug(err);
23 debug(lsdJSON);
24 return Promise.reject("Bad LSD JSON?");
25 }
26 const obj = lsdRegister_(lsd, deviceIDManager, httpHeaders);
27 return (0, serializable_1.TaJsonSerialize)(obj);
28}
29exports.lsdRegister = lsdRegister;
30async function lsdRegister_(lsd, deviceIDManager, httpHeaders) {
31 if (!lsd) {
32 return Promise.reject("LCP LSD data is missing.");
33 }
34 if (!lsd.Links) {
35 return Promise.reject("No LSD links!");
36 }
37 const licenseRegister = lsd.Links.find((link) => {
38 return link.Rel === "register";
39 });
40 if (!licenseRegister) {
41 return Promise.reject("No LSD register link!");
42 }
43 let deviceID;
44 try {
45 deviceID = await deviceIDManager.getDeviceID();
46 }
47 catch (err) {
48 debug(err);
49 return Promise.reject("Problem getting Device ID !?");
50 }
51 let deviceNAME;
52 try {
53 deviceNAME = await deviceIDManager.getDeviceNAME();
54 }
55 catch (err) {
56 debug(err);
57 return Promise.reject("Problem getting Device NAME !?");
58 }
59 let doRegister = false;
60 if (lsd.Status === lsd_1.StatusEnum.Ready) {
61 doRegister = true;
62 }
63 else if (lsd.Status === lsd_1.StatusEnum.Active) {
64 let deviceIDForStatusDoc;
65 try {
66 deviceIDForStatusDoc = await deviceIDManager.checkDeviceID(lsd.ID);
67 }
68 catch (err) {
69 debug(err);
70 }
71 if (!deviceIDForStatusDoc) {
72 doRegister = true;
73 }
74 else if (deviceIDForStatusDoc !== deviceID) {
75 if (IS_DEV) {
76 debug("LSD registered device ID is different? ", lsd.ID, ": ", deviceIDForStatusDoc, " --- ", deviceID);
77 }
78 doRegister = true;
79 }
80 }
81 if (!doRegister) {
82 return Promise.reject("No need to LSD register.");
83 }
84 let registerURL = licenseRegister.Href;
85 if (licenseRegister.Templated) {
86 const urlTemplate = new URITemplate(registerURL);
87 const uri1 = urlTemplate.expand({ id: deviceID, name: deviceNAME }, { strict: true });
88 registerURL = uri1.toString();
89 }
90 if (IS_DEV) {
91 debug("REGISTER: " + registerURL);
92 }
93 return new Promise(async (resolve, reject) => {
94 const failure = (err) => {
95 reject(err);
96 };
97 const success = async (response) => {
98 if (IS_DEV) {
99 Object.keys(response.headers).forEach((header) => {
100 debug(header + " => " + response.headers[header]);
101 });
102 }
103 if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) {
104 let failBuff;
105 try {
106 failBuff = await (0, BufferUtils_1.streamToBufferPromise)(response);
107 }
108 catch (buffErr) {
109 if (IS_DEV) {
110 debug(buffErr);
111 }
112 failure(response.statusCode);
113 return;
114 }
115 try {
116 const failStr = failBuff.toString("utf8");
117 if (IS_DEV) {
118 debug(failStr);
119 }
120 try {
121 const failJson = global.JSON.parse(failStr);
122 if (IS_DEV) {
123 debug(failJson);
124 }
125 failJson.httpStatusCode = response.statusCode;
126 failure(failJson);
127 }
128 catch (jsonErr) {
129 if (IS_DEV) {
130 debug(jsonErr);
131 }
132 failure({ httpStatusCode: response.statusCode, httpResponseBody: failStr });
133 }
134 }
135 catch (strErr) {
136 if (IS_DEV) {
137 debug(strErr);
138 }
139 failure(response.statusCode);
140 }
141 return;
142 }
143 let responseData;
144 try {
145 responseData = await (0, BufferUtils_1.streamToBufferPromise)(response);
146 }
147 catch (err) {
148 reject(err);
149 return;
150 }
151 const responseStr = responseData.toString("utf8");
152 if (IS_DEV) {
153 debug(responseStr);
154 }
155 const responseJson = global.JSON.parse(responseStr);
156 if (IS_DEV) {
157 debug(responseJson);
158 debug(responseJson.status);
159 }
160 if (responseJson.status === "active") {
161 try {
162 await deviceIDManager.recordDeviceID(responseJson.id);
163 }
164 catch (err) {
165 debug(err);
166 }
167 }
168 try {
169 const newLsd = (0, serializable_1.TaJsonDeserialize)(responseJson, lsd_1.LSD);
170 if (IS_DEV) {
171 debug(newLsd);
172 }
173 resolve(newLsd);
174 }
175 catch (err) {
176 debug(err);
177 resolve(responseJson);
178 }
179 };
180 const headers = Object.assign({
181 "Accept": "application/json,application/xml",
182 "Accept-Language": "en-UK,en-US;q=0.7,en;q=0.5",
183 "User-Agent": "Readium2-LCP",
184 }, httpHeaders ? httpHeaders : {});
185 const needsStreamingResponse = true;
186 if (needsStreamingResponse) {
187 request.post({
188 headers,
189 method: "POST",
190 timeout: 2000,
191 uri: registerURL,
192 })
193 .on("response", async (res) => {
194 try {
195 await success(res);
196 }
197 catch (successError) {
198 failure(successError);
199 return;
200 }
201 })
202 .on("error", failure);
203 }
204 else {
205 let response;
206 try {
207 response = await requestPromise({
208 headers,
209 method: "POST",
210 resolveWithFullResponse: true,
211 uri: registerURL,
212 });
213 }
214 catch (err) {
215 failure(err);
216 return;
217 }
218 await success(response);
219 }
220 });
221}
222exports.lsdRegister_ = lsdRegister_;
223//# sourceMappingURL=register.js.map
\No newline at end of file