pipework 0.64.0 → 0.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/REFERENCE.md +87 -0
  3. package/dist/auth/tenant/in-tenant.d.ts +11 -0
  4. package/dist/auth/tenant/in-tenant.d.ts.map +1 -0
  5. package/dist/auth/tenant/in-tenant.js +23 -0
  6. package/dist/auth/tenant/in-tenant.js.map +1 -0
  7. package/dist/core/config/namespace.d.ts +1 -0
  8. package/dist/core/config/namespace.d.ts.map +1 -1
  9. package/dist/core/config/schema.d.ts +3 -0
  10. package/dist/core/config/schema.d.ts.map +1 -1
  11. package/dist/core/config/schema.js +2 -0
  12. package/dist/core/config/schema.js.map +1 -1
  13. package/dist/core/errors/http.d.ts +10 -0
  14. package/dist/core/errors/http.d.ts.map +1 -1
  15. package/dist/core/errors/http.js +14 -0
  16. package/dist/core/errors/http.js.map +1 -1
  17. package/dist/core/errors/index.d.ts +1 -1
  18. package/dist/core/errors/index.d.ts.map +1 -1
  19. package/dist/core/errors/index.js +1 -1
  20. package/dist/core/errors/index.js.map +1 -1
  21. package/dist/core/errors/namespace.d.ts +5 -1
  22. package/dist/core/errors/namespace.d.ts.map +1 -1
  23. package/dist/core/errors/namespace.js +5 -1
  24. package/dist/core/errors/namespace.js.map +1 -1
  25. package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
  26. package/dist/data/migrate/internal-definitions.js +7 -0
  27. package/dist/data/migrate/internal-definitions.js.map +1 -1
  28. package/dist/index.d.ts +4 -2
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/infra/access-links/handle.d.ts.map +1 -1
  33. package/dist/infra/access-links/handle.js +3 -17
  34. package/dist/infra/access-links/handle.js.map +1 -1
  35. package/dist/infra/credits/handle.d.ts +149 -0
  36. package/dist/infra/credits/handle.d.ts.map +1 -0
  37. package/dist/infra/credits/handle.js +405 -0
  38. package/dist/infra/credits/handle.js.map +1 -0
  39. package/dist/infra/credits/index.d.ts +3 -0
  40. package/dist/infra/credits/index.d.ts.map +1 -0
  41. package/dist/infra/credits/index.js +2 -0
  42. package/dist/infra/credits/index.js.map +1 -0
  43. package/dist/infra/credits/namespace.d.ts +7 -0
  44. package/dist/infra/credits/namespace.d.ts.map +1 -0
  45. package/dist/infra/credits/namespace.js +7 -0
  46. package/dist/infra/credits/namespace.js.map +1 -0
  47. package/dist/infra/credits/schema.d.ts +132 -0
  48. package/dist/infra/credits/schema.d.ts.map +1 -0
  49. package/dist/infra/credits/schema.js +67 -0
  50. package/dist/infra/credits/schema.js.map +1 -0
  51. package/dist/request/di/builder.d.ts +43 -1
  52. package/dist/request/di/builder.d.ts.map +1 -1
  53. package/dist/request/di/builder.js +26 -0
  54. package/dist/request/di/builder.js.map +1 -1
  55. package/dist/request/di/index.d.ts +1 -1
  56. package/dist/request/di/index.d.ts.map +1 -1
  57. package/dist/request/di/resolve.d.ts +2 -1
  58. package/dist/request/di/resolve.d.ts.map +1 -1
  59. package/dist/request/di/resolve.js +8 -0
  60. package/dist/request/di/resolve.js.map +1 -1
  61. package/dist/request/di/types.d.ts +38 -0
  62. package/dist/request/di/types.d.ts.map +1 -1
  63. package/dist/request/di/types.js.map +1 -1
  64. package/dist/request/http/server.d.ts.map +1 -1
  65. package/dist/request/http/server.js +62 -3
  66. package/dist/request/http/server.js.map +1 -1
  67. package/dist/request/http/upload.d.ts +39 -0
  68. package/dist/request/http/upload.d.ts.map +1 -0
  69. package/dist/request/http/upload.js +140 -0
  70. package/dist/request/http/upload.js.map +1 -0
  71. package/dist/request/openapi/generate.d.ts.map +1 -1
  72. package/dist/request/openapi/generate.js +23 -0
  73. package/dist/request/openapi/generate.js.map +1 -1
  74. package/package.json +2 -1
@@ -0,0 +1,405 @@
1
+ import { sql } from '../../data/db/sql.js';
2
+ import { pipe } from '../../data/db/db.js';
3
+ import { requireContext } from '../../request/context/store.js';
4
+ import { inTenant } from '../../auth/tenant/in-tenant.js';
5
+ import { getBaseLogger } from '../../core/logging/index.js';
6
+ import { ValidationError } from '../../core/errors/index.js';
7
+ const DEFAULT_HISTORY_LIMIT = 50;
8
+ const MAX_HISTORY_LIMIT = 500;
9
+ function toDate(value) {
10
+ if (value instanceof Date)
11
+ return value;
12
+ const text = String(value);
13
+ return new Date(/(Z|[+-]\d\d(:?\d\d)?)$/.test(text) ? text : `${text.replace(' ', 'T')}Z`);
14
+ }
15
+ function toDateOrNull(value) {
16
+ return value === null || value === undefined ? null : toDate(value);
17
+ }
18
+ function num(value) {
19
+ return Number(value);
20
+ }
21
+ function numOrNull(value) {
22
+ return value === null || value === undefined ? null : Number(value);
23
+ }
24
+ function rowToGrant(row) {
25
+ return {
26
+ id: row['id'],
27
+ tenantId: row['tenant_id'],
28
+ kind: row['kind'],
29
+ amount: num(row['amount']),
30
+ remaining: num(row['remaining']),
31
+ grantedAt: toDate(row['granted_at']),
32
+ expiresAt: toDateOrNull(row['expires_at']),
33
+ sourceRef: row['source_ref'] ?? null,
34
+ metadata: row['metadata'] ?? null,
35
+ };
36
+ }
37
+ function rowToReservation(row) {
38
+ return {
39
+ id: row['id'],
40
+ tenantId: row['tenant_id'],
41
+ jobId: row['job_id'],
42
+ amount: num(row['amount']),
43
+ status: row['status'],
44
+ settledAmount: numOrNull(row['settled_amount']),
45
+ overdraft: num(row['overdraft']),
46
+ createdAt: toDate(row['created_at']),
47
+ settledAt: toDateOrNull(row['settled_at']),
48
+ };
49
+ }
50
+ function rowToEntry(row) {
51
+ return {
52
+ id: row['id'],
53
+ tenantId: row['tenant_id'],
54
+ at: toDate(row['at']),
55
+ kind: row['kind'],
56
+ amount: num(row['amount']),
57
+ grantId: row['grant_id'] ?? null,
58
+ reservationId: row['reservation_id'] ?? null,
59
+ jobId: row['job_id'] ?? null,
60
+ availableAfter: num(row['available_after']),
61
+ };
62
+ }
63
+ function requireUnits(name, value, min) {
64
+ if (!Number.isSafeInteger(value) || value < min) {
65
+ const detail = min === 1 ? 'must be a positive integer' : 'must be a non-negative integer';
66
+ throw new ValidationError({ [name]: [detail] }, `Credits ${name} ${detail}.`);
67
+ }
68
+ }
69
+ function requireJobId(jobId) {
70
+ if (typeof jobId !== 'string' || jobId === '') {
71
+ throw new ValidationError({ jobId: ['must be a non-empty string'] }, 'Credits jobId must be a non-empty string.');
72
+ }
73
+ }
74
+ const LIVE = sql `remaining > 0 AND (expires_at IS NULL OR expires_at > now())`;
75
+ export function createCredits(config = {}) {
76
+ const threshold = config.lowBalanceThreshold;
77
+ if (threshold !== undefined && (!Number.isSafeInteger(threshold) || threshold < 0)) {
78
+ throw new Error('[pipework] credits lowBalanceThreshold must be a non-negative integer.\n');
79
+ }
80
+ function callback(name, fn) {
81
+ try {
82
+ fn();
83
+ }
84
+ catch (err) {
85
+ getBaseLogger().error({ err }, `credits ${name} callback threw`);
86
+ }
87
+ }
88
+ // Runs `fn` in a transaction for the tenant: the Flow's own (joining the
89
+ // request's transaction) or, for the `...For` forms, an explicit one.
90
+ async function run(explicit, fn) {
91
+ if (explicit !== null) {
92
+ requireTenantId(explicit);
93
+ return inTenant(requireContext(), explicit, tx => fn(tx, explicit));
94
+ }
95
+ const flow = requireContext();
96
+ if (flow.tenant === null) {
97
+ throw new Error('[pipework] This credits method needs a tenant in the Flow.\n\n' +
98
+ ' Call it from an authenticated tenant route, or use the ...For(tenantId, ...) form\n' +
99
+ ' (grantFor, reserveFor, settleFor, ...) from a webhook or a job with no tenant.\n');
100
+ }
101
+ const tenantId = flow.tenant;
102
+ return pipe.transaction((tx) => fn(tx, tenantId));
103
+ }
104
+ function requireTenantId(tenantId) {
105
+ if (typeof tenantId !== 'string' || tenantId === '') {
106
+ throw new ValidationError({ tenantId: ['must be a non-empty string'] }, 'Credits tenantId must be a non-empty string.');
107
+ }
108
+ }
109
+ // Every mutating operation takes the tenant's lock first, so operations on one
110
+ // tenant's credits run one after another; the grant rows are also locked FOR UPDATE.
111
+ async function lockTenant(tx, tenantId) {
112
+ await tx.execute(sql `SELECT pg_advisory_xact_lock(hashtextextended(${`pipework.credits:${tenantId}`}, 0))`);
113
+ }
114
+ async function availableOf(tx, tenantId) {
115
+ const rows = await tx.execute(sql `
116
+ SELECT COALESCE(SUM(remaining), 0) AS n FROM credit_grant WHERE tenant_id = ${tenantId} AND ${LIVE}
117
+ `);
118
+ return num(rows[0]['n']);
119
+ }
120
+ async function writeLedger(tx, tenantId, entry) {
121
+ const availableAfter = await availableOf(tx, tenantId);
122
+ await tx.execute(sql `
123
+ INSERT INTO credit_ledger (tenant_id, at, kind, amount, grant_id, reservation_id, job_id, available_after)
124
+ VALUES (${tenantId}, clock_timestamp(), ${entry.kind}, ${entry.amount}, ${entry.grantId ?? null},
125
+ ${entry.reservationId ?? null}, ${entry.jobId ?? null}, ${availableAfter})
126
+ `);
127
+ }
128
+ // Draws up to `need` from live grants, soonest-expiring first; returns what it drew.
129
+ async function drawFrom(tx, tenantId, reservationId, need, firstSeq) {
130
+ const grants = await tx.execute(sql `
131
+ SELECT id, remaining FROM credit_grant WHERE tenant_id = ${tenantId} AND ${LIVE}
132
+ ORDER BY expires_at ASC NULLS LAST, granted_at, id FOR UPDATE
133
+ `);
134
+ let left = need;
135
+ let seq = firstSeq;
136
+ for (const grant of grants) {
137
+ if (left === 0)
138
+ break;
139
+ const take = Math.min(num(grant['remaining']), left);
140
+ await tx.execute(sql `UPDATE credit_grant SET remaining = remaining - ${take} WHERE id = ${grant['id']}`);
141
+ await tx.execute(sql `
142
+ INSERT INTO credit_draw (tenant_id, reservation_id, grant_id, amount, seq)
143
+ VALUES (${tenantId}, ${reservationId}, ${grant['id']}, ${take}, ${seq})
144
+ `);
145
+ left -= take;
146
+ seq += 1;
147
+ }
148
+ return need - left;
149
+ }
150
+ // Gives back up to `amount` of a reservation's draws, latest draw first, to grants
151
+ // that have not expired; returns what reached a grant.
152
+ async function refund(tx, tenantId, reservationId, amount) {
153
+ const draws = await tx.execute(sql `
154
+ SELECT id, grant_id, amount FROM credit_draw
155
+ WHERE tenant_id = ${tenantId} AND reservation_id = ${reservationId} AND amount > 0
156
+ ORDER BY seq DESC FOR UPDATE
157
+ `);
158
+ let left = amount;
159
+ let refunded = 0;
160
+ for (const draw of draws) {
161
+ if (left === 0)
162
+ break;
163
+ const take = Math.min(num(draw['amount']), left);
164
+ await tx.execute(sql `UPDATE credit_draw SET amount = amount - ${take} WHERE id = ${draw['id']}`);
165
+ const back = await tx.execute(sql `
166
+ UPDATE credit_grant SET remaining = remaining + ${take}
167
+ WHERE id = ${draw['grant_id']} AND (expires_at IS NULL OR expires_at > now())
168
+ RETURNING id
169
+ `);
170
+ if (back.length > 0)
171
+ refunded += take;
172
+ left -= take;
173
+ }
174
+ return refunded;
175
+ }
176
+ async function findReservation(tx, tenantId, jobId, lock) {
177
+ const rows = await tx.execute(lock
178
+ ? sql `SELECT * FROM credit_reservation WHERE tenant_id = ${tenantId} AND job_id = ${jobId} FOR UPDATE`
179
+ : sql `SELECT * FROM credit_reservation WHERE tenant_id = ${tenantId} AND job_id = ${jobId}`);
180
+ return rows.length === 0 ? null : rowToReservation(rows[0]);
181
+ }
182
+ // Calls the callbacks once the operation's transaction body has finished.
183
+ function signal(tenantId, measured) {
184
+ if (measured.insufficient !== undefined && config.onInsufficient !== undefined) {
185
+ const event = { tenantId, ...measured.insufficient };
186
+ const fn = config.onInsufficient;
187
+ callback('onInsufficient', () => fn(event));
188
+ }
189
+ if (threshold !== undefined && measured.before >= threshold && measured.after < threshold) {
190
+ getBaseLogger().warn({ event: 'credits low balance', tenantId, available: measured.after }, 'credits low balance');
191
+ const fn = config.onLowBalance;
192
+ if (fn !== undefined)
193
+ callback('onLowBalance', () => fn({ tenantId, available: measured.after }));
194
+ }
195
+ return measured.value;
196
+ }
197
+ async function doGrant(explicit, options) {
198
+ requireUnits('amount', options.amount, 1);
199
+ if (typeof options.kind !== 'string' || options.kind === '') {
200
+ throw new ValidationError({ kind: ['must be a non-empty string'] }, 'Credits grant kind must be a non-empty string.');
201
+ }
202
+ if (options.sourceRef !== undefined && options.sourceRef === '') {
203
+ throw new ValidationError({ sourceRef: ['must not be empty'] }, 'Credits grant sourceRef must not be empty.');
204
+ }
205
+ return run(explicit, async (tx, tenantId) => {
206
+ await lockTenant(tx, tenantId);
207
+ if (options.sourceRef !== undefined) {
208
+ const existing = await tx.execute(sql `
209
+ SELECT * FROM credit_grant WHERE tenant_id = ${tenantId} AND source_ref = ${options.sourceRef}
210
+ `);
211
+ if (existing.length > 0)
212
+ return { grant: rowToGrant(existing[0]), created: false };
213
+ }
214
+ const metadata = options.metadata === undefined ? null : JSON.stringify(options.metadata);
215
+ const rows = await tx.execute(sql `
216
+ INSERT INTO credit_grant (tenant_id, kind, amount, remaining, granted_at, expires_at, source_ref, metadata)
217
+ VALUES (${tenantId}, ${options.kind}, ${options.amount}, ${options.amount}, now(),
218
+ ${options.expiresAt?.toISOString() ?? null}, ${options.sourceRef ?? null},
219
+ ${metadata === null ? sql `NULL` : sql `${metadata}::jsonb`})
220
+ RETURNING *
221
+ `);
222
+ const grant = rowToGrant(rows[0]);
223
+ await writeLedger(tx, tenantId, { kind: 'grant', amount: options.amount, grantId: grant.id });
224
+ return { grant, created: true };
225
+ });
226
+ }
227
+ async function doReserve(explicit, options) {
228
+ requireJobId(options.jobId);
229
+ requireUnits('amount', options.amount, 1);
230
+ const done = await run(explicit, async (tx, tenantId) => {
231
+ await lockTenant(tx, tenantId);
232
+ const existing = await findReservation(tx, tenantId, options.jobId, false);
233
+ if (existing !== null) {
234
+ const now = await availableOf(tx, tenantId);
235
+ return { tenantId, measured: { value: { ok: true, reservation: existing }, before: now, after: now } };
236
+ }
237
+ const before = await availableOf(tx, tenantId);
238
+ if (before < options.amount) {
239
+ return {
240
+ tenantId,
241
+ measured: {
242
+ value: { ok: false, reason: 'insufficient', available: before, requested: options.amount },
243
+ before, after: before,
244
+ insufficient: { jobId: options.jobId, requested: options.amount, available: before },
245
+ },
246
+ };
247
+ }
248
+ const inserted = await tx.execute(sql `
249
+ INSERT INTO credit_reservation (tenant_id, job_id, amount, status)
250
+ VALUES (${tenantId}, ${options.jobId}, ${options.amount}, 'held')
251
+ ON CONFLICT (tenant_id, job_id) DO NOTHING
252
+ RETURNING *
253
+ `);
254
+ if (inserted.length === 0) {
255
+ const winner = (await findReservation(tx, tenantId, options.jobId, false));
256
+ return { tenantId, measured: { value: { ok: true, reservation: winner }, before, after: before } };
257
+ }
258
+ const reservation = rowToReservation(inserted[0]);
259
+ await drawFrom(tx, tenantId, reservation.id, options.amount, 1);
260
+ await writeLedger(tx, tenantId, { kind: 'reserve', amount: -options.amount, reservationId: reservation.id, jobId: options.jobId });
261
+ return { tenantId, measured: { value: { ok: true, reservation }, before, after: before - options.amount } };
262
+ });
263
+ return signal(done.tenantId, done.measured);
264
+ }
265
+ async function doSettle(explicit, options) {
266
+ requireJobId(options.jobId);
267
+ requireUnits('amount', options.amount, 0);
268
+ const done = await run(explicit, async (tx, tenantId) => {
269
+ await lockTenant(tx, tenantId);
270
+ const reservation = await findReservation(tx, tenantId, options.jobId, true);
271
+ if (reservation === null) {
272
+ throw new Error(`[pipework] credits.settle: no reservation for job "${options.jobId}".\n\n Call reserve({ jobId, amount }) before the job, with the same jobId.\n`);
273
+ }
274
+ if (reservation.status === 'released') {
275
+ throw new Error(`[pipework] credits.settle: the reservation for job "${options.jobId}" was released.\n`);
276
+ }
277
+ if (reservation.status === 'settled') {
278
+ if (reservation.settledAmount === options.amount) {
279
+ const now = await availableOf(tx, tenantId);
280
+ return { tenantId, measured: { value: reservation, before: now, after: now } };
281
+ }
282
+ throw new Error(`[pipework] credits.settle: job "${options.jobId}" was already settled at ${reservation.settledAmount}, ` +
283
+ `not ${options.amount}.\n`);
284
+ }
285
+ const before = await availableOf(tx, tenantId);
286
+ const delta = options.amount - reservation.amount;
287
+ let change = 0;
288
+ let overdraft = 0;
289
+ if (delta < 0) {
290
+ change = await refund(tx, tenantId, reservation.id, -delta);
291
+ }
292
+ else if (delta > 0) {
293
+ const seqRows = await tx.execute(sql `SELECT COALESCE(MAX(seq), 0) AS n FROM credit_draw WHERE reservation_id = ${reservation.id}`);
294
+ const drawn = await drawFrom(tx, tenantId, reservation.id, delta, num(seqRows[0]['n']) + 1);
295
+ change = -drawn;
296
+ overdraft = delta - drawn;
297
+ }
298
+ const rows = await tx.execute(sql `
299
+ UPDATE credit_reservation
300
+ SET status = 'settled', settled_amount = ${options.amount}, overdraft = ${overdraft}, settled_at = now()
301
+ WHERE id = ${reservation.id}
302
+ RETURNING *
303
+ `);
304
+ await writeLedger(tx, tenantId, { kind: 'settle', amount: change, reservationId: reservation.id, jobId: options.jobId });
305
+ return { tenantId, measured: { value: rowToReservation(rows[0]), before, after: before + change } };
306
+ });
307
+ return signal(done.tenantId, done.measured);
308
+ }
309
+ async function doRelease(explicit, options) {
310
+ requireJobId(options.jobId);
311
+ return run(explicit, async (tx, tenantId) => {
312
+ await lockTenant(tx, tenantId);
313
+ const reservation = await findReservation(tx, tenantId, options.jobId, true);
314
+ if (reservation === null)
315
+ return { released: false, reservation: null };
316
+ if (reservation.status === 'released')
317
+ return { released: false, reservation };
318
+ if (reservation.status === 'settled') {
319
+ throw new Error(`[pipework] credits.release: job "${options.jobId}" was already settled; settled usage cannot be released.\n`);
320
+ }
321
+ const refunded = await refund(tx, tenantId, reservation.id, reservation.amount);
322
+ const rows = await tx.execute(sql `
323
+ UPDATE credit_reservation SET status = 'released', settled_at = now() WHERE id = ${reservation.id} RETURNING *
324
+ `);
325
+ await writeLedger(tx, tenantId, { kind: 'release', amount: refunded, reservationId: reservation.id, jobId: options.jobId });
326
+ return { released: true, reservation: rowToReservation(rows[0]) };
327
+ });
328
+ }
329
+ async function doBalance(explicit) {
330
+ return run(explicit, async (tx, tenantId) => {
331
+ const grants = await tx.execute(sql `
332
+ SELECT id, kind, remaining, expires_at FROM credit_grant WHERE tenant_id = ${tenantId} AND ${LIVE}
333
+ ORDER BY expires_at ASC NULLS LAST, granted_at, id
334
+ `);
335
+ const held = await tx.execute(sql `
336
+ SELECT COALESCE(SUM(amount), 0) AS n FROM credit_reservation WHERE tenant_id = ${tenantId} AND status = 'held'
337
+ `);
338
+ const list = grants.map(g => ({
339
+ id: g['id'], kind: g['kind'], remaining: num(g['remaining']), expiresAt: toDateOrNull(g['expires_at']),
340
+ }));
341
+ return { available: list.reduce((sum, g) => sum + g.remaining, 0), held: num(held[0]['n']), grants: list };
342
+ });
343
+ }
344
+ async function doHistory(explicit, options = {}) {
345
+ const limit = options.limit ?? DEFAULT_HISTORY_LIMIT;
346
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_HISTORY_LIMIT) {
347
+ throw new ValidationError({ limit: [`must be an integer from 1 to ${MAX_HISTORY_LIMIT}`] }, 'Credits history limit is out of range.');
348
+ }
349
+ let cursor = null;
350
+ if (options.before !== undefined) {
351
+ const cut = options.before.lastIndexOf('|');
352
+ if (cut < 1)
353
+ throw new ValidationError({ before: ['is not a cursor from history()'] }, 'Credits history cursor is not valid.');
354
+ cursor = { at: options.before.slice(0, cut), id: options.before.slice(cut + 1) };
355
+ }
356
+ return run(explicit, async (tx, tenantId) => {
357
+ const rows = await tx.execute(cursor === null
358
+ ? sql `
359
+ SELECT *, "at"::text AS at_text FROM credit_ledger WHERE tenant_id = ${tenantId}
360
+ ORDER BY "at" DESC, id DESC LIMIT ${limit + 1}`
361
+ : sql `
362
+ SELECT *, "at"::text AS at_text FROM credit_ledger
363
+ WHERE tenant_id = ${tenantId} AND ("at", id) < (${cursor.at}::timestamp, ${cursor.id}::uuid)
364
+ ORDER BY "at" DESC, id DESC LIMIT ${limit + 1}`);
365
+ const page = rows.slice(0, limit);
366
+ const last = page[page.length - 1];
367
+ return {
368
+ entries: page.map(rowToEntry),
369
+ next: rows.length > limit && last !== undefined ? `${last['at_text']}|${last['id']}` : null,
370
+ };
371
+ });
372
+ }
373
+ async function doExpire(explicit) {
374
+ return run(explicit, async (tx, tenantId) => {
375
+ await lockTenant(tx, tenantId);
376
+ const due = await tx.execute(sql `
377
+ SELECT id, remaining FROM credit_grant
378
+ WHERE tenant_id = ${tenantId} AND remaining > 0 AND expires_at IS NOT NULL AND expires_at <= now()
379
+ ORDER BY expires_at, id FOR UPDATE
380
+ `);
381
+ for (const grant of due) {
382
+ await tx.execute(sql `UPDATE credit_grant SET remaining = 0 WHERE id = ${grant['id']}`);
383
+ await writeLedger(tx, tenantId, { kind: 'expire', amount: -num(grant['remaining']), grantId: grant['id'] });
384
+ }
385
+ return due.length;
386
+ });
387
+ }
388
+ return {
389
+ grant: o => doGrant(null, o),
390
+ grantFor: (t, o) => doGrant(t, o),
391
+ reserve: o => doReserve(null, o),
392
+ reserveFor: (t, o) => doReserve(t, o),
393
+ settle: o => doSettle(null, o),
394
+ settleFor: (t, o) => doSettle(t, o),
395
+ release: o => doRelease(null, o),
396
+ releaseFor: (t, o) => doRelease(t, o),
397
+ balance: () => doBalance(null),
398
+ balanceFor: t => doBalance(t),
399
+ history: o => doHistory(null, o),
400
+ historyFor: (t, o) => doHistory(t, o),
401
+ expire: () => doExpire(null),
402
+ expireFor: t => doExpire(t),
403
+ };
404
+ }
405
+ //# sourceMappingURL=handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle.js","sourceRoot":"","sources":["../../../src/infra/credits/handle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createCredits } from './handle.js';
2
+ export type { Credits, CreditsConfig, CreditGrant, GrantOptions, GrantResult, CreditReservation, ReserveResult, CreditBalance, CreditLedgerEntry, HistoryOptions, HistoryPage, } from './handle.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infra/credits/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,YAAY,EACV,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAChG,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,GAC9D,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { createCredits } from './handle.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infra/credits/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { createCredits } from './handle.js';
2
+ /** Credits namespace — prepaid usage credits per tenant: expiring grants, reserve / settle / release by job. */
3
+ export declare const credits: {
4
+ /** Creates a credits handle. */
5
+ readonly create: typeof createCredits;
6
+ };
7
+ //# sourceMappingURL=namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/infra/credits/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,gHAAgH;AAChH,eAAO,MAAM,OAAO;IAClB,gCAAgC;;CAExB,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { createCredits } from './handle.js';
2
+ /** Credits namespace — prepaid usage credits per tenant: expiring grants, reserve / settle / release by job. */
3
+ export const credits = {
4
+ /** Creates a credits handle. */
5
+ create: createCredits,
6
+ };
7
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/infra/credits/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,gHAAgH;AAChH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,gCAAgC;IAChC,MAAM,EAAE,aAAa;CACb,CAAA"}
@@ -0,0 +1,132 @@
1
+ export declare const CREDIT_RESERVATION_STATUSES: readonly ["held", "settled", "released"];
2
+ export declare const CREDIT_LEDGER_KINDS: readonly ["grant", "reserve", "settle", "release", "expire"];
3
+ export declare const creditGrant: import("../../data/domain/types.js").DefinedTable<{
4
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
5
+ defaultRandom: true;
6
+ hasDefault: true;
7
+ } & {
8
+ primaryKey: true;
9
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
10
+ defaultRandom: true;
11
+ hasDefault: true;
12
+ } & {
13
+ primaryKey: true;
14
+ }>;
15
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
16
+ kind: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
17
+ amount: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
18
+ remaining: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
19
+ grantedAt: import("../../data/domain/types.js").FieldDescriptor<Date, {
20
+ hasDefault: true;
21
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
22
+ hasDefault: true;
23
+ }>;
24
+ expiresAt: import("../../data/domain/types.js").FieldDescriptor<Date | null, {
25
+ nullable: true;
26
+ }> & import("../../data/domain/field.js").FieldModifiers<Date | null, {
27
+ nullable: true;
28
+ }>;
29
+ sourceRef: import("../../data/domain/types.js").FieldDescriptor<string | null, {
30
+ nullable: true;
31
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
32
+ nullable: true;
33
+ }>;
34
+ metadata: import("../../data/domain/types.js").FieldDescriptor<import("zod/v4").JSONType, {
35
+ nullable: true;
36
+ }> & import("../../data/domain/field.js").FieldModifiers<import("zod/v4").JSONType, {
37
+ nullable: true;
38
+ }>;
39
+ }, "credit_grant">;
40
+ export declare const creditReservation: import("../../data/domain/types.js").DefinedTable<{
41
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
42
+ defaultRandom: true;
43
+ hasDefault: true;
44
+ } & {
45
+ primaryKey: true;
46
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
47
+ defaultRandom: true;
48
+ hasDefault: true;
49
+ } & {
50
+ primaryKey: true;
51
+ }>;
52
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
53
+ jobId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
54
+ amount: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
55
+ status: import("../../data/domain/types.js").FieldDescriptor<"held" | "settled" | "released", {}> & import("../../data/domain/field.js").FieldModifiers<"held" | "settled" | "released", {}>;
56
+ settledAmount: import("../../data/domain/types.js").FieldDescriptor<bigint | null, {
57
+ nullable: true;
58
+ }> & import("../../data/domain/field.js").FieldModifiers<bigint | null, {
59
+ nullable: true;
60
+ }>;
61
+ overdraft: import("../../data/domain/types.js").FieldDescriptor<bigint, {
62
+ hasDefault: true;
63
+ }> & import("../../data/domain/field.js").FieldModifiers<bigint, {
64
+ hasDefault: true;
65
+ }>;
66
+ createdAt: import("../../data/domain/types.js").FieldDescriptor<Date, {
67
+ hasDefault: true;
68
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
69
+ hasDefault: true;
70
+ }>;
71
+ settledAt: import("../../data/domain/types.js").FieldDescriptor<Date | null, {
72
+ nullable: true;
73
+ }> & import("../../data/domain/field.js").FieldModifiers<Date | null, {
74
+ nullable: true;
75
+ }>;
76
+ }, "credit_reservation">;
77
+ export declare const creditDraw: import("../../data/domain/types.js").DefinedTable<{
78
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
79
+ defaultRandom: true;
80
+ hasDefault: true;
81
+ } & {
82
+ primaryKey: true;
83
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
84
+ defaultRandom: true;
85
+ hasDefault: true;
86
+ } & {
87
+ primaryKey: true;
88
+ }>;
89
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
90
+ reservationId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
91
+ grantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
92
+ amount: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
93
+ seq: import("../../data/domain/types.js").FieldDescriptor<number, {}> & import("../../data/domain/field.js").FieldModifiers<number, {}>;
94
+ }, "credit_draw">;
95
+ export declare const creditLedger: import("../../data/domain/types.js").DefinedTable<{
96
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
97
+ defaultRandom: true;
98
+ hasDefault: true;
99
+ } & {
100
+ primaryKey: true;
101
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
102
+ defaultRandom: true;
103
+ hasDefault: true;
104
+ } & {
105
+ primaryKey: true;
106
+ }>;
107
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
108
+ at: import("../../data/domain/types.js").FieldDescriptor<Date, {
109
+ hasDefault: true;
110
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
111
+ hasDefault: true;
112
+ }>;
113
+ kind: import("../../data/domain/types.js").FieldDescriptor<"grant" | "reserve" | "settle" | "release" | "expire", {}> & import("../../data/domain/field.js").FieldModifiers<"grant" | "reserve" | "settle" | "release" | "expire", {}>;
114
+ amount: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
115
+ grantId: import("../../data/domain/types.js").FieldDescriptor<string | null, {
116
+ nullable: true;
117
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
118
+ nullable: true;
119
+ }>;
120
+ reservationId: import("../../data/domain/types.js").FieldDescriptor<string | null, {
121
+ nullable: true;
122
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
123
+ nullable: true;
124
+ }>;
125
+ jobId: import("../../data/domain/types.js").FieldDescriptor<string | null, {
126
+ nullable: true;
127
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
128
+ nullable: true;
129
+ }>;
130
+ availableAfter: import("../../data/domain/types.js").FieldDescriptor<bigint, {}> & import("../../data/domain/field.js").FieldModifiers<bigint, {}>;
131
+ }, "credit_ledger">;
132
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/infra/credits/schema.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,2BAA2B,0CAA2C,CAAA;AACnF,eAAO,MAAM,mBAAmB,8DAA+D,CAAA;AAE/F,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAetB,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAc5B,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;iBAWrB,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAcvB,CAAA"}