payment-kit 1.29.0 → 1.29.2
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 +36 -0
- package/api/src/crons/base.ts +3 -3
- package/api/src/crons/currency.ts +1 -1
- package/api/src/crons/index.ts +27 -24
- 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/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 +99 -38
- package/api/src/libs/context.ts +78 -1
- package/api/src/libs/currency.ts +2 -2
- package/api/src/libs/dayjs.ts +8 -2
- 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 +81 -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 +50 -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 +259 -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 +73 -0
- package/api/src/middlewares/hono/csrf.ts +72 -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 +214 -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 +17 -12
- 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 +12 -4
- 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 +41 -28
- package/api/src/queues/payout.ts +9 -5
- package/api/src/queues/refund.ts +18 -12
- 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} +193 -223
- 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} +96 -80
- 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 +667 -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 +66 -22
- 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/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/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/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 +236 -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/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/README.md +26 -6
- package/cloudflare/build.ts +28 -13
- package/cloudflare/did-connect-auth.ts +0 -217
- package/cloudflare/docs/2026-06-10-bundle-size-analysis.md +288 -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 +31 -56
- 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/util-csrf.ts +13 -0
- package/cloudflare/shims/blocklet-sdk/util-wallet.ts +8 -0
- 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/node-fetch.ts +35 -0
- package/cloudflare/shims/xss.ts +8 -0
- package/cloudflare/tenant-middleware.ts +36 -0
- package/cloudflare/tests/tenant-middleware.spec.ts +160 -0
- package/cloudflare/tests/worker-handler-gate.spec.ts +44 -0
- package/cloudflare/worker.ts +204 -433
- package/cloudflare/wrangler.local-e2e.jsonc +26 -0
- package/jest.config.js +3 -1
- package/package.json +33 -38
- 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/env.d.ts +13 -1
- package/tsconfig.json +1 -1
- 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/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,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;
|
package/cloudflare/shims/lock.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
// CF Workers lock shim — replaces libs/lock.ts
|
|
2
|
-
//
|
|
3
|
-
// In Blocklet Server (single-process Node.js), the original in-memory lock works fine.
|
|
4
|
-
// In CF Workers, each HTTP request runs in a separate isolate, so in-memory locks
|
|
5
|
-
// are useless for cross-request mutual exclusion.
|
|
6
|
-
//
|
|
7
|
-
// This shim uses D1 (SQLite) as the coordination layer:
|
|
8
|
-
// - INSERT OR IGNORE with PRIMARY KEY constraint provides atomic lock acquisition
|
|
9
|
-
// - owner token prevents accidental release by other isolates
|
|
10
|
-
// - TTL-based expiry prevents deadlocks from crashed isolates
|
|
11
|
-
// - Exponential backoff with jitter avoids D1 write hotspots
|
|
12
|
-
|
|
13
|
-
import { getDB } from './sequelize-d1/model';
|
|
14
|
-
|
|
15
|
-
let _nanoidCounter = 0;
|
|
16
|
-
function simpleId(): string {
|
|
17
|
-
// Lightweight unique ID — no need for crypto-strength randomness for lock owners
|
|
18
|
-
return `${Date.now().toString(36)}-${(++_nanoidCounter).toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export class Lock {
|
|
22
|
-
name: string;
|
|
23
|
-
owner: string;
|
|
24
|
-
locked: boolean;
|
|
25
|
-
ttl: number;
|
|
26
|
-
|
|
27
|
-
// EventEmitter stub for API compatibility — original Lock extends EventEmitter
|
|
28
|
-
events: { on: () => void; removeListener: () => void; emit: () => void };
|
|
29
|
-
|
|
30
|
-
constructor(name: string, options?: { ttl?: number }) {
|
|
31
|
-
this.name = name;
|
|
32
|
-
this.owner = simpleId();
|
|
33
|
-
this.locked = false;
|
|
34
|
-
this.ttl = options?.ttl || 5000; // default 5s TTL for short critical sections
|
|
35
|
-
this.events = { on: () => {}, removeListener: () => {}, emit: () => {} };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async acquire(maxWaitMs = 10000): Promise<true> {
|
|
39
|
-
const db = getDB();
|
|
40
|
-
const deadline = Date.now() + maxWaitMs;
|
|
41
|
-
let delay = 30; // start at 30ms
|
|
42
|
-
|
|
43
|
-
while (Date.now() < deadline) {
|
|
44
|
-
const now = Date.now();
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
// Atomically: clean expired locks + try to insert ours + verify ownership
|
|
48
|
-
// All 3 statements in a single D1 batch (1 round-trip instead of 2)
|
|
49
|
-
const batchResult = await db.batch([
|
|
50
|
-
db.prepare('DELETE FROM _locks WHERE name = ? AND expires_at < ?').bind(this.name, now),
|
|
51
|
-
db.prepare('INSERT OR IGNORE INTO _locks (name, owner, expires_at) VALUES (?, ?, ?)')
|
|
52
|
-
.bind(this.name, this.owner, now + this.ttl),
|
|
53
|
-
db.prepare('SELECT owner FROM _locks WHERE name = ?').bind(this.name),
|
|
54
|
-
]);
|
|
55
|
-
|
|
56
|
-
const row = batchResult[2]?.results?.[0] as { owner: string } | undefined;
|
|
57
|
-
if (row?.owner === this.owner) {
|
|
58
|
-
this.locked = true;
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
} catch (err: any) {
|
|
62
|
-
// D1 errors (e.g. table not found on first deploy) — log and retry
|
|
63
|
-
console.error(`[D1Lock] acquire error for "${this.name}":`, err?.message || err);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Exponential backoff with jitter to avoid D1 write hotspots
|
|
67
|
-
const jitter = Math.random() * delay * 0.3;
|
|
68
|
-
await new Promise(r => setTimeout(r, delay + jitter));
|
|
69
|
-
delay = Math.min(delay * 2, 500); // cap at 500ms
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Timeout — throw to match original behavior where acquire() always resolves
|
|
73
|
-
// All callers use try/catch or don't check the return value
|
|
74
|
-
console.warn(`[D1Lock] acquire timeout: "${this.name}" after ${maxWaitMs}ms`);
|
|
75
|
-
throw new Error(`[D1Lock] Failed to acquire lock "${this.name}" within ${maxWaitMs}ms`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
release(): void {
|
|
79
|
-
if (!this.locked) return;
|
|
80
|
-
this.locked = false;
|
|
81
|
-
|
|
82
|
-
// Fire-and-forget: 8 out of 10 call sites do NOT await release().
|
|
83
|
-
// We register the promise with __cfPendingJobs__ so flushPendingJobs()
|
|
84
|
-
// in worker.ts ensures it completes before the response is sent.
|
|
85
|
-
try {
|
|
86
|
-
const db = getDB();
|
|
87
|
-
const promise = db.prepare('DELETE FROM _locks WHERE name = ? AND owner = ?')
|
|
88
|
-
.bind(this.name, this.owner)
|
|
89
|
-
.run()
|
|
90
|
-
.catch((err: any) => console.error(`[D1Lock] release error for "${this.name}":`, err?.message || err));
|
|
91
|
-
|
|
92
|
-
// For HTTP context, use waitUntil (non-blocking) instead of pendingJobs (blocking)
|
|
93
|
-
const isHttp = (globalThis as any).__cfHttpContext__;
|
|
94
|
-
if (isHttp) {
|
|
95
|
-
const waitUntil = (globalThis as any).__cfWaitUntil__;
|
|
96
|
-
if (typeof waitUntil === 'function') {
|
|
97
|
-
waitUntil(promise);
|
|
98
|
-
}
|
|
99
|
-
} else {
|
|
100
|
-
const pending = (globalThis as any).__cfPendingJobs__;
|
|
101
|
-
if (Array.isArray(pending)) {
|
|
102
|
-
pending.push(promise);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
} catch (err: any) {
|
|
106
|
-
console.error(`[D1Lock] release setup error for "${this.name}":`, err?.message || err);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// In CF Workers, don't cache Lock instances across requests — each request is isolated.
|
|
112
|
-
// The original code caches by name, but that's only useful within a single process.
|
|
113
|
-
export function getLock(name: string, options?: { ttl?: number }): Lock {
|
|
114
|
-
return new Lock(name, options);
|
|
115
|
-
}
|