@owlmeans/server-payment 0.1.18-rc.2 → 0.1.18-rc.21

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 (222) hide show
  1. package/README.md +109 -25
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/server-payment/SKILL.md +475 -52
  4. package/build/actions/index.d.ts +1 -0
  5. package/build/actions/index.d.ts.map +1 -1
  6. package/build/actions/index.js +1 -0
  7. package/build/actions/index.js.map +1 -1
  8. package/build/actions/resync-subscriptions.d.ts +3 -0
  9. package/build/actions/resync-subscriptions.d.ts.map +1 -0
  10. package/build/actions/resync-subscriptions.js +7 -0
  11. package/build/actions/resync-subscriptions.js.map +1 -0
  12. package/build/actions/resync.d.ts +1 -0
  13. package/build/actions/resync.d.ts.map +1 -1
  14. package/build/actions/resync.js +7 -3
  15. package/build/actions/resync.js.map +1 -1
  16. package/build/actions/webhook.d.ts.map +1 -1
  17. package/build/actions/webhook.js +6 -3
  18. package/build/actions/webhook.js.map +1 -1
  19. package/build/config.d.ts +60 -5
  20. package/build/config.d.ts.map +1 -1
  21. package/build/config.js +237 -5
  22. package/build/config.js.map +1 -1
  23. package/build/consts.d.ts +75 -3
  24. package/build/consts.d.ts.map +1 -1
  25. package/build/consts.js +94 -5
  26. package/build/consts.js.map +1 -1
  27. package/build/consumer/capture.d.ts +74 -0
  28. package/build/consumer/capture.d.ts.map +1 -0
  29. package/build/consumer/capture.js +291 -0
  30. package/build/consumer/capture.js.map +1 -0
  31. package/build/consumer/format.d.ts +27 -0
  32. package/build/consumer/format.d.ts.map +1 -0
  33. package/build/consumer/format.js +81 -0
  34. package/build/consumer/format.js.map +1 -0
  35. package/build/consumer/handlers.d.ts +28 -0
  36. package/build/consumer/handlers.d.ts.map +1 -0
  37. package/build/consumer/handlers.js +173 -0
  38. package/build/consumer/handlers.js.map +1 -0
  39. package/build/consumer/index.d.ts +7 -0
  40. package/build/consumer/index.d.ts.map +1 -0
  41. package/build/consumer/index.js +6 -0
  42. package/build/consumer/index.js.map +1 -0
  43. package/build/consumer/mail.d.ts +27 -0
  44. package/build/consumer/mail.d.ts.map +1 -0
  45. package/build/consumer/mail.js +314 -0
  46. package/build/consumer/mail.js.map +1 -0
  47. package/build/consumer/origin.d.ts +14 -0
  48. package/build/consumer/origin.d.ts.map +1 -0
  49. package/build/consumer/origin.js +47 -0
  50. package/build/consumer/origin.js.map +1 -0
  51. package/build/consumer/reconcile.d.ts +12 -0
  52. package/build/consumer/reconcile.d.ts.map +1 -0
  53. package/build/consumer/reconcile.js +317 -0
  54. package/build/consumer/reconcile.js.map +1 -0
  55. package/build/consumer/records.d.ts +78 -0
  56. package/build/consumer/records.d.ts.map +1 -0
  57. package/build/consumer/records.js +296 -0
  58. package/build/consumer/records.js.map +1 -0
  59. package/build/consumer/service.d.ts +51 -0
  60. package/build/consumer/service.d.ts.map +1 -0
  61. package/build/consumer/service.js +760 -0
  62. package/build/consumer/service.js.map +1 -0
  63. package/build/consumer/withdrawal.d.ts +57 -0
  64. package/build/consumer/withdrawal.d.ts.map +1 -0
  65. package/build/consumer/withdrawal.js +247 -0
  66. package/build/consumer/withdrawal.js.map +1 -0
  67. package/build/entitlement.d.ts +10 -0
  68. package/build/entitlement.d.ts.map +1 -0
  69. package/build/entitlement.js +69 -0
  70. package/build/entitlement.js.map +1 -0
  71. package/build/entrypoints.d.ts +1 -1
  72. package/build/entrypoints.d.ts.map +1 -1
  73. package/build/entrypoints.js +2 -1
  74. package/build/entrypoints.js.map +1 -1
  75. package/build/gate.d.ts +32 -4
  76. package/build/gate.d.ts.map +1 -1
  77. package/build/gate.js +59 -19
  78. package/build/gate.js.map +1 -1
  79. package/build/index.d.ts +18 -3
  80. package/build/index.d.ts.map +1 -1
  81. package/build/index.js +15 -3
  82. package/build/index.js.map +1 -1
  83. package/build/limit.d.ts +13 -0
  84. package/build/limit.d.ts.map +1 -0
  85. package/build/limit.js +47 -0
  86. package/build/limit.js.map +1 -0
  87. package/build/model.d.ts +10 -1
  88. package/build/model.d.ts.map +1 -1
  89. package/build/model.js +215 -17
  90. package/build/model.js.map +1 -1
  91. package/build/observer.d.ts +9 -0
  92. package/build/observer.d.ts.map +1 -1
  93. package/build/observer.js +38 -12
  94. package/build/observer.js.map +1 -1
  95. package/build/plan.d.ts +22 -0
  96. package/build/plan.d.ts.map +1 -0
  97. package/build/plan.js +72 -0
  98. package/build/plan.js.map +1 -0
  99. package/build/plugins/checkout-plugins.d.ts +49 -0
  100. package/build/plugins/checkout-plugins.d.ts.map +1 -0
  101. package/build/plugins/checkout-plugins.js +124 -0
  102. package/build/plugins/checkout-plugins.js.map +1 -0
  103. package/build/plugins/estimate.d.ts +43 -0
  104. package/build/plugins/estimate.d.ts.map +1 -0
  105. package/build/plugins/estimate.js +268 -0
  106. package/build/plugins/estimate.js.map +1 -0
  107. package/build/plugins/events.d.ts +45 -10
  108. package/build/plugins/events.d.ts.map +1 -1
  109. package/build/plugins/events.js +605 -136
  110. package/build/plugins/events.js.map +1 -1
  111. package/build/plugins/fx.d.ts +31 -0
  112. package/build/plugins/fx.d.ts.map +1 -0
  113. package/build/plugins/fx.js +81 -0
  114. package/build/plugins/fx.js.map +1 -0
  115. package/build/plugins/portal.d.ts +37 -0
  116. package/build/plugins/portal.d.ts.map +1 -0
  117. package/build/plugins/portal.js +265 -0
  118. package/build/plugins/portal.js.map +1 -0
  119. package/build/plugins/refunds.d.ts +33 -0
  120. package/build/plugins/refunds.d.ts.map +1 -0
  121. package/build/plugins/refunds.js +80 -0
  122. package/build/plugins/refunds.js.map +1 -0
  123. package/build/plugins/stripe.d.ts +36 -4
  124. package/build/plugins/stripe.d.ts.map +1 -1
  125. package/build/plugins/stripe.js +492 -97
  126. package/build/plugins/stripe.js.map +1 -1
  127. package/build/plugins/webhook-manager.d.ts +46 -0
  128. package/build/plugins/webhook-manager.d.ts.map +1 -0
  129. package/build/plugins/webhook-manager.js +231 -0
  130. package/build/plugins/webhook-manager.js.map +1 -0
  131. package/build/reconcile.d.ts +15 -0
  132. package/build/reconcile.d.ts.map +1 -0
  133. package/build/reconcile.js +88 -0
  134. package/build/reconcile.js.map +1 -0
  135. package/build/resource.d.ts +12 -1
  136. package/build/resource.d.ts.map +1 -1
  137. package/build/resource.js +97 -6
  138. package/build/resource.js.map +1 -1
  139. package/build/service.d.ts +28 -3
  140. package/build/service.d.ts.map +1 -1
  141. package/build/service.js +146 -19
  142. package/build/service.js.map +1 -1
  143. package/build/subscription.d.ts +48 -0
  144. package/build/subscription.d.ts.map +1 -0
  145. package/build/subscription.js +176 -0
  146. package/build/subscription.js.map +1 -0
  147. package/build/sync.d.ts +28 -1
  148. package/build/sync.d.ts.map +1 -1
  149. package/build/sync.js +208 -31
  150. package/build/sync.js.map +1 -1
  151. package/build/types.d.ts +1115 -36
  152. package/build/types.d.ts.map +1 -1
  153. package/build/usage.d.ts +63 -0
  154. package/build/usage.d.ts.map +1 -0
  155. package/build/usage.js +363 -0
  156. package/build/usage.js.map +1 -0
  157. package/build/utils.d.ts +52 -1
  158. package/build/utils.d.ts.map +1 -1
  159. package/build/utils.js +69 -7
  160. package/build/utils.js.map +1 -1
  161. package/package.json +17 -13
  162. package/src/actions/index.ts +1 -0
  163. package/src/actions/resync-subscriptions.ts +10 -0
  164. package/src/actions/resync.ts +6 -3
  165. package/src/actions/webhook.ts +5 -3
  166. package/src/config.ts +264 -8
  167. package/src/consts.ts +114 -6
  168. package/src/consumer/capture.ts +362 -0
  169. package/src/consumer/format.ts +90 -0
  170. package/src/consumer/handlers.ts +211 -0
  171. package/src/consumer/index.ts +6 -0
  172. package/src/consumer/mail.ts +368 -0
  173. package/src/consumer/origin.ts +63 -0
  174. package/src/consumer/reconcile.ts +329 -0
  175. package/src/consumer/records.ts +374 -0
  176. package/src/consumer/service.ts +868 -0
  177. package/src/consumer/withdrawal.ts +302 -0
  178. package/src/entitlement.ts +84 -0
  179. package/src/entrypoints.ts +2 -1
  180. package/src/gate.ts +88 -21
  181. package/src/index.ts +24 -3
  182. package/src/limit.ts +57 -0
  183. package/src/model.ts +237 -18
  184. package/src/observer.ts +44 -11
  185. package/src/plan.ts +89 -0
  186. package/src/plugins/checkout-plugins.ts +155 -0
  187. package/src/plugins/estimate.ts +339 -0
  188. package/src/plugins/events.ts +677 -121
  189. package/src/plugins/fx.ts +122 -0
  190. package/src/plugins/portal.ts +306 -0
  191. package/src/plugins/refunds.ts +108 -0
  192. package/src/plugins/stripe.ts +581 -96
  193. package/src/plugins/webhook-manager.ts +270 -0
  194. package/src/reconcile.ts +103 -0
  195. package/src/resource.ts +152 -7
  196. package/src/service.ts +174 -18
  197. package/src/subscription.ts +231 -0
  198. package/src/sync.ts +249 -29
  199. package/src/types.ts +1227 -32
  200. package/src/usage.ts +453 -0
  201. package/src/utils.ts +127 -10
  202. package/tests/checkout-consumer.spec.ts +348 -0
  203. package/tests/checkout-plugins.spec.ts +164 -0
  204. package/tests/checkout.spec.ts +184 -83
  205. package/tests/consumer-events.spec.ts +218 -0
  206. package/tests/consumer-fixtures.ts +132 -0
  207. package/tests/consumer-ops.spec.ts +351 -0
  208. package/tests/consumer-rights.integration.spec.ts +150 -0
  209. package/tests/consumer-rights.spec.ts +501 -0
  210. package/tests/context.ts +109 -0
  211. package/tests/entitlement.spec.ts +103 -0
  212. package/tests/estimate.spec.ts +240 -0
  213. package/tests/events.spec.ts +356 -0
  214. package/tests/fake-stripe.ts +972 -0
  215. package/tests/gate.spec.ts +62 -72
  216. package/tests/limit-gate.spec.ts +68 -0
  217. package/tests/portal.spec.ts +200 -0
  218. package/tests/protocol.spec.ts +23 -6
  219. package/tests/sync.spec.ts +114 -0
  220. package/tests/usage.integration.spec.ts +101 -0
  221. package/tests/usage.spec.ts +171 -0
  222. package/tests/webhook-manager.spec.ts +152 -0
package/build/gate.js CHANGED
@@ -1,37 +1,77 @@
1
1
  import { createLazyService } from '@owlmeans/context';
2
2
  import { AuthForbidden, entitySlugOf } from '@owlmeans/auth';
3
- import { ENTITLEMENT_GATE, hasEntitlement, SubscriptionStatus } from '@owlmeans/payment';
4
- import { subscriptions } from './utils.js';
3
+ import { hasPermission } from '@owlmeans/iam';
4
+ import { CapabilityRequired, ENTITLEMENT_GATE, parseEntitlementParam, promoActive, } from '@owlmeans/payment';
5
+ import { capabilityOf } from '@owlmeans/payment';
6
+ import { resolveEffectivePlan } from './plan.js';
7
+ import { entitlements } from './utils.js';
8
+ export const defaultEntity = (req) => req.entity?.id ?? entitySlugOf(req.auth) ?? null;
9
+ /**
10
+ * The capability sets an entity's effective plan grants now — sets behind a lapsed promo left out.
11
+ * Empty when the plan is not of one of `productSkus`.
12
+ */
5
13
  export const entitlementsOf = async (ctx, entityId, productSkus) => {
6
- const { items } = await subscriptions(ctx).list({
7
- entityId, status: [SubscriptionStatus.Active, SubscriptionStatus.Trial], productSku: productSkus,
8
- }, { size: 0 });
9
- return items.flatMap(record => record.capabilities ?? []);
14
+ const { plan, subscription } = await resolveEffectivePlan(ctx, entityId);
15
+ if (productSkus != null && !productSkus.includes(plan.productSku)) {
16
+ return [];
17
+ }
18
+ const at = new Date();
19
+ return (plan.capabilities ?? [])
20
+ .filter(set => promoActive(set.promo, subscription?.createdAt, at))
21
+ .map(({ promo: _promo, ...set }) => set);
10
22
  };
11
- const defaultEntity = (req) => req.entity?.id ?? entitySlugOf(req.auth) ?? null;
12
- export const makeEntitlementGate = (alias = ENTITLEMENT_GATE, opts) => {
23
+ /** An explicit `false` for the permission in the token denies, whatever the plan grants. */
24
+ const tokenDenies = (auth, param) => {
25
+ const { scope, permission } = parseEntitlementParam(param);
26
+ return auth.permissions?.some(set => (scope == null || set.scope === scope) && set.permissions?.[permission] === false) ?? false;
27
+ };
28
+ const tokenGrants = (auth, param) => {
29
+ const { scope, permission } = parseEntitlementParam(param);
30
+ return hasPermission(auth, permission, scope != null ? { scope } : undefined);
31
+ };
32
+ /** Resolve the authenticated entity a gate asserts for, or refuse. */
33
+ export const gateEntityOf = (req, opts) => {
34
+ if (req.auth == null) {
35
+ throw new AuthForbidden('auth');
36
+ }
37
+ const entityId = (opts?.resolveEntity ?? defaultEntity)(req);
38
+ if (entityId == null || entityId === '') {
39
+ throw new AuthForbidden('entity');
40
+ }
41
+ return { auth: req.auth, entityId };
42
+ };
43
+ /**
44
+ * The capability gate (`ENTITLEMENT_GATE`): passes when the effective plan grants ANY of the
45
+ * parameters (`[scope:]permission[>=n]`) and the token does not deny it. Fails closed — an unreadable
46
+ * store refuses. Refuses with `CapabilityRequired`, an `AuthForbidden`.
47
+ */
48
+ export const makeCapabilityGate = (alias = ENTITLEMENT_GATE, opts) => {
13
49
  const service = createLazyService(alias, {
14
50
  assert: async (req, _, params) => {
15
51
  await service.ready();
16
52
  const ctx = service.assertCtx();
17
- if (req.auth == null)
18
- throw new AuthForbidden('auth');
19
- const entityId = (opts?.resolveEntity ?? defaultEntity)(req);
20
- if (entityId == null || entityId === '')
21
- throw new AuthForbidden('entity');
22
- let capabilities;
53
+ const { auth, entityId } = gateEntityOf(req, opts);
54
+ const list = (Array.isArray(params) ? params : [params]).filter(param => typeof param === 'string');
55
+ let view;
23
56
  try {
24
- capabilities = await entitlementsOf(ctx, entityId, opts?.productSkus);
57
+ view = await entitlements(ctx).entitlements(entityId);
25
58
  }
26
59
  catch (error) {
27
- console.error(`entitlement gate: cannot read subscriptions for "${entityId}"`, error);
28
- throw new AuthForbidden('entitlement');
60
+ console.error(`capability gate: cannot resolve entitlements of "${entityId}"`, error);
61
+ throw new CapabilityRequired(list);
62
+ }
63
+ if (opts?.productSkus != null && !opts.productSkus.includes(view.plan.productSku)) {
64
+ throw new CapabilityRequired(list);
29
65
  }
30
- if (!params.some(param => hasEntitlement(capabilities, param))) {
31
- throw new AuthForbidden('entitlement');
66
+ const allowed = list.some(param => capabilityOf(view, param) && !tokenDenies(auth, param)
67
+ && (opts?.requirePermission !== true || tokenGrants(auth, param)));
68
+ if (!allowed) {
69
+ throw new CapabilityRequired(list);
32
70
  }
33
71
  },
34
72
  });
35
73
  return service;
36
74
  };
75
+ /** The capability gate under its historical name. */
76
+ export const makeEntitlementGate = makeCapabilityGate;
37
77
  //# sourceMappingURL=gate.js.map
package/build/gate.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAExF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAQ1C,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAe,EAAE,QAAgB,EAAE,WAAsB,EAC/B,EAAE;IAC5B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,WAAW;KACjG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,GAAoB,EAAiB,EAAE,CAC5D,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,IAAwB,CAAC,IAAI,IAAI,CAAA;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAK,GAAW,gBAAgB,EAAE,IAA6B,EAClD,EAAE;IACf,MAAM,OAAO,GAAG,iBAAiB,CAAc,KAAK,EAAE;QACpD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;YACrB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAA4C,CAAA;YACzE,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI;gBAAE,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;YACrD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,aAAa,IAAI,aAAa,CAAC,CAAC,GAAG,CAAC,CAAA;YAC5D,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE;gBAAE,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAA;YAE1E,IAAI,YAA6B,CAAA;YACjC,IAAI,CAAC;gBACH,YAAY,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAA;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oDAAoD,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAA;gBACrF,MAAM,IAAI,aAAa,CAAC,aAAa,CAAC,CAAA;YACxC,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,aAAa,CAAC,aAAa,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../src/gate.ts"],"names":[],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -5,8 +5,23 @@ export * from './resource.js';
5
5
  export * from './observer.js';
6
6
  export * from './service.js';
7
7
  export * from './gate.js';
8
+ export * from './limit.js';
9
+ export * from './entitlement.js';
10
+ export * from './reconcile.js';
8
11
  export * from './entrypoints.js';
9
- export { initialize as syncPaymentProducts, planLookupKey } from './sync.js';
10
- export { amountCheckoutLineItem } from './plugins/stripe.js';
11
- export { payment, gateway, observer, paygateCustomers, subscriptions, fingerprints, activeSubscription, } from './utils.js';
12
+ export { findPlan, findProduct, freePlanOf, planRank, resolveEffectivePlan } from './plan.js';
13
+ export { consumeLimit, consumptionByRefOf, consumptionOf, limitStateOf, reconcileLedgerCounters, reconcileOccupancyOf, releaseLimit } from './usage.js';
14
+ export { classifySubscriptionChange, commitSubscription, propagatedStateOf, subscriptionEventKey, } from './subscription.js';
15
+ export type { CommitOptions, CommitResult } from './subscription.js';
16
+ export { planLookupKey, syncedPlanPrices, syncPaymentProducts, syncStripeProducts } from './sync.js';
17
+ export { amountCheckoutLineItem, quantityCheckoutLineItem } from './plugins/stripe.js';
18
+ export { assertAmountAllowed, narrowAmountFor, sessionTtlOf } from './plugins/checkout-plugins.js';
19
+ export * from './consumer/index.js';
20
+ export { makeEstimateCache, estimateStripePrice } from './plugins/estimate.js';
21
+ export type { EstimateCache } from './plugins/estimate.js';
22
+ export { applySubscription, createEventHandler, mapStatus } from './plugins/events.js';
23
+ export type { ApplyOptions } from './plugins/events.js';
24
+ export { ensureWebhookEndpoint, stripeWebhookSecret, stripeWebhookSecrets, webhookUrlOf, } from './plugins/webhook-manager.js';
25
+ export { ensurePortalConfiguration } from './plugins/portal.js';
26
+ export { activeSubscription, apiVersionOf, billingProfiles, consumerConsents, consumerDeclarations, consumerEvents, consumerRights, consumerRightsOf, entitlements, fingerprints, fulfillments, gateway, observer, paygateCustomers, payment, paymentWebhooks, purchases, stripeClient, stripeConfig, subscriptions, usageCounters, usageEvents, } from './utils.js';
12
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EACL,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,GAC9F,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC7F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACvJ,OAAO,EACL,0BAA0B,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,GACxF,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACpG,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAClG,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC9E,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACtF,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EACL,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,GAC/E,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EACzG,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAC/G,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,GAC3G,MAAM,YAAY,CAAA"}
package/build/index.js CHANGED
@@ -4,8 +4,20 @@ export * from './resource.js';
4
4
  export * from './observer.js';
5
5
  export * from './service.js';
6
6
  export * from './gate.js';
7
+ export * from './limit.js';
8
+ export * from './entitlement.js';
9
+ export * from './reconcile.js';
7
10
  export * from './entrypoints.js';
8
- export { initialize as syncPaymentProducts, planLookupKey } from './sync.js';
9
- export { amountCheckoutLineItem } from './plugins/stripe.js';
10
- export { payment, gateway, observer, paygateCustomers, subscriptions, fingerprints, activeSubscription, } from './utils.js';
11
+ export { findPlan, findProduct, freePlanOf, planRank, resolveEffectivePlan } from './plan.js';
12
+ export { consumeLimit, consumptionByRefOf, consumptionOf, limitStateOf, reconcileLedgerCounters, reconcileOccupancyOf, releaseLimit } from './usage.js';
13
+ export { classifySubscriptionChange, commitSubscription, propagatedStateOf, subscriptionEventKey, } from './subscription.js';
14
+ export { planLookupKey, syncedPlanPrices, syncPaymentProducts, syncStripeProducts } from './sync.js';
15
+ export { amountCheckoutLineItem, quantityCheckoutLineItem } from './plugins/stripe.js';
16
+ export { assertAmountAllowed, narrowAmountFor, sessionTtlOf } from './plugins/checkout-plugins.js';
17
+ export * from './consumer/index.js';
18
+ export { makeEstimateCache, estimateStripePrice } from './plugins/estimate.js';
19
+ export { applySubscription, createEventHandler, mapStatus } from './plugins/events.js';
20
+ export { ensureWebhookEndpoint, stripeWebhookSecret, stripeWebhookSecrets, webhookUrlOf, } from './plugins/webhook-manager.js';
21
+ export { ensurePortalConfiguration } from './plugins/portal.js';
22
+ export { activeSubscription, apiVersionOf, billingProfiles, consumerConsents, consumerDeclarations, consumerEvents, consumerRights, consumerRightsOf, entitlements, fingerprints, fulfillments, gateway, observer, paygateCustomers, payment, paymentWebhooks, purchases, stripeClient, stripeConfig, subscriptions, usageCounters, usageEvents, } from './utils.js';
11
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EACL,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,GAC9F,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAC7F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACvJ,OAAO,EACL,0BAA0B,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB,GACxF,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACpG,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AACtF,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAClG,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEtF,OAAO,EACL,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,GAC/E,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EACzG,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAC/G,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,GAC3G,MAAM,YAAY,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { GateService } from '@owlmeans/entrypoint';
2
+ import type { EntityResolverOption } from './gate.js';
3
+ export interface LimitGateOptions extends EntityResolverOption {
4
+ }
5
+ /**
6
+ * The limit gate (`LIMIT_GATE`): passes when ANY `limit:<key>[>=n]` parameter has at least `n` left
7
+ * in its current window. It never consumes — checking room and spending it are different moments,
8
+ * and only the handler knows the work started. Malformed parameters and keys the plan does not
9
+ * declare are skipped; a store error refuses. Refuses with `LimitExhausted` naming the first
10
+ * declared key, an `AuthForbidden`.
11
+ */
12
+ export declare const makeLimitGate: (alias?: string, opts?: LimitGateOptions) => GateService;
13
+ //# sourceMappingURL=limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limit.d.ts","sourceRoot":"","sources":["../src/limit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAIrD,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;CAAG;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,WAAW,MAAM,SAAsB,gBAAgB,KAAG,WAqCnF,CAAA"}
package/build/limit.js ADDED
@@ -0,0 +1,47 @@
1
+ import { createLazyService } from '@owlmeans/context';
2
+ import { LIMIT_GATE, LimitExhausted, LimitUnknown, parseLimitParam } from '@owlmeans/payment';
3
+ import { gateEntityOf } from './gate.js';
4
+ import { entitlements } from './utils.js';
5
+ /**
6
+ * The limit gate (`LIMIT_GATE`): passes when ANY `limit:<key>[>=n]` parameter has at least `n` left
7
+ * in its current window. It never consumes — checking room and spending it are different moments,
8
+ * and only the handler knows the work started. Malformed parameters and keys the plan does not
9
+ * declare are skipped; a store error refuses. Refuses with `LimitExhausted` naming the first
10
+ * declared key, an `AuthForbidden`.
11
+ */
12
+ export const makeLimitGate = (alias = LIMIT_GATE, opts) => {
13
+ const service = createLazyService(alias, {
14
+ assert: async (req, _, params) => {
15
+ await service.ready();
16
+ const ctx = service.assertCtx();
17
+ const { entityId } = gateEntityOf(req, opts);
18
+ const list = (Array.isArray(params) ? params : [params]).filter(param => typeof param === 'string');
19
+ const parsed = list.map(parseLimitParam).filter((param) => param != null);
20
+ if (parsed.length === 0) {
21
+ throw new LimitExhausted({ key: list[0] ?? 'unknown', used: 0, limit: 0 });
22
+ }
23
+ let refused = null;
24
+ for (const param of parsed) {
25
+ let state;
26
+ try {
27
+ state = await entitlements(ctx).limitState(entityId, param.key);
28
+ }
29
+ catch (error) {
30
+ if (!(error instanceof LimitUnknown)) {
31
+ console.error(`limit gate: cannot read "${param.key}" of "${entityId}"`, error);
32
+ }
33
+ continue;
34
+ }
35
+ if (state.remaining >= param.atLeast) {
36
+ return;
37
+ }
38
+ refused ??= state;
39
+ }
40
+ throw new LimitExhausted(refused != null
41
+ ? { key: refused.key, used: refused.used, limit: refused.limit, resetsAt: refused.resetsAt }
42
+ : { key: parsed[0].key, used: 0, limit: 0 });
43
+ },
44
+ });
45
+ return service;
46
+ };
47
+ //# sourceMappingURL=limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limit.js","sourceRoot":"","sources":["../src/limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAG7F,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAKzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,GAAW,UAAU,EAAE,IAAuB,EAAe,EAAE;IAChG,MAAM,OAAO,GAAG,iBAAiB,CAAc,KAAK,EAAE;QACpD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;YACrB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAA4C,CAAA;YACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAA;YAEnG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAuB,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;YAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;YAC5E,CAAC;YAED,IAAI,OAAO,GAAqB,IAAI,CAAA;YACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAgB,CAAA;gBACpB,IAAI,CAAC;oBACH,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;gBACjE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,EAAE,CAAC;wBACrC,OAAO,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,GAAG,SAAS,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAA;oBACjF,CAAC;oBACD,SAAQ;gBACV,CAAC;gBACD,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBACrC,OAAM;gBACR,CAAC;gBACD,OAAO,KAAK,KAAK,CAAA;YACnB,CAAC;YAED,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,IAAI;gBACtC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;gBAC5F,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QAChD,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
package/build/model.d.ts CHANGED
@@ -1,6 +1,15 @@
1
1
  import type { JSONSchemaType } from 'ajv';
2
- import type { FingerprintRecord, PaygateCustomerRecord, PaymentSubscriptionRecord } from './types.js';
2
+ import type { BillingProfileRecord, ConsumerConsentRecord, ConsumerDeclarationRecord, ConsumerEventRecord, FingerprintRecord, PaygateCustomerRecord, PaymentFulfillmentRecord, PaymentSubscriptionRecord, PaymentUsageCounterRecord, PaymentUsageRecord, PaymentWebhookRecord, PurchaseRecord } from './types.js';
3
3
  export declare const PaygateCustomerSchema: JSONSchemaType<PaygateCustomerRecord>;
4
4
  export declare const PaymentSubscriptionSchema: JSONSchemaType<PaymentSubscriptionRecord>;
5
+ export declare const PaymentFulfillmentSchema: JSONSchemaType<PaymentFulfillmentRecord>;
6
+ export declare const PaymentWebhookSchema: JSONSchemaType<PaymentWebhookRecord>;
7
+ export declare const PaymentUsageSchema: JSONSchemaType<PaymentUsageRecord>;
8
+ export declare const PaymentUsageCounterSchema: JSONSchemaType<PaymentUsageCounterRecord>;
5
9
  export declare const FingerprintSchema: JSONSchemaType<FingerprintRecord>;
10
+ export declare const BillingProfileSchema: JSONSchemaType<BillingProfileRecord>;
11
+ export declare const PurchaseSchema: JSONSchemaType<PurchaseRecord>;
12
+ export declare const ConsumerConsentSchema: JSONSchemaType<ConsumerConsentRecord>;
13
+ export declare const ConsumerDeclarationSchema: JSONSchemaType<ConsumerDeclarationRecord>;
14
+ export declare const ConsumerEventSchema: JSONSchemaType<ConsumerEventRecord>;
6
15
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AAGzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAErG,eAAO,MAAM,qBAAqB,EASlB,cAAc,CAAC,qBAAqB,CAAC,CAAA;AAErD,eAAO,MAAM,yBAAyB,EAWtB,cAAc,CAAC,yBAAyB,CAAC,CAAA;AAEzD,eAAO,MAAM,iBAAiB,EAOd,cAAc,CAAC,iBAAiB,CAAC,CAAA"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,KAAK,CAAA;AAMzC,OAAO,KAAK,EACV,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,iBAAiB,EAC9G,qBAAqB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,yBAAyB,EACrG,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EACzD,MAAM,YAAY,CAAA;AAkBnB,eAAO,MAAM,qBAAqB,EAQlB,cAAc,CAAC,qBAAqB,CAAC,CAAA;AAErD,eAAO,MAAM,yBAAyB,EA2BtB,cAAc,CAAC,yBAAyB,CAAC,CAAA;AAEzD,eAAO,MAAM,wBAAwB,EAcrB,cAAc,CAAC,wBAAwB,CAAC,CAAA;AAExD,eAAO,MAAM,oBAAoB,EAUjB,cAAc,CAAC,oBAAoB,CAAC,CAAA;AAEpD,eAAO,MAAM,kBAAkB,EAQf,cAAc,CAAC,kBAAkB,CAAC,CAAA;AAElD,eAAO,MAAM,yBAAyB,EAQtB,cAAc,CAAC,yBAAyB,CAAC,CAAA;AAEzD,eAAO,MAAM,iBAAiB,EAgCd,cAAc,CAAC,iBAAiB,CAAC,CAAA;AAoBjD,eAAO,MAAM,oBAAoB,EAUjB,cAAc,CAAC,oBAAoB,CAAC,CAAA;AAEpD,eAAO,MAAM,cAAc,EAoBX,cAAc,CAAC,cAAc,CAAC,CAAA;AAE9C,eAAO,MAAM,qBAAqB,EAmBlB,cAAc,CAAC,qBAAqB,CAAC,CAAA;AAErD,eAAO,MAAM,yBAAyB,EAatB,cAAc,CAAC,yBAAyB,CAAC,CAAA;AAEzD,eAAO,MAAM,mBAAmB,EAkBhB,cAAc,CAAC,mBAAmB,CAAC,CAAA"}
package/build/model.js CHANGED
@@ -1,33 +1,231 @@
1
- import { PermissionSetSchema } from '@owlmeans/auth';
2
- import { LimitConfigSchema } from '@owlmeans/payment';
1
+ import { DateSchema } from '@owlmeans/auth';
2
+ import { CancellationKindSchema, CheckoutPricingModeSchema, ConsentKindSchema, ConsumerRegionSchema, DeclarationChannelSchema, DeclarationKindSchema, PurchaseKindSchema, SubscriptionStatusSchema, } from '@owlmeans/payment';
3
+ /**
4
+ * Record schemas. Every stored property is declared: the resource coerces a write through its
5
+ * schema, and a property the schema does not know is written as a string. Dates follow the record
6
+ * convention (`DateSchema`). None of these records declares an ObjectId reference — `entityId`
7
+ * is an organization key and every other id is the paygate's.
8
+ */
9
+ const str = { type: 'string' };
10
+ const optStr = { type: 'string', nullable: true };
11
+ const num = { type: 'number' };
12
+ const optNum = { type: 'number', nullable: true };
13
+ const optBool = { type: 'boolean', nullable: true };
14
+ const date = DateSchema;
15
+ const optDate = { ...DateSchema, nullable: true };
16
+ const id = { type: 'string', nullable: true };
3
17
  export const PaygateCustomerSchema = {
4
18
  type: 'object',
5
19
  properties: {
6
- id: { type: 'string', nullable: true }, paygate: { type: 'string' }, externalId: { type: 'string' },
7
- entityId: { type: 'string', nullable: true }, profileId: { type: 'string', nullable: true },
8
- email: { type: 'string', nullable: true }, name: { type: 'string', nullable: true },
9
- taxId: { type: 'string', nullable: true },
20
+ id, paygate: str, externalId: str, entityId: optStr, profileId: optStr, email: optStr, name: optStr,
21
+ taxId: optStr, country: optStr, currency: optStr, deletedAt: optDate,
10
22
  },
11
- required: ['paygate', 'externalId'], additionalProperties: true,
23
+ required: ['paygate', 'externalId'],
24
+ additionalProperties: false,
12
25
  };
13
26
  export const PaymentSubscriptionSchema = {
14
27
  type: 'object',
15
28
  properties: {
16
- id: { type: 'string', nullable: true }, sku: { type: 'string' }, productSku: { type: 'string' },
17
- entityId: { type: 'string' }, service: { type: 'string' }, paygate: { type: 'string' },
18
- externalId: { type: 'string' }, status: { type: 'string' }, kind: { type: 'string' },
19
- capabilities: { type: 'array', items: PermissionSetSchema, nullable: true },
20
- limits: { type: 'object', nullable: true, additionalProperties: LimitConfigSchema, required: [] },
29
+ id, entityId: str, planSku: str, productSku: str, service: str, paygate: str, externalId: str,
30
+ itemId: optStr, priceId: optStr, status: SubscriptionStatusSchema, externalStatus: optStr, rank: num,
31
+ periodStart: optDate, periodEnd: optDate, cancelAtPeriodEnd: optBool, canceledAt: optDate,
32
+ endedAt: optDate, pausedAt: optDate, trialEnd: optDate, latestInvoiceId: optStr, customerId: optStr,
33
+ disputedAt: optDate, disputeStatus: optStr, createdAt: date, updatedAt: optDate, syncedAt: optDate,
34
+ lastEventId: optStr, initialPropagatedAt: optDate, currency: optStr,
35
+ checkoutSessionId: optStr, purchaseId: optStr, firstInvoiceId: optStr, country: optStr, email: optStr,
36
+ amountTotalMinor: optNum, amountTaxMinor: optNum, termsAccepted: optBool, startRequestId: optStr,
37
+ withdrawnAt: optDate,
38
+ propagated: {
39
+ type: 'object',
40
+ nullable: true,
41
+ properties: {
42
+ planSku: str, rank: num, status: SubscriptionStatusSchema, cancelAtPeriodEnd: optBool,
43
+ pausedAt: optDate, renewedInvoiceId: optStr,
44
+ },
45
+ required: ['planSku', 'rank', 'status'],
46
+ additionalProperties: false,
47
+ },
21
48
  },
22
- required: ['sku', 'productSku', 'entityId', 'service', 'paygate', 'externalId', 'status', 'kind'],
23
- additionalProperties: true,
49
+ required: [
50
+ 'entityId', 'planSku', 'productSku', 'service', 'paygate', 'externalId', 'status', 'rank', 'createdAt',
51
+ ],
52
+ additionalProperties: false,
53
+ };
54
+ export const PaymentFulfillmentSchema = {
55
+ type: 'object',
56
+ properties: {
57
+ id, entityId: str, productSku: str, planSku: optStr, service: str, paygate: str, externalId: str,
58
+ paymentIntentId: optStr, chargeId: optStr, invoiceId: optStr, mode: CheckoutPricingModeSchema,
59
+ units: optNum, amountMinor: optNum, sourceChargeAmountMinor: optNum, amountCurrency: optStr,
60
+ chargeAmountMinor: optNum, currency: optStr, createdAt: date,
61
+ fulfilledAt: optDate, failedAt: optDate, refundedMinor: optNum, refundedAt: optDate,
62
+ disputedAt: optDate, disputeStatus: optStr,
63
+ country: optStr, email: optStr, profileId: optStr, amountTotalMinor: optNum, amountTaxMinor: optNum,
64
+ termsAccepted: optBool, purchaseId: optStr,
65
+ },
66
+ required: ['entityId', 'productSku', 'service', 'paygate', 'externalId', 'mode', 'createdAt'],
67
+ additionalProperties: false,
68
+ };
69
+ export const PaymentWebhookSchema = {
70
+ type: 'object',
71
+ properties: {
72
+ id, paygate: str, service: str, url: str, externalId: str,
73
+ /** The signing secret: field-encrypted when the database is configured with a key. */
74
+ secret: { type: 'string', secure: true },
75
+ apiVersion: str, events: { type: 'array', items: str }, hash: str, createdAt: date, updatedAt: optDate,
76
+ },
77
+ required: ['paygate', 'service', 'url', 'externalId', 'secret', 'apiVersion', 'events', 'hash', 'createdAt'],
78
+ additionalProperties: false,
79
+ };
80
+ export const PaymentUsageSchema = {
81
+ type: 'object',
82
+ properties: {
83
+ id, entityId: str, limitKey: str, window: str, delta: num, eventKey: str, ref: optStr, reason: optStr,
84
+ planSku: optStr, createdAt: date, releasedAt: optDate,
85
+ },
86
+ required: ['entityId', 'limitKey', 'window', 'delta', 'eventKey', 'createdAt'],
87
+ additionalProperties: false,
88
+ };
89
+ export const PaymentUsageCounterSchema = {
90
+ type: 'object',
91
+ properties: {
92
+ id, entityId: str, limitKey: str, window: str, used: num, limit: num, planSku: optStr,
93
+ overSince: optDate, updatedAt: date, reconciledAt: optDate,
94
+ },
95
+ required: ['entityId', 'limitKey', 'window', 'used', 'limit', 'updatedAt'],
96
+ additionalProperties: false,
24
97
  };
25
98
  export const FingerprintSchema = {
26
99
  type: 'object',
27
100
  properties: {
28
- id: { type: 'string', nullable: true }, sku: { type: 'string' }, hash: { type: 'string' },
29
- productId: { type: 'string', nullable: true },
101
+ id, sku: str, hash: str, productId: optStr, externalId: optStr,
102
+ prices: {
103
+ type: 'array',
104
+ nullable: true,
105
+ items: {
106
+ type: 'object',
107
+ properties: {
108
+ planSku: str, priceId: str, lookupKey: str, currency: str, unitAmount: num,
109
+ // An array, never a currency-keyed map: the resource coerces a map's values to strings.
110
+ options: {
111
+ type: 'array',
112
+ items: {
113
+ type: 'object', properties: { currency: str, unitAmount: num },
114
+ required: ['currency', 'unitAmount'], additionalProperties: false,
115
+ },
116
+ },
117
+ taxBehavior: optStr, interval: optStr, sourceUnitAmount: num, sourceCurrency: str, syncedAt: date,
118
+ },
119
+ required: [
120
+ 'planSku', 'priceId', 'lookupKey', 'currency', 'unitAmount', 'options', 'sourceUnitAmount',
121
+ 'sourceCurrency', 'syncedAt',
122
+ ],
123
+ additionalProperties: false,
124
+ },
125
+ },
126
+ updatedAt: date,
127
+ },
128
+ required: ['sku', 'hash', 'updatedAt'],
129
+ additionalProperties: false,
130
+ };
131
+ /** An optional enum: `null` must be listed for a validator to accept it. */
132
+ const nullableEnum = (values) => ({ type: 'string', enum: [...values, null], nullable: true });
133
+ /** The request evidence every consumer act carries (`RequestOrigin`). */
134
+ const origin = {
135
+ ip: optStr, forwardedFor: optStr, userAgent: optStr, ipCountry: optStr, acceptLanguage: optStr, via: optStr,
136
+ };
137
+ const links = {
138
+ type: 'object',
139
+ properties: {
140
+ billingTerms: str, withdrawalInformation: optStr, withdrawalForm: optStr, withdrawalFunction: optStr,
141
+ cancellation: optStr,
142
+ },
143
+ required: ['billingTerms'],
144
+ additionalProperties: false,
145
+ };
146
+ export const BillingProfileSchema = {
147
+ type: 'object',
148
+ properties: {
149
+ id, entityId: str, country: str, region: ConsumerRegionSchema, currency: str, language: str,
150
+ source: { type: 'string', enum: ['checkout', 'customer', 'manual'] }, paygate: str, customerId: optStr,
151
+ sessionId: optStr, ipCountry: optStr, email: optStr, name: optStr, business: optBool, lockedAt: date,
152
+ createdAt: date, updatedAt: optDate,
153
+ },
154
+ required: ['entityId', 'country', 'region', 'currency', 'language', 'source', 'paygate', 'lockedAt', 'createdAt'],
155
+ additionalProperties: false,
156
+ };
157
+ export const PurchaseSchema = {
158
+ type: 'object',
159
+ properties: {
160
+ id, purchaseId: str, contractRef: str, entityId: str, kind: PurchaseKindSchema, paygate: str,
161
+ sessionId: optStr, subscriptionId: optStr, paymentIntentId: optStr, invoiceId: optStr, invoiceNumber: optStr,
162
+ invoiceLineId: optStr, productSku: str, planSku: optStr, profileId: optStr, country: optStr,
163
+ region: nullableEnum(ConsumerRegionSchema.enum), ipCountry: optStr, inScope: { type: 'boolean' },
164
+ language: str, email: optStr, name: optStr, business: optBool, currency: str, amountSubtotalMinor: num,
165
+ amountTaxMinor: num, amountTotalMinor: num, presentmentCurrency: optStr, presentmentAmountMinor: optNum,
166
+ netAmountMinor: optNum, amountCurrency: optStr, units: optNum, taxBehavior: optStr, termsAccepted: optBool,
167
+ textVersion: optStr, copyVersion: optStr, startRequestId: optStr, servicesStartedAt: optDate,
168
+ confirmationMailAt: optDate, purchasedAt: date, deadline: optDate, consentId: optStr, consentedAt: optDate,
169
+ withdrawalId: optStr, withdrawnAt: optDate, refundedMinor: optNum, refundedAt: optDate, cancellationId: optStr,
170
+ cancelEffectiveAt: optDate, createdAt: date, updatedAt: optDate,
171
+ },
172
+ required: [
173
+ 'purchaseId', 'contractRef', 'entityId', 'kind', 'paygate', 'productSku', 'inScope', 'language', 'currency',
174
+ 'amountSubtotalMinor', 'amountTaxMinor', 'amountTotalMinor', 'purchasedAt', 'createdAt',
175
+ ],
176
+ additionalProperties: false,
177
+ };
178
+ export const ConsumerConsentSchema = {
179
+ type: 'object',
180
+ properties: {
181
+ id, kind: ConsentKindSchema, entityId: str, profileId: optStr, name: optStr, email: optStr,
182
+ purchaseIds: { type: 'array', items: str },
183
+ planSku: optStr, planName: optStr, textVersion: str, copyVersion: str, language: str, uiLanguage: optStr, trader: str,
184
+ text: {
185
+ type: 'object',
186
+ properties: { request: str, acknowledgement: str, checkbox: str },
187
+ required: ['request', 'acknowledgement', 'checkbox'],
188
+ additionalProperties: false,
189
+ },
190
+ links, deadline: optDate, decidedAt: date, expiresAt: optDate, ...origin,
191
+ },
192
+ required: [
193
+ 'kind', 'entityId', 'purchaseIds', 'textVersion', 'copyVersion', 'language', 'trader', 'text', 'links',
194
+ 'decidedAt',
195
+ ],
196
+ additionalProperties: false,
197
+ };
198
+ export const ConsumerDeclarationSchema = {
199
+ type: 'object',
200
+ properties: {
201
+ id, kind: DeclarationKindSchema, channel: DeclarationChannelSchema, entityId: optStr, purchaseId: optStr,
202
+ subscriptionId: optStr, contractRef: optStr, name: str, email: str,
203
+ cancellationKind: nullableEnum(CancellationKindSchema.enum), reason: optStr,
204
+ effective: nullableEnum(['earliest', 'date']), requestedDate: optStr,
205
+ language: str, textVersion: optStr, copyVersion: str, receivedAt: date, matched: { type: 'boolean' },
206
+ profileId: optStr, duplicateOf: optStr, status: str, refundMinor: optNum, currency: optStr,
207
+ effectiveAt: optDate, ...origin,
208
+ },
209
+ required: ['kind', 'channel', 'name', 'email', 'language', 'copyVersion', 'receivedAt', 'matched', 'status'],
210
+ additionalProperties: false,
211
+ };
212
+ export const ConsumerEventSchema = {
213
+ type: 'object',
214
+ properties: {
215
+ id, recordId: str,
216
+ recordKind: { type: 'string', enum: ['purchase', 'consent', 'declaration', 'profile', 'checkout'] },
217
+ entityId: optStr,
218
+ action: {
219
+ type: 'string',
220
+ enum: [
221
+ 'mail', 'computed', 'meter', 'refund', 'credit-note', 'subscription-cancel', 'cancel-scheduled', 'observers',
222
+ 'lock', 'lock-mismatch', 'relock', 'unlock', 'duplicate', 'checkout-terms-fallback',
223
+ ],
224
+ },
225
+ step: optStr, ok: { type: 'boolean' }, skipped: optBool, externalId: optStr, amountMinor: optNum,
226
+ currency: optStr, detail: optStr, error: optStr, at: date,
30
227
  },
31
- required: ['sku', 'hash'], additionalProperties: true,
228
+ required: ['recordId', 'recordKind', 'action', 'ok', 'at'],
229
+ additionalProperties: false,
32
230
  };
33
231
  //# sourceMappingURL=model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGrD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACnG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC3F,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACnF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC1C;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,oBAAoB,EAAE,IAAI;CACZ,CAAA;AAErD,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/F,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACtF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpF,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE;QACpF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,EAAE,iBAA0B,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC3G;IACD,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC;IACjG,oBAAoB,EAAE,IAAI;CAC6B,CAAA;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzF,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KAC9C;IACD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,oBAAoB,EAAE,IAAI;CACN,CAAA"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,13 @@
1
1
  import type { CompletionObserver, Config, Context } from './types.js';
2
+ /**
3
+ * The application's side of payment completion. Callbacks run sequentially and are awaited; a
4
+ * throw escapes to the webhook so the paygate delivers the event again — every callback must be
5
+ * idempotent by the `eventKey` (`externalId` for a top-up) it is handed.
6
+ *
7
+ * The consumer-rights callbacks (`onConsent`, `onWithdrawal`, `onCancellation`) run after the
8
+ * records and the paygate steps of their act; a throw is recorded as an `observers` event and
9
+ * retried by the consumer-rights `reconcile()` — they, too, are idempotent by `eventKey`.
10
+ */
2
11
  export declare const makeCompletionObserverService: (alias?: string) => CompletionObserver;
3
12
  export declare const appendCompletionObserver: <C extends Config, T extends Context<C>>(ctx: T, alias?: string) => T;
4
13
  //# sourceMappingURL=observer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAuC,MAAM,YAAY,CAAA;AAE1G,eAAO,MAAM,6BAA6B,WACjC,MAAM,KACZ,kBAaF,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,OACxE,CAAC,UAAS,MAAM,KACpB,CAGF,CAAA"}
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../src/observer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACY,kBAAkB,EAAE,MAAM,EAAmB,OAAO,EAE3E,MAAM,YAAY,CAAA;AAEnB;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,WACjC,MAAM,KACZ,kBAkCF,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,OACxE,CAAC,UAAS,MAAM,KACpB,CAGF,CAAA"}