@resvary/postgres 0.5.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/dist/credit.js ADDED
@@ -0,0 +1,468 @@
1
+ import { parseReceiptStoreValue, serializeReceiptStoreValue } from '@resvary/sdk/receipts';
2
+ import { createPostgresHandle, isRetryableTransactionError, rollback, table, } from './connection.js';
3
+ export class PostgresCreditStore {
4
+ handle;
5
+ constructor(config) {
6
+ this.handle = createPostgresHandle(config);
7
+ }
8
+ async transaction(handler) {
9
+ for (let attempt = 0;; attempt += 1) {
10
+ const client = await this.handle.pool.connect();
11
+ try {
12
+ await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
13
+ const result = await handler(new PostgresCreditTransaction(client, this.handle));
14
+ await client.query('COMMIT');
15
+ return result;
16
+ }
17
+ catch (error) {
18
+ await rollback(client);
19
+ if (!isRetryableTransactionError(error) || attempt >= this.handle.maxTransactionRetries) {
20
+ throw error;
21
+ }
22
+ await new Promise((resolve) => setTimeout(resolve, Math.min(10 * 2 ** attempt, 250)));
23
+ }
24
+ finally {
25
+ client.release();
26
+ }
27
+ }
28
+ }
29
+ getAccount(id) {
30
+ return reader(this.handle.pool, this.handle).getAccount(id);
31
+ }
32
+ getAccountByCustomer(projectId, customerId) {
33
+ return reader(this.handle.pool, this.handle).getAccountByCustomer(projectId, customerId);
34
+ }
35
+ listAccounts(filter) {
36
+ return reader(this.handle.pool, this.handle).listAccounts(filter);
37
+ }
38
+ getGrant(id) {
39
+ return reader(this.handle.pool, this.handle).getGrant(id);
40
+ }
41
+ listGrants(accountId) {
42
+ return reader(this.handle.pool, this.handle).listGrants(accountId);
43
+ }
44
+ getMeter(id) {
45
+ return reader(this.handle.pool, this.handle).getMeter(id);
46
+ }
47
+ getMeterByKey(projectId, key) {
48
+ return reader(this.handle.pool, this.handle).getMeterByKey(projectId, key);
49
+ }
50
+ getPriceVersion(id) {
51
+ return reader(this.handle.pool, this.handle).getPriceVersion(id);
52
+ }
53
+ listPriceVersions(meterId) {
54
+ return reader(this.handle.pool, this.handle).listPriceVersions(meterId);
55
+ }
56
+ getReservation(id) {
57
+ return reader(this.handle.pool, this.handle).getReservation(id);
58
+ }
59
+ listReservations(filter) {
60
+ return reader(this.handle.pool, this.handle).listReservations(filter);
61
+ }
62
+ getUsageEvent(id) {
63
+ return reader(this.handle.pool, this.handle).getUsageEvent(id);
64
+ }
65
+ getUsageReceipt(id) {
66
+ return reader(this.handle.pool, this.handle).getUsageReceipt(id);
67
+ }
68
+ listUsageReceipts(accountId) {
69
+ return reader(this.handle.pool, this.handle).listUsageReceipts(accountId);
70
+ }
71
+ listLedgerEntries(accountId) {
72
+ return reader(this.handle.pool, this.handle).listLedgerEntries(accountId);
73
+ }
74
+ getOutboxEvent(id) {
75
+ return reader(this.handle.pool, this.handle).getOutboxEvent(id);
76
+ }
77
+ listOutboxEvents(filter) {
78
+ return reader(this.handle.pool, this.handle).listOutboxEvents(filter);
79
+ }
80
+ getIdempotencyRecord(scope, key) {
81
+ return reader(this.handle.pool, this.handle).getIdempotencyRecord(scope, key);
82
+ }
83
+ getFundingIntent(id) {
84
+ return reader(this.handle.pool, this.handle).getFundingIntent(id);
85
+ }
86
+ listFundingIntents(projectId) {
87
+ return reader(this.handle.pool, this.handle).listFundingIntents(projectId);
88
+ }
89
+ getFundingTransaction(id) {
90
+ return reader(this.handle.pool, this.handle).getFundingTransaction(id);
91
+ }
92
+ getFundingTransactionByExternalPayment(rail, network, externalPaymentId) {
93
+ return reader(this.handle.pool, this.handle).getFundingTransactionByExternalPayment(rail, network, externalPaymentId);
94
+ }
95
+ getFundingTransactionByTxHash(network, txHash) {
96
+ return reader(this.handle.pool, this.handle).getFundingTransactionByTxHash(network, txHash);
97
+ }
98
+ listFundingTransactions(fundingIntentId) {
99
+ return reader(this.handle.pool, this.handle).listFundingTransactions(fundingIntentId);
100
+ }
101
+ async claimOutboxEvents(input) {
102
+ const outbox = table(this.handle, 'resvary_outbox_events');
103
+ const result = await this.handle.pool.query(`WITH candidates AS (
104
+ SELECT id FROM ${outbox}
105
+ WHERE ($5::text IS NULL OR project_id = $5)
106
+ AND ((status = 'pending' AND next_attempt_at <= $1)
107
+ OR (status = 'processing' AND lease_expires_at <= $1))
108
+ ORDER BY next_attempt_at ASC, created_at ASC
109
+ FOR UPDATE SKIP LOCKED
110
+ LIMIT $2
111
+ )
112
+ UPDATE ${outbox} AS event
113
+ SET status = 'processing', attempt_count = event.attempt_count + 1,
114
+ lease_owner = $3, lease_expires_at = $1 + $4, last_attempt_at = $1
115
+ FROM candidates
116
+ WHERE event.id = candidates.id
117
+ RETURNING event.payload::text AS payload, event.status, event.attempt_count,
118
+ event.next_attempt_at::text, event.lease_owner, event.lease_expires_at::text,
119
+ event.last_attempt_at::text, event.last_error, event.delivered_at::text`, [input.now, input.limit, input.workerId, input.leaseMs, input.projectId ?? null]);
120
+ return result.rows.map(parseOutboxRow);
121
+ }
122
+ async completeOutboxEvent(eventId, workerId, deliveredAt) {
123
+ const result = await this.handle.pool.query(`UPDATE ${table(this.handle, 'resvary_outbox_events')}
124
+ SET status = 'delivered', delivered_at = $3, next_attempt_at = $3,
125
+ lease_owner = NULL, lease_expires_at = NULL, last_error = NULL
126
+ WHERE id = $1 AND status = 'processing' AND lease_owner = $2`, [eventId, workerId, deliveredAt]);
127
+ if (result.rowCount !== 1)
128
+ throw new Error(`Outbox lease lost for event ${eventId}`);
129
+ }
130
+ async failOutboxEvent(input) {
131
+ const result = await this.handle.pool.query(`UPDATE ${table(this.handle, 'resvary_outbox_events')}
132
+ SET status = $4, next_attempt_at = $5, lease_owner = NULL,
133
+ lease_expires_at = NULL, last_error = $3
134
+ WHERE id = $1 AND status = 'processing' AND lease_owner = $2`, [
135
+ input.eventId,
136
+ input.workerId,
137
+ input.error,
138
+ input.deadLetter ? 'dead_letter' : 'pending',
139
+ input.nextAttemptAt,
140
+ ]);
141
+ if (result.rowCount !== 1)
142
+ throw new Error(`Outbox lease lost for event ${input.eventId}`);
143
+ }
144
+ listDeadLetterEvents(projectId) {
145
+ return this.listOutboxEvents({ projectId, status: 'dead_letter' });
146
+ }
147
+ async requeueOutboxEvent(eventId, now) {
148
+ const result = await this.handle.pool.query(`UPDATE ${table(this.handle, 'resvary_outbox_events')}
149
+ SET status = 'pending', attempt_count = 0, next_attempt_at = $2,
150
+ lease_owner = NULL, lease_expires_at = NULL, last_error = NULL, delivered_at = NULL
151
+ WHERE id = $1 AND status = 'dead_letter'`, [eventId, now]);
152
+ if (result.rowCount !== 1)
153
+ throw new Error(`Dead-letter event not found: ${eventId}`);
154
+ }
155
+ async close() {
156
+ if (this.handle.ownsPool)
157
+ await this.handle.pool.end();
158
+ }
159
+ }
160
+ class PostgresCreditTransaction {
161
+ client;
162
+ handle;
163
+ constructor(client, handle) {
164
+ this.client = client;
165
+ this.handle = handle;
166
+ }
167
+ getAccount(id) {
168
+ return reader(this.client, this.handle).getAccount(id);
169
+ }
170
+ getAccountByCustomer(projectId, customerId) {
171
+ return reader(this.client, this.handle).getAccountByCustomer(projectId, customerId);
172
+ }
173
+ listAccounts(filter) {
174
+ return reader(this.client, this.handle).listAccounts(filter);
175
+ }
176
+ getGrant(id) {
177
+ return reader(this.client, this.handle).getGrant(id);
178
+ }
179
+ listGrants(accountId) {
180
+ return reader(this.client, this.handle).listGrants(accountId);
181
+ }
182
+ getMeter(id) {
183
+ return reader(this.client, this.handle).getMeter(id);
184
+ }
185
+ getMeterByKey(projectId, key) {
186
+ return reader(this.client, this.handle).getMeterByKey(projectId, key);
187
+ }
188
+ getPriceVersion(id) {
189
+ return reader(this.client, this.handle).getPriceVersion(id);
190
+ }
191
+ listPriceVersions(meterId) {
192
+ return reader(this.client, this.handle).listPriceVersions(meterId);
193
+ }
194
+ getReservation(id) {
195
+ return reader(this.client, this.handle).getReservation(id);
196
+ }
197
+ listReservations(filter) {
198
+ return reader(this.client, this.handle).listReservations(filter);
199
+ }
200
+ getUsageEvent(id) {
201
+ return reader(this.client, this.handle).getUsageEvent(id);
202
+ }
203
+ getUsageReceipt(id) {
204
+ return reader(this.client, this.handle).getUsageReceipt(id);
205
+ }
206
+ listUsageReceipts(accountId) {
207
+ return reader(this.client, this.handle).listUsageReceipts(accountId);
208
+ }
209
+ listLedgerEntries(accountId) {
210
+ return reader(this.client, this.handle).listLedgerEntries(accountId);
211
+ }
212
+ getOutboxEvent(id) {
213
+ return reader(this.client, this.handle).getOutboxEvent(id);
214
+ }
215
+ listOutboxEvents(filter) {
216
+ return reader(this.client, this.handle).listOutboxEvents(filter);
217
+ }
218
+ getIdempotencyRecord(scope, key) {
219
+ return reader(this.client, this.handle).getIdempotencyRecord(scope, key);
220
+ }
221
+ getFundingIntent(id) {
222
+ return reader(this.client, this.handle).getFundingIntent(id);
223
+ }
224
+ listFundingIntents(projectId) {
225
+ return reader(this.client, this.handle).listFundingIntents(projectId);
226
+ }
227
+ getFundingTransaction(id) {
228
+ return reader(this.client, this.handle).getFundingTransaction(id);
229
+ }
230
+ getFundingTransactionByExternalPayment(rail, network, externalPaymentId) {
231
+ return reader(this.client, this.handle).getFundingTransactionByExternalPayment(rail, network, externalPaymentId);
232
+ }
233
+ getFundingTransactionByTxHash(network, txHash) {
234
+ return reader(this.client, this.handle).getFundingTransactionByTxHash(network, txHash);
235
+ }
236
+ listFundingTransactions(fundingIntentId) {
237
+ return reader(this.client, this.handle).listFundingTransactions(fundingIntentId);
238
+ }
239
+ saveAccount(value) {
240
+ return upsert(this.client, this.handle, 'resvary_credit_accounts', [
241
+ 'id',
242
+ 'project_id',
243
+ 'customer_id',
244
+ 'currency',
245
+ 'posted_units',
246
+ 'reserved_units',
247
+ 'updated_at',
248
+ ], [
249
+ value.id,
250
+ value.projectId,
251
+ value.customerId,
252
+ value.currency,
253
+ value.postedUnits,
254
+ value.reservedUnits,
255
+ value.updatedAt,
256
+ ], value);
257
+ }
258
+ saveGrant(value) {
259
+ return insert(this.client, this.handle, 'resvary_credit_grants', ['id', 'account_id', 'amount_units', 'created_at'], [value.id, value.accountId, value.amountUnits, value.createdAt], value);
260
+ }
261
+ saveMeter(value) {
262
+ return insert(this.client, this.handle, 'resvary_meters', ['id', 'project_id', 'meter_key'], [value.id, value.projectId, value.key], value);
263
+ }
264
+ savePriceVersion(value) {
265
+ return insert(this.client, this.handle, 'resvary_price_versions', ['id', 'meter_id', 'version', 'created_at'], [value.id, value.meterId, value.version, value.createdAt], value);
266
+ }
267
+ saveReservation(value) {
268
+ return upsert(this.client, this.handle, 'resvary_credit_reservations', [
269
+ 'id',
270
+ 'account_id',
271
+ 'project_id',
272
+ 'customer_id',
273
+ 'status',
274
+ 'reserved_units',
275
+ 'expires_at',
276
+ 'created_at',
277
+ ], [
278
+ value.id,
279
+ value.accountId,
280
+ value.projectId,
281
+ value.customerId,
282
+ value.status,
283
+ value.reservedUnits,
284
+ value.expiresAt,
285
+ value.createdAt,
286
+ ], value);
287
+ }
288
+ saveUsageEvent(value) {
289
+ return insert(this.client, this.handle, 'resvary_usage_events', ['id', 'account_id', 'received_at'], [value.id, value.accountId, value.receivedAt], value);
290
+ }
291
+ saveUsageReceipt(value) {
292
+ return insert(this.client, this.handle, 'resvary_usage_receipts', ['id', 'account_id', 'reservation_id', 'usage_event_id', 'charged_units', 'created_at'], [
293
+ value.id,
294
+ value.accountId,
295
+ value.reservationId,
296
+ value.usageEventId,
297
+ value.amountUnits,
298
+ value.createdAt,
299
+ ], value);
300
+ }
301
+ saveLedgerEntry(value) {
302
+ return insert(this.client, this.handle, 'resvary_ledger_entries', ['id', 'account_id', 'delta_units', 'balance_after_units', 'created_at'], [value.id, value.accountId, value.deltaUnits, value.balanceAfterUnits, value.createdAt], value);
303
+ }
304
+ saveOutboxEvent(value) {
305
+ return upsert(this.client, this.handle, 'resvary_outbox_events', [
306
+ 'id',
307
+ 'project_id',
308
+ 'type',
309
+ 'status',
310
+ 'created_at',
311
+ 'attempt_count',
312
+ 'next_attempt_at',
313
+ 'lease_owner',
314
+ 'lease_expires_at',
315
+ 'last_attempt_at',
316
+ 'last_error',
317
+ 'delivered_at',
318
+ ], [
319
+ value.id,
320
+ value.projectId,
321
+ value.type,
322
+ value.status,
323
+ value.createdAt,
324
+ value.attemptCount,
325
+ value.nextAttemptAt,
326
+ value.leaseOwner ?? null,
327
+ value.leaseExpiresAt ?? null,
328
+ value.lastAttemptAt ?? null,
329
+ value.lastError ?? null,
330
+ value.deliveredAt ?? null,
331
+ ], value);
332
+ }
333
+ saveIdempotencyRecord(value) {
334
+ return insert(this.client, this.handle, 'resvary_idempotency_keys', ['scope', 'key', 'created_at'], [value.scope, value.key, value.createdAt], value, ['scope', 'key']);
335
+ }
336
+ saveFundingIntent(value) {
337
+ return upsert(this.client, this.handle, 'resvary_funding_intents', ['id', 'project_id', 'customer_id', 'status', 'requested_units', 'created_at'], [
338
+ value.id,
339
+ value.projectId,
340
+ value.customerId,
341
+ value.status,
342
+ value.requestedUnits,
343
+ value.createdAt,
344
+ ], value);
345
+ }
346
+ saveFundingTransaction(value) {
347
+ return upsert(this.client, this.handle, 'resvary_funding_transactions', [
348
+ 'id',
349
+ 'funding_intent_id',
350
+ 'rail',
351
+ 'network',
352
+ 'external_payment_id_norm',
353
+ 'tx_hash_norm',
354
+ 'amount_units',
355
+ 'created_at',
356
+ ], [
357
+ value.id,
358
+ value.fundingIntentId,
359
+ value.rail,
360
+ value.network,
361
+ value.externalPaymentId.toLowerCase(),
362
+ value.txHash?.toLowerCase() ?? null,
363
+ value.amountUnits,
364
+ value.createdAt,
365
+ ], value);
366
+ }
367
+ }
368
+ function reader(db, handle) {
369
+ const t = (name) => table(handle, name);
370
+ return {
371
+ getAccount: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_accounts')} WHERE id = $1`, [id]),
372
+ getAccountByCustomer: (projectId, customerId) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_accounts')} WHERE project_id = $1 AND customer_id = $2`, [projectId, customerId]),
373
+ listAccounts: (filter = {}) => filteredAll(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_accounts')} ORDER BY updated_at ASC`, [], (value) => matchesBalanceFilter(value, filter)),
374
+ getGrant: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_grants')} WHERE id = $1`, [
375
+ id,
376
+ ]),
377
+ listGrants: (accountId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_grants')} ${accountId ? 'WHERE account_id = $1' : ''} ORDER BY created_at ASC`, accountId ? [accountId] : []),
378
+ getMeter: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_meters')} WHERE id = $1`, [id]),
379
+ getMeterByKey: (projectId, key) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_meters')} WHERE project_id = $1 AND meter_key = $2`, [projectId, key]),
380
+ getPriceVersion: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_price_versions')} WHERE id = $1`, [
381
+ id,
382
+ ]),
383
+ listPriceVersions: (meterId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_price_versions')} ${meterId ? 'WHERE meter_id = $1' : ''} ORDER BY created_at ASC`, meterId ? [meterId] : []),
384
+ getReservation: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_reservations')} WHERE id = $1`, [id]),
385
+ listReservations: (filter = {}) => filteredAll(db, `SELECT payload::text AS payload FROM ${t('resvary_credit_reservations')} ORDER BY created_at ASC`, [], (value) => matchesBalanceFilter(value, filter) && (!filter.status || value.status === filter.status)),
386
+ getUsageEvent: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_usage_events')} WHERE id = $1`, [
387
+ id,
388
+ ]),
389
+ getUsageReceipt: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_usage_receipts')} WHERE id = $1`, [
390
+ id,
391
+ ]),
392
+ listUsageReceipts: (accountId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_usage_receipts')} ${accountId ? 'WHERE account_id = $1' : ''} ORDER BY created_at ASC`, accountId ? [accountId] : []),
393
+ listLedgerEntries: (accountId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_ledger_entries')} ${accountId ? 'WHERE account_id = $1' : ''} ORDER BY created_at ASC, id ASC`, accountId ? [accountId] : []),
394
+ getOutboxEvent: async (id) => {
395
+ const result = await db.query(outboxSelect(t('resvary_outbox_events'), 'WHERE id = $1'), [id]);
396
+ return result.rows[0] ? parseOutboxRow(result.rows[0]) : undefined;
397
+ },
398
+ listOutboxEvents: async (filter = {}) => {
399
+ const result = await db.query(outboxSelect(t('resvary_outbox_events'), 'ORDER BY created_at ASC, id ASC'));
400
+ return result.rows
401
+ .map(parseOutboxRow)
402
+ .filter((item) => (!filter.projectId || item.projectId === filter.projectId) &&
403
+ (!filter.status || item.status === filter.status) &&
404
+ (!filter.type || item.type === filter.type));
405
+ },
406
+ getIdempotencyRecord: (scope, key) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_idempotency_keys')} WHERE scope = $1 AND key = $2`, [scope, key]),
407
+ getFundingIntent: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_intents')} WHERE id = $1`, [id]),
408
+ listFundingIntents: (projectId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_intents')} ${projectId ? 'WHERE project_id = $1' : ''} ORDER BY created_at ASC`, projectId ? [projectId] : []),
409
+ getFundingTransaction: (id) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_transactions')} WHERE id = $1`, [id]),
410
+ getFundingTransactionByExternalPayment: (rail, network, externalPaymentId) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_transactions')} WHERE rail = $1 AND network = $2 AND external_payment_id_norm = $3`, [rail, network, externalPaymentId.toLowerCase()]),
411
+ getFundingTransactionByTxHash: (network, txHash) => one(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_transactions')} WHERE network = $1 AND tx_hash_norm = $2`, [network, txHash.toLowerCase()]),
412
+ listFundingTransactions: (fundingIntentId) => all(db, `SELECT payload::text AS payload FROM ${t('resvary_funding_transactions')} ${fundingIntentId ? 'WHERE funding_intent_id = $1' : ''} ORDER BY created_at ASC`, fundingIntentId ? [fundingIntentId] : []),
413
+ };
414
+ }
415
+ function outboxSelect(tableName, suffix) {
416
+ return `SELECT payload::text AS payload, status, attempt_count,
417
+ next_attempt_at::text, lease_owner, lease_expires_at::text,
418
+ last_attempt_at::text, last_error, delivered_at::text FROM ${tableName} ${suffix}`;
419
+ }
420
+ function parseOutboxRow(row) {
421
+ const event = parseReceiptStoreValue(row.payload);
422
+ return {
423
+ ...event,
424
+ status: row.status,
425
+ attemptCount: row.attempt_count,
426
+ nextAttemptAt: Number(row.next_attempt_at),
427
+ leaseOwner: row.lease_owner ?? undefined,
428
+ leaseExpiresAt: row.lease_expires_at ? Number(row.lease_expires_at) : undefined,
429
+ lastAttemptAt: row.last_attempt_at ? Number(row.last_attempt_at) : undefined,
430
+ lastError: row.last_error ?? undefined,
431
+ deliveredAt: row.delivered_at ? Number(row.delivered_at) : undefined,
432
+ };
433
+ }
434
+ async function one(db, sql, values = []) {
435
+ const result = await db.query(sql, values);
436
+ return result.rows[0] ? parseReceiptStoreValue(result.rows[0].payload) : undefined;
437
+ }
438
+ async function all(db, sql, values = []) {
439
+ const result = await db.query(sql, values);
440
+ return result.rows.map((row) => parseReceiptStoreValue(row.payload));
441
+ }
442
+ async function filteredAll(db, sql, values, filter) {
443
+ return (await all(db, sql, values)).filter(filter);
444
+ }
445
+ async function insert(db, handle, name, columns, values, payload, conflictColumns = ['id']) {
446
+ const allColumns = [...columns, 'payload'];
447
+ const params = allColumns.map((_, index) => `$${index + 1}`).join(', ');
448
+ await db.query(`INSERT INTO ${table(handle, name)} (${allColumns.join(', ')}) VALUES (${params})
449
+ ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`, [...values, serializeReceiptStoreValue(payload)]);
450
+ }
451
+ async function upsert(db, handle, name, columns, values, payload) {
452
+ const allColumns = [...columns, 'payload'];
453
+ const params = allColumns.map((_, index) => `$${index + 1}`).join(', ');
454
+ const updates = allColumns
455
+ .filter((column) => column !== 'id')
456
+ .map((column) => `${column} = EXCLUDED.${column}`)
457
+ .join(', ');
458
+ await db.query(`INSERT INTO ${table(handle, name)} (${allColumns.join(', ')}) VALUES (${params})
459
+ ON CONFLICT (id) DO UPDATE SET ${updates}`, [...values, serializeReceiptStoreValue(payload)]);
460
+ }
461
+ function matchesBalanceFilter(value, filter) {
462
+ return ((!filter.projectId || value.projectId === filter.projectId) &&
463
+ (!filter.customerId || value.customerId === filter.customerId));
464
+ }
465
+ export function createPostgresCreditStore(config) {
466
+ return new PostgresCreditStore(config);
467
+ }
468
+ //# sourceMappingURL=credit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit.js","sourceRoot":"","sources":["../src/credit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type PostgresConnectionConfig } from './connection.js';
2
+ export interface PostgresHealth {
3
+ ok: boolean;
4
+ latencyMs: number;
5
+ schema: string;
6
+ schemaVersion: number;
7
+ latestSchemaVersion: number;
8
+ pendingOutboxEvents: number;
9
+ deadLetterEvents: number;
10
+ error?: string;
11
+ }
12
+ export declare function checkPostgresHealth(config: PostgresConnectionConfig): Promise<PostgresHealth>;
13
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG7F,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAqCzB"}
package/dist/health.js ADDED
@@ -0,0 +1,40 @@
1
+ import { createPostgresHandle, table } from './connection.js';
2
+ import { POSTGRES_SCHEMA_VERSION } from './migrations.js';
3
+ export async function checkPostgresHealth(config) {
4
+ const handle = createPostgresHandle(config);
5
+ const startedAt = Date.now();
6
+ try {
7
+ await handle.pool.query('SELECT 1');
8
+ const version = await handle.pool.query(`SELECT COALESCE(MAX(version), 0)::int AS version FROM ${table(handle, 'resvary_schema_migrations')}`);
9
+ const outbox = await handle.pool.query(`SELECT status, COUNT(*)::text AS count FROM ${table(handle, 'resvary_outbox_events')}
10
+ WHERE status IN ('pending', 'dead_letter') GROUP BY status`);
11
+ const counts = new Map(outbox.rows.map((row) => [row.status, Number(row.count)]));
12
+ const schemaVersion = version.rows[0]?.version ?? 0;
13
+ return {
14
+ ok: schemaVersion === POSTGRES_SCHEMA_VERSION,
15
+ latencyMs: Date.now() - startedAt,
16
+ schema: handle.schema,
17
+ schemaVersion,
18
+ latestSchemaVersion: POSTGRES_SCHEMA_VERSION,
19
+ pendingOutboxEvents: counts.get('pending') ?? 0,
20
+ deadLetterEvents: counts.get('dead_letter') ?? 0,
21
+ };
22
+ }
23
+ catch (error) {
24
+ return {
25
+ ok: false,
26
+ latencyMs: Date.now() - startedAt,
27
+ schema: handle.schema,
28
+ schemaVersion: 0,
29
+ latestSchemaVersion: POSTGRES_SCHEMA_VERSION,
30
+ pendingOutboxEvents: 0,
31
+ deadLetterEvents: 0,
32
+ error: error instanceof Error ? error.message : String(error),
33
+ };
34
+ }
35
+ finally {
36
+ if (handle.ownsPool)
37
+ await handle.pool.end();
38
+ }
39
+ }
40
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAiC,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAa1D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAgC;IAEhC,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CACrC,yDAAyD,KAAK,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAAE,CACtG,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CACpC,+CAA+C,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC;kEACzB,CAC7D,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;QACpD,OAAO;YACL,EAAE,EAAE,aAAa,KAAK,uBAAuB;YAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa;YACb,mBAAmB,EAAE,uBAAuB;YAC5C,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;YAC/C,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;SACjD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,CAAC;YAChB,mBAAmB,EAAE,uBAAuB;YAC5C,mBAAmB,EAAE,CAAC;YACtB,gBAAgB,EAAE,CAAC;YACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,MAAM,CAAC,QAAQ;YAAE,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type PostgresConnectionConfig } from './connection.js';
2
+ export interface SqliteImportConfig extends PostgresConnectionConfig {
3
+ sqlitePath: string;
4
+ dryRun?: boolean;
5
+ }
6
+ export interface SqliteImportReport {
7
+ sqliteSchemaVersion: number;
8
+ postgresSchemaVersion: number;
9
+ dryRun: boolean;
10
+ committed: boolean;
11
+ counts: Record<string, number>;
12
+ balanceMismatches: string[];
13
+ ledgerMismatches: string[];
14
+ sourceOpenReservations: number;
15
+ targetOpenReservations: number;
16
+ }
17
+ export declare function importSqliteDatabase(config: SqliteImportConfig): Promise<SqliteImportReport>;
18
+ export declare function verifySqliteImport(config: SqliteImportConfig): Promise<SqliteImportReport>;
19
+ //# sourceMappingURL=import-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-sqlite.d.ts","sourceRoot":"","sources":["../src/import-sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAgLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAkE7B;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgChG"}