UNPKG

cfw-bindings-wrangler-bridge

Version:

This bridge makes it possible to interact with **remote** Cloudflare Workers bindings(like KV, D1, etc...) **from anywhere** you want.

87 lines (68 loc) 2.28 kB
// @ts-check import { parse } from "devalue"; /** @param {unknown[]} values */ const decodeBindValues = (values) => // In module side, `ArrayBuffer` and `ArrayBufferView` are encoded as `Array`. // But here we do not decode them, because current D1 implementation also treats them as `Array`. values; /** * @param {any} binding * @returns {binding is D1Database} */ export const isD1Binding = (binding) => binding.constructor.name === "D1Database"; /** * @param {D1Database} D1 * @param {Request} req */ export const handleD1Dispatch = async (D1, req) => { const { operation, parameters } = await req.text().then((t) => parse(t)); if (operation === "D1Database.dump") { const result = await D1.dump(); return new Response(result); } if (operation === "D1Database.exec") { const [query] = parameters; const result = await D1.exec(query); return Response.json(result); } if (operation === "D1Database.batch") { const [statementArray] = parameters; const result = await D1.batch( statementArray.map( /** @param {[string, unknown[]]} stmt */ ([statement, params]) => D1.prepare(statement).bind(...decodeBindValues(params)), ), ); return Response.json(result); } if (operation === "D1PreparedStatement.first") { const [statement, params, column] = parameters; const result = await D1.prepare(statement) .bind(...decodeBindValues(params)) .first(column); return Response.json(result); } if (operation === "D1PreparedStatement.all") { const [statement, params] = parameters; const result = await D1.prepare(statement) .bind(...decodeBindValues(params)) .all(); return Response.json(result); } if (operation === "D1PreparedStatement.run") { const [statement, params] = parameters; const result = await D1.prepare(statement) .bind(...decodeBindValues(params)) .run(); return Response.json(result); } if (operation === "D1PreparedStatement.raw") { const [statement, params] = parameters; const result = await D1.prepare(statement) .bind(...decodeBindValues(params)) .raw(); return Response.json(result); } throw new Error(`${operation}() is not supported.`); };