1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.lsdRegister_ = exports.lsdRegister = void 0;
|
4 | const debug_ = require("debug");
|
5 | const request = require("request");
|
6 | const requestPromise = require("request-promise-native");
|
7 | const BufferUtils_1 = require("r2-utils-js/dist/es8-es2017/src/_utils/stream/BufferUtils");
|
8 | const lsd_1 = require("../parser/epub/lsd");
|
9 | const serializable_1 = require("../serializable");
|
10 | const URITemplate = require("urijs/src/URITemplate");
|
11 | const debug = debug_("r2:lcp#lsd/register");
|
12 | const IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev");
|
13 | async 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 | }
|
29 | exports.lsdRegister = lsdRegister;
|
30 | async 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 | }
|
222 | exports.lsdRegister_ = lsdRegister_;
|
223 |
|
\ | No newline at end of file |