@onesub/server 0.11.3 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +119 -2
  2. package/dist/__tests__/admin-customer-detail.test.d.ts +10 -0
  3. package/dist/__tests__/admin-customer-detail.test.d.ts.map +1 -0
  4. package/dist/__tests__/admin-customer-detail.test.js +146 -0
  5. package/dist/__tests__/admin-customer-detail.test.js.map +1 -0
  6. package/dist/__tests__/cache.test.d.ts +2 -0
  7. package/dist/__tests__/cache.test.d.ts.map +1 -0
  8. package/dist/__tests__/cache.test.js +34 -0
  9. package/dist/__tests__/cache.test.js.map +1 -0
  10. package/dist/__tests__/metrics.test.js +57 -0
  11. package/dist/__tests__/metrics.test.js.map +1 -1
  12. package/dist/__tests__/openapi.test.d.ts +2 -0
  13. package/dist/__tests__/openapi.test.d.ts.map +1 -0
  14. package/dist/__tests__/openapi.test.js +32 -0
  15. package/dist/__tests__/openapi.test.js.map +1 -0
  16. package/dist/__tests__/redis-store.test.d.ts +2 -0
  17. package/dist/__tests__/redis-store.test.d.ts.map +1 -0
  18. package/dist/__tests__/redis-store.test.js +117 -0
  19. package/dist/__tests__/redis-store.test.js.map +1 -0
  20. package/dist/__tests__/webhook-events.test.d.ts +2 -0
  21. package/dist/__tests__/webhook-events.test.d.ts.map +1 -0
  22. package/dist/__tests__/webhook-events.test.js +36 -0
  23. package/dist/__tests__/webhook-events.test.js.map +1 -0
  24. package/dist/__tests__/webhook-queue.test.d.ts +2 -0
  25. package/dist/__tests__/webhook-queue.test.d.ts.map +1 -0
  26. package/dist/__tests__/webhook-queue.test.js +26 -0
  27. package/dist/__tests__/webhook-queue.test.js.map +1 -0
  28. package/dist/cache.d.ts +32 -0
  29. package/dist/cache.d.ts.map +1 -0
  30. package/dist/cache.js +43 -0
  31. package/dist/cache.js.map +1 -0
  32. package/dist/index.cjs +3114 -0
  33. package/dist/index.cjs.map +1 -0
  34. package/dist/index.d.ts +34 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +3072 -118
  37. package/dist/index.js.map +1 -1
  38. package/dist/openapi.d.ts +41 -0
  39. package/dist/openapi.d.ts.map +1 -0
  40. package/dist/openapi.js +196 -0
  41. package/dist/openapi.js.map +1 -0
  42. package/dist/providers/apple.d.ts +1 -1
  43. package/dist/providers/apple.d.ts.map +1 -1
  44. package/dist/providers/apple.js +45 -34
  45. package/dist/providers/apple.js.map +1 -1
  46. package/dist/providers/google.d.ts.map +1 -1
  47. package/dist/providers/google.js +49 -20
  48. package/dist/providers/google.js.map +1 -1
  49. package/dist/routes/admin.d.ts +6 -1
  50. package/dist/routes/admin.d.ts.map +1 -1
  51. package/dist/routes/admin.js +87 -1
  52. package/dist/routes/admin.js.map +1 -1
  53. package/dist/routes/metrics.d.ts.map +1 -1
  54. package/dist/routes/metrics.js +57 -1
  55. package/dist/routes/metrics.js.map +1 -1
  56. package/dist/routes/webhook.d.ts +2 -1
  57. package/dist/routes/webhook.d.ts.map +1 -1
  58. package/dist/routes/webhook.js +21 -1
  59. package/dist/routes/webhook.js.map +1 -1
  60. package/dist/stores/redis.d.ts +60 -0
  61. package/dist/stores/redis.d.ts.map +1 -0
  62. package/dist/stores/redis.js +255 -0
  63. package/dist/stores/redis.js.map +1 -0
  64. package/dist/stores/schema.d.ts.map +1 -1
  65. package/dist/stores/schema.js +10 -0
  66. package/dist/stores/schema.js.map +1 -1
  67. package/dist/tracing.d.ts +32 -0
  68. package/dist/tracing.d.ts.map +1 -0
  69. package/dist/tracing.js +74 -0
  70. package/dist/tracing.js.map +1 -0
  71. package/dist/webhook-events.d.ts +58 -0
  72. package/dist/webhook-events.d.ts.map +1 -0
  73. package/dist/webhook-events.js +57 -0
  74. package/dist/webhook-events.js.map +1 -0
  75. package/dist/webhook-queue.d.ts +92 -0
  76. package/dist/webhook-queue.d.ts.map +1 -0
  77. package/dist/webhook-queue.js +108 -0
  78. package/dist/webhook-queue.js.map +1 -0
  79. package/package.json +33 -4
  80. package/sql/schema.sql +10 -0
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  import express, { Router } from 'express';
2
2
  import type { OneSubServerConfig } from '@onesub/shared';
3
3
  import type { SubscriptionStore, PurchaseStore } from './store.js';
4
+ import type { CacheAdapter } from './cache.js';
5
+ import type { WebhookEventStore } from './webhook-events.js';
6
+ import type { WebhookQueue } from './webhook-queue.js';
4
7
  /**
5
8
  * Extended config with optional pluggable stores.
6
9
  */
@@ -16,6 +19,27 @@ export interface OneSubMiddlewareConfig extends OneSubServerConfig {
16
19
  * For production, provide a PostgreSQL backed implementation.
17
20
  */
18
21
  purchaseStore?: PurchaseStore;
22
+ /**
23
+ * Cache backend for short-lived secrets (Apple JWT, Google OAuth token).
24
+ * Default: in-memory, process-local. For multi-instance deployments pass a
25
+ * `RedisCacheAdapter` so all nodes share a single mint per TTL window.
26
+ */
27
+ cache?: CacheAdapter;
28
+ /**
29
+ * Webhook idempotency store. Default: none (rely on Apple/Google retry +
30
+ * downstream store PKs). For production strongly recommended — pass an
31
+ * `InMemoryWebhookEventStore` (single instance) or `CacheWebhookEventStore`
32
+ * backed by Redis (multi-instance) so duplicate notifications never apply
33
+ * twice.
34
+ */
35
+ webhookEventStore?: WebhookEventStore;
36
+ /**
37
+ * Async webhook queue. Default: in-process synchronous (legacy behavior —
38
+ * route latency = handler latency). For decoupled retries pass a
39
+ * `BullMQWebhookQueue`; the dead-letter list becomes accessible via
40
+ * `/onesub/admin/webhook-deadletters` and `/onesub/admin/webhook-replay/:id`.
41
+ */
42
+ webhookQueue?: WebhookQueue;
19
43
  }
20
44
  /**
21
45
  * Create an Express Router with all OneSub routes mounted.
@@ -47,6 +71,16 @@ export declare function createOneSubServer(config: OneSubMiddlewareConfig): Retu
47
71
  export { InMemorySubscriptionStore, InMemoryPurchaseStore } from './store.js';
48
72
  export type { SubscriptionStore, PurchaseStore } from './store.js';
49
73
  export { PostgresSubscriptionStore, PostgresPurchaseStore } from './stores/postgres.js';
74
+ export { RedisSubscriptionStore, RedisPurchaseStore, RedisCacheAdapter, RedisWebhookEventStore, } from './stores/redis.js';
75
+ export type { CacheAdapter } from './cache.js';
76
+ export { InMemoryCacheAdapter, getDefaultCache, setDefaultCache } from './cache.js';
77
+ export type { WebhookEventStore } from './webhook-events.js';
78
+ export { InMemoryWebhookEventStore, CacheWebhookEventStore } from './webhook-events.js';
79
+ export type { WebhookQueue, WebhookJob, WebhookHandler, DeadLetterRecord } from './webhook-queue.js';
80
+ export { InProcessWebhookQueue, BullMQWebhookQueue } from './webhook-queue.js';
81
+ export { ONESUB_OPENAPI, openapiHandler } from './openapi.js';
82
+ export type { OpenAPIDoc } from './openapi.js';
83
+ export { withSpan } from './tracing.js';
50
84
  export { validateAppleReceipt, fetchAppleSubscriptionStatus } from './providers/apple.js';
51
85
  export { validateGoogleReceipt } from './providers/google.js';
52
86
  export { evaluateEntitlement } from './routes/entitlements.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAUnE;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAwC7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAW7F;AAGD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AASnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE;;;OAGG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CA6C7E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAW7F;AAGD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACxF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI/C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAe,sBAAsB,CAAC"}