|
8 | 8 | /** |
9 | 9 | * @typedef WsOpts |
10 | 10 | * @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 |
12 | 12 | * @prop {Boolean} debug |
13 | 13 | * @prop {Function} onClose |
14 | 14 | * @prop {Function} onError |
|
47 | 47 | let now = Date.now(); |
48 | 48 | let sidUrl = `${dashsocketBaseUrl}/?EIO=3&transport=polling&t=${now}`; |
49 | 49 |
|
50 | | - let sidResp = await window.fetch(sidUrl, { |
51 | | - mode: "cors", |
52 | | - credentials: "include", |
53 | | - }); |
| 50 | + let sidResp = await Ws.fetch(sidUrl); |
54 | 51 | if (!sidResp.ok) { |
55 | 52 | let err = new Error("bad response"); |
56 | | - // TODO make error type consistent between browser and node? |
| 53 | + //@ts-ignore |
57 | 54 | err.response = sidResp; |
58 | 55 | throw err; |
59 | 56 | } |
60 | 57 |
|
61 | 58 | // ex: `97:0{"sid":"xxxx",...}` |
62 | | - let msg = await sidResp.text(); |
63 | | - let session = parseSession(msg); |
| 59 | + let session = parseSession(sidResp.body || ""); |
64 | 60 | return session; |
65 | 61 | }; |
66 | 62 |
|
|
75 | 71 | let subUrl = `${dashsocketBaseUrl}/?EIO=3&transport=polling&t=${now}&sid=${sid}`; |
76 | 72 | let body = stringifySub(eventname); |
77 | 73 |
|
78 | | - let subResp = await window.fetch(subUrl, { |
| 74 | + let subResp = await Ws.fetch(subUrl, { |
79 | 75 | method: "POST", |
80 | | - mode: "cors", |
81 | | - credentials: "include", |
82 | 76 | headers: { |
83 | 77 | "Content-Type": "text/plain;charset=UTF-8", |
84 | 78 | }, |
|
91 | 85 | throw err; |
92 | 86 | } |
93 | 87 |
|
94 | | - return await subResp.text(); |
| 88 | + return subResp.body; |
95 | 89 | }; |
96 | 90 |
|
97 | 91 | /* |
|
291 | 285 | /** |
292 | 286 | * TODO share with node version |
293 | 287 | * @param {String} msg |
294 | | - * @returns {SocketIoHello} |
| 288 | + * @returns {import('./').SocketIoHello} |
295 | 289 | */ |
296 | 290 | function parseSession(msg) { |
297 | 291 | let colonIndex = msg.indexOf(":"); |
|
451 | 445 | return result; |
452 | 446 | } |
453 | 447 | }; |
| 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 | + }; |
454 | 504 | })(("undefined" !== typeof module && module.exports) || window); |
0 commit comments