90 lines
2.0 KiB
TypeScript
90 lines
2.0 KiB
TypeScript
/**
|
|
* @emdash-cms/x402 -- x402 Payment Integration for Astro
|
|
*
|
|
* An Astro integration that provides x402 payment enforcement via
|
|
* Astro.locals.x402. Supports bot-only mode using Cloudflare Bot Management.
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* // astro.config.mjs
|
|
* import { x402 } from "@emdash-cms/x402";
|
|
*
|
|
* export default defineConfig({
|
|
* integrations: [
|
|
* x402({
|
|
* payTo: "0xYourWallet",
|
|
* network: "eip155:8453",
|
|
* defaultPrice: "$0.01",
|
|
* botOnly: true,
|
|
* }),
|
|
* ],
|
|
* });
|
|
* ```
|
|
*
|
|
* ```astro
|
|
* ---
|
|
* const { x402 } = Astro.locals;
|
|
*
|
|
* const result = await x402.enforce(Astro.request, { price: "$0.05" });
|
|
* if (result instanceof Response) return result;
|
|
*
|
|
* x402.applyHeaders(result, Astro.response);
|
|
* ---
|
|
* <article>Premium content here</article>
|
|
* ```
|
|
*/
|
|
|
|
import type { AstroIntegration } from "astro";
|
|
|
|
import type { X402Config } from "./types.js";
|
|
|
|
const VIRTUAL_MODULE_ID = "virtual:x402/config";
|
|
const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
|
|
|
|
/**
|
|
* Create the x402 Astro integration.
|
|
*/
|
|
export function x402(config: X402Config): AstroIntegration {
|
|
return {
|
|
name: "@emdash-cms/x402",
|
|
hooks: {
|
|
"astro:config:setup": ({ addMiddleware, updateConfig }) => {
|
|
// Inject the virtual module that provides config to the middleware
|
|
updateConfig({
|
|
vite: {
|
|
plugins: [
|
|
{
|
|
name: "x402-virtual-config",
|
|
resolveId(id: string) {
|
|
if (id === VIRTUAL_MODULE_ID) return RESOLVED_VIRTUAL_MODULE_ID;
|
|
},
|
|
load(id: string) {
|
|
if (id === RESOLVED_VIRTUAL_MODULE_ID) {
|
|
return `export default ${JSON.stringify(config)}`;
|
|
}
|
|
},
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
// Register the middleware that puts the enforcer on locals
|
|
addMiddleware({
|
|
entrypoint: "@emdash-cms/x402/middleware",
|
|
order: "pre",
|
|
});
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
// Re-export types for convenience
|
|
export type {
|
|
EnforceOptions,
|
|
EnforceResult,
|
|
Network,
|
|
Price,
|
|
X402Config,
|
|
X402Enforcer,
|
|
} from "./types.js";
|