@stellar-agent-services/provider-kit 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/README.md +506 -2
- package/dist/approve/assets/index-BazIJAI2.css +1 -0
- package/dist/approve/assets/index-CL28cSJy.js +420 -0
- package/dist/approve/favicon.svg +1 -0
- package/dist/approve/index.html +18 -0
- package/dist/cli/approval-view.d.ts +80 -0
- package/dist/cli/approval-view.d.ts.map +1 -0
- package/dist/cli/approval-view.js +5 -0
- package/dist/cli/approval-view.js.map +1 -0
- package/dist/cli/approval.d.ts +132 -0
- package/dist/cli/approval.d.ts.map +1 -0
- package/dist/cli/approval.js +542 -0
- package/dist/cli/approval.js.map +1 -0
- package/dist/cli/check.d.ts +3 -0
- package/dist/cli/check.d.ts.map +1 -0
- package/dist/cli/check.js +137 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/dev-account.d.ts +28 -0
- package/dist/cli/dev-account.d.ts.map +1 -0
- package/dist/cli/dev-account.js +62 -0
- package/dist/cli/dev-account.js.map +1 -0
- package/dist/cli/dev.d.ts +27 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +226 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/discovery.d.ts +20 -0
- package/dist/cli/discovery.d.ts.map +1 -0
- package/dist/cli/discovery.js +202 -0
- package/dist/cli/discovery.js.map +1 -0
- package/dist/cli/env-file.d.ts +16 -0
- package/dist/cli/env-file.d.ts.map +1 -0
- package/dist/cli/env-file.js +77 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/fly.d.ts +28 -0
- package/dist/cli/fly.d.ts.map +1 -0
- package/dist/cli/fly.js +92 -0
- package/dist/cli/fly.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +170 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/launch.d.ts +21 -0
- package/dist/cli/launch.d.ts.map +1 -0
- package/dist/cli/launch.js +627 -0
- package/dist/cli/launch.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +158 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/owner-chain.d.ts +88 -0
- package/dist/cli/owner-chain.d.ts.map +1 -0
- package/dist/cli/owner-chain.js +284 -0
- package/dist/cli/owner-chain.js.map +1 -0
- package/dist/cli/owner-steps.d.ts +33 -0
- package/dist/cli/owner-steps.d.ts.map +1 -0
- package/dist/cli/owner-steps.js +121 -0
- package/dist/cli/owner-steps.js.map +1 -0
- package/dist/cli/processes.d.ts +47 -0
- package/dist/cli/processes.d.ts.map +1 -0
- package/dist/cli/processes.js +129 -0
- package/dist/cli/processes.js.map +1 -0
- package/dist/cli/reconcile.d.ts +3 -0
- package/dist/cli/reconcile.d.ts.map +1 -0
- package/dist/cli/reconcile.js +76 -0
- package/dist/cli/reconcile.js.map +1 -0
- package/dist/cli/register.d.ts +9 -0
- package/dist/cli/register.d.ts.map +1 -0
- package/dist/cli/register.js +209 -0
- package/dist/cli/register.js.map +1 -0
- package/dist/cli/request-validation.d.ts +5 -0
- package/dist/cli/request-validation.d.ts.map +1 -0
- package/dist/cli/request-validation.js +144 -0
- package/dist/cli/request-validation.js.map +1 -0
- package/dist/cli/serve.d.ts +25 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +73 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/shared.d.ts +142 -0
- package/dist/cli/shared.d.ts.map +1 -0
- package/dist/cli/shared.js +110 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/status.d.ts +32 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +248 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/target.d.ts +14 -0
- package/dist/cli/target.d.ts.map +1 -0
- package/dist/cli/target.js +43 -0
- package/dist/cli/target.js.map +1 -0
- package/dist/cli/trustline.d.ts +3 -0
- package/dist/cli/trustline.d.ts.map +1 -0
- package/dist/cli/trustline.js +114 -0
- package/dist/cli/trustline.js.map +1 -0
- package/dist/cli/try.d.ts +54 -0
- package/dist/cli/try.d.ts.map +1 -0
- package/dist/cli/try.js +448 -0
- package/dist/cli/try.js.map +1 -0
- package/dist/cli/tunnel.d.ts +13 -0
- package/dist/cli/tunnel.d.ts.map +1 -0
- package/dist/cli/tunnel.js +43 -0
- package/dist/cli/tunnel.js.map +1 -0
- package/dist/cli/validators.d.ts +6 -0
- package/dist/cli/validators.d.ts.map +1 -0
- package/dist/cli/validators.js +14 -0
- package/dist/cli/validators.js.map +1 -0
- package/dist/define-service.d.ts +71 -0
- package/dist/define-service.d.ts.map +1 -0
- package/dist/define-service.js +86 -0
- package/dist/define-service.js.map +1 -0
- package/dist/gateway/config.d.ts +88 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +201 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/openapi.d.ts +69 -0
- package/dist/gateway/openapi.d.ts.map +1 -0
- package/dist/gateway/openapi.js +677 -0
- package/dist/gateway/openapi.js.map +1 -0
- package/dist/gateway/upstream.d.ts +15 -0
- package/dist/gateway/upstream.d.ts.map +1 -0
- package/dist/gateway/upstream.js +95 -0
- package/dist/gateway/upstream.js.map +1 -0
- package/dist/http/bounded.d.ts +3 -0
- package/dist/http/bounded.d.ts.map +1 -0
- package/dist/http/bounded.js +23 -0
- package/dist/http/bounded.js.map +1 -0
- package/dist/http/node-server.d.ts +15 -0
- package/dist/http/node-server.d.ts.map +1 -0
- package/dist/http/node-server.js +120 -0
- package/dist/http/node-server.js.map +1 -0
- package/dist/http/rate-limit.d.ts +11 -0
- package/dist/http/rate-limit.d.ts.map +1 -0
- package/dist/http/rate-limit.js +35 -0
- package/dist/http/rate-limit.js.map +1 -0
- package/dist/http/router.d.ts +29 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/router.js +329 -0
- package/dist/http/router.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/memory-store.d.ts +3 -0
- package/dist/jobs/memory-store.d.ts.map +1 -0
- package/dist/jobs/memory-store.js +121 -0
- package/dist/jobs/memory-store.js.map +1 -0
- package/dist/jobs/reconcile.d.ts +22 -0
- package/dist/jobs/reconcile.d.ts.map +1 -0
- package/dist/jobs/reconcile.js +82 -0
- package/dist/jobs/reconcile.js.map +1 -0
- package/dist/jobs/recovery.d.ts +19 -0
- package/dist/jobs/recovery.d.ts.map +1 -0
- package/dist/jobs/recovery.js +65 -0
- package/dist/jobs/recovery.js.map +1 -0
- package/dist/jobs/runner.d.ts +38 -0
- package/dist/jobs/runner.d.ts.map +1 -0
- package/dist/jobs/runner.js +194 -0
- package/dist/jobs/runner.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +66 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +197 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/sqlite-store.d.ts +8 -0
- package/dist/jobs/sqlite-store.d.ts.map +1 -0
- package/dist/jobs/sqlite-store.js +231 -0
- package/dist/jobs/sqlite-store.js.map +1 -0
- package/dist/jobs/store.d.ts +118 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +36 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/manifest.d.ts +11 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +99 -0
- package/dist/manifest.js.map +1 -0
- package/dist/payments/chain.d.ts +23 -0
- package/dist/payments/chain.d.ts.map +1 -0
- package/dist/payments/chain.js +108 -0
- package/dist/payments/chain.js.map +1 -0
- package/dist/payments/facilitator.d.ts +44 -0
- package/dist/payments/facilitator.d.ts.map +1 -0
- package/dist/payments/facilitator.js +125 -0
- package/dist/payments/facilitator.js.map +1 -0
- package/dist/payments/onchain.d.ts +36 -0
- package/dist/payments/onchain.d.ts.map +1 -0
- package/dist/payments/onchain.js +191 -0
- package/dist/payments/onchain.js.map +1 -0
- package/dist/payments/payload-checks.d.ts +22 -0
- package/dist/payments/payload-checks.d.ts.map +1 -0
- package/dist/payments/payload-checks.js +113 -0
- package/dist/payments/payload-checks.js.map +1 -0
- package/dist/payments/settlement.d.ts +22 -0
- package/dist/payments/settlement.d.ts.map +1 -0
- package/dist/payments/settlement.js +65 -0
- package/dist/payments/settlement.js.map +1 -0
- package/dist/payments/x402-server.d.ts +8 -0
- package/dist/payments/x402-server.d.ts.map +1 -0
- package/dist/payments/x402-server.js +74 -0
- package/dist/payments/x402-server.js.map +1 -0
- package/dist/provider.d.ts +63 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +177 -0
- package/dist/provider.js.map +1 -0
- package/dist/registration.d.ts +86 -0
- package/dist/registration.d.ts.map +1 -0
- package/dist/registration.js +162 -0
- package/dist/registration.js.map +1 -0
- package/dist/testing.d.ts +13 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +48 -0
- package/dist/testing.js.map +1 -0
- package/dist/validation-request.d.ts +36 -0
- package/dist/validation-request.d.ts.map +1 -0
- package/dist/validation-request.js +101 -0
- package/dist/validation-request.js.map +1 -0
- package/package.json +55 -4
- package/schemas/gateway-config.schema.json +140 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// HTTP routes (Fetch API). Job paths are fixed relative to baseUrl (docs/provider-standard.md §5).
|
|
2
|
+
//
|
|
3
|
+
// GET <manifest path> -> manifest
|
|
4
|
+
// POST {baseUrl}/services/{name}/jobs -> create-job (x402; Idempotency-Key + Job-Token, or neither)
|
|
5
|
+
// GET {baseUrl}/jobs/{jobId} -> check-status (Job-Token)
|
|
6
|
+
// GET {baseUrl}/jobs/{jobId}/result -> get-result (Job-Token)
|
|
7
|
+
//
|
|
8
|
+
// create-job follows the processing order in §5.4. Errors are RFC 9457 problems that never echo
|
|
9
|
+
// headers, payment payloads or tokens [E2]. CORS is open so browser wallets can call providers [J17].
|
|
10
|
+
//
|
|
11
|
+
// Capacity (§5.8) is step 5: the caller's rate limit (429), then a place in the service's lane (503),
|
|
12
|
+
// both before the 402, so nobody signs or pays for a job the provider can't take [Q1]. A paid request
|
|
13
|
+
// is checked again [Q3]. The place is held while the payment is checked, verified and claimed, and the
|
|
14
|
+
// claim runs under the lane's lock, so the job is counted exactly once.
|
|
15
|
+
//
|
|
16
|
+
// Step 7 checks the payment locally before the facilitator sees it (payments/payload-checks.ts): a
|
|
17
|
+
// payment for another recipient, amount or asset is refused with a 402 and never forwarded. So is one
|
|
18
|
+
// whose signature expires further out than maxTimeoutSeconds allows, when the ledger clock can tell:
|
|
19
|
+
// the facilitator refuses it too, and reconciliation relies on it (payments/onchain.ts).
|
|
20
|
+
import { createHash, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
|
|
21
|
+
import { bindingHash, chargedFor, CREATE_JOB_HOLD_MAX_SECONDS, IDEMPOTENCY_KEY, IDEMPOTENCY_KEY_PATTERN, JOB_TOKEN, JOB_TOKEN_PATTERN, jobStatusUrl, jobViewHttpStatus, problem, PROBLEM_CONTENT_TYPE, PROBLEMS, } from "@stellar-agent-services/protocol";
|
|
22
|
+
import { encodePaymentRequiredHeader, encodePaymentResponseHeader } from "@x402/core/http";
|
|
23
|
+
import { runOnSuccess, settleUpfront } from "../jobs/runner.js";
|
|
24
|
+
import { FINAL_STATUSES } from "../jobs/store.js";
|
|
25
|
+
import { EXPIRATION_TOLERANCE_LEDGERS } from "../payments/onchain.js";
|
|
26
|
+
import { checkPayment, isRefused } from "../payments/payload-checks.js";
|
|
27
|
+
import { paymentRequired, paymentRequirements, readPayment } from "../payments/x402-server.js";
|
|
28
|
+
import { readBounded } from "./bounded.js";
|
|
29
|
+
export const MAX_HOLD_SECONDS = CREATE_JOB_HOLD_MAX_SECONDS;
|
|
30
|
+
const RETRY_AFTER_SECONDS = 2;
|
|
31
|
+
/** Longest Retry-After on a 202 for a queued job [Q6]. */
|
|
32
|
+
const QUEUED_RETRY_AFTER_MAX_SECONDS = 60;
|
|
33
|
+
/** How often a held create-job looks at a job another process may be running. */
|
|
34
|
+
const HOLD_POLL_MS = 1000;
|
|
35
|
+
const CORS = {
|
|
36
|
+
"Access-Control-Allow-Origin": "*",
|
|
37
|
+
"Access-Control-Expose-Headers": "PAYMENT-REQUIRED, PAYMENT-RESPONSE, Location, Retry-After",
|
|
38
|
+
};
|
|
39
|
+
export async function route(request, context) {
|
|
40
|
+
const url = new URL(request.url);
|
|
41
|
+
if (request.method === "OPTIONS") {
|
|
42
|
+
return new Response(null, {
|
|
43
|
+
status: 204,
|
|
44
|
+
headers: {
|
|
45
|
+
...CORS,
|
|
46
|
+
"Access-Control-Allow-Methods": "GET, POST",
|
|
47
|
+
"Access-Control-Allow-Headers": `Content-Type, ${IDEMPOTENCY_KEY}, ${JOB_TOKEN}, PAYMENT-SIGNATURE`,
|
|
48
|
+
"Access-Control-Max-Age": "600",
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (url.pathname === context.manifestPath && request.method === "GET") {
|
|
53
|
+
return json(context.manifest, 200, { "Cache-Control": "max-age=300" });
|
|
54
|
+
}
|
|
55
|
+
const basePath = new URL(context.manifest.baseUrl).pathname.replace(/\/$/, "");
|
|
56
|
+
if (!url.pathname.startsWith(`${basePath}/`))
|
|
57
|
+
return error("service_not_found");
|
|
58
|
+
const path = url.pathname.slice(basePath.length);
|
|
59
|
+
const createJob = /^\/services\/([^/]+)\/jobs$/.exec(path);
|
|
60
|
+
if (createJob !== null && request.method === "POST") {
|
|
61
|
+
let name;
|
|
62
|
+
try {
|
|
63
|
+
name = decodeURIComponent(createJob[1]);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return error("service_not_found");
|
|
67
|
+
}
|
|
68
|
+
return handleCreateJob(request, name, context);
|
|
69
|
+
}
|
|
70
|
+
const getJob = /^\/jobs\/([^/]+?)(\/result)?$/.exec(path);
|
|
71
|
+
if (getJob !== null && request.method === "GET")
|
|
72
|
+
return handleGetJob(request, getJob[1], getJob[2] !== undefined, context);
|
|
73
|
+
return error("service_not_found");
|
|
74
|
+
}
|
|
75
|
+
async function handleCreateJob(request, serviceName, context) {
|
|
76
|
+
// 1. Headers and body.
|
|
77
|
+
const jobIdHeader = request.headers.get(IDEMPOTENCY_KEY);
|
|
78
|
+
const tokenHeader = request.headers.get(JOB_TOKEN);
|
|
79
|
+
if ((jobIdHeader === null) !== (tokenHeader === null)) {
|
|
80
|
+
return error("invalid_request", `send both ${IDEMPOTENCY_KEY} and ${JOB_TOKEN}, or neither`);
|
|
81
|
+
}
|
|
82
|
+
if (jobIdHeader !== null && !IDEMPOTENCY_KEY_PATTERN.test(jobIdHeader))
|
|
83
|
+
return error("invalid_request", `${IDEMPOTENCY_KEY} must be a lowercase UUID`);
|
|
84
|
+
if (tokenHeader !== null && !JOB_TOKEN_PATTERN.test(tokenHeader))
|
|
85
|
+
return error("invalid_request", `${JOB_TOKEN} must be 43 base64url characters`);
|
|
86
|
+
if (!request.headers.get("Content-Type")?.startsWith("application/json"))
|
|
87
|
+
return error("invalid_request", "the body must be application/json");
|
|
88
|
+
// 2. Service.
|
|
89
|
+
const service = context.services.get(serviceName);
|
|
90
|
+
if (service === undefined)
|
|
91
|
+
return error("service_not_found");
|
|
92
|
+
const declared = Number(request.headers.get("Content-Length") ?? "0");
|
|
93
|
+
const body = declared > service.inputLimitBytes ? undefined : await readBounded(request.body, service.inputLimitBytes);
|
|
94
|
+
if (body === undefined)
|
|
95
|
+
return error("payload_too_large", `the body is larger than ${service.inputLimitBytes} bytes`);
|
|
96
|
+
let input;
|
|
97
|
+
try {
|
|
98
|
+
input = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(body));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return error("invalid_request", "the body is not valid JSON");
|
|
102
|
+
}
|
|
103
|
+
if (typeof input !== "object" || input === null || Array.isArray(input))
|
|
104
|
+
return error("invalid_input", "the input must be a JSON object");
|
|
105
|
+
const binding = await bindingHash(service.name, input);
|
|
106
|
+
const tokenHash = tokenHeader === null ? undefined : sha256(tokenHeader);
|
|
107
|
+
// 3. An existing job [J5]–[J7].
|
|
108
|
+
if (jobIdHeader !== null) {
|
|
109
|
+
const existing = await context.store.get(jobIdHeader);
|
|
110
|
+
if (existing !== undefined)
|
|
111
|
+
return existingJob(existing, binding, tokenHash, context);
|
|
112
|
+
}
|
|
113
|
+
// 4. Input [P8].
|
|
114
|
+
if (!service.validateInput(input))
|
|
115
|
+
return error("invalid_input", undefined, inputErrors(service.validateInput.errors));
|
|
116
|
+
// 5. Capacity [P8], [Q1]–[Q3], once the provider can take payments at all.
|
|
117
|
+
try {
|
|
118
|
+
await context.ready();
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
console.error("[provider-kit] not ready to take payments:", cause);
|
|
122
|
+
return error("unavailable", "the provider can't take payments right now; nothing was charged");
|
|
123
|
+
}
|
|
124
|
+
const limited = context.rateLimit?.(request);
|
|
125
|
+
if (limited !== undefined) {
|
|
126
|
+
return error("rate_limited", "too many requests from this caller; nothing was charged", undefined, { "Retry-After": String(limited) });
|
|
127
|
+
}
|
|
128
|
+
const admission = await context.scheduler.admit(service.name);
|
|
129
|
+
if (!admission.accepted) {
|
|
130
|
+
const detail = `"${service.name}" is at capacity; nothing was charged`;
|
|
131
|
+
return error("unavailable", detail, undefined, { "Retry-After": String(admission.retryAfterSeconds) });
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const ids = { jobIdHeader, tokenHeader, tokenHash, binding };
|
|
135
|
+
return await payAndRun(request, service, input, ids, admission.reservation, context);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
// A no-op once the job is claimed. Otherwise the request ended without a job, and the place is free again.
|
|
139
|
+
admission.reservation.release();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function payAndRun(request, service, input, ids, reservation, context) {
|
|
143
|
+
const { manifest, store, facilitator, scheduler } = context;
|
|
144
|
+
const { jobIdHeader, tokenHeader, tokenHash, binding } = ids;
|
|
145
|
+
// 6. No payment: the challenge.
|
|
146
|
+
const requirements = paymentRequirements(manifest, service);
|
|
147
|
+
const paymentHeader = request.headers.get("PAYMENT-SIGNATURE");
|
|
148
|
+
if (paymentHeader === null)
|
|
149
|
+
return challenge(manifest, service);
|
|
150
|
+
// 7. Check the payment locally, then verify it with the facilitator.
|
|
151
|
+
const payload = readPayment(paymentHeader, requirements);
|
|
152
|
+
if (payload === undefined)
|
|
153
|
+
return challenge(manifest, service, "invalid_payment");
|
|
154
|
+
const payment = await checkPayment(payload, requirements);
|
|
155
|
+
if (isRefused(payment))
|
|
156
|
+
return challenge(manifest, service, payment.reason);
|
|
157
|
+
// A ledger takes at least a second, so maxTimeoutSeconds is also the most ledgers a payment may live.
|
|
158
|
+
const latestLedger = await context.clock?.latest().catch(() => undefined);
|
|
159
|
+
if (latestLedger !== undefined && payment.expirationLedger > latestLedger + requirements.maxTimeoutSeconds + EXPIRATION_TOLERANCE_LEDGERS) {
|
|
160
|
+
return challenge(manifest, service, "invalid_exact_stellar_payload_signature_expiration_too_far");
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const verified = await facilitator.verify(payload, requirements);
|
|
164
|
+
if (!verified.isValid)
|
|
165
|
+
return challenge(manifest, service, verified.invalidReason ?? "invalid_payment");
|
|
166
|
+
if (verified.payer !== undefined && verified.payer !== payment.payer) {
|
|
167
|
+
console.error(`[provider-kit] the facilitator verified payer ${verified.payer}, but the payment is from ${payment.payer}`);
|
|
168
|
+
return error("unavailable", "the payment could not be verified; nothing was charged");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (cause) {
|
|
172
|
+
console.error("[provider-kit] the facilitator could not verify a payment:", cause);
|
|
173
|
+
return error("unavailable", "the payment could not be verified; nothing was charged");
|
|
174
|
+
}
|
|
175
|
+
// 8. Claim the job id and the payment together [J4], [P9], under the lane's lock.
|
|
176
|
+
const generated = jobIdHeader === null;
|
|
177
|
+
const jobId = jobIdHeader ?? randomUUID();
|
|
178
|
+
const jobToken = tokenHeader ?? randomBytes(32).toString("base64url");
|
|
179
|
+
const now = new Date().toISOString();
|
|
180
|
+
const job = {
|
|
181
|
+
jobId,
|
|
182
|
+
service: service.name,
|
|
183
|
+
charge: service.charge,
|
|
184
|
+
bindingHash: binding,
|
|
185
|
+
tokenHash: sha256(jobToken),
|
|
186
|
+
// An upfront job settles right after the claim, so the claim marks it as settling.
|
|
187
|
+
...(service.charge === "on-success" ? { status: "queued" } : { status: "pending", settlingSince: now }),
|
|
188
|
+
claim: { fingerprint: payment.fingerprint, payer: payment.payer, nonce: payment.nonce, expirationLedger: payment.expirationLedger },
|
|
189
|
+
input,
|
|
190
|
+
createdAt: now,
|
|
191
|
+
updatedAt: now,
|
|
192
|
+
};
|
|
193
|
+
const claim = await scheduler.exclusive(service.name, async () => {
|
|
194
|
+
const result = await store.claim(job);
|
|
195
|
+
reservation.release();
|
|
196
|
+
return result;
|
|
197
|
+
});
|
|
198
|
+
if (claim.outcome === "payment_used")
|
|
199
|
+
return challenge(manifest, service, "payment_already_used");
|
|
200
|
+
if (claim.outcome === "conflict")
|
|
201
|
+
return error("idempotency_key_reused");
|
|
202
|
+
// Raced with an identical request: that request owns the payment, this one must not settle it [J5].
|
|
203
|
+
if (claim.outcome === "existing")
|
|
204
|
+
return existingJob(claim.job, binding, tokenHash, context);
|
|
205
|
+
// 9. Settle and run, holding the response for at most holdSeconds [J9].
|
|
206
|
+
const deadline = Date.now() + context.holdSeconds * 1000;
|
|
207
|
+
const run = { store, facilitator, scheduler, service, input, payload, requirements, payment, settleTimeoutMs: context.settleTimeoutMs, clock: context.clock };
|
|
208
|
+
let settled;
|
|
209
|
+
const work = (service.charge === "on-success" ? runOnSuccess(claim.job, run) : settleUpfront(claim.job, run))
|
|
210
|
+
.then((response) => (settled = response))
|
|
211
|
+
.catch((cause) => console.error(`[provider-kit] job ${jobId} crashed:`, cause));
|
|
212
|
+
await Promise.race([work, sleep(context.holdSeconds * 1000)]);
|
|
213
|
+
if (service.charge === "upfront")
|
|
214
|
+
await untilFinal(jobId, deadline, context);
|
|
215
|
+
if (context.loseCreateJobResponse)
|
|
216
|
+
throw new Error(`response-loss drill: dropping the create-job response for ${jobId}`);
|
|
217
|
+
// 10. Respond.
|
|
218
|
+
const stored = (await store.get(jobId));
|
|
219
|
+
// Settlement outlasted the hold: ask the client to come back [J7].
|
|
220
|
+
if (stored.status === "pending")
|
|
221
|
+
return error("request_in_progress", undefined, undefined, { "Retry-After": String(RETRY_AFTER_SECONDS) });
|
|
222
|
+
const headers = {};
|
|
223
|
+
if (settled !== undefined)
|
|
224
|
+
headers["PAYMENT-RESPONSE"] = encodePaymentResponseHeader(settled);
|
|
225
|
+
return jobResponse(stored, context, { withOutput: true, create: true, ...(generated ? { jobToken } : {}), headers });
|
|
226
|
+
}
|
|
227
|
+
/** Waits until the job is final or uncertain, or the deadline passes: whichever process runs it. */
|
|
228
|
+
async function untilFinal(jobId, deadline, context) {
|
|
229
|
+
while (Date.now() < deadline) {
|
|
230
|
+
const changed = context.scheduler.changed();
|
|
231
|
+
const job = await context.store.get(jobId);
|
|
232
|
+
if (job === undefined || FINAL_STATUSES.includes(job.status) || job.status === "payment_uncertain")
|
|
233
|
+
return;
|
|
234
|
+
await Promise.race([changed, sleep(Math.min(HOLD_POLL_MS, deadline - Date.now()))]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function handleGetJob(request, jobId, withOutput, context) {
|
|
238
|
+
const token = request.headers.get(JOB_TOKEN);
|
|
239
|
+
const job = IDEMPOTENCY_KEY_PATTERN.test(jobId) ? await context.store.get(jobId) : undefined;
|
|
240
|
+
// Unknown job, missing or wrong token, and an expired job all look the same [J10].
|
|
241
|
+
if (job === undefined || token === null || !sameHash(job.tokenHash, sha256(token)) || expired(job, context))
|
|
242
|
+
return error("job_not_found");
|
|
243
|
+
if (job.status === "pending")
|
|
244
|
+
return error("request_in_progress", undefined, undefined, { "Retry-After": String(RETRY_AFTER_SECONDS) });
|
|
245
|
+
return jobResponse(job, context, { withOutput });
|
|
246
|
+
}
|
|
247
|
+
function existingJob(job, binding, tokenHash, context) {
|
|
248
|
+
if (job.bindingHash !== binding || !sameHash(job.tokenHash, tokenHash))
|
|
249
|
+
return error("idempotency_key_reused");
|
|
250
|
+
if (expired(job, context))
|
|
251
|
+
return error("idempotency_key_reused", "this job id was used for a job that has expired");
|
|
252
|
+
if (job.status === "pending")
|
|
253
|
+
return error("request_in_progress", undefined, undefined, { "Retry-After": String(RETRY_AFTER_SECONDS) });
|
|
254
|
+
return jobResponse(job, context, { withOutput: true, create: true });
|
|
255
|
+
}
|
|
256
|
+
function expiresAt(job, context) {
|
|
257
|
+
return Date.parse(job.finishedAt ?? job.createdAt) + context.retentionSeconds * 1000;
|
|
258
|
+
}
|
|
259
|
+
/** A final job past its retention is gone, even before the sweep deletes it [J15]. */
|
|
260
|
+
function expired(job, context) {
|
|
261
|
+
return FINAL_STATUSES.includes(job.status) && expiresAt(job, context) <= Date.now();
|
|
262
|
+
}
|
|
263
|
+
async function jobResponse(job, context, options) {
|
|
264
|
+
if (job.status === "pending")
|
|
265
|
+
throw new Error("a pending job has no view");
|
|
266
|
+
const charged = chargedFor(job.status, job.charge, job.error?.code);
|
|
267
|
+
const view = {
|
|
268
|
+
jobId: job.jobId,
|
|
269
|
+
service: job.service,
|
|
270
|
+
status: job.status,
|
|
271
|
+
charge: job.charge,
|
|
272
|
+
charged,
|
|
273
|
+
createdAt: job.createdAt,
|
|
274
|
+
updatedAt: job.updatedAt,
|
|
275
|
+
expiresAt: new Date(expiresAt(job, context)).toISOString(),
|
|
276
|
+
};
|
|
277
|
+
if (options.withOutput && job.status === "succeeded" && job.output !== undefined)
|
|
278
|
+
view.output = job.output;
|
|
279
|
+
if (job.status === "failed" && job.error !== undefined)
|
|
280
|
+
view.error = job.error;
|
|
281
|
+
if (charged === true && job.payment !== undefined)
|
|
282
|
+
view.payment = job.payment;
|
|
283
|
+
if (options.jobToken !== undefined)
|
|
284
|
+
view.jobToken = options.jobToken;
|
|
285
|
+
let retryAfter = RETRY_AFTER_SECONDS;
|
|
286
|
+
const queue = job.status === "queued" ? await context.scheduler.position(job) : undefined;
|
|
287
|
+
if (queue !== undefined) {
|
|
288
|
+
view.queue = queue;
|
|
289
|
+
const seconds = Math.ceil((Date.parse(queue.estimatedStartAt) - Date.now()) / 1000);
|
|
290
|
+
retryAfter = Math.min(QUEUED_RETRY_AFTER_MAX_SECONDS, Math.max(1, seconds));
|
|
291
|
+
}
|
|
292
|
+
const status = jobViewHttpStatus(job.status);
|
|
293
|
+
const headers = { ...options.headers };
|
|
294
|
+
if (status === 202) {
|
|
295
|
+
headers["Retry-After"] = String(retryAfter);
|
|
296
|
+
if (options.create)
|
|
297
|
+
headers["Location"] = jobStatusUrl(context.manifest.baseUrl, job.jobId);
|
|
298
|
+
}
|
|
299
|
+
return json(view, status, headers);
|
|
300
|
+
}
|
|
301
|
+
function challenge(manifest, service, reason) {
|
|
302
|
+
const body = paymentRequired(manifest, service, reason);
|
|
303
|
+
return json(body, 402, { "PAYMENT-REQUIRED": encodePaymentRequiredHeader(body) });
|
|
304
|
+
}
|
|
305
|
+
function error(code, detail, errors, headers = {}) {
|
|
306
|
+
const options = {};
|
|
307
|
+
if (detail !== undefined)
|
|
308
|
+
options.detail = detail;
|
|
309
|
+
if (errors !== undefined)
|
|
310
|
+
options.errors = errors;
|
|
311
|
+
const retry = "retryAfter" in PROBLEMS[code] ? { "Retry-After": String(RETRY_AFTER_SECONDS) } : {};
|
|
312
|
+
return json(problem(code, options), PROBLEMS[code].status, { ...retry, ...headers }, PROBLEM_CONTENT_TYPE);
|
|
313
|
+
}
|
|
314
|
+
function json(body, status, headers = {}, contentType = "application/json") {
|
|
315
|
+
return new Response(JSON.stringify(body), { status, headers: { ...CORS, "Content-Type": contentType, ...headers } });
|
|
316
|
+
}
|
|
317
|
+
function inputErrors(errors) {
|
|
318
|
+
return (errors ?? []).map((e) => ({ pointer: e.instancePath, message: e.message ?? "is invalid" }));
|
|
319
|
+
}
|
|
320
|
+
function sha256(value) {
|
|
321
|
+
return createHash("sha256").update(value).digest("hex");
|
|
322
|
+
}
|
|
323
|
+
function sameHash(a, b) {
|
|
324
|
+
return a.length === b.length && timingSafeEqual(Buffer.from(a), Buffer.from(b));
|
|
325
|
+
}
|
|
326
|
+
function sleep(ms) {
|
|
327
|
+
return new Promise((resolve) => setTimeout(resolve, ms).unref());
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/http/router.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export * from "./define-service.js";
|
|
2
|
+
export * from "./provider.js";
|
|
3
|
+
export * from "./manifest.js";
|
|
4
|
+
export * from "./registration.js";
|
|
5
|
+
export * from "./validation-request.js";
|
|
6
|
+
export * from "./gateway/config.js";
|
|
7
|
+
export * from "./gateway/upstream.js";
|
|
8
|
+
export * from "./jobs/store.js";
|
|
9
|
+
export * from "./jobs/memory-store.js";
|
|
10
|
+
export * from "./jobs/sqlite-store.js";
|
|
11
|
+
export * from "./jobs/scheduler.js";
|
|
12
|
+
export * from "./jobs/reconcile.js";
|
|
13
|
+
export * from "./http/rate-limit.js";
|
|
14
|
+
export * from "./http/node-server.js";
|
|
15
|
+
export * from "./payments/chain.js";
|
|
16
|
+
export * from "./payments/facilitator.js";
|
|
17
|
+
export * from "./payments/onchain.js";
|
|
18
|
+
export * from "./payments/payload-checks.js";
|
|
19
|
+
export * from "./payments/settlement.js";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// @stellar-agent-services/provider-kit
|
|
2
|
+
//
|
|
3
|
+
// Turns a function, or an existing HTTP API, into a paid Stellar service that follows Provider
|
|
4
|
+
// Standard v1:
|
|
5
|
+
// library: defineService(...) -> createProvider(...) -> { fetch(request) } -> any Fetch-API server
|
|
6
|
+
// gateway: provider-kit serve --config <file> -> forwards paid jobs to the upstream API
|
|
7
|
+
//
|
|
8
|
+
// Security rule: the provider runtime holds NO Stellar secret keys. It knows only its `payTo` public
|
|
9
|
+
// address, and the x402 facilitator verifies and settles. Owner operations (the USDC trustline, 8004
|
|
10
|
+
// registration, validation requests) run only from the CLI, signed in the owner's own wallet on a local
|
|
11
|
+
// approval page, or by the Stellar CLI keychain with --source. The CLI never holds a key either.
|
|
12
|
+
export * from "./define-service.js";
|
|
13
|
+
export * from "./provider.js";
|
|
14
|
+
export * from "./manifest.js";
|
|
15
|
+
export * from "./registration.js";
|
|
16
|
+
export * from "./validation-request.js";
|
|
17
|
+
export * from "./gateway/config.js";
|
|
18
|
+
export * from "./gateway/upstream.js";
|
|
19
|
+
export * from "./jobs/store.js";
|
|
20
|
+
export * from "./jobs/memory-store.js";
|
|
21
|
+
export * from "./jobs/sqlite-store.js";
|
|
22
|
+
export * from "./jobs/scheduler.js";
|
|
23
|
+
export * from "./jobs/reconcile.js";
|
|
24
|
+
export * from "./http/rate-limit.js";
|
|
25
|
+
export * from "./http/node-server.js";
|
|
26
|
+
export * from "./payments/chain.js";
|
|
27
|
+
export * from "./payments/facilitator.js";
|
|
28
|
+
export * from "./payments/onchain.js";
|
|
29
|
+
export * from "./payments/payload-checks.js";
|
|
30
|
+
export * from "./payments/settlement.js";
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,+FAA+F;AAC/F,eAAe;AACf,sGAAsG;AACtG,2FAA2F;AAC3F,EAAE;AACF,qGAAqG;AACrG,qGAAqG;AACrG,wGAAwG;AACxG,iGAAiG;AAEjG,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgD,KAAK,QAAQ,EAAkB,MAAM,YAAY,CAAC;AAEzG,wBAAgB,WAAW,IAAI,QAAQ,CAmHtC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// In-memory JobStore for tests and local development. It is not durable: jobs, queued ones included,
|
|
2
|
+
// are lost on restart, so a provider using it can't recover jobs beyond the process lifetime. Use
|
|
3
|
+
// sqliteStore() for anything users pay for.
|
|
4
|
+
//
|
|
5
|
+
// No method awaits inside, so each check-and-write is atomic on the event loop.
|
|
6
|
+
import { applyPatch, FINAL_STATUSES } from "./store.js";
|
|
7
|
+
export function memoryStore() {
|
|
8
|
+
const jobs = new Map();
|
|
9
|
+
const payments = new Map();
|
|
10
|
+
let queueSeq = 0;
|
|
11
|
+
const copy = (job) => job && structuredClone(job);
|
|
12
|
+
const ofService = (service) => [...jobs.values()].filter((job) => job.service === service);
|
|
13
|
+
const enqueue = (job) => {
|
|
14
|
+
job.queueSeq = ++queueSeq;
|
|
15
|
+
};
|
|
16
|
+
const toRunning = (job, lease) => {
|
|
17
|
+
applyPatch(job, { status: "running" }, new Date());
|
|
18
|
+
if (lease !== undefined) {
|
|
19
|
+
job.lease = lease;
|
|
20
|
+
job.attempts = (job.attempts ?? 0) + 1;
|
|
21
|
+
}
|
|
22
|
+
return copy(job);
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
async get(jobId) {
|
|
26
|
+
return copy(jobs.get(jobId));
|
|
27
|
+
},
|
|
28
|
+
async claim(job) {
|
|
29
|
+
const existing = jobs.get(job.jobId);
|
|
30
|
+
if (existing !== undefined) {
|
|
31
|
+
const same = existing.bindingHash === job.bindingHash && existing.tokenHash === job.tokenHash;
|
|
32
|
+
return same ? { outcome: "existing", job: copy(existing) } : { outcome: "conflict" };
|
|
33
|
+
}
|
|
34
|
+
if (payments.has(job.claim.fingerprint))
|
|
35
|
+
return { outcome: "payment_used" };
|
|
36
|
+
const stored = structuredClone(job);
|
|
37
|
+
if (stored.status === "queued")
|
|
38
|
+
enqueue(stored);
|
|
39
|
+
payments.set(job.claim.fingerprint, job.jobId);
|
|
40
|
+
jobs.set(job.jobId, stored);
|
|
41
|
+
return { outcome: "created", job: copy(stored) };
|
|
42
|
+
},
|
|
43
|
+
async update(jobId, from, patch, owner) {
|
|
44
|
+
const job = jobs.get(jobId);
|
|
45
|
+
if (job === undefined || job.status !== from || FINAL_STATUSES.includes(job.status))
|
|
46
|
+
return undefined;
|
|
47
|
+
if (owner !== undefined && job.lease?.owner !== owner)
|
|
48
|
+
return undefined;
|
|
49
|
+
applyPatch(job, patch, new Date());
|
|
50
|
+
if (patch.status === "queued" && from !== "queued")
|
|
51
|
+
enqueue(job);
|
|
52
|
+
return copy(job);
|
|
53
|
+
},
|
|
54
|
+
async load(service) {
|
|
55
|
+
const load = { pending: 0, queued: 0, running: 0 };
|
|
56
|
+
for (const job of ofService(service)) {
|
|
57
|
+
if (job.status === "pending" || job.status === "queued" || job.status === "running")
|
|
58
|
+
load[job.status]++;
|
|
59
|
+
}
|
|
60
|
+
return load;
|
|
61
|
+
},
|
|
62
|
+
async position(jobId) {
|
|
63
|
+
const job = jobs.get(jobId);
|
|
64
|
+
if (job?.status !== "queued")
|
|
65
|
+
return undefined;
|
|
66
|
+
return ofService(job.service).filter((other) => other.status === "queued" && other.queueSeq < job.queueSeq).length + 1;
|
|
67
|
+
},
|
|
68
|
+
async start(jobId, concurrency) {
|
|
69
|
+
const job = jobs.get(jobId);
|
|
70
|
+
if (job?.status !== "queued")
|
|
71
|
+
return undefined;
|
|
72
|
+
const others = ofService(job.service);
|
|
73
|
+
const running = others.filter((other) => other.status === "running").length;
|
|
74
|
+
const ahead = others.filter((other) => other.status === "queued" && other.queueSeq < job.queueSeq).length;
|
|
75
|
+
return running + ahead < concurrency ? toRunning(job) : undefined;
|
|
76
|
+
},
|
|
77
|
+
async lease(service, concurrency, owner, leaseSeconds) {
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
const lease = { owner, expiresAt: now + leaseSeconds * 1000 };
|
|
80
|
+
const upfront = ofService(service)
|
|
81
|
+
.filter((job) => job.charge === "upfront")
|
|
82
|
+
.sort((a, b) => a.queueSeq - b.queueSeq);
|
|
83
|
+
const orphan = upfront.find((job) => job.status === "running" && job.lease !== undefined && job.lease.expiresAt < now && job.lease.owner !== owner);
|
|
84
|
+
if (orphan !== undefined) {
|
|
85
|
+
orphan.lease = lease;
|
|
86
|
+
orphan.attempts = (orphan.attempts ?? 0) + 1;
|
|
87
|
+
orphan.updatedAt = new Date(now).toISOString();
|
|
88
|
+
return copy(orphan);
|
|
89
|
+
}
|
|
90
|
+
const running = ofService(service).filter((job) => job.status === "running").length;
|
|
91
|
+
const next = upfront.find((job) => job.status === "queued");
|
|
92
|
+
return next !== undefined && running < concurrency ? toRunning(next, lease) : undefined;
|
|
93
|
+
},
|
|
94
|
+
async renew(jobId, owner, leaseSeconds) {
|
|
95
|
+
const job = jobs.get(jobId);
|
|
96
|
+
if (job?.status !== "running" || job.lease?.owner !== owner)
|
|
97
|
+
return false;
|
|
98
|
+
job.lease.expiresAt = Date.now() + leaseSeconds * 1000;
|
|
99
|
+
return true;
|
|
100
|
+
},
|
|
101
|
+
async list({ statuses, createdBefore, limit }) {
|
|
102
|
+
return [...jobs.values()]
|
|
103
|
+
.filter((job) => statuses.includes(job.status) && job.createdAt < createdBefore)
|
|
104
|
+
.sort((a, b) => a.createdAt.localeCompare(b.createdAt))
|
|
105
|
+
.slice(0, limit)
|
|
106
|
+
.map((job) => copy(job));
|
|
107
|
+
},
|
|
108
|
+
async deleteFinishedBefore(before) {
|
|
109
|
+
let deleted = 0;
|
|
110
|
+
for (const [jobId, job] of jobs) {
|
|
111
|
+
if (FINAL_STATUSES.includes(job.status) && job.finishedAt !== undefined && job.finishedAt < before) {
|
|
112
|
+
jobs.delete(jobId);
|
|
113
|
+
payments.delete(job.claim.fingerprint);
|
|
114
|
+
deleted++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return deleted;
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type PaymentLookup, type PaymentSearch } from "../payments/onchain.js";
|
|
2
|
+
import type { JobStore, StoredStatus } from "./store.js";
|
|
3
|
+
export interface ReconcileOptions extends PaymentSearch {
|
|
4
|
+
/** Report what would change, and change nothing. */
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
/** At most this many jobs per run, oldest first. Default 500. */
|
|
7
|
+
limit?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface Reconciled {
|
|
10
|
+
jobId: string;
|
|
11
|
+
service: string;
|
|
12
|
+
outcome: PaymentLookup["outcome"];
|
|
13
|
+
/** The job's status afterwards: what it would be, in a dry run. */
|
|
14
|
+
status: StoredStatus;
|
|
15
|
+
/** The settling transaction. */
|
|
16
|
+
transaction?: string;
|
|
17
|
+
/** Why it was not settled, or is undecided. */
|
|
18
|
+
reason?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Decides the store's payment_uncertain jobs that the chain can decide. */
|
|
21
|
+
export declare function reconcile(store: JobStore, options: ReconcileOptions): Promise<Reconciled[]>;
|
|
22
|
+
//# sourceMappingURL=reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/jobs/reconcile.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAe,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,KAAK,EAAY,QAAQ,EAAa,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,mEAAmE;IACnE,MAAM,EAAE,YAAY,CAAC;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,4EAA4E;AAC5E,wBAAsB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAkBjG"}
|