@parallel-protocol/mpp 0.1.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.
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ // src/timeout.ts
4
+ var HANDLER_TIMEOUT_MS = 3e4;
5
+ var HANDLER_TIMEOUT = /* @__PURE__ */ Symbol("mpp:handler-timeout");
6
+ async function raceTimeout(promise, ms = HANDLER_TIMEOUT_MS) {
7
+ let timer;
8
+ const timeout = new Promise((resolve) => {
9
+ timer = setTimeout(() => resolve(HANDLER_TIMEOUT), ms);
10
+ timer.unref?.();
11
+ });
12
+ try {
13
+ return await Promise.race([promise, timeout]);
14
+ } finally {
15
+ clearTimeout(timer);
16
+ }
17
+ }
18
+
19
+ exports.HANDLER_TIMEOUT = HANDLER_TIMEOUT;
20
+ exports.raceTimeout = raceTimeout;
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ var chunkRNM3RDKR_cjs = require('./chunk-RNM3RDKR.cjs');
4
+ var chunkILKUNJBE_cjs = require('./chunk-ILKUNJBE.cjs');
5
+
6
+ // src/express/adapter.ts
7
+ var TIMEOUT_BODY = JSON.stringify({
8
+ error: "HANDLER_TIMEOUT",
9
+ message: "The resource handler did not respond in time."
10
+ });
11
+ var ExpressAdapter = class {
12
+ constructor(req, res, next) {
13
+ this.req = req;
14
+ this.res = res;
15
+ this.next = next;
16
+ }
17
+ req;
18
+ res;
19
+ next;
20
+ getHeader(name) {
21
+ const value = this.req.header(name);
22
+ return Array.isArray(value) ? value[0] : value;
23
+ }
24
+ getMethod() {
25
+ return this.req.method;
26
+ }
27
+ getPath() {
28
+ return this.req.path;
29
+ }
30
+ getUrl() {
31
+ return `${this.req.protocol}://${this.req.headers.host}${this.req.originalUrl}`;
32
+ }
33
+ async runHandler() {
34
+ const res = this.res;
35
+ const next = this.next;
36
+ const originalWriteHead = res.writeHead.bind(res);
37
+ const originalWrite = res.write.bind(res);
38
+ const originalEnd = res.end.bind(res);
39
+ const buffered = [];
40
+ let settled = false;
41
+ let discarded = false;
42
+ let endCalled;
43
+ const endPromise = new Promise((resolve) => {
44
+ endCalled = resolve;
45
+ });
46
+ const restore = () => {
47
+ res.writeHead = originalWriteHead;
48
+ res.write = originalWrite;
49
+ res.end = originalEnd;
50
+ };
51
+ res.writeHead = ((...args) => {
52
+ if (discarded) return res;
53
+ if (!settled) {
54
+ buffered.push(["writeHead", args]);
55
+ return res;
56
+ }
57
+ return originalWriteHead(...args);
58
+ });
59
+ res.write = ((...args) => {
60
+ if (discarded) return true;
61
+ if (!settled) {
62
+ buffered.push(["write", args]);
63
+ return true;
64
+ }
65
+ return originalWrite(...args);
66
+ });
67
+ res.end = ((...args) => {
68
+ if (discarded) return res;
69
+ if (!settled) {
70
+ buffered.push(["end", args]);
71
+ endCalled();
72
+ return res;
73
+ }
74
+ return originalEnd(...args);
75
+ });
76
+ next();
77
+ const outcome = await chunkRNM3RDKR_cjs.raceTimeout(endPromise);
78
+ if (outcome === chunkRNM3RDKR_cjs.HANDLER_TIMEOUT) {
79
+ discarded = true;
80
+ return {
81
+ status: 504,
82
+ setResponseHeader: (name, value) => {
83
+ if (!res.headersSent) res.setHeader(name, value);
84
+ },
85
+ sendResponse: () => {
86
+ if (res.headersSent) return;
87
+ originalWriteHead(504, { "Content-Type": "application/json" });
88
+ originalEnd(TIMEOUT_BODY);
89
+ },
90
+ discardResponse: () => {
91
+ }
92
+ };
93
+ }
94
+ return {
95
+ status: res.statusCode,
96
+ setResponseHeader: (name, value) => res.setHeader(name, value),
97
+ sendResponse: () => {
98
+ settled = true;
99
+ restore();
100
+ for (const [method, args] of buffered) {
101
+ if (method === "writeHead") originalWriteHead(...args);
102
+ else if (method === "write") originalWrite(...args);
103
+ else if (method === "end") originalEnd(...args);
104
+ }
105
+ },
106
+ discardResponse: () => {
107
+ settled = true;
108
+ restore();
109
+ }
110
+ };
111
+ }
112
+ };
113
+
114
+ // src/express/index.ts
115
+ function paymentMiddleware(config) {
116
+ const middleware = chunkILKUNJBE_cjs.createMppPaymentMiddleware(config);
117
+ return async (req, res, next) => {
118
+ const result = await middleware(new ExpressAdapter(req, res, next));
119
+ if ("pass" in result) {
120
+ if (result.handlerRan) return;
121
+ return next();
122
+ }
123
+ for (const [key, value] of Object.entries(result.headers)) {
124
+ res.setHeader(key, value);
125
+ }
126
+ res.status(result.status).json(result.body);
127
+ };
128
+ }
129
+
130
+ exports.ExpressAdapter = ExpressAdapter;
131
+ exports.paymentMiddleware = paymentMiddleware;
@@ -0,0 +1,20 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { H as HTTPAdapter, R as RunHandlerResult, M as MppMiddlewareConfig } from './types-CCE-FI8i.cjs';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class ExpressAdapter implements HTTPAdapter {
7
+ private readonly req;
8
+ private readonly res;
9
+ private readonly next;
10
+ constructor(req: Request, res: Response, next: NextFunction);
11
+ getHeader(name: string): string | undefined;
12
+ getMethod(): string;
13
+ getPath(): string;
14
+ getUrl(): string;
15
+ runHandler(): Promise<RunHandlerResult>;
16
+ }
17
+
18
+ declare function paymentMiddleware(config: MppMiddlewareConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
19
+
20
+ export { ExpressAdapter, paymentMiddleware };
@@ -0,0 +1,20 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { H as HTTPAdapter, R as RunHandlerResult, M as MppMiddlewareConfig } from './types-CCE-FI8i.js';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class ExpressAdapter implements HTTPAdapter {
7
+ private readonly req;
8
+ private readonly res;
9
+ private readonly next;
10
+ constructor(req: Request, res: Response, next: NextFunction);
11
+ getHeader(name: string): string | undefined;
12
+ getMethod(): string;
13
+ getPath(): string;
14
+ getUrl(): string;
15
+ runHandler(): Promise<RunHandlerResult>;
16
+ }
17
+
18
+ declare function paymentMiddleware(config: MppMiddlewareConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
19
+
20
+ export { ExpressAdapter, paymentMiddleware };
@@ -0,0 +1,128 @@
1
+ import { raceTimeout, HANDLER_TIMEOUT } from './chunk-DXHOWEAQ.js';
2
+ import { createMppPaymentMiddleware } from './chunk-HTUIO2MB.js';
3
+
4
+ // src/express/adapter.ts
5
+ var TIMEOUT_BODY = JSON.stringify({
6
+ error: "HANDLER_TIMEOUT",
7
+ message: "The resource handler did not respond in time."
8
+ });
9
+ var ExpressAdapter = class {
10
+ constructor(req, res, next) {
11
+ this.req = req;
12
+ this.res = res;
13
+ this.next = next;
14
+ }
15
+ req;
16
+ res;
17
+ next;
18
+ getHeader(name) {
19
+ const value = this.req.header(name);
20
+ return Array.isArray(value) ? value[0] : value;
21
+ }
22
+ getMethod() {
23
+ return this.req.method;
24
+ }
25
+ getPath() {
26
+ return this.req.path;
27
+ }
28
+ getUrl() {
29
+ return `${this.req.protocol}://${this.req.headers.host}${this.req.originalUrl}`;
30
+ }
31
+ async runHandler() {
32
+ const res = this.res;
33
+ const next = this.next;
34
+ const originalWriteHead = res.writeHead.bind(res);
35
+ const originalWrite = res.write.bind(res);
36
+ const originalEnd = res.end.bind(res);
37
+ const buffered = [];
38
+ let settled = false;
39
+ let discarded = false;
40
+ let endCalled;
41
+ const endPromise = new Promise((resolve) => {
42
+ endCalled = resolve;
43
+ });
44
+ const restore = () => {
45
+ res.writeHead = originalWriteHead;
46
+ res.write = originalWrite;
47
+ res.end = originalEnd;
48
+ };
49
+ res.writeHead = ((...args) => {
50
+ if (discarded) return res;
51
+ if (!settled) {
52
+ buffered.push(["writeHead", args]);
53
+ return res;
54
+ }
55
+ return originalWriteHead(...args);
56
+ });
57
+ res.write = ((...args) => {
58
+ if (discarded) return true;
59
+ if (!settled) {
60
+ buffered.push(["write", args]);
61
+ return true;
62
+ }
63
+ return originalWrite(...args);
64
+ });
65
+ res.end = ((...args) => {
66
+ if (discarded) return res;
67
+ if (!settled) {
68
+ buffered.push(["end", args]);
69
+ endCalled();
70
+ return res;
71
+ }
72
+ return originalEnd(...args);
73
+ });
74
+ next();
75
+ const outcome = await raceTimeout(endPromise);
76
+ if (outcome === HANDLER_TIMEOUT) {
77
+ discarded = true;
78
+ return {
79
+ status: 504,
80
+ setResponseHeader: (name, value) => {
81
+ if (!res.headersSent) res.setHeader(name, value);
82
+ },
83
+ sendResponse: () => {
84
+ if (res.headersSent) return;
85
+ originalWriteHead(504, { "Content-Type": "application/json" });
86
+ originalEnd(TIMEOUT_BODY);
87
+ },
88
+ discardResponse: () => {
89
+ }
90
+ };
91
+ }
92
+ return {
93
+ status: res.statusCode,
94
+ setResponseHeader: (name, value) => res.setHeader(name, value),
95
+ sendResponse: () => {
96
+ settled = true;
97
+ restore();
98
+ for (const [method, args] of buffered) {
99
+ if (method === "writeHead") originalWriteHead(...args);
100
+ else if (method === "write") originalWrite(...args);
101
+ else if (method === "end") originalEnd(...args);
102
+ }
103
+ },
104
+ discardResponse: () => {
105
+ settled = true;
106
+ restore();
107
+ }
108
+ };
109
+ }
110
+ };
111
+
112
+ // src/express/index.ts
113
+ function paymentMiddleware(config) {
114
+ const middleware = createMppPaymentMiddleware(config);
115
+ return async (req, res, next) => {
116
+ const result = await middleware(new ExpressAdapter(req, res, next));
117
+ if ("pass" in result) {
118
+ if (result.handlerRan) return;
119
+ return next();
120
+ }
121
+ for (const [key, value] of Object.entries(result.headers)) {
122
+ res.setHeader(key, value);
123
+ }
124
+ res.status(result.status).json(result.body);
125
+ };
126
+ }
127
+
128
+ export { ExpressAdapter, paymentMiddleware };
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var chunkILKUNJBE_cjs = require('./chunk-ILKUNJBE.cjs');
4
+ var mppTypes = require('@parallel-protocol/mpp-types');
5
+
6
+ // src/fastify/adapter.ts
7
+ var FastifyAdapter = class {
8
+ constructor(req) {
9
+ this.req = req;
10
+ }
11
+ req;
12
+ getHeader(name) {
13
+ const value = this.req.headers[name.toLowerCase()];
14
+ return Array.isArray(value) ? value[0] : value;
15
+ }
16
+ getMethod() {
17
+ return this.req.method;
18
+ }
19
+ getPath() {
20
+ return this.req.url.split("?")[0] ?? "/";
21
+ }
22
+ getUrl() {
23
+ return `${this.req.protocol}://${this.req.host || this.req.hostname}${this.req.url}`;
24
+ }
25
+ };
26
+
27
+ // src/fastify/index.ts
28
+ function paymentMiddleware(config) {
29
+ return async (fastify) => {
30
+ const gate = chunkILKUNJBE_cjs.createMppPaymentGate(config);
31
+ const settleMap = /* @__PURE__ */ new WeakMap();
32
+ fastify.addHook("onRequest", async (req, reply) => {
33
+ const gateResult = await gate(new FastifyAdapter(req));
34
+ if (gateResult.type === "pass") return;
35
+ if (gateResult.type === "error") {
36
+ for (const [key, value] of Object.entries(gateResult.result.headers)) {
37
+ reply.header(key, value);
38
+ }
39
+ reply.status(gateResult.result.status).send(gateResult.result.body);
40
+ return;
41
+ }
42
+ settleMap.set(req, gateResult.settle);
43
+ });
44
+ fastify.addHook("onSend", async (req, reply, payload) => {
45
+ const settle = settleMap.get(req);
46
+ if (!settle || !chunkILKUNJBE_cjs.isSuccessStatus(reply.statusCode)) {
47
+ return payload;
48
+ }
49
+ let settled = false;
50
+ try {
51
+ const settleResponse = await settle();
52
+ if (settleResponse.success) {
53
+ reply.header(
54
+ "Payment-Receipt",
55
+ mppTypes.encodeBase64Url(settleResponse.receipt)
56
+ );
57
+ reply.header("access-control-expose-headers", "Payment-Receipt");
58
+ settled = true;
59
+ }
60
+ } catch {
61
+ }
62
+ if (!settled) {
63
+ const body = JSON.stringify(chunkILKUNJBE_cjs.SETTLE_FAILURE_BODY);
64
+ reply.status(402);
65
+ reply.header("Content-Type", "application/json");
66
+ reply.header("Content-Length", Buffer.byteLength(body));
67
+ return body;
68
+ }
69
+ return payload;
70
+ });
71
+ };
72
+ }
73
+
74
+ exports.FastifyAdapter = FastifyAdapter;
75
+ exports.paymentMiddleware = paymentMiddleware;
@@ -0,0 +1,17 @@
1
+ import { FastifyRequest, FastifyPluginAsync } from 'fastify';
2
+ import { H as HTTPAdapter, M as MppMiddlewareConfig } from './types-CCE-FI8i.cjs';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class FastifyAdapter implements HTTPAdapter {
7
+ private readonly req;
8
+ constructor(req: FastifyRequest);
9
+ getHeader(name: string): string | undefined;
10
+ getMethod(): string;
11
+ getPath(): string;
12
+ getUrl(): string;
13
+ }
14
+
15
+ declare function paymentMiddleware(config: MppMiddlewareConfig): FastifyPluginAsync;
16
+
17
+ export { FastifyAdapter, paymentMiddleware };
@@ -0,0 +1,17 @@
1
+ import { FastifyRequest, FastifyPluginAsync } from 'fastify';
2
+ import { H as HTTPAdapter, M as MppMiddlewareConfig } from './types-CCE-FI8i.js';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class FastifyAdapter implements HTTPAdapter {
7
+ private readonly req;
8
+ constructor(req: FastifyRequest);
9
+ getHeader(name: string): string | undefined;
10
+ getMethod(): string;
11
+ getPath(): string;
12
+ getUrl(): string;
13
+ }
14
+
15
+ declare function paymentMiddleware(config: MppMiddlewareConfig): FastifyPluginAsync;
16
+
17
+ export { FastifyAdapter, paymentMiddleware };
@@ -0,0 +1,72 @@
1
+ import { createMppPaymentGate, isSuccessStatus, SETTLE_FAILURE_BODY } from './chunk-HTUIO2MB.js';
2
+ import { encodeBase64Url } from '@parallel-protocol/mpp-types';
3
+
4
+ // src/fastify/adapter.ts
5
+ var FastifyAdapter = class {
6
+ constructor(req) {
7
+ this.req = req;
8
+ }
9
+ req;
10
+ getHeader(name) {
11
+ const value = this.req.headers[name.toLowerCase()];
12
+ return Array.isArray(value) ? value[0] : value;
13
+ }
14
+ getMethod() {
15
+ return this.req.method;
16
+ }
17
+ getPath() {
18
+ return this.req.url.split("?")[0] ?? "/";
19
+ }
20
+ getUrl() {
21
+ return `${this.req.protocol}://${this.req.host || this.req.hostname}${this.req.url}`;
22
+ }
23
+ };
24
+
25
+ // src/fastify/index.ts
26
+ function paymentMiddleware(config) {
27
+ return async (fastify) => {
28
+ const gate = createMppPaymentGate(config);
29
+ const settleMap = /* @__PURE__ */ new WeakMap();
30
+ fastify.addHook("onRequest", async (req, reply) => {
31
+ const gateResult = await gate(new FastifyAdapter(req));
32
+ if (gateResult.type === "pass") return;
33
+ if (gateResult.type === "error") {
34
+ for (const [key, value] of Object.entries(gateResult.result.headers)) {
35
+ reply.header(key, value);
36
+ }
37
+ reply.status(gateResult.result.status).send(gateResult.result.body);
38
+ return;
39
+ }
40
+ settleMap.set(req, gateResult.settle);
41
+ });
42
+ fastify.addHook("onSend", async (req, reply, payload) => {
43
+ const settle = settleMap.get(req);
44
+ if (!settle || !isSuccessStatus(reply.statusCode)) {
45
+ return payload;
46
+ }
47
+ let settled = false;
48
+ try {
49
+ const settleResponse = await settle();
50
+ if (settleResponse.success) {
51
+ reply.header(
52
+ "Payment-Receipt",
53
+ encodeBase64Url(settleResponse.receipt)
54
+ );
55
+ reply.header("access-control-expose-headers", "Payment-Receipt");
56
+ settled = true;
57
+ }
58
+ } catch {
59
+ }
60
+ if (!settled) {
61
+ const body = JSON.stringify(SETTLE_FAILURE_BODY);
62
+ reply.status(402);
63
+ reply.header("Content-Type", "application/json");
64
+ reply.header("Content-Length", Buffer.byteLength(body));
65
+ return body;
66
+ }
67
+ return payload;
68
+ });
69
+ };
70
+ }
71
+
72
+ export { FastifyAdapter, paymentMiddleware };
package/dist/hono.cjs ADDED
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var chunkRNM3RDKR_cjs = require('./chunk-RNM3RDKR.cjs');
4
+ var chunkILKUNJBE_cjs = require('./chunk-ILKUNJBE.cjs');
5
+
6
+ // src/hono/adapter.ts
7
+ var TIMEOUT_BODY = JSON.stringify({
8
+ error: "HANDLER_TIMEOUT",
9
+ message: "The resource handler did not respond in time."
10
+ });
11
+ var HonoAdapter = class {
12
+ constructor(c, next) {
13
+ this.c = c;
14
+ this.next = next;
15
+ }
16
+ c;
17
+ next;
18
+ getHeader(name) {
19
+ return this.c.req.header(name);
20
+ }
21
+ getMethod() {
22
+ return this.c.req.method;
23
+ }
24
+ getPath() {
25
+ return this.c.req.path;
26
+ }
27
+ getUrl() {
28
+ return this.c.req.url;
29
+ }
30
+ async runHandler() {
31
+ const outcome = await chunkRNM3RDKR_cjs.raceTimeout(this.next());
32
+ if (outcome === chunkRNM3RDKR_cjs.HANDLER_TIMEOUT) {
33
+ return {
34
+ status: 504,
35
+ setResponseHeader: () => {
36
+ },
37
+ sendResponse: () => {
38
+ this.c.res = new Response(TIMEOUT_BODY, {
39
+ status: 504,
40
+ headers: { "Content-Type": "application/json" }
41
+ });
42
+ },
43
+ discardResponse: () => {
44
+ }
45
+ };
46
+ }
47
+ const res = this.c.res;
48
+ return {
49
+ status: res.status,
50
+ setResponseHeader: (name, value) => res.headers.set(name, value),
51
+ sendResponse: () => {
52
+ },
53
+ discardResponse: () => {
54
+ }
55
+ };
56
+ }
57
+ };
58
+
59
+ // src/hono/index.ts
60
+ function paymentMiddleware(config) {
61
+ const middleware = chunkILKUNJBE_cjs.createMppPaymentMiddleware(config);
62
+ return async (c, next) => {
63
+ const result = await middleware(new HonoAdapter(c, next));
64
+ if ("pass" in result) {
65
+ if (result.handlerRan) return;
66
+ await next();
67
+ return;
68
+ }
69
+ return new Response(JSON.stringify(result.body), {
70
+ status: result.status,
71
+ headers: { ...result.headers, "Content-Type": "application/json" }
72
+ });
73
+ };
74
+ }
75
+
76
+ exports.HonoAdapter = HonoAdapter;
77
+ exports.paymentMiddleware = paymentMiddleware;
@@ -0,0 +1,19 @@
1
+ import { Context, Next, MiddlewareHandler } from 'hono';
2
+ import { H as HTTPAdapter, R as RunHandlerResult, M as MppMiddlewareConfig } from './types-CCE-FI8i.cjs';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class HonoAdapter implements HTTPAdapter {
7
+ private readonly c;
8
+ private readonly next;
9
+ constructor(c: Context, next: Next);
10
+ getHeader(name: string): string | undefined;
11
+ getMethod(): string;
12
+ getPath(): string;
13
+ getUrl(): string;
14
+ runHandler(): Promise<RunHandlerResult>;
15
+ }
16
+
17
+ declare function paymentMiddleware(config: MppMiddlewareConfig): MiddlewareHandler;
18
+
19
+ export { HonoAdapter, paymentMiddleware };
package/dist/hono.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { Context, Next, MiddlewareHandler } from 'hono';
2
+ import { H as HTTPAdapter, R as RunHandlerResult, M as MppMiddlewareConfig } from './types-CCE-FI8i.js';
3
+ import '@parallel-protocol/mpp-types';
4
+ import 'viem';
5
+
6
+ declare class HonoAdapter implements HTTPAdapter {
7
+ private readonly c;
8
+ private readonly next;
9
+ constructor(c: Context, next: Next);
10
+ getHeader(name: string): string | undefined;
11
+ getMethod(): string;
12
+ getPath(): string;
13
+ getUrl(): string;
14
+ runHandler(): Promise<RunHandlerResult>;
15
+ }
16
+
17
+ declare function paymentMiddleware(config: MppMiddlewareConfig): MiddlewareHandler;
18
+
19
+ export { HonoAdapter, paymentMiddleware };
package/dist/hono.js ADDED
@@ -0,0 +1,74 @@
1
+ import { raceTimeout, HANDLER_TIMEOUT } from './chunk-DXHOWEAQ.js';
2
+ import { createMppPaymentMiddleware } from './chunk-HTUIO2MB.js';
3
+
4
+ // src/hono/adapter.ts
5
+ var TIMEOUT_BODY = JSON.stringify({
6
+ error: "HANDLER_TIMEOUT",
7
+ message: "The resource handler did not respond in time."
8
+ });
9
+ var HonoAdapter = class {
10
+ constructor(c, next) {
11
+ this.c = c;
12
+ this.next = next;
13
+ }
14
+ c;
15
+ next;
16
+ getHeader(name) {
17
+ return this.c.req.header(name);
18
+ }
19
+ getMethod() {
20
+ return this.c.req.method;
21
+ }
22
+ getPath() {
23
+ return this.c.req.path;
24
+ }
25
+ getUrl() {
26
+ return this.c.req.url;
27
+ }
28
+ async runHandler() {
29
+ const outcome = await raceTimeout(this.next());
30
+ if (outcome === HANDLER_TIMEOUT) {
31
+ return {
32
+ status: 504,
33
+ setResponseHeader: () => {
34
+ },
35
+ sendResponse: () => {
36
+ this.c.res = new Response(TIMEOUT_BODY, {
37
+ status: 504,
38
+ headers: { "Content-Type": "application/json" }
39
+ });
40
+ },
41
+ discardResponse: () => {
42
+ }
43
+ };
44
+ }
45
+ const res = this.c.res;
46
+ return {
47
+ status: res.status,
48
+ setResponseHeader: (name, value) => res.headers.set(name, value),
49
+ sendResponse: () => {
50
+ },
51
+ discardResponse: () => {
52
+ }
53
+ };
54
+ }
55
+ };
56
+
57
+ // src/hono/index.ts
58
+ function paymentMiddleware(config) {
59
+ const middleware = createMppPaymentMiddleware(config);
60
+ return async (c, next) => {
61
+ const result = await middleware(new HonoAdapter(c, next));
62
+ if ("pass" in result) {
63
+ if (result.handlerRan) return;
64
+ await next();
65
+ return;
66
+ }
67
+ return new Response(JSON.stringify(result.body), {
68
+ status: result.status,
69
+ headers: { ...result.headers, "Content-Type": "application/json" }
70
+ });
71
+ };
72
+ }
73
+
74
+ export { HonoAdapter, paymentMiddleware };