@genesis-tech/genesispay-seller 0.8.0 → 0.11.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/CHANGELOG.md +96 -38
- package/README.md +142 -40
- package/dist/client.d.ts +23 -15
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +73 -39
- package/dist/client.js.map +1 -1
- package/dist/customers.d.ts +2 -2
- package/dist/customers.d.ts.map +1 -1
- package/dist/customers.js +5 -5
- package/dist/customers.js.map +1 -1
- package/dist/entitlements.d.ts +19 -0
- package/dist/entitlements.d.ts.map +1 -0
- package/dist/entitlements.js +30 -0
- package/dist/entitlements.js.map +1 -0
- package/dist/errors.d.ts +9 -9
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -18
- package/dist/errors.js.map +1 -1
- package/dist/genesispay-settlement.d.ts +30 -0
- package/dist/genesispay-settlement.d.ts.map +1 -0
- package/dist/genesispay-settlement.js +103 -0
- package/dist/genesispay-settlement.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/invoices.d.ts +2 -2
- package/dist/invoices.d.ts.map +1 -1
- package/dist/invoices.js +7 -7
- package/dist/invoices.js.map +1 -1
- package/dist/mandate-gate.d.ts +5 -5
- package/dist/mandate-gate.d.ts.map +1 -1
- package/dist/mandate-gate.js +4 -4
- package/dist/mandate-gate.js.map +1 -1
- package/dist/mandates.d.ts +4 -4
- package/dist/mandates.d.ts.map +1 -1
- package/dist/mandates.js +9 -9
- package/dist/mandates.js.map +1 -1
- package/dist/payment-gate.js +1 -1
- package/dist/payment-gate.js.map +1 -1
- package/dist/plans.d.ts +2 -2
- package/dist/plans.d.ts.map +1 -1
- package/dist/plans.js +6 -6
- package/dist/plans.js.map +1 -1
- package/dist/products.d.ts +128 -0
- package/dist/products.d.ts.map +1 -0
- package/dist/products.js +287 -0
- package/dist/products.js.map +1 -0
- package/dist/resource.d.ts +2 -2
- package/dist/resource.d.ts.map +1 -1
- package/dist/resource.js +1 -1
- package/dist/resource.js.map +1 -1
- package/dist/webhooks.d.ts +25 -25
- package/dist/webhooks.d.ts.map +1 -1
- package/dist/webhooks.js +30 -29
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
package/dist/products.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
// `genesispay.products.*` — the merchant's catalogue over `/api/v1/products`.
|
|
2
|
+
//
|
|
3
|
+
// A product is what a shop sells; its payable instance is one CANONICAL
|
|
4
|
+
// reusable checkout link, minted (idempotently) with `createPaymentLink`. The
|
|
5
|
+
// price and asset are copied onto the link at mint and never re-read from the
|
|
6
|
+
// catalogue, so editing or archiving a product cannot change what a buyer
|
|
7
|
+
// already sees. Everything is scoped to the key's own account: someone else's
|
|
8
|
+
// product answers 404 (GenesisPayNotFoundError), never 403 — the API is no
|
|
9
|
+
// catalogue-enumeration oracle, and the SDK does not paper over that.
|
|
10
|
+
import { GenesisPayConfigError } from "./errors.js";
|
|
11
|
+
import { asRecord, optionalString, requiredString, toAmountString, oneOf, } from "./resource.js";
|
|
12
|
+
import { PAYMENT_RESPONSE_HEADER, PAYMENT_SIGNATURE_HEADER } from "@genesis-tech/genesispay-protocol";
|
|
13
|
+
export function createProductsResource(request,
|
|
14
|
+
/**
|
|
15
|
+
* Applies the client's `expectedPayTo` pin to the wallet the server froze
|
|
16
|
+
* onto the minted link — the destination every sale of this product settles
|
|
17
|
+
* to, which is exactly the value the pin exists to guard.
|
|
18
|
+
*/
|
|
19
|
+
assertPinnedDestination = () => { },
|
|
20
|
+
/** The client's raw-link mapper, so link shapes cannot drift between resources. */
|
|
21
|
+
toLink, rawGateRequest) {
|
|
22
|
+
return {
|
|
23
|
+
create: async (input) => {
|
|
24
|
+
const body = await request({
|
|
25
|
+
method: "POST",
|
|
26
|
+
path: "/api/v1/products",
|
|
27
|
+
operation: "POST /api/v1/products",
|
|
28
|
+
action: "create a product",
|
|
29
|
+
body: {
|
|
30
|
+
name: input.name,
|
|
31
|
+
price: input.price,
|
|
32
|
+
...(input.description ? { description: input.description } : {}),
|
|
33
|
+
...(input.imageUrl ? { imageUrl: input.imageUrl } : {}),
|
|
34
|
+
...(input.sku ? { sku: input.sku } : {}),
|
|
35
|
+
...(input.asset ? { asset: input.asset } : {}),
|
|
36
|
+
...(input.delivery ? { delivery: input.delivery } : {}),
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
return requireProduct(body, "POST /api/v1/products");
|
|
40
|
+
},
|
|
41
|
+
list: async (opts) => {
|
|
42
|
+
const query = opts?.includeArchived ? "?includeArchived=true" : "";
|
|
43
|
+
const body = await request({
|
|
44
|
+
path: `/api/v1/products${query}`,
|
|
45
|
+
operation: "GET /api/v1/products",
|
|
46
|
+
action: "list products",
|
|
47
|
+
});
|
|
48
|
+
const products = asRecord(body)?.products;
|
|
49
|
+
if (!Array.isArray(products)) {
|
|
50
|
+
// A list endpoint that answers 200 without a list is a broken
|
|
51
|
+
// contract, not an old backend. Returning [] would hide it as "no
|
|
52
|
+
// products yet".
|
|
53
|
+
throw new GenesisPayConfigError(`GenesisPay GET /api/v1/products returned no products array: ${JSON.stringify(body)}`);
|
|
54
|
+
}
|
|
55
|
+
// Individual entries stay tolerant: one unusable row must not lose the rest.
|
|
56
|
+
return products
|
|
57
|
+
.map(asRecord)
|
|
58
|
+
.filter((raw) => raw !== null)
|
|
59
|
+
.filter((raw) => typeof raw.publicId === "string" && raw.publicId.length > 0)
|
|
60
|
+
.map(toProduct);
|
|
61
|
+
},
|
|
62
|
+
retrieve: async (publicId) => {
|
|
63
|
+
const id = requirePublicId(publicId, "products.retrieve");
|
|
64
|
+
const body = await request({
|
|
65
|
+
path: `/api/v1/products/${encodeURIComponent(id)}`,
|
|
66
|
+
operation: `GET /api/v1/products/${id}`,
|
|
67
|
+
action: `retrieve product "${id}"`,
|
|
68
|
+
notFoundMessage: notFoundMessage(id),
|
|
69
|
+
});
|
|
70
|
+
return requireProduct(body, `GET /api/v1/products/${id}`);
|
|
71
|
+
},
|
|
72
|
+
update: async (publicId, input) => {
|
|
73
|
+
const id = requirePublicId(publicId, "products.update");
|
|
74
|
+
const body = await request({
|
|
75
|
+
method: "PATCH",
|
|
76
|
+
path: `/api/v1/products/${encodeURIComponent(id)}`,
|
|
77
|
+
operation: `PATCH /api/v1/products/${id}`,
|
|
78
|
+
action: `update product "${id}"`,
|
|
79
|
+
notFoundMessage: notFoundMessage(id),
|
|
80
|
+
body: "delivery" in input ? { delivery: input.delivery } : { fulfilmentUrl: input.fulfilmentUrl },
|
|
81
|
+
});
|
|
82
|
+
return requireProduct(body, `PATCH /api/v1/products/${id}`);
|
|
83
|
+
},
|
|
84
|
+
archive: async (publicId) => {
|
|
85
|
+
const id = requirePublicId(publicId, "products.archive");
|
|
86
|
+
const body = await request({
|
|
87
|
+
method: "POST",
|
|
88
|
+
path: `/api/v1/products/${encodeURIComponent(id)}/archive`,
|
|
89
|
+
operation: `POST /api/v1/products/${id}/archive`,
|
|
90
|
+
action: `archive product "${id}"`,
|
|
91
|
+
notFoundMessage: notFoundMessage(id),
|
|
92
|
+
});
|
|
93
|
+
return requireProduct(body, `POST /api/v1/products/${id}/archive`);
|
|
94
|
+
},
|
|
95
|
+
createPaymentLink: async (publicId) => {
|
|
96
|
+
const id = requirePublicId(publicId, "products.createPaymentLink");
|
|
97
|
+
const body = await request({
|
|
98
|
+
method: "POST",
|
|
99
|
+
path: `/api/v1/products/${encodeURIComponent(id)}/payment-link`,
|
|
100
|
+
operation: `POST /api/v1/products/${id}/payment-link`,
|
|
101
|
+
action: `mint the payment link for product "${id}"`,
|
|
102
|
+
notFoundMessage: notFoundMessage(id),
|
|
103
|
+
hint: (status) => status === 409
|
|
104
|
+
? "An archived product mints no new links, and selling needs a receiving wallet on the account."
|
|
105
|
+
: undefined,
|
|
106
|
+
});
|
|
107
|
+
const record = asRecord(body);
|
|
108
|
+
const rawLink = asRecord(record?.link);
|
|
109
|
+
if (!rawLink || typeof rawLink.publicId !== "string" || !rawLink.publicId) {
|
|
110
|
+
throw new GenesisPayConfigError(`GenesisPay POST /api/v1/products/${id}/payment-link returned no link: ${JSON.stringify(body)}`);
|
|
111
|
+
}
|
|
112
|
+
assertPinnedDestination(rawLink.destinationWallet, "product payment link");
|
|
113
|
+
return {
|
|
114
|
+
link: toLink(rawLink),
|
|
115
|
+
// Only an explicit true: a proxy that drops the field must not report
|
|
116
|
+
// every idempotent re-mint as a fresh link.
|
|
117
|
+
created: record?.created === true,
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
gate: (publicId) => createProductGate({
|
|
121
|
+
publicId: requirePublicId(publicId, "products.gate"),
|
|
122
|
+
retrieve: async () => {
|
|
123
|
+
const body = await request({
|
|
124
|
+
path: `/api/v1/products/${encodeURIComponent(publicId)}`,
|
|
125
|
+
operation: `GET /api/v1/products/${publicId}`,
|
|
126
|
+
action: `retrieve product "${publicId}"`,
|
|
127
|
+
notFoundMessage: notFoundMessage(publicId),
|
|
128
|
+
});
|
|
129
|
+
return requireProduct(body, `GET /api/v1/products/${publicId}`);
|
|
130
|
+
},
|
|
131
|
+
createPaymentLink: async () => {
|
|
132
|
+
const body = await request({
|
|
133
|
+
method: "POST",
|
|
134
|
+
path: `/api/v1/products/${encodeURIComponent(publicId)}/payment-link`,
|
|
135
|
+
operation: `POST /api/v1/products/${publicId}/payment-link`, action: `mint the payment link for product "${publicId}"`,
|
|
136
|
+
notFoundMessage: notFoundMessage(publicId),
|
|
137
|
+
});
|
|
138
|
+
const record = asRecord(body);
|
|
139
|
+
const rawLink = asRecord(record?.link);
|
|
140
|
+
if (!rawLink || typeof rawLink.publicId !== "string" || !rawLink.publicId)
|
|
141
|
+
throw new GenesisPayConfigError("GenesisPay product gate returned no link.");
|
|
142
|
+
assertPinnedDestination(rawLink.destinationWallet, "product payment link");
|
|
143
|
+
return { link: toLink(rawLink), created: record?.created === true };
|
|
144
|
+
},
|
|
145
|
+
request: rawGateRequest,
|
|
146
|
+
}),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function notFoundMessage(id) {
|
|
150
|
+
return (`No GenesisPay product with publicId "${id}". Check the id and that it ` +
|
|
151
|
+
`belongs to the account this API key authenticates.`);
|
|
152
|
+
}
|
|
153
|
+
function requirePublicId(publicId, method) {
|
|
154
|
+
const id = publicId?.trim();
|
|
155
|
+
if (!id) {
|
|
156
|
+
throw new GenesisPayConfigError(`${method}(publicId) requires the publicId returned by products.create().`);
|
|
157
|
+
}
|
|
158
|
+
return id;
|
|
159
|
+
}
|
|
160
|
+
function requireProduct(body, operation) {
|
|
161
|
+
const raw = asRecord(asRecord(body)?.product);
|
|
162
|
+
if (!raw || typeof raw.publicId !== "string" || !raw.publicId) {
|
|
163
|
+
throw new GenesisPayConfigError(`GenesisPay ${operation} returned no product: ${JSON.stringify(body)}`);
|
|
164
|
+
}
|
|
165
|
+
return toProduct(raw);
|
|
166
|
+
}
|
|
167
|
+
export function toProduct(raw) {
|
|
168
|
+
return {
|
|
169
|
+
publicId: requiredString(raw.publicId),
|
|
170
|
+
name: requiredString(raw.name),
|
|
171
|
+
description: optionalString(raw.description),
|
|
172
|
+
imageUrl: optionalString(raw.imageUrl),
|
|
173
|
+
sku: optionalString(raw.sku),
|
|
174
|
+
asset: oneOf(raw.asset, ["USDC", "EURC"], "USDC"),
|
|
175
|
+
price: toAmountString(raw.price),
|
|
176
|
+
priceMinor: toAmountString(raw.priceMinor),
|
|
177
|
+
archived: raw.archived === true,
|
|
178
|
+
fulfilmentUrl: optionalString(raw.fulfilmentUrl),
|
|
179
|
+
fulfilmentVerifiedAt: optionalString(raw.fulfilmentVerifiedAt),
|
|
180
|
+
delivery: toProductDelivery(raw),
|
|
181
|
+
createdAt: requiredString(raw.createdAt),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function toProductDelivery(raw) {
|
|
185
|
+
const delivery = asRecord(raw.delivery);
|
|
186
|
+
if (delivery?.type === "redirect" && typeof delivery.url === "string") {
|
|
187
|
+
return { type: "redirect", url: delivery.url, verifiedAt: optionalString(delivery.verifiedAt) };
|
|
188
|
+
}
|
|
189
|
+
if (delivery?.type === "gate" && typeof delivery.resourceUrl === "string") {
|
|
190
|
+
return { type: "gate", resourceUrl: delivery.resourceUrl, method: oneOf(delivery.method, ["GET", "POST", "PUT", "PATCH", "DELETE"], "POST") };
|
|
191
|
+
}
|
|
192
|
+
// Compatibility with servers older than the additive delivery field.
|
|
193
|
+
const url = optionalString(raw.fulfilmentUrl);
|
|
194
|
+
return url ? { type: "redirect", url, verifiedAt: optionalString(raw.fulfilmentVerifiedAt) } : { type: "none" };
|
|
195
|
+
}
|
|
196
|
+
function createProductGate(input) {
|
|
197
|
+
return {
|
|
198
|
+
async prime() {
|
|
199
|
+
const product = await input.retrieve();
|
|
200
|
+
if (product.delivery.type !== "gate")
|
|
201
|
+
throw new GenesisPayConfigError(`Product "${input.publicId}" is not configured with gate delivery.`);
|
|
202
|
+
return { product, paymentLink: await input.createPaymentLink() };
|
|
203
|
+
},
|
|
204
|
+
async protect(request, handler) {
|
|
205
|
+
if (!input.request)
|
|
206
|
+
throw new GenesisPayConfigError("This GenesisPay client cannot call product gates.");
|
|
207
|
+
const signature = request.headers.get(PAYMENT_SIGNATURE_HEADER);
|
|
208
|
+
const url = canonicalRequestUrl(request.url);
|
|
209
|
+
const requestMethod = request.method.toUpperCase();
|
|
210
|
+
let product = null;
|
|
211
|
+
let gateResourceUrl;
|
|
212
|
+
if (signature) {
|
|
213
|
+
// A settled retry belongs to the immutable resource snapshot in its
|
|
214
|
+
// gate intent. Do not reject it because the merchant edited the live
|
|
215
|
+
// product URL after GenesisPay returned the original 402.
|
|
216
|
+
gateResourceUrl = url;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const primed = await this.prime();
|
|
220
|
+
product = primed.product;
|
|
221
|
+
if (product.delivery.type !== "gate")
|
|
222
|
+
throw new GenesisPayConfigError("Product is not a gate.");
|
|
223
|
+
if (url !== canonicalRequestUrl(product.delivery.resourceUrl) || requestMethod !== product.delivery.method) {
|
|
224
|
+
throw new GenesisPayConfigError("Incoming request does not match the product's registered gate resource.");
|
|
225
|
+
}
|
|
226
|
+
gateResourceUrl = product.delivery.resourceUrl;
|
|
227
|
+
}
|
|
228
|
+
const requestFingerprint = await fingerprintRequest(request);
|
|
229
|
+
const response = await input.request(input.publicId, {
|
|
230
|
+
action: signature ? "settle" : "challenge",
|
|
231
|
+
resourceUrl: gateResourceUrl,
|
|
232
|
+
method: requestMethod,
|
|
233
|
+
requestFingerprint,
|
|
234
|
+
...(signature ? { paymentSignature: signature } : {}),
|
|
235
|
+
});
|
|
236
|
+
if (!response.ok)
|
|
237
|
+
return copyResponse(response);
|
|
238
|
+
const payment = await response.clone().json().catch(() => null);
|
|
239
|
+
const attemptId = typeof payment?.paymentAttemptId === "string" ? payment.paymentAttemptId : null;
|
|
240
|
+
if (!attemptId)
|
|
241
|
+
return copyResponse(response);
|
|
242
|
+
// Product data is presentation/context, never payment authority. Reading
|
|
243
|
+
// it after a signed retry is safe even if delivery has changed; GenesisPay
|
|
244
|
+
// already checked the intent's seller/product/link ownership.
|
|
245
|
+
product ??= await input.retrieve();
|
|
246
|
+
const extension = asRecord(payment?.extensions);
|
|
247
|
+
const handlerResponse = await handler(request, {
|
|
248
|
+
product: { publicId: product.publicId, sku: product.sku, quantity: 1 },
|
|
249
|
+
payment: {
|
|
250
|
+
attemptId,
|
|
251
|
+
txHash: typeof payment?.transaction === "string" ? payment.transaction : "",
|
|
252
|
+
payer: optionalString(payment?.payer), asset: "USDC", amountMinor: toAmountString(payment?.amount),
|
|
253
|
+
chainId: payment && Number.isInteger(payment.chainId) ? payment.chainId : 8453,
|
|
254
|
+
simulated: false, idempotentReplay: extension?.idempotentReplay === true,
|
|
255
|
+
},
|
|
256
|
+
requestFingerprint,
|
|
257
|
+
});
|
|
258
|
+
const out = new Headers(handlerResponse.headers);
|
|
259
|
+
const paymentResponse = response.headers.get(PAYMENT_RESPONSE_HEADER);
|
|
260
|
+
if (paymentResponse)
|
|
261
|
+
out.set(PAYMENT_RESPONSE_HEADER, paymentResponse);
|
|
262
|
+
return new Response(handlerResponse.body, { status: handlerResponse.status, statusText: handlerResponse.statusText, headers: out });
|
|
263
|
+
},
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
async function fingerprintRequest(request) {
|
|
267
|
+
const body = new Uint8Array(await request.clone().arrayBuffer());
|
|
268
|
+
const bodyHash = await sha256(body);
|
|
269
|
+
return sha256(new TextEncoder().encode(`${request.method.toUpperCase()}\n${canonicalRequestUrl(request.url)}\n${bodyHash}`));
|
|
270
|
+
}
|
|
271
|
+
function canonicalRequestUrl(value) {
|
|
272
|
+
const url = new URL(value);
|
|
273
|
+
url.searchParams.delete("gp_attempt");
|
|
274
|
+
url.hash = "";
|
|
275
|
+
return url.toString();
|
|
276
|
+
}
|
|
277
|
+
async function sha256(value) {
|
|
278
|
+
// Copy into an ArrayBuffer because TypeScript's DOM declarations reject a
|
|
279
|
+
// potentially shared ArrayBuffer view even though Web Crypto accepts bytes.
|
|
280
|
+
const bytes = Uint8Array.from(value);
|
|
281
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes.buffer);
|
|
282
|
+
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
283
|
+
}
|
|
284
|
+
async function copyResponse(response) {
|
|
285
|
+
return new Response(await response.arrayBuffer(), { status: response.status, statusText: response.statusText, headers: response.headers });
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=products.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../src/products.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,wEAAwE;AACxE,8EAA8E;AAC9E,8EAA8E;AAC9E,0EAA0E;AAC1E,8EAA8E;AAC9E,2EAA2E;AAC3E,sEAAsE;AAEtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,cAAc,EACd,cAAc,EACd,KAAK,GAEN,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgHtG,MAAM,UAAU,sBAAsB,CACpC,OAA0B;AAC1B;;;;GAIG;AACH,0BAAmE,GAAG,EAAE,GAAE,CAAC;AAC3E,mFAAmF;AACnF,MAAsD,EACtD,cAAuF;IAEvF,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,kBAAkB;gBACxB,SAAS,EAAE,uBAAuB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE;oBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9C,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxD;aACF,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,IAAI,EAAE,mBAAmB,KAAK,EAAE;gBAChC,SAAS,EAAE,sBAAsB;gBACjC,MAAM,EAAE,eAAe;aACxB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,8DAA8D;gBAC9D,kEAAkE;gBAClE,iBAAiB;gBACjB,MAAM,IAAI,qBAAqB,CAC7B,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;YACJ,CAAC;YACD,6EAA6E;YAC7E,OAAO,QAAQ;iBACZ,GAAG,CAAC,QAAQ,CAAC;iBACb,MAAM,CAAC,CAAC,GAAG,EAAkC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC;iBAC7D,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC5E,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,CAAC;QAED,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC3B,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE;gBAClD,SAAS,EAAE,wBAAwB,EAAE,EAAE;gBACvC,MAAM,EAAE,qBAAqB,EAAE,GAAG;gBAClC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;YAChC,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,EAAE;gBAClD,SAAS,EAAE,0BAA0B,EAAE,EAAE;gBACzC,MAAM,EAAE,mBAAmB,EAAE,GAAG;gBAChC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;gBACpC,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;aAClG,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC1B,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,UAAU;gBAC1D,SAAS,EAAE,yBAAyB,EAAE,UAAU;gBAChD,MAAM,EAAE,oBAAoB,EAAE,GAAG;gBACjC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;aACrC,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,yBAAyB,EAAE,UAAU,CAAC,CAAC;QACrE,CAAC;QAED,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACpC,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,EAAE,CAAC,eAAe;gBAC/D,SAAS,EAAE,yBAAyB,EAAE,eAAe;gBACrD,MAAM,EAAE,sCAAsC,EAAE,GAAG;gBACnD,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;gBACpC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACf,MAAM,KAAK,GAAG;oBACZ,CAAC,CAAC,8FAA8F;oBAChG,CAAC,CAAC,SAAS;aAChB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC1E,MAAM,IAAI,qBAAqB,CAC7B,oCAAoC,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAChG,CAAC;YACJ,CAAC;YACD,uBAAuB,CAAC,OAAO,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;YAC3E,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;gBACrB,sEAAsE;gBACtE,4CAA4C;gBAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;aAClC,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC;YACpC,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC;YACpD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;oBACzB,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,QAAQ,CAAC,EAAE;oBACxD,SAAS,EAAE,wBAAwB,QAAQ,EAAE;oBAC7C,MAAM,EAAE,qBAAqB,QAAQ,GAAG;oBACxC,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;iBAC3C,CAAC,CAAC;gBACH,OAAO,cAAc,CAAC,IAAI,EAAE,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,iBAAiB,EAAE,KAAK,IAAI,EAAE;gBAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;oBACzB,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,oBAAoB,kBAAkB,CAAC,QAAQ,CAAC,eAAe;oBACrE,SAAS,EAAE,yBAAyB,QAAQ,eAAe,EAAE,MAAM,EAAE,sCAAsC,QAAQ,GAAG;oBACtH,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;iBAC3C,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ;oBAAE,MAAM,IAAI,qBAAqB,CAAC,2CAA2C,CAAC,CAAC;gBACxJ,uBAAuB,CAAC,OAAO,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;gBAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YACtE,CAAC;YACD,OAAO,EAAE,cAAc;SACxB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAU;IACjC,OAAO,CACL,wCAAwC,EAAE,8BAA8B;QACxE,oDAAoD,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,MAAc;IACvD,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,qBAAqB,CAC7B,GAAG,MAAM,iEAAiE,CAC3E,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,cAAc,CAAC,IAAa,EAAE,SAAiB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,qBAAqB,CAC7B,cAAc,SAAS,yBAAyB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAA4B;IACpD,OAAO;QACL,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;QACtC,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;QAC5C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;QACtC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAU,EAAE,MAAM,CAAC;QAC1D,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1C,QAAQ,EAAE,GAAG,CAAC,QAAQ,KAAK,IAAI;QAC/B,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;QAChD,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC9D,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC;QAChC,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAA4B;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IAClG,CAAC;IACD,IAAI,QAAQ,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAU,EAAE,MAAM,CAAC,EAAE,CAAC;IACzJ,CAAC;IACD,qEAAqE;IACrE,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAK1B;IACC,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,qBAAqB,CAAC,YAAY,KAAK,CAAC,QAAQ,yCAAyC,CAAC,CAAC;YAC3I,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACnE,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,MAAM,IAAI,qBAAqB,CAAC,mDAAmD,CAAC,CAAC;YACzG,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAChE,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,OAAO,GAAmB,IAAI,CAAC;YACnC,IAAI,eAAuB,CAAC;YAE5B,IAAI,SAAS,EAAE,CAAC;gBACd,oEAAoE;gBACpE,qEAAqE;gBACrE,0DAA0D;gBAC1D,eAAe,GAAG,GAAG,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;gBACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;oBAAE,MAAM,IAAI,qBAAqB,CAAC,wBAAwB,CAAC,CAAC;gBAChG,IAAI,GAAG,KAAK,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,aAAa,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC3G,MAAM,IAAI,qBAAqB,CAAC,yEAAyE,CAAC,CAAC;gBAC7G,CAAC;gBACD,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YACjD,CAAC;YAED,MAAM,kBAAkB,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACnD,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;gBAC1C,WAAW,EAAE,eAAe;gBAC5B,MAAM,EAAE,aAAkC;gBAC1C,kBAAkB;gBAClB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAmC,CAAC;YAClG,MAAM,SAAS,GAAG,OAAO,OAAO,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;YAClG,IAAI,CAAC,SAAS;gBAAE,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC9C,yEAAyE;YACzE,2EAA2E;YAC3E,8DAA8D;YAC9D,OAAO,KAAK,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAChD,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE;gBACtE,OAAO,EAAE;oBACP,SAAS;oBACT,MAAM,EAAE,OAAO,OAAO,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;oBAC3E,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC;oBAClG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAiB,CAAC,CAAC,CAAC,IAAI;oBACxF,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,KAAK,IAAI;iBACzE;gBACD,kBAAkB;aACnB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACtE,IAAI,eAAe;gBAAE,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC;YACvE,OAAO,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACtI,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAgB;IAChD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC/H,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAiB;IACrC,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAkB;IAC5C,OAAO,IAAI,QAAQ,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7I,CAAC"}
|
package/dist/resource.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type GenesisPayRequestOptions = {
|
|
2
2
|
/** Defaults to GET. */
|
|
3
3
|
method?: "GET" | "POST" | "PATCH";
|
|
4
4
|
/** Path starting with "/", already percent-encoded. */
|
|
@@ -24,7 +24,7 @@ export type PeerPayRequestOptions = {
|
|
|
24
24
|
action: string;
|
|
25
25
|
};
|
|
26
26
|
/** The client's bound request function, as a resource module sees it. */
|
|
27
|
-
export type
|
|
27
|
+
export type GenesisPayRequest = (options: GenesisPayRequestOptions) => Promise<unknown>;
|
|
28
28
|
/** A non-null, non-array object, or null — the shape a mapper can read fields off. */
|
|
29
29
|
export declare function asRecord(value: unknown): Record<string, unknown> | null;
|
|
30
30
|
export declare function optionalString(value: unknown): string | null;
|
package/dist/resource.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,wBAAwB,GAAG;IACrC,uBAAuB;IACvB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;IACzD;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,sFAAsF;AACtF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAGvE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAErD;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAM9E;AAED,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,QAAQ,EAAE,CAAC,GACV,CAAC,CAIH;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG9C;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIrD;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIlE"}
|
package/dist/resource.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// one HTTP seam and one set of tolerant wire mappers.
|
|
3
3
|
//
|
|
4
4
|
// The seam exists so a resource module never touches `fetch`, the API key or
|
|
5
|
-
// the base URL — the client owns those and hands down a bound `
|
|
5
|
+
// the base URL — the client owns those and hands down a bound `GenesisPayRequest`.
|
|
6
6
|
// That keeps the error mapping in exactly one place (`throwForErrorResponse`,
|
|
7
7
|
// see ./errors.ts): a resource that built its own request could quietly grow a
|
|
8
8
|
// second, divergent notion of what a 422 means.
|
package/dist/resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks.d.ts
CHANGED
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
* the server grows a type this list does not have.
|
|
6
6
|
*
|
|
7
7
|
* Exported as a runtime array (not only as a type) so a handler can ask
|
|
8
|
-
* `
|
|
8
|
+
* `isKnownGenesisPayEventType(event.type)` before it decides what to do.
|
|
9
9
|
*/
|
|
10
|
-
export declare const
|
|
10
|
+
export declare const GENESISPAY_EVENT_TYPES: readonly ["payment.confirmed", "link.paid", "product.purchased", "agent_payment.pending_approval", "agent_payment.settled", "mandate.active", "mandate.charged", "mandate.charge_failed", "mandate.revoked", "subscription.renewed", "subscription.past_due"];
|
|
11
11
|
/** Union of the event types this SDK version knows. */
|
|
12
|
-
export type
|
|
12
|
+
export type GenesisPayEventType = (typeof GENESISPAY_EVENT_TYPES)[number];
|
|
13
13
|
/** True when `type` is an event type this SDK version knows about. */
|
|
14
|
-
export declare function
|
|
14
|
+
export declare function isKnownGenesisPayEventType(type: string): type is GenesisPayEventType;
|
|
15
15
|
/** Shared envelope; `type`/`data` are pinned per event by the union below. */
|
|
16
|
-
type
|
|
16
|
+
type GenesisPayEventEnvelope<TType extends string, TData> = {
|
|
17
17
|
/** Stable across delivery retries — the idempotency key to dedupe on. */
|
|
18
18
|
id: string;
|
|
19
19
|
type: TType;
|
|
@@ -25,7 +25,7 @@ type PeerPayEventEnvelope<TType extends string, TData> = {
|
|
|
25
25
|
* `PaymentWebhookEventPayload`; amounts stay strings (minor units are `bigint`
|
|
26
26
|
* on the server and would lose precision as a JSON number).
|
|
27
27
|
*/
|
|
28
|
-
export type
|
|
28
|
+
export type GenesisPayPaymentEventData = {
|
|
29
29
|
link: {
|
|
30
30
|
publicId: string;
|
|
31
31
|
title: string;
|
|
@@ -135,7 +135,7 @@ export type PeerPayPaymentEventData = {
|
|
|
135
135
|
occurredAt: string;
|
|
136
136
|
};
|
|
137
137
|
/** `data` of the mandate/subscription events; mirrors `buildMandateWebhookPayload`. */
|
|
138
|
-
export type
|
|
138
|
+
export type GenesisPayMandateEventData = {
|
|
139
139
|
mandate: {
|
|
140
140
|
id: string;
|
|
141
141
|
kind: string;
|
|
@@ -189,19 +189,19 @@ export type PeerPayMandateEventData = {
|
|
|
189
189
|
} | null;
|
|
190
190
|
occurredAt: string;
|
|
191
191
|
};
|
|
192
|
-
export type
|
|
193
|
-
export type
|
|
192
|
+
export type GenesisPayPaymentEvent = GenesisPayEventEnvelope<"payment.confirmed" | "link.paid", GenesisPayPaymentEventData>;
|
|
193
|
+
export type GenesisPayMandateEvent = GenesisPayEventEnvelope<"mandate.active" | "mandate.charged" | "mandate.charge_failed" | "mandate.revoked" | "subscription.renewed" | "subscription.past_due", GenesisPayMandateEventData>;
|
|
194
194
|
/**
|
|
195
195
|
* Agent-payment events are reserved on the server but have no emitter yet, so
|
|
196
196
|
* their payload is deliberately left open rather than invented here.
|
|
197
197
|
*/
|
|
198
|
-
export type
|
|
198
|
+
export type GenesisPayAgentPaymentEvent = GenesisPayEventEnvelope<"agent_payment.pending_approval" | "agent_payment.settled", Record<string, unknown>>;
|
|
199
199
|
/**
|
|
200
200
|
* An event type this SDK version does not know — a newer server talking to an
|
|
201
201
|
* older SDK. It is a *valid* event: `constructEvent` verifies and returns it
|
|
202
|
-
* like any other (see `
|
|
202
|
+
* like any other (see `GenesisPayAnyEvent`), it never throws on the type.
|
|
203
203
|
*/
|
|
204
|
-
export type
|
|
204
|
+
export type GenesisPayUnknownEvent = GenesisPayEventEnvelope<string, Record<string, unknown>>;
|
|
205
205
|
/**
|
|
206
206
|
* Verified webhook delivery, discriminated on `type`:
|
|
207
207
|
*
|
|
@@ -216,26 +216,26 @@ export type PeerPayUnknownEvent = PeerPayEventEnvelope<string, Record<string, un
|
|
|
216
216
|
* one member with a plain `string` type and `event.type === "payment.confirmed"`
|
|
217
217
|
* stops narrowing `data` for all the others too — the exact regression R1 sets
|
|
218
218
|
* out to fix. Forward compatibility therefore lives at runtime (an unknown type
|
|
219
|
-
* is verified and returned, never rejected) plus in `
|
|
220
|
-
* `
|
|
219
|
+
* is verified and returned, never rejected) plus in `GenesisPayAnyEvent` /
|
|
220
|
+
* `GenesisPayUnknownEvent` for handlers that want to model the open world:
|
|
221
221
|
*
|
|
222
222
|
* ```ts
|
|
223
|
-
* const any:
|
|
224
|
-
* if (!
|
|
223
|
+
* const any: GenesisPayAnyEvent = event; // widens, no cast needed
|
|
224
|
+
* if (!isKnownGenesisPayEventType(any.type)) return new Response("ok"); // ack & ignore
|
|
225
225
|
* ```
|
|
226
226
|
*/
|
|
227
|
-
export type
|
|
227
|
+
export type GenesisPayEvent = GenesisPayPaymentEvent | GenesisPayMandateEvent | GenesisPayAgentPaymentEvent;
|
|
228
228
|
/**
|
|
229
229
|
* Open-world view of a delivery: every known event widens to it, and it is the
|
|
230
230
|
* honest type for an event whose `type` this SDK version does not know.
|
|
231
231
|
*/
|
|
232
|
-
export type
|
|
232
|
+
export type GenesisPayAnyEvent = GenesisPayEvent | GenesisPayUnknownEvent;
|
|
233
233
|
/**
|
|
234
234
|
* Thrown for every rejection path: malformed/missing header, missing `t`/`v1`,
|
|
235
235
|
* timestamp outside the tolerance window, signature mismatch, non-JSON body.
|
|
236
236
|
* Messages never contain the secret or the expected signature.
|
|
237
237
|
*/
|
|
238
|
-
export declare class
|
|
238
|
+
export declare class GenesisPaySignatureVerificationError extends Error {
|
|
239
239
|
constructor(message: string);
|
|
240
240
|
}
|
|
241
241
|
export type ConstructEventOptions = {
|
|
@@ -255,23 +255,23 @@ export type ConstructEventOptions = {
|
|
|
255
255
|
* delivery is verified and returned unchanged, so a server that adds a new
|
|
256
256
|
* event type can never turn a customer's webhook route into a 400. Only the
|
|
257
257
|
* signature and the envelope (`id`, `type`, `createdAt`, object `data`) can
|
|
258
|
-
* reject a delivery. Widen to `
|
|
259
|
-
* `
|
|
258
|
+
* reject a delivery. Widen to `GenesisPayAnyEvent` and use
|
|
259
|
+
* `isKnownGenesisPayEventType()` if you want to handle that case explicitly.
|
|
260
260
|
*
|
|
261
|
-
* @throws {
|
|
261
|
+
* @throws {GenesisPaySignatureVerificationError} on any verification failure.
|
|
262
262
|
*
|
|
263
263
|
* @example
|
|
264
264
|
* ```ts
|
|
265
265
|
* const event = await constructEvent(
|
|
266
266
|
* await request.text(),
|
|
267
|
-
* request.headers.get("
|
|
268
|
-
* process.env.
|
|
267
|
+
* request.headers.get("genesispay-signature") ?? "",
|
|
268
|
+
* process.env.GENESISPAY_WEBHOOK_SECRET!,
|
|
269
269
|
* );
|
|
270
270
|
* if (event.type === "payment.confirmed") {
|
|
271
271
|
* fulfil(event.data.link.clientReferenceId, event.data.attempt.txHash);
|
|
272
272
|
* }
|
|
273
273
|
* ```
|
|
274
274
|
*/
|
|
275
|
-
export declare function constructEvent(rawBody: string | Uint8Array, signatureHeader: string, secret: string, opts?: ConstructEventOptions): Promise<
|
|
275
|
+
export declare function constructEvent(rawBody: string | Uint8Array, signatureHeader: string, secret: string, opts?: ConstructEventOptions): Promise<GenesisPayEvent>;
|
|
276
276
|
export {};
|
|
277
277
|
//# sourceMappingURL=webhooks.d.ts.map
|
package/dist/webhooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|