@codelitdev/billing 0.1.0-alpha.1

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 (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +339 -0
  3. package/dist/adapters/drizzle/index.d.ts +28 -0
  4. package/dist/adapters/drizzle/index.d.ts.map +1 -0
  5. package/dist/adapters/drizzle/index.js +75 -0
  6. package/dist/adapters/drizzle/index.js.map +1 -0
  7. package/dist/adapters/drizzle/store.d.ts +37 -0
  8. package/dist/adapters/drizzle/store.d.ts.map +1 -0
  9. package/dist/adapters/drizzle/store.js +889 -0
  10. package/dist/adapters/drizzle/store.js.map +1 -0
  11. package/dist/catalog/index.d.ts +5 -0
  12. package/dist/catalog/index.d.ts.map +1 -0
  13. package/dist/catalog/index.js +4 -0
  14. package/dist/catalog/index.js.map +1 -0
  15. package/dist/catalog/public-view.d.ts +7 -0
  16. package/dist/catalog/public-view.d.ts.map +1 -0
  17. package/dist/catalog/public-view.js +22 -0
  18. package/dist/catalog/public-view.js.map +1 -0
  19. package/dist/catalog/revisions.d.ts +8 -0
  20. package/dist/catalog/revisions.d.ts.map +1 -0
  21. package/dist/catalog/revisions.js +12 -0
  22. package/dist/catalog/revisions.js.map +1 -0
  23. package/dist/catalog/types.d.ts +28 -0
  24. package/dist/catalog/types.d.ts.map +1 -0
  25. package/dist/catalog/types.js +2 -0
  26. package/dist/catalog/types.js.map +1 -0
  27. package/dist/catalog/validate.d.ts +16 -0
  28. package/dist/catalog/validate.d.ts.map +1 -0
  29. package/dist/catalog/validate.js +66 -0
  30. package/dist/catalog/validate.js.map +1 -0
  31. package/dist/cli/bin.d.ts +3 -0
  32. package/dist/cli/bin.d.ts.map +1 -0
  33. package/dist/cli/bin.js +35 -0
  34. package/dist/cli/bin.js.map +1 -0
  35. package/dist/cli/generate.d.ts +15 -0
  36. package/dist/cli/generate.d.ts.map +1 -0
  37. package/dist/cli/generate.js +68 -0
  38. package/dist/cli/generate.js.map +1 -0
  39. package/dist/config/define.d.ts +3 -0
  40. package/dist/config/define.d.ts.map +1 -0
  41. package/dist/config/define.js +5 -0
  42. package/dist/config/define.js.map +1 -0
  43. package/dist/config/index.d.ts +3 -0
  44. package/dist/config/index.d.ts.map +1 -0
  45. package/dist/config/index.js +3 -0
  46. package/dist/config/index.js.map +1 -0
  47. package/dist/config/validate.d.ts +32 -0
  48. package/dist/config/validate.d.ts.map +1 -0
  49. package/dist/config/validate.js +227 -0
  50. package/dist/config/validate.js.map +1 -0
  51. package/dist/core/checkout-attempt.d.ts +29 -0
  52. package/dist/core/checkout-attempt.d.ts.map +1 -0
  53. package/dist/core/checkout-attempt.js +10 -0
  54. package/dist/core/checkout-attempt.js.map +1 -0
  55. package/dist/core/clock.d.ts +10 -0
  56. package/dist/core/clock.d.ts.map +1 -0
  57. package/dist/core/clock.js +26 -0
  58. package/dist/core/clock.js.map +1 -0
  59. package/dist/core/customer.d.ts +13 -0
  60. package/dist/core/customer.d.ts.map +1 -0
  61. package/dist/core/customer.js +2 -0
  62. package/dist/core/customer.js.map +1 -0
  63. package/dist/core/errors.d.ts +28 -0
  64. package/dist/core/errors.d.ts.map +1 -0
  65. package/dist/core/errors.js +43 -0
  66. package/dist/core/errors.js.map +1 -0
  67. package/dist/core/ids.d.ts +15 -0
  68. package/dist/core/ids.d.ts.map +1 -0
  69. package/dist/core/ids.js +29 -0
  70. package/dist/core/ids.js.map +1 -0
  71. package/dist/core/index.d.ts +14 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +14 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/core/money.d.ts +8 -0
  76. package/dist/core/money.d.ts.map +1 -0
  77. package/dist/core/money.js +23 -0
  78. package/dist/core/money.js.map +1 -0
  79. package/dist/core/plan-change-attempt.d.ts +30 -0
  80. package/dist/core/plan-change-attempt.d.ts.map +1 -0
  81. package/dist/core/plan-change-attempt.js +9 -0
  82. package/dist/core/plan-change-attempt.js.map +1 -0
  83. package/dist/core/projection-diff.d.ts +32 -0
  84. package/dist/core/projection-diff.d.ts.map +1 -0
  85. package/dist/core/projection-diff.js +32 -0
  86. package/dist/core/projection-diff.js.map +1 -0
  87. package/dist/core/reconciliation-job.d.ts +21 -0
  88. package/dist/core/reconciliation-job.d.ts.map +1 -0
  89. package/dist/core/reconciliation-job.js +26 -0
  90. package/dist/core/reconciliation-job.js.map +1 -0
  91. package/dist/core/subscription.d.ts +62 -0
  92. package/dist/core/subscription.d.ts.map +1 -0
  93. package/dist/core/subscription.js +14 -0
  94. package/dist/core/subscription.js.map +1 -0
  95. package/dist/core/transitions.d.ts +25 -0
  96. package/dist/core/transitions.d.ts.map +1 -0
  97. package/dist/core/transitions.js +161 -0
  98. package/dist/core/transitions.js.map +1 -0
  99. package/dist/core/webhook-inbox.d.ts +23 -0
  100. package/dist/core/webhook-inbox.d.ts.map +1 -0
  101. package/dist/core/webhook-inbox.js +9 -0
  102. package/dist/core/webhook-inbox.js.map +1 -0
  103. package/dist/maintenance/batches.d.ts +3 -0
  104. package/dist/maintenance/batches.d.ts.map +1 -0
  105. package/dist/maintenance/batches.js +3 -0
  106. package/dist/maintenance/batches.js.map +1 -0
  107. package/dist/maintenance/claims.d.ts +2 -0
  108. package/dist/maintenance/claims.d.ts.map +1 -0
  109. package/dist/maintenance/claims.js +2 -0
  110. package/dist/maintenance/claims.js.map +1 -0
  111. package/dist/maintenance/health.d.ts +13 -0
  112. package/dist/maintenance/health.d.ts.map +1 -0
  113. package/dist/maintenance/health.js +19 -0
  114. package/dist/maintenance/health.js.map +1 -0
  115. package/dist/maintenance/retry.d.ts +9 -0
  116. package/dist/maintenance/retry.d.ts.map +1 -0
  117. package/dist/maintenance/retry.js +19 -0
  118. package/dist/maintenance/retry.js.map +1 -0
  119. package/dist/operations/index.d.ts +28 -0
  120. package/dist/operations/index.d.ts.map +1 -0
  121. package/dist/operations/index.js +106 -0
  122. package/dist/operations/index.js.map +1 -0
  123. package/dist/persistence/memory.d.ts +104 -0
  124. package/dist/persistence/memory.d.ts.map +1 -0
  125. package/dist/persistence/memory.js +657 -0
  126. package/dist/persistence/memory.js.map +1 -0
  127. package/dist/persistence/store.d.ts +126 -0
  128. package/dist/persistence/store.d.ts.map +1 -0
  129. package/dist/persistence/store.js +2 -0
  130. package/dist/persistence/store.js.map +1 -0
  131. package/dist/ports/audit.d.ts +20 -0
  132. package/dist/ports/audit.d.ts.map +1 -0
  133. package/dist/ports/audit.js +9 -0
  134. package/dist/ports/audit.js.map +1 -0
  135. package/dist/ports/authorization.d.ts +28 -0
  136. package/dist/ports/authorization.d.ts.map +1 -0
  137. package/dist/ports/authorization.js +33 -0
  138. package/dist/ports/authorization.js.map +1 -0
  139. package/dist/ports/lifecycle.d.ts +23 -0
  140. package/dist/ports/lifecycle.d.ts.map +1 -0
  141. package/dist/ports/lifecycle.js +2 -0
  142. package/dist/ports/lifecycle.js.map +1 -0
  143. package/dist/ports/sensitive-values.d.ts +23 -0
  144. package/dist/ports/sensitive-values.d.ts.map +1 -0
  145. package/dist/ports/sensitive-values.js +19 -0
  146. package/dist/ports/sensitive-values.js.map +1 -0
  147. package/dist/ports/telemetry.d.ts +16 -0
  148. package/dist/ports/telemetry.d.ts.map +1 -0
  149. package/dist/ports/telemetry.js +48 -0
  150. package/dist/ports/telemetry.js.map +1 -0
  151. package/dist/providers/contract.d.ts +98 -0
  152. package/dist/providers/contract.d.ts.map +1 -0
  153. package/dist/providers/contract.js +2 -0
  154. package/dist/providers/contract.js.map +1 -0
  155. package/dist/providers/dodo/index.d.ts +25 -0
  156. package/dist/providers/dodo/index.d.ts.map +1 -0
  157. package/dist/providers/dodo/index.js +296 -0
  158. package/dist/providers/dodo/index.js.map +1 -0
  159. package/dist/providers/dodo/normalize.d.ts +7 -0
  160. package/dist/providers/dodo/normalize.d.ts.map +1 -0
  161. package/dist/providers/dodo/normalize.js +77 -0
  162. package/dist/providers/dodo/normalize.js.map +1 -0
  163. package/dist/providers/fake/index.d.ts +59 -0
  164. package/dist/providers/fake/index.d.ts.map +1 -0
  165. package/dist/providers/fake/index.js +312 -0
  166. package/dist/providers/fake/index.js.map +1 -0
  167. package/dist/providers/index.d.ts +4 -0
  168. package/dist/providers/index.d.ts.map +1 -0
  169. package/dist/providers/index.js +3 -0
  170. package/dist/providers/index.js.map +1 -0
  171. package/dist/providers/registry.d.ts +10 -0
  172. package/dist/providers/registry.d.ts.map +1 -0
  173. package/dist/providers/registry.js +32 -0
  174. package/dist/providers/registry.js.map +1 -0
  175. package/dist/schema/canonical.d.ts +7 -0
  176. package/dist/schema/canonical.d.ts.map +1 -0
  177. package/dist/schema/canonical.js +35 -0
  178. package/dist/schema/canonical.js.map +1 -0
  179. package/dist/schema/generator.d.ts +3 -0
  180. package/dist/schema/generator.d.ts.map +1 -0
  181. package/dist/schema/generator.js +496 -0
  182. package/dist/schema/generator.js.map +1 -0
  183. package/dist/schema/pglite-sql.d.ts +3 -0
  184. package/dist/schema/pglite-sql.d.ts.map +1 -0
  185. package/dist/schema/pglite-sql.js +226 -0
  186. package/dist/schema/pglite-sql.js.map +1 -0
  187. package/dist/testing/clocks.d.ts +2 -0
  188. package/dist/testing/clocks.d.ts.map +1 -0
  189. package/dist/testing/clocks.js +2 -0
  190. package/dist/testing/clocks.js.map +1 -0
  191. package/dist/testing/consumer-conformance.d.ts +12 -0
  192. package/dist/testing/consumer-conformance.d.ts.map +1 -0
  193. package/dist/testing/consumer-conformance.js +17 -0
  194. package/dist/testing/consumer-conformance.js.map +1 -0
  195. package/dist/testing/fixtures.d.ts +9 -0
  196. package/dist/testing/fixtures.d.ts.map +1 -0
  197. package/dist/testing/fixtures.js +69 -0
  198. package/dist/testing/fixtures.js.map +1 -0
  199. package/dist/testing/index.d.ts +7 -0
  200. package/dist/testing/index.d.ts.map +1 -0
  201. package/dist/testing/index.js +7 -0
  202. package/dist/testing/index.js.map +1 -0
  203. package/dist/testing/provider-contract.d.ts +14 -0
  204. package/dist/testing/provider-contract.d.ts.map +1 -0
  205. package/dist/testing/provider-contract.js +238 -0
  206. package/dist/testing/provider-contract.js.map +1 -0
  207. package/dist/testing/state-machine.d.ts +2 -0
  208. package/dist/testing/state-machine.d.ts.map +1 -0
  209. package/dist/testing/state-machine.js +2 -0
  210. package/dist/testing/state-machine.js.map +1 -0
  211. package/dist/testing/workflow-harness.d.ts +224 -0
  212. package/dist/testing/workflow-harness.d.ts.map +1 -0
  213. package/dist/testing/workflow-harness.js +65 -0
  214. package/dist/testing/workflow-harness.js.map +1 -0
  215. package/dist/workflows/engine.d.ts +157 -0
  216. package/dist/workflows/engine.d.ts.map +1 -0
  217. package/dist/workflows/engine.js +2015 -0
  218. package/dist/workflows/engine.js.map +1 -0
  219. package/dist/workflows/index.d.ts +10 -0
  220. package/dist/workflows/index.d.ts.map +1 -0
  221. package/dist/workflows/index.js +6 -0
  222. package/dist/workflows/index.js.map +1 -0
  223. package/dist/workflows/lifecycle.d.ts +5 -0
  224. package/dist/workflows/lifecycle.d.ts.map +1 -0
  225. package/dist/workflows/lifecycle.js +7 -0
  226. package/dist/workflows/lifecycle.js.map +1 -0
  227. package/docs/architecture.md +1188 -0
  228. package/docs/decisions/0001-extraction-discrepancies.md +29 -0
  229. package/docs/runbooks.md +140 -0
  230. package/package.json +110 -0
@@ -0,0 +1,106 @@
1
+ import { createHash } from "node:crypto";
2
+ import { healthFacts } from "../maintenance/health.js";
3
+ import { BillingWorkflowError } from "../core/errors.js";
4
+ function assertOperatorContext(context) {
5
+ if (!context.actorId.trim() ||
6
+ !context.reason.trim() ||
7
+ context.reason.length > 500 ||
8
+ (context.ticket !== undefined && context.ticket.length > 256)) {
9
+ throw new BillingWorkflowError("grant_invalid");
10
+ }
11
+ }
12
+ function digest(value) {
13
+ return createHash("sha256").update(value, "utf8").digest("hex");
14
+ }
15
+ export function createOperations(deps) {
16
+ let decryptSequence = 0;
17
+ return {
18
+ inspectEntity(entityId) {
19
+ return deps.billing.commercialState(entityId);
20
+ },
21
+ health() {
22
+ return healthFacts(deps.billing.store, deps.clock, deps.requestedRevision, deps.checkoutProvider);
23
+ },
24
+ async reconcileSubscription(context, subscriptionId) {
25
+ assertOperatorContext(context);
26
+ await deps.billing.store.withTransaction(async () => {
27
+ const sub = await deps.billing.store.findSubscriptionById(subscriptionId);
28
+ if (!sub)
29
+ throw new BillingWorkflowError("subscription_required");
30
+ const previous = await deps.billing.store.findLiveJob({
31
+ provider: sub.provider,
32
+ subscriptionId: sub.id,
33
+ });
34
+ const job = await deps.billing.enqueueJob({
35
+ provider: sub.provider,
36
+ subscriptionId: sub.id,
37
+ });
38
+ await deps.billing.recordOperatorAudit(context, `operator:reconcile:${job.id}:${context.actorId}`, previous ?? null, { requested: "reconcile" }, { subscriptionId: sub.id });
39
+ });
40
+ await deps.billing.runReconciliationBatch({
41
+ workerId: `ops:${context.actorId}`,
42
+ });
43
+ },
44
+ async retryWebhook(context, providerEventId, mode) {
45
+ assertOperatorContext(context);
46
+ if (mode !== "preserve_attempts" && mode !== "new_budget") {
47
+ throw new BillingWorkflowError("operation_conflicted");
48
+ }
49
+ await deps.billing.store.withTransaction(async () => {
50
+ const row = await deps.billing.store.findWebhookByEventId(providerEventId);
51
+ if (!row)
52
+ throw new BillingWorkflowError("operation_conflicted");
53
+ const previous = {
54
+ status: row.status,
55
+ processingAttempts: row.processingAttempts,
56
+ availableAt: row.availableAt,
57
+ };
58
+ if (mode === "new_budget")
59
+ row.processingAttempts = 0;
60
+ row.status = "pending";
61
+ row.availableAt = deps.clock.now();
62
+ row.workerId = null;
63
+ row.lockedAt = null;
64
+ row.leaseExpiresAt = null;
65
+ await deps.billing.store.saveWebhook(row);
66
+ await deps.billing.recordOperatorAudit(context, `operator:retry-webhook:${row.id}:${context.actorId}:${mode}:${row.processingAttempts}`, previous, {
67
+ status: row.status,
68
+ processingAttempts: row.processingAttempts,
69
+ mode,
70
+ }, { providerEventId: row.providerEventId });
71
+ });
72
+ },
73
+ async requestCancellation(context, subscriptionId) {
74
+ await deps.billing.operatorCancel(context, subscriptionId);
75
+ },
76
+ async decryptReplay(context, ciphertext) {
77
+ if (!deps.sensitiveValues) {
78
+ throw new BillingWorkflowError("composition_invalid");
79
+ }
80
+ assertOperatorContext(context);
81
+ await deps.billing.recordOperatorAudit(context, `operator:decrypt-replay:${digest(ciphertext)}:${context.actorId}:${++decryptSequence}`, null, { requested: "decrypt_replay" });
82
+ const plaintext = await deps.sensitiveValues.decrypt(ciphertext, {
83
+ operatorActorId: context.actorId,
84
+ reason: context.reason,
85
+ });
86
+ return plaintext;
87
+ },
88
+ catalog() {
89
+ return deps.billing.publicCatalog();
90
+ },
91
+ catalogRevisions() {
92
+ return deps.billing.store.listRevisions();
93
+ },
94
+ recordRequestedCatalog() {
95
+ return deps.billing.recordRequestedCatalog();
96
+ },
97
+ verifyRequestedCatalog() {
98
+ return deps.billing.verifyRequestedCatalog();
99
+ },
100
+ abandonRequestedCatalog(context) {
101
+ assertOperatorContext(context);
102
+ return deps.billing.abandonRequestedCatalog(context);
103
+ },
104
+ };
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operations/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import type { BillingOffer } from "../catalog/types.js";
2
+ import type { CheckoutAttempt } from "../core/checkout-attempt.js";
3
+ import type { ProviderCustomer } from "../core/customer.js";
4
+ import type { PlanChangeAttempt } from "../core/plan-change-attempt.js";
5
+ import type { ReconciliationJob } from "../core/reconciliation-job.js";
6
+ import type { CanonicalSubscription } from "../core/subscription.js";
7
+ import type { WebhookInboxRecord } from "../core/webhook-inbox.js";
8
+ import type { BillingStore, BillingStoreHealth, CatalogRevisionItemRow, CatalogRevisionRow, MemoryCatalog, PlanStateRow, PriceEntryRow, ReconciliationSubject } from "./store.js";
9
+ export type { CatalogRevisionRow, MemoryCatalog, PlanStateRow, PriceEntryRow, } from "./store.js";
10
+ export declare class MemoryBillingStore implements BillingStore {
11
+ transactionDepth: number;
12
+ isInTransaction(): boolean;
13
+ providerCallsWhileOpen: number;
14
+ priceEntries: PriceEntryRow[];
15
+ revisions: CatalogRevisionRow[];
16
+ revisionItems: CatalogRevisionItemRow[];
17
+ customers: ProviderCustomer[];
18
+ checkouts: CheckoutAttempt[];
19
+ planChanges: PlanChangeAttempt[];
20
+ subscriptions: CanonicalSubscription[];
21
+ planStates: Map<string, PlanStateRow>;
22
+ webhooks: WebhookInboxRecord[];
23
+ jobs: ReconciliationJob[];
24
+ auditEffects: string[];
25
+ transactionCount: number;
26
+ failOnTransaction: number;
27
+ private transactionBackup;
28
+ private transactionTail;
29
+ withTransaction<T>(fn: () => Promise<T>): Promise<T>;
30
+ noteProviderCall(): void;
31
+ ensurePlanState(billableEntityId: string): PlanStateRow;
32
+ findPlanState(billableEntityId: string): PlanStateRow | undefined;
33
+ seedCatalog(input: {
34
+ revision: number;
35
+ provider: string;
36
+ offers: BillingOffer[];
37
+ status?: CatalogRevisionRow["status"];
38
+ }): MemoryCatalog;
39
+ getActiveCatalog(provider: string): MemoryCatalog | null;
40
+ getCatalogRevision(provider: string, revisionNumber: number): MemoryCatalog | null;
41
+ insertCatalogRevision(revision: CatalogRevisionRow): void;
42
+ saveCatalogRevision(revision: CatalogRevisionRow): void;
43
+ insertPriceEntry(price: PriceEntryRow): void;
44
+ insertCatalogRevisionItem(item: CatalogRevisionItemRow): void;
45
+ findPriceByProviderProduct(provider: string, productId: string): PriceEntryRow | undefined;
46
+ findPriceById(id: string): PriceEntryRow | undefined;
47
+ listRevisions(): CatalogRevisionRow[];
48
+ newAttemptId(): string;
49
+ newChangeId(): string;
50
+ savePlanState(state: PlanStateRow): void;
51
+ findCustomerByPayer(provider: string, payerId: string): ProviderCustomer | undefined;
52
+ findCustomerById(id: string): ProviderCustomer | undefined;
53
+ findCustomerByProviderCustomerId(provider: string, providerCustomerId: string): ProviderCustomer | undefined;
54
+ listCustomersByPayer(payerId: string): ProviderCustomer[];
55
+ insertCustomer(customer: ProviderCustomer): void;
56
+ saveCustomer(customer: ProviderCustomer): void;
57
+ findLiveCheckout(billableEntityId: string): CheckoutAttempt | undefined;
58
+ findCheckoutById(id: string): CheckoutAttempt | undefined;
59
+ findCheckoutByAttemptId(attemptId: string): CheckoutAttempt | undefined;
60
+ insertCheckout(attempt: CheckoutAttempt): void;
61
+ saveCheckout(attempt: CheckoutAttempt): void;
62
+ countCreatingCheckouts(): number;
63
+ listExpiredCheckouts(now: Date, limit: number): CheckoutAttempt[];
64
+ listPurgeableCheckouts(before: Date, limit: number): CheckoutAttempt[];
65
+ findEntitlementSubscription(billableEntityId: string): CanonicalSubscription | undefined;
66
+ listSubscriptionsByEntity(billableEntityId: string): CanonicalSubscription[];
67
+ findSubscriptionById(id: string): CanonicalSubscription | undefined;
68
+ findSubscriptionByProviderIds(provider: string, providerSubscriptionId: string): CanonicalSubscription | undefined;
69
+ listSubscriptionsByPayer(payerId: string): CanonicalSubscription[];
70
+ upsertSubscription(subscription: CanonicalSubscription): void;
71
+ listDueSubscriptionDeadlines(now: Date, limit: number): CanonicalSubscription[];
72
+ findLivePlanChange(billableEntityId: string): PlanChangeAttempt | undefined;
73
+ findPlanChangeBySubscriptionOffer(subscriptionId: string, offerKey: string): PlanChangeAttempt | undefined;
74
+ findPlanChangeById(id: string): PlanChangeAttempt | undefined;
75
+ insertPlanChange(attempt: PlanChangeAttempt): void;
76
+ savePlanChange(attempt: PlanChangeAttempt): void;
77
+ listPurgeablePlanChanges(before: Date, limit: number): PlanChangeAttempt[];
78
+ findWebhook(provider: string, providerEventId: string): WebhookInboxRecord | undefined;
79
+ findWebhookByEventId(providerEventId: string): WebhookInboxRecord | undefined;
80
+ insertWebhook(record: WebhookInboxRecord): void;
81
+ saveWebhook(record: WebhookInboxRecord): void;
82
+ saveWebhookIfOwned(record: WebhookInboxRecord, workerId: string): boolean;
83
+ listDueWebhooks(now: Date, limit: number): WebhookInboxRecord[];
84
+ claimDueWebhooks(now: Date, limit: number, workerId: string): WebhookInboxRecord[];
85
+ listPurgeableWebhooks(before: Date, limit: number): WebhookInboxRecord[];
86
+ findLiveJob(subject: ReconciliationSubject): ReconciliationJob | undefined;
87
+ insertJob(job: ReconciliationJob): void;
88
+ saveJob(job: ReconciliationJob): void;
89
+ saveJobIfOwned(job: ReconciliationJob, workerId: string): boolean;
90
+ listClaimableJobs(now: Date, limit: number): ReconciliationJob[];
91
+ claimClaimableJobs(now: Date, limit: number, workerId: string): ReconciliationJob[];
92
+ health(_now: Date, provider?: string): BillingStoreHealth;
93
+ }
94
+ export declare function newId(): string;
95
+ export type ProjectionWrite = {
96
+ subscription: CanonicalSubscription;
97
+ planState: PlanStateRow;
98
+ material: boolean;
99
+ effectId: string | null;
100
+ };
101
+ export declare function applySubscriptionProjection(store: BillingStore, next: CanonicalSubscription, now: Date, options?: {
102
+ reconcile?: boolean;
103
+ }): ProjectionWrite | Promise<ProjectionWrite>;
104
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/persistence/memory.ts"],"names":[],"mappings":"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"}