Skip to content

Commit 8fdcd94

Browse files
author
AJ ONeal
committed
fix: unbreak node, undo API changes
1 parent 3252af2 commit 8fdcd94

File tree

4 files changed

+287
-95
lines changed

4 files changed

+287
-95
lines changed

dashsight.js

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@
55
//@ts-ignore
66
exports.DashSight = Dashsight;
77

8-
/**
9-
* @type {RequestInit} defaultOpts
10-
*/
11-
let defaultOpts = {
12-
headers: {
13-
Accept: "application/json",
14-
"Content-Type": "application/json",
15-
},
16-
};
17-
188
const DUFFS = 100000000;
199

2010
/** @typedef {import('./').CoreUtxo} CoreUtxo */
@@ -282,26 +272,80 @@
282272
return insight;
283273
};
284274

275+
/** @type {HeadersInit} */
276+
let defaultHeaders = {
277+
Accept: "application/json",
278+
"Content-Type": "application/json",
279+
};
280+
285281
/**
286282
* @param {String | URL | Request} url
287-
* @param {RequestInit} [opts]
283+
* @param {RequestInit} [_opts]
288284
*/
289-
Dashsight.fetch = async function dashfetch(url, opts) {
290-
opts = Object.assign({}, defaultOpts, opts);
285+
Dashsight.fetch = async function dashfetch(url, _opts) {
286+
let opts = Object.assign({ headers: {} }, _opts);
287+
Object.assign(opts.headers, defaultHeaders, _opts?.headers);
288+
291289
if (opts.body) {
292-
opts.body = JSON.stringify(opts.body);
290+
//@ts-ignore
291+
let contentType = opts.headers["Content-Type"] || "";
292+
let isJson = contentType.startsWith("application/json");
293+
if (isJson) {
294+
opts.body = JSON.stringify(opts.body);
295+
}
293296
}
294297

295298
let resp = await fetch(url, opts);
299+
let headers = Object.fromEntries(resp.headers.entries());
300+
let rawBody = await resp.text();
301+
let contentType = resp.headers.get("content-type") || "";
302+
let isJson = contentType.startsWith("application/json");
303+
304+
/** @type {Object|String} */
305+
let body = rawBody;
306+
if (isJson) {
307+
try {
308+
body = JSON.parse(rawBody);
309+
} catch (e) {
310+
// ignore
311+
}
312+
}
313+
314+
let response = {
315+
ok: resp.ok,
316+
statusCode: resp.status, // backwards compat
317+
statusText: resp.statusText,
318+
headers: headers,
319+
body: body,
320+
toJSON: function () {
321+
return {
322+
ok: response.ok,
323+
statusCode: response.statusCode,
324+
statusText: response.statusText,
325+
headers: headers,
326+
body: body,
327+
};
328+
},
329+
get status() {
330+
console.warn(
331+
"deprecated: please use either 'statusText' or 'statusCode' (node.js and browser both have 'status', but flipped)",
332+
);
333+
return resp.statusText;
334+
},
335+
_request: opts,
336+
_response: resp,
337+
};
338+
296339
if (resp.ok) {
297-
return resp;
340+
return response;
298341
}
299342

300343
let err = new Error(
301344
`http request was ${resp.status}, not ok. See err.response for details.`,
302345
);
346+
303347
// @ts-ignore
304-
err.response = resp.json();
348+
err.response = response;
305349
throw err;
306350
};
307351

dashsocket.js

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
/**
99
* @typedef WsOpts
1010
* @prop {String} [baseUrl] - (deprecated by dashsocketBaseUrl) ex: https://insight.dash.org
11-
* @prop {CookieStore} cookieStore - only needed for insight APIs hosted behind an AWS load balancer
11+
* @prop {import('./').CookieStore?} cookieStore - only needed for insight APIs hosted behind an AWS load balancer
1212
* @prop {Boolean} debug
1313
* @prop {Function} onClose
1414
* @prop {Function} onError
@@ -47,20 +47,16 @@
4747
let now = Date.now();
4848
let sidUrl = `${dashsocketBaseUrl}/?EIO=3&transport=polling&t=${now}`;
4949

50-
let sidResp = await window.fetch(sidUrl, {
51-
mode: "cors",
52-
credentials: "include",
53-
});
50+
let sidResp = await Ws.fetch(sidUrl);
5451
if (!sidResp.ok) {
5552
let err = new Error("bad response");
56-
// TODO make error type consistent between browser and node?
53+
//@ts-ignore
5754
err.response = sidResp;
5855
throw err;
5956
}
6057

6158
// ex: `97:0{"sid":"xxxx",...}`
62-
let msg = await sidResp.text();
63-
let session = parseSession(msg);
59+
let session = parseSession(sidResp.body || "");
6460
return session;
6561
};
6662

@@ -75,10 +71,8 @@
7571
let subUrl = `${dashsocketBaseUrl}/?EIO=3&transport=polling&t=${now}&sid=${sid}`;
7672
let body = stringifySub(eventname);
7773

78-
let subResp = await window.fetch(subUrl, {
74+
let subResp = await Ws.fetch(subUrl, {
7975
method: "POST",
80-
mode: "cors",
81-
credentials: "include",
8276
headers: {
8377
"Content-Type": "text/plain;charset=UTF-8",
8478
},
@@ -91,7 +85,7 @@
9185
throw err;
9286
}
9387

94-
return await subResp.text();
88+
return subResp.body;
9589
};
9690

9791
/*
@@ -291,7 +285,7 @@
291285
/**
292286
* TODO share with node version
293287
* @param {String} msg
294-
* @returns {SocketIoHello}
288+
* @returns {import('./').SocketIoHello}
295289
*/
296290
function parseSession(msg) {
297291
let colonIndex = msg.indexOf(":");
@@ -451,4 +445,60 @@
451445
return result;
452446
}
453447
};
448+
449+
/** @type {RequestInit} */
450+
let defaultRequest = {
451+
mode: "cors",
452+
credentials: "include",
453+
};
454+
455+
/**
456+
* @param {String | URL | Request} url
457+
* @param {RequestInit} [_opts]
458+
*/
459+
Ws.fetch = async function dashfetch(url, _opts) {
460+
let opts = Object.assign(defaultRequest, _opts);
461+
462+
let resp = await fetch(url, opts);
463+
// this will not have arrays, only strings
464+
let headers = Object.fromEntries(resp.headers.entries());
465+
let body = await resp.text();
466+
467+
let response = {
468+
ok: resp.ok,
469+
statusCode: resp.status, // backwards compat
470+
statusText: resp.statusText,
471+
headers: headers,
472+
body: body,
473+
toJSON: function () {
474+
return {
475+
ok: response.ok,
476+
statusCode: response.statusCode,
477+
statusText: response.statusText,
478+
headers: headers,
479+
body: body,
480+
};
481+
},
482+
get status() {
483+
console.warn(
484+
"deprecated: please use either 'statusText' or 'statusCode' (node.js and browser both have 'status', but flipped)",
485+
);
486+
return resp.statusText;
487+
},
488+
_request: opts,
489+
_response: resp,
490+
};
491+
492+
if (resp.ok) {
493+
return response;
494+
}
495+
496+
let err = new Error(
497+
`http request was ${resp.status}, not ok. See err.response for details.`,
498+
);
499+
500+
// @ts-ignore
501+
err.response = response;
502+
throw err;
503+
};
454504
})(("undefined" !== typeof module && module.exports) || window);

ws/cookies.js

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
"use strict";
22

3-
/** @type CookieStore */
3+
/** @type {import('../').CookieStore} */
44
let Cookies = module.exports;
55

66
let Cookie = require("tough-cookie");
77
//@ts-ignore TODO
88
//let FileCookieStore = require("@root/file-cookie-store");
99
//let cookies_store = new FileCookieStore("./cookie.txt", { auto_sync: false });
1010
let jar = new Cookie.CookieJar(/*cookies_store*/);
11+
//@ts-ignore
1112
jar.setCookieAsync = require("util").promisify(jar.setCookie);
13+
//@ts-ignore
1214
jar.getCookiesAsync = require("util").promisify(jar.getCookies);
1315
//cookies_store.saveAsync = require("util").promisify(cookies_store.save);
1416

@@ -18,23 +20,29 @@ jar.getCookiesAsync = require("util").promisify(jar.getCookies);
1820
* @returns {Promise<void>}
1921
*/
2022
Cookies.set = async function _setCookie(url, resp) {
23+
/** @type {Array<String>} */
2124
let cookies;
22-
if (resp.headers["set-cookie"]) {
23-
if (Array.isArray(resp.headers["set-cookie"])) {
24-
cookies = resp.headers["set-cookie"].map(Cookie.parse);
25-
} else {
26-
cookies = [Cookie.parse(resp.headers["set-cookie"])];
27-
}
25+
let moreCookies = resp.headers["set-cookie"];
26+
if (!moreCookies) {
27+
return;
2828
}
2929

30+
if (!Array.isArray(moreCookies)) {
31+
moreCookies = [moreCookies];
32+
}
33+
//@ts-ignore
34+
cookies = moreCookies.map(Cookie.parse);
35+
3036
// let Cookie = //require('set-cookie-parser');
3137
// Cookie.parse(resp, { decodeValues: true });
32-
await Promise.all(
33-
cookies.map(async function (cookie) {
34-
//console.log('DEBUG cookie:', cookie.toJSON());
35-
await jar.setCookieAsync(cookie, url, { now: new Date() });
36-
}),
37-
);
38+
let ps = cookies.map(async function (cookie) {
39+
//console.log('DEBUG cookie:', cookie.toJSON());
40+
let jarOpts = { now: new Date() };
41+
//@ts-ignore
42+
await jar.setCookieAsync(cookie, url, jarOpts);
43+
});
44+
45+
await Promise.all(ps);
3846
//await cookies_store.saveAsync();
3947
};
4048

@@ -43,5 +51,8 @@ Cookies.set = async function _setCookie(url, resp) {
4351
* @returns {Promise<String>}
4452
*/
4553
Cookies.get = async function _getCookie(url) {
46-
return (await jar.getCookiesAsync(url)).toString();
54+
//@ts-ignore
55+
let cookieObj = await jar.getCookiesAsync(url);
56+
let cookieStr = cookieObj.toString();
57+
return cookieStr;
4758
};

0 commit comments

Comments
 (0)