@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.
- package/LICENSE +21 -0
- package/README.md +339 -0
- package/dist/adapters/drizzle/index.d.ts +28 -0
- package/dist/adapters/drizzle/index.d.ts.map +1 -0
- package/dist/adapters/drizzle/index.js +75 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/drizzle/store.d.ts +37 -0
- package/dist/adapters/drizzle/store.d.ts.map +1 -0
- package/dist/adapters/drizzle/store.js +889 -0
- package/dist/adapters/drizzle/store.js.map +1 -0
- package/dist/catalog/index.d.ts +5 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/public-view.d.ts +7 -0
- package/dist/catalog/public-view.d.ts.map +1 -0
- package/dist/catalog/public-view.js +22 -0
- package/dist/catalog/public-view.js.map +1 -0
- package/dist/catalog/revisions.d.ts +8 -0
- package/dist/catalog/revisions.d.ts.map +1 -0
- package/dist/catalog/revisions.js +12 -0
- package/dist/catalog/revisions.js.map +1 -0
- package/dist/catalog/types.d.ts +28 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +2 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/catalog/validate.d.ts +16 -0
- package/dist/catalog/validate.d.ts.map +1 -0
- package/dist/catalog/validate.js +66 -0
- package/dist/catalog/validate.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +35 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/generate.d.ts +15 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +68 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/config/define.d.ts +3 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/define.js +5 -0
- package/dist/config/define.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/validate.d.ts +32 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +227 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/core/checkout-attempt.d.ts +29 -0
- package/dist/core/checkout-attempt.d.ts.map +1 -0
- package/dist/core/checkout-attempt.js +10 -0
- package/dist/core/checkout-attempt.js.map +1 -0
- package/dist/core/clock.d.ts +10 -0
- package/dist/core/clock.d.ts.map +1 -0
- package/dist/core/clock.js +26 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/customer.d.ts +13 -0
- package/dist/core/customer.d.ts.map +1 -0
- package/dist/core/customer.js +2 -0
- package/dist/core/customer.js.map +1 -0
- package/dist/core/errors.d.ts +28 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +43 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/ids.d.ts +15 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +29 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/money.d.ts +8 -0
- package/dist/core/money.d.ts.map +1 -0
- package/dist/core/money.js +23 -0
- package/dist/core/money.js.map +1 -0
- package/dist/core/plan-change-attempt.d.ts +30 -0
- package/dist/core/plan-change-attempt.d.ts.map +1 -0
- package/dist/core/plan-change-attempt.js +9 -0
- package/dist/core/plan-change-attempt.js.map +1 -0
- package/dist/core/projection-diff.d.ts +32 -0
- package/dist/core/projection-diff.d.ts.map +1 -0
- package/dist/core/projection-diff.js +32 -0
- package/dist/core/projection-diff.js.map +1 -0
- package/dist/core/reconciliation-job.d.ts +21 -0
- package/dist/core/reconciliation-job.d.ts.map +1 -0
- package/dist/core/reconciliation-job.js +26 -0
- package/dist/core/reconciliation-job.js.map +1 -0
- package/dist/core/subscription.d.ts +62 -0
- package/dist/core/subscription.d.ts.map +1 -0
- package/dist/core/subscription.js +14 -0
- package/dist/core/subscription.js.map +1 -0
- package/dist/core/transitions.d.ts +25 -0
- package/dist/core/transitions.d.ts.map +1 -0
- package/dist/core/transitions.js +161 -0
- package/dist/core/transitions.js.map +1 -0
- package/dist/core/webhook-inbox.d.ts +23 -0
- package/dist/core/webhook-inbox.d.ts.map +1 -0
- package/dist/core/webhook-inbox.js +9 -0
- package/dist/core/webhook-inbox.js.map +1 -0
- package/dist/maintenance/batches.d.ts +3 -0
- package/dist/maintenance/batches.d.ts.map +1 -0
- package/dist/maintenance/batches.js +3 -0
- package/dist/maintenance/batches.js.map +1 -0
- package/dist/maintenance/claims.d.ts +2 -0
- package/dist/maintenance/claims.d.ts.map +1 -0
- package/dist/maintenance/claims.js +2 -0
- package/dist/maintenance/claims.js.map +1 -0
- package/dist/maintenance/health.d.ts +13 -0
- package/dist/maintenance/health.d.ts.map +1 -0
- package/dist/maintenance/health.js +19 -0
- package/dist/maintenance/health.js.map +1 -0
- package/dist/maintenance/retry.d.ts +9 -0
- package/dist/maintenance/retry.d.ts.map +1 -0
- package/dist/maintenance/retry.js +19 -0
- package/dist/maintenance/retry.js.map +1 -0
- package/dist/operations/index.d.ts +28 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +106 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/persistence/memory.d.ts +104 -0
- package/dist/persistence/memory.d.ts.map +1 -0
- package/dist/persistence/memory.js +657 -0
- package/dist/persistence/memory.js.map +1 -0
- package/dist/persistence/store.d.ts +126 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +2 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/ports/audit.d.ts +20 -0
- package/dist/ports/audit.d.ts.map +1 -0
- package/dist/ports/audit.js +9 -0
- package/dist/ports/audit.js.map +1 -0
- package/dist/ports/authorization.d.ts +28 -0
- package/dist/ports/authorization.d.ts.map +1 -0
- package/dist/ports/authorization.js +33 -0
- package/dist/ports/authorization.js.map +1 -0
- package/dist/ports/lifecycle.d.ts +23 -0
- package/dist/ports/lifecycle.d.ts.map +1 -0
- package/dist/ports/lifecycle.js +2 -0
- package/dist/ports/lifecycle.js.map +1 -0
- package/dist/ports/sensitive-values.d.ts +23 -0
- package/dist/ports/sensitive-values.d.ts.map +1 -0
- package/dist/ports/sensitive-values.js +19 -0
- package/dist/ports/sensitive-values.js.map +1 -0
- package/dist/ports/telemetry.d.ts +16 -0
- package/dist/ports/telemetry.d.ts.map +1 -0
- package/dist/ports/telemetry.js +48 -0
- package/dist/ports/telemetry.js.map +1 -0
- package/dist/providers/contract.d.ts +98 -0
- package/dist/providers/contract.d.ts.map +1 -0
- package/dist/providers/contract.js +2 -0
- package/dist/providers/contract.js.map +1 -0
- package/dist/providers/dodo/index.d.ts +25 -0
- package/dist/providers/dodo/index.d.ts.map +1 -0
- package/dist/providers/dodo/index.js +296 -0
- package/dist/providers/dodo/index.js.map +1 -0
- package/dist/providers/dodo/normalize.d.ts +7 -0
- package/dist/providers/dodo/normalize.d.ts.map +1 -0
- package/dist/providers/dodo/normalize.js +77 -0
- package/dist/providers/dodo/normalize.js.map +1 -0
- package/dist/providers/fake/index.d.ts +59 -0
- package/dist/providers/fake/index.d.ts.map +1 -0
- package/dist/providers/fake/index.js +312 -0
- package/dist/providers/fake/index.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +32 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/schema/canonical.d.ts +7 -0
- package/dist/schema/canonical.d.ts.map +1 -0
- package/dist/schema/canonical.js +35 -0
- package/dist/schema/canonical.js.map +1 -0
- package/dist/schema/generator.d.ts +3 -0
- package/dist/schema/generator.d.ts.map +1 -0
- package/dist/schema/generator.js +496 -0
- package/dist/schema/generator.js.map +1 -0
- package/dist/schema/pglite-sql.d.ts +3 -0
- package/dist/schema/pglite-sql.d.ts.map +1 -0
- package/dist/schema/pglite-sql.js +226 -0
- package/dist/schema/pglite-sql.js.map +1 -0
- package/dist/testing/clocks.d.ts +2 -0
- package/dist/testing/clocks.d.ts.map +1 -0
- package/dist/testing/clocks.js +2 -0
- package/dist/testing/clocks.js.map +1 -0
- package/dist/testing/consumer-conformance.d.ts +12 -0
- package/dist/testing/consumer-conformance.d.ts.map +1 -0
- package/dist/testing/consumer-conformance.js +17 -0
- package/dist/testing/consumer-conformance.js.map +1 -0
- package/dist/testing/fixtures.d.ts +9 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +69 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider-contract.d.ts +14 -0
- package/dist/testing/provider-contract.d.ts.map +1 -0
- package/dist/testing/provider-contract.js +238 -0
- package/dist/testing/provider-contract.js.map +1 -0
- package/dist/testing/state-machine.d.ts +2 -0
- package/dist/testing/state-machine.d.ts.map +1 -0
- package/dist/testing/state-machine.js +2 -0
- package/dist/testing/state-machine.js.map +1 -0
- package/dist/testing/workflow-harness.d.ts +224 -0
- package/dist/testing/workflow-harness.d.ts.map +1 -0
- package/dist/testing/workflow-harness.js +65 -0
- package/dist/testing/workflow-harness.js.map +1 -0
- package/dist/workflows/engine.d.ts +157 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +2015 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/index.d.ts +10 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +6 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/lifecycle.d.ts +5 -0
- package/dist/workflows/lifecycle.d.ts.map +1 -0
- package/dist/workflows/lifecycle.js +7 -0
- package/dist/workflows/lifecycle.js.map +1 -0
- package/docs/architecture.md +1188 -0
- package/docs/decisions/0001-extraction-discrepancies.md +29 -0
- package/docs/runbooks.md +140 -0
- 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":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,KAAK,EACR,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,qBAAqB,EACxB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,aAAa,GAChB,MAAM,YAAY,CAAC;AAEpB,qBAAa,kBAAmB,YAAW,YAAY;IACnD,gBAAgB,SAAK;IACrB,eAAe,IAAI,OAAO;IAG1B,sBAAsB,SAAK;IAC3B,YAAY,EAAE,aAAa,EAAE,CAAM;IACnC,SAAS,EAAE,kBAAkB,EAAE,CAAM;IACrC,aAAa,EAAE,sBAAsB,EAAE,CAAM;IAC7C,SAAS,EAAE,gBAAgB,EAAE,CAAM;IACnC,SAAS,EAAE,eAAe,EAAE,CAAM;IAClC,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtC,aAAa,EAAE,qBAAqB,EAAE,CAAM;IAC5C,UAAU,4BAAmC;IAC7C,QAAQ,EAAE,kBAAkB,EAAE,CAAM;IACpC,IAAI,EAAE,iBAAiB,EAAE,CAAM;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,gBAAgB,SAAK;IACrB,iBAAiB,SAAK;IACtB,OAAO,CAAC,iBAAiB,CAWT;IAChB,OAAO,CAAC,eAAe,CAAoC;IAErD,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkD1D,gBAAgB,IAAI,IAAI;IAIxB,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY;IAYvD,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjE,WAAW,CAAC,KAAK,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;KACzC,GAAG,aAAa;IAsCjB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAiBxD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAmBlF,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAezD,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAMvD,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAc5C,yBAAyB,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI;IAe7D,0BAA0B,CACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAClB,aAAa,GAAG,SAAS;IAQ5B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIpD,aAAa,IAAI,kBAAkB,EAAE;IAIrC,YAAY,IAAI,MAAM;IAItB,WAAW,IAAI,MAAM;IAIrB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAIxC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMrD,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAI3B,gCAAgC,CAC5B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM;IAS9B,oBAAoB,CAAC,OAAO,EAAE,MAAM;IAIpC,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAgBhD,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAM9C,gBAAgB,CAAC,gBAAgB,EAAE,MAAM;IAQzC,gBAAgB,CAAC,EAAE,EAAE,MAAM;IAI3B,uBAAuB,CAAC,SAAS,EAAE,MAAM;IAIzC,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAgB9C,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAM5C,sBAAsB,IAAI,MAAM;IAIhC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;IAUjE,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,EAAE;IAatE,2BAA2B,CAAC,gBAAgB,EAAE,MAAM;IAQpD,yBAAyB,CAAC,gBAAgB,EAAE,MAAM;IAMlD,oBAAoB,CAAC,EAAE,EAAE,MAAM;IAI/B,6BAA6B,CACzB,QAAQ,EAAE,MAAM,EAChB,sBAAsB,EAAE,MAAM;IASlC,wBAAwB,CAAC,OAAO,EAAE,MAAM;IAIxC,kBAAkB,CAAC,YAAY,EAAE,qBAAqB,GAAG,IAAI;IAmB7D,4BAA4B,CACxB,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,MAAM,GACd,qBAAqB,EAAE;IAa1B,kBAAkB,CAAC,gBAAgB,EAAE,MAAM;IAQ3C,iCAAiC,CAC7B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM;IAUpB,kBAAkB,CAAC,EAAE,EAAE,MAAM;IAI7B,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAgBlD,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAMhD,wBAAwB,CACpB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,MAAM,GACd,iBAAiB,EAAE;IAatB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAQrD,oBAAoB,CAAC,eAAe,EAAE,MAAM;IAM5C,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAO/C,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAM7C,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAgBzE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;IAsBxC,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAyB3D,qBAAqB,CACjB,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE,MAAM,GACd,kBAAkB,EAAE;IAYvB,WAAW,CAAC,OAAO,EAAE,qBAAqB;IAuB1C,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAsBvC,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAgBrC,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IA0BjE,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;IAkB1C,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAyB7D,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,kBAAkB;CAgC5D;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,YAAY,EAAE,qBAAqB,CAAC;IACpC,SAAS,EAAE,YAAY,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,qBAAqB,EAC3B,GAAG,EAAE,IAAI,EACT,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAI5C"}
|