@resvary/sqlite 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/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2025-2026 horn111
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ https://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @resvary/sqlite
2
+
3
+ SQLite persistence for Resvary credits, usage receipts, and stablecoin payment receipts.
4
+
5
+ ```typescript
6
+ import { CreditLedger } from '@resvary/sdk/credits';
7
+ import { createSqliteCreditStore } from '@resvary/sqlite';
8
+
9
+ const store = createSqliteCreditStore({ path: '.resvary/resvary.sqlite' });
10
+ const credits = new CreditLedger({ projectId: 'my_ai_product', store });
11
+ ```
12
+
13
+ The existing `createSqliteReceiptStore` remains available for payment invoices, receipts, webhook deliveries, and Arc watcher cursors. Both stores can use the same file.
14
+
15
+ Requires Node.js 24+ and local filesystem access. The credit store uses WAL, `BEGIN IMMEDIATE`, rollback-safe writes, and versioned schema metadata.
@@ -0,0 +1,46 @@
1
+ import type { CreditAccount, CreditBalanceFilter, CreditGrant, CreditOutboxEvent, CreditReservation, CreditReservationFilter, CreditStore, CreditStoreTransaction, IdempotencyRecord, FundingIntent, FundingTransaction, LedgerEntry, MeterDefinition, OutboxEventFilter, OutboxDeliveryStore, ClaimOutboxEventsInput, FailOutboxEventInput, PriceVersion, UsageEvent, UsageReceipt } from '@resvary/sdk/credits';
2
+ export interface SqliteCreditStoreConfig {
3
+ path: string;
4
+ createDirectory?: boolean;
5
+ }
6
+ export declare class SqliteCreditStore implements CreditStore, OutboxDeliveryStore {
7
+ private readonly db;
8
+ private transactionTail;
9
+ constructor(config: SqliteCreditStoreConfig);
10
+ transaction<T>(handler: (transaction: CreditStoreTransaction) => Promise<T>): Promise<T>;
11
+ getAccount(id: string): Promise<CreditAccount | undefined>;
12
+ getAccountByCustomer(projectId: string, customerId: string): Promise<CreditAccount | undefined>;
13
+ listAccounts(filter?: CreditBalanceFilter): Promise<CreditAccount[]>;
14
+ getGrant(id: string): Promise<CreditGrant | undefined>;
15
+ listGrants(accountId?: string): Promise<CreditGrant[]>;
16
+ getMeter(id: string): Promise<MeterDefinition | undefined>;
17
+ getMeterByKey(projectId: string, key: string): Promise<MeterDefinition | undefined>;
18
+ getPriceVersion(id: string): Promise<PriceVersion | undefined>;
19
+ listPriceVersions(meterId?: string): Promise<PriceVersion[]>;
20
+ getReservation(id: string): Promise<CreditReservation | undefined>;
21
+ listReservations(filter?: CreditReservationFilter): Promise<CreditReservation[]>;
22
+ getUsageEvent(id: string): Promise<UsageEvent | undefined>;
23
+ getUsageReceipt(id: string): Promise<UsageReceipt | undefined>;
24
+ listUsageReceipts(accountId?: string): Promise<UsageReceipt[]>;
25
+ listLedgerEntries(accountId?: string): Promise<LedgerEntry[]>;
26
+ getOutboxEvent(id: string): Promise<CreditOutboxEvent<unknown> | undefined>;
27
+ listOutboxEvents(filter?: OutboxEventFilter): Promise<CreditOutboxEvent<unknown>[]>;
28
+ getIdempotencyRecord(scope: string, key: string): Promise<IdempotencyRecord | undefined>;
29
+ getFundingIntent(id: string): Promise<FundingIntent | undefined>;
30
+ listFundingIntents(projectId?: string): Promise<FundingIntent[]>;
31
+ getFundingTransaction(id: string): Promise<FundingTransaction | undefined>;
32
+ getFundingTransactionByExternalPayment(rail: FundingTransaction['rail'], network: string, externalPaymentId: string): Promise<FundingTransaction | undefined>;
33
+ getFundingTransactionByTxHash(network: string, txHash: `0x${string}`): Promise<FundingTransaction | undefined>;
34
+ listFundingTransactions(fundingIntentId?: string): Promise<FundingTransaction[]>;
35
+ claimOutboxEvents(input: ClaimOutboxEventsInput): Promise<CreditOutboxEvent[]>;
36
+ completeOutboxEvent(eventId: string, workerId: string, deliveredAt: number): Promise<void>;
37
+ failOutboxEvent(input: FailOutboxEventInput): Promise<void>;
38
+ listDeadLetterEvents(projectId?: string): Promise<CreditOutboxEvent[]>;
39
+ requeueOutboxEvent(eventId: string, now: number): Promise<void>;
40
+ close(): void;
41
+ private migrate;
42
+ private migrateFundingV2;
43
+ private migrateOutboxV3;
44
+ }
45
+ export declare function createSqliteCreditStore(config: SqliteCreditStoreConfig): SqliteCreditStore;
46
+ //# sourceMappingURL=credit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credit.d.ts","sourceRoot":"","sources":["../src/credit.ts"],"names":[],"mappings":"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"}
package/dist/credit.js ADDED
@@ -0,0 +1,758 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import { parseReceiptStoreValue, serializeReceiptStoreValue } from '@resvary/sdk/receipts';
5
+ export class SqliteCreditStore {
6
+ db;
7
+ transactionTail = Promise.resolve();
8
+ constructor(config) {
9
+ if (config.path !== ':memory:' && config.createDirectory !== false) {
10
+ mkdirSync(dirname(config.path), { recursive: true });
11
+ }
12
+ this.db = new DatabaseSync(config.path);
13
+ this.migrate();
14
+ }
15
+ async transaction(handler) {
16
+ let release;
17
+ const current = new Promise((resolve) => {
18
+ release = resolve;
19
+ });
20
+ const previous = this.transactionTail;
21
+ this.transactionTail = previous.then(() => current);
22
+ await previous;
23
+ this.db.exec('BEGIN IMMEDIATE');
24
+ try {
25
+ const result = await handler(new SqliteCreditTransaction(this.db));
26
+ this.db.exec('COMMIT');
27
+ return result;
28
+ }
29
+ catch (error) {
30
+ this.db.exec('ROLLBACK');
31
+ throw error;
32
+ }
33
+ finally {
34
+ release();
35
+ }
36
+ }
37
+ getAccount(id) {
38
+ return reader(this.db).getAccount(id);
39
+ }
40
+ getAccountByCustomer(projectId, customerId) {
41
+ return reader(this.db).getAccountByCustomer(projectId, customerId);
42
+ }
43
+ listAccounts(filter) {
44
+ return reader(this.db).listAccounts(filter);
45
+ }
46
+ getGrant(id) {
47
+ return reader(this.db).getGrant(id);
48
+ }
49
+ listGrants(accountId) {
50
+ return reader(this.db).listGrants(accountId);
51
+ }
52
+ getMeter(id) {
53
+ return reader(this.db).getMeter(id);
54
+ }
55
+ getMeterByKey(projectId, key) {
56
+ return reader(this.db).getMeterByKey(projectId, key);
57
+ }
58
+ getPriceVersion(id) {
59
+ return reader(this.db).getPriceVersion(id);
60
+ }
61
+ listPriceVersions(meterId) {
62
+ return reader(this.db).listPriceVersions(meterId);
63
+ }
64
+ getReservation(id) {
65
+ return reader(this.db).getReservation(id);
66
+ }
67
+ listReservations(filter) {
68
+ return reader(this.db).listReservations(filter);
69
+ }
70
+ getUsageEvent(id) {
71
+ return reader(this.db).getUsageEvent(id);
72
+ }
73
+ getUsageReceipt(id) {
74
+ return reader(this.db).getUsageReceipt(id);
75
+ }
76
+ listUsageReceipts(accountId) {
77
+ return reader(this.db).listUsageReceipts(accountId);
78
+ }
79
+ listLedgerEntries(accountId) {
80
+ return reader(this.db).listLedgerEntries(accountId);
81
+ }
82
+ getOutboxEvent(id) {
83
+ return reader(this.db).getOutboxEvent(id);
84
+ }
85
+ listOutboxEvents(filter) {
86
+ return reader(this.db).listOutboxEvents(filter);
87
+ }
88
+ getIdempotencyRecord(scope, key) {
89
+ return reader(this.db).getIdempotencyRecord(scope, key);
90
+ }
91
+ getFundingIntent(id) {
92
+ return reader(this.db).getFundingIntent(id);
93
+ }
94
+ listFundingIntents(projectId) {
95
+ return reader(this.db).listFundingIntents(projectId);
96
+ }
97
+ getFundingTransaction(id) {
98
+ return reader(this.db).getFundingTransaction(id);
99
+ }
100
+ getFundingTransactionByExternalPayment(rail, network, externalPaymentId) {
101
+ return reader(this.db).getFundingTransactionByExternalPayment(rail, network, externalPaymentId);
102
+ }
103
+ getFundingTransactionByTxHash(network, txHash) {
104
+ return reader(this.db).getFundingTransactionByTxHash(network, txHash);
105
+ }
106
+ listFundingTransactions(fundingIntentId) {
107
+ return reader(this.db).listFundingTransactions(fundingIntentId);
108
+ }
109
+ claimOutboxEvents(input) {
110
+ return this.transaction(async (tx) => {
111
+ const events = (await tx.listOutboxEvents({ projectId: input.projectId }))
112
+ .filter((event) => (event.status === 'pending' && event.nextAttemptAt <= input.now) ||
113
+ (event.status === 'processing' && (event.leaseExpiresAt ?? 0) <= input.now))
114
+ .sort((a, b) => a.nextAttemptAt - b.nextAttemptAt || a.createdAt - b.createdAt)
115
+ .slice(0, input.limit);
116
+ const claimed = [];
117
+ for (const event of events) {
118
+ const value = {
119
+ ...event,
120
+ status: 'processing',
121
+ attemptCount: event.attemptCount + 1,
122
+ leaseOwner: input.workerId,
123
+ leaseExpiresAt: input.now + input.leaseMs,
124
+ lastAttemptAt: input.now,
125
+ };
126
+ await tx.saveOutboxEvent(value);
127
+ claimed.push(value);
128
+ }
129
+ return claimed;
130
+ });
131
+ }
132
+ async completeOutboxEvent(eventId, workerId, deliveredAt) {
133
+ await this.transaction(async (tx) => {
134
+ const event = await requireClaimedEvent(tx, eventId, workerId);
135
+ await tx.saveOutboxEvent({
136
+ ...event,
137
+ status: 'delivered',
138
+ deliveredAt,
139
+ nextAttemptAt: deliveredAt,
140
+ leaseOwner: undefined,
141
+ leaseExpiresAt: undefined,
142
+ lastError: undefined,
143
+ });
144
+ });
145
+ }
146
+ async failOutboxEvent(input) {
147
+ await this.transaction(async (tx) => {
148
+ const event = await requireClaimedEvent(tx, input.eventId, input.workerId);
149
+ await tx.saveOutboxEvent({
150
+ ...event,
151
+ status: input.deadLetter ? 'dead_letter' : 'pending',
152
+ nextAttemptAt: input.nextAttemptAt,
153
+ leaseOwner: undefined,
154
+ leaseExpiresAt: undefined,
155
+ lastError: input.error,
156
+ });
157
+ });
158
+ }
159
+ listDeadLetterEvents(projectId) {
160
+ return this.listOutboxEvents({ projectId, status: 'dead_letter' });
161
+ }
162
+ async requeueOutboxEvent(eventId, now) {
163
+ await this.transaction(async (tx) => {
164
+ const event = await tx.getOutboxEvent(eventId);
165
+ if (!event)
166
+ throw new Error(`Outbox event not found: ${eventId}`);
167
+ if (event.status !== 'dead_letter') {
168
+ throw new Error(`Outbox event is not dead-lettered: ${eventId}`);
169
+ }
170
+ await tx.saveOutboxEvent({
171
+ ...event,
172
+ status: 'pending',
173
+ attemptCount: 0,
174
+ nextAttemptAt: now,
175
+ leaseOwner: undefined,
176
+ leaseExpiresAt: undefined,
177
+ lastError: undefined,
178
+ });
179
+ });
180
+ }
181
+ close() {
182
+ this.db.close();
183
+ }
184
+ migrate() {
185
+ this.db.exec(`
186
+ PRAGMA journal_mode = WAL;
187
+ PRAGMA busy_timeout = 5000;
188
+ PRAGMA foreign_keys = ON;
189
+
190
+ CREATE TABLE IF NOT EXISTS resvary_schema_migrations (
191
+ version INTEGER PRIMARY KEY,
192
+ applied_at INTEGER NOT NULL
193
+ );
194
+
195
+ CREATE TABLE IF NOT EXISTS resvary_credit_accounts (
196
+ id TEXT PRIMARY KEY,
197
+ project_id TEXT NOT NULL,
198
+ customer_id TEXT NOT NULL,
199
+ updated_at INTEGER NOT NULL,
200
+ payload TEXT NOT NULL,
201
+ UNIQUE(project_id, customer_id)
202
+ );
203
+
204
+ CREATE TABLE IF NOT EXISTS resvary_credit_grants (
205
+ id TEXT PRIMARY KEY,
206
+ account_id TEXT NOT NULL,
207
+ created_at INTEGER NOT NULL,
208
+ payload TEXT NOT NULL
209
+ );
210
+ CREATE INDEX IF NOT EXISTS resvary_credit_grants_account ON resvary_credit_grants(account_id);
211
+
212
+ CREATE TABLE IF NOT EXISTS resvary_meters (
213
+ id TEXT PRIMARY KEY,
214
+ project_id TEXT NOT NULL,
215
+ meter_key TEXT NOT NULL,
216
+ payload TEXT NOT NULL,
217
+ UNIQUE(project_id, meter_key)
218
+ );
219
+
220
+ CREATE TABLE IF NOT EXISTS resvary_price_versions (
221
+ id TEXT PRIMARY KEY,
222
+ meter_id TEXT NOT NULL,
223
+ version INTEGER NOT NULL,
224
+ created_at INTEGER NOT NULL,
225
+ payload TEXT NOT NULL,
226
+ UNIQUE(meter_id, version)
227
+ );
228
+
229
+ CREATE TABLE IF NOT EXISTS resvary_credit_reservations (
230
+ id TEXT PRIMARY KEY,
231
+ account_id TEXT NOT NULL,
232
+ project_id TEXT NOT NULL,
233
+ customer_id TEXT NOT NULL,
234
+ status TEXT NOT NULL,
235
+ expires_at INTEGER NOT NULL,
236
+ created_at INTEGER NOT NULL,
237
+ payload TEXT NOT NULL
238
+ );
239
+ CREATE INDEX IF NOT EXISTS resvary_credit_reservations_open
240
+ ON resvary_credit_reservations(project_id, customer_id, status, expires_at);
241
+
242
+ CREATE TABLE IF NOT EXISTS resvary_usage_events (
243
+ id TEXT PRIMARY KEY,
244
+ account_id TEXT NOT NULL,
245
+ received_at INTEGER NOT NULL,
246
+ payload TEXT NOT NULL
247
+ );
248
+
249
+ CREATE TABLE IF NOT EXISTS resvary_usage_receipts (
250
+ id TEXT PRIMARY KEY,
251
+ account_id TEXT NOT NULL,
252
+ reservation_id TEXT NOT NULL UNIQUE,
253
+ usage_event_id TEXT NOT NULL UNIQUE,
254
+ created_at INTEGER NOT NULL,
255
+ payload TEXT NOT NULL
256
+ );
257
+ CREATE INDEX IF NOT EXISTS resvary_usage_receipts_account ON resvary_usage_receipts(account_id, created_at);
258
+
259
+ CREATE TABLE IF NOT EXISTS resvary_ledger_entries (
260
+ id TEXT PRIMARY KEY,
261
+ account_id TEXT NOT NULL,
262
+ created_at INTEGER NOT NULL,
263
+ payload TEXT NOT NULL
264
+ );
265
+ CREATE INDEX IF NOT EXISTS resvary_ledger_entries_account ON resvary_ledger_entries(account_id, created_at);
266
+
267
+ CREATE TABLE IF NOT EXISTS resvary_funding_intents (
268
+ id TEXT PRIMARY KEY,
269
+ project_id TEXT NOT NULL,
270
+ customer_id TEXT NOT NULL,
271
+ status TEXT NOT NULL,
272
+ created_at INTEGER NOT NULL,
273
+ payload TEXT NOT NULL
274
+ );
275
+
276
+ CREATE TABLE IF NOT EXISTS resvary_funding_transactions (
277
+ id TEXT PRIMARY KEY,
278
+ funding_intent_id TEXT NOT NULL,
279
+ network TEXT NOT NULL,
280
+ tx_hash_norm TEXT NOT NULL,
281
+ created_at INTEGER NOT NULL,
282
+ payload TEXT NOT NULL,
283
+ UNIQUE(network, tx_hash_norm)
284
+ );
285
+
286
+ CREATE TABLE IF NOT EXISTS resvary_idempotency_keys (
287
+ scope TEXT NOT NULL,
288
+ key TEXT NOT NULL,
289
+ created_at INTEGER NOT NULL,
290
+ payload TEXT NOT NULL,
291
+ PRIMARY KEY(scope, key)
292
+ );
293
+
294
+ CREATE TABLE IF NOT EXISTS resvary_outbox_events (
295
+ id TEXT PRIMARY KEY,
296
+ project_id TEXT NOT NULL,
297
+ type TEXT NOT NULL,
298
+ status TEXT NOT NULL,
299
+ created_at INTEGER NOT NULL,
300
+ payload TEXT NOT NULL
301
+ );
302
+ CREATE INDEX IF NOT EXISTS resvary_outbox_events_pending
303
+ ON resvary_outbox_events(project_id, status, created_at);
304
+
305
+ INSERT OR IGNORE INTO resvary_schema_migrations(version, applied_at)
306
+ VALUES (1, CAST(strftime('%s', 'now') AS INTEGER) * 1000);
307
+ `);
308
+ this.migrateFundingV2();
309
+ this.migrateOutboxV3();
310
+ }
311
+ migrateFundingV2() {
312
+ const row = this.db
313
+ .prepare('SELECT MAX(version) AS version FROM resvary_schema_migrations')
314
+ .get();
315
+ if ((row?.version ?? 0) >= 2)
316
+ return;
317
+ this.db.exec('BEGIN IMMEDIATE;');
318
+ try {
319
+ this.db.exec(`
320
+ ALTER TABLE resvary_funding_transactions
321
+ ADD COLUMN rail TEXT NOT NULL DEFAULT 'arc_direct';
322
+ ALTER TABLE resvary_funding_transactions
323
+ ADD COLUMN external_payment_id_norm TEXT;
324
+ UPDATE resvary_funding_transactions
325
+ SET external_payment_id_norm = tx_hash_norm
326
+ WHERE external_payment_id_norm IS NULL;
327
+
328
+ ALTER TABLE resvary_funding_transactions
329
+ RENAME TO resvary_funding_transactions_v1;
330
+ CREATE TABLE resvary_funding_transactions (
331
+ id TEXT PRIMARY KEY,
332
+ funding_intent_id TEXT NOT NULL,
333
+ rail TEXT NOT NULL,
334
+ network TEXT NOT NULL,
335
+ external_payment_id_norm TEXT NOT NULL,
336
+ tx_hash_norm TEXT,
337
+ created_at INTEGER NOT NULL,
338
+ payload TEXT NOT NULL,
339
+ UNIQUE(rail, network, external_payment_id_norm)
340
+ );
341
+ INSERT INTO resvary_funding_transactions(
342
+ id,
343
+ funding_intent_id,
344
+ rail,
345
+ network,
346
+ external_payment_id_norm,
347
+ tx_hash_norm,
348
+ created_at,
349
+ payload
350
+ )
351
+ SELECT
352
+ id,
353
+ funding_intent_id,
354
+ rail,
355
+ network,
356
+ external_payment_id_norm,
357
+ tx_hash_norm,
358
+ created_at,
359
+ payload
360
+ FROM resvary_funding_transactions_v1;
361
+ DROP TABLE resvary_funding_transactions_v1;
362
+ CREATE INDEX resvary_funding_transactions_tx_hash
363
+ ON resvary_funding_transactions(network, tx_hash_norm);
364
+ `);
365
+ const intents = this.db
366
+ .prepare('SELECT id, payload FROM resvary_funding_intents')
367
+ .all();
368
+ for (const intentRow of intents) {
369
+ const intent = parseReceiptStoreValue(intentRow.payload);
370
+ this.db
371
+ .prepare('UPDATE resvary_funding_intents SET payload = ? WHERE id = ?')
372
+ .run(serializeReceiptStoreValue({ ...intent, rail: intent.rail ?? 'arc_direct' }), intentRow.id);
373
+ }
374
+ const transactions = this.db
375
+ .prepare('SELECT id, payload FROM resvary_funding_transactions')
376
+ .all();
377
+ for (const transactionRow of transactions) {
378
+ const transaction = parseReceiptStoreValue(transactionRow.payload);
379
+ const externalPaymentId = transaction.externalPaymentId ?? transaction.txHash ?? transactionRow.id;
380
+ const migrated = {
381
+ ...transaction,
382
+ rail: transaction.rail ?? 'arc_direct',
383
+ externalPaymentId,
384
+ settlementStatus: transaction.settlementStatus ?? 'settled',
385
+ acceptedAt: transaction.acceptedAt ?? transaction.createdAt,
386
+ settledAt: transaction.settledAt ?? transaction.createdAt,
387
+ evidence: transaction.evidence ?? {
388
+ amountUnits: transaction.amountUnits,
389
+ payer: transaction.payer,
390
+ },
391
+ };
392
+ this.db
393
+ .prepare(`
394
+ UPDATE resvary_funding_transactions
395
+ SET rail = ?, external_payment_id_norm = ?, payload = ?
396
+ WHERE id = ?
397
+ `)
398
+ .run(migrated.rail, migrated.externalPaymentId.toLowerCase(), serializeReceiptStoreValue(migrated), transactionRow.id);
399
+ }
400
+ this.db
401
+ .prepare('INSERT INTO resvary_schema_migrations(version, applied_at) VALUES (2, ?)')
402
+ .run(Date.now());
403
+ this.db.exec('COMMIT;');
404
+ }
405
+ catch (error) {
406
+ this.db.exec('ROLLBACK;');
407
+ throw error;
408
+ }
409
+ }
410
+ migrateOutboxV3() {
411
+ const row = this.db
412
+ .prepare('SELECT MAX(version) AS version FROM resvary_schema_migrations')
413
+ .get();
414
+ if ((row?.version ?? 0) >= 3)
415
+ return;
416
+ this.db.exec('BEGIN IMMEDIATE;');
417
+ try {
418
+ this.db.exec(`
419
+ ALTER TABLE resvary_outbox_events ADD COLUMN attempt_count INTEGER NOT NULL DEFAULT 0;
420
+ ALTER TABLE resvary_outbox_events ADD COLUMN next_attempt_at INTEGER NOT NULL DEFAULT 0;
421
+ ALTER TABLE resvary_outbox_events ADD COLUMN lease_owner TEXT;
422
+ ALTER TABLE resvary_outbox_events ADD COLUMN lease_expires_at INTEGER;
423
+ DROP INDEX IF EXISTS resvary_outbox_events_pending;
424
+ CREATE INDEX resvary_outbox_events_due
425
+ ON resvary_outbox_events(project_id, status, next_attempt_at, created_at);
426
+ `);
427
+ const rows = this.db
428
+ .prepare('SELECT id, created_at, payload FROM resvary_outbox_events')
429
+ .all();
430
+ for (const item of rows) {
431
+ const event = parseReceiptStoreValue(item.payload);
432
+ const migrated = {
433
+ ...event,
434
+ attemptCount: event.attemptCount ?? 0,
435
+ nextAttemptAt: event.nextAttemptAt ?? item.created_at,
436
+ };
437
+ this.db
438
+ .prepare(`UPDATE resvary_outbox_events
439
+ SET attempt_count = ?, next_attempt_at = ?, lease_owner = ?, lease_expires_at = ?, payload = ?
440
+ WHERE id = ?`)
441
+ .run(migrated.attemptCount, migrated.nextAttemptAt, migrated.leaseOwner ?? null, migrated.leaseExpiresAt ?? null, serializeReceiptStoreValue(migrated), item.id);
442
+ }
443
+ this.db
444
+ .prepare('INSERT INTO resvary_schema_migrations(version, applied_at) VALUES (3, ?)')
445
+ .run(Date.now());
446
+ this.db.exec('COMMIT;');
447
+ }
448
+ catch (error) {
449
+ this.db.exec('ROLLBACK;');
450
+ throw error;
451
+ }
452
+ }
453
+ }
454
+ class SqliteCreditTransaction {
455
+ db;
456
+ constructor(db) {
457
+ this.db = db;
458
+ }
459
+ getAccount(id) {
460
+ return reader(this.db).getAccount(id);
461
+ }
462
+ getAccountByCustomer(projectId, customerId) {
463
+ return reader(this.db).getAccountByCustomer(projectId, customerId);
464
+ }
465
+ listAccounts(filter) {
466
+ return reader(this.db).listAccounts(filter);
467
+ }
468
+ getGrant(id) {
469
+ return reader(this.db).getGrant(id);
470
+ }
471
+ listGrants(accountId) {
472
+ return reader(this.db).listGrants(accountId);
473
+ }
474
+ getMeter(id) {
475
+ return reader(this.db).getMeter(id);
476
+ }
477
+ getMeterByKey(projectId, key) {
478
+ return reader(this.db).getMeterByKey(projectId, key);
479
+ }
480
+ getPriceVersion(id) {
481
+ return reader(this.db).getPriceVersion(id);
482
+ }
483
+ listPriceVersions(meterId) {
484
+ return reader(this.db).listPriceVersions(meterId);
485
+ }
486
+ getReservation(id) {
487
+ return reader(this.db).getReservation(id);
488
+ }
489
+ listReservations(filter) {
490
+ return reader(this.db).listReservations(filter);
491
+ }
492
+ getUsageEvent(id) {
493
+ return reader(this.db).getUsageEvent(id);
494
+ }
495
+ getUsageReceipt(id) {
496
+ return reader(this.db).getUsageReceipt(id);
497
+ }
498
+ listUsageReceipts(accountId) {
499
+ return reader(this.db).listUsageReceipts(accountId);
500
+ }
501
+ listLedgerEntries(accountId) {
502
+ return reader(this.db).listLedgerEntries(accountId);
503
+ }
504
+ getOutboxEvent(id) {
505
+ return reader(this.db).getOutboxEvent(id);
506
+ }
507
+ listOutboxEvents(filter) {
508
+ return reader(this.db).listOutboxEvents(filter);
509
+ }
510
+ getIdempotencyRecord(scope, key) {
511
+ return reader(this.db).getIdempotencyRecord(scope, key);
512
+ }
513
+ getFundingIntent(id) {
514
+ return reader(this.db).getFundingIntent(id);
515
+ }
516
+ listFundingIntents(projectId) {
517
+ return reader(this.db).listFundingIntents(projectId);
518
+ }
519
+ getFundingTransaction(id) {
520
+ return reader(this.db).getFundingTransaction(id);
521
+ }
522
+ getFundingTransactionByExternalPayment(rail, network, externalPaymentId) {
523
+ return reader(this.db).getFundingTransactionByExternalPayment(rail, network, externalPaymentId);
524
+ }
525
+ getFundingTransactionByTxHash(network, txHash) {
526
+ return reader(this.db).getFundingTransactionByTxHash(network, txHash);
527
+ }
528
+ listFundingTransactions(fundingIntentId) {
529
+ return reader(this.db).listFundingTransactions(fundingIntentId);
530
+ }
531
+ async saveAccount(value) {
532
+ upsert(this.db, 'resvary_credit_accounts', ['id', 'project_id', 'customer_id', 'updated_at'], [value.id, value.projectId, value.customerId, value.updatedAt], value);
533
+ }
534
+ async saveGrant(value) {
535
+ insert(this.db, 'resvary_credit_grants', ['id', 'account_id', 'created_at'], [value.id, value.accountId, value.createdAt], value);
536
+ }
537
+ async saveMeter(value) {
538
+ insert(this.db, 'resvary_meters', ['id', 'project_id', 'meter_key'], [value.id, value.projectId, value.key], value);
539
+ }
540
+ async savePriceVersion(value) {
541
+ insert(this.db, 'resvary_price_versions', ['id', 'meter_id', 'version', 'created_at'], [value.id, value.meterId, value.version, value.createdAt], value);
542
+ }
543
+ async saveReservation(value) {
544
+ upsert(this.db, 'resvary_credit_reservations', ['id', 'account_id', 'project_id', 'customer_id', 'status', 'expires_at', 'created_at'], [
545
+ value.id,
546
+ value.accountId,
547
+ value.projectId,
548
+ value.customerId,
549
+ value.status,
550
+ value.expiresAt,
551
+ value.createdAt,
552
+ ], value);
553
+ }
554
+ async saveUsageEvent(value) {
555
+ insert(this.db, 'resvary_usage_events', ['id', 'account_id', 'received_at'], [value.id, value.accountId, value.receivedAt], value);
556
+ }
557
+ async saveUsageReceipt(value) {
558
+ insert(this.db, 'resvary_usage_receipts', ['id', 'account_id', 'reservation_id', 'usage_event_id', 'created_at'], [value.id, value.accountId, value.reservationId, value.usageEventId, value.createdAt], value);
559
+ }
560
+ async saveLedgerEntry(value) {
561
+ insert(this.db, 'resvary_ledger_entries', ['id', 'account_id', 'created_at'], [value.id, value.accountId, value.createdAt], value);
562
+ }
563
+ async saveOutboxEvent(value) {
564
+ upsert(this.db, 'resvary_outbox_events', [
565
+ 'id',
566
+ 'project_id',
567
+ 'type',
568
+ 'status',
569
+ 'created_at',
570
+ 'attempt_count',
571
+ 'next_attempt_at',
572
+ 'lease_owner',
573
+ 'lease_expires_at',
574
+ ], [
575
+ value.id,
576
+ value.projectId,
577
+ value.type,
578
+ value.status,
579
+ value.createdAt,
580
+ value.attemptCount,
581
+ value.nextAttemptAt,
582
+ value.leaseOwner ?? null,
583
+ value.leaseExpiresAt ?? null,
584
+ ], value);
585
+ }
586
+ async saveIdempotencyRecord(value) {
587
+ insert(this.db, 'resvary_idempotency_keys', ['scope', 'key', 'created_at'], [value.scope, value.key, value.createdAt], value, ['scope', 'key']);
588
+ }
589
+ async saveFundingIntent(value) {
590
+ upsert(this.db, 'resvary_funding_intents', ['id', 'project_id', 'customer_id', 'status', 'created_at'], [value.id, value.projectId, value.customerId, value.status, value.createdAt], value);
591
+ }
592
+ async saveFundingTransaction(value) {
593
+ upsert(this.db, 'resvary_funding_transactions', [
594
+ 'id',
595
+ 'funding_intent_id',
596
+ 'rail',
597
+ 'network',
598
+ 'external_payment_id_norm',
599
+ 'tx_hash_norm',
600
+ 'created_at',
601
+ ], [
602
+ value.id,
603
+ value.fundingIntentId,
604
+ value.rail,
605
+ value.network,
606
+ value.externalPaymentId.toLowerCase(),
607
+ value.txHash?.toLowerCase() ?? `external:${value.externalPaymentId.toLowerCase()}`,
608
+ value.createdAt,
609
+ ], value);
610
+ }
611
+ }
612
+ function reader(db) {
613
+ return {
614
+ async getAccount(id) {
615
+ return one(db, 'SELECT payload FROM resvary_credit_accounts WHERE id = ?', [
616
+ id,
617
+ ]);
618
+ },
619
+ async getAccountByCustomer(projectId, customerId) {
620
+ return one(db, 'SELECT payload FROM resvary_credit_accounts WHERE project_id = ? AND customer_id = ?', [projectId, customerId]);
621
+ },
622
+ async listAccounts(filter = {}) {
623
+ return all(db, 'SELECT payload FROM resvary_credit_accounts ORDER BY updated_at ASC').filter((item) => matchesBalanceFilter(item, filter));
624
+ },
625
+ async getGrant(id) {
626
+ return one(db, 'SELECT payload FROM resvary_credit_grants WHERE id = ?', [id]);
627
+ },
628
+ async listGrants(accountId) {
629
+ return accountId
630
+ ? all(db, 'SELECT payload FROM resvary_credit_grants WHERE account_id = ? ORDER BY created_at ASC', [accountId])
631
+ : all(db, 'SELECT payload FROM resvary_credit_grants ORDER BY created_at ASC');
632
+ },
633
+ async getMeter(id) {
634
+ return one(db, 'SELECT payload FROM resvary_meters WHERE id = ?', [id]);
635
+ },
636
+ async getMeterByKey(projectId, key) {
637
+ return one(db, 'SELECT payload FROM resvary_meters WHERE project_id = ? AND meter_key = ?', [projectId, key]);
638
+ },
639
+ async getPriceVersion(id) {
640
+ return one(db, 'SELECT payload FROM resvary_price_versions WHERE id = ?', [id]);
641
+ },
642
+ async listPriceVersions(meterId) {
643
+ return meterId
644
+ ? all(db, 'SELECT payload FROM resvary_price_versions WHERE meter_id = ? ORDER BY version ASC', [meterId])
645
+ : all(db, 'SELECT payload FROM resvary_price_versions ORDER BY created_at ASC');
646
+ },
647
+ async getReservation(id) {
648
+ return one(db, 'SELECT payload FROM resvary_credit_reservations WHERE id = ?', [id]);
649
+ },
650
+ async listReservations(filter = {}) {
651
+ return all(db, 'SELECT payload FROM resvary_credit_reservations ORDER BY created_at ASC').filter((item) => matchesBalanceFilter(item, filter) && (!filter.status || item.status === filter.status));
652
+ },
653
+ async getUsageEvent(id) {
654
+ return one(db, 'SELECT payload FROM resvary_usage_events WHERE id = ?', [id]);
655
+ },
656
+ async getUsageReceipt(id) {
657
+ return one(db, 'SELECT payload FROM resvary_usage_receipts WHERE id = ?', [id]);
658
+ },
659
+ async listUsageReceipts(accountId) {
660
+ return accountId
661
+ ? all(db, 'SELECT payload FROM resvary_usage_receipts WHERE account_id = ? ORDER BY created_at ASC', [accountId])
662
+ : all(db, 'SELECT payload FROM resvary_usage_receipts ORDER BY created_at ASC');
663
+ },
664
+ async listLedgerEntries(accountId) {
665
+ return accountId
666
+ ? all(db, 'SELECT payload FROM resvary_ledger_entries WHERE account_id = ? ORDER BY created_at ASC, rowid ASC', [accountId])
667
+ : all(db, 'SELECT payload FROM resvary_ledger_entries ORDER BY created_at ASC, rowid ASC');
668
+ },
669
+ async getOutboxEvent(id) {
670
+ return one(db, 'SELECT payload FROM resvary_outbox_events WHERE id = ?', [
671
+ id,
672
+ ]);
673
+ },
674
+ async listOutboxEvents(filter = {}) {
675
+ return all(db, 'SELECT payload FROM resvary_outbox_events ORDER BY created_at ASC, rowid ASC').filter((item) => (!filter.projectId || item.projectId === filter.projectId) &&
676
+ (!filter.status || item.status === filter.status) &&
677
+ (!filter.type || item.type === filter.type));
678
+ },
679
+ async getIdempotencyRecord(scope, key) {
680
+ return one(db, 'SELECT payload FROM resvary_idempotency_keys WHERE scope = ? AND key = ?', [scope, key]);
681
+ },
682
+ async getFundingIntent(id) {
683
+ return one(db, 'SELECT payload FROM resvary_funding_intents WHERE id = ?', [
684
+ id,
685
+ ]);
686
+ },
687
+ async listFundingIntents(projectId) {
688
+ return projectId
689
+ ? all(db, 'SELECT payload FROM resvary_funding_intents WHERE project_id = ? ORDER BY created_at ASC', [projectId])
690
+ : all(db, 'SELECT payload FROM resvary_funding_intents ORDER BY created_at ASC');
691
+ },
692
+ async getFundingTransaction(id) {
693
+ return one(db, 'SELECT payload FROM resvary_funding_transactions WHERE id = ?', [id]);
694
+ },
695
+ async getFundingTransactionByExternalPayment(rail, network, externalPaymentId) {
696
+ return one(db, `SELECT payload FROM resvary_funding_transactions
697
+ WHERE rail = ? AND network = ? AND external_payment_id_norm = ?`, [rail, network, externalPaymentId.toLowerCase()]);
698
+ },
699
+ async getFundingTransactionByTxHash(network, txHash) {
700
+ return one(db, 'SELECT payload FROM resvary_funding_transactions WHERE network = ? AND tx_hash_norm = ?', [network, txHash.toLowerCase()]);
701
+ },
702
+ async listFundingTransactions(fundingIntentId) {
703
+ return fundingIntentId
704
+ ? all(db, 'SELECT payload FROM resvary_funding_transactions WHERE funding_intent_id = ? ORDER BY created_at ASC', [fundingIntentId])
705
+ : all(db, 'SELECT payload FROM resvary_funding_transactions ORDER BY created_at ASC');
706
+ },
707
+ };
708
+ }
709
+ function insert(db, table, columns, values, payload, conflictColumns = ['id']) {
710
+ const allColumns = [...columns, 'payload'];
711
+ const placeholders = allColumns.map(() => '?').join(', ');
712
+ const conflict = conflictColumns.join(', ');
713
+ db.prepare(`INSERT INTO ${table} (${allColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO NOTHING`).run(...values, serializeReceiptStoreValue(payload));
714
+ }
715
+ function upsert(db, table, columns, values, payload) {
716
+ const allColumns = [...columns, 'payload'];
717
+ const placeholders = allColumns.map(() => '?').join(', ');
718
+ const updates = allColumns
719
+ .filter((column) => column !== 'id')
720
+ .map((column) => `${column} = excluded.${column}`)
721
+ .join(', ');
722
+ db.prepare(`INSERT INTO ${table} (${allColumns.join(', ')}) VALUES (${placeholders}) ON CONFLICT(id) DO UPDATE SET ${updates}`).run(...values, serializeReceiptStoreValue(payload));
723
+ }
724
+ function one(db, sql, params = []) {
725
+ return parseRow(db.prepare(sql).get(...params));
726
+ }
727
+ function all(db, sql, params = []) {
728
+ return db
729
+ .prepare(sql)
730
+ .all(...params)
731
+ .map((row) => parseRow(row))
732
+ .filter(Boolean);
733
+ }
734
+ function parseRow(row) {
735
+ if (!row ||
736
+ typeof row !== 'object' ||
737
+ !('payload' in row) ||
738
+ typeof row.payload !== 'string')
739
+ return undefined;
740
+ return parseReceiptStoreValue(row.payload);
741
+ }
742
+ function matchesBalanceFilter(value, filter) {
743
+ return ((!filter.projectId || value.projectId === filter.projectId) &&
744
+ (!filter.customerId || value.customerId === filter.customerId));
745
+ }
746
+ export function createSqliteCreditStore(config) {
747
+ return new SqliteCreditStore(config);
748
+ }
749
+ async function requireClaimedEvent(tx, eventId, workerId) {
750
+ const event = await tx.getOutboxEvent(eventId);
751
+ if (!event)
752
+ throw new Error(`Outbox event not found: ${eventId}`);
753
+ if (event.status !== 'processing' || event.leaseOwner !== workerId) {
754
+ throw new Error(`Outbox event is not leased by worker ${workerId}: ${eventId}`);
755
+ }
756
+ return event;
757
+ }
758
+ //# 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,31 @@
1
+ import { type PaymentInvoice, type PaymentReceipt, type ReceiptStore, type ReceiptStoreDeliveryFilter, type ReceiptStoreEventFilter, type ReceiptStoreInvoiceFilter, type WatcherCursor, type WebhookDeliveryAttempt, type WebhookEvent } from '@resvary/sdk/receipts';
2
+ export { SqliteCreditStore, createSqliteCreditStore, type SqliteCreditStoreConfig, } from './credit.js';
3
+ export interface SqliteReceiptStoreConfig {
4
+ path: string;
5
+ createDirectory?: boolean;
6
+ }
7
+ export declare class SqliteReceiptStore implements ReceiptStore {
8
+ private readonly db;
9
+ constructor(config: SqliteReceiptStoreConfig);
10
+ saveInvoice(invoice: PaymentInvoice): Promise<void>;
11
+ getInvoice(id: string): Promise<PaymentInvoice | undefined>;
12
+ listInvoices(filter?: ReceiptStoreInvoiceFilter): Promise<PaymentInvoice[]>;
13
+ saveReceipt(receipt: PaymentReceipt): Promise<void>;
14
+ getReceipt(id: string): Promise<PaymentReceipt | undefined>;
15
+ getReceiptByTxHash(txHash: `0x${string}`, invoiceId?: string): Promise<PaymentReceipt | undefined>;
16
+ listReceipts(): Promise<PaymentReceipt[]>;
17
+ saveWebhookEvent(event: WebhookEvent): Promise<void>;
18
+ listWebhookEvents(filter?: ReceiptStoreEventFilter): Promise<WebhookEvent[]>;
19
+ saveWebhookDelivery(delivery: WebhookDeliveryAttempt): Promise<void>;
20
+ getWebhookDelivery(id: string): Promise<WebhookDeliveryAttempt | undefined>;
21
+ listWebhookDeliveries(filter?: ReceiptStoreDeliveryFilter): Promise<WebhookDeliveryAttempt[]>;
22
+ getWatcherCursor(key: string): Promise<WatcherCursor | undefined>;
23
+ listWatcherCursors(): Promise<WatcherCursor[]>;
24
+ saveWatcherCursor(cursor: WatcherCursor): Promise<void>;
25
+ deleteWatcherCursor(key: string): Promise<void>;
26
+ close(): void;
27
+ private migrate;
28
+ private allPayloads;
29
+ }
30
+ export declare function createSqliteReceiptStore(config: SqliteReceiptStoreConfig): SqliteReceiptStore;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmB;gBAE1B,MAAM,EAAE,wBAAwB;IAStC,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBnD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAM3D,YAAY,CAAC,MAAM,GAAE,yBAA8B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAe/E,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAM3D,kBAAkB,CACtB,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAYhC,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,iBAAiB,CAAC,MAAM,GAAE,uBAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKhF,mBAAmB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BpE,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAM3E,qBAAqB,CACzB,MAAM,GAAE,0BAA+B,GACtC,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAgB9B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAMjE,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAM9C,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BvD,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,OAAO;IA+Df,OAAO,CAAC,WAAW;CAGpB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,CAE7F"}
package/dist/index.js ADDED
@@ -0,0 +1,228 @@
1
+ import { mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import { parseReceiptStoreValue, serializeReceiptStoreValue, } from '@resvary/sdk/receipts';
5
+ export { SqliteCreditStore, createSqliteCreditStore, } from './credit.js';
6
+ export class SqliteReceiptStore {
7
+ db;
8
+ constructor(config) {
9
+ if (config.path !== ':memory:' && config.createDirectory !== false) {
10
+ mkdirSync(dirname(config.path), { recursive: true });
11
+ }
12
+ this.db = new DatabaseSync(config.path);
13
+ this.migrate();
14
+ }
15
+ async saveInvoice(invoice) {
16
+ this.db.prepare(`
17
+ INSERT INTO resvary_invoices (id, status, customer_id, created_at, payload)
18
+ VALUES (?, ?, ?, ?, ?)
19
+ ON CONFLICT(id) DO UPDATE SET
20
+ status = excluded.status,
21
+ customer_id = excluded.customer_id,
22
+ created_at = excluded.created_at,
23
+ payload = excluded.payload
24
+ `).run(invoice.id, invoice.status, invoice.customerId ?? null, invoice.createdAt, serializeReceiptStoreValue(invoice));
25
+ }
26
+ async getInvoice(id) {
27
+ return parsePayloadRow(this.db.prepare('SELECT payload FROM resvary_invoices WHERE id = ?').get(id));
28
+ }
29
+ async listInvoices(filter = {}) {
30
+ return this.allPayloads('SELECT payload FROM resvary_invoices ORDER BY created_at ASC')
31
+ .filter((invoice) => {
32
+ if (filter.status && invoice.status !== filter.status) {
33
+ return false;
34
+ }
35
+ if (filter.customerId && invoice.customerId !== filter.customerId) {
36
+ return false;
37
+ }
38
+ return true;
39
+ });
40
+ }
41
+ async saveReceipt(receipt) {
42
+ this.db.prepare(`
43
+ INSERT INTO resvary_receipts (id, invoice_id, tx_hash_norm, status, created_at, payload)
44
+ VALUES (?, ?, ?, ?, ?, ?)
45
+ ON CONFLICT(id) DO UPDATE SET
46
+ invoice_id = excluded.invoice_id,
47
+ tx_hash_norm = excluded.tx_hash_norm,
48
+ status = excluded.status,
49
+ created_at = excluded.created_at,
50
+ payload = excluded.payload
51
+ `).run(receipt.id, receipt.invoiceId, receipt.txHash?.toLowerCase() ?? null, receipt.status, receipt.createdAt, serializeReceiptStoreValue(receipt));
52
+ }
53
+ async getReceipt(id) {
54
+ return parsePayloadRow(this.db.prepare('SELECT payload FROM resvary_receipts WHERE id = ?').get(id));
55
+ }
56
+ async getReceiptByTxHash(txHash, invoiceId) {
57
+ const row = invoiceId
58
+ ? this.db.prepare('SELECT payload FROM resvary_receipts WHERE tx_hash_norm = ? AND invoice_id = ? LIMIT 1').get(txHash.toLowerCase(), invoiceId)
59
+ : this.db.prepare('SELECT payload FROM resvary_receipts WHERE tx_hash_norm = ? LIMIT 1').get(txHash.toLowerCase());
60
+ return parsePayloadRow(row);
61
+ }
62
+ async listReceipts() {
63
+ return this.allPayloads('SELECT payload FROM resvary_receipts ORDER BY created_at ASC');
64
+ }
65
+ async saveWebhookEvent(event) {
66
+ this.db.prepare(`
67
+ INSERT INTO arc_webhook_events (id, type, created_at, payload)
68
+ VALUES (?, ?, ?, ?)
69
+ ON CONFLICT(id) DO UPDATE SET
70
+ type = excluded.type,
71
+ created_at = excluded.created_at,
72
+ payload = excluded.payload
73
+ `).run(event.id, event.type, event.createdAt, serializeReceiptStoreValue(event));
74
+ }
75
+ async listWebhookEvents(filter = {}) {
76
+ return this.allPayloads('SELECT payload FROM arc_webhook_events ORDER BY created_at ASC')
77
+ .filter((event) => !filter.type || event.type === filter.type);
78
+ }
79
+ async saveWebhookDelivery(delivery) {
80
+ this.db.prepare(`
81
+ INSERT INTO arc_webhook_deliveries (
82
+ id,
83
+ event_id,
84
+ event_type,
85
+ attempt,
86
+ status,
87
+ received_at,
88
+ payload
89
+ )
90
+ VALUES (?, ?, ?, ?, ?, ?, ?)
91
+ ON CONFLICT(id) DO UPDATE SET
92
+ event_id = excluded.event_id,
93
+ event_type = excluded.event_type,
94
+ attempt = excluded.attempt,
95
+ status = excluded.status,
96
+ received_at = excluded.received_at,
97
+ payload = excluded.payload
98
+ `).run(delivery.id, delivery.eventId, delivery.eventType, delivery.attempt, delivery.status, delivery.receivedAt, serializeReceiptStoreValue(delivery));
99
+ }
100
+ async getWebhookDelivery(id) {
101
+ return parsePayloadRow(this.db.prepare('SELECT payload FROM arc_webhook_deliveries WHERE id = ?').get(id));
102
+ }
103
+ async listWebhookDeliveries(filter = {}) {
104
+ return this.allPayloads('SELECT payload FROM arc_webhook_deliveries ORDER BY received_at ASC, attempt ASC').filter((delivery) => {
105
+ if (filter.eventId && delivery.eventId !== filter.eventId) {
106
+ return false;
107
+ }
108
+ if (filter.status && delivery.status !== filter.status) {
109
+ return false;
110
+ }
111
+ return true;
112
+ });
113
+ }
114
+ async getWatcherCursor(key) {
115
+ return parsePayloadRow(this.db.prepare('SELECT payload FROM arc_watcher_cursors WHERE key = ?').get(key));
116
+ }
117
+ async listWatcherCursors() {
118
+ return this.allPayloads('SELECT payload FROM arc_watcher_cursors ORDER BY updated_at ASC');
119
+ }
120
+ async saveWatcherCursor(cursor) {
121
+ this.db.prepare(`
122
+ INSERT INTO arc_watcher_cursors (
123
+ key,
124
+ network,
125
+ invoice_id,
126
+ memo_id_norm,
127
+ next_from_block,
128
+ updated_at,
129
+ payload
130
+ )
131
+ VALUES (?, ?, ?, ?, ?, ?, ?)
132
+ ON CONFLICT(key) DO UPDATE SET
133
+ network = excluded.network,
134
+ invoice_id = excluded.invoice_id,
135
+ memo_id_norm = excluded.memo_id_norm,
136
+ next_from_block = excluded.next_from_block,
137
+ updated_at = excluded.updated_at,
138
+ payload = excluded.payload
139
+ `).run(cursor.key, cursor.network, cursor.invoiceId ?? null, cursor.memoId?.toLowerCase() ?? null, cursor.nextFromBlock.toString(), cursor.updatedAt, serializeReceiptStoreValue(cursor));
140
+ }
141
+ async deleteWatcherCursor(key) {
142
+ this.db.prepare('DELETE FROM arc_watcher_cursors WHERE key = ?').run(key);
143
+ }
144
+ close() {
145
+ this.db.close();
146
+ }
147
+ migrate() {
148
+ this.db.exec(`
149
+ PRAGMA journal_mode = WAL;
150
+
151
+ CREATE TABLE IF NOT EXISTS resvary_invoices (
152
+ id TEXT PRIMARY KEY,
153
+ status TEXT NOT NULL,
154
+ customer_id TEXT,
155
+ created_at INTEGER NOT NULL,
156
+ payload TEXT NOT NULL
157
+ );
158
+
159
+ CREATE INDEX IF NOT EXISTS resvary_invoices_status
160
+ ON resvary_invoices(status);
161
+
162
+ CREATE INDEX IF NOT EXISTS resvary_invoices_customer_id
163
+ ON resvary_invoices(customer_id);
164
+
165
+ CREATE TABLE IF NOT EXISTS resvary_receipts (
166
+ id TEXT PRIMARY KEY,
167
+ invoice_id TEXT NOT NULL,
168
+ tx_hash_norm TEXT,
169
+ status TEXT NOT NULL,
170
+ created_at INTEGER NOT NULL,
171
+ payload TEXT NOT NULL
172
+ );
173
+
174
+ CREATE UNIQUE INDEX IF NOT EXISTS resvary_receipts_invoice_tx_hash
175
+ ON resvary_receipts(invoice_id, tx_hash_norm)
176
+ WHERE tx_hash_norm IS NOT NULL;
177
+
178
+ CREATE TABLE IF NOT EXISTS arc_webhook_events (
179
+ id TEXT PRIMARY KEY,
180
+ type TEXT NOT NULL,
181
+ created_at INTEGER NOT NULL,
182
+ payload TEXT NOT NULL
183
+ );
184
+
185
+ CREATE TABLE IF NOT EXISTS arc_webhook_deliveries (
186
+ id TEXT PRIMARY KEY,
187
+ event_id TEXT NOT NULL,
188
+ event_type TEXT NOT NULL,
189
+ attempt INTEGER NOT NULL,
190
+ status TEXT NOT NULL,
191
+ received_at INTEGER NOT NULL,
192
+ payload TEXT NOT NULL
193
+ );
194
+
195
+ CREATE INDEX IF NOT EXISTS arc_webhook_deliveries_event_id
196
+ ON arc_webhook_deliveries(event_id);
197
+
198
+ CREATE TABLE IF NOT EXISTS arc_watcher_cursors (
199
+ key TEXT PRIMARY KEY,
200
+ network TEXT NOT NULL,
201
+ invoice_id TEXT,
202
+ memo_id_norm TEXT,
203
+ next_from_block TEXT NOT NULL,
204
+ updated_at INTEGER NOT NULL,
205
+ payload TEXT NOT NULL
206
+ );
207
+ `);
208
+ }
209
+ allPayloads(sql) {
210
+ return this.db.prepare(sql).all().map((row) => parsePayloadRow(row));
211
+ }
212
+ }
213
+ export function createSqliteReceiptStore(config) {
214
+ return new SqliteReceiptStore(config);
215
+ }
216
+ function parsePayloadRow(row) {
217
+ if (!isPayloadRow(row)) {
218
+ return undefined;
219
+ }
220
+ return parseReceiptStoreValue(row.payload);
221
+ }
222
+ function isPayloadRow(value) {
223
+ return Boolean(value
224
+ && typeof value === 'object'
225
+ && 'payload' in value
226
+ && typeof value.payload === 'string');
227
+ }
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@resvary/sqlite",
3
+ "version": "0.5.0-alpha.1",
4
+ "description": "SQLite persistence for Resvary credits, usage receipts, and payment receipts",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public",
21
+ "tag": "alpha"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "dev": "tsc --watch",
26
+ "clean": "node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true});fs.rmSync('tsconfig.tsbuildinfo',{force:true})\"",
27
+ "test": "vitest run"
28
+ },
29
+ "engines": {
30
+ "node": ">=24.0.0"
31
+ },
32
+ "dependencies": {
33
+ "@resvary/sdk": "0.5.0-alpha.1"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.6.0",
38
+ "vitest": "^4.1.10"
39
+ },
40
+ "license": "Apache-2.0"
41
+ }