payment-kit 1.29.1 → 1.29.3
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/api/dev.ts +41 -2
- package/api/hono.d.ts +42 -0
- package/api/node-sqlite.d.ts +12 -0
- package/api/src/bootstrap.ts +47 -0
- package/api/src/crons/base.ts +3 -3
- package/api/src/crons/currency.ts +1 -1
- package/api/src/crons/index.ts +41 -37
- package/api/src/crons/metering-subscription-detection.ts +1 -1
- package/api/src/crons/overdue-detection.ts +2 -2
- package/api/src/crons/retry-pending-events.ts +6 -0
- package/api/src/crons/tenant-fanout.ts +82 -0
- package/api/src/host-node/did-connect-runtime-node.ts +33 -0
- package/api/src/host-node/serve-static-arc.ts +68 -0
- package/api/src/host-node/serve-static.ts +41 -0
- package/api/src/index.ts +22 -161
- package/api/src/integrations/app-store/client.ts +3 -4
- package/api/src/integrations/app-store/handlers/subscription.ts +7 -7
- package/api/src/integrations/app-store/signed-data-verifier.ts +3 -2
- package/api/src/integrations/arcblock/token.ts +21 -7
- package/api/src/integrations/google-play/handlers/subscription.ts +6 -6
- package/api/src/integrations/google-play/handlers/voided.ts +2 -2
- package/api/src/integrations/google-play/verify.ts +3 -2
- package/api/src/integrations/iap-reconcile.ts +3 -5
- package/api/src/integrations/stripe/handlers/invoice.ts +2 -2
- package/api/src/integrations/stripe/handlers/subscription.ts +3 -3
- package/api/src/libs/archive/query.ts +19 -0
- package/api/src/libs/audit.ts +61 -4
- package/api/src/libs/auth.ts +247 -47
- package/api/src/libs/context.ts +89 -1
- package/api/src/libs/currency.ts +2 -2
- package/api/src/libs/dayjs.ts +8 -2
- package/api/src/libs/did-connect/runtime-did-connect-js.ts +88 -0
- package/api/src/libs/did-connect/tenant-identity.ts +221 -0
- package/api/src/libs/drivers/auth-storage.ts +118 -0
- package/api/src/libs/drivers/cron.ts +264 -0
- package/api/src/libs/drivers/db.ts +170 -0
- package/api/src/libs/drivers/identity.ts +142 -0
- package/api/src/libs/drivers/index.ts +40 -0
- package/api/src/libs/drivers/locks.ts +226 -0
- package/api/src/libs/drivers/migrate-runner.ts +70 -0
- package/api/src/libs/drivers/queue.ts +104 -0
- package/api/src/libs/drivers/secrets.ts +194 -0
- package/api/src/libs/env.ts +170 -54
- package/api/src/libs/exchange-rate/service.ts +7 -6
- package/api/src/libs/http-fetch-adapter.ts +60 -0
- package/api/src/libs/invoice.ts +1 -1
- package/api/src/libs/lock.ts +51 -47
- package/api/src/libs/logger.ts +48 -8
- package/api/src/libs/notification/index.ts +1 -1
- package/api/src/libs/notification/template/customer-credit-low-balance.ts +2 -1
- package/api/src/libs/notification/template/customer-revenue-succeeded.ts +1 -1
- package/api/src/libs/notification/template/customer-reward-succeeded.ts +1 -1
- package/api/src/libs/overdraft-protection.ts +1 -1
- package/api/src/libs/payout.ts +1 -1
- package/api/src/libs/queue/index.ts +271 -52
- package/api/src/libs/queue/runtime.ts +175 -0
- package/api/src/libs/resource.ts +3 -3
- package/api/src/libs/secrets.ts +38 -0
- package/api/src/libs/session.ts +3 -2
- package/api/src/libs/subscription.ts +5 -5
- package/api/src/libs/tenant.ts +92 -0
- package/api/src/libs/url.ts +3 -3
- package/api/src/libs/util.ts +21 -13
- package/api/src/middlewares/hono/cdn.ts +63 -0
- package/api/src/middlewares/hono/context.ts +80 -0
- package/api/src/middlewares/hono/csrf.ts +83 -0
- package/api/src/middlewares/hono/fallback.ts +194 -0
- package/api/src/middlewares/hono/pipeline.ts +73 -0
- package/api/src/middlewares/hono/resource-mount.ts +42 -0
- package/api/src/middlewares/hono/resource.ts +63 -0
- package/api/src/middlewares/hono/security.ts +209 -0
- package/api/src/middlewares/hono/session.ts +114 -0
- package/api/src/middlewares/hono/xss.ts +61 -0
- package/api/src/queues/auto-recharge.ts +12 -10
- package/api/src/queues/checkout-session.ts +38 -21
- package/api/src/queues/credit-consume.ts +40 -36
- package/api/src/queues/credit-grant.ts +25 -18
- package/api/src/queues/credit-reconciliation.ts +7 -5
- package/api/src/queues/discount-status.ts +9 -6
- package/api/src/queues/event.ts +41 -11
- package/api/src/queues/exchange-rate-health.ts +49 -30
- package/api/src/queues/invoice.ts +18 -15
- package/api/src/queues/notification.ts +14 -7
- package/api/src/queues/payment.ts +64 -37
- package/api/src/queues/payout.ts +37 -21
- package/api/src/queues/refund.ts +36 -18
- package/api/src/queues/subscription.ts +83 -53
- package/api/src/queues/token-transfer.ts +15 -10
- package/api/src/queues/usage-record.ts +8 -5
- package/api/src/queues/vendors/commission.ts +7 -5
- package/api/src/queues/vendors/fulfillment-coordinator.ts +17 -13
- package/api/src/queues/vendors/fulfillment.ts +4 -2
- package/api/src/queues/vendors/return-processor.ts +5 -3
- package/api/src/queues/vendors/return-scanner.ts +5 -4
- package/api/src/queues/vendors/status-check.ts +10 -7
- package/api/src/queues/webhook.ts +60 -32
- package/api/src/routes/connect/shared.ts +1 -2
- package/api/src/routes/connect/subscribe.ts +3 -3
- package/api/src/routes/{archive.ts → hono/archive.ts} +69 -64
- package/api/src/routes/{auto-recharge-configs.ts → hono/auto-recharge-configs.ts} +39 -28
- package/api/src/routes/{checkout-sessions.ts → hono/checkout-sessions.ts} +790 -923
- package/api/src/routes/{coupons.ts → hono/coupons.ts} +93 -76
- package/api/src/routes/{credit-grants.ts → hono/credit-grants.ts} +140 -126
- package/api/src/routes/hono/credit-tokens.ts +43 -0
- package/api/src/routes/{credit-transactions.ts → hono/credit-transactions.ts} +37 -29
- package/api/src/routes/{customers.ts → hono/customers.ts} +199 -224
- package/api/src/routes/{donations.ts → hono/donations.ts} +41 -32
- package/api/src/routes/{entitlements.ts → hono/entitlements.ts} +28 -25
- package/api/src/routes/{events.ts → hono/events.ts} +107 -71
- package/api/src/routes/{exchange-rate-providers.ts → hono/exchange-rate-providers.ts} +138 -126
- package/api/src/routes/hono/exchange-rates.ts +77 -0
- package/api/src/routes/hono/index.ts +115 -0
- package/api/src/routes/{integrations → hono/integrations}/app-store.ts +68 -48
- package/api/src/routes/{integrations → hono/integrations}/google-play.ts +78 -58
- package/api/src/routes/hono/integrations/stripe.ts +74 -0
- package/api/src/routes/{invoices.ts → hono/invoices.ts} +253 -244
- package/api/src/routes/{meter-events.ts → hono/meter-events.ts} +120 -110
- package/api/src/routes/hono/meters.ts +288 -0
- package/api/src/routes/hono/passports.ts +73 -0
- package/api/src/routes/{payment-currencies.ts → hono/payment-currencies.ts} +219 -197
- package/api/src/routes/{payment-intents.ts → hono/payment-intents.ts} +136 -132
- package/api/src/routes/{payment-links.ts → hono/payment-links.ts} +145 -128
- package/api/src/routes/{payment-methods.ts → hono/payment-methods.ts} +125 -93
- package/api/src/routes/{payment-stats.ts → hono/payment-stats.ts} +30 -25
- package/api/src/routes/{payouts.ts → hono/payouts.ts} +55 -47
- package/api/src/routes/{prices.ts → hono/prices.ts} +265 -242
- package/api/src/routes/{pricing-table.ts → hono/pricing-table.ts} +94 -87
- package/api/src/routes/{products.ts → hono/products.ts} +172 -159
- package/api/src/routes/{promotion-codes.ts → hono/promotion-codes.ts} +207 -185
- package/api/src/routes/hono/redirect.ts +24 -0
- package/api/src/routes/{refunds.ts → hono/refunds.ts} +98 -83
- package/api/src/routes/{settings.ts → hono/settings.ts} +64 -55
- package/api/src/routes/{subscription-items.ts → hono/subscription-items.ts} +64 -57
- package/api/src/routes/{subscriptions.ts → hono/subscriptions.ts} +475 -528
- package/api/src/routes/{tax-rates.ts → hono/tax-rates.ts} +71 -70
- package/api/src/routes/hono/tool.ts +69 -0
- package/api/src/routes/{usage-records.ts → hono/usage-records.ts} +47 -42
- package/api/src/routes/{vendor.ts → hono/vendor.ts} +315 -167
- package/api/src/routes/{webhook-attempts.ts → hono/webhook-attempts.ts} +17 -13
- package/api/src/routes/hono/webhook-endpoints.ts +126 -0
- package/api/src/service.ts +814 -0
- package/api/src/store/migrations/20230911-seeding.ts +2 -1
- package/api/src/store/migrations/20260609-remove-did-space-jobs.ts +23 -0
- package/api/src/store/migrations/20260610-tenant-columns.ts +40 -0
- package/api/src/store/migrations/20260611-tenant-backfill.ts +33 -0
- package/api/src/store/models/auto-recharge-config.ts +22 -10
- package/api/src/store/models/checkout-session.ts +15 -14
- package/api/src/store/models/coupon.ts +29 -20
- package/api/src/store/models/credit-grant.ts +38 -29
- package/api/src/store/models/credit-transaction.ts +32 -21
- package/api/src/store/models/customer.ts +19 -17
- package/api/src/store/models/discount.ts +11 -2
- package/api/src/store/models/entitlement-grant.ts +21 -9
- package/api/src/store/models/entitlement-product.ts +21 -9
- package/api/src/store/models/entitlement.ts +19 -10
- package/api/src/store/models/event.ts +18 -9
- package/api/src/store/models/exchange-rate-provider.ts +17 -4
- package/api/src/store/models/invoice-item.ts +18 -9
- package/api/src/store/models/invoice.ts +16 -8
- package/api/src/store/models/meter-event.ts +27 -9
- package/api/src/store/models/meter.ts +31 -22
- package/api/src/store/models/payment-currency.ts +25 -8
- package/api/src/store/models/payment-intent.ts +15 -6
- package/api/src/store/models/payment-link.ts +15 -6
- package/api/src/store/models/payment-method.ts +38 -22
- package/api/src/store/models/payment-stat.ts +18 -9
- package/api/src/store/models/payout.ts +15 -6
- package/api/src/store/models/price-quote.ts +17 -8
- package/api/src/store/models/price.ts +24 -12
- package/api/src/store/models/pricing-table.ts +29 -20
- package/api/src/store/models/product-vendor.ts +20 -10
- package/api/src/store/models/product.ts +15 -6
- package/api/src/store/models/promotion-code.ts +14 -6
- package/api/src/store/models/refund.ts +15 -6
- package/api/src/store/models/revenue-snapshot.ts +21 -9
- package/api/src/store/models/setting.ts +18 -9
- package/api/src/store/models/setup-intent.ts +36 -27
- package/api/src/store/models/subscription-item.ts +21 -9
- package/api/src/store/models/subscription-schedule.ts +21 -9
- package/api/src/store/models/subscription.ts +21 -10
- package/api/src/store/models/tax-rate.ts +29 -21
- package/api/src/store/models/usage-record.ts +11 -2
- package/api/src/store/models/webhook-attempt.ts +18 -9
- package/api/src/store/models/webhook-endpoint.ts +18 -9
- package/api/src/store/scoped-core.ts +55 -0
- package/api/src/store/scoped.ts +247 -0
- package/api/src/store/sequelize.ts +82 -23
- package/api/src/store/sql-migrations.ts +20 -0
- package/api/src/store/tenant-backfill.ts +260 -0
- package/api/src/store/tenant-model.ts +124 -0
- package/api/src/store/tenant-tables.ts +50 -0
- package/api/tests/bootstrap/bootstrap.spec.ts +162 -0
- package/api/tests/crons/tenant-fanout.spec.ts +158 -0
- package/api/tests/embedded/embedded-multi-mode-d3.spec.ts +257 -0
- package/api/tests/fixtures/bare-query-violation.ts +13 -0
- package/api/tests/fixtures/core-env-violation.ts +10 -0
- package/api/tests/fixtures/host-read-violation.ts +19 -0
- package/api/tests/fixtures/tenants.ts +4 -0
- package/api/tests/integrations/iap-tenant.spec.ts +284 -0
- package/api/tests/libs/archive-query.spec.ts +26 -0
- package/api/tests/libs/audit-tenant.spec.ts +153 -0
- package/api/tests/libs/context.spec.ts +204 -0
- package/api/tests/libs/core-config.spec.ts +115 -0
- package/api/tests/libs/cron-driver-d2.spec.ts +237 -0
- package/api/tests/libs/crons-conservation-d2.spec.ts +52 -0
- package/api/tests/libs/did-connect-runtime-js.spec.ts +98 -0
- package/api/tests/libs/did-connect-tenant-identity.spec.ts +159 -0
- package/api/tests/libs/lock-tenant.spec.ts +66 -0
- package/api/tests/libs/scoped.spec.ts +222 -0
- package/api/tests/libs/secrets-facade.spec.ts +52 -0
- package/api/tests/libs/service-host.spec.ts +37 -0
- package/api/tests/libs/tenancy-slot-authority.spec.ts +209 -0
- package/api/tests/libs/tenant-middleware.spec.ts +42 -0
- package/api/tests/libs/tenant-scanner.spec.ts +120 -0
- package/api/tests/middlewares/hono/cdn.spec.ts +70 -0
- package/api/tests/middlewares/hono/context.spec.ts +113 -0
- package/api/tests/middlewares/hono/csrf.spec.ts +136 -0
- package/api/tests/middlewares/hono/fallback.spec.ts +67 -0
- package/api/tests/middlewares/hono/pipeline.spec.ts +47 -0
- package/api/tests/middlewares/hono/security.spec.ts +181 -0
- package/api/tests/middlewares/hono/session.spec.ts +42 -0
- package/api/tests/middlewares/hono/xss.spec.ts +81 -0
- package/api/tests/models/tenant-backfill.spec.ts +287 -0
- package/api/tests/models/tenant-columns-model.spec.ts +46 -0
- package/api/tests/models/tenant-columns.spec.ts +161 -0
- package/api/tests/queues/credit-consume-batch.spec.ts +8 -1
- package/api/tests/queues/credit-consume.spec.ts +8 -1
- package/api/tests/queues/event-tenant.spec.ts +292 -0
- package/api/tests/queues/exchange-rate-health-tenant-d6.spec.ts +62 -0
- package/api/tests/queues/queue-parity.spec.ts +249 -0
- package/api/tests/queues/queue-runtime-surface.spec.ts +277 -0
- package/api/tests/queues/queue-teardown-d2.spec.ts +127 -0
- package/api/tests/queues/tenant-matrix-a.spec.ts +245 -0
- package/api/tests/queues/tenant-matrix-b.spec.ts +168 -0
- package/api/tests/routes/connect/hono-attach.spec.ts +107 -0
- package/api/tests/service/collapse.spec.ts +96 -0
- package/api/tests/service/didconnect-storage-slot.spec.ts +60 -0
- package/api/tests/service/fail-closed-http.spec.ts +79 -0
- package/api/tests/service/static-arc-handler.spec.ts +101 -0
- package/api/tests/service/static-externalized.spec.ts +48 -0
- package/api/tests/store/tenant-crosscut.spec.ts +202 -0
- package/api/tests/store/tenant-model-spike.spec.ts +177 -0
- package/api/tests/store/tenant-model.spec.ts +162 -0
- package/api/tests/store/tenant-residual.spec.ts +196 -0
- package/api/third.d.ts +4 -0
- package/blocklet.yml +1 -1
- package/cloudflare/MIGRATION-RUNBOOK.md +3 -8
- package/cloudflare/README.md +34 -27
- package/cloudflare/STAGING-MIGRATION-GUIDE.md +3 -15
- package/cloudflare/build.ts +33 -13
- package/cloudflare/cf-adapter.ts +419 -0
- package/cloudflare/did-connect-runtime.ts +96 -0
- package/cloudflare/did-connect-token-storage.ts +151 -0
- package/cloudflare/esbuild-cf-config.cjs +407 -0
- package/cloudflare/migrations/0006_tenant_columns.sql +46 -0
- package/cloudflare/migrations/0007_tenant_backfill_indexes.sql +65 -0
- package/cloudflare/migrations/0008_schema_parity.sql +16 -0
- package/cloudflare/migrations/0009_remove_did_space_jobs.sql +5 -0
- package/cloudflare/queue-runtime-mode.ts +13 -0
- package/cloudflare/run-build.js +33 -403
- package/cloudflare/scripts/cf-package-import-probe.mjs +90 -0
- package/cloudflare/scripts/didconnect-mock-smoke.mjs +140 -0
- package/cloudflare/shims/blocklet-sdk/asset-host-transformer.ts +20 -0
- package/cloudflare/shims/blocklet-sdk/config.ts +8 -1
- package/cloudflare/shims/blocklet-sdk/login.ts +12 -0
- package/cloudflare/shims/blocklet-sdk/service-api.ts +14 -0
- package/cloudflare/shims/blocklet-sdk/session.ts +4 -2
- package/cloudflare/shims/blocklet-sdk/util-constants.ts +8 -0
- package/cloudflare/shims/blocklet-sdk/wallet-authenticator.ts +16 -1
- package/cloudflare/shims/blocklet-sdk/wallet-handler.ts +18 -3
- package/cloudflare/shims/cron.ts +38 -158
- package/cloudflare/shims/events.ts +124 -0
- package/cloudflare/shims/fastq.ts +15 -1
- package/cloudflare/shims/nedb-storage.ts +16 -8
- package/cloudflare/shims/xss.ts +8 -0
- package/cloudflare/tenant-middleware.ts +36 -0
- package/cloudflare/tests/cf-adapter.spec.ts +244 -0
- package/cloudflare/tests/did-connect-token-storage.spec.ts +105 -0
- package/cloudflare/tests/tenant-middleware.spec.ts +160 -0
- package/cloudflare/tests/worker-handler-gate.spec.ts +69 -0
- package/cloudflare/vite.config.ts +53 -45
- package/cloudflare/worker.ts +261 -448
- package/cloudflare/wrangler.json +0 -6
- package/cloudflare/wrangler.jsonc +0 -6
- package/cloudflare/wrangler.local-e2e.jsonc +25 -0
- package/cloudflare/wrangler.staging.json +0 -6
- package/jest.config.js +3 -1
- package/package.json +33 -38
- package/scripts/bootstrap-inject.ts +166 -0
- package/scripts/core-env-whitelist.json +1 -0
- package/scripts/e2e-12b-runtime.ts +149 -0
- package/scripts/e2e-core-config.ts +125 -0
- package/scripts/e2e-d1-tenancy.ts +116 -0
- package/scripts/e2e-d2-cron-queue.ts +139 -0
- package/scripts/e2e-d3-embedded-multi.ts +171 -0
- package/scripts/e2e-hono-s2.ts +125 -0
- package/scripts/e2e-hono-s3e.ts +135 -0
- package/scripts/e2e-hono-s4.ts +114 -0
- package/scripts/e2e-migration-contract.ts +100 -0
- package/scripts/e2e-s0.ts +61 -0
- package/scripts/e2e-s1.ts +107 -0
- package/scripts/e2e-s2.ts +178 -0
- package/scripts/e2e-s3.ts +110 -0
- package/scripts/e2e-s4.ts +191 -0
- package/scripts/e2e-s5.ts +139 -0
- package/scripts/e2e-s6.ts +127 -0
- package/scripts/e2e-tenant-model.ts +119 -0
- package/scripts/e2e-tenant-worker.ts +199 -0
- package/scripts/gen-sql-migrations.js +46 -0
- package/scripts/phase8-codemod.js +219 -0
- package/scripts/phase9a-env-getters-codemod.js +82 -0
- package/scripts/scan-core-env.js +109 -0
- package/scripts/scan-tenant-queries.js +235 -0
- package/scripts/schema-drift-guard.ts +210 -0
- package/scripts/tenant-scan-whitelist.json +1 -0
- package/src/app.tsx +2 -1
- package/src/env.d.ts +13 -1
- package/src/libs/service-host.ts +13 -0
- package/tsconfig.json +1 -1
- package/vite.arc.config.ts +159 -0
- package/api/src/libs/did-space.ts +0 -235
- package/api/src/libs/middleware.ts +0 -50
- package/api/src/libs/security.ts +0 -192
- package/api/src/queues/space.ts +0 -662
- package/api/src/routes/credit-tokens.ts +0 -38
- package/api/src/routes/exchange-rates.ts +0 -87
- package/api/src/routes/index.ts +0 -142
- package/api/src/routes/integrations/stripe.ts +0 -61
- package/api/src/routes/meters.ts +0 -274
- package/api/src/routes/passports.ts +0 -68
- package/api/src/routes/redirect.ts +0 -20
- package/api/src/routes/tool.ts +0 -65
- package/api/src/routes/webhook-endpoints.ts +0 -126
- package/api/tests/routes/credit-grants.spec.ts +0 -1261
- package/cloudflare/did-connect-auth.ts +0 -527
- package/cloudflare/shims/did-space-js.ts +0 -17
- package/cloudflare/shims/did-space.ts +0 -11
- package/cloudflare/shims/express-compat/index.ts +0 -80
- package/cloudflare/shims/express-compat/types.ts +0 -41
- package/cloudflare/shims/lock.ts +0 -115
- package/cloudflare/shims/queue.ts +0 -611
- package/cloudflare/tests/shims/queue-delayed-persist.spec.ts +0 -87
- package/cloudflare/tests/shims/queue-scheduled.spec.ts +0 -186
|
@@ -1,527 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DID Connect authentication for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Since the published @arcblock/did-connect-js@1.28.0 does not include the Hono adapter,
|
|
5
|
-
* we port the adapter logic here. When a newer version with native Hono support ships,
|
|
6
|
-
* this file can be replaced by a direct import.
|
|
7
|
-
*
|
|
8
|
-
* Reference: blockchain/did/did-connect/src/adapters/hono.ts
|
|
9
|
-
*/
|
|
10
|
-
import { WalletAuthenticator, WalletHandlers } from '@arcblock/did-connect-js';
|
|
11
|
-
// abt-wallet 4.20+ is dual-decode (both CBOR + protobuf), so we can go back
|
|
12
|
-
// to @ocap/client/encode's CBOR-only txEncoder. Drops ~300KB google-protobuf
|
|
13
|
-
// runtime from the worker bundle. Requires abt-wallet >= 4.20.
|
|
14
|
-
// fetchContext is also exported so we can pre-warm the module-level cache
|
|
15
|
-
// at isolate init time — avoids the first-request 8s merchant timeout that
|
|
16
|
-
// comes from fetchContext hitting beta chain (2 GraphQL queries in parallel).
|
|
17
|
-
import { createTxEncoder, fetchContext } from '@ocap/client/encode';
|
|
18
|
-
import * as Mcrypto from '@ocap/mcrypto';
|
|
19
|
-
import { fromSecretKey } from '@ocap/wallet';
|
|
20
|
-
import { EventEmitter } from 'events';
|
|
21
|
-
|
|
22
|
-
// Import original connect handlers — esbuild aliases handle all dependency replacements
|
|
23
|
-
import collectHandlers from '../api/src/routes/connect/collect';
|
|
24
|
-
import collectBatchHandlers from '../api/src/routes/connect/collect-batch';
|
|
25
|
-
import payHandlers from '../api/src/routes/connect/pay';
|
|
26
|
-
import setupHandlers from '../api/src/routes/connect/setup';
|
|
27
|
-
import subscribeHandlers from '../api/src/routes/connect/subscribe';
|
|
28
|
-
import changePaymentHandlers from '../api/src/routes/connect/change-payment';
|
|
29
|
-
import changePlanHandlers from '../api/src/routes/connect/change-plan';
|
|
30
|
-
import changePayerHandlers from '../api/src/routes/connect/change-payer';
|
|
31
|
-
import rechargeHandlers from '../api/src/routes/connect/recharge';
|
|
32
|
-
import rechargeAccountHandlers from '../api/src/routes/connect/recharge-account';
|
|
33
|
-
import delegationHandlers from '../api/src/routes/connect/delegation';
|
|
34
|
-
import overdraftProtectionHandlers from '../api/src/routes/connect/overdraft-protection';
|
|
35
|
-
import reStakeHandlers from '../api/src/routes/connect/re-stake';
|
|
36
|
-
import autoRechargeAuthHandlers from '../api/src/routes/connect/auto-recharge-auth';
|
|
37
|
-
|
|
38
|
-
const walletType = {
|
|
39
|
-
role: Mcrypto.types.RoleType.ROLE_APPLICATION,
|
|
40
|
-
pk: Mcrypto.types.KeyType.ED25519,
|
|
41
|
-
hash: Mcrypto.types.HashType.SHA3,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
// ---------------------------------------------------------------------------
|
|
45
|
-
// CloudflareKVStorage – ported from blockchain/did/did-connect/src/storage/kv.ts
|
|
46
|
-
// Not yet published in @arcblock/did-connect-js@1.28.0
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
|
|
49
|
-
// D1-based storage for DID Connect tokens.
|
|
50
|
-
// Replaces KV which is eventually consistent across datacenters (up to 60s delay).
|
|
51
|
-
// D1 is strongly consistent — writes are immediately visible to all readers.
|
|
52
|
-
// This fixes mobile wallet scanning: wallet POST auth writes to datacenter A,
|
|
53
|
-
// browser status polling reads from datacenter B, and sees the update immediately.
|
|
54
|
-
class CloudflareD1Storage extends EventEmitter {
|
|
55
|
-
private ttl: number;
|
|
56
|
-
|
|
57
|
-
constructor(options: { ttl?: number } = {}) {
|
|
58
|
-
super();
|
|
59
|
-
this.ttl = options.ttl ?? 300;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private _getDB() {
|
|
63
|
-
const env = (globalThis as any).__CF_ENV__;
|
|
64
|
-
const db = env?.DB;
|
|
65
|
-
if (!db) {
|
|
66
|
-
console.error('[D1Storage] DB not available - __CF_ENV__ missing or no DB binding');
|
|
67
|
-
return db;
|
|
68
|
-
}
|
|
69
|
-
return db.withSession('first-primary');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async create(token: string, status = 'created') {
|
|
73
|
-
try {
|
|
74
|
-
const db = this._getDB();
|
|
75
|
-
if (!db) throw new Error('DB not available');
|
|
76
|
-
const record = { token, status };
|
|
77
|
-
const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
|
|
78
|
-
await db
|
|
79
|
-
.prepare('INSERT OR REPLACE INTO _did_connect_tokens (token, data, expires_at) VALUES (?, ?, ?)')
|
|
80
|
-
.bind(token, JSON.stringify(record), expiresAt)
|
|
81
|
-
.run();
|
|
82
|
-
this.emit('create', record);
|
|
83
|
-
return record;
|
|
84
|
-
} catch (err: any) {
|
|
85
|
-
console.error('[D1Storage] create failed:', token, err?.message || err);
|
|
86
|
-
throw err;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async read(token: string) {
|
|
91
|
-
try {
|
|
92
|
-
const db = this._getDB();
|
|
93
|
-
if (!db) return null;
|
|
94
|
-
const now = Math.floor(Date.now() / 1000);
|
|
95
|
-
const row = await db
|
|
96
|
-
.prepare('SELECT data FROM _did_connect_tokens WHERE token = ? AND expires_at > ?')
|
|
97
|
-
.bind(token, now)
|
|
98
|
-
.first();
|
|
99
|
-
if (!row) return null;
|
|
100
|
-
return JSON.parse(row.data as string);
|
|
101
|
-
} catch (err: any) {
|
|
102
|
-
console.error('[D1Storage] read failed:', token, err?.message || err);
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
update(token: string, updates: Record<string, any>) {
|
|
108
|
-
// did-connect-js's handlers/util.ts onProcessError calls tokenStorage.update
|
|
109
|
-
// without awaiting it (fire-and-forget). On CF Workers a non-awaited Promise
|
|
110
|
-
// is terminated when the request handler returns, so the UPDATE never hits
|
|
111
|
-
// D1 and the token stays at "scanned" forever — the wallet UI then loops on
|
|
112
|
-
// `status: scanned` and shows "validating..." indefinitely.
|
|
113
|
-
//
|
|
114
|
-
// We wrap the real write in a promise, and register it via the global
|
|
115
|
-
// ctx.waitUntil (exposed as __cfWaitUntil__ in worker.ts) so the runtime
|
|
116
|
-
// keeps the isolate alive until the D1 write finishes, regardless of
|
|
117
|
-
// whether the caller awaits us.
|
|
118
|
-
const promise = (async () => {
|
|
119
|
-
try {
|
|
120
|
-
const existing = await this.read(token);
|
|
121
|
-
if (!existing) return null;
|
|
122
|
-
|
|
123
|
-
delete updates.token;
|
|
124
|
-
const merged = { ...existing, ...updates };
|
|
125
|
-
const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
|
|
126
|
-
const db = this._getDB();
|
|
127
|
-
if (!db) throw new Error('DB not available');
|
|
128
|
-
await db
|
|
129
|
-
.prepare('UPDATE _did_connect_tokens SET data = ?, expires_at = ? WHERE token = ?')
|
|
130
|
-
.bind(JSON.stringify(merged), expiresAt, token)
|
|
131
|
-
.run();
|
|
132
|
-
this.emit('update', merged);
|
|
133
|
-
return merged;
|
|
134
|
-
} catch (err: any) {
|
|
135
|
-
console.error('[D1Storage] update failed:', token, err?.message || err);
|
|
136
|
-
throw err;
|
|
137
|
-
}
|
|
138
|
-
})();
|
|
139
|
-
|
|
140
|
-
const waitUntil = (globalThis as any).__cfWaitUntil__ as ((p: Promise<any>) => void) | undefined;
|
|
141
|
-
if (typeof waitUntil === 'function') {
|
|
142
|
-
// Swallow rejection in waitUntil — the inner promise will still reject
|
|
143
|
-
// for any caller that does await us.
|
|
144
|
-
waitUntil(promise.catch(() => {}));
|
|
145
|
-
}
|
|
146
|
-
return promise;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async delete(token: string) {
|
|
150
|
-
try {
|
|
151
|
-
const existing = await this.read(token);
|
|
152
|
-
if (existing) {
|
|
153
|
-
this.emit('destroy', existing);
|
|
154
|
-
}
|
|
155
|
-
const db = this._getDB();
|
|
156
|
-
if (!db) return;
|
|
157
|
-
await db.prepare('DELETE FROM _did_connect_tokens WHERE token = ?').bind(token).run();
|
|
158
|
-
} catch (err: any) {
|
|
159
|
-
console.error('[D1Storage] delete failed:', token, err?.message || err);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
async exist(token: string, did?: string) {
|
|
164
|
-
const record = await this.read(token);
|
|
165
|
-
if (!record) return false;
|
|
166
|
-
if (did) return record.did === did;
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// ---------------------------------------------------------------------------
|
|
172
|
-
// Hono adapter – wraps Express-style (req, res, next) handlers for Hono
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
|
|
175
|
-
function parseCookieHeader(header: string): Record<string, string> {
|
|
176
|
-
const cookies: Record<string, string> = {};
|
|
177
|
-
if (!header) return cookies;
|
|
178
|
-
for (const pair of header.split(';')) {
|
|
179
|
-
const idx = pair.indexOf('=');
|
|
180
|
-
if (idx > 0) {
|
|
181
|
-
const key = pair.slice(0, idx).trim();
|
|
182
|
-
const val = pair.slice(idx + 1).trim();
|
|
183
|
-
cookies[key] = decodeURIComponent(val);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return cookies;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function negotiateLanguage(acceptHeader: string, ...langs: string[]): string | false {
|
|
190
|
-
if (!acceptHeader || langs.length === 0) return langs[0] || false;
|
|
191
|
-
const lower = acceptHeader.toLowerCase();
|
|
192
|
-
for (const lang of langs) {
|
|
193
|
-
const prefix = lang.toLowerCase().split('-')[0];
|
|
194
|
-
if (lower.includes(lang.toLowerCase()) || lower.includes(prefix)) {
|
|
195
|
-
return lang;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return langs[0] || false;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
function createHonoRequest(c: any, bodyCache: any = {}): any {
|
|
202
|
-
const url = new URL(c.req.url);
|
|
203
|
-
const rawHeaders: Record<string, string> = {};
|
|
204
|
-
if (c.req.raw?.headers) {
|
|
205
|
-
c.req.raw.headers.forEach((value: string, key: string) => {
|
|
206
|
-
rawHeaders[key.toLowerCase()] = value;
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
body: bodyCache,
|
|
212
|
-
query: Object.fromEntries(url.searchParams.entries()),
|
|
213
|
-
params: typeof c.req.param === 'function' ? c.req.param() : {},
|
|
214
|
-
headers: rawHeaders,
|
|
215
|
-
cookies: parseCookieHeader(rawHeaders.cookie || ''),
|
|
216
|
-
protocol: url.protocol.replace(':', ''),
|
|
217
|
-
originalUrl: url.pathname + url.search,
|
|
218
|
-
get(name: string) {
|
|
219
|
-
return rawHeaders[name.toLowerCase()];
|
|
220
|
-
},
|
|
221
|
-
header(name: string) {
|
|
222
|
-
return rawHeaders[name.toLowerCase()];
|
|
223
|
-
},
|
|
224
|
-
acceptsLanguages(...langs: string[]) {
|
|
225
|
-
return negotiateLanguage(rawHeaders['accept-language'] || '', ...langs);
|
|
226
|
-
},
|
|
227
|
-
raw: c,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function createHonoResponse(): any {
|
|
232
|
-
let result: { statusCode: number; body: any } | null = null;
|
|
233
|
-
|
|
234
|
-
return {
|
|
235
|
-
jsonp(data: any) {
|
|
236
|
-
result = { statusCode: 200, body: data };
|
|
237
|
-
},
|
|
238
|
-
json(data: any) {
|
|
239
|
-
result = { statusCode: 200, body: data };
|
|
240
|
-
},
|
|
241
|
-
status(code: number) {
|
|
242
|
-
return {
|
|
243
|
-
json(data: any) {
|
|
244
|
-
result = { statusCode: code, body: data };
|
|
245
|
-
},
|
|
246
|
-
};
|
|
247
|
-
},
|
|
248
|
-
_getResult() {
|
|
249
|
-
return result;
|
|
250
|
-
},
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Wrap a chain of Express-style middlewares + handler into a single Hono handler.
|
|
256
|
-
*/
|
|
257
|
-
function wrapHandler(
|
|
258
|
-
middlewares: Array<(req: any, res: any, next: () => void) => any>,
|
|
259
|
-
handler: (req: any, res: any) => Promise<void>
|
|
260
|
-
) {
|
|
261
|
-
return async (c: any) => {
|
|
262
|
-
// Ensure __CF_ENV__ is available for D1Storage
|
|
263
|
-
if (!(globalThis as any).__CF_ENV__) {
|
|
264
|
-
(globalThis as any).__CF_ENV__ = c.env;
|
|
265
|
-
}
|
|
266
|
-
let body = {};
|
|
267
|
-
try {
|
|
268
|
-
const text = await c.req.text();
|
|
269
|
-
if (text) {
|
|
270
|
-
const contentType = c.req.header('content-type') || '';
|
|
271
|
-
if (contentType.includes('json')) {
|
|
272
|
-
body = JSON.parse(text);
|
|
273
|
-
} else if (contentType.includes('urlencoded')) {
|
|
274
|
-
body = Object.fromEntries(new URLSearchParams(text).entries());
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
} catch {
|
|
278
|
-
// Body parsing failed
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const req = createHonoRequest(c, body);
|
|
282
|
-
const res = createHonoResponse();
|
|
283
|
-
|
|
284
|
-
// Run middlewares
|
|
285
|
-
for (const mw of middlewares) {
|
|
286
|
-
let nextCalled = false;
|
|
287
|
-
await mw(req, res, () => {
|
|
288
|
-
nextCalled = true;
|
|
289
|
-
});
|
|
290
|
-
if (!nextCalled) {
|
|
291
|
-
const r = res._getResult();
|
|
292
|
-
if (r) return c.json(r.body, r.statusCode);
|
|
293
|
-
return c.json({ error: 'Unknown error' }, 500);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Run handler
|
|
298
|
-
try {
|
|
299
|
-
await handler(req, res);
|
|
300
|
-
} catch (err: any) {
|
|
301
|
-
console.error(
|
|
302
|
-
'[DID Connect] handler error:',
|
|
303
|
-
err?.message || err,
|
|
304
|
-
err?.stack?.split('\n').slice(0, 5).join('\n')
|
|
305
|
-
);
|
|
306
|
-
// Write error to D1 for debugging (console.error may not be visible in tail)
|
|
307
|
-
try {
|
|
308
|
-
const db = (globalThis as any).__CF_ENV__?.DB;
|
|
309
|
-
if (db) {
|
|
310
|
-
await db
|
|
311
|
-
.prepare('INSERT OR REPLACE INTO _locks (name, owner, expires_at) VALUES (?, ?, 0)')
|
|
312
|
-
.bind('debug-did-error', `${err?.message || err}`.substring(0, 200))
|
|
313
|
-
.run();
|
|
314
|
-
}
|
|
315
|
-
} catch {
|
|
316
|
-
/* ignore */
|
|
317
|
-
}
|
|
318
|
-
return c.json({ error: err?.message || 'Internal server error' }, 500);
|
|
319
|
-
}
|
|
320
|
-
const r = res._getResult();
|
|
321
|
-
return c.json(r?.body ?? {}, r?.statusCode ?? 200);
|
|
322
|
-
};
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Monkey-patch the WalletHandlers.attach method to support Hono apps.
|
|
327
|
-
*
|
|
328
|
-
* The published @arcblock/did-connect-js expects Express. We intercept attach()
|
|
329
|
-
* and register routes on the Hono app directly using wrapHandler().
|
|
330
|
-
*/
|
|
331
|
-
function createHonoCompatHandlers(opts: { tokenStorage: any; authenticator: any }): WalletHandlers {
|
|
332
|
-
const handlers = new WalletHandlers(opts);
|
|
333
|
-
const originalAttach = handlers.attach.bind(handlers);
|
|
334
|
-
|
|
335
|
-
// Override attach to use Hono-compatible route registration
|
|
336
|
-
(handlers as any).attach = function attachHono(config: any) {
|
|
337
|
-
const { app, action, ...rest } = config;
|
|
338
|
-
|
|
339
|
-
// Create a fake Express-like app that collects routes
|
|
340
|
-
const routes: Array<{
|
|
341
|
-
method: string;
|
|
342
|
-
path: string;
|
|
343
|
-
middlewares: Function[];
|
|
344
|
-
handler: Function;
|
|
345
|
-
}> = [];
|
|
346
|
-
|
|
347
|
-
const fakeApp: any = {
|
|
348
|
-
get(path: string, ...fns: Function[]) {
|
|
349
|
-
routes.push({ method: 'get', path, middlewares: fns.slice(0, -1), handler: fns[fns.length - 1] });
|
|
350
|
-
},
|
|
351
|
-
post(path: string, ...fns: Function[]) {
|
|
352
|
-
routes.push({ method: 'post', path, middlewares: fns.slice(0, -1), handler: fns[fns.length - 1] });
|
|
353
|
-
},
|
|
354
|
-
use(_path: string, _middleware: any) {
|
|
355
|
-
// CORS is handled by Hono's cors middleware already
|
|
356
|
-
},
|
|
357
|
-
};
|
|
358
|
-
|
|
359
|
-
// Call original attach with fake app to collect routes
|
|
360
|
-
originalAttach({ app: fakeApp, action, ...rest });
|
|
361
|
-
|
|
362
|
-
// Now register collected routes on the real Hono app
|
|
363
|
-
const prefix = (handlers as any).options?.prefix || '/api/did';
|
|
364
|
-
|
|
365
|
-
// Add CORS for DID Connect routes
|
|
366
|
-
app.use(`${prefix}/${action}/*`, async (c: any, next: () => Promise<void>) => {
|
|
367
|
-
c.header('Access-Control-Allow-Origin', '*');
|
|
368
|
-
c.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
369
|
-
c.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
370
|
-
if (c.req.method === 'OPTIONS') {
|
|
371
|
-
return c.text('', 204);
|
|
372
|
-
}
|
|
373
|
-
await next();
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
for (const route of routes) {
|
|
377
|
-
const wrapped = wrapHandler(route.middlewares as any[], route.handler as any);
|
|
378
|
-
if (route.method === 'get') {
|
|
379
|
-
app.get(route.path, wrapped);
|
|
380
|
-
} else if (route.method === 'post') {
|
|
381
|
-
app.post(route.path, wrapped);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
return handlers;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// ---------------------------------------------------------------------------
|
|
390
|
-
// Public API
|
|
391
|
-
// ---------------------------------------------------------------------------
|
|
392
|
-
|
|
393
|
-
export function initAuth(kv: KVNamespace, appSK: string) {
|
|
394
|
-
const wallet = fromSecretKey(appSK, walletType);
|
|
395
|
-
const tokenStorage = new CloudflareD1Storage({ ttl: 300 });
|
|
396
|
-
// Trailing slash is REQUIRED — without it the host 50% times out (verified 2026-04-20).
|
|
397
|
-
// Matches the format used by D1 payment_methods.settings.arcblock.api_host.
|
|
398
|
-
const chainHost = 'https://beta.abtnetwork.io/api/';
|
|
399
|
-
|
|
400
|
-
// Pre-warm @ocap/client/encode's module-level context cache. The first
|
|
401
|
-
// createTxEncoder()(...) call internally awaits fetchContext, which POSTs
|
|
402
|
-
// getChainInfo + getForgeState to beta — ~1-3s on warm isolates, more on
|
|
403
|
-
// cold. When `genRequestedClaims` is called by the merchant and triggers
|
|
404
|
-
// the encoder, merchant's did-connect-js aborts after 8s. Firing the fetch
|
|
405
|
-
// here at init (module load) lets the cache populate while the worker sets
|
|
406
|
-
// up the rest of the request pipeline.
|
|
407
|
-
fetchContext(chainHost).catch((err) => {
|
|
408
|
-
// Non-fatal: on failure the first real request will retry via the
|
|
409
|
-
// encoder's own fetchContext call.
|
|
410
|
-
console.warn('[initAuth] pre-warm chainInfo failed:', err?.message);
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
const authenticator = new WalletAuthenticator({
|
|
414
|
-
wallet: wallet.toJSON(),
|
|
415
|
-
appInfo: ({ baseUrl }: { baseUrl: string }) => ({
|
|
416
|
-
name: 'Payment Kit',
|
|
417
|
-
description: 'Payment Kit on Cloudflare Workers',
|
|
418
|
-
icon: 'https://www.arcblock.io/favicon.ico',
|
|
419
|
-
link: baseUrl,
|
|
420
|
-
}),
|
|
421
|
-
chainInfo: {
|
|
422
|
-
type: 'arcblock',
|
|
423
|
-
host: chainHost,
|
|
424
|
-
id: 'beta',
|
|
425
|
-
},
|
|
426
|
-
txEncoder: createTxEncoder(),
|
|
427
|
-
// CF Workers: chain RPC to beta.abtnetwork.io + getContext warm-up can exceed
|
|
428
|
-
// the default 8s. Extend to 30s to match Node.js payment-kit behavior.
|
|
429
|
-
timeout: 30000,
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
// did-connect-js 4.0.0 natively detects Hono apps via isHonoApp()
|
|
433
|
-
const handlers = new WalletHandlers({ tokenStorage, authenticator });
|
|
434
|
-
|
|
435
|
-
return { wallet, authenticator, handlers, tokenStorage };
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Attach DID Connect routes to a Hono app.
|
|
440
|
-
*
|
|
441
|
-
* Registers the login action with full profile handling, and all payment-related
|
|
442
|
-
* DID Connect actions using the original handler implementations from
|
|
443
|
-
* api/src/routes/connect/*.ts. The handlers execute real on-chain operations
|
|
444
|
-
* (transfers, delegations, staking) via @ocap/client HTTP RPC calls, which
|
|
445
|
-
* work in CF Workers. If a handler fails to attach, it falls back to a stub.
|
|
446
|
-
*
|
|
447
|
-
* Payment actions registered:
|
|
448
|
-
* collect, collect-batch, payment, subscription, setup,
|
|
449
|
-
* change-payment, change-plan, change-payer,
|
|
450
|
-
* recharge, recharge-account,
|
|
451
|
-
* delegation, overdraft-protection, re-stake,
|
|
452
|
-
* auto-recharge-auth
|
|
453
|
-
*/
|
|
454
|
-
export function attachDIDConnectRoutes(app: any, kv: KVNamespace, appSK: string) {
|
|
455
|
-
const { handlers, tokenStorage } = initAuth(kv, appSK);
|
|
456
|
-
|
|
457
|
-
// ---- Login action (full implementation) ----
|
|
458
|
-
handlers.attach({
|
|
459
|
-
app,
|
|
460
|
-
action: 'login',
|
|
461
|
-
claims: {
|
|
462
|
-
profile: () => ({
|
|
463
|
-
description: 'Please provide your profile to login',
|
|
464
|
-
fields: ['fullName', 'email', 'avatar'],
|
|
465
|
-
}),
|
|
466
|
-
},
|
|
467
|
-
onAuth: async ({ userDid, userPk, claims, updateSession }: any) => {
|
|
468
|
-
const claim = claims.find((x: any) => x.type === 'profile');
|
|
469
|
-
const { type: _type, signature: _sig, ...rest } = claim || {};
|
|
470
|
-
await updateSession({
|
|
471
|
-
result: {
|
|
472
|
-
...rest,
|
|
473
|
-
did: userDid,
|
|
474
|
-
pk: userPk,
|
|
475
|
-
},
|
|
476
|
-
});
|
|
477
|
-
},
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
// ---- Payment DID Connect actions (real implementations) ----
|
|
481
|
-
// These use the original handlers from api/src/routes/connect/*.ts.
|
|
482
|
-
// esbuild aliases handle all dependency replacements (@blocklet/sdk, sequelize, etc.)
|
|
483
|
-
// so that @ocap/client HTTP-based RPC calls work in CF Workers.
|
|
484
|
-
const paymentHandlerList = [
|
|
485
|
-
collectHandlers,
|
|
486
|
-
collectBatchHandlers,
|
|
487
|
-
payHandlers,
|
|
488
|
-
setupHandlers,
|
|
489
|
-
subscribeHandlers,
|
|
490
|
-
changePaymentHandlers,
|
|
491
|
-
changePlanHandlers,
|
|
492
|
-
changePayerHandlers,
|
|
493
|
-
rechargeHandlers,
|
|
494
|
-
rechargeAccountHandlers,
|
|
495
|
-
delegationHandlers,
|
|
496
|
-
overdraftProtectionHandlers,
|
|
497
|
-
reStakeHandlers,
|
|
498
|
-
autoRechargeAuthHandlers,
|
|
499
|
-
];
|
|
500
|
-
|
|
501
|
-
for (const handler of paymentHandlerList) {
|
|
502
|
-
try {
|
|
503
|
-
handlers.attach({ app, ...handler });
|
|
504
|
-
console.log(`[CF DID Connect] Attached real handler: ${handler.action}`);
|
|
505
|
-
} catch (err: any) {
|
|
506
|
-
console.error(`[CF DID Connect] Failed to attach handler ${handler.action}, using stub:`, err?.message);
|
|
507
|
-
// Fallback to stub if real handler fails to attach
|
|
508
|
-
handlers.attach({
|
|
509
|
-
app,
|
|
510
|
-
action: handler.action,
|
|
511
|
-
claims: {
|
|
512
|
-
profile: () => ({
|
|
513
|
-
description: `Please connect your wallet to proceed with ${handler.action}`,
|
|
514
|
-
fields: ['fullName', 'email'],
|
|
515
|
-
}),
|
|
516
|
-
},
|
|
517
|
-
onAuth: async ({ userDid, userPk, updateSession }: any) => {
|
|
518
|
-
await updateSession({
|
|
519
|
-
result: { did: userDid, pk: userPk },
|
|
520
|
-
});
|
|
521
|
-
},
|
|
522
|
-
});
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
return { handlers, tokenStorage };
|
|
527
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
// noop shim for @blocklet/did-space-js in CF Workers
|
|
2
|
-
const noop = (..._args: any[]) => {};
|
|
3
|
-
|
|
4
|
-
export class SpaceClient {
|
|
5
|
-
constructor(..._args: any[]) {}
|
|
6
|
-
send = noop;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class GetObjectCommand {
|
|
10
|
-
constructor(..._args: any[]) {}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class PutObjectCommand {
|
|
14
|
-
constructor(..._args: any[]) {}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export default { SpaceClient, GetObjectCommand, PutObjectCommand };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// @blocklet/did-space-js shim
|
|
2
|
-
export class SpaceClient {
|
|
3
|
-
constructor(_opts?: any) {}
|
|
4
|
-
async send(_cmd: any) { return {}; }
|
|
5
|
-
}
|
|
6
|
-
export class GetObjectCommand {
|
|
7
|
-
constructor(_opts?: any) {}
|
|
8
|
-
}
|
|
9
|
-
export class PutObjectCommand {
|
|
10
|
-
constructor(_opts?: any) {}
|
|
11
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// Express compatibility shim for CF Workers
|
|
2
|
-
// Allows existing Express route handlers to work with Hono
|
|
3
|
-
|
|
4
|
-
export type RouteEntry = { method: string; path: string; handlers: Function[] };
|
|
5
|
-
|
|
6
|
-
export function Router() {
|
|
7
|
-
const routes: RouteEntry[] = [];
|
|
8
|
-
const middlewares: Function[] = [];
|
|
9
|
-
|
|
10
|
-
const router: any = function () {};
|
|
11
|
-
|
|
12
|
-
for (const method of ['get', 'post', 'put', 'patch', 'delete']) {
|
|
13
|
-
router[method] = (path: string, ...handlers: Function[]) => {
|
|
14
|
-
routes.push({ method: method.toUpperCase(), path, handlers: [...middlewares, ...handlers] });
|
|
15
|
-
return router;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
router.use = (...args: any[]) => {
|
|
20
|
-
if (typeof args[0] === 'string') {
|
|
21
|
-
// router.use('/path', ...middlewaresOrSubRouter)
|
|
22
|
-
const path = args[0];
|
|
23
|
-
const rest = args.slice(1);
|
|
24
|
-
|
|
25
|
-
// Find the sub-router (has _routes) — it's typically the last arg
|
|
26
|
-
const subRouterIdx = rest.findIndex((a: any) => a?._routes);
|
|
27
|
-
if (subRouterIdx >= 0) {
|
|
28
|
-
const subRouter = rest[subRouterIdx];
|
|
29
|
-
// Middlewares are everything before the sub-router
|
|
30
|
-
const pathMiddlewares = rest.slice(0, subRouterIdx).filter((a: any) => typeof a === 'function');
|
|
31
|
-
|
|
32
|
-
for (const route of subRouter._routes) {
|
|
33
|
-
routes.push({
|
|
34
|
-
method: route.method,
|
|
35
|
-
path: path + route.path,
|
|
36
|
-
// Chain: parent middlewares -> path-level middlewares -> sub-router middlewares from route
|
|
37
|
-
handlers: [...middlewares, ...pathMiddlewares, ...route.handlers],
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
} else {
|
|
41
|
-
// All args are middlewares for this path — treat as path-scoped middleware
|
|
42
|
-
for (const fn of rest) {
|
|
43
|
-
if (typeof fn === 'function') {
|
|
44
|
-
// We store path-scoped middlewares as a special route entry
|
|
45
|
-
// They'll match any method and sub-path
|
|
46
|
-
middlewares.push(fn);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
51
|
-
// router.use(middleware1, middleware2, ...)
|
|
52
|
-
for (const fn of args) {
|
|
53
|
-
if (typeof fn === 'function') {
|
|
54
|
-
middlewares.push(fn);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return router;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
router._routes = routes;
|
|
62
|
-
router._middlewares = middlewares;
|
|
63
|
-
|
|
64
|
-
return router;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Express app stub
|
|
68
|
-
export function express() {
|
|
69
|
-
return Router();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Static middleware stubs
|
|
73
|
-
express.json = (_opts?: any) => (_req: any, _res: any, next: any) => next();
|
|
74
|
-
express.urlencoded = (_opts?: any) => (_req: any, _res: any, next: any) => next();
|
|
75
|
-
express.static = (_path: string, _opts?: any) => (_req: any, _res: any, next: any) => next();
|
|
76
|
-
express.Router = Router;
|
|
77
|
-
express.raw = (_opts?: any) => (_req: any, _res: any, next: any) => next();
|
|
78
|
-
|
|
79
|
-
export default express;
|
|
80
|
-
export type { Request, Response, NextFunction, ErrorRequestHandler } from './types';
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Express type stubs
|
|
2
|
-
export interface Request {
|
|
3
|
-
method: string;
|
|
4
|
-
path: string;
|
|
5
|
-
url: string;
|
|
6
|
-
originalUrl: string;
|
|
7
|
-
query: Record<string, any>;
|
|
8
|
-
params: Record<string, any>;
|
|
9
|
-
body: any;
|
|
10
|
-
headers: Record<string, string>;
|
|
11
|
-
user?: any;
|
|
12
|
-
customer?: any;
|
|
13
|
-
livemode?: boolean;
|
|
14
|
-
baseCurrency?: any;
|
|
15
|
-
doc?: any;
|
|
16
|
-
stripeEvent?: any;
|
|
17
|
-
stripeClient?: any;
|
|
18
|
-
get(name: string): string | undefined;
|
|
19
|
-
header(name: string): string | undefined;
|
|
20
|
-
[key: string]: any;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface Response {
|
|
24
|
-
json(data: any): any;
|
|
25
|
-
status(code: number): Response;
|
|
26
|
-
send(data: any): any;
|
|
27
|
-
redirect(url: string): any;
|
|
28
|
-
set(key: string, value: string): Response;
|
|
29
|
-
setHeader(key: string, value: string): Response;
|
|
30
|
-
cookie(name: string, value: string, options?: any): Response;
|
|
31
|
-
end(): void;
|
|
32
|
-
headersSent: boolean;
|
|
33
|
-
statusCode: number;
|
|
34
|
-
_statusCode?: number;
|
|
35
|
-
_headers?: Record<string, string>;
|
|
36
|
-
_body?: any;
|
|
37
|
-
_sent?: boolean;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type NextFunction = (err?: any) => void;
|
|
41
|
-
export type ErrorRequestHandler = (err: any, req: Request, res: Response, next: NextFunction) => void;
|