Upload files to "api/src"
parent
8a7f7d12d5
commit
6c0d061023
|
@ -0,0 +1,211 @@
|
||||||
|
import { Router, IRequest } from "itty-router";
|
||||||
|
import { StoredRequest, RequestBin, ReturnedRequest } from "./types";
|
||||||
|
import { mapRequest, randomString, json } from "./utils";
|
||||||
|
|
||||||
|
export interface Env {
|
||||||
|
DB: D1Database;
|
||||||
|
}
|
||||||
|
|
||||||
|
const router = Router<IRequest, [env: Env, ctx: ExecutionContext]>();
|
||||||
|
|
||||||
|
router.post("/create", async (req, env: Env) => {
|
||||||
|
const id = randomString(10);
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("INSERT INTO bins (id) values (?)").bind(id).run();
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({
|
||||||
|
success: true,
|
||||||
|
bin: {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
router.all("/-/:id/*", async (request, env: Env) => {
|
||||||
|
const { params, method, headers, url } = request;
|
||||||
|
const { id } = params;
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("SELECT * FROM bins WHERE id = ?").bind(id).first<string>("id");
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request bin could not be found with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const headersObject: {[k: string]: string} = {};
|
||||||
|
let ip = "";
|
||||||
|
|
||||||
|
for (const [key, value] of headers) {
|
||||||
|
headersObject[key] = value;
|
||||||
|
|
||||||
|
if (key === "cf-connecting-ip")
|
||||||
|
ip = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
const requestId = randomString(10);
|
||||||
|
const body = await request.arrayBuffer();
|
||||||
|
|
||||||
|
const insertResult = await env.DB
|
||||||
|
.prepare("INSERT INTO requests (id, ip, method, url, timestamp, headers, body, bin_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
|
||||||
|
.bind(requestId, ip, method, url, Date.now(), JSON.stringify(headersObject), body, id)
|
||||||
|
.run();
|
||||||
|
|
||||||
|
if (!insertResult.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({ success: true });
|
||||||
|
});
|
||||||
|
router.delete("/:id", async ({ params }, env: Env) => {
|
||||||
|
const { id } = params;
|
||||||
|
|
||||||
|
let result = await env.DB.prepare("DELETE FROM requests WHERE bin_id = ?").bind(id).run();
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await env.DB.prepare("DELETE FROM bins WHERE id = ?").bind(id).run();
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({ success: true });
|
||||||
|
});
|
||||||
|
router.delete("/:id/all", async ({ params }, env: Env) => {
|
||||||
|
const { id } = params;
|
||||||
|
|
||||||
|
const binResult = await env.DB.prepare("SELECT * FROM bins WHERE id = ?").bind(id).first<string>("id");
|
||||||
|
|
||||||
|
if (!binResult) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request bin could not be found with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("DELETE FROM requests WHERE bin_id = ?").bind(id).run();
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({ success: true });
|
||||||
|
});
|
||||||
|
router.delete("/:id/:requestId", async ({ params }, env: Env) => {
|
||||||
|
const { id, requestId } = params;
|
||||||
|
|
||||||
|
const binResult = await env.DB.prepare("SELECT * FROM bins WHERE id = ?").bind(id).first<string>("id");
|
||||||
|
|
||||||
|
if (!binResult) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request bin could not be found with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("DELETE FROM requests WHERE bin_id = ? AND id = ?").bind(id, requestId).run();
|
||||||
|
|
||||||
|
if (!result.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({ success: true });
|
||||||
|
});
|
||||||
|
router.get("/:id", async ({ params }, env: Env) => {
|
||||||
|
const { id } = params;
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("SELECT * FROM bins WHERE id = ?").bind(id).first<string>("id");
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request bin could not be found with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const requestsResult = await env.DB.prepare("SELECT * FROM requests WHERE bin_id = ?").bind(id).all<StoredRequest>();
|
||||||
|
|
||||||
|
if (!requestsResult.success) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const requestMap: {[key: string]: ReturnedRequest} = {};
|
||||||
|
|
||||||
|
for (const r of requestsResult.results)
|
||||||
|
requestMap[r.id] = mapRequest(r);
|
||||||
|
|
||||||
|
return json({
|
||||||
|
success: true,
|
||||||
|
bin: <RequestBin>{
|
||||||
|
id,
|
||||||
|
requests: requestMap
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
router.get("/:id/:requestId", async ({ params }, env: Env) => {
|
||||||
|
const { id, requestId } = params;
|
||||||
|
|
||||||
|
const result = await env.DB.prepare("SELECT * FROM bins WHERE id = ?").bind(id).first<string>("id");
|
||||||
|
|
||||||
|
if (!result) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request bin could not be found with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const request = await env.DB.prepare("SELECT * FROM requests WHERE bin_id = ? AND id = ?").bind(id, requestId).first<StoredRequest>();
|
||||||
|
|
||||||
|
if (!request) {
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "A request could not be found in this bin with the ID provided"
|
||||||
|
}, { status: 404 });
|
||||||
|
}
|
||||||
|
|
||||||
|
return json({ success: true, request: mapRequest(request) });
|
||||||
|
});
|
||||||
|
router.all("*", () => {
|
||||||
|
return json({ success: false, message: "Endpoint not found" }, { status: 404 });
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
fetch(req: Request, env: Env, ctx: ExecutionContext) {
|
||||||
|
return router.handle(req, env, ctx).catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
|
||||||
|
return json({
|
||||||
|
success: false,
|
||||||
|
message: "An unknown error occurred"
|
||||||
|
}, { status: 500 });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,33 @@
|
||||||
|
export interface Headers {
|
||||||
|
[key: string]: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StoredRequest {
|
||||||
|
id: string;
|
||||||
|
bin_id: string
|
||||||
|
ip: string
|
||||||
|
method: string
|
||||||
|
url: string
|
||||||
|
timestamp: number
|
||||||
|
headers: string
|
||||||
|
body?: ArrayBuffer
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ReturnedRequest {
|
||||||
|
id: string
|
||||||
|
ip: string
|
||||||
|
method: string
|
||||||
|
url: string
|
||||||
|
timestamp: number
|
||||||
|
headers: Headers
|
||||||
|
body?: ArrayBuffer
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Requests {
|
||||||
|
[key: string]: ReturnedRequest
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RequestBin {
|
||||||
|
id: string
|
||||||
|
requests: Requests
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { Headers, ReturnedRequest, StoredRequest } from "./types";
|
||||||
|
|
||||||
|
const DEFAULT_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
|
||||||
|
export const randomString = (length: number, characters?: string): string => {
|
||||||
|
let charactersToUse = DEFAULT_CHARACTERS;
|
||||||
|
|
||||||
|
if (characters)
|
||||||
|
charactersToUse = characters;
|
||||||
|
|
||||||
|
let result = "";
|
||||||
|
|
||||||
|
for (let i = 0; i < length; i++)
|
||||||
|
result += charactersToUse.charAt(Math.floor(Math.random() * charactersToUse.length));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const mapRequest = (storedRequest: StoredRequest): ReturnedRequest => {
|
||||||
|
return {
|
||||||
|
id: storedRequest.id,
|
||||||
|
method: storedRequest.method,
|
||||||
|
ip: storedRequest.ip,
|
||||||
|
url: storedRequest.url,
|
||||||
|
timestamp: storedRequest.timestamp,
|
||||||
|
headers: JSON.parse(storedRequest.headers) as Headers,
|
||||||
|
body: storedRequest.body
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const json = (body: object, options: ResponseInit = {}): Response => {
|
||||||
|
const { headers = {}, ...rest } = options;
|
||||||
|
|
||||||
|
return new Response(JSON.stringify(body), {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Access-Control-Allow-Origin": "*",
|
||||||
|
"Access-Control-Allow-Headers": "*",
|
||||||
|
"Access-Control-Allow-Methods": "GET,POST,PUT,PATCH,HEAD,TRACE,CONNECT,OPTIONS",
|
||||||
|
...headers
|
||||||
|
},
|
||||||
|
...rest
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue