payment-kit 1.29.1 → 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.
Files changed (310) hide show
  1. package/api/dev.ts +41 -2
  2. package/api/hono.d.ts +42 -0
  3. package/api/node-sqlite.d.ts +12 -0
  4. package/api/src/bootstrap.ts +36 -0
  5. package/api/src/crons/base.ts +3 -3
  6. package/api/src/crons/currency.ts +1 -1
  7. package/api/src/crons/index.ts +27 -24
  8. package/api/src/crons/metering-subscription-detection.ts +1 -1
  9. package/api/src/crons/overdue-detection.ts +2 -2
  10. package/api/src/crons/retry-pending-events.ts +6 -0
  11. package/api/src/index.ts +22 -161
  12. package/api/src/integrations/app-store/client.ts +3 -4
  13. package/api/src/integrations/app-store/handlers/subscription.ts +7 -7
  14. package/api/src/integrations/app-store/signed-data-verifier.ts +3 -2
  15. package/api/src/integrations/arcblock/token.ts +21 -7
  16. package/api/src/integrations/google-play/handlers/subscription.ts +6 -6
  17. package/api/src/integrations/google-play/handlers/voided.ts +2 -2
  18. package/api/src/integrations/google-play/verify.ts +3 -2
  19. package/api/src/integrations/iap-reconcile.ts +3 -5
  20. package/api/src/integrations/stripe/handlers/invoice.ts +2 -2
  21. package/api/src/integrations/stripe/handlers/subscription.ts +3 -3
  22. package/api/src/libs/archive/query.ts +19 -0
  23. package/api/src/libs/audit.ts +61 -4
  24. package/api/src/libs/auth.ts +99 -38
  25. package/api/src/libs/context.ts +78 -1
  26. package/api/src/libs/currency.ts +2 -2
  27. package/api/src/libs/dayjs.ts +8 -2
  28. package/api/src/libs/drivers/auth-storage.ts +118 -0
  29. package/api/src/libs/drivers/cron.ts +264 -0
  30. package/api/src/libs/drivers/db.ts +170 -0
  31. package/api/src/libs/drivers/identity.ts +81 -0
  32. package/api/src/libs/drivers/index.ts +40 -0
  33. package/api/src/libs/drivers/locks.ts +226 -0
  34. package/api/src/libs/drivers/migrate-runner.ts +70 -0
  35. package/api/src/libs/drivers/queue.ts +104 -0
  36. package/api/src/libs/drivers/secrets.ts +194 -0
  37. package/api/src/libs/env.ts +170 -54
  38. package/api/src/libs/exchange-rate/service.ts +7 -6
  39. package/api/src/libs/http-fetch-adapter.ts +50 -0
  40. package/api/src/libs/invoice.ts +1 -1
  41. package/api/src/libs/lock.ts +51 -47
  42. package/api/src/libs/logger.ts +48 -8
  43. package/api/src/libs/notification/index.ts +1 -1
  44. package/api/src/libs/notification/template/customer-credit-low-balance.ts +2 -1
  45. package/api/src/libs/notification/template/customer-revenue-succeeded.ts +1 -1
  46. package/api/src/libs/notification/template/customer-reward-succeeded.ts +1 -1
  47. package/api/src/libs/overdraft-protection.ts +1 -1
  48. package/api/src/libs/payout.ts +1 -1
  49. package/api/src/libs/queue/index.ts +259 -52
  50. package/api/src/libs/queue/runtime.ts +175 -0
  51. package/api/src/libs/resource.ts +3 -3
  52. package/api/src/libs/secrets.ts +38 -0
  53. package/api/src/libs/session.ts +3 -2
  54. package/api/src/libs/subscription.ts +5 -5
  55. package/api/src/libs/tenant.ts +92 -0
  56. package/api/src/libs/url.ts +3 -3
  57. package/api/src/libs/util.ts +21 -13
  58. package/api/src/middlewares/hono/cdn.ts +63 -0
  59. package/api/src/middlewares/hono/context.ts +73 -0
  60. package/api/src/middlewares/hono/csrf.ts +72 -0
  61. package/api/src/middlewares/hono/fallback.ts +194 -0
  62. package/api/src/middlewares/hono/pipeline.ts +73 -0
  63. package/api/src/middlewares/hono/resource-mount.ts +42 -0
  64. package/api/src/middlewares/hono/resource.ts +63 -0
  65. package/api/src/middlewares/hono/security.ts +214 -0
  66. package/api/src/middlewares/hono/session.ts +114 -0
  67. package/api/src/middlewares/hono/xss.ts +61 -0
  68. package/api/src/queues/auto-recharge.ts +12 -10
  69. package/api/src/queues/checkout-session.ts +17 -12
  70. package/api/src/queues/credit-consume.ts +40 -36
  71. package/api/src/queues/credit-grant.ts +25 -18
  72. package/api/src/queues/credit-reconciliation.ts +7 -5
  73. package/api/src/queues/discount-status.ts +9 -6
  74. package/api/src/queues/event.ts +12 -4
  75. package/api/src/queues/exchange-rate-health.ts +49 -30
  76. package/api/src/queues/invoice.ts +18 -15
  77. package/api/src/queues/notification.ts +14 -7
  78. package/api/src/queues/payment.ts +41 -28
  79. package/api/src/queues/payout.ts +9 -5
  80. package/api/src/queues/refund.ts +18 -12
  81. package/api/src/queues/subscription.ts +83 -53
  82. package/api/src/queues/token-transfer.ts +15 -10
  83. package/api/src/queues/usage-record.ts +8 -5
  84. package/api/src/queues/vendors/commission.ts +7 -5
  85. package/api/src/queues/vendors/fulfillment-coordinator.ts +17 -13
  86. package/api/src/queues/vendors/fulfillment.ts +4 -2
  87. package/api/src/queues/vendors/return-processor.ts +5 -3
  88. package/api/src/queues/vendors/return-scanner.ts +5 -4
  89. package/api/src/queues/vendors/status-check.ts +10 -7
  90. package/api/src/queues/webhook.ts +60 -32
  91. package/api/src/routes/connect/shared.ts +1 -2
  92. package/api/src/routes/connect/subscribe.ts +3 -3
  93. package/api/src/routes/{archive.ts → hono/archive.ts} +69 -64
  94. package/api/src/routes/{auto-recharge-configs.ts → hono/auto-recharge-configs.ts} +39 -28
  95. package/api/src/routes/{checkout-sessions.ts → hono/checkout-sessions.ts} +790 -923
  96. package/api/src/routes/{coupons.ts → hono/coupons.ts} +93 -76
  97. package/api/src/routes/{credit-grants.ts → hono/credit-grants.ts} +140 -126
  98. package/api/src/routes/hono/credit-tokens.ts +43 -0
  99. package/api/src/routes/{credit-transactions.ts → hono/credit-transactions.ts} +37 -29
  100. package/api/src/routes/{customers.ts → hono/customers.ts} +193 -223
  101. package/api/src/routes/{donations.ts → hono/donations.ts} +41 -32
  102. package/api/src/routes/{entitlements.ts → hono/entitlements.ts} +28 -25
  103. package/api/src/routes/{events.ts → hono/events.ts} +107 -71
  104. package/api/src/routes/{exchange-rate-providers.ts → hono/exchange-rate-providers.ts} +138 -126
  105. package/api/src/routes/hono/exchange-rates.ts +77 -0
  106. package/api/src/routes/hono/index.ts +115 -0
  107. package/api/src/routes/{integrations → hono/integrations}/app-store.ts +68 -48
  108. package/api/src/routes/{integrations → hono/integrations}/google-play.ts +78 -58
  109. package/api/src/routes/hono/integrations/stripe.ts +74 -0
  110. package/api/src/routes/{invoices.ts → hono/invoices.ts} +253 -244
  111. package/api/src/routes/{meter-events.ts → hono/meter-events.ts} +120 -110
  112. package/api/src/routes/hono/meters.ts +288 -0
  113. package/api/src/routes/hono/passports.ts +73 -0
  114. package/api/src/routes/{payment-currencies.ts → hono/payment-currencies.ts} +219 -197
  115. package/api/src/routes/{payment-intents.ts → hono/payment-intents.ts} +136 -132
  116. package/api/src/routes/{payment-links.ts → hono/payment-links.ts} +145 -128
  117. package/api/src/routes/{payment-methods.ts → hono/payment-methods.ts} +125 -93
  118. package/api/src/routes/{payment-stats.ts → hono/payment-stats.ts} +30 -25
  119. package/api/src/routes/{payouts.ts → hono/payouts.ts} +55 -47
  120. package/api/src/routes/{prices.ts → hono/prices.ts} +265 -242
  121. package/api/src/routes/{pricing-table.ts → hono/pricing-table.ts} +94 -87
  122. package/api/src/routes/{products.ts → hono/products.ts} +172 -159
  123. package/api/src/routes/{promotion-codes.ts → hono/promotion-codes.ts} +207 -185
  124. package/api/src/routes/hono/redirect.ts +24 -0
  125. package/api/src/routes/{refunds.ts → hono/refunds.ts} +96 -80
  126. package/api/src/routes/{settings.ts → hono/settings.ts} +64 -55
  127. package/api/src/routes/{subscription-items.ts → hono/subscription-items.ts} +64 -57
  128. package/api/src/routes/{subscriptions.ts → hono/subscriptions.ts} +475 -528
  129. package/api/src/routes/{tax-rates.ts → hono/tax-rates.ts} +71 -70
  130. package/api/src/routes/hono/tool.ts +69 -0
  131. package/api/src/routes/{usage-records.ts → hono/usage-records.ts} +47 -42
  132. package/api/src/routes/{vendor.ts → hono/vendor.ts} +315 -167
  133. package/api/src/routes/{webhook-attempts.ts → hono/webhook-attempts.ts} +17 -13
  134. package/api/src/routes/hono/webhook-endpoints.ts +126 -0
  135. package/api/src/service.ts +667 -0
  136. package/api/src/store/migrations/20230911-seeding.ts +2 -1
  137. package/api/src/store/migrations/20260609-remove-did-space-jobs.ts +23 -0
  138. package/api/src/store/migrations/20260610-tenant-columns.ts +40 -0
  139. package/api/src/store/migrations/20260611-tenant-backfill.ts +33 -0
  140. package/api/src/store/models/auto-recharge-config.ts +22 -10
  141. package/api/src/store/models/checkout-session.ts +15 -14
  142. package/api/src/store/models/coupon.ts +29 -20
  143. package/api/src/store/models/credit-grant.ts +38 -29
  144. package/api/src/store/models/credit-transaction.ts +32 -21
  145. package/api/src/store/models/customer.ts +19 -17
  146. package/api/src/store/models/discount.ts +11 -2
  147. package/api/src/store/models/entitlement-grant.ts +21 -9
  148. package/api/src/store/models/entitlement-product.ts +21 -9
  149. package/api/src/store/models/entitlement.ts +19 -10
  150. package/api/src/store/models/event.ts +18 -9
  151. package/api/src/store/models/exchange-rate-provider.ts +17 -4
  152. package/api/src/store/models/invoice-item.ts +18 -9
  153. package/api/src/store/models/invoice.ts +16 -8
  154. package/api/src/store/models/meter-event.ts +27 -9
  155. package/api/src/store/models/meter.ts +31 -22
  156. package/api/src/store/models/payment-currency.ts +25 -8
  157. package/api/src/store/models/payment-intent.ts +15 -6
  158. package/api/src/store/models/payment-link.ts +15 -6
  159. package/api/src/store/models/payment-method.ts +38 -22
  160. package/api/src/store/models/payment-stat.ts +18 -9
  161. package/api/src/store/models/payout.ts +15 -6
  162. package/api/src/store/models/price-quote.ts +17 -8
  163. package/api/src/store/models/price.ts +24 -12
  164. package/api/src/store/models/pricing-table.ts +29 -20
  165. package/api/src/store/models/product-vendor.ts +20 -10
  166. package/api/src/store/models/product.ts +15 -6
  167. package/api/src/store/models/promotion-code.ts +14 -6
  168. package/api/src/store/models/refund.ts +15 -6
  169. package/api/src/store/models/revenue-snapshot.ts +21 -9
  170. package/api/src/store/models/setting.ts +18 -9
  171. package/api/src/store/models/setup-intent.ts +36 -27
  172. package/api/src/store/models/subscription-item.ts +21 -9
  173. package/api/src/store/models/subscription-schedule.ts +21 -9
  174. package/api/src/store/models/subscription.ts +21 -10
  175. package/api/src/store/models/tax-rate.ts +29 -21
  176. package/api/src/store/models/usage-record.ts +11 -2
  177. package/api/src/store/models/webhook-attempt.ts +18 -9
  178. package/api/src/store/models/webhook-endpoint.ts +18 -9
  179. package/api/src/store/scoped-core.ts +55 -0
  180. package/api/src/store/scoped.ts +247 -0
  181. package/api/src/store/sequelize.ts +66 -22
  182. package/api/src/store/sql-migrations.ts +20 -0
  183. package/api/src/store/tenant-backfill.ts +260 -0
  184. package/api/src/store/tenant-model.ts +124 -0
  185. package/api/src/store/tenant-tables.ts +50 -0
  186. package/api/tests/embedded/embedded-multi-mode-d3.spec.ts +257 -0
  187. package/api/tests/fixtures/bare-query-violation.ts +13 -0
  188. package/api/tests/fixtures/core-env-violation.ts +10 -0
  189. package/api/tests/fixtures/host-read-violation.ts +19 -0
  190. package/api/tests/fixtures/tenants.ts +4 -0
  191. package/api/tests/integrations/iap-tenant.spec.ts +284 -0
  192. package/api/tests/libs/archive-query.spec.ts +26 -0
  193. package/api/tests/libs/audit-tenant.spec.ts +153 -0
  194. package/api/tests/libs/context.spec.ts +204 -0
  195. package/api/tests/libs/core-config.spec.ts +115 -0
  196. package/api/tests/libs/cron-driver-d2.spec.ts +237 -0
  197. package/api/tests/libs/crons-conservation-d2.spec.ts +52 -0
  198. package/api/tests/libs/lock-tenant.spec.ts +66 -0
  199. package/api/tests/libs/scoped.spec.ts +222 -0
  200. package/api/tests/libs/secrets-facade.spec.ts +52 -0
  201. package/api/tests/libs/tenancy-slot-authority.spec.ts +209 -0
  202. package/api/tests/libs/tenant-middleware.spec.ts +42 -0
  203. package/api/tests/libs/tenant-scanner.spec.ts +120 -0
  204. package/api/tests/middlewares/hono/cdn.spec.ts +70 -0
  205. package/api/tests/middlewares/hono/context.spec.ts +113 -0
  206. package/api/tests/middlewares/hono/csrf.spec.ts +136 -0
  207. package/api/tests/middlewares/hono/fallback.spec.ts +67 -0
  208. package/api/tests/middlewares/hono/pipeline.spec.ts +47 -0
  209. package/api/tests/middlewares/hono/security.spec.ts +181 -0
  210. package/api/tests/middlewares/hono/session.spec.ts +42 -0
  211. package/api/tests/middlewares/hono/xss.spec.ts +81 -0
  212. package/api/tests/models/tenant-backfill.spec.ts +287 -0
  213. package/api/tests/models/tenant-columns-model.spec.ts +46 -0
  214. package/api/tests/models/tenant-columns.spec.ts +161 -0
  215. package/api/tests/queues/credit-consume-batch.spec.ts +8 -1
  216. package/api/tests/queues/credit-consume.spec.ts +8 -1
  217. package/api/tests/queues/event-tenant.spec.ts +236 -0
  218. package/api/tests/queues/exchange-rate-health-tenant-d6.spec.ts +62 -0
  219. package/api/tests/queues/queue-parity.spec.ts +249 -0
  220. package/api/tests/queues/queue-runtime-surface.spec.ts +277 -0
  221. package/api/tests/queues/queue-teardown-d2.spec.ts +127 -0
  222. package/api/tests/queues/tenant-matrix-a.spec.ts +245 -0
  223. package/api/tests/queues/tenant-matrix-b.spec.ts +168 -0
  224. package/api/tests/routes/connect/hono-attach.spec.ts +107 -0
  225. package/api/tests/service/collapse.spec.ts +96 -0
  226. package/api/tests/store/tenant-crosscut.spec.ts +202 -0
  227. package/api/tests/store/tenant-model-spike.spec.ts +177 -0
  228. package/api/tests/store/tenant-model.spec.ts +162 -0
  229. package/api/tests/store/tenant-residual.spec.ts +196 -0
  230. package/api/third.d.ts +4 -0
  231. package/blocklet.yml +1 -1
  232. package/cloudflare/README.md +26 -6
  233. package/cloudflare/build.ts +28 -13
  234. package/cloudflare/did-connect-auth.ts +0 -217
  235. package/cloudflare/migrations/0006_tenant_columns.sql +46 -0
  236. package/cloudflare/migrations/0007_tenant_backfill_indexes.sql +65 -0
  237. package/cloudflare/migrations/0008_schema_parity.sql +16 -0
  238. package/cloudflare/migrations/0009_remove_did_space_jobs.sql +5 -0
  239. package/cloudflare/queue-runtime-mode.ts +13 -0
  240. package/cloudflare/run-build.js +10 -56
  241. package/cloudflare/shims/blocklet-sdk/asset-host-transformer.ts +20 -0
  242. package/cloudflare/shims/blocklet-sdk/config.ts +8 -1
  243. package/cloudflare/shims/blocklet-sdk/login.ts +12 -0
  244. package/cloudflare/shims/blocklet-sdk/service-api.ts +14 -0
  245. package/cloudflare/shims/blocklet-sdk/session.ts +4 -2
  246. package/cloudflare/shims/blocklet-sdk/util-constants.ts +8 -0
  247. package/cloudflare/shims/blocklet-sdk/util-csrf.ts +13 -0
  248. package/cloudflare/shims/blocklet-sdk/util-wallet.ts +8 -0
  249. package/cloudflare/shims/cron.ts +38 -158
  250. package/cloudflare/shims/events.ts +124 -0
  251. package/cloudflare/shims/fastq.ts +15 -1
  252. package/cloudflare/shims/nedb-storage.ts +16 -8
  253. package/cloudflare/shims/xss.ts +8 -0
  254. package/cloudflare/tenant-middleware.ts +36 -0
  255. package/cloudflare/tests/tenant-middleware.spec.ts +160 -0
  256. package/cloudflare/tests/worker-handler-gate.spec.ts +44 -0
  257. package/cloudflare/worker.ts +204 -433
  258. package/cloudflare/wrangler.local-e2e.jsonc +26 -0
  259. package/jest.config.js +3 -1
  260. package/package.json +33 -38
  261. package/scripts/core-env-whitelist.json +1 -0
  262. package/scripts/e2e-12b-runtime.ts +149 -0
  263. package/scripts/e2e-core-config.ts +125 -0
  264. package/scripts/e2e-d1-tenancy.ts +116 -0
  265. package/scripts/e2e-d2-cron-queue.ts +139 -0
  266. package/scripts/e2e-d3-embedded-multi.ts +171 -0
  267. package/scripts/e2e-hono-s2.ts +125 -0
  268. package/scripts/e2e-hono-s3e.ts +135 -0
  269. package/scripts/e2e-hono-s4.ts +114 -0
  270. package/scripts/e2e-migration-contract.ts +100 -0
  271. package/scripts/e2e-s0.ts +61 -0
  272. package/scripts/e2e-s1.ts +107 -0
  273. package/scripts/e2e-s2.ts +178 -0
  274. package/scripts/e2e-s3.ts +110 -0
  275. package/scripts/e2e-s4.ts +191 -0
  276. package/scripts/e2e-s5.ts +139 -0
  277. package/scripts/e2e-s6.ts +127 -0
  278. package/scripts/e2e-tenant-model.ts +119 -0
  279. package/scripts/e2e-tenant-worker.ts +199 -0
  280. package/scripts/gen-sql-migrations.js +46 -0
  281. package/scripts/phase8-codemod.js +219 -0
  282. package/scripts/phase9a-env-getters-codemod.js +82 -0
  283. package/scripts/scan-core-env.js +109 -0
  284. package/scripts/scan-tenant-queries.js +235 -0
  285. package/scripts/schema-drift-guard.ts +210 -0
  286. package/scripts/tenant-scan-whitelist.json +1 -0
  287. package/src/env.d.ts +13 -1
  288. package/tsconfig.json +1 -1
  289. package/api/src/libs/did-space.ts +0 -235
  290. package/api/src/libs/middleware.ts +0 -50
  291. package/api/src/libs/security.ts +0 -192
  292. package/api/src/queues/space.ts +0 -662
  293. package/api/src/routes/credit-tokens.ts +0 -38
  294. package/api/src/routes/exchange-rates.ts +0 -87
  295. package/api/src/routes/index.ts +0 -142
  296. package/api/src/routes/integrations/stripe.ts +0 -61
  297. package/api/src/routes/meters.ts +0 -274
  298. package/api/src/routes/passports.ts +0 -68
  299. package/api/src/routes/redirect.ts +0 -20
  300. package/api/src/routes/tool.ts +0 -65
  301. package/api/src/routes/webhook-endpoints.ts +0 -126
  302. package/api/tests/routes/credit-grants.spec.ts +0 -1261
  303. package/cloudflare/shims/did-space-js.ts +0 -17
  304. package/cloudflare/shims/did-space.ts +0 -11
  305. package/cloudflare/shims/express-compat/index.ts +0 -80
  306. package/cloudflare/shims/express-compat/types.ts +0 -41
  307. package/cloudflare/shims/lock.ts +0 -115
  308. package/cloudflare/shims/queue.ts +0 -611
  309. package/cloudflare/tests/shims/queue-delayed-persist.spec.ts +0 -87
  310. 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;
@@ -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
- }