@xapps-platform/backend-kit 0.1.1

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.
Files changed (142) hide show
  1. package/README.md +196 -0
  2. package/dist/backend/modes/gateway-managed/payment.d.ts +23 -0
  3. package/dist/backend/modes/gateway-managed/payment.d.ts.map +1 -0
  4. package/dist/backend/modes/gateway-managed/payment.js +49 -0
  5. package/dist/backend/modes/gateway-managed/payment.js.map +7 -0
  6. package/dist/backend/modes/gateway-managed/paymentSession.d.ts +4 -0
  7. package/dist/backend/modes/gateway-managed/paymentSession.d.ts.map +1 -0
  8. package/dist/backend/modes/gateway-managed/paymentSession.js +16 -0
  9. package/dist/backend/modes/gateway-managed/paymentSession.js.map +7 -0
  10. package/dist/backend/modes/gateway-managed/policy.d.ts +68 -0
  11. package/dist/backend/modes/gateway-managed/policy.d.ts.map +1 -0
  12. package/dist/backend/modes/gateway-managed/policy.js +53 -0
  13. package/dist/backend/modes/gateway-managed/policy.js.map +7 -0
  14. package/dist/backend/modes/gateway-managed/policyContext.d.ts +5 -0
  15. package/dist/backend/modes/gateway-managed/policyContext.d.ts.map +1 -0
  16. package/dist/backend/modes/gateway-managed/policyContext.js +22 -0
  17. package/dist/backend/modes/gateway-managed/policyContext.js.map +7 -0
  18. package/dist/backend/modes/index.d.ts +72 -0
  19. package/dist/backend/modes/index.d.ts.map +1 -0
  20. package/dist/backend/modes/index.js +159 -0
  21. package/dist/backend/modes/index.js.map +7 -0
  22. package/dist/backend/modes/owner-managed/payment.d.ts +34 -0
  23. package/dist/backend/modes/owner-managed/payment.d.ts.map +1 -0
  24. package/dist/backend/modes/owner-managed/payment.js +75 -0
  25. package/dist/backend/modes/owner-managed/payment.js.map +7 -0
  26. package/dist/backend/modes/owner-managed/paymentAssets.d.ts +4 -0
  27. package/dist/backend/modes/owner-managed/paymentAssets.d.ts.map +1 -0
  28. package/dist/backend/modes/owner-managed/paymentAssets.js +11 -0
  29. package/dist/backend/modes/owner-managed/paymentAssets.js.map +7 -0
  30. package/dist/backend/modes/owner-managed/paymentPageApi.d.ts +4 -0
  31. package/dist/backend/modes/owner-managed/paymentPageApi.d.ts.map +1 -0
  32. package/dist/backend/modes/owner-managed/paymentPageApi.js +11 -0
  33. package/dist/backend/modes/owner-managed/paymentPageApi.js.map +7 -0
  34. package/dist/backend/modes/owner-managed/paymentSession.d.ts +4 -0
  35. package/dist/backend/modes/owner-managed/paymentSession.d.ts.map +1 -0
  36. package/dist/backend/modes/owner-managed/paymentSession.js +18 -0
  37. package/dist/backend/modes/owner-managed/paymentSession.js.map +7 -0
  38. package/dist/backend/modes/owner-managed/policy.d.ts +68 -0
  39. package/dist/backend/modes/owner-managed/policy.d.ts.map +1 -0
  40. package/dist/backend/modes/owner-managed/policy.js +53 -0
  41. package/dist/backend/modes/owner-managed/policy.js.map +7 -0
  42. package/dist/backend/modes/owner-managed/policyContext.d.ts +5 -0
  43. package/dist/backend/modes/owner-managed/policyContext.d.ts.map +1 -0
  44. package/dist/backend/modes/owner-managed/policyContext.js +26 -0
  45. package/dist/backend/modes/owner-managed/policyContext.js.map +7 -0
  46. package/dist/backend/modes/publisher-delegated/payment.d.ts +23 -0
  47. package/dist/backend/modes/publisher-delegated/payment.d.ts.map +1 -0
  48. package/dist/backend/modes/publisher-delegated/payment.js +50 -0
  49. package/dist/backend/modes/publisher-delegated/payment.js.map +7 -0
  50. package/dist/backend/modes/publisher-delegated/paymentSession.d.ts +4 -0
  51. package/dist/backend/modes/publisher-delegated/paymentSession.d.ts.map +1 -0
  52. package/dist/backend/modes/publisher-delegated/paymentSession.js +16 -0
  53. package/dist/backend/modes/publisher-delegated/paymentSession.js.map +7 -0
  54. package/dist/backend/modes/publisher-delegated/policy.d.ts +68 -0
  55. package/dist/backend/modes/publisher-delegated/policy.d.ts.map +1 -0
  56. package/dist/backend/modes/publisher-delegated/policy.js +53 -0
  57. package/dist/backend/modes/publisher-delegated/policy.js.map +7 -0
  58. package/dist/backend/modes/publisher-delegated/policyContext.d.ts +5 -0
  59. package/dist/backend/modes/publisher-delegated/policyContext.d.ts.map +1 -0
  60. package/dist/backend/modes/publisher-delegated/policyContext.js +22 -0
  61. package/dist/backend/modes/publisher-delegated/policyContext.js.map +7 -0
  62. package/dist/backend/modes/tenant-delegated/payment.d.ts +23 -0
  63. package/dist/backend/modes/tenant-delegated/payment.d.ts.map +1 -0
  64. package/dist/backend/modes/tenant-delegated/payment.js +50 -0
  65. package/dist/backend/modes/tenant-delegated/payment.js.map +7 -0
  66. package/dist/backend/modes/tenant-delegated/paymentSession.d.ts +4 -0
  67. package/dist/backend/modes/tenant-delegated/paymentSession.d.ts.map +1 -0
  68. package/dist/backend/modes/tenant-delegated/paymentSession.js +16 -0
  69. package/dist/backend/modes/tenant-delegated/paymentSession.js.map +7 -0
  70. package/dist/backend/modes/tenant-delegated/policy.d.ts +68 -0
  71. package/dist/backend/modes/tenant-delegated/policy.d.ts.map +1 -0
  72. package/dist/backend/modes/tenant-delegated/policy.js +53 -0
  73. package/dist/backend/modes/tenant-delegated/policy.js.map +7 -0
  74. package/dist/backend/modes/tenant-delegated/policyContext.d.ts +5 -0
  75. package/dist/backend/modes/tenant-delegated/policyContext.d.ts.map +1 -0
  76. package/dist/backend/modes/tenant-delegated/policyContext.js +22 -0
  77. package/dist/backend/modes/tenant-delegated/policyContext.js.map +7 -0
  78. package/dist/backend/modules.d.ts +33 -0
  79. package/dist/backend/modules.d.ts.map +1 -0
  80. package/dist/backend/modules.js +100 -0
  81. package/dist/backend/modules.js.map +7 -0
  82. package/dist/backend/options.d.ts +78 -0
  83. package/dist/backend/options.d.ts.map +1 -0
  84. package/dist/backend/options.js +153 -0
  85. package/dist/backend/options.js.map +7 -0
  86. package/dist/backend/paymentRuntime.d.ts +31 -0
  87. package/dist/backend/paymentRuntime.d.ts.map +1 -0
  88. package/dist/backend/paymentRuntime.js +231 -0
  89. package/dist/backend/paymentRuntime.js.map +7 -0
  90. package/dist/backend/policies/common.d.ts +102 -0
  91. package/dist/backend/policies/common.d.ts.map +1 -0
  92. package/dist/backend/policies/common.js +226 -0
  93. package/dist/backend/policies/common.js.map +7 -0
  94. package/dist/backend/routes/gateway/guard.d.ts +7 -0
  95. package/dist/backend/routes/gateway/guard.d.ts.map +1 -0
  96. package/dist/backend/routes/gateway/guard.js +89 -0
  97. package/dist/backend/routes/gateway/guard.js.map +7 -0
  98. package/dist/backend/routes/gateway/hostApi.d.ts +8 -0
  99. package/dist/backend/routes/gateway/hostApi.d.ts.map +1 -0
  100. package/dist/backend/routes/gateway/hostApi.js +45 -0
  101. package/dist/backend/routes/gateway/hostApi.js.map +7 -0
  102. package/dist/backend/routes/gateway/hostApiBridge.d.ts +5 -0
  103. package/dist/backend/routes/gateway/hostApiBridge.d.ts.map +1 -0
  104. package/dist/backend/routes/gateway/hostApiBridge.js +61 -0
  105. package/dist/backend/routes/gateway/hostApiBridge.js.map +7 -0
  106. package/dist/backend/routes/gateway/hostApiCore.d.ts +5 -0
  107. package/dist/backend/routes/gateway/hostApiCore.d.ts.map +1 -0
  108. package/dist/backend/routes/gateway/hostApiCore.js +95 -0
  109. package/dist/backend/routes/gateway/hostApiCore.js.map +7 -0
  110. package/dist/backend/routes/gateway/hostApiLifecycle.d.ts +5 -0
  111. package/dist/backend/routes/gateway/hostApiLifecycle.d.ts.map +1 -0
  112. package/dist/backend/routes/gateway/hostApiLifecycle.js +80 -0
  113. package/dist/backend/routes/gateway/hostApiLifecycle.js.map +7 -0
  114. package/dist/backend/routes/gateway/hostContractBoundary.d.ts +25 -0
  115. package/dist/backend/routes/gateway/hostContractBoundary.d.ts.map +1 -0
  116. package/dist/backend/routes/gateway/hostContractBoundary.js +43 -0
  117. package/dist/backend/routes/gateway/hostContractBoundary.js.map +7 -0
  118. package/dist/backend/routes/gateway/payment.d.ts +4 -0
  119. package/dist/backend/routes/gateway/payment.d.ts.map +1 -0
  120. package/dist/backend/routes/gateway/payment.js +10 -0
  121. package/dist/backend/routes/gateway/payment.js.map +7 -0
  122. package/dist/backend/routes/gateway/shared.d.ts +36 -0
  123. package/dist/backend/routes/gateway/shared.d.ts.map +1 -0
  124. package/dist/backend/routes/gateway/shared.js +208 -0
  125. package/dist/backend/routes/gateway/shared.js.map +7 -0
  126. package/dist/backend/routes/gateway/subjectProfiles.d.ts +2 -0
  127. package/dist/backend/routes/gateway/subjectProfiles.d.ts.map +1 -0
  128. package/dist/backend/routes/gateway/subjectProfiles.js +150 -0
  129. package/dist/backend/routes/gateway/subjectProfiles.js.map +7 -0
  130. package/dist/backend/routes/health.d.ts +2 -0
  131. package/dist/backend/routes/health.d.ts.map +1 -0
  132. package/dist/backend/routes/health.js +20 -0
  133. package/dist/backend/routes/health.js.map +7 -0
  134. package/dist/backend/routes/reference.d.ts +2 -0
  135. package/dist/backend/routes/reference.d.ts.map +1 -0
  136. package/dist/backend/routes/reference.js +414 -0
  137. package/dist/backend/routes/reference.js.map +7 -0
  138. package/dist/index.d.ts +10 -0
  139. package/dist/index.d.ts.map +1 -0
  140. package/dist/index.js +81 -0
  141. package/dist/index.js.map +7 -0
  142. package/package.json +42 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/backend/paymentRuntime.ts"],
4
+ "sourcesContent": ["// @ts-nocheck\nimport fs from \"node:fs\";\nimport {\n buildHostedGatewayPaymentUrlFromGuardContext,\n createPaymentHandlerAsync,\n extractHostedPaymentSessionId,\n} from \"@xapps/server-sdk\";\nimport { normalizeOwnerIssuer, readRecord, readString } from \"./options.js\";\n\nfunction mapHostedSessionResult(input = {}) {\n return {\n ...(input?.redirectUrl ? { redirect_url: input.redirectUrl } : {}),\n ...(input?.flow ? { flow: input.flow } : {}),\n ...(input?.paymentSessionId ? { payment_session_id: input.paymentSessionId } : {}),\n ...(input?.clientSettleUrl ? { client_settle_url: input.clientSettleUrl } : {}),\n ...(input?.providerReference !== undefined\n ? { provider_reference: input.providerReference }\n : {}),\n ...(input?.scheme ? { scheme: input.scheme } : {}),\n ...(input?.metadata ? { metadata: input.metadata } : {}),\n };\n}\n\nfunction readPaymentRequestParams(source = {}) {\n const input = readRecord(source);\n return {\n paymentSessionId: readString(input.payment_session_id, input.paymentSessionId).trim(),\n returnUrl: readString(input.return_url, input.returnUrl).trim(),\n cancelUrl: readString(input.cancel_url, input.cancelUrl).trim(),\n xappsResume: readString(input.xapps_resume, input.xappsResume).trim(),\n };\n}\n\nfunction readClientSettleInput(source = {}) {\n const input = readRecord(source);\n const status = readString(input.status).trim();\n return {\n ...readPaymentRequestParams(input),\n status: status === \"failed\" || status === \"cancelled\" ? status : \"paid\",\n clientToken: readString(input.client_token, input.clientToken).trim() || undefined,\n metadata:\n input.metadata && typeof input.metadata === \"object\" && !Array.isArray(input.metadata)\n ? input.metadata\n : undefined,\n };\n}\n\nfunction sendGatewayUnavailable(reply, message, statusCode = 500) {\n return reply.code(statusCode).send({ message });\n}\n\nexport async function createPaymentRuntime(options = {}, deps = {}) {\n const createPaymentHandler =\n typeof deps.createPaymentHandler === \"function\"\n ? deps.createPaymentHandler\n : createPaymentEvidenceHandler;\n const createGatewayClient =\n typeof deps.createGatewayClient === \"function\" ? deps.createGatewayClient : null;\n\n const resolvedGatewayClient =\n options?.overrides?.gatewayClient ||\n (createGatewayClient\n ? createGatewayClient({\n baseUrl: options?.gateway?.baseUrl,\n apiKey: options?.gateway?.apiKey,\n })\n : null);\n const resolvedPaymentHandler =\n options?.overrides?.paymentHandler ||\n (await createPaymentHandler({\n payments: options?.payments || {},\n gatewayClient: resolvedGatewayClient,\n }));\n\n return {\n gatewayClient: resolvedGatewayClient,\n paymentHandler: resolvedPaymentHandler,\n paymentSettings: {\n ownerIssuer: normalizeOwnerIssuer(options?.payments?.ownerIssuer),\n paymentUrl: options?.payments?.paymentUrl,\n returnSecret: options?.payments?.returnSecret,\n returnSecretRef: options?.payments?.returnSecretRef,\n returnUrlAllowlist: options?.payments?.returnUrlAllowlist,\n },\n paymentPageFile: options?.assets?.paymentPage?.filePath || \"\",\n resolvePolicyRequest: options?.overrides?.resolvePolicyRequest || null,\n };\n}\n\nexport async function createPaymentEvidenceHandler({\n payments = {},\n gatewayClient = null,\n issuer = \"\",\n resolvePlatformSecretRef,\n} = {}) {\n const paymentSettings = readRecord(payments);\n return createPaymentHandlerAsync({\n secret: readString(paymentSettings.returnSecret).trim() || undefined,\n secretRef: readString(paymentSettings.returnSecretRef).trim() || undefined,\n secretRefResolverOptions: {\n resolvePlatformSecretRef: async (input) => resolvePlatformSecretRef(input),\n },\n issuer:\n normalizeOwnerIssuer(readString(issuer).trim() || readString(paymentSettings.ownerIssuer)) ||\n \"tenant\",\n returnUrlAllowlist: readString(paymentSettings.returnUrlAllowlist),\n gatewayClient: gatewayClient || undefined,\n requirePersistentStoreInProduction: false,\n });\n}\n\nexport async function buildHostedGatewayPaymentUrl(input = {}, runtime = {}) {\n const payloadInput = readRecord(input);\n const paymentRuntime = readRecord(runtime);\n const paymentSettings = readRecord(paymentRuntime.paymentSettings);\n const ownerIssuer = normalizeOwnerIssuer(paymentSettings.ownerIssuer);\n const gatewayClient = paymentRuntime.gatewayClient || null;\n const paymentHandler = paymentRuntime.paymentHandler || null;\n if (!gatewayClient) {\n throw new Error(\"gateway payment session client not configured\");\n }\n if (!paymentHandler || typeof paymentHandler.upsertSession !== \"function\") {\n throw new Error(\"payment evidence handler not configured\");\n }\n\n const result = await buildHostedGatewayPaymentUrlFromGuardContext({\n deps: {\n createPaymentSession: (payload) => gatewayClient.createPaymentSession(payload),\n upsertSession: (payload) => paymentHandler.upsertSession(payload),\n },\n payload: payloadInput.payload,\n context: payloadInput.context,\n guard: payloadInput.guard,\n guardConfig: payloadInput.guardConfig,\n amount: payloadInput.amount,\n currency: payloadInput.currency,\n defaultPaymentUrl: readString(paymentSettings.paymentUrl),\n fallbackIssuer: readString(payloadInput.fallbackIssuer, ownerIssuer) || ownerIssuer,\n storedIssuer:\n readString(payloadInput.storedIssuer, readString(payloadInput.fallbackIssuer, ownerIssuer)) ||\n ownerIssuer,\n defaultSecret: readString(paymentSettings.returnSecret),\n defaultSecretRef: readString(paymentSettings.returnSecretRef),\n allowDefaultSecretFallback: Boolean(payloadInput.allowDefaultSecretFallback),\n });\n return result.paymentUrl;\n}\n\nexport async function buildModeHostedGatewayPaymentUrl(input = {}, defaults = {}, runtime = {}) {\n const payloadInput = readRecord(input);\n const modeDefaults = readRecord(defaults);\n const paymentRuntime = readRecord(runtime);\n const paymentSettings = readRecord(paymentRuntime.paymentSettings);\n const ownerIssuer = normalizeOwnerIssuer(paymentSettings.ownerIssuer);\n return buildHostedGatewayPaymentUrl(\n {\n ...payloadInput,\n fallbackIssuer:\n readString(\n modeDefaults.fallbackIssuer,\n readString(payloadInput.fallbackIssuer, ownerIssuer),\n ) || ownerIssuer,\n storedIssuer:\n readString(\n modeDefaults.storedIssuer,\n readString(\n payloadInput.storedIssuer,\n readString(\n modeDefaults.fallbackIssuer,\n readString(payloadInput.fallbackIssuer, ownerIssuer),\n ),\n ),\n ) || ownerIssuer,\n allowDefaultSecretFallback: Boolean(\n modeDefaults.allowDefaultSecretFallback ?? payloadInput.allowDefaultSecretFallback,\n ),\n },\n runtime,\n );\n}\n\nexport async function registerPaymentPageAssetRoute(\n fastify,\n { pagePath = \"/tenant-payment.html\", pageFile = \"\" } = {},\n) {\n fastify.get(pagePath, async (_request, reply) => {\n const html = fs.readFileSync(pageFile, \"utf8\");\n return reply.code(200).type(\"text/html; charset=utf-8\").send(html);\n });\n}\n\nexport async function registerPaymentPageApiRoutes(\n fastify,\n { gatewayClient = null, pathPrefix = \"/api/tenant-payment\" } = {},\n) {\n fastify.get(`${pathPrefix}/session`, async (request, reply) => {\n const { paymentSessionId, returnUrl, cancelUrl, xappsResume } = readPaymentRequestParams(\n request.query,\n );\n if (!gatewayClient || typeof gatewayClient.getGatewayPaymentSession !== \"function\") {\n return sendGatewayUnavailable(reply, \"gateway payment client is not configured\");\n }\n if (!paymentSessionId) {\n return reply.code(400).send({ message: \"payment_session_id is required\" });\n }\n const hosted = await gatewayClient.getGatewayPaymentSession({\n paymentSessionId,\n ...(returnUrl ? { returnUrl } : {}),\n ...(cancelUrl ? { cancelUrl } : {}),\n ...(xappsResume ? { xappsResume } : {}),\n });\n return reply.code(200).send({ status: \"success\", result: hosted.session });\n });\n\n fastify.post(`${pathPrefix}/complete`, async (request, reply) => {\n const { paymentSessionId, returnUrl, cancelUrl, xappsResume } = readPaymentRequestParams(\n request.body,\n );\n if (!gatewayClient || typeof gatewayClient.completeGatewayPayment !== \"function\") {\n return sendGatewayUnavailable(reply, \"gateway payment client is not configured\");\n }\n if (!paymentSessionId) {\n return reply.code(400).send({ message: \"payment_session_id is required\" });\n }\n const hosted = await gatewayClient.completeGatewayPayment({\n paymentSessionId,\n ...(returnUrl ? { returnUrl } : {}),\n ...(cancelUrl ? { cancelUrl } : {}),\n ...(xappsResume ? { xappsResume } : {}),\n });\n return reply.code(200).send({ status: \"success\", result: mapHostedSessionResult(hosted) });\n });\n\n fastify.post(`${pathPrefix}/client-settle`, async (request, reply) => {\n const { paymentSessionId, returnUrl, xappsResume, status, clientToken, metadata } =\n readClientSettleInput(request.body);\n if (!paymentSessionId) {\n return reply.code(400).send({ message: \"payment_session_id is required\" });\n }\n if (!gatewayClient || typeof gatewayClient.clientSettleGatewayPayment !== \"function\") {\n return sendGatewayUnavailable(\n reply,\n \"client-settle is not available for this payment mode\",\n 409,\n );\n }\n try {\n const settled = await gatewayClient.clientSettleGatewayPayment({\n paymentSessionId,\n returnUrl: returnUrl || undefined,\n xappsResume: xappsResume || undefined,\n status,\n clientToken,\n metadata,\n });\n return reply.code(200).send({ status: \"success\", result: mapHostedSessionResult(settled) });\n } catch (err) {\n request.log.error(\n { err: err instanceof Error ? err.message : String(err) },\n \"client-settle failed\",\n );\n return reply.code(502).send({ message: \"client_settle_failed\" });\n }\n });\n}\n\nexport { extractHostedPaymentSessionId };\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,102 @@
1
+ export declare function hasUpstreamPaymentVerified(value: any): boolean;
2
+ export declare function resolveMergedContext(payloadInput: any): Record<string, unknown>;
3
+ export declare function resolvePriceAmount(guardConfig: any, context: any): unknown;
4
+ export declare function buildPaymentAction(action: any): import("@xapps/server-sdk").PaymentGuardAction;
5
+ export declare function normalizeAllowedIssuers(guardConfig: any, fallbackIssuer: any): string[];
6
+ export declare function buildPaymentPolicyAllowedResult(input: any, modeMeta?: {}): {
7
+ allowed: boolean;
8
+ reason: string;
9
+ message: string;
10
+ details: {
11
+ reference_mode?: any;
12
+ payment_status: any;
13
+ orchestrationApproved: any;
14
+ gatewayPaymentVerified: any;
15
+ paidByGatewayHint: boolean;
16
+ paidByPlainStatusFallback: boolean;
17
+ paidByVerifiedEvidence: any;
18
+ verified_contract: any;
19
+ payment_mode: any;
20
+ };
21
+ };
22
+ export declare function buildPaymentGuardFailClosedResult(upstreamStatus: any): {
23
+ allowed: boolean;
24
+ reason: string;
25
+ message: string;
26
+ action: {
27
+ kind: string;
28
+ label: string;
29
+ title: string;
30
+ };
31
+ details: {
32
+ uiRequired: boolean;
33
+ orchestration: {
34
+ mode: string;
35
+ surface: string;
36
+ status: string;
37
+ };
38
+ upstream_status: number;
39
+ };
40
+ };
41
+ export declare function buildPaymentPolicyBlockedResult(input: any, { buildPaymentUrl, extractHostedPaymentSessionId, modeMeta }: {
42
+ buildPaymentUrl: any;
43
+ extractHostedPaymentSessionId: any;
44
+ modeMeta?: {};
45
+ }): Promise<{
46
+ allowed: boolean;
47
+ reason: any;
48
+ message: any;
49
+ action: import("@xapps/server-sdk").PaymentGuardAction;
50
+ details: {
51
+ verification_failure?: any;
52
+ uiRequired: boolean;
53
+ orchestration: {
54
+ reference_mode?: any;
55
+ mode: string;
56
+ surface: string;
57
+ status: string;
58
+ payment_session_id: any;
59
+ payment_mode: any;
60
+ };
61
+ payment_status: any;
62
+ expected_amount: any;
63
+ expected_currency: any;
64
+ };
65
+ }>;
66
+ export declare function buildPaymentPolicyInput({ payloadInput, log, resolveAllowedIssuers, resolveExpectedPaymentIssuer, paymentHandler, paymentRuntime, paymentSettings, guardSlugDefault, }: {
67
+ payloadInput: any;
68
+ log: any;
69
+ resolveAllowedIssuers: any;
70
+ resolveExpectedPaymentIssuer: any;
71
+ paymentHandler: any;
72
+ paymentRuntime?: {};
73
+ paymentSettings?: {};
74
+ guardSlugDefault?: string;
75
+ }): Promise<{
76
+ payload: any;
77
+ context: Record<string, unknown>;
78
+ guard: any;
79
+ guardConfig: any;
80
+ policy: any;
81
+ amount: unknown;
82
+ currency: string;
83
+ plainStatus: string;
84
+ orchestrationApproved: boolean;
85
+ gatewayPaymentVerified: boolean;
86
+ verifiedPayment: any;
87
+ paidByVerifiedEvidence: boolean;
88
+ verificationFailure: any;
89
+ failReason: any;
90
+ baseMessage: string;
91
+ actionCfg: any;
92
+ }>;
93
+ export declare function resolvePolicyRequestCommon({ payloadInput, log, resolveAllowedIssuers, resolveExpectedPaymentIssuer, resolveModeResult, paymentRuntime, guardSlugDefault, }: {
94
+ payloadInput: any;
95
+ log: any;
96
+ resolveAllowedIssuers: any;
97
+ resolveExpectedPaymentIssuer: any;
98
+ resolveModeResult: any;
99
+ paymentRuntime?: {};
100
+ guardSlugDefault: any;
101
+ }): Promise<any>;
102
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/backend/policies/common.ts"],"names":[],"mappings":"AAqBA,wBAAgB,0BAA0B,CAAC,KAAK,KAAA,WAE/C;AAED,wBAAgB,oBAAoB,CAAC,YAAY,KAAA,2BAEhD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,KAAA,EAAE,OAAO,KAAA,WAEtD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,KAAA,kDAExC;AAED,wBAAgB,uBAAuB,CAAC,WAAW,KAAA,EAAE,cAAc,KAAA,YAElE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,KAAA,EAAE,QAAQ,KAAK;;;;;;;;;;;;;;;EAiBnE;AAED,wBAAgB,iCAAiC,CAAC,cAAc,KAAA;;;;;;;;;;;;;;;;;;EAoB/D;AAED,wBAAsB,+BAA+B,CACnD,KAAK,KAAA,EACL,EAAE,eAAe,EAAE,6BAA6B,EAAE,QAAa,EAAE;;;;CAAA;;;;;;;;;;;;;;;;;;;;GAgClE;AAED,wBAAsB,uBAAuB,CAAC,EAC5C,YAAY,EACZ,GAAG,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,cAAc,EACd,cAAmB,EACnB,eAAoB,EACpB,gBAA0C,GAC3C;;;;;;;;;CAAA;;;;;;;;;;;;;;;;;GAsHA;AAED,wBAAsB,0BAA0B,CAAC,EAC/C,YAAY,EACZ,GAAG,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,iBAAiB,EACjB,cAAmB,EACnB,gBAAgB,GACjB;;;;;;;;CAAA,gBAYA"}
@@ -0,0 +1,226 @@
1
+ import {
2
+ buildPaymentGuardAction,
3
+ hasUpstreamPaymentVerified as hasUpstreamPaymentVerifiedFromSdk,
4
+ normalizePaymentAllowedIssuers as normalizePaymentAllowedIssuersFromSdk,
5
+ resolveMergedPaymentGuardContext,
6
+ resolvePaymentGuardPriceAmount
7
+ } from "@xapps/server-sdk";
8
+ function asObject(value) {
9
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
10
+ }
11
+ function toNumericAmount(amount) {
12
+ if (typeof amount === "number") return amount;
13
+ if (typeof amount === "string" && amount.trim() && Number.isFinite(Number(amount))) {
14
+ return Number(amount);
15
+ }
16
+ return amount;
17
+ }
18
+ function hasUpstreamPaymentVerified(value) {
19
+ return hasUpstreamPaymentVerifiedFromSdk(value);
20
+ }
21
+ function resolveMergedContext(payloadInput) {
22
+ return resolveMergedPaymentGuardContext(asObject(payloadInput));
23
+ }
24
+ function resolvePriceAmount(guardConfig, context) {
25
+ return resolvePaymentGuardPriceAmount(asObject(guardConfig), asObject(context));
26
+ }
27
+ function buildPaymentAction(action) {
28
+ return buildPaymentGuardAction(asObject(action));
29
+ }
30
+ function normalizeAllowedIssuers(guardConfig, fallbackIssuer) {
31
+ return normalizePaymentAllowedIssuersFromSdk(asObject(guardConfig), String(fallbackIssuer || ""));
32
+ }
33
+ function buildPaymentPolicyAllowedResult(input, modeMeta = {}) {
34
+ return {
35
+ allowed: true,
36
+ reason: String(input.policy?.reason || "tenant_payment_passed"),
37
+ message: "Tenant payment policy satisfied",
38
+ details: {
39
+ payment_status: input.verifiedPayment?.status || input.plainStatus || "paid",
40
+ orchestrationApproved: input.orchestrationApproved,
41
+ gatewayPaymentVerified: input.gatewayPaymentVerified,
42
+ paidByGatewayHint: false,
43
+ paidByPlainStatusFallback: false,
44
+ paidByVerifiedEvidence: input.paidByVerifiedEvidence,
45
+ verified_contract: input.verifiedPayment?.contract || null,
46
+ payment_mode: modeMeta.paymentMode || null,
47
+ ...modeMeta.referenceMode ? { reference_mode: modeMeta.referenceMode } : {}
48
+ }
49
+ };
50
+ }
51
+ function buildPaymentGuardFailClosedResult(upstreamStatus) {
52
+ return {
53
+ allowed: false,
54
+ reason: "payment_session_create_failed",
55
+ message: "Payment session could not be created at this time",
56
+ action: {
57
+ kind: "complete_payment",
58
+ label: "Open Payment",
59
+ title: "Complete Payment"
60
+ },
61
+ details: {
62
+ uiRequired: true,
63
+ orchestration: {
64
+ mode: "blocking",
65
+ surface: "redirect",
66
+ status: "failed_dependency"
67
+ },
68
+ upstream_status: Number(upstreamStatus || 500) || 500
69
+ }
70
+ };
71
+ }
72
+ async function buildPaymentPolicyBlockedResult(input, { buildPaymentUrl, extractHostedPaymentSessionId, modeMeta = {} }) {
73
+ const paymentUrl = await buildPaymentUrl(input);
74
+ return {
75
+ allowed: false,
76
+ reason: input.failReason,
77
+ message: input.verificationFailure?.ok === false ? "Payment verification failed" : input.baseMessage,
78
+ action: buildPaymentAction({
79
+ url: paymentUrl,
80
+ label: input.actionCfg?.label,
81
+ title: input.actionCfg?.title,
82
+ target: input.actionCfg?.target
83
+ }),
84
+ details: {
85
+ uiRequired: true,
86
+ orchestration: {
87
+ mode: "blocking",
88
+ surface: String(input.guardConfig?.ui_mode || "redirect"),
89
+ status: "pending_user_action",
90
+ payment_session_id: extractHostedPaymentSessionId(paymentUrl),
91
+ payment_mode: modeMeta.paymentMode || null,
92
+ ...modeMeta.referenceMode ? { reference_mode: modeMeta.referenceMode } : {}
93
+ },
94
+ payment_status: input.plainStatus || null,
95
+ expected_amount: toNumericAmount(input.amount),
96
+ expected_currency: input.currency,
97
+ ...input.verificationFailure?.ok === false ? { verification_failure: input.verificationFailure } : {}
98
+ }
99
+ };
100
+ }
101
+ async function buildPaymentPolicyInput({
102
+ payloadInput,
103
+ log,
104
+ resolveAllowedIssuers,
105
+ resolveExpectedPaymentIssuer,
106
+ paymentHandler,
107
+ paymentRuntime = {},
108
+ paymentSettings = {},
109
+ guardSlugDefault = "tenant-payment-policy"
110
+ }) {
111
+ const payload = payloadInput && typeof payloadInput === "object" ? payloadInput : {};
112
+ const context = resolveMergedContext(payload);
113
+ const policyContext = asObject(payload.policyContext);
114
+ const payloadWithContext = { ...payload, context };
115
+ const guard = payload.guard && typeof payload.guard === "object" ? payload.guard : {};
116
+ const guardConfig = guard.config && typeof guard.config === "object" ? guard.config : {};
117
+ const policy = guardConfig.policy && typeof guardConfig.policy === "object" ? guardConfig.policy : {};
118
+ const actionCfg = guardConfig.action && typeof guardConfig.action === "object" ? guardConfig.action : {};
119
+ const guardSlug = String(guard.slug || guardSlugDefault).trim();
120
+ const orchestration = context.orchestration && typeof context.orchestration === "object" ? context.orchestration : {};
121
+ const orchestrationEntry = orchestration[guardSlug] && typeof orchestration[guardSlug] === "object" ? orchestration[guardSlug] : {};
122
+ const orchestrationPayment = orchestrationEntry.payment && typeof orchestrationEntry.payment === "object" ? orchestrationEntry.payment : null;
123
+ const allowOrchestrationBypassConfigured = Boolean(
124
+ guardConfig.allow_orchestration_bypass ?? guardConfig.allowOrchestrationBypass
125
+ );
126
+ if (allowOrchestrationBypassConfigured) {
127
+ log.warn("Ignoring allow_orchestration_bypass in canonical payment verification mode.");
128
+ }
129
+ const orchestrationApproved = false;
130
+ const amount = resolvePriceAmount(guardConfig, context);
131
+ const currency = String(guardConfig?.pricing?.currency || guardConfig.currency || "USD").trim().toUpperCase();
132
+ const settings = asObject(paymentSettings);
133
+ const allowedIssuers = resolveAllowedIssuers(guardConfig, settings, paymentRuntime);
134
+ const expectedIssuer = allowedIssuers[0] || resolveExpectedPaymentIssuer(guardConfig, settings, paymentRuntime);
135
+ const plainStatus = String(payload.payment_status || payload?.payment?.status || "").trim().toLowerCase();
136
+ const gatewayPaymentVerified = hasUpstreamPaymentVerified(payload.payment_verified) || hasUpstreamPaymentVerified(payload.paymentVerified) || hasUpstreamPaymentVerified(policyContext.payment_verified) || hasUpstreamPaymentVerified(policyContext.paymentVerified);
137
+ let verifiedPayment = null;
138
+ let verificationFailure = null;
139
+ const hasVerificationSecret = String(settings.returnSecret || "").trim().length > 0 || String(settings.returnSecretRef || "").trim().length > 0 || Boolean(paymentHandler && typeof paymentHandler.handleVerifyEvidence === "function");
140
+ if (gatewayPaymentVerified && orchestrationPayment && String(orchestrationPayment.status || "").trim().toLowerCase() === "paid") {
141
+ verifiedPayment = orchestrationPayment;
142
+ } else if (hasVerificationSecret && paymentHandler?.handleVerifyEvidence) {
143
+ const verificationPayload = orchestrationPayment ? { ...payloadWithContext, ...orchestrationPayment || {} } : payloadWithContext;
144
+ const verifyResult = await paymentHandler.handleVerifyEvidence({
145
+ payload: verificationPayload,
146
+ maxAgeSeconds: Number(guardConfig.payment_return_max_age_s || 900) || 900,
147
+ expected: {
148
+ issuer: expectedIssuer,
149
+ issuers: allowedIssuers,
150
+ amount,
151
+ currency,
152
+ xapp_id: String(context.xappId || context.xapp_id || "") || void 0,
153
+ tool_name: String(context.toolName || context.tool_name || "") || void 0,
154
+ subject_id: String(context.subjectId || context.subject_id || "") || void 0,
155
+ installation_id: String(context.installationId || context.installation_id || "") || void 0,
156
+ client_id: String(context.clientId || context.client_id || "") || void 0
157
+ }
158
+ });
159
+ if (verifyResult.ok) {
160
+ verifiedPayment = verifyResult.evidence;
161
+ } else if (verifyResult.reason !== "payment_evidence_not_found") {
162
+ verificationFailure = verifyResult;
163
+ }
164
+ }
165
+ const paidByVerifiedEvidence = Boolean(verifiedPayment);
166
+ if (!hasVerificationSecret) {
167
+ log.warn(
168
+ "Payment guard verification secret/secret_ref is not configured; canonical mode is fail-closed."
169
+ );
170
+ }
171
+ const baseReason = String(policy.reason || "payment_required").trim() || "payment_required";
172
+ const baseMessage = String(policy.message || "Payment is required before continuing.").trim();
173
+ const failReason = verificationFailure?.ok === false ? verificationFailure.reason : baseReason;
174
+ return {
175
+ payload: payloadWithContext,
176
+ context,
177
+ guard,
178
+ guardConfig,
179
+ policy,
180
+ amount,
181
+ currency,
182
+ plainStatus,
183
+ orchestrationApproved,
184
+ gatewayPaymentVerified,
185
+ verifiedPayment,
186
+ paidByVerifiedEvidence,
187
+ verificationFailure,
188
+ failReason,
189
+ baseMessage,
190
+ actionCfg
191
+ };
192
+ }
193
+ async function resolvePolicyRequestCommon({
194
+ payloadInput,
195
+ log,
196
+ resolveAllowedIssuers,
197
+ resolveExpectedPaymentIssuer,
198
+ resolveModeResult,
199
+ paymentRuntime = {},
200
+ guardSlugDefault
201
+ }) {
202
+ const input = await buildPaymentPolicyInput({
203
+ payloadInput,
204
+ log,
205
+ resolveAllowedIssuers,
206
+ resolveExpectedPaymentIssuer,
207
+ paymentHandler: paymentRuntime.paymentHandler,
208
+ paymentRuntime,
209
+ paymentSettings: paymentRuntime.paymentSettings,
210
+ guardSlugDefault
211
+ });
212
+ return resolveModeResult(input, paymentRuntime);
213
+ }
214
+ export {
215
+ buildPaymentAction,
216
+ buildPaymentGuardFailClosedResult,
217
+ buildPaymentPolicyAllowedResult,
218
+ buildPaymentPolicyBlockedResult,
219
+ buildPaymentPolicyInput,
220
+ hasUpstreamPaymentVerified,
221
+ normalizeAllowedIssuers,
222
+ resolveMergedContext,
223
+ resolvePolicyRequestCommon,
224
+ resolvePriceAmount
225
+ };
226
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/backend/policies/common.ts"],
4
+ "sourcesContent": ["// @ts-nocheck\nimport {\n buildPaymentGuardAction,\n hasUpstreamPaymentVerified as hasUpstreamPaymentVerifiedFromSdk,\n normalizePaymentAllowedIssuers as normalizePaymentAllowedIssuersFromSdk,\n resolveMergedPaymentGuardContext,\n resolvePaymentGuardPriceAmount,\n} from \"@xapps/server-sdk\";\n\nfunction asObject(value) {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value : {};\n}\n\nfunction toNumericAmount(amount) {\n if (typeof amount === \"number\") return amount;\n if (typeof amount === \"string\" && amount.trim() && Number.isFinite(Number(amount))) {\n return Number(amount);\n }\n return amount;\n}\n\nexport function hasUpstreamPaymentVerified(value) {\n return hasUpstreamPaymentVerifiedFromSdk(value);\n}\n\nexport function resolveMergedContext(payloadInput) {\n return resolveMergedPaymentGuardContext(asObject(payloadInput));\n}\n\nexport function resolvePriceAmount(guardConfig, context) {\n return resolvePaymentGuardPriceAmount(asObject(guardConfig), asObject(context));\n}\n\nexport function buildPaymentAction(action) {\n return buildPaymentGuardAction(asObject(action));\n}\n\nexport function normalizeAllowedIssuers(guardConfig, fallbackIssuer) {\n return normalizePaymentAllowedIssuersFromSdk(asObject(guardConfig), String(fallbackIssuer || \"\"));\n}\n\nexport function buildPaymentPolicyAllowedResult(input, modeMeta = {}) {\n return {\n allowed: true,\n reason: String(input.policy?.reason || \"tenant_payment_passed\"),\n message: \"Tenant payment policy satisfied\",\n details: {\n payment_status: input.verifiedPayment?.status || input.plainStatus || \"paid\",\n orchestrationApproved: input.orchestrationApproved,\n gatewayPaymentVerified: input.gatewayPaymentVerified,\n paidByGatewayHint: false,\n paidByPlainStatusFallback: false,\n paidByVerifiedEvidence: input.paidByVerifiedEvidence,\n verified_contract: input.verifiedPayment?.contract || null,\n payment_mode: modeMeta.paymentMode || null,\n ...(modeMeta.referenceMode ? { reference_mode: modeMeta.referenceMode } : {}),\n },\n };\n}\n\nexport function buildPaymentGuardFailClosedResult(upstreamStatus) {\n return {\n allowed: false,\n reason: \"payment_session_create_failed\",\n message: \"Payment session could not be created at this time\",\n action: {\n kind: \"complete_payment\",\n label: \"Open Payment\",\n title: \"Complete Payment\",\n },\n details: {\n uiRequired: true,\n orchestration: {\n mode: \"blocking\",\n surface: \"redirect\",\n status: \"failed_dependency\",\n },\n upstream_status: Number(upstreamStatus || 500) || 500,\n },\n };\n}\n\nexport async function buildPaymentPolicyBlockedResult(\n input,\n { buildPaymentUrl, extractHostedPaymentSessionId, modeMeta = {} },\n) {\n const paymentUrl = await buildPaymentUrl(input);\n return {\n allowed: false,\n reason: input.failReason,\n message:\n input.verificationFailure?.ok === false ? \"Payment verification failed\" : input.baseMessage,\n action: buildPaymentAction({\n url: paymentUrl,\n label: input.actionCfg?.label,\n title: input.actionCfg?.title,\n target: input.actionCfg?.target,\n }),\n details: {\n uiRequired: true,\n orchestration: {\n mode: \"blocking\",\n surface: String(input.guardConfig?.ui_mode || \"redirect\"),\n status: \"pending_user_action\",\n payment_session_id: extractHostedPaymentSessionId(paymentUrl),\n payment_mode: modeMeta.paymentMode || null,\n ...(modeMeta.referenceMode ? { reference_mode: modeMeta.referenceMode } : {}),\n },\n payment_status: input.plainStatus || null,\n expected_amount: toNumericAmount(input.amount),\n expected_currency: input.currency,\n ...(input.verificationFailure?.ok === false\n ? { verification_failure: input.verificationFailure }\n : {}),\n },\n };\n}\n\nexport async function buildPaymentPolicyInput({\n payloadInput,\n log,\n resolveAllowedIssuers,\n resolveExpectedPaymentIssuer,\n paymentHandler,\n paymentRuntime = {},\n paymentSettings = {},\n guardSlugDefault = \"tenant-payment-policy\",\n}) {\n const payload = payloadInput && typeof payloadInput === \"object\" ? payloadInput : {};\n const context = resolveMergedContext(payload);\n const policyContext = asObject(payload.policyContext);\n const payloadWithContext = { ...payload, context };\n const guard = payload.guard && typeof payload.guard === \"object\" ? payload.guard : {};\n const guardConfig = guard.config && typeof guard.config === \"object\" ? guard.config : {};\n const policy =\n guardConfig.policy && typeof guardConfig.policy === \"object\" ? guardConfig.policy : {};\n const actionCfg =\n guardConfig.action && typeof guardConfig.action === \"object\" ? guardConfig.action : {};\n const guardSlug = String(guard.slug || guardSlugDefault).trim();\n const orchestration =\n context.orchestration && typeof context.orchestration === \"object\" ? context.orchestration : {};\n const orchestrationEntry =\n orchestration[guardSlug] && typeof orchestration[guardSlug] === \"object\"\n ? orchestration[guardSlug]\n : {};\n const orchestrationPayment =\n orchestrationEntry.payment && typeof orchestrationEntry.payment === \"object\"\n ? orchestrationEntry.payment\n : null;\n\n const allowOrchestrationBypassConfigured = Boolean(\n guardConfig.allow_orchestration_bypass ?? guardConfig.allowOrchestrationBypass,\n );\n if (allowOrchestrationBypassConfigured) {\n log.warn(\"Ignoring allow_orchestration_bypass in canonical payment verification mode.\");\n }\n const orchestrationApproved = false;\n\n const amount = resolvePriceAmount(guardConfig, context);\n const currency = String(guardConfig?.pricing?.currency || guardConfig.currency || \"USD\")\n .trim()\n .toUpperCase();\n const settings = asObject(paymentSettings);\n const allowedIssuers = resolveAllowedIssuers(guardConfig, settings, paymentRuntime);\n const expectedIssuer =\n allowedIssuers[0] || resolveExpectedPaymentIssuer(guardConfig, settings, paymentRuntime);\n const plainStatus = String(payload.payment_status || payload?.payment?.status || \"\")\n .trim()\n .toLowerCase();\n const gatewayPaymentVerified =\n hasUpstreamPaymentVerified(payload.payment_verified) ||\n hasUpstreamPaymentVerified(payload.paymentVerified) ||\n hasUpstreamPaymentVerified(policyContext.payment_verified) ||\n hasUpstreamPaymentVerified(policyContext.paymentVerified);\n let verifiedPayment = null;\n let verificationFailure = null;\n\n const hasVerificationSecret =\n String(settings.returnSecret || \"\").trim().length > 0 ||\n String(settings.returnSecretRef || \"\").trim().length > 0 ||\n Boolean(paymentHandler && typeof paymentHandler.handleVerifyEvidence === \"function\");\n\n if (\n gatewayPaymentVerified &&\n orchestrationPayment &&\n String(orchestrationPayment.status || \"\")\n .trim()\n .toLowerCase() === \"paid\"\n ) {\n verifiedPayment = orchestrationPayment;\n } else if (hasVerificationSecret && paymentHandler?.handleVerifyEvidence) {\n const verificationPayload = orchestrationPayment\n ? { ...payloadWithContext, ...(orchestrationPayment || {}) }\n : payloadWithContext;\n const verifyResult = await paymentHandler.handleVerifyEvidence({\n payload: verificationPayload,\n maxAgeSeconds: Number(guardConfig.payment_return_max_age_s || 900) || 900,\n expected: {\n issuer: expectedIssuer,\n issuers: allowedIssuers,\n amount,\n currency,\n xapp_id: String(context.xappId || context.xapp_id || \"\") || undefined,\n tool_name: String(context.toolName || context.tool_name || \"\") || undefined,\n subject_id: String(context.subjectId || context.subject_id || \"\") || undefined,\n installation_id:\n String(context.installationId || context.installation_id || \"\") || undefined,\n client_id: String(context.clientId || context.client_id || \"\") || undefined,\n },\n });\n if (verifyResult.ok) {\n verifiedPayment = verifyResult.evidence;\n } else if (verifyResult.reason !== \"payment_evidence_not_found\") {\n verificationFailure = verifyResult;\n }\n }\n\n const paidByVerifiedEvidence = Boolean(verifiedPayment);\n if (!hasVerificationSecret) {\n log.warn(\n \"Payment guard verification secret/secret_ref is not configured; canonical mode is fail-closed.\",\n );\n }\n\n const baseReason = String(policy.reason || \"payment_required\").trim() || \"payment_required\";\n const baseMessage = String(policy.message || \"Payment is required before continuing.\").trim();\n const failReason = verificationFailure?.ok === false ? verificationFailure.reason : baseReason;\n return {\n payload: payloadWithContext,\n context,\n guard,\n guardConfig,\n policy,\n amount,\n currency,\n plainStatus,\n orchestrationApproved,\n gatewayPaymentVerified,\n verifiedPayment,\n paidByVerifiedEvidence,\n verificationFailure,\n failReason,\n baseMessage,\n actionCfg,\n };\n}\n\nexport async function resolvePolicyRequestCommon({\n payloadInput,\n log,\n resolveAllowedIssuers,\n resolveExpectedPaymentIssuer,\n resolveModeResult,\n paymentRuntime = {},\n guardSlugDefault,\n}) {\n const input = await buildPaymentPolicyInput({\n payloadInput,\n log,\n resolveAllowedIssuers,\n resolveExpectedPaymentIssuer,\n paymentHandler: paymentRuntime.paymentHandler,\n paymentRuntime,\n paymentSettings: paymentRuntime.paymentSettings,\n guardSlugDefault,\n });\n return resolveModeResult(input, paymentRuntime);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ export default function guardRoutes(fastify: any, { enabledModes, paymentRuntime, guardApiKey, guardToolName, logScope, }?: {
2
+ paymentRuntime?: {};
3
+ guardApiKey?: string;
4
+ guardToolName?: string;
5
+ logScope?: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../../src/backend/routes/gateway/guard.ts"],"names":[],"mappings":"AAoCA,wBAA8B,WAAW,CACvC,OAAO,KAAA,EACP,EACE,YAAY,EACZ,cAAmB,EACnB,WAAgB,EAChB,aAAgD,EAChD,QAAmB,GACpB;;;;;CAAK,iBAkDP"}
@@ -0,0 +1,89 @@
1
+ import { resolveBackendPaymentPolicy } from "../../modes/index.js";
2
+ function buildPaymentGuardFailClosedResult(upstreamStatus) {
3
+ return {
4
+ allowed: false,
5
+ reason: "payment_session_create_failed",
6
+ message: "Payment session could not be created at this time",
7
+ action: {
8
+ kind: "complete_payment",
9
+ label: "Open Payment",
10
+ title: "Complete Payment"
11
+ },
12
+ details: {
13
+ uiRequired: true,
14
+ orchestration: {
15
+ mode: "blocking",
16
+ surface: "redirect",
17
+ status: "failed_dependency"
18
+ },
19
+ upstream_status: Number(upstreamStatus || 500) || 500
20
+ }
21
+ };
22
+ }
23
+ function requireGuardApiKey(request, reply, guardApiKey) {
24
+ const key = String(
25
+ request.headers["x-api-key"] || request.headers["x-xconect-guard-api-key"] || ""
26
+ ).trim();
27
+ if (!key || key !== String(guardApiKey || "").trim()) {
28
+ reply.code(401).send({ status: "error", result: { message: "Invalid API key" } });
29
+ return false;
30
+ }
31
+ return true;
32
+ }
33
+ async function guardRoutes(fastify, {
34
+ enabledModes,
35
+ paymentRuntime = {},
36
+ guardApiKey = "",
37
+ guardToolName = "evaluate_tenant_payment_policy",
38
+ logScope = "tenant"
39
+ } = {}) {
40
+ fastify.post("/xapps/requests", async (request, reply) => {
41
+ if (!requireGuardApiKey(request, reply, guardApiKey)) return;
42
+ const body = request.body && typeof request.body === "object" ? request.body : {};
43
+ const requestId = String(body.requestId || body.request_id || "").trim();
44
+ const toolName = String(body.toolName || body.tool_name || "").trim();
45
+ const payload = body.payload && typeof body.payload === "object" ? body.payload : {};
46
+ if (!requestId || !toolName) {
47
+ return reply.code(400).send({
48
+ status: "error",
49
+ result: { message: "requestId and toolName are required" }
50
+ });
51
+ }
52
+ if (toolName !== guardToolName) {
53
+ return reply.code(400).send({
54
+ status: "error",
55
+ result: { message: `Unsupported tool: ${toolName}` }
56
+ });
57
+ }
58
+ try {
59
+ const result = typeof paymentRuntime.resolvePolicyRequest === "function" ? await paymentRuntime.resolvePolicyRequest(payload, {
60
+ log: fastify.log,
61
+ enabledModes
62
+ }) : await resolveBackendPaymentPolicy(payload, {
63
+ log: fastify.log,
64
+ enabledModes,
65
+ paymentRuntime
66
+ });
67
+ return reply.send({ status: "success", result });
68
+ } catch (err) {
69
+ const status = Number(err?.status || err?.statusCode || 500) || 500;
70
+ fastify.log.error(
71
+ {
72
+ err,
73
+ requestId,
74
+ toolName,
75
+ status
76
+ },
77
+ `${logScope} guard evaluation failed; returning fail-closed block`
78
+ );
79
+ return reply.send({
80
+ status: "success",
81
+ result: buildPaymentGuardFailClosedResult(status)
82
+ });
83
+ }
84
+ });
85
+ }
86
+ export {
87
+ guardRoutes as default
88
+ };
89
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/routes/gateway/guard.ts"],
4
+ "sourcesContent": ["// @ts-nocheck\nimport { resolveBackendPaymentPolicy } from \"../../modes/index.js\";\n\nfunction buildPaymentGuardFailClosedResult(upstreamStatus) {\n return {\n allowed: false,\n reason: \"payment_session_create_failed\",\n message: \"Payment session could not be created at this time\",\n action: {\n kind: \"complete_payment\",\n label: \"Open Payment\",\n title: \"Complete Payment\",\n },\n details: {\n uiRequired: true,\n orchestration: {\n mode: \"blocking\",\n surface: \"redirect\",\n status: \"failed_dependency\",\n },\n upstream_status: Number(upstreamStatus || 500) || 500,\n },\n };\n}\n\nfunction requireGuardApiKey(request, reply, guardApiKey) {\n const key = String(\n request.headers[\"x-api-key\"] || request.headers[\"x-xconect-guard-api-key\"] || \"\",\n ).trim();\n if (!key || key !== String(guardApiKey || \"\").trim()) {\n reply.code(401).send({ status: \"error\", result: { message: \"Invalid API key\" } });\n return false;\n }\n return true;\n}\n\nexport default async function guardRoutes(\n fastify,\n {\n enabledModes,\n paymentRuntime = {},\n guardApiKey = \"\",\n guardToolName = \"evaluate_tenant_payment_policy\",\n logScope = \"tenant\",\n } = {},\n) {\n fastify.post(\"/xapps/requests\", async (request, reply) => {\n if (!requireGuardApiKey(request, reply, guardApiKey)) return;\n const body = request.body && typeof request.body === \"object\" ? request.body : {};\n const requestId = String(body.requestId || body.request_id || \"\").trim();\n const toolName = String(body.toolName || body.tool_name || \"\").trim();\n const payload = body.payload && typeof body.payload === \"object\" ? body.payload : {};\n if (!requestId || !toolName) {\n return reply.code(400).send({\n status: \"error\",\n result: { message: \"requestId and toolName are required\" },\n });\n }\n if (toolName !== guardToolName) {\n return reply.code(400).send({\n status: \"error\",\n result: { message: `Unsupported tool: ${toolName}` },\n });\n }\n try {\n const result =\n typeof paymentRuntime.resolvePolicyRequest === \"function\"\n ? await paymentRuntime.resolvePolicyRequest(payload, {\n log: fastify.log,\n enabledModes,\n })\n : await resolveBackendPaymentPolicy(payload, {\n log: fastify.log,\n enabledModes,\n paymentRuntime,\n });\n return reply.send({ status: \"success\", result });\n } catch (err) {\n const status = Number(err?.status || err?.statusCode || 500) || 500;\n fastify.log.error(\n {\n err,\n requestId,\n toolName,\n status,\n },\n `${logScope} guard evaluation failed; returning fail-closed block`,\n );\n return reply.send({\n status: \"success\",\n result: buildPaymentGuardFailClosedResult(status),\n });\n }\n });\n}\n"],
5
+ "mappings": "AACA,SAAS,mCAAmC;AAE5C,SAAS,kCAAkC,gBAAgB;AACzD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,MACP,YAAY;AAAA,MACZ,eAAe;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB,OAAO,kBAAkB,GAAG,KAAK;AAAA,IACpD;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,SAAS,OAAO,aAAa;AACvD,QAAM,MAAM;AAAA,IACV,QAAQ,QAAQ,WAAW,KAAK,QAAQ,QAAQ,yBAAyB,KAAK;AAAA,EAChF,EAAE,KAAK;AACP,MAAI,CAAC,OAAO,QAAQ,OAAO,eAAe,EAAE,EAAE,KAAK,GAAG;AACpD,UAAM,KAAK,GAAG,EAAE,KAAK,EAAE,QAAQ,SAAS,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;AAChF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAO,YACL,SACA;AAAA,EACE;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,WAAW;AACb,IAAI,CAAC,GACL;AACA,UAAQ,KAAK,mBAAmB,OAAO,SAAS,UAAU;AACxD,QAAI,CAAC,mBAAmB,SAAS,OAAO,WAAW,EAAG;AACtD,UAAM,OAAO,QAAQ,QAAQ,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,CAAC;AAChF,UAAM,YAAY,OAAO,KAAK,aAAa,KAAK,cAAc,EAAE,EAAE,KAAK;AACvE,UAAM,WAAW,OAAO,KAAK,YAAY,KAAK,aAAa,EAAE,EAAE,KAAK;AACpE,UAAM,UAAU,KAAK,WAAW,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,CAAC;AACnF,QAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,aAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,QAC1B,QAAQ;AAAA,QACR,QAAQ,EAAE,SAAS,sCAAsC;AAAA,MAC3D,CAAC;AAAA,IACH;AACA,QAAI,aAAa,eAAe;AAC9B,aAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAAA,QAC1B,QAAQ;AAAA,QACR,QAAQ,EAAE,SAAS,qBAAqB,QAAQ,GAAG;AAAA,MACrD,CAAC;AAAA,IACH;AACA,QAAI;AACF,YAAM,SACJ,OAAO,eAAe,yBAAyB,aAC3C,MAAM,eAAe,qBAAqB,SAAS;AAAA,QACjD,KAAK,QAAQ;AAAA,QACb;AAAA,MACF,CAAC,IACD,MAAM,4BAA4B,SAAS;AAAA,QACzC,KAAK,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,MACF,CAAC;AACP,aAAO,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAAA,IACjD,SAAS,KAAK;AACZ,YAAM,SAAS,OAAO,KAAK,UAAU,KAAK,cAAc,GAAG,KAAK;AAChE,cAAQ,IAAI;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,GAAG,QAAQ;AAAA,MACb;AACA,aAAO,MAAM,KAAK;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQ,kCAAkC,MAAM;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,8 @@
1
+ export default function hostGatewayApiRoutes(fastify: any, { enableLifecycle, enableBridge, hostProxyService, allowedOrigins, bootstrap, }?: {
2
+ enableLifecycle?: boolean;
3
+ enableBridge?: boolean;
4
+ hostProxyService?: any;
5
+ allowedOrigins?: any[];
6
+ bootstrap?: {};
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=hostApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostApi.d.ts","sourceRoot":"","sources":["../../../../src/backend/routes/gateway/hostApi.ts"],"names":[],"mappings":"AAMA,wBAA8B,oBAAoB,CAChD,OAAO,KAAA,EACP,EACE,eAAsB,EACtB,YAAmB,EACnB,gBAAuB,EACvB,cAAmB,EACnB,SAAc,GACf;;;;;;CAAK,iBAkCP"}
@@ -0,0 +1,45 @@
1
+ import hostApiBridgeRoutes from "./hostApiBridge.js";
2
+ import hostApiCoreRoutes from "./hostApiCore.js";
3
+ import hostApiLifecycleRoutes from "./hostApiLifecycle.js";
4
+ import { sendHostApiPreflight } from "./shared.js";
5
+ async function hostGatewayApiRoutes(fastify, {
6
+ enableLifecycle = true,
7
+ enableBridge = true,
8
+ hostProxyService = null,
9
+ allowedOrigins = [],
10
+ bootstrap = {}
11
+ } = {}) {
12
+ const preflightPaths = [
13
+ "/api/host-config",
14
+ "/api/resolve-subject",
15
+ "/api/create-catalog-session",
16
+ "/api/create-widget-session"
17
+ ];
18
+ if (enableLifecycle) {
19
+ preflightPaths.push("/api/installations", "/api/install", "/api/update", "/api/uninstall");
20
+ }
21
+ if (enableBridge) {
22
+ preflightPaths.push(
23
+ "/api/bridge/token-refresh",
24
+ "/api/bridge/sign",
25
+ "/api/bridge/vendor-assertion"
26
+ );
27
+ }
28
+ for (const path of preflightPaths) {
29
+ fastify.options(
30
+ path,
31
+ async (request, reply) => sendHostApiPreflight(request, reply, allowedOrigins)
32
+ );
33
+ }
34
+ await fastify.register(hostApiCoreRoutes, { hostProxyService, allowedOrigins, bootstrap });
35
+ if (enableLifecycle) {
36
+ await fastify.register(hostApiLifecycleRoutes, { hostProxyService, allowedOrigins, bootstrap });
37
+ }
38
+ if (enableBridge) {
39
+ await fastify.register(hostApiBridgeRoutes, { hostProxyService, allowedOrigins, bootstrap });
40
+ }
41
+ }
42
+ export {
43
+ hostGatewayApiRoutes as default
44
+ };
45
+ //# sourceMappingURL=hostApi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/backend/routes/gateway/hostApi.ts"],
4
+ "sourcesContent": ["// @ts-nocheck\nimport hostApiBridgeRoutes from \"./hostApiBridge.js\";\nimport hostApiCoreRoutes from \"./hostApiCore.js\";\nimport hostApiLifecycleRoutes from \"./hostApiLifecycle.js\";\nimport { sendHostApiPreflight } from \"./shared.js\";\n\nexport default async function hostGatewayApiRoutes(\n fastify,\n {\n enableLifecycle = true,\n enableBridge = true,\n hostProxyService = null,\n allowedOrigins = [],\n bootstrap = {},\n } = {},\n) {\n const preflightPaths = [\n \"/api/host-config\",\n \"/api/resolve-subject\",\n \"/api/create-catalog-session\",\n \"/api/create-widget-session\",\n ];\n if (enableLifecycle) {\n preflightPaths.push(\"/api/installations\", \"/api/install\", \"/api/update\", \"/api/uninstall\");\n }\n if (enableBridge) {\n preflightPaths.push(\n \"/api/bridge/token-refresh\",\n \"/api/bridge/sign\",\n \"/api/bridge/vendor-assertion\",\n );\n }\n\n for (const path of preflightPaths) {\n fastify.options(path, async (request, reply) =>\n sendHostApiPreflight(request, reply, allowedOrigins),\n );\n }\n\n await fastify.register(hostApiCoreRoutes, { hostProxyService, allowedOrigins, bootstrap });\n\n if (enableLifecycle) {\n await fastify.register(hostApiLifecycleRoutes, { hostProxyService, allowedOrigins, bootstrap });\n }\n\n if (enableBridge) {\n await fastify.register(hostApiBridgeRoutes, { hostProxyService, allowedOrigins, bootstrap });\n }\n}\n"],
5
+ "mappings": "AACA,OAAO,yBAAyB;AAChC,OAAO,uBAAuB;AAC9B,OAAO,4BAA4B;AACnC,SAAS,4BAA4B;AAErC,eAAO,qBACL,SACA;AAAA,EACE,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB,CAAC;AAAA,EAClB,YAAY,CAAC;AACf,IAAI,CAAC,GACL;AACA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,iBAAiB;AACnB,mBAAe,KAAK,sBAAsB,gBAAgB,eAAe,gBAAgB;AAAA,EAC3F;AACA,MAAI,cAAc;AAChB,mBAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,gBAAgB;AACjC,YAAQ;AAAA,MAAQ;AAAA,MAAM,OAAO,SAAS,UACpC,qBAAqB,SAAS,OAAO,cAAc;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,mBAAmB,EAAE,kBAAkB,gBAAgB,UAAU,CAAC;AAEzF,MAAI,iBAAiB;AACnB,UAAM,QAAQ,SAAS,wBAAwB,EAAE,kBAAkB,gBAAgB,UAAU,CAAC;AAAA,EAChG;AAEA,MAAI,cAAc;AAChB,UAAM,QAAQ,SAAS,qBAAqB,EAAE,kBAAkB,gBAAgB,UAAU,CAAC;AAAA,EAC7F;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,5 @@
1
+ export default function hostApiBridgeRoutes(fastify: any, { hostProxyService, allowedOrigins, bootstrap }?: {
2
+ allowedOrigins?: any[];
3
+ bootstrap?: {};
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=hostApiBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostApiBridge.d.ts","sourceRoot":"","sources":["../../../../src/backend/routes/gateway/hostApiBridge.ts"],"names":[],"mappings":"AAcA,wBAA8B,mBAAmB,CAC/C,OAAO,KAAA,EACP,EAAE,gBAAgB,EAAE,cAAmB,EAAE,SAAc,EAAE;;;CAAK,iBAkD/D"}