1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.lsdRenew_ = exports.lsdRenew = 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 URI = require("urijs");
|
11 | const URITemplate = require("urijs/src/URITemplate");
|
12 | const debug = debug_("r2:lcp#lsd/renew");
|
13 | const IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev");
|
14 | async function lsdRenew(end, lsdJSON, deviceIDManager, httpHeaders) {
|
15 | if (lsdJSON instanceof lsd_1.LSD) {
|
16 | return lsdRenew_(end, lsdJSON, deviceIDManager);
|
17 | }
|
18 | let lsd;
|
19 | try {
|
20 | lsd = (0, serializable_1.TaJsonDeserialize)(lsdJSON, lsd_1.LSD);
|
21 | }
|
22 | catch (err) {
|
23 | debug(err);
|
24 | debug(lsdJSON);
|
25 | return Promise.reject("Bad LSD JSON?");
|
26 | }
|
27 | const obj = lsdRenew_(end, lsd, deviceIDManager, httpHeaders);
|
28 | return (0, serializable_1.TaJsonSerialize)(obj);
|
29 | }
|
30 | exports.lsdRenew = lsdRenew;
|
31 | async function lsdRenew_(end, lsd, deviceIDManager, httpHeaders) {
|
32 | if (!lsd) {
|
33 | return Promise.reject("LCP LSD data is missing.");
|
34 | }
|
35 | if (!lsd.Links) {
|
36 | return Promise.reject("No LSD links!");
|
37 | }
|
38 | const licenseRenew = lsd.Links.find((link) => {
|
39 | return link.Rel === "renew";
|
40 | });
|
41 | if (!licenseRenew) {
|
42 | return Promise.reject("No LSD renew link!");
|
43 | }
|
44 | let deviceID;
|
45 | try {
|
46 | deviceID = await deviceIDManager.getDeviceID();
|
47 | }
|
48 | catch (err) {
|
49 | debug(err);
|
50 | return Promise.reject("Problem getting Device ID !?");
|
51 | }
|
52 | let deviceNAME;
|
53 | try {
|
54 | deviceNAME = await deviceIDManager.getDeviceNAME();
|
55 | }
|
56 | catch (err) {
|
57 | debug(err);
|
58 | return Promise.reject("Problem getting Device NAME !?");
|
59 | }
|
60 | let renewURL = licenseRenew.Href;
|
61 | if (licenseRenew.Templated) {
|
62 | const urlTemplate = new URITemplate(renewURL);
|
63 | const uri1 = urlTemplate.expand({ end: "xxx", id: deviceID, name: deviceNAME }, { strict: false });
|
64 | renewURL = uri1.toString();
|
65 | const uri2 = new URI(renewURL);
|
66 | uri2.search((data) => {
|
67 | data.end = end === null || end === void 0 ? void 0 : end.toISOString();
|
68 | });
|
69 | renewURL = uri2.toString();
|
70 | }
|
71 | if (IS_DEV) {
|
72 | debug("RENEW: " + renewURL);
|
73 | }
|
74 | return new Promise(async (resolve, reject) => {
|
75 | const failure = (err) => {
|
76 | reject(err);
|
77 | };
|
78 | const success = async (response) => {
|
79 | if (IS_DEV) {
|
80 | Object.keys(response.headers).forEach((header) => {
|
81 | debug(header + " => " + response.headers[header]);
|
82 | });
|
83 | }
|
84 | if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) {
|
85 | let failBuff;
|
86 | try {
|
87 | failBuff = await (0, BufferUtils_1.streamToBufferPromise)(response);
|
88 | }
|
89 | catch (buffErr) {
|
90 | if (IS_DEV) {
|
91 | debug(buffErr);
|
92 | }
|
93 | failure(response.statusCode);
|
94 | return;
|
95 | }
|
96 | try {
|
97 | const failStr = failBuff.toString("utf8");
|
98 | if (IS_DEV) {
|
99 | debug(failStr);
|
100 | }
|
101 | try {
|
102 | const failJson = global.JSON.parse(failStr);
|
103 | if (IS_DEV) {
|
104 | debug(failJson);
|
105 | }
|
106 | failJson.httpStatusCode = response.statusCode;
|
107 | failure(failJson);
|
108 | }
|
109 | catch (jsonErr) {
|
110 | if (IS_DEV) {
|
111 | debug(jsonErr);
|
112 | }
|
113 | failure({ httpStatusCode: response.statusCode, httpResponseBody: failStr });
|
114 | }
|
115 | }
|
116 | catch (strErr) {
|
117 | if (IS_DEV) {
|
118 | debug(strErr);
|
119 | }
|
120 | failure(response.statusCode);
|
121 | }
|
122 | return;
|
123 | }
|
124 | let responseData;
|
125 | try {
|
126 | responseData = await (0, BufferUtils_1.streamToBufferPromise)(response);
|
127 | }
|
128 | catch (err) {
|
129 | reject(err);
|
130 | return;
|
131 | }
|
132 | const responseStr = responseData.toString("utf8");
|
133 | if (IS_DEV) {
|
134 | debug(responseStr);
|
135 | }
|
136 | const responseJson = global.JSON.parse(responseStr);
|
137 | if (IS_DEV) {
|
138 | debug(responseJson);
|
139 | }
|
140 | try {
|
141 | const newLsd = (0, serializable_1.TaJsonDeserialize)(responseJson, lsd_1.LSD);
|
142 | if (IS_DEV) {
|
143 | debug(newLsd);
|
144 | }
|
145 | resolve(newLsd);
|
146 | }
|
147 | catch (err) {
|
148 | debug(err);
|
149 | resolve(responseJson);
|
150 | }
|
151 | };
|
152 | const headers = Object.assign({
|
153 | "Accept": "application/json,application/xml",
|
154 | "Accept-Language": "en-UK,en-US;q=0.7,en;q=0.5",
|
155 | "User-Agent": "Readium2-LCP",
|
156 | }, httpHeaders ? httpHeaders : {});
|
157 | const needsStreamingResponse = true;
|
158 | if (needsStreamingResponse) {
|
159 | request.put({
|
160 | headers,
|
161 | method: "PUT",
|
162 | timeout: 5000,
|
163 | uri: renewURL,
|
164 | })
|
165 | .on("response", async (res) => {
|
166 | try {
|
167 | await success(res);
|
168 | }
|
169 | catch (successError) {
|
170 | failure(successError);
|
171 | return;
|
172 | }
|
173 | })
|
174 | .on("error", failure);
|
175 | }
|
176 | else {
|
177 | let response;
|
178 | try {
|
179 | response = await requestPromise({
|
180 | headers,
|
181 | method: "PUT",
|
182 | resolveWithFullResponse: true,
|
183 | uri: renewURL,
|
184 | });
|
185 | }
|
186 | catch (err) {
|
187 | failure(err);
|
188 | return;
|
189 | }
|
190 | await success(response);
|
191 | }
|
192 | });
|
193 | }
|
194 | exports.lsdRenew_ = lsdRenew_;
|
195 |
|
\ | No newline at end of file |