tapimo 0.11.0 → 0.13.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/dist/App.d.ts +6396 -4575
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +39 -4
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +15 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +7 -0
- package/dist/Assets.js.map +1 -1
- package/dist/Scope.d.ts +2 -0
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +17 -0
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +176 -78
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +84 -4
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +54 -0
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +123 -9
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +60 -7
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +4 -2
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +90 -90
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.js +71 -71
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/apps/Zones.d.ts +16 -16
- package/dist/apps/Zones.js +4 -4
- package/dist/apps/data/App.d.ts +1699 -749
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +58 -9
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +62 -0
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
- package/dist/apps/data/ZoneSelection.js +44 -0
- package/dist/apps/data/ZoneSelection.js.map +1 -0
- package/dist/apps/data/routes/activities.d.ts +2417 -50
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +1896 -1293
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +471 -340
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +12 -12
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +44 -17
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +42 -42
- package/dist/apps/data/routes/blocks.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.js +22 -12
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +179 -179
- package/dist/apps/data/routes/earn.d.ts +144 -19
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +160 -28
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +719 -13
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +16 -13
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +2 -2
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +9 -11
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/indexer.d.ts +34 -34
- package/dist/apps/data/routes/receipts.d.ts +363 -263
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +29 -11
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.js +24 -10
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +13 -13
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +16 -15
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +112 -98
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +85 -35
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +7 -2
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +38 -18
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +1 -1
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +25 -21
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +1 -1
- package/dist/apps/data/routes/valuation.d.ts.map +1 -1
- package/dist/apps/data/routes/valuation.js +12 -7
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts +3 -3
- package/dist/apps/data/routes/webhooks.d.ts +15 -15
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +2 -2
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +32 -32
- package/dist/apps/data/routes/zones.js +1 -1
- package/dist/apps/funding/App.d.ts +38 -27
- package/dist/apps/funding/App.d.ts.map +1 -1
- package/dist/apps/funding/routes/chains.d.ts.map +1 -1
- package/dist/apps/funding/routes/chains.js +5 -4
- package/dist/apps/funding/routes/chains.js.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts +16 -16
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.js +24 -19
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/funding/routes/providers.d.ts +13 -13
- package/dist/apps/funding/routes/providers.d.ts.map +1 -1
- package/dist/apps/funding/routes/providers.js +3 -2
- package/dist/apps/funding/routes/providers.js.map +1 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
- package/dist/apps/funding/routes/quotes.js +2 -2
- package/dist/apps/funding/routes/quotes.js.map +1 -1
- package/dist/apps/funding/routes/transfers.d.ts +60 -48
- package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
- package/dist/apps/funding/routes/transfers.js +27 -19
- package/dist/apps/funding/routes/transfers.js.map +1 -1
- package/dist/apps/management/App.d.ts +4558 -3700
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +19 -6
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +786 -175
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +312 -34
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +103 -30
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +91 -32
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +35 -35
- package/dist/apps/management/routes/faucet.d.ts.map +1 -1
- package/dist/apps/management/routes/faucet.js +23 -12
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +46 -13
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +79 -29
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +120 -75
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +100 -41
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +5 -5
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +14 -10
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +99 -78
- package/dist/apps/management/routes/members.d.ts.map +1 -1
- package/dist/apps/management/routes/members.js +37 -18
- package/dist/apps/management/routes/members.js.map +1 -1
- package/dist/apps/management/routes/orgs.d.ts +48 -8
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +48 -19
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +108 -46
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +72 -21
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +8 -5
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +82 -82
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +41 -31
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +35 -7
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +36 -17
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +200 -183
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +80 -35
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +12 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/db/Db.d.ts +2 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +52 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +26 -3
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +24 -5
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +5 -0
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/fundingCatalog.d.ts +4 -2
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
- package/dist/db/tables/fundingCatalog.js +5 -1
- package/dist/db/tables/fundingCatalog.js.map +1 -1
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
- package/dist/db/tables/webhookDeliveries.js +10 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -1
- package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
- package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
- package/dist/db/tables/webhookQueueCompletions.js +32 -0
- package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
- package/dist/db/tables/webhookQueueEvents.d.ts +14 -20
- package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +68 -47
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +16 -5
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +29 -5
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +9 -0
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/internal/Auth.d.ts +11 -2
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +19 -6
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +11 -7
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +43 -4
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +167 -0
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/Fetch.d.ts +23 -0
- package/dist/internal/Fetch.d.ts.map +1 -0
- package/dist/internal/Fetch.js +26 -0
- package/dist/internal/Fetch.js.map +1 -0
- package/dist/internal/Log.d.ts +3 -1
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +16 -3
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +30 -24
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +140 -41
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +14 -9
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +16 -5
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +11 -10
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +14 -9
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +28 -6
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +121 -25
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +2 -0
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +23 -6
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Timeout.d.ts +36 -0
- package/dist/internal/Timeout.d.ts.map +1 -0
- package/dist/internal/Timeout.js +37 -0
- package/dist/internal/Timeout.js.map +1 -0
- package/dist/internal/Timing.d.ts +9 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +7 -0
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +3 -0
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +29 -12
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +37 -20
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/funding/Action.d.ts +9 -0
- package/dist/internal/funding/Action.d.ts.map +1 -1
- package/dist/internal/funding/Action.js +16 -8
- package/dist/internal/funding/Action.js.map +1 -1
- package/dist/internal/funding/Catalog.d.ts +9 -2
- package/dist/internal/funding/Catalog.d.ts.map +1 -1
- package/dist/internal/funding/Catalog.js +19 -8
- package/dist/internal/funding/Catalog.js.map +1 -1
- package/dist/internal/funding/Deposit.d.ts +2 -2
- package/dist/internal/funding/Deposit.d.ts.map +1 -1
- package/dist/internal/funding/Deposit.js +9 -8
- package/dist/internal/funding/Deposit.js.map +1 -1
- package/dist/internal/funding/DepositAddress.d.ts +4 -4
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
- package/dist/internal/funding/DepositAddress.js +9 -8
- package/dist/internal/funding/DepositAddress.js.map +1 -1
- package/dist/internal/funding/Provider.d.ts +68 -13
- package/dist/internal/funding/Provider.d.ts.map +1 -1
- package/dist/internal/funding/Provider.js +42 -20
- package/dist/internal/funding/Provider.js.map +1 -1
- package/dist/internal/funding/Transfer.d.ts +13 -12
- package/dist/internal/funding/Transfer.d.ts.map +1 -1
- package/dist/internal/funding/Transfer.js +23 -21
- package/dist/internal/funding/Transfer.js.map +1 -1
- package/dist/internal/funding/providers/stargate.d.ts +38 -0
- package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
- package/dist/internal/funding/providers/stargate.js +277 -0
- package/dist/internal/funding/providers/stargate.js.map +1 -0
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +1 -0
- package/dist/internal/index.js.map +1 -1
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +3 -3
- package/src/App.test.ts +148 -0
- package/src/App.ts +45 -4
- package/src/Assets.test.ts +18 -0
- package/src/Assets.ts +22 -0
- package/src/Client.test-d.ts +311 -16
- package/src/Scope.test.ts +20 -0
- package/src/Scope.ts +16 -0
- package/src/admin/apps/api-keys.test.ts +75 -0
- package/src/admin/apps/api-keys.ts +64 -0
- package/src/admin/apps/earn-vaults.test.ts +143 -0
- package/src/admin/apps/earn-vaults.ts +84 -7
- package/src/admin/apps/organizations.ts +6 -2
- package/src/admin/ui/src/lib/api-keys.ts +19 -0
- package/src/admin/ui/src/routes/api-keys.tsx +125 -2
- package/src/admin/ui.generated.ts +71 -71
- package/src/apps/Zones.test.ts +4 -4
- package/src/apps/Zones.ts +4 -4
- package/src/apps/composition.test.ts +1 -1
- package/src/apps/data/App.test.ts +72 -0
- package/src/apps/data/App.ts +58 -10
- package/src/apps/data/ZoneSelection.test.ts +196 -0
- package/src/apps/data/ZoneSelection.ts +108 -0
- package/src/apps/data/routes/activities.test.ts +1843 -2
- package/src/apps/data/routes/activities.ts +2211 -1388
- package/src/apps/data/routes/balances.ts +134 -98
- package/src/apps/data/routes/blocks.test.ts +533 -0
- package/src/apps/data/routes/blocks.ts +36 -17
- package/src/apps/data/routes/earn.test.ts +187 -25
- package/src/apps/data/routes/earn.ts +228 -32
- package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
- package/src/apps/data/routes/exchanges.test.ts +31 -1
- package/src/apps/data/routes/exchanges.ts +19 -15
- package/src/apps/data/routes/fee-amm.ts +18 -11
- package/src/apps/data/routes/receipts.ts +48 -17
- package/src/apps/data/routes/rpc.test.ts +75 -0
- package/src/apps/data/routes/rpc.ts +23 -9
- package/src/apps/data/routes/tokenlist.ts +21 -18
- package/src/apps/data/routes/tokens.test.ts +607 -0
- package/src/apps/data/routes/tokens.ts +312 -231
- package/src/apps/data/routes/transactions.ts +69 -30
- package/src/apps/data/routes/transfers.test.ts +424 -3
- package/src/apps/data/routes/transfers.ts +57 -36
- package/src/apps/data/routes/valuation.ts +94 -78
- package/src/apps/data/routes/webhooks.ts +6 -2
- package/src/apps/data/routes/zones.test.ts +21 -15
- package/src/apps/data/routes/zones.ts +1 -1
- package/src/apps/funding/routes/chains.test.ts +211 -7
- package/src/apps/funding/routes/chains.ts +19 -12
- package/src/apps/funding/routes/deposit-addresses.test.ts +416 -0
- package/src/apps/funding/routes/deposit-addresses.ts +101 -84
- package/src/apps/funding/routes/providers.ts +9 -5
- package/src/apps/funding/routes/quotes.test.ts +42 -0
- package/src/apps/funding/routes/quotes.ts +8 -5
- package/src/apps/funding/routes/transfers.test.ts +430 -40
- package/src/apps/funding/routes/transfers.ts +76 -59
- package/src/apps/management/Billing.test.ts +26 -0
- package/src/apps/management/Billing.ts +24 -7
- package/src/apps/management/routes/api-keys.test.ts +398 -0
- package/src/apps/management/routes/api-keys.ts +481 -145
- package/src/apps/management/routes/billing.test.ts +209 -0
- package/src/apps/management/routes/billing.ts +254 -177
- package/src/apps/management/routes/faucet.test.ts +39 -0
- package/src/apps/management/routes/faucet.ts +75 -41
- package/src/apps/management/routes/invitations.test.ts +216 -0
- package/src/apps/management/routes/invitations.ts +186 -109
- package/src/apps/management/routes/invite-links.test.ts +263 -1
- package/src/apps/management/routes/invite-links.ts +295 -214
- package/src/apps/management/routes/me.test.ts +49 -0
- package/src/apps/management/routes/me.ts +42 -32
- package/src/apps/management/routes/members.test.ts +124 -1
- package/src/apps/management/routes/members.ts +81 -51
- package/src/apps/management/routes/orgs.test.ts +176 -0
- package/src/apps/management/routes/orgs.ts +101 -59
- package/src/apps/management/routes/projects.test.ts +183 -0
- package/src/apps/management/routes/projects.ts +124 -60
- package/src/apps/management/routes/scopes.test.ts +44 -0
- package/src/apps/management/routes/scopes.ts +37 -28
- package/src/apps/management/routes/usage.test.ts +92 -0
- package/src/apps/management/routes/usage.ts +186 -151
- package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
- package/src/apps/management/routes/verified-token-requests.ts +166 -133
- package/src/apps/management/routes/webhooks.test.ts +234 -0
- package/src/apps/management/routes/webhooks.ts +191 -78
- package/src/apps/mpp/internal/Adapter.ts +13 -1
- package/src/db/Db.test.ts +41 -0
- package/src/db/Db.ts +75 -1
- package/src/db/Schema.ts +33 -5
- package/src/db/tables/earnVaults.test.ts +22 -0
- package/src/db/tables/earnVaults.ts +11 -1
- package/src/db/tables/fundingCatalog.test.ts +16 -2
- package/src/db/tables/fundingCatalog.ts +9 -3
- package/src/db/tables/webhookDeliveries.ts +13 -0
- package/src/db/tables/webhookQueueCompletions.ts +55 -0
- package/src/db/tables/webhookQueueEvents.ts +95 -61
- package/src/db/tables/webhookSubscriptions.ts +45 -6
- package/src/handlers/internal/utils.test.ts +53 -0
- package/src/handlers/internal/utils.ts +15 -0
- package/src/internal/Auth.ts +35 -9
- package/src/internal/Cache.ts +14 -7
- package/src/internal/EarnVaults.capabilities.test.ts +33 -0
- package/src/internal/EarnVaults.test.ts +79 -0
- package/src/internal/EarnVaults.ts +277 -0
- package/src/internal/Fetch.test.ts +46 -0
- package/src/internal/Fetch.ts +56 -0
- package/src/internal/Log.test.ts +21 -0
- package/src/internal/Log.ts +20 -5
- package/src/internal/OpenApi.ts +177 -51
- package/src/internal/Response.test.ts +95 -0
- package/src/internal/Response.ts +41 -3
- package/src/internal/Schema.test.ts +18 -0
- package/src/internal/Schema.ts +19 -9
- package/src/internal/Store.test.ts +364 -0
- package/src/internal/Store.ts +153 -27
- package/src/internal/Tidx.test.ts +21 -1
- package/src/internal/Tidx.ts +23 -6
- package/src/internal/Timeout.test.ts +35 -0
- package/src/internal/Timeout.ts +73 -0
- package/src/internal/Timing.ts +16 -0
- package/src/internal/WebhookDestination.ts +3 -0
- package/src/internal/Webhooks.test.ts +122 -8
- package/src/internal/Webhooks.ts +59 -29
- package/src/internal/funding/Action.test.ts +41 -1
- package/src/internal/funding/Action.ts +69 -41
- package/src/internal/funding/Catalog.test.ts +34 -0
- package/src/internal/funding/Catalog.ts +28 -11
- package/src/internal/funding/Deposit.ts +71 -64
- package/src/internal/funding/DepositAddress.ts +50 -43
- package/src/internal/funding/Provider.test.ts +73 -0
- package/src/internal/funding/Provider.ts +246 -170
- package/src/internal/funding/Transfer.ts +133 -110
- package/src/internal/funding/providers/index.test.ts +22 -0
- package/src/internal/funding/providers/relay.test.ts +2 -2
- package/src/internal/funding/providers/stargate.test.ts +163 -0
- package/src/internal/funding/providers/stargate.ts +409 -0
- package/src/internal/index.test.ts +1 -0
- package/src/internal/index.ts +1 -0
- package/src/providers/index.test.ts +1 -0
- package/src/providers/index.ts +9 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../../src/apps/management/routes/api-keys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAM7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAK3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../../src/apps/management/routes/api-keys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAM7B,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAK3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAMzD,kDAAkD;AAClD,yBAAiB,MAAM,CAAC;IACtB,oEAAoE;IAC7D,MAAM,GAAG;;;;;;;;;;;;;;;;qBAyEf,CAAA;IAED,6DAA6D;IACtD,MAAM,MAAM;;;qBAe8C,CAAA;IAEjE,mEAAmE;IAC5D,MAAM,SAAS;;qBASiD,CAAA;IAEvE,8CAA8C;IACvC,MAAM,SAAS;;;;qBAqBkC,CAAA;IAExD,iEAAiE;IAC1D,MAAM,YAAY;;;qBAekD,CAAA;IAE3E,2EAA2E;IACpE,MAAM,mBAAmB;;;;;;;;qBA+B/B,CAAA;IAED,8CAA8C;IAC9C,UAAiB,YAAY,CAAC;QAC5B,8CAA8C;QACvC,MAAM,QAAQ;;;;;;;;;;;;;;;;;yBAapB,CAAA;KACF;IAED,8CAA8C;IACvC,MAAM,UAAU;;;;;;;;;;;;;;;;;;qBAQtB,CAAA;IAED,6CAA6C;IAC7C,UAAiB,WAAW,CAAC;QAC3B,mDAAmD;QAC5C,MAAM,KAAK;;;;;0BAEgD,CAAA;QAElE,8CAA8C;QACvC,MAAM,QAAQ;;;;;;;;;;;;;;;;;;yBAAa,CAAA;KACnC;IAED,gDAAgD;IAChD,UAAiB,cAAc,CAAC;QAC9B,0DAA0D;QACnD,MAAM,KAAK;;;;;0BAEsD,CAAA;QAExE,2DAA2D;QACpD,MAAM,QAAQ;;;;;;;;;;;;;;;;;;yBAAa,CAAA;KACnC;IAED,8CAA8C;IAC9C,UAAiB,YAAY,CAAC;QAC5B,6CAA6C;QACtC,MAAM,QAAQ;;yBAYpB,CAAA;KACF;IAED,8CAA8C;IAC9C,UAAiB,YAAY,CAAC;QAC5B,mDAAmD;QAC5C,MAAM,QAAQ;;;;;;;;;;;;;;;;;yBAapB,CAAA;KACF;IAED,8CAA8C;IAC9C,UAAiB,YAAY,CAAC;QAC5B,+DAA+D;QACxD,MAAM,IAAI;;yBAYhB,CAAA;KACF;CACF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,OAAO,CAAC,OAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2HA4jBpD;AAED,MAAM,CAAC,OAAO,WAAW,OAAO,CAAC;IAC/B,kDAAkD;IAClD,KAAK,OAAO,GAAG;QACb,oHAAoH;QACpH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAC9B,CAAA;CACF"}
|
|
@@ -10,16 +10,17 @@ import * as Billing from '../Billing.js';
|
|
|
10
10
|
import * as OpenApi from '../../../internal/OpenApi.js';
|
|
11
11
|
import * as Response from '../../../internal/Response.js';
|
|
12
12
|
import * as Schema from '../../../internal/Schema.js';
|
|
13
|
+
import * as Store from '../../../internal/Store.js';
|
|
13
14
|
import * as Scope from '../../../Scope.js';
|
|
14
15
|
import * as ManagementError from '../Error.js';
|
|
15
16
|
/** Zod schemas owned by the API-keys resource. */
|
|
16
17
|
export var schema;
|
|
17
18
|
(function (schema) {
|
|
18
19
|
/** One API key: metadata only — the token appears once, at mint. */
|
|
19
|
-
schema.Key = Schema.describe(z.object({
|
|
20
|
+
schema.Key = OpenApi.component(Schema.describe(z.object({
|
|
20
21
|
allowedIps: ApiKey.schema.AllowedIps.check(z.describe('Client IP addresses and CIDR ranges allowed to use this key. An empty list means unrestricted.'), z.meta({ examples: [['203.0.113.0/24', '2001:db8::1']] })),
|
|
21
|
-
createdAt: z
|
|
22
|
-
.
|
|
22
|
+
createdAt: z.iso
|
|
23
|
+
.datetime()
|
|
23
24
|
.check(z.describe('When the key was minted (ISO 8601).'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] })),
|
|
24
25
|
createdBy: z
|
|
25
26
|
.optional(z.string())
|
|
@@ -28,13 +29,13 @@ export var schema;
|
|
|
28
29
|
.enum(['production', 'sandbox'])
|
|
29
30
|
.check(z.describe('Key environment.'), z.meta({ examples: ['sandbox'] })),
|
|
30
31
|
expiresAt: z
|
|
31
|
-
.optional(z.
|
|
32
|
+
.optional(z.iso.datetime())
|
|
32
33
|
.check(z.describe('When the key expires (ISO 8601). Absent for a non-expiring key.'), z.meta({ examples: ['2027-01-01T00:00:00.000Z'] })),
|
|
33
34
|
id: z
|
|
34
35
|
.string()
|
|
35
36
|
.check(z.describe('Opaque key id (`key_…`).'), z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
36
37
|
lastUsedAt: z
|
|
37
|
-
.optional(z.
|
|
38
|
+
.optional(z.iso.datetime())
|
|
38
39
|
.check(z.describe('When the key last authenticated a request (ISO 8601).'), z.meta({ examples: ['2026-07-21T12:34:56.000Z'] })),
|
|
39
40
|
name: z
|
|
40
41
|
.optional(z.string())
|
|
@@ -50,7 +51,7 @@ export var schema;
|
|
|
50
51
|
tokenLast4: z
|
|
51
52
|
.string()
|
|
52
53
|
.check(z.describe('Last 4 characters of the plaintext token.'), z.meta({ examples: ['a1b2'] })),
|
|
53
|
-
}), 'An API key: metadata only — the token appears once, at mint.');
|
|
54
|
+
}), 'An API key: metadata only — the token appears once, at mint.'), 'ApiKey');
|
|
54
55
|
/** Path parameters addressing a project's key collection. */
|
|
55
56
|
schema.Params = z
|
|
56
57
|
.object({
|
|
@@ -84,8 +85,19 @@ export var schema;
|
|
|
84
85
|
.check(z.describe('The project id (`prj_…`).'), z.meta({ examples: ['prj_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
85
86
|
})
|
|
86
87
|
.check(z.describe('Path parameters for one API key.'));
|
|
88
|
+
/** Path parameters addressing one organization-level API key. */
|
|
89
|
+
schema.OrgKeyParams = z
|
|
90
|
+
.object({
|
|
91
|
+
keyId: z
|
|
92
|
+
.string()
|
|
93
|
+
.check(z.describe('The key id (`key_…`).'), z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
94
|
+
orgId: z
|
|
95
|
+
.string()
|
|
96
|
+
.check(z.describe('The organization id (`org_…`).'), z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
97
|
+
})
|
|
98
|
+
.check(z.describe('Path parameters for one organization-level API key.'));
|
|
87
99
|
/** Request body minting a key. The wildcard scope is not issuable here. */
|
|
88
|
-
schema.
|
|
100
|
+
schema.CreateApiKeyRequest = OpenApi.component(z
|
|
89
101
|
.object({
|
|
90
102
|
allowedIps: z
|
|
91
103
|
.optional(ApiKey.schema.AllowedIps)
|
|
@@ -100,17 +112,21 @@ export var schema;
|
|
|
100
112
|
._default(z.array(z.string().check(z.minLength(1), z.refine((scope) => scope !== Scope.wildcard))), [])
|
|
101
113
|
.check(z.describe('Scopes to grant.'), z.meta({ examples: [['data:read']] })),
|
|
102
114
|
})
|
|
103
|
-
.check(z.describe('Fields for minting an API key.'));
|
|
115
|
+
.check(z.describe('Fields for minting an API key.')), 'CreateApiKeyRequest');
|
|
104
116
|
/** Schemas for the createApiKey operation. */
|
|
105
117
|
let createApiKey;
|
|
106
118
|
(function (createApiKey) {
|
|
107
119
|
/** The minted key plus its one-time token. */
|
|
108
|
-
createApiKey.Response = Schema.describe(z.extend(schema.Key, {
|
|
120
|
+
createApiKey.Response = OpenApi.component(Schema.describe(z.extend(schema.Key, {
|
|
109
121
|
token: z
|
|
110
122
|
.string()
|
|
111
123
|
.check(z.describe('The plaintext token — shown once, unrecoverable afterward.'), z.meta({ examples: ['tempo_sandbox:sk:…'] })),
|
|
112
|
-
}), 'The minted key, including its one-time token.');
|
|
124
|
+
}), 'The minted key, including its one-time token.'), 'CreateApiKeyResponse');
|
|
113
125
|
})(createApiKey = schema.createApiKey || (schema.createApiKey = {}));
|
|
126
|
+
/** Non-paginated list of API key metadata. */
|
|
127
|
+
schema.ApiKeyList = OpenApi.component(Schema.describe(z.object({
|
|
128
|
+
data: z.array(schema.Key).check(z.describe('The API keys, newest first.')),
|
|
129
|
+
}), 'A non-paginated list of API key metadata.'), 'ApiKeyList');
|
|
114
130
|
/** Schemas for the listApiKeys operation. */
|
|
115
131
|
let listApiKeys;
|
|
116
132
|
(function (listApiKeys) {
|
|
@@ -119,9 +135,7 @@ export var schema;
|
|
|
119
135
|
.strictObject({ environment: Schema.Environment })
|
|
120
136
|
.check(z.describe("Query parameters for a project's API keys."));
|
|
121
137
|
/** Non-paginated list of a project's keys. */
|
|
122
|
-
listApiKeys.Response =
|
|
123
|
-
data: z.array(schema.Key).check(z.describe("The project's keys, newest first.")),
|
|
124
|
-
}), "A non-paginated list of a project's API keys (metadata only).");
|
|
138
|
+
listApiKeys.Response = schema.ApiKeyList;
|
|
125
139
|
})(listApiKeys = schema.listApiKeys || (schema.listApiKeys = {}));
|
|
126
140
|
/** Schemas for the listOrgApiKeys operation. */
|
|
127
141
|
let listOrgApiKeys;
|
|
@@ -131,33 +145,39 @@ export var schema;
|
|
|
131
145
|
.strictObject({ environment: Schema.Environment })
|
|
132
146
|
.check(z.describe("Query parameters for an organization's API keys."));
|
|
133
147
|
/** Non-paginated list of every key in the organization. */
|
|
134
|
-
listOrgApiKeys.Response =
|
|
135
|
-
data: z
|
|
136
|
-
.array(schema.Key)
|
|
137
|
-
.check(z.describe("The organization's keys across all projects, newest first.")),
|
|
138
|
-
}), "A non-paginated list of an organization's API keys (metadata only).");
|
|
148
|
+
listOrgApiKeys.Response = schema.ApiKeyList;
|
|
139
149
|
})(listOrgApiKeys = schema.listOrgApiKeys || (schema.listOrgApiKeys = {}));
|
|
140
150
|
/** Schemas for the revokeApiKey operation. */
|
|
141
151
|
let revokeApiKey;
|
|
142
152
|
(function (revokeApiKey) {
|
|
143
153
|
/** Confirmation that the key was revoked. */
|
|
144
|
-
revokeApiKey.Response = z
|
|
154
|
+
revokeApiKey.Response = OpenApi.component(z
|
|
145
155
|
.object({
|
|
146
156
|
id: z
|
|
147
157
|
.string()
|
|
148
158
|
.check(z.describe('ID of the key that was revoked.'), z.meta({ examples: ['key_1a2b3c4d5e6f7g8h9j0k1m2n'] })),
|
|
149
159
|
})
|
|
150
|
-
.check(z.describe('Confirmation that the key was revoked.'));
|
|
160
|
+
.check(z.describe('Confirmation that the key was revoked.')), 'RevokeApiKeyResponse');
|
|
151
161
|
})(revokeApiKey = schema.revokeApiKey || (schema.revokeApiKey = {}));
|
|
162
|
+
/** Schemas for the rotateApiKey operation. */
|
|
163
|
+
let rotateApiKey;
|
|
164
|
+
(function (rotateApiKey) {
|
|
165
|
+
/** The replacement key plus its one-time token. */
|
|
166
|
+
rotateApiKey.Response = OpenApi.component(Schema.describe(z.extend(schema.Key, {
|
|
167
|
+
token: z
|
|
168
|
+
.string()
|
|
169
|
+
.check(z.describe('The plaintext token — shown once, unrecoverable afterward.'), z.meta({ examples: ['tempo_sandbox:sk:…'] })),
|
|
170
|
+
}), 'The replacement key, including its one-time token.'), 'RotateApiKeyResponse');
|
|
171
|
+
})(rotateApiKey = schema.rotateApiKey || (schema.rotateApiKey = {}));
|
|
152
172
|
/** Schemas for the updateApiKey operation. */
|
|
153
173
|
let updateApiKey;
|
|
154
174
|
(function (updateApiKey) {
|
|
155
175
|
/** Request body replacing or clearing a key's IP allowlist. */
|
|
156
|
-
updateApiKey.Body = z
|
|
176
|
+
updateApiKey.Body = OpenApi.component(z
|
|
157
177
|
.object({
|
|
158
178
|
allowedIps: ApiKey.schema.AllowedIps.check(z.describe('Replacement client IP/CIDR allowlist. Use an empty list for unrestricted access.'), z.meta({ examples: [['203.0.113.0/24']] })),
|
|
159
179
|
})
|
|
160
|
-
.check(z.describe("Fields for updating an API key's network access."));
|
|
180
|
+
.check(z.describe("Fields for updating an API key's network access.")), 'UpdateApiKeyRequest');
|
|
161
181
|
})(updateApiKey = schema.updateApiKey || (schema.updateApiKey = {}));
|
|
162
182
|
})(schema || (schema = {}));
|
|
163
183
|
/**
|
|
@@ -169,7 +189,7 @@ export function apiKeys(options = {}) {
|
|
|
169
189
|
.post('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys', Auth.policy({ session: true }), Auth.ensureOrg({ role: 'admin' }), Auth.ensureProject(), OpenApi.validate('param', schema.Params, {
|
|
170
190
|
code: 'param_invalid',
|
|
171
191
|
message: 'Check the path parameters and try again.',
|
|
172
|
-
}), OpenApi.validate('json', schema.
|
|
192
|
+
}), OpenApi.validate('json', schema.CreateApiKeyRequest, {
|
|
173
193
|
code: 'body_invalid',
|
|
174
194
|
message: 'Check the request body and try again.',
|
|
175
195
|
}), OpenApi.describeRoute({
|
|
@@ -178,11 +198,18 @@ export function apiKeys(options = {}) {
|
|
|
178
198
|
operationId: 'createApiKey',
|
|
179
199
|
responses: OpenApi.responses({
|
|
180
200
|
errors: {
|
|
201
|
+
400: {
|
|
202
|
+
codes: ['body_invalid', 'param_invalid'],
|
|
203
|
+
description: 'Malformed API key, invalid path, or invalid body.',
|
|
204
|
+
},
|
|
181
205
|
403: {
|
|
182
206
|
codes: ['scope_not_issuable'],
|
|
183
207
|
description: 'The requested scopes are not issuable.',
|
|
184
208
|
},
|
|
185
|
-
404:
|
|
209
|
+
404: {
|
|
210
|
+
codes: ['api_keys_not_enabled', 'organization_not_found', 'project_not_found'],
|
|
211
|
+
description: 'No accessible project or API key surface was found.',
|
|
212
|
+
},
|
|
186
213
|
},
|
|
187
214
|
success: {
|
|
188
215
|
description: 'The minted key, including its one-time token.',
|
|
@@ -196,6 +223,8 @@ export function apiKeys(options = {}) {
|
|
|
196
223
|
return Auth.superAdminAccessError(c);
|
|
197
224
|
if (Auth.narrowScope)
|
|
198
225
|
return Auth.ensureProjectError(c);
|
|
226
|
+
if (Auth.narrowOrgRole)
|
|
227
|
+
return Auth.ensureOrgRoleError(c);
|
|
199
228
|
if (OpenApi.narrowValidation)
|
|
200
229
|
return OpenApi.validationError(c, {
|
|
201
230
|
code: 'param_invalid',
|
|
@@ -260,8 +289,14 @@ export function apiKeys(options = {}) {
|
|
|
260
289
|
operationId: 'listApiKeys',
|
|
261
290
|
responses: OpenApi.responses({
|
|
262
291
|
errors: {
|
|
263
|
-
400: {
|
|
264
|
-
|
|
292
|
+
400: {
|
|
293
|
+
codes: ['param_invalid', 'query_invalid'],
|
|
294
|
+
description: 'Malformed API key, invalid path, or invalid query.',
|
|
295
|
+
},
|
|
296
|
+
404: {
|
|
297
|
+
codes: ['api_keys_not_enabled', 'organization_not_found', 'project_not_found'],
|
|
298
|
+
description: 'No accessible project or API key surface was found.',
|
|
299
|
+
},
|
|
265
300
|
},
|
|
266
301
|
success: {
|
|
267
302
|
description: "The project's keys, newest first (metadata only).",
|
|
@@ -314,8 +349,14 @@ export function apiKeys(options = {}) {
|
|
|
314
349
|
operationId: 'listOrgApiKeys',
|
|
315
350
|
responses: OpenApi.responses({
|
|
316
351
|
errors: {
|
|
317
|
-
400: {
|
|
318
|
-
|
|
352
|
+
400: {
|
|
353
|
+
codes: ['param_invalid', 'query_invalid'],
|
|
354
|
+
description: 'Malformed API key, invalid path, or invalid query.',
|
|
355
|
+
},
|
|
356
|
+
404: {
|
|
357
|
+
codes: ['api_keys_not_enabled', 'organization_not_found'],
|
|
358
|
+
description: 'No accessible organization or API key surface was found.',
|
|
359
|
+
},
|
|
319
360
|
},
|
|
320
361
|
success: {
|
|
321
362
|
description: "The organization's keys across all projects, newest first (metadata only).", // prettier-ignore
|
|
@@ -354,6 +395,115 @@ export function apiKeys(options = {}) {
|
|
|
354
395
|
catch (cause) {
|
|
355
396
|
return Response.upstream(c, cause);
|
|
356
397
|
}
|
|
398
|
+
})
|
|
399
|
+
.post('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}/rotate', Auth.policy({ session: true }), Auth.ensureOrg({ role: 'admin' }), OpenApi.validate('param', schema.OrgKeyParams, {
|
|
400
|
+
code: 'param_invalid',
|
|
401
|
+
message: 'Check the path parameters and try again.',
|
|
402
|
+
}), OpenApi.describeRoute({
|
|
403
|
+
description: 'Create a replacement organization-level API key with the same access as an existing key. The existing key remains active until revoked.',
|
|
404
|
+
hide: hidden,
|
|
405
|
+
operationId: 'rotateOrgApiKey',
|
|
406
|
+
responses: OpenApi.responses({
|
|
407
|
+
errors: {
|
|
408
|
+
400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
|
|
409
|
+
403: {
|
|
410
|
+
codes: ['scope_not_issuable'],
|
|
411
|
+
description: 'The source key contains scopes the caller cannot rotate.',
|
|
412
|
+
},
|
|
413
|
+
404: {
|
|
414
|
+
codes: ['api_key_not_found', 'api_keys_not_enabled', 'organization_not_found'],
|
|
415
|
+
description: 'No accessible API key or API key surface was found.',
|
|
416
|
+
},
|
|
417
|
+
},
|
|
418
|
+
success: {
|
|
419
|
+
description: 'The replacement key, including its one-time token.',
|
|
420
|
+
schema: schema.rotateApiKey.Response,
|
|
421
|
+
},
|
|
422
|
+
}),
|
|
423
|
+
summary: 'Rotate organization API key',
|
|
424
|
+
tags: ['API Keys'],
|
|
425
|
+
}), async (c) => {
|
|
426
|
+
if (Auth.narrowAccess)
|
|
427
|
+
return Auth.superAdminAccessError(c);
|
|
428
|
+
if (Auth.narrowOrgRole)
|
|
429
|
+
return Auth.ensureOrgRoleError(c);
|
|
430
|
+
if (OpenApi.narrowValidation)
|
|
431
|
+
return OpenApi.validationError(c, {
|
|
432
|
+
code: 'param_invalid',
|
|
433
|
+
message: 'Check the path parameters and try again.',
|
|
434
|
+
});
|
|
435
|
+
const kv = c.get('kv');
|
|
436
|
+
if (!kv)
|
|
437
|
+
return notEnabled(c);
|
|
438
|
+
const createdBy = mintedBy(c);
|
|
439
|
+
if (!createdBy)
|
|
440
|
+
return ManagementError.sessionRequired(c);
|
|
441
|
+
const { keyId } = c.req.valid('param');
|
|
442
|
+
try {
|
|
443
|
+
const source = await ApiKeys.get(kv.store, keyId, {
|
|
444
|
+
scopeCatalog: c.get('scopeCatalog'),
|
|
445
|
+
});
|
|
446
|
+
if (!source || source.orgId !== Auth.org(c).id || source.projectId !== undefined)
|
|
447
|
+
return keyNotFound(c);
|
|
448
|
+
if (!canRotate(c, source.scopes))
|
|
449
|
+
return Response.error(c, {
|
|
450
|
+
code: 'scope_not_issuable',
|
|
451
|
+
message: 'The source key contains scopes the caller cannot rotate.',
|
|
452
|
+
status: 403,
|
|
453
|
+
});
|
|
454
|
+
return rotate(c, kv.store, source, createdBy);
|
|
455
|
+
}
|
|
456
|
+
catch (cause) {
|
|
457
|
+
return Response.upstream(c, cause);
|
|
458
|
+
}
|
|
459
|
+
})
|
|
460
|
+
.delete('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}', Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }), Auth.ensureOrg({ role: 'admin' }), OpenApi.validate('param', schema.OrgKeyParams, {
|
|
461
|
+
code: 'param_invalid',
|
|
462
|
+
message: 'Check the path parameters and try again.',
|
|
463
|
+
}), OpenApi.describeRoute({
|
|
464
|
+
description: 'Revoke an organization-level API key. Requests presenting its token stop resolving.',
|
|
465
|
+
hide: hidden,
|
|
466
|
+
operationId: 'revokeOrgApiKey',
|
|
467
|
+
responses: OpenApi.responses({
|
|
468
|
+
errors: {
|
|
469
|
+
400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
|
|
470
|
+
404: {
|
|
471
|
+
codes: ['api_key_not_found', 'api_keys_not_enabled', 'organization_not_found'],
|
|
472
|
+
description: 'No accessible API key or API key surface was found.',
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
success: {
|
|
476
|
+
description: 'Confirmation that the key was revoked.',
|
|
477
|
+
schema: schema.revokeApiKey.Response,
|
|
478
|
+
},
|
|
479
|
+
}),
|
|
480
|
+
summary: 'Revoke organization API key',
|
|
481
|
+
tags: ['API Keys'],
|
|
482
|
+
}), async (c) => {
|
|
483
|
+
if (Auth.narrowAccess)
|
|
484
|
+
return Auth.accessError(c);
|
|
485
|
+
if (Auth.narrowOrgRole)
|
|
486
|
+
return Auth.ensureOrgRoleError(c);
|
|
487
|
+
if (OpenApi.narrowValidation)
|
|
488
|
+
return OpenApi.validationError(c, {
|
|
489
|
+
code: 'param_invalid',
|
|
490
|
+
message: 'Check the path parameters and try again.',
|
|
491
|
+
});
|
|
492
|
+
const kv = c.get('kv');
|
|
493
|
+
if (!kv)
|
|
494
|
+
return notEnabled(c);
|
|
495
|
+
const { keyId } = c.req.valid('param');
|
|
496
|
+
try {
|
|
497
|
+
const record = await ApiKeys.get(kv.store, keyId, {
|
|
498
|
+
scopeCatalog: c.get('scopeCatalog'),
|
|
499
|
+
});
|
|
500
|
+
if (!record || record.orgId !== Auth.org(c).id || record.projectId !== undefined)
|
|
501
|
+
return keyNotFound(c);
|
|
502
|
+
return revoke(c, kv.store, keyId);
|
|
503
|
+
}
|
|
504
|
+
catch (cause) {
|
|
505
|
+
return Response.upstream(c, cause);
|
|
506
|
+
}
|
|
357
507
|
})
|
|
358
508
|
.patch('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}', Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }), Auth.ensureOrg({ role: 'admin' }), Auth.ensureProject(), OpenApi.validate('param', schema.KeyParams, {
|
|
359
509
|
code: 'param_invalid',
|
|
@@ -367,7 +517,19 @@ export function apiKeys(options = {}) {
|
|
|
367
517
|
operationId: 'updateApiKey',
|
|
368
518
|
responses: OpenApi.responses({
|
|
369
519
|
errors: {
|
|
370
|
-
|
|
520
|
+
400: {
|
|
521
|
+
codes: ['body_invalid', 'param_invalid'],
|
|
522
|
+
description: 'Malformed API key, invalid path, or invalid body.',
|
|
523
|
+
},
|
|
524
|
+
404: {
|
|
525
|
+
codes: [
|
|
526
|
+
'api_key_not_found',
|
|
527
|
+
'api_keys_not_enabled',
|
|
528
|
+
'organization_not_found',
|
|
529
|
+
'project_not_found',
|
|
530
|
+
],
|
|
531
|
+
description: 'No accessible API key or API key surface was found.',
|
|
532
|
+
},
|
|
371
533
|
},
|
|
372
534
|
success: {
|
|
373
535
|
description: 'The updated API key metadata.',
|
|
@@ -381,6 +543,8 @@ export function apiKeys(options = {}) {
|
|
|
381
543
|
return Auth.accessError(c);
|
|
382
544
|
if (Auth.narrowScope)
|
|
383
545
|
return Auth.ensureProjectError(c);
|
|
546
|
+
if (Auth.narrowOrgRole)
|
|
547
|
+
return Auth.ensureOrgRoleError(c);
|
|
384
548
|
if (OpenApi.narrowValidation)
|
|
385
549
|
return OpenApi.validationError(c, {
|
|
386
550
|
code: 'param_invalid',
|
|
@@ -411,6 +575,74 @@ export function apiKeys(options = {}) {
|
|
|
411
575
|
catch (cause) {
|
|
412
576
|
return Response.upstream(c, cause);
|
|
413
577
|
}
|
|
578
|
+
})
|
|
579
|
+
.post('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}/rotate', Auth.policy({ session: true }), Auth.ensureOrg({ role: 'admin' }), Auth.ensureProject(), OpenApi.validate('param', schema.KeyParams, {
|
|
580
|
+
code: 'param_invalid',
|
|
581
|
+
message: 'Check the path parameters and try again.',
|
|
582
|
+
}), OpenApi.describeRoute({
|
|
583
|
+
description: 'Create a replacement API key with the same access as an existing key. The existing key remains active until revoked.',
|
|
584
|
+
hide: hidden,
|
|
585
|
+
operationId: 'rotateApiKey',
|
|
586
|
+
responses: OpenApi.responses({
|
|
587
|
+
errors: {
|
|
588
|
+
400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
|
|
589
|
+
403: {
|
|
590
|
+
codes: ['scope_not_issuable'],
|
|
591
|
+
description: 'The source key contains scopes the caller cannot rotate.',
|
|
592
|
+
},
|
|
593
|
+
404: {
|
|
594
|
+
codes: [
|
|
595
|
+
'api_key_not_found',
|
|
596
|
+
'api_keys_not_enabled',
|
|
597
|
+
'organization_not_found',
|
|
598
|
+
'project_not_found',
|
|
599
|
+
],
|
|
600
|
+
description: 'No accessible API key or API key surface was found.',
|
|
601
|
+
},
|
|
602
|
+
},
|
|
603
|
+
success: {
|
|
604
|
+
description: 'The replacement key, including its one-time token.',
|
|
605
|
+
schema: schema.rotateApiKey.Response,
|
|
606
|
+
},
|
|
607
|
+
}),
|
|
608
|
+
summary: 'Rotate API key',
|
|
609
|
+
tags: ['API Keys'],
|
|
610
|
+
}), async (c) => {
|
|
611
|
+
if (Auth.narrowAccess)
|
|
612
|
+
return Auth.superAdminAccessError(c);
|
|
613
|
+
if (Auth.narrowScope)
|
|
614
|
+
return Auth.ensureProjectError(c);
|
|
615
|
+
if (Auth.narrowOrgRole)
|
|
616
|
+
return Auth.ensureOrgRoleError(c);
|
|
617
|
+
if (OpenApi.narrowValidation)
|
|
618
|
+
return OpenApi.validationError(c, {
|
|
619
|
+
code: 'param_invalid',
|
|
620
|
+
message: 'Check the path parameters and try again.',
|
|
621
|
+
});
|
|
622
|
+
const kv = c.get('kv');
|
|
623
|
+
if (!kv)
|
|
624
|
+
return notEnabled(c);
|
|
625
|
+
const createdBy = mintedBy(c);
|
|
626
|
+
if (!createdBy)
|
|
627
|
+
return ManagementError.sessionRequired(c);
|
|
628
|
+
const { keyId } = c.req.valid('param');
|
|
629
|
+
try {
|
|
630
|
+
const source = await ApiKeys.get(kv.store, keyId, {
|
|
631
|
+
scopeCatalog: c.get('scopeCatalog'),
|
|
632
|
+
});
|
|
633
|
+
if (!source || source.orgId !== Auth.org(c).id || source.projectId !== Auth.project(c).id)
|
|
634
|
+
return keyNotFound(c);
|
|
635
|
+
if (!canRotate(c, source.scopes))
|
|
636
|
+
return Response.error(c, {
|
|
637
|
+
code: 'scope_not_issuable',
|
|
638
|
+
message: 'The source key contains scopes the caller cannot rotate.',
|
|
639
|
+
status: 403,
|
|
640
|
+
});
|
|
641
|
+
return rotate(c, kv.store, source, createdBy);
|
|
642
|
+
}
|
|
643
|
+
catch (cause) {
|
|
644
|
+
return Response.upstream(c, cause);
|
|
645
|
+
}
|
|
414
646
|
})
|
|
415
647
|
.delete('/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}', Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }), Auth.ensureOrg({ role: 'admin' }), Auth.ensureProject(), OpenApi.validate('param', schema.KeyParams, {
|
|
416
648
|
code: 'param_invalid',
|
|
@@ -420,7 +652,18 @@ export function apiKeys(options = {}) {
|
|
|
420
652
|
hide: hidden,
|
|
421
653
|
operationId: 'revokeApiKey',
|
|
422
654
|
responses: OpenApi.responses({
|
|
423
|
-
errors: {
|
|
655
|
+
errors: {
|
|
656
|
+
400: { codes: ['param_invalid'], description: 'Malformed API key or invalid path.' },
|
|
657
|
+
404: {
|
|
658
|
+
codes: [
|
|
659
|
+
'api_key_not_found',
|
|
660
|
+
'api_keys_not_enabled',
|
|
661
|
+
'organization_not_found',
|
|
662
|
+
'project_not_found',
|
|
663
|
+
],
|
|
664
|
+
description: 'No accessible API key or API key surface was found.',
|
|
665
|
+
},
|
|
666
|
+
},
|
|
424
667
|
success: {
|
|
425
668
|
description: 'Confirmation that the key was revoked.',
|
|
426
669
|
schema: schema.revokeApiKey.Response,
|
|
@@ -433,6 +676,8 @@ export function apiKeys(options = {}) {
|
|
|
433
676
|
return Auth.accessError(c);
|
|
434
677
|
if (Auth.narrowScope)
|
|
435
678
|
return Auth.ensureProjectError(c);
|
|
679
|
+
if (Auth.narrowOrgRole)
|
|
680
|
+
return Auth.ensureOrgRoleError(c);
|
|
436
681
|
if (OpenApi.narrowValidation)
|
|
437
682
|
return OpenApi.validationError(c, {
|
|
438
683
|
code: 'param_invalid',
|
|
@@ -450,10 +695,7 @@ export function apiKeys(options = {}) {
|
|
|
450
695
|
});
|
|
451
696
|
if (!record || record.orgId !== Auth.org(c).id || record.projectId !== Auth.project(c).id)
|
|
452
697
|
return keyNotFound(c);
|
|
453
|
-
|
|
454
|
-
if (!revoked)
|
|
455
|
-
return keyNotFound(c);
|
|
456
|
-
return c.json(Response.validated(schema.revokeApiKey.Response, { id: keyId }), 200);
|
|
698
|
+
return revoke(c, kv.store, keyId);
|
|
457
699
|
}
|
|
458
700
|
catch (cause) {
|
|
459
701
|
return Response.upstream(c, cause);
|
|
@@ -506,6 +748,42 @@ function canIssue(c, scopes) {
|
|
|
506
748
|
}
|
|
507
749
|
return false;
|
|
508
750
|
}
|
|
751
|
+
/** Checks caller-specific restrictions that still apply when copying existing grants. */
|
|
752
|
+
function canRotate(c, scopes) {
|
|
753
|
+
const principal = Auth.getPrincipal(c);
|
|
754
|
+
if (principal?.type === 'super_admin')
|
|
755
|
+
return true;
|
|
756
|
+
if (principal?.type !== 'session')
|
|
757
|
+
return false;
|
|
758
|
+
return ((!scopes.includes('management:write') && !scopes.includes(Scope.wildcard)) ||
|
|
759
|
+
Auth.membership(c)?.role === 'owner');
|
|
760
|
+
}
|
|
761
|
+
/** Mints a replacement that preserves the source key's access and attribution. */
|
|
762
|
+
async function rotate(c, store, source, createdBy) {
|
|
763
|
+
const billingActive = source.environment === 'sandbox'
|
|
764
|
+
? await Billing.active(Db.get(c.get('db')), source.orgId, 'sandbox')
|
|
765
|
+
: undefined;
|
|
766
|
+
const { record, token } = await ApiKeys.mint(store, {
|
|
767
|
+
allowedIps: source.allowedIps,
|
|
768
|
+
createdBy,
|
|
769
|
+
environment: source.environment,
|
|
770
|
+
orgId: source.orgId,
|
|
771
|
+
...(source.projectId === undefined ? {} : { projectId: source.projectId }),
|
|
772
|
+
scopes: source.scopes,
|
|
773
|
+
...(billingActive === undefined ? {} : { billingActive }),
|
|
774
|
+
...(source.expiresAt === undefined ? {} : { expiresAt: source.expiresAt }),
|
|
775
|
+
...(source.name === undefined ? {} : { name: source.name }),
|
|
776
|
+
...(source.rateLimits === undefined ? {} : { rateLimits: source.rateLimits }),
|
|
777
|
+
}, { scopeCatalog: c.get('scopeCatalog') });
|
|
778
|
+
return c.json(Response.validated(schema.rotateApiKey.Response, { ...serializeKey(record), token }), 200);
|
|
779
|
+
}
|
|
780
|
+
/** Revokes an API key after its route has verified ownership. */
|
|
781
|
+
async function revoke(c, store, keyId) {
|
|
782
|
+
const revoked = await ApiKeys.revoke(store, keyId);
|
|
783
|
+
if (!revoked)
|
|
784
|
+
return keyNotFound(c);
|
|
785
|
+
return c.json(Response.validated(schema.revokeApiKey.Response, { id: keyId }), 200);
|
|
786
|
+
}
|
|
509
787
|
function keyNotFound(c) {
|
|
510
788
|
return Response.error(c, {
|
|
511
789
|
code: 'api_key_not_found',
|