7 const result = await fal.subscribe("fal-ai/supir", {
8 input: {
9 image_url: "https://storage.googleapis.com/falserverless/gallery/NOCA_Mick-Thompson.resized.resized.jpg",
10 },
11 logs: true,
1If you fork this, you'll need to set `OPENAI_API_KEY` in your [Val Town Secrets](https://www.val.town/settings/secrets).
2
3
23 <head>
24 <title>SQLite Explorer</title>
25 <link rel="preconnect" href="https://fonts.googleapis.com" />
26 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
27 <link
28 href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap"
29 rel="stylesheet"
30 />
13## Authentication
14
15Login to your SQLite Explorer with [password authentication](https://www.val.town/v/pomdtr/password_auth) with your [Val Town API Token](https://www.val.town/settings/api) as the password.
16
17## Todos / Plans
1null
2
3Migrated from folder: Web_API/jsonBodyParsing
2// it's not working in ValTown or from Airtable's scripting environment.
3// My best guess is that it has something to do with the headers not looking
4// quite right to Substack when we hit their API.
5
6const email = "hello.at.smallworld@gmail.com";
18};
19
20const result = await fetch("https://blog.edgeesmeralda.com/api/v1/free", {
21 "headers": {
22 "content-type": "application/json",
11## Usage
12
13If you want to use an [api token](https://www.val.town/settings/api) to authenticate:
14
15```ts
41```
42
43Note that authenticating using your api token remain an option even after setting a password.
44
45## TODO
61
62async function fetchUser(token: string): Promise<{ id: string }> {
63 const resp = await fetch("https://api.val.town/v1/me", {
64 headers: {
65 Authorization: `Bearer ${token}`,
74}
75
76async function verifyApiToken(token: string) {
77 try {
78 const [currentUser, requestUser] = await Promise.all([fetchUser(Deno.env.get("valtown")), fetchUser(token)]);
92 <article>
93 <p>This val website is <a href="https://www.val.town/v/pomdtr/password_auth">protected by a password</a>.</p>
94 <p>If you are <a href="https://val.town/u/${handle}">@${handle}</a>, you can access it using an <a href="https://www.val.town/settings/api">API token</a>.</p>
95 <p>If not, you'll need to contact the author for access.</p>
96 <footer>
147 const formData = await req.formData();
148 const password = formData.get("password") as string;
149 if (!passwords.includes(password) && !(await verifyApiToken(password))) {
150 return new Response("Unauthorized", {
151 status: 403,
10
11 // fetch data from the server
12 fetch("/api/item")
13 .then((res) => res.json())
14 .then((item) => setItems([...items, item]));
29export default async function (req: Request) {
30 const url = new URL(req.url);
31 if (url.pathname == "/api/item") {
32 return Response.json("This item is fetched from the server by the client");
33 }
1export function myApi(name) {
2 return "hi " + name;
3}