@aifinpay/mcp 2.0.0-rc.5 → 2.2.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/LICENSE +21 -0
- package/README.md +161 -69
- package/bin/aifinpay-mcp.js +115 -67
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +6 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +17 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +66 -11
- package/dist/config.js.map +1 -1
- package/dist/identity.d.ts +9 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +81 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/index.js.map +1 -1
- package/dist/payment-state.d.ts +35 -0
- package/dist/payment-state.d.ts.map +1 -0
- package/dist/payment-state.js +127 -0
- package/dist/payment-state.js.map +1 -0
- package/dist/safe-fetch.d.ts.map +1 -1
- package/dist/safe-fetch.js +73 -19
- package/dist/safe-fetch.js.map +1 -1
- package/dist/server.d.ts +5 -15
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +127 -38
- package/dist/server.js.map +1 -1
- package/dist/tools/agent-address.d.ts.map +1 -1
- package/dist/tools/agent-address.js +5 -4
- package/dist/tools/agent-address.js.map +1 -1
- package/dist/tools/agent-history.d.ts +58 -0
- package/dist/tools/agent-history.d.ts.map +1 -0
- package/dist/tools/agent-history.js +141 -0
- package/dist/tools/agent-history.js.map +1 -0
- package/dist/tools/agent-quota.d.ts.map +1 -1
- package/dist/tools/agent-quota.js +3 -1
- package/dist/tools/agent-quota.js.map +1 -1
- package/dist/tools/{agent-quote.d.ts → dev-payment-quote.d.ts} +10 -12
- package/dist/tools/dev-payment-quote.d.ts.map +1 -0
- package/dist/tools/dev-payment-quote.js +80 -0
- package/dist/tools/dev-payment-quote.js.map +1 -0
- package/dist/tools/payable-fetch.d.ts +3 -29
- package/dist/tools/payable-fetch.d.ts.map +1 -1
- package/dist/tools/payable-fetch.js +231 -109
- package/dist/tools/payable-fetch.js.map +1 -1
- package/dist/tools/production-control.d.ts +104 -0
- package/dist/tools/production-control.d.ts.map +1 -1
- package/dist/tools/production-control.js +177 -14
- package/dist/tools/production-control.js.map +1 -1
- package/dist/tools/supported-chains.d.ts +38 -0
- package/dist/tools/supported-chains.d.ts.map +1 -0
- package/dist/tools/supported-chains.js +132 -0
- package/dist/tools/supported-chains.js.map +1 -0
- package/package.json +30 -7
- package/skills/SKILL.md +332 -0
- package/smithery.yaml +137 -0
- package/dist/directory.d.ts +0 -55
- package/dist/directory.d.ts.map +0 -1
- package/dist/directory.js +0 -56
- package/dist/directory.js.map +0 -1
- package/dist/tools/agent-call.d.ts +0 -68
- package/dist/tools/agent-call.d.ts.map +0 -1
- package/dist/tools/agent-call.js +0 -129
- package/dist/tools/agent-call.js.map +0 -1
- package/dist/tools/agent-claim-self.d.ts +0 -66
- package/dist/tools/agent-claim-self.d.ts.map +0 -1
- package/dist/tools/agent-claim-self.js +0 -299
- package/dist/tools/agent-claim-self.js.map +0 -1
- package/dist/tools/agent-quote.d.ts.map +0 -1
- package/dist/tools/agent-quote.js +0 -81
- package/dist/tools/agent-quote.js.map +0 -1
- package/dist/tools/pay-with-split.d.ts +0 -93
- package/dist/tools/pay-with-split.d.ts.map +0 -1
- package/dist/tools/pay-with-split.js +0 -138
- package/dist/tools/pay-with-split.js.map +0 -1
package/dist/config.js
CHANGED
|
@@ -1,17 +1,36 @@
|
|
|
1
1
|
export function loadConfigFromEnv() {
|
|
2
|
+
if (process.env.AIFINPAY_MODE && !["live", "dev"].includes(process.env.AIFINPAY_MODE)) {
|
|
3
|
+
throw new Error("AIFINPAY_MODE must be live or dev");
|
|
4
|
+
}
|
|
5
|
+
if (process.env.AIFINPAY_PAYMENTS_ENABLED && !["0", "1"].includes(process.env.AIFINPAY_PAYMENTS_ENABLED)) {
|
|
6
|
+
throw new Error("AIFINPAY_PAYMENTS_ENABLED must be 0 or 1");
|
|
7
|
+
}
|
|
2
8
|
return {
|
|
9
|
+
paymentsEnabled: process.env.AIFINPAY_PAYMENTS_ENABLED === "1",
|
|
10
|
+
dailyAmountUsd: process.env.AIFINPAY_DAILY_USD ? Number(process.env.AIFINPAY_DAILY_USD) : undefined,
|
|
11
|
+
maxGasPol: process.env.AIFINPAY_MAX_GAS_POL || undefined,
|
|
12
|
+
devMode: process.env.AIFINPAY_MODE === "dev",
|
|
13
|
+
seedHash: process.env.SEED_HASH,
|
|
14
|
+
agentsFile: process.env.AIFINPAY_AGENTS_FILE || undefined,
|
|
15
|
+
agentId: process.env.AIFINPAY_AGENT_ID || undefined,
|
|
16
|
+
walletHome: process.env.AIFINPAY_HOME || undefined,
|
|
17
|
+
walletPassphrase: process.env.AIFINPAY_WALLET_PASSPHRASE || undefined,
|
|
3
18
|
agentSecretB58: process.env.AIFINPAY_AGENT_SECRET || undefined,
|
|
4
19
|
baseUrl: process.env.AIFINPAY_BASE_URL || undefined,
|
|
5
|
-
timeoutMs: process.env.AIFINPAY_TIMEOUT_MS
|
|
6
|
-
|
|
7
|
-
: undefined,
|
|
8
|
-
maxAmountUsd: process.env.AIFINPAY_MAX_USD
|
|
9
|
-
? Number(process.env.AIFINPAY_MAX_USD)
|
|
10
|
-
: undefined,
|
|
20
|
+
timeoutMs: process.env.AIFINPAY_TIMEOUT_MS ? Number(process.env.AIFINPAY_TIMEOUT_MS) : undefined,
|
|
21
|
+
maxAmountUsd: process.env.AIFINPAY_MAX_USD ? Number(process.env.AIFINPAY_MAX_USD) : undefined,
|
|
11
22
|
gatewayOrigins: splitOrigins(process.env.AIFINPAY_GATEWAY_ORIGINS),
|
|
23
|
+
gatewayPathMode: parseGatewayPathMode(process.env.AIFINPAY_GATEWAY_PATH_MODE),
|
|
12
24
|
trustedHosts: splitList(process.env.AIFINPAY_TRUSTED_HOSTS),
|
|
13
25
|
};
|
|
14
26
|
}
|
|
27
|
+
function parseGatewayPathMode(raw) {
|
|
28
|
+
if (raw === undefined || raw.trim() === "")
|
|
29
|
+
return "gateway";
|
|
30
|
+
if (raw === "gateway" || raw === "direct")
|
|
31
|
+
return raw;
|
|
32
|
+
throw new Error("AIFINPAY_GATEWAY_PATH_MODE must be either gateway or direct");
|
|
33
|
+
}
|
|
15
34
|
/** Comma-separated list → trimmed entries, or undefined when unset/empty.
|
|
16
35
|
* Undefined and [] mean different things downstream: undefined keeps the SDK
|
|
17
36
|
* default, [] would mean "no origin is payable". An operator who sets the
|
|
@@ -19,7 +38,10 @@ export function loadConfigFromEnv() {
|
|
|
19
38
|
function splitList(raw) {
|
|
20
39
|
if (!raw)
|
|
21
40
|
return undefined;
|
|
22
|
-
const out = raw
|
|
41
|
+
const out = raw
|
|
42
|
+
.split(",")
|
|
43
|
+
.map((s) => s.trim())
|
|
44
|
+
.filter(Boolean);
|
|
23
45
|
return out.length ? out : undefined;
|
|
24
46
|
}
|
|
25
47
|
/** Same, but each entry must be a bare https origin.
|
|
@@ -38,8 +60,8 @@ function splitOrigins(raw) {
|
|
|
38
60
|
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" is not a URL`);
|
|
39
61
|
}
|
|
40
62
|
if (u.origin !== entry.replace(/\/+$/, "")) {
|
|
41
|
-
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" must be a bare origin like https://dev.example.com `
|
|
42
|
-
|
|
63
|
+
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" must be a bare origin like https://dev.example.com ` +
|
|
64
|
+
`(got path/query "${u.pathname}${u.search}")`);
|
|
43
65
|
}
|
|
44
66
|
// WHATWG URL accepts "*" in a hostname, so new URL("https://*.example.com")
|
|
45
67
|
// parses and its origin round-trips — the entry would be stored, matched
|
|
@@ -47,8 +69,8 @@ function splitOrigins(raw) {
|
|
|
47
69
|
// the difference between a misconfiguration that says so and one that looks
|
|
48
70
|
// like the feature is broken.
|
|
49
71
|
if (!/^[a-z0-9.-]+$/i.test(u.hostname) || u.hostname.startsWith("-") || u.hostname.includes("..")) {
|
|
50
|
-
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" is not a plain hostname. `
|
|
51
|
-
|
|
72
|
+
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" is not a plain hostname. ` +
|
|
73
|
+
`Wildcards are not supported — name each origin you settle against.`);
|
|
52
74
|
}
|
|
53
75
|
if (u.protocol !== "https:" && u.hostname !== "localhost" && u.hostname !== "127.0.0.1") {
|
|
54
76
|
throw new Error(`AIFINPAY_GATEWAY_ORIGINS: "${entry}" is not https — refusing to settle over plaintext`);
|
|
@@ -56,4 +78,37 @@ function splitOrigins(raw) {
|
|
|
56
78
|
}
|
|
57
79
|
return list;
|
|
58
80
|
}
|
|
81
|
+
/** Signing is available only after the owner configures all spending boundaries. */
|
|
82
|
+
export function validatePaymentConfig(config) {
|
|
83
|
+
if (!config.paymentsEnabled)
|
|
84
|
+
throw new Error("Payments disabled; owner must set AIFINPAY_PAYMENTS_ENABLED=1");
|
|
85
|
+
if (config.devMode)
|
|
86
|
+
throw new Error("MCP receipt payments currently support Polygon live mode only");
|
|
87
|
+
for (const [name, value] of [
|
|
88
|
+
["AIFINPAY_MAX_USD", config.maxAmountUsd],
|
|
89
|
+
["AIFINPAY_DAILY_USD", config.dailyAmountUsd],
|
|
90
|
+
]) {
|
|
91
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0)
|
|
92
|
+
throw new Error(`${name} must be a positive finite owner limit`);
|
|
93
|
+
}
|
|
94
|
+
if (!config.gatewayOrigins?.length ||
|
|
95
|
+
config.gatewayOrigins.some((origin) => {
|
|
96
|
+
try {
|
|
97
|
+
const u = new URL(origin);
|
|
98
|
+
return (u.protocol !== "https:" || u.origin !== origin || !!u.username || !!u.password || u.hostname.includes("*"));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
}))
|
|
104
|
+
throw new Error("Payments require explicit exact HTTPS AIFINPAY_GATEWAY_ORIGINS");
|
|
105
|
+
const gas = config.maxGasPol;
|
|
106
|
+
if (typeof gas !== "string" || !/^(?:0|[1-9][0-9]*)(?:\.[0-9]{1,18})?$/.test(gas))
|
|
107
|
+
throw new Error("AIFINPAY_MAX_GAS_POL must be a positive decimal with at most 18 places");
|
|
108
|
+
const [whole, fraction = ""] = gas.split(".");
|
|
109
|
+
const wei = BigInt(whole) * 10n ** 18n + BigInt(fraction.padEnd(18, "0"));
|
|
110
|
+
if (wei <= 0n || wei >= 2n ** 256n)
|
|
111
|
+
throw new Error("AIFINPAY_MAX_GAS_POL is outside the supported range");
|
|
112
|
+
return wei;
|
|
113
|
+
}
|
|
59
114
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpConfig } from "./config.js";
|
|
2
|
+
export type WalletIdentity = {
|
|
3
|
+
source: string;
|
|
4
|
+
seedHash?: string;
|
|
5
|
+
secretB58?: string;
|
|
6
|
+
};
|
|
7
|
+
/** Local inputs only. Never put the returned secrets in an MCP response/log. */
|
|
8
|
+
export declare function loadWalletIdentity(config: McpConfig): WalletIdentity | null;
|
|
9
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAiBvF,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI,CAoD3E"}
|
package/dist/identity.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readFileSync, existsSync, statSync } from "node:fs";
|
|
2
|
+
import { resolve, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { scryptSync, createDecipheriv } from "node:crypto";
|
|
5
|
+
function seed(value) {
|
|
6
|
+
if (typeof value !== "string" || !/^(0x)?[0-9a-fA-F]{64}$/.test(value)) {
|
|
7
|
+
throw new Error("SEED_HASH must contain a 32-byte hex seed (64 hex characters); no mnemonic or double hashing");
|
|
8
|
+
}
|
|
9
|
+
return value.replace(/^0x/, "");
|
|
10
|
+
}
|
|
11
|
+
function readJson(path) {
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error(`Cannot read wallet JSON at ${path}; refusing to generate a replacement wallet`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Local inputs only. Never put the returned secrets in an MCP response/log. */
|
|
20
|
+
export function loadWalletIdentity(config) {
|
|
21
|
+
if (config.seedHash !== undefined)
|
|
22
|
+
return { source: "SEED_HASH", seedHash: seed(config.seedHash) };
|
|
23
|
+
const path = resolve(config.agentsFile || "./aifinpay/agents.json");
|
|
24
|
+
if (existsSync(path)) {
|
|
25
|
+
const document = readJson(path);
|
|
26
|
+
const agents = document?.agents;
|
|
27
|
+
if (!Array.isArray(agents) || agents.length === 0)
|
|
28
|
+
throw new Error("agents.json requires a non-empty agents array");
|
|
29
|
+
const matches = config.agentId ? agents.filter((a) => a?.id === config.agentId) : agents;
|
|
30
|
+
if (matches.length !== 1)
|
|
31
|
+
throw new Error("Select exactly one agents.json record with AIFINPAY_AGENT_ID; refusing an ambiguous wallet");
|
|
32
|
+
return { source: "agents.json", seedHash: seed(matches[0]?.seed_hash) };
|
|
33
|
+
}
|
|
34
|
+
if (config.agentsFile)
|
|
35
|
+
throw new Error("Configured AIFINPAY_AGENTS_FILE does not exist");
|
|
36
|
+
if (config.agentSecretB58)
|
|
37
|
+
return { source: "AIFINPAY_AGENT_SECRET", secretB58: config.agentSecretB58 };
|
|
38
|
+
const legacyPath = join(config.walletHome || join(homedir(), ".aifinpay"), "agent.json");
|
|
39
|
+
if (!existsSync(legacyPath))
|
|
40
|
+
return null;
|
|
41
|
+
const legacy = readJson(legacyPath);
|
|
42
|
+
try {
|
|
43
|
+
const mode = statSync(legacyPath).mode & 0o777;
|
|
44
|
+
if (mode & 0o077) {
|
|
45
|
+
const message = `[aifinpay-mcp] ${legacyPath} is mode ${mode.toString(8)} — readable beyond your user. Run: chmod 600 ${legacyPath}`;
|
|
46
|
+
if (config.logFn)
|
|
47
|
+
config.logFn("warn", message);
|
|
48
|
+
else
|
|
49
|
+
process.stderr.write(`[warn] ${message}\n`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
/* A stat failure does not change which wallet was selected. */
|
|
54
|
+
}
|
|
55
|
+
if (legacy.enc) {
|
|
56
|
+
if (legacy.enc !== "scrypt-aes-256-gcm" || !config.walletPassphrase) {
|
|
57
|
+
throw new Error("Encrypted keystore requires AIFINPAY_WALLET_PASSPHRASE and the supported encryption format");
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const key = scryptSync(config.walletPassphrase, Buffer.from(legacy.salt, "base64"), 32, {
|
|
61
|
+
N: 1 << 15,
|
|
62
|
+
r: 8,
|
|
63
|
+
p: 1,
|
|
64
|
+
maxmem: 64 * 1024 * 1024,
|
|
65
|
+
});
|
|
66
|
+
const decipher = createDecipheriv("aes-256-gcm", key, Buffer.from(legacy.iv, "base64"));
|
|
67
|
+
decipher.setAuthTag(Buffer.from(legacy.tag, "base64"));
|
|
68
|
+
return {
|
|
69
|
+
source: "legacy-keystore",
|
|
70
|
+
secretB58: Buffer.concat([decipher.update(Buffer.from(legacy.ct, "base64")), decipher.final()]).toString("utf8"),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
throw new Error("Cannot decrypt keystore; refusing to generate a replacement wallet");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (typeof legacy.secretB58 !== "string" || !legacy.secretB58)
|
|
78
|
+
throw new Error("Invalid legacy keystore");
|
|
79
|
+
return { source: "legacy-keystore", secretB58: legacy.secretB58 };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
* @aifinpay/mcp — MCP server exposing AiFinPay's autonomous x402 payment
|
|
3
3
|
* loop as agent-callable tools.
|
|
4
4
|
*
|
|
5
|
-
* Tools:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - payable_fetch(url, opts?) — raw-URL paid fetch (legacy Solana path)
|
|
9
|
-
* - agent_quote(url) — inspect 402 cost before paying
|
|
10
|
-
* - pay_with_split / quote_split — direct B2BSplitter invoice (advanced)
|
|
5
|
+
* Tools: public addresses, history, quotas, passport resolution, non-signing
|
|
6
|
+
* settlement invoices, local wallet reload, and opt-in dev batch quoting.
|
|
7
|
+
* Signing tools are not registered in this RC.
|
|
11
8
|
*
|
|
12
9
|
* Quick start (stdio transport for Claude Desktop / MCP-aware runtimes):
|
|
13
10
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,12 +2,9 @@
|
|
|
2
2
|
* @aifinpay/mcp — MCP server exposing AiFinPay's autonomous x402 payment
|
|
3
3
|
* loop as agent-callable tools.
|
|
4
4
|
*
|
|
5
|
-
* Tools:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - payable_fetch(url, opts?) — raw-URL paid fetch (legacy Solana path)
|
|
9
|
-
* - agent_quote(url) — inspect 402 cost before paying
|
|
10
|
-
* - pay_with_split / quote_split — direct B2BSplitter invoice (advanced)
|
|
5
|
+
* Tools: public addresses, history, quotas, passport resolution, non-signing
|
|
6
|
+
* settlement invoices, local wallet reload, and opt-in dev batch quoting.
|
|
7
|
+
* Signing tools are not registered in this RC.
|
|
11
8
|
*
|
|
12
9
|
* Quick start (stdio transport for Claude Desktop / MCP-aware runtimes):
|
|
13
10
|
*
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Aifp1CachedReceipt, Aifp1PaymentRecovery } from "@aifinpay/agent";
|
|
2
|
+
export interface PendingPayment {
|
|
3
|
+
recovery: Aifp1PaymentRecovery;
|
|
4
|
+
serializedTransaction: `0x${string}`;
|
|
5
|
+
site: string;
|
|
6
|
+
amountUsd: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PaymentState {
|
|
9
|
+
version: 1;
|
|
10
|
+
address: string;
|
|
11
|
+
receipts: Aifp1CachedReceipt[];
|
|
12
|
+
pending?: PendingPayment;
|
|
13
|
+
spend: {
|
|
14
|
+
at: number;
|
|
15
|
+
usd: number;
|
|
16
|
+
tx: string;
|
|
17
|
+
}[];
|
|
18
|
+
}
|
|
19
|
+
export declare class PaymentStateError extends Error {
|
|
20
|
+
}
|
|
21
|
+
/** Per-wallet lock and crash-safe private journal. Never print its contents. */
|
|
22
|
+
export declare class PaymentStateStore {
|
|
23
|
+
readonly directory: string;
|
|
24
|
+
private readonly path;
|
|
25
|
+
private readonly lockPath;
|
|
26
|
+
constructor(address: string, walletHome?: string);
|
|
27
|
+
readonly address: string;
|
|
28
|
+
private durableDirectory;
|
|
29
|
+
private privateDirectory;
|
|
30
|
+
exclusive<T>(fn: () => Promise<T>): Promise<T>;
|
|
31
|
+
read(): PaymentState;
|
|
32
|
+
save(state: PaymentState): void;
|
|
33
|
+
spent24h(state: PaymentState, now?: number): number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=payment-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-state.d.ts","sourceRoot":"","sources":["../src/payment-state.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,qBAAqB,EAAE,KAAK,MAAM,EAAE,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClD;AAED,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,gFAAgF;AAChF,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBACtB,OAAO,EAAE,MAAM,EAAE,UAAU,SAA+B;IAWtE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,gBAAgB;IAMlB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkBpD,IAAI,IAAI,YAAY;IA8BpB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAsB/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,SAAa,GAAG,MAAM;CAGxD"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { constants, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
export class PaymentStateError extends Error {
|
|
6
|
+
}
|
|
7
|
+
/** Per-wallet lock and crash-safe private journal. Never print its contents. */
|
|
8
|
+
export class PaymentStateStore {
|
|
9
|
+
directory;
|
|
10
|
+
path;
|
|
11
|
+
lockPath;
|
|
12
|
+
constructor(address, walletHome = join(homedir(), ".aifinpay")) {
|
|
13
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(address))
|
|
14
|
+
throw new PaymentStateError("Invalid payment wallet address");
|
|
15
|
+
this.address = address.toLowerCase();
|
|
16
|
+
this.directory = join(walletHome, "payments", this.address);
|
|
17
|
+
this.durableDirectory(join(walletHome, "payments"));
|
|
18
|
+
this.privateDirectory(join(walletHome, "payments"));
|
|
19
|
+
this.durableDirectory(this.directory);
|
|
20
|
+
this.privateDirectory(this.directory);
|
|
21
|
+
this.path = join(this.directory, "state.json");
|
|
22
|
+
this.lockPath = join(this.directory, "operation.lock");
|
|
23
|
+
}
|
|
24
|
+
address;
|
|
25
|
+
durableDirectory(path) {
|
|
26
|
+
if (existsSync(path))
|
|
27
|
+
return;
|
|
28
|
+
const parent = dirname(path);
|
|
29
|
+
this.durableDirectory(parent);
|
|
30
|
+
try {
|
|
31
|
+
mkdirSync(path, { mode: 0o700 });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error.code !== "EEXIST")
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
// A durable file inside a newly created directory is insufficient: persist
|
|
38
|
+
// every new ancestor entry before a prepared payment may be broadcast.
|
|
39
|
+
for (const directory of [path, parent]) {
|
|
40
|
+
const fd = openSync(directory, constants.O_RDONLY);
|
|
41
|
+
try {
|
|
42
|
+
fsyncSync(fd);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
closeSync(fd);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
privateDirectory(path) {
|
|
50
|
+
const stat = lstatSync(path);
|
|
51
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 0o077) {
|
|
52
|
+
throw new PaymentStateError("Payment state directory must be private (mode 700) and not a symlink");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async exclusive(fn) {
|
|
56
|
+
let lock;
|
|
57
|
+
try {
|
|
58
|
+
lock = openSync(this.lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new PaymentStateError("Payment operation locked. Another process may be paying; after a crash the owner must reconcile the pending transaction before removing operation.lock. Locks are never automatically stolen.");
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
writeFileSync(lock, JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() }));
|
|
65
|
+
fsyncSync(lock);
|
|
66
|
+
return await fn();
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
closeSync(lock);
|
|
70
|
+
unlinkSync(this.lockPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
read() {
|
|
74
|
+
if (!existsSync(this.path))
|
|
75
|
+
return { version: 1, address: this.address, receipts: [], spend: [] };
|
|
76
|
+
const stat = lstatSync(this.path);
|
|
77
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.mode & 0o077 || stat.size > 4_000_000) {
|
|
78
|
+
throw new PaymentStateError("Unsafe payment state file; expected private regular file");
|
|
79
|
+
}
|
|
80
|
+
const state = JSON.parse(readFileSync(this.path, "utf8"));
|
|
81
|
+
if (state.version !== 1 ||
|
|
82
|
+
state.address !== this.address ||
|
|
83
|
+
!Array.isArray(state.receipts) ||
|
|
84
|
+
!Array.isArray(state.spend) ||
|
|
85
|
+
state.spend.some((s) => !Number.isFinite(s.at) || !Number.isFinite(s.usd) || s.usd <= 0 || !/^0x[0-9a-fA-F]{64}$/.test(s.tx))) {
|
|
86
|
+
throw new PaymentStateError("Invalid payment state; refusing to reset spent budget");
|
|
87
|
+
}
|
|
88
|
+
if (state.pending &&
|
|
89
|
+
(!state.pending.recovery ||
|
|
90
|
+
!/^0x[0-9a-fA-F]{64}$/.test(state.pending.recovery.txRef) ||
|
|
91
|
+
!/^0x[0-9a-fA-F]+$/.test(state.pending.serializedTransaction) ||
|
|
92
|
+
!Number.isFinite(state.pending.amountUsd) ||
|
|
93
|
+
state.pending.amountUsd <= 0)) {
|
|
94
|
+
throw new PaymentStateError("Invalid pending payment; manual reconciliation required");
|
|
95
|
+
}
|
|
96
|
+
return state;
|
|
97
|
+
}
|
|
98
|
+
save(state) {
|
|
99
|
+
const temporary = join(this.directory, `.state-${randomUUID()}.tmp`);
|
|
100
|
+
const fd = openSync(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
|
|
101
|
+
try {
|
|
102
|
+
writeFileSync(fd, JSON.stringify(state));
|
|
103
|
+
fsyncSync(fd);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
closeSync(fd);
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
renameSync(temporary, this.path);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
unlinkSync(temporary);
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
const directory = openSync(this.directory, constants.O_RDONLY);
|
|
116
|
+
try {
|
|
117
|
+
fsyncSync(directory);
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
closeSync(directory);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
spent24h(state, now = Date.now()) {
|
|
124
|
+
return state.spend.filter((s) => s.at >= now - 86_400_000).reduce((sum, s) => sum + s.usd, 0);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=payment-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-state.js","sourceRoot":"","sources":["../src/payment-state.ts"],"names":[],"mappings":"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"}
|
package/dist/safe-fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-fetch.d.ts","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"AA4DA,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"safe-fetch.d.ts","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"AA4DA,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA6BtD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AAEjD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC7D,OAAO,CAAC,GAAG,CAAC,CAmEd;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAAG,OAAO,KAAK,CAmE1G"}
|
package/dist/safe-fetch.js
CHANGED
|
@@ -65,12 +65,22 @@ export function isBlockedAddress(addr) {
|
|
|
65
65
|
return BLOCKED_V4.some(([lo, hi]) => n >= lo && n <= hi);
|
|
66
66
|
}
|
|
67
67
|
if (family === 6) {
|
|
68
|
-
|
|
68
|
+
// URL canonicalization collapses expanded zeros AND rewrites mapped dotted
|
|
69
|
+
// IPv4 into hex, e.g. ::ffff:127.0.0.1 becomes ::ffff:7f00:1.
|
|
70
|
+
let lower;
|
|
71
|
+
try {
|
|
72
|
+
lower = new URL(`https://[${addr}]/`).hostname.replace(/^\[|\]$/g, "");
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
69
77
|
// An IPv4-mapped address is an IPv4 address wearing a hat. Unwrap it, or
|
|
70
78
|
// ::ffff:127.0.0.1 walks straight through an IPv6-only check.
|
|
71
|
-
const mapped = lower.match(/^::ffff:(
|
|
72
|
-
if (mapped)
|
|
73
|
-
|
|
79
|
+
const mapped = lower.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);
|
|
80
|
+
if (mapped) {
|
|
81
|
+
const n = (parseInt(mapped[1], 16) * 65536 + parseInt(mapped[2], 16)) >>> 0;
|
|
82
|
+
return BLOCKED_V4.some(([lo, hi]) => n >= lo && n <= hi);
|
|
83
|
+
}
|
|
74
84
|
if (lower === "::1" || lower === "::")
|
|
75
85
|
return true;
|
|
76
86
|
if (/^f[cd][0-9a-f]{2}:/.test(lower))
|
|
@@ -139,9 +149,9 @@ export async function assertRequestAllowed(rawUrl, opts = {}) {
|
|
|
139
149
|
addresses = await lookup(host, { all: true });
|
|
140
150
|
}
|
|
141
151
|
catch (e) {
|
|
142
|
-
throw new BlockedRequestError(`cannot resolve ${host}: ${e.message}. `
|
|
143
|
-
|
|
144
|
-
|
|
152
|
+
throw new BlockedRequestError(`cannot resolve ${host}: ${e.message}. ` +
|
|
153
|
+
`If this host is reachable only through a proxy, name it in ` +
|
|
154
|
+
`AIFINPAY_TRUSTED_HOSTS to skip the DNS pre-check for it alone.`);
|
|
145
155
|
}
|
|
146
156
|
if (!addresses.length) {
|
|
147
157
|
throw new BlockedRequestError(`${host} resolved to nothing`);
|
|
@@ -163,22 +173,66 @@ export async function assertRequestAllowed(rawUrl, opts = {}) {
|
|
|
163
173
|
*/
|
|
164
174
|
export function makeSafeFetch(opts = {}) {
|
|
165
175
|
const safeFetch = async (input, init) => {
|
|
166
|
-
let
|
|
167
|
-
|
|
168
|
-
: input.url;
|
|
169
|
-
let request = init;
|
|
176
|
+
let request = new Request(input, init);
|
|
177
|
+
const redirect = request.redirect;
|
|
170
178
|
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
|
|
171
|
-
await assertRequestAllowed(
|
|
172
|
-
const res = await globalThis.fetch(
|
|
173
|
-
const location =
|
|
179
|
+
await assertRequestAllowed(request.url, opts);
|
|
180
|
+
const res = await globalThis.fetch(request.clone(), { redirect: "manual" });
|
|
181
|
+
const location = [301, 302, 303, 307, 308].includes(res.status) ? res.headers.get("location") : null;
|
|
174
182
|
if (!location)
|
|
175
183
|
return res;
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (
|
|
180
|
-
|
|
184
|
+
if (redirect === "manual")
|
|
185
|
+
return res;
|
|
186
|
+
await res.body?.cancel();
|
|
187
|
+
if (redirect === "error")
|
|
188
|
+
throw new BlockedRequestError("redirect forbidden by request policy");
|
|
189
|
+
if (hop === MAX_REDIRECTS)
|
|
190
|
+
break;
|
|
191
|
+
const next = new URL(location, request.url);
|
|
192
|
+
const crossOrigin = next.origin !== new URL(request.url).origin;
|
|
193
|
+
const dropBody = (res.status === 303 && !["GET", "HEAD"].includes(request.method)) ||
|
|
194
|
+
([301, 302].includes(res.status) && request.method === "POST");
|
|
195
|
+
if (crossOrigin && request.body && !dropBody) {
|
|
196
|
+
throw new BlockedRequestError("refusing cross-origin redirect with a request body");
|
|
197
|
+
}
|
|
198
|
+
const headers = new Headers(request.headers);
|
|
199
|
+
if (crossOrigin) {
|
|
200
|
+
// Only explicitly public negotiation headers may leave the original
|
|
201
|
+
// origin. A denylist cannot anticipate every merchant's secret header.
|
|
202
|
+
const publicHeaders = new Set(["accept", "accept-language", "cache-control", "pragma"]);
|
|
203
|
+
for (const key of Array.from(headers.keys()))
|
|
204
|
+
if (!publicHeaders.has(key))
|
|
205
|
+
headers.delete(key);
|
|
206
|
+
}
|
|
207
|
+
if (dropBody) {
|
|
208
|
+
for (const key of [
|
|
209
|
+
"content-type",
|
|
210
|
+
"content-length",
|
|
211
|
+
"content-encoding",
|
|
212
|
+
"content-language",
|
|
213
|
+
"content-location",
|
|
214
|
+
])
|
|
215
|
+
headers.delete(key);
|
|
181
216
|
}
|
|
217
|
+
const redirectInit = dropBody
|
|
218
|
+
? {
|
|
219
|
+
method: "GET",
|
|
220
|
+
signal: request.signal,
|
|
221
|
+
credentials: request.credentials,
|
|
222
|
+
cache: request.cache,
|
|
223
|
+
mode: request.mode,
|
|
224
|
+
redirect,
|
|
225
|
+
referrer: request.referrer,
|
|
226
|
+
referrerPolicy: request.referrerPolicy,
|
|
227
|
+
integrity: request.integrity,
|
|
228
|
+
keepalive: request.keepalive,
|
|
229
|
+
}
|
|
230
|
+
: request;
|
|
231
|
+
const redirected = new Request(next, redirectInit);
|
|
232
|
+
request = new Request(redirected, {
|
|
233
|
+
headers,
|
|
234
|
+
...(crossOrigin ? { credentials: "omit", referrer: "", referrerPolicy: "no-referrer" } : {}),
|
|
235
|
+
});
|
|
182
236
|
}
|
|
183
237
|
throw new BlockedRequestError(`too many redirects (more than ${MAX_REDIRECTS})`);
|
|
184
238
|
};
|
package/dist/safe-fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-fetch.js","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,wEAAwE;AACxE,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,mEAAmE;AACnE,sEAAsE;AACtE,6EAA6E;AAC7E,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,uDAAuD;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,qDAAqD;AACrD,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAuB;IACrC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,YAAY;IACtC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,aAAa;IACvC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,4BAA4B;IACtD,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,uBAAuB;IACjD,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,uCAAuC;IACjE,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,gBAAgB;IAC1C,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,eAAe;IACzC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,iBAAiB;IAC3C,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,6BAA6B;IACvD,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,wBAAwB;IAClD,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,mCAAmC;CAC9D,CAAC;AAEF,SAAS,OAAO,CAAC,EAAU;IACzB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC;QAC1D,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,4CAA4C;QACzE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,
|
|
1
|
+
{"version":3,"file":"safe-fetch.js","sourceRoot":"","sources":["../src/safe-fetch.ts"],"names":[],"mappings":"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"}
|