| 25 | let readyFetch = false; |
| 26 | |
| 27 | function initFetch() { |
| 28 | const originalFetch = window.fetch; |
| 29 | window.fetch = async function (urlOrRequest, options) { |
| 30 | let url = urlOrRequest; |
| 31 | if (urlOrRequest instanceof Request) { |
| 32 | url = urlOrRequest?.url; |
| 33 | options = options || {}; |
| 34 | for (const key in urlOrRequest) { |
| 35 | const type = typeof urlOrRequest[key]; |
| 36 | if (type === "string" || type === "number" || type === "boolean") { |
| 37 | options[key] = urlOrRequest[key]; |
| 38 | } |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | let request = { url, options }; |
| 43 | for (const { fn } of onBeforeFetchFn) { |
| 44 | const res = await fn?.(request.url, request.options)?.catch( |
| 45 | console.error |
| 46 | ); |
| 47 | if (res) request = res; |
| 48 | if (res === null) return null; |
| 49 | } |
| 50 | |
| 51 | if (urlOrRequest instanceof Request) { |
| 52 | try { |
| 53 | // TODO modify options |
| 54 | // for (const key in request.options) { |
| 55 | // urlOrRequest[key] = request.options[key]; |
| 56 | // } |
| 57 | if (urlOrRequest.url !== request.url) { |
| 58 | urlOrRequest = new Request(request.url, urlOrRequest); |
| 59 | } |
| 60 | } catch (e) { |
| 61 | debugger; |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | let response = await originalFetch(urlOrRequest, options); |
| 66 | for (const { fn } of onAfterFetchFn) { |
| 67 | const res = await fn?.(request.url, request.options, response)?.catch( |
| 68 | console.error |
| 69 | ); |
| 70 | if (res) response = res; |
| 71 | if (res === null) return null; |
| 72 | } |
| 73 | |
| 74 | return response; |
| 75 | }; |
| 76 | } |
| 77 | |
| 78 | export function hookFetch({ onBefore, onAfter } = {}) { |
| 79 | if (!readyFetch) { |