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 */