Fetch.res.mjs

  1// Generated by ReScript, PLEASE EDIT WITH CARE
  2
  3import * as Core__JSON from "@rescript/core/lib/es6/src/Core__JSON.res.mjs";
  4import * as Core__Option from "@rescript/core/lib/es6/src/Core__Option.res.mjs";
  5import * as Stdlib_JsExn from "@rescript/runtime/lib/es6/Stdlib_JsExn.js";
  6import * as Primitive_object from "@rescript/runtime/lib/es6/Primitive_object.js";
  7import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
  8import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
  9
 10let AbortController = {};
 11
 12function get(url) {
 13  return {
 14    url: url,
 15    method: "GET",
 16    headers: {},
 17    body: undefined,
 18    credentials: "same-origin",
 19    abortController: undefined,
 20    onAbort: undefined
 21  };
 22}
 23
 24function post(url) {
 25  return {
 26    url: url,
 27    method: "POST",
 28    headers: {},
 29    body: undefined,
 30    credentials: "same-origin",
 31    abortController: undefined,
 32    onAbort: undefined
 33  };
 34}
 35
 36function $$delete(url) {
 37  return {
 38    url: url,
 39    method: "DELETE",
 40    headers: {},
 41    body: undefined,
 42    credentials: "same-origin",
 43    abortController: undefined,
 44    onAbort: undefined
 45  };
 46}
 47
 48function setHeader(req, name, value) {
 49  let headers = Object.assign({}, req.headers);
 50  headers[name] = value;
 51  return {
 52    url: req.url,
 53    method: req.method,
 54    headers: headers,
 55    body: req.body,
 56    credentials: req.credentials,
 57    abortController: req.abortController,
 58    onAbort: req.onAbort
 59  };
 60}
 61
 62function setBody(req, body) {
 63  let headers = Object.assign({}, req.headers);
 64  let hasContentType = Object.keys(headers).some(k => k.toLowerCase() === "content-type");
 65  if (!hasContentType) {
 66    headers["Content-Type"] = "application/json";
 67  }
 68  return {
 69    url: req.url,
 70    method: req.method,
 71    headers: headers,
 72    body: body,
 73    credentials: req.credentials,
 74    abortController: req.abortController,
 75    onAbort: req.onAbort
 76  };
 77}
 78
 79function credentials(req, creds) {
 80  return {
 81    url: req.url,
 82    method: req.method,
 83    headers: req.headers,
 84    body: req.body,
 85    credentials: creds,
 86    abortController: req.abortController,
 87    onAbort: req.onAbort
 88  };
 89}
 90
 91function withAbortController(req, controller, onAbort) {
 92  return {
 93    url: req.url,
 94    method: req.method,
 95    headers: req.headers,
 96    body: req.body,
 97    credentials: req.credentials,
 98    abortController: Primitive_option.some(controller),
 99    onAbort: onAbort
100  };
101}
102
103function onResponse(req, onSuccess, onError) {
104  return {
105    url: req.url,
106    method: req.method,
107    headers: req.headers,
108    body: req.body,
109    credentials: req.credentials,
110    abortController: req.abortController,
111    onAbort: req.onAbort,
112    onSuccess: onSuccess,
113    onError: onError
114  };
115}
116
117let AbortError = /* @__PURE__ */Primitive_exceptions.create("Fetch.AbortError");
118
119async function execute(req) {
120  try {
121    let bodyInit = Core__Option.map(req.body, b => JSON.stringify(b));
122    let headersInit = Object.entries(req.headers);
123    let match = req.credentials;
124    let credsString;
125    switch (match) {
126      case "omit" :
127        credsString = "omit";
128        break;
129      case "same-origin" :
130        credsString = "same-origin";
131        break;
132      case "include" :
133        credsString = "include";
134        break;
135    }
136    let signal = Core__Option.map(req.abortController, prim => prim.signal);
137    let init;
138    if (bodyInit !== undefined) {
139      let body = Primitive_option.valFromOption(bodyInit);
140      init = signal !== undefined ? ({
141          method: req.method,
142          headers: Primitive_option.some(headersInit),
143          body: Primitive_option.some(body),
144          credentials: credsString,
145          signal: Primitive_option.some(Primitive_option.valFromOption(signal))
146        }) : ({
147          method: req.method,
148          headers: Primitive_option.some(headersInit),
149          body: Primitive_option.some(body),
150          credentials: credsString
151        });
152    } else {
153      init = signal !== undefined ? ({
154          method: req.method,
155          headers: Primitive_option.some(headersInit),
156          credentials: credsString,
157          signal: Primitive_option.some(Primitive_option.valFromOption(signal))
158        }) : ({
159          method: req.method,
160          headers: Primitive_option.some(headersInit),
161          credentials: credsString
162        });
163    }
164    let response = await fetch(req.url, init);
165    if (response.ok) {
166      return req.onSuccess(await response.json());
167    }
168    let status = response.status;
169    let message;
170    try {
171      let json = await response.json();
172      let dict = Core__JSON.Decode.object(json);
173      message = dict !== undefined ? Core__Option.getOr(Core__Option.flatMap(dict["error"], Core__JSON.Decode.string), response.statusText) : response.statusText;
174    } catch (exn) {
175      message = response.statusText;
176    }
177    return req.onError(status, message);
178  } catch (raw_err) {
179    let err = Primitive_exceptions.internalToException(raw_err);
180    if (err.RE_EXN_ID === "JsExn") {
181      let err$1 = err._1;
182      let match$1 = req.abortController;
183      let isAbort;
184      if (match$1 !== undefined) {
185        let name = Stdlib_JsExn.name(err$1);
186        isAbort = Primitive_object.equal(name, "AbortError");
187      } else {
188        isAbort = false;
189      }
190      if (isAbort) {
191        let onAbort = req.onAbort;
192        if (onAbort !== undefined) {
193          return onAbort();
194        } else {
195          return req.onError(0, "Request aborted");
196        }
197      }
198      let errorMessage = Core__Option.getOr(Stdlib_JsExn.message(err$1), "Unknown error");
199      let errorName = Core__Option.getOr(Stdlib_JsExn.name(err$1), "Unknown");
200      console.error(`[Fetch] Network error: ` + errorName + ` - ` + errorMessage);
201      console.error(`[Fetch] Request URL: ` + req.url);
202      console.error("[Fetch] Error object:", err$1);
203      return req.onError(0, `Network error: ` + errorMessage);
204    }
205    console.error("[Fetch] Unknown exception:", err);
206    console.error(`[Fetch] Request URL: ` + req.url);
207    return req.onError(0, "Network error: unknown exception");
208  }
209}
210
211let send = execute;
212
213let promise = execute;
214
215export {
216  AbortController,
217  get,
218  post,
219  $$delete,
220  setHeader,
221  setBody,
222  credentials,
223  withAbortController,
224  onResponse,
225  AbortError,
226  execute,
227  send,
228  promise,
229}
230/* Stdlib_JsExn Not a pure module */