@alleyboss/micropay-solana-x402-paywall 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -116
- package/dist/agent/index.cjs +358 -0
- package/dist/agent/index.cjs.map +1 -0
- package/dist/agent/index.d.cts +221 -0
- package/dist/agent/index.d.ts +221 -0
- package/dist/agent/index.js +347 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +10 -1
- package/dist/client/index.d.ts +10 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/express/index.cjs +79 -0
- package/dist/express/index.cjs.map +1 -0
- package/dist/express/index.d.cts +40 -0
- package/dist/express/index.d.ts +40 -0
- package/dist/express/index.js +76 -0
- package/dist/express/index.js.map +1 -0
- package/dist/index.cjs +315 -1116
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -10
- package/dist/index.d.ts +6 -10
- package/dist/index.js +283 -1074
- package/dist/index.js.map +1 -1
- package/dist/session/index.cjs.map +1 -1
- package/dist/session/index.d.cts +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.js.map +1 -1
- package/dist/{session-D2IoWAWV.d.cts → types-BWYQMw03.d.cts} +1 -16
- package/dist/{session-D2IoWAWV.d.ts → types-BWYQMw03.d.ts} +1 -16
- package/package.json +29 -59
- package/dist/client-D-dteoJw.d.cts +0 -63
- package/dist/client-DfCIRrNG.d.ts +0 -63
- package/dist/memory-Daxkczti.d.cts +0 -29
- package/dist/memory-Daxkczti.d.ts +0 -29
- package/dist/middleware/index.cjs +0 -273
- package/dist/middleware/index.cjs.map +0 -1
- package/dist/middleware/index.d.cts +0 -91
- package/dist/middleware/index.d.ts +0 -91
- package/dist/middleware/index.js +0 -267
- package/dist/middleware/index.js.map +0 -1
- package/dist/nextjs-BDyOqGAq.d.cts +0 -81
- package/dist/nextjs-CbX8_9yK.d.ts +0 -81
- package/dist/payment-BGp7eMQl.d.cts +0 -103
- package/dist/payment-BGp7eMQl.d.ts +0 -103
- package/dist/solana/index.cjs +0 -589
- package/dist/solana/index.cjs.map +0 -1
- package/dist/solana/index.d.cts +0 -240
- package/dist/solana/index.d.ts +0 -240
- package/dist/solana/index.js +0 -567
- package/dist/solana/index.js.map +0 -1
- package/dist/store/index.cjs +0 -99
- package/dist/store/index.cjs.map +0 -1
- package/dist/store/index.d.cts +0 -38
- package/dist/store/index.d.ts +0 -38
- package/dist/store/index.js +0 -96
- package/dist/store/index.js.map +0 -1
- package/dist/utils/index.cjs +0 -68
- package/dist/utils/index.cjs.map +0 -1
- package/dist/utils/index.d.cts +0 -30
- package/dist/utils/index.d.ts +0 -30
- package/dist/utils/index.js +0 -65
- package/dist/utils/index.js.map +0 -1
- package/dist/x402/index.cjs +0 -387
- package/dist/x402/index.cjs.map +0 -1
- package/dist/x402/index.d.cts +0 -96
- package/dist/x402/index.d.ts +0 -96
- package/dist/x402/index.js +0 -375
- package/dist/x402/index.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var server = require('@x402/core/server');
|
|
4
|
+
|
|
5
|
+
// src/express/index.ts
|
|
6
|
+
var ExpressAdapter = class {
|
|
7
|
+
constructor(req) {
|
|
8
|
+
this.req = req;
|
|
9
|
+
}
|
|
10
|
+
getHeader(name) {
|
|
11
|
+
const val = this.req.headers[name.toLowerCase()];
|
|
12
|
+
if (Array.isArray(val)) return val[0];
|
|
13
|
+
return val;
|
|
14
|
+
}
|
|
15
|
+
getMethod() {
|
|
16
|
+
return this.req.method;
|
|
17
|
+
}
|
|
18
|
+
getPath() {
|
|
19
|
+
return this.req.path;
|
|
20
|
+
}
|
|
21
|
+
getUrl() {
|
|
22
|
+
return this.req.originalUrl || this.req.url;
|
|
23
|
+
}
|
|
24
|
+
getAcceptHeader() {
|
|
25
|
+
return this.req.headers["accept"] || "";
|
|
26
|
+
}
|
|
27
|
+
getUserAgent() {
|
|
28
|
+
return this.req.headers["user-agent"] || "";
|
|
29
|
+
}
|
|
30
|
+
getQueryParams() {
|
|
31
|
+
return this.req.query;
|
|
32
|
+
}
|
|
33
|
+
getQueryParam(name) {
|
|
34
|
+
return this.req.query[name];
|
|
35
|
+
}
|
|
36
|
+
async getBody() {
|
|
37
|
+
return this.req.body;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
function x402Middleware(server$1, routeConfig) {
|
|
41
|
+
return async (req, res, next) => {
|
|
42
|
+
try {
|
|
43
|
+
const currentRouteKey = `${req.method} ${req.path}`;
|
|
44
|
+
const routes = {
|
|
45
|
+
[currentRouteKey]: routeConfig
|
|
46
|
+
};
|
|
47
|
+
const httpServer = new server.x402HTTPResourceServer(server$1, routes);
|
|
48
|
+
await httpServer.initialize();
|
|
49
|
+
const adapter = new ExpressAdapter(req);
|
|
50
|
+
const result = await httpServer.processHTTPRequest({
|
|
51
|
+
adapter,
|
|
52
|
+
method: req.method,
|
|
53
|
+
path: req.path
|
|
54
|
+
});
|
|
55
|
+
if (result.type === "payment-verified" || result.type === "no-payment-required") {
|
|
56
|
+
req.x402 = result;
|
|
57
|
+
return next();
|
|
58
|
+
}
|
|
59
|
+
if (result.type === "payment-error") {
|
|
60
|
+
const instructions = result.response;
|
|
61
|
+
if (instructions.headers) {
|
|
62
|
+
Object.entries(instructions.headers).forEach(([key, value]) => {
|
|
63
|
+
if (value) res.setHeader(key, value);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
res.status(instructions.status).send(instructions.body);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.error("x402 middleware error:", error);
|
|
71
|
+
res.status(500).json({ error: "Payment verification error" });
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
exports.ExpressAdapter = ExpressAdapter;
|
|
77
|
+
exports.x402Middleware = x402Middleware;
|
|
78
|
+
//# sourceMappingURL=index.cjs.map
|
|
79
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/express/index.ts"],"names":["server","x402HTTPResourceServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Request, Response, NextFunction } from 'express';\nimport {\n x402ResourceServer,\n x402HTTPResourceServer,\n type HTTPAdapter,\n type RouteConfig\n} from '@x402/core/server';\n\n/**\n * Express Adapter for x402\n */\nexport class ExpressAdapter implements HTTPAdapter {\n constructor(private req: Request) { }\n\n getHeader(name: string): string | undefined {\n const val = this.req.headers[name.toLowerCase()];\n if (Array.isArray(val)) return val[0];\n return val;\n }\n\n getMethod(): string {\n return this.req.method;\n }\n\n getPath(): string {\n return this.req.path;\n }\n\n getUrl(): string {\n return this.req.originalUrl || this.req.url;\n }\n\n getAcceptHeader(): string {\n return this.req.headers['accept'] || '';\n }\n\n getUserAgent(): string {\n return this.req.headers['user-agent'] || '';\n }\n\n getQueryParams(): Record<string, string | string[]> {\n return this.req.query as Record<string, string | string[]>;\n }\n\n getQueryParam(name: string): string | string[] | undefined {\n return this.req.query[name] as string | string[] | undefined;\n }\n\n async getBody(): Promise<unknown> {\n return this.req.body;\n }\n}\n\n/**\n * Create x402 middleware for Express\n * \n * @example\n * ```typescript\n * import { x402ResourceServer } from '@x402/core/server';\n * import { x402Middleware } from '@alleyboss/micropay-solana-x402-paywall/express';\n * \n * const server = new x402ResourceServer(facilitatorClient);\n * \n * app.get('/premium', x402Middleware(server, {\n * accepts: { scheme: 'exact', ... },\n * description: 'Premium content'\n * }), (req, res) => {\n * res.send('You paid!');\n * });\n * ```\n */\nexport function x402Middleware(\n server: x402ResourceServer,\n routeConfig: RouteConfig\n) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n // Create a temporary HTTP resource server for this request\n // We use the current path + method to ensure it matches\n // NOTE: req.path contains the actual path (e.g. /users/123), not the route pattern\n const currentRouteKey = `${req.method} ${req.path}`;\n const routes = {\n [currentRouteKey]: routeConfig\n };\n\n const httpServer = new x402HTTPResourceServer(server, routes);\n await httpServer.initialize();\n\n const adapter = new ExpressAdapter(req);\n\n // Process request\n const result = await httpServer.processHTTPRequest({\n adapter,\n method: req.method,\n path: req.path\n });\n\n if (result.type === 'payment-verified' || result.type === 'no-payment-required') {\n // Attach result to request\n (req as any).x402 = result;\n return next();\n }\n\n if (result.type === 'payment-error') {\n const instructions = result.response;\n\n // Set headers\n if (instructions.headers) {\n Object.entries(instructions.headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Send response\n res.status(instructions.status).send(instructions.body);\n return;\n }\n\n } catch (error) {\n console.error('x402 middleware error:', error);\n res.status(500).json({ error: 'Payment verification error' });\n }\n };\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { HTTPAdapter, x402ResourceServer, RouteConfig } from '@x402/core/server';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Express Adapter for x402
|
|
6
|
+
*/
|
|
7
|
+
declare class ExpressAdapter implements HTTPAdapter {
|
|
8
|
+
private req;
|
|
9
|
+
constructor(req: Request);
|
|
10
|
+
getHeader(name: string): string | undefined;
|
|
11
|
+
getMethod(): string;
|
|
12
|
+
getPath(): string;
|
|
13
|
+
getUrl(): string;
|
|
14
|
+
getAcceptHeader(): string;
|
|
15
|
+
getUserAgent(): string;
|
|
16
|
+
getQueryParams(): Record<string, string | string[]>;
|
|
17
|
+
getQueryParam(name: string): string | string[] | undefined;
|
|
18
|
+
getBody(): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create x402 middleware for Express
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { x402ResourceServer } from '@x402/core/server';
|
|
26
|
+
* import { x402Middleware } from '@alleyboss/micropay-solana-x402-paywall/express';
|
|
27
|
+
*
|
|
28
|
+
* const server = new x402ResourceServer(facilitatorClient);
|
|
29
|
+
*
|
|
30
|
+
* app.get('/premium', x402Middleware(server, {
|
|
31
|
+
* accepts: { scheme: 'exact', ... },
|
|
32
|
+
* description: 'Premium content'
|
|
33
|
+
* }), (req, res) => {
|
|
34
|
+
* res.send('You paid!');
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare function x402Middleware(server: x402ResourceServer, routeConfig: RouteConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
39
|
+
|
|
40
|
+
export { ExpressAdapter, x402Middleware };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { HTTPAdapter, x402ResourceServer, RouteConfig } from '@x402/core/server';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Express Adapter for x402
|
|
6
|
+
*/
|
|
7
|
+
declare class ExpressAdapter implements HTTPAdapter {
|
|
8
|
+
private req;
|
|
9
|
+
constructor(req: Request);
|
|
10
|
+
getHeader(name: string): string | undefined;
|
|
11
|
+
getMethod(): string;
|
|
12
|
+
getPath(): string;
|
|
13
|
+
getUrl(): string;
|
|
14
|
+
getAcceptHeader(): string;
|
|
15
|
+
getUserAgent(): string;
|
|
16
|
+
getQueryParams(): Record<string, string | string[]>;
|
|
17
|
+
getQueryParam(name: string): string | string[] | undefined;
|
|
18
|
+
getBody(): Promise<unknown>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create x402 middleware for Express
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { x402ResourceServer } from '@x402/core/server';
|
|
26
|
+
* import { x402Middleware } from '@alleyboss/micropay-solana-x402-paywall/express';
|
|
27
|
+
*
|
|
28
|
+
* const server = new x402ResourceServer(facilitatorClient);
|
|
29
|
+
*
|
|
30
|
+
* app.get('/premium', x402Middleware(server, {
|
|
31
|
+
* accepts: { scheme: 'exact', ... },
|
|
32
|
+
* description: 'Premium content'
|
|
33
|
+
* }), (req, res) => {
|
|
34
|
+
* res.send('You paid!');
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare function x402Middleware(server: x402ResourceServer, routeConfig: RouteConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
39
|
+
|
|
40
|
+
export { ExpressAdapter, x402Middleware };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { x402HTTPResourceServer } from '@x402/core/server';
|
|
2
|
+
|
|
3
|
+
// src/express/index.ts
|
|
4
|
+
var ExpressAdapter = class {
|
|
5
|
+
constructor(req) {
|
|
6
|
+
this.req = req;
|
|
7
|
+
}
|
|
8
|
+
getHeader(name) {
|
|
9
|
+
const val = this.req.headers[name.toLowerCase()];
|
|
10
|
+
if (Array.isArray(val)) return val[0];
|
|
11
|
+
return val;
|
|
12
|
+
}
|
|
13
|
+
getMethod() {
|
|
14
|
+
return this.req.method;
|
|
15
|
+
}
|
|
16
|
+
getPath() {
|
|
17
|
+
return this.req.path;
|
|
18
|
+
}
|
|
19
|
+
getUrl() {
|
|
20
|
+
return this.req.originalUrl || this.req.url;
|
|
21
|
+
}
|
|
22
|
+
getAcceptHeader() {
|
|
23
|
+
return this.req.headers["accept"] || "";
|
|
24
|
+
}
|
|
25
|
+
getUserAgent() {
|
|
26
|
+
return this.req.headers["user-agent"] || "";
|
|
27
|
+
}
|
|
28
|
+
getQueryParams() {
|
|
29
|
+
return this.req.query;
|
|
30
|
+
}
|
|
31
|
+
getQueryParam(name) {
|
|
32
|
+
return this.req.query[name];
|
|
33
|
+
}
|
|
34
|
+
async getBody() {
|
|
35
|
+
return this.req.body;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
function x402Middleware(server, routeConfig) {
|
|
39
|
+
return async (req, res, next) => {
|
|
40
|
+
try {
|
|
41
|
+
const currentRouteKey = `${req.method} ${req.path}`;
|
|
42
|
+
const routes = {
|
|
43
|
+
[currentRouteKey]: routeConfig
|
|
44
|
+
};
|
|
45
|
+
const httpServer = new x402HTTPResourceServer(server, routes);
|
|
46
|
+
await httpServer.initialize();
|
|
47
|
+
const adapter = new ExpressAdapter(req);
|
|
48
|
+
const result = await httpServer.processHTTPRequest({
|
|
49
|
+
adapter,
|
|
50
|
+
method: req.method,
|
|
51
|
+
path: req.path
|
|
52
|
+
});
|
|
53
|
+
if (result.type === "payment-verified" || result.type === "no-payment-required") {
|
|
54
|
+
req.x402 = result;
|
|
55
|
+
return next();
|
|
56
|
+
}
|
|
57
|
+
if (result.type === "payment-error") {
|
|
58
|
+
const instructions = result.response;
|
|
59
|
+
if (instructions.headers) {
|
|
60
|
+
Object.entries(instructions.headers).forEach(([key, value]) => {
|
|
61
|
+
if (value) res.setHeader(key, value);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
res.status(instructions.status).send(instructions.body);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error("x402 middleware error:", error);
|
|
69
|
+
res.status(500).json({ error: "Payment verification error" });
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { ExpressAdapter, x402Middleware };
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/express/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { Request, Response, NextFunction } from 'express';\nimport {\n x402ResourceServer,\n x402HTTPResourceServer,\n type HTTPAdapter,\n type RouteConfig\n} from '@x402/core/server';\n\n/**\n * Express Adapter for x402\n */\nexport class ExpressAdapter implements HTTPAdapter {\n constructor(private req: Request) { }\n\n getHeader(name: string): string | undefined {\n const val = this.req.headers[name.toLowerCase()];\n if (Array.isArray(val)) return val[0];\n return val;\n }\n\n getMethod(): string {\n return this.req.method;\n }\n\n getPath(): string {\n return this.req.path;\n }\n\n getUrl(): string {\n return this.req.originalUrl || this.req.url;\n }\n\n getAcceptHeader(): string {\n return this.req.headers['accept'] || '';\n }\n\n getUserAgent(): string {\n return this.req.headers['user-agent'] || '';\n }\n\n getQueryParams(): Record<string, string | string[]> {\n return this.req.query as Record<string, string | string[]>;\n }\n\n getQueryParam(name: string): string | string[] | undefined {\n return this.req.query[name] as string | string[] | undefined;\n }\n\n async getBody(): Promise<unknown> {\n return this.req.body;\n }\n}\n\n/**\n * Create x402 middleware for Express\n * \n * @example\n * ```typescript\n * import { x402ResourceServer } from '@x402/core/server';\n * import { x402Middleware } from '@alleyboss/micropay-solana-x402-paywall/express';\n * \n * const server = new x402ResourceServer(facilitatorClient);\n * \n * app.get('/premium', x402Middleware(server, {\n * accepts: { scheme: 'exact', ... },\n * description: 'Premium content'\n * }), (req, res) => {\n * res.send('You paid!');\n * });\n * ```\n */\nexport function x402Middleware(\n server: x402ResourceServer,\n routeConfig: RouteConfig\n) {\n return async (req: Request, res: Response, next: NextFunction) => {\n try {\n // Create a temporary HTTP resource server for this request\n // We use the current path + method to ensure it matches\n // NOTE: req.path contains the actual path (e.g. /users/123), not the route pattern\n const currentRouteKey = `${req.method} ${req.path}`;\n const routes = {\n [currentRouteKey]: routeConfig\n };\n\n const httpServer = new x402HTTPResourceServer(server, routes);\n await httpServer.initialize();\n\n const adapter = new ExpressAdapter(req);\n\n // Process request\n const result = await httpServer.processHTTPRequest({\n adapter,\n method: req.method,\n path: req.path\n });\n\n if (result.type === 'payment-verified' || result.type === 'no-payment-required') {\n // Attach result to request\n (req as any).x402 = result;\n return next();\n }\n\n if (result.type === 'payment-error') {\n const instructions = result.response;\n\n // Set headers\n if (instructions.headers) {\n Object.entries(instructions.headers).forEach(([key, value]) => {\n if (value) res.setHeader(key, value);\n });\n }\n\n // Send response\n res.status(instructions.status).send(instructions.body);\n return;\n }\n\n } catch (error) {\n console.error('x402 middleware error:', error);\n res.status(500).json({ error: 'Payment verification error' });\n }\n };\n}\n"]}
|