-
Notifications
You must be signed in to change notification settings - Fork 1
/
serveMixJuice.js
63 lines (59 loc) · 1.66 KB
/
serveMixJuice.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const port = Deno.args[0] || 7001;
const hostname = "[::]"; // for IPv6
//const hostname = "localhost"; // for IPv4
const options = {
port,
hostname,
};
const resError = (s) => {
const bin = new TextEncoder().encode(s);
return new Response(bin, {
status: 400,
statusText: "err",
headers: [
["Access-Control-Allow-Origin", "*"],
["Content-Length", bin.length],
["Content-Type", "text/plain"],
],
});
};
export const serveMixJuice = (callback) => { // callback(path, data)
Deno.serve(options, async (req) => {
try {
const { pathname, searchParams } = new URL(req.url);
if (pathname == "/favicon.ico") {
return resError("no favicons");
}
//console.log(req, pathname);
if (req.method == "OPTIONS") {
return new Response(null, {
status: 204,
statusText: "No Content",
headers: [
["Allow", "OPTIONS, GET, HEAD, POST"],
["Access-Control-Allow-Origin", "*"],
//["Access-Control-Allow-Headers", "Content-Type"],
],
});
}
const body = req.method == "POST" ? new Uint8Array(await req.arrayBuffer()) : null;
const res = await callback(pathname, searchParams, body);
if (!res) {
throw new Error("res is null");
}
return new Response(res, {
status: 200,
statusText: "ok",
headers: [
["Access-Control-Allow-Origin", "*"],
["Content-Length", res.length],
["Content-Type", "text/plain"],
],
});
} catch (e) {
console.log(e);
const res = e.toString();
return resError(res);
}
});
};