@revealui/db 0.2.0 → 0.3.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.
- package/README.md +0 -4
- package/dist/audit-store.d.ts.map +1 -1
- package/dist/audit-store.js +1 -1
- package/dist/audit-store.js.map +1 -1
- package/dist/cleanup/cross-db-cleanup.d.ts +63 -0
- package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
- package/dist/cleanup/cross-db-cleanup.js +150 -0
- package/dist/cleanup/cross-db-cleanup.js.map +1 -0
- package/dist/cleanup/index.d.ts +10 -0
- package/dist/cleanup/index.d.ts.map +1 -0
- package/dist/cleanup/index.js +10 -0
- package/dist/cleanup/index.js.map +1 -0
- package/dist/cleanup/stale-tokens.d.ts +37 -0
- package/dist/cleanup/stale-tokens.d.ts.map +1 -0
- package/dist/cleanup/stale-tokens.js +113 -0
- package/dist/cleanup/stale-tokens.js.map +1 -0
- package/dist/client/index.d.ts +13 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +46 -7
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +6 -0
- package/dist/crypto.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/log-transport.d.ts.map +1 -1
- package/dist/log-transport.js +3 -1
- package/dist/log-transport.js.map +1 -1
- package/dist/pool.d.ts +1 -4
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +29 -13
- package/dist/pool.js.map +1 -1
- package/dist/queries/boards.d.ts +13 -1
- package/dist/queries/boards.d.ts.map +1 -1
- package/dist/queries/boards.js +5 -2
- package/dist/queries/boards.js.map +1 -1
- package/dist/queries/code-provenance.d.ts +2 -0
- package/dist/queries/code-provenance.d.ts.map +1 -1
- package/dist/queries/code-provenance.js +8 -2
- package/dist/queries/code-provenance.js.map +1 -1
- package/dist/queries/media.d.ts +84 -0
- package/dist/queries/media.d.ts.map +1 -0
- package/dist/queries/media.js +47 -0
- package/dist/queries/media.js.map +1 -0
- package/dist/queries/optimized-queries.js +1 -1
- package/dist/queries/optimized-queries.js.map +1 -1
- package/dist/queries/pages.d.ts +119 -0
- package/dist/queries/pages.d.ts.map +1 -0
- package/dist/queries/pages.js +61 -0
- package/dist/queries/pages.js.map +1 -0
- package/dist/queries/posts.d.ts +107 -0
- package/dist/queries/posts.d.ts.map +1 -0
- package/dist/queries/posts.js +55 -0
- package/dist/queries/posts.js.map +1 -0
- package/dist/queries/sites.d.ts +127 -0
- package/dist/queries/sites.d.ts.map +1 -0
- package/dist/queries/sites.js +83 -0
- package/dist/queries/sites.js.map +1 -0
- package/dist/queries/ticket-comments.d.ts +9 -1
- package/dist/queries/ticket-comments.d.ts.map +1 -1
- package/dist/queries/ticket-comments.js +4 -0
- package/dist/queries/ticket-comments.js.map +1 -1
- package/dist/queries/ticket-labels.d.ts +10 -0
- package/dist/queries/ticket-labels.d.ts.map +1 -1
- package/dist/queries/ticket-labels.js +4 -0
- package/dist/queries/ticket-labels.js.map +1 -1
- package/dist/queries/tickets.d.ts +1 -1
- package/dist/queries/tickets.d.ts.map +1 -1
- package/dist/queries/tickets.js +4 -7
- package/dist/queries/tickets.js.map +1 -1
- package/dist/queries/users.d.ts +109 -0
- package/dist/queries/users.d.ts.map +1 -0
- package/dist/queries/users.js +44 -0
- package/dist/queries/users.js.map +1 -0
- package/dist/schema/accounts.d.ts +962 -0
- package/dist/schema/accounts.d.ts.map +1 -0
- package/dist/schema/accounts.js +115 -0
- package/dist/schema/accounts.js.map +1 -0
- package/dist/schema/agents.d.ts +167 -3
- package/dist/schema/agents.d.ts.map +1 -1
- package/dist/schema/agents.js +58 -7
- package/dist/schema/agents.js.map +1 -1
- package/dist/schema/api-keys.d.ts +17 -0
- package/dist/schema/api-keys.d.ts.map +1 -1
- package/dist/schema/api-keys.js +3 -0
- package/dist/schema/api-keys.js.map +1 -1
- package/dist/schema/app-logs.d.ts.map +1 -1
- package/dist/schema/app-logs.js.map +1 -1
- package/dist/schema/audit-log.d.ts.map +1 -1
- package/dist/schema/audit-log.js.map +1 -1
- package/dist/schema/cms.d.ts +68 -0
- package/dist/schema/cms.d.ts.map +1 -1
- package/dist/schema/cms.js +18 -4
- package/dist/schema/cms.js.map +1 -1
- package/dist/schema/code-provenance.d.ts.map +1 -1
- package/dist/schema/code-provenance.js.map +1 -1
- package/dist/schema/collab-edits.d.ts.map +1 -1
- package/dist/schema/collab-edits.js +2 -2
- package/dist/schema/collab-edits.js.map +1 -1
- package/dist/schema/coordination.d.ts +967 -0
- package/dist/schema/coordination.d.ts.map +1 -0
- package/dist/schema/coordination.js +109 -0
- package/dist/schema/coordination.js.map +1 -0
- package/dist/schema/crdt-operations.d.ts.map +1 -1
- package/dist/schema/crdt-operations.js.map +1 -1
- package/dist/schema/error-events.d.ts.map +1 -1
- package/dist/schema/error-events.js.map +1 -1
- package/dist/schema/gdpr.d.ts +529 -0
- package/dist/schema/gdpr.d.ts.map +1 -0
- package/dist/schema/gdpr.js +93 -0
- package/dist/schema/gdpr.js.map +1 -0
- package/dist/schema/index.d.ts +41 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +82 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/jobs.d.ts +242 -0
- package/dist/schema/jobs.d.ts.map +1 -0
- package/dist/schema/jobs.js +48 -0
- package/dist/schema/jobs.js.map +1 -0
- package/dist/schema/licenses.d.ts +51 -0
- package/dist/schema/licenses.d.ts.map +1 -1
- package/dist/schema/licenses.js +12 -3
- package/dist/schema/licenses.js.map +1 -1
- package/dist/schema/magic-links.d.ts +136 -0
- package/dist/schema/magic-links.d.ts.map +1 -0
- package/dist/schema/magic-links.js +32 -0
- package/dist/schema/magic-links.js.map +1 -0
- package/dist/schema/marketplace.d.ts +496 -0
- package/dist/schema/marketplace.d.ts.map +1 -0
- package/dist/schema/marketplace.js +110 -0
- package/dist/schema/marketplace.js.map +1 -0
- package/dist/schema/node-ids.d.ts.map +1 -1
- package/dist/schema/node-ids.js.map +1 -1
- package/dist/schema/oauth-accounts.d.ts +205 -0
- package/dist/schema/oauth-accounts.d.ts.map +1 -0
- package/dist/schema/oauth-accounts.js +35 -0
- package/dist/schema/oauth-accounts.js.map +1 -0
- package/dist/schema/pages.d.ts +34 -0
- package/dist/schema/pages.d.ts.map +1 -1
- package/dist/schema/pages.js +14 -4
- package/dist/schema/pages.js.map +1 -1
- package/dist/schema/passkeys.d.ts +208 -0
- package/dist/schema/passkeys.d.ts.map +1 -0
- package/dist/schema/passkeys.js +47 -0
- package/dist/schema/passkeys.js.map +1 -0
- package/dist/schema/password-reset-tokens.d.ts.map +1 -1
- package/dist/schema/password-reset-tokens.js +5 -2
- package/dist/schema/password-reset-tokens.js.map +1 -1
- package/dist/schema/rag.d.ts +566 -0
- package/dist/schema/rag.d.ts.map +1 -0
- package/dist/schema/rag.js +85 -0
- package/dist/schema/rag.js.map +1 -0
- package/dist/schema/rate-limits.d.ts.map +1 -1
- package/dist/schema/rate-limits.js +5 -2
- package/dist/schema/rate-limits.js.map +1 -1
- package/dist/schema/rest.d.ts +11 -2
- package/dist/schema/rest.d.ts.map +1 -1
- package/dist/schema/rest.js +11 -2
- package/dist/schema/rest.js.map +1 -1
- package/dist/schema/sites.d.ts +34 -0
- package/dist/schema/sites.d.ts.map +1 -1
- package/dist/schema/sites.js +15 -3
- package/dist/schema/sites.js.map +1 -1
- package/dist/schema/tenants.d.ts +188 -0
- package/dist/schema/tenants.d.ts.map +1 -0
- package/dist/schema/tenants.js +15 -0
- package/dist/schema/tenants.js.map +1 -0
- package/dist/schema/tickets.d.ts.map +1 -1
- package/dist/schema/tickets.js +17 -5
- package/dist/schema/tickets.js.map +1 -1
- package/dist/schema/users.d.ts +259 -0
- package/dist/schema/users.d.ts.map +1 -1
- package/dist/schema/users.js +39 -3
- package/dist/schema/users.js.map +1 -1
- package/dist/schema/vector.d.ts +1 -0
- package/dist/schema/vector.d.ts.map +1 -1
- package/dist/schema/vector.js +2 -0
- package/dist/schema/vector.js.map +1 -1
- package/dist/schema/waitlist.d.ts.map +1 -1
- package/dist/schema/waitlist.js.map +1 -1
- package/dist/schema/webhook-events.d.ts +68 -0
- package/dist/schema/webhook-events.d.ts.map +1 -0
- package/dist/schema/webhook-events.js +17 -0
- package/dist/schema/webhook-events.js.map +1 -0
- package/dist/schema/yjs-documents.d.ts.map +1 -1
- package/dist/schema/yjs-documents.js.map +1 -1
- package/dist/scripts/cleanup-expired.d.ts +12 -0
- package/dist/scripts/cleanup-expired.d.ts.map +1 -0
- package/dist/scripts/cleanup-expired.js +50 -0
- package/dist/scripts/cleanup-expired.js.map +1 -0
- package/dist/security-audit-storage.d.ts +54 -0
- package/dist/security-audit-storage.d.ts.map +1 -0
- package/dist/security-audit-storage.js +100 -0
- package/dist/security-audit-storage.js.map +1 -0
- package/dist/types/database.d.ts +381 -2
- package/dist/types/database.d.ts.map +1 -1
- package/dist/types/database.js +78 -1
- package/dist/types/database.js.map +1 -1
- package/dist/types/discover.d.ts +2 -2
- package/dist/types/discover.d.ts.map +1 -1
- package/dist/types/discover.js +16 -16
- package/dist/types/discover.js.map +1 -1
- package/dist/types/extract-relationships.d.ts.map +1 -1
- package/dist/types/extract-relationships.js.map +1 -1
- package/dist/types/generate-contracts.js.map +1 -1
- package/dist/types/generate-zod-schemas.js.map +1 -1
- package/dist/types/generate.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/introspect.d.ts.map +1 -1
- package/dist/types/introspect.js +0 -1
- package/dist/types/introspect.js.map +1 -1
- package/dist/types/stripe-schema.d.ts.map +1 -1
- package/dist/types/stripe-schema.js +7 -2
- package/dist/types/stripe-schema.js.map +1 -1
- package/dist/utils/soft-delete.d.ts +45 -0
- package/dist/utils/soft-delete.d.ts.map +1 -0
- package/dist/utils/soft-delete.js +45 -0
- package/dist/utils/soft-delete.js.map +1 -0
- package/dist/validation/cross-db.d.ts +60 -0
- package/dist/validation/cross-db.d.ts.map +1 -0
- package/dist/validation/cross-db.js +146 -0
- package/dist/validation/cross-db.js.map +1 -0
- package/package.json +45 -6
package/README.md
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
# @revealui/db
|
|
2
2
|
|
|
3
|
-
**Status:** 🟡 Active Development | ⚠️ NOT Production Ready
|
|
4
|
-
|
|
5
|
-
See [Project Status](../../docs/PROJECT_STATUS.md) for framework readiness.
|
|
6
|
-
|
|
7
3
|
Database schemas and Drizzle ORM integration for RevealUI.
|
|
8
4
|
|
|
9
5
|
> **Test Coverage:** ~60% (best coverage in project, but still needs improvement)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"audit-store.d.ts","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAMlD,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;GAKG;AACH,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,6CAA6C;IACvC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,4DAA4D;IACtD,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvD,mDAAmD;IAC7C,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoCvD,2DAA2D;IACrD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ9C,0CAA0C;IACpC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAUlE"}
|
package/dist/audit-store.js
CHANGED
|
@@ -114,7 +114,7 @@ function rowToEntry(row) {
|
|
|
114
114
|
taskId: row.taskId ?? undefined,
|
|
115
115
|
sessionId: row.sessionId ?? undefined,
|
|
116
116
|
payload: (row.payload ?? {}),
|
|
117
|
-
policyViolations:
|
|
117
|
+
policyViolations: row.policyViolations ?? [],
|
|
118
118
|
};
|
|
119
119
|
}
|
|
120
120
|
//# sourceMappingURL=audit-store.js.map
|
package/dist/audit-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Database Cleanup Utility
|
|
3
|
+
*
|
|
4
|
+
* Removes orphaned vector data (Supabase) when the owning site has been
|
|
5
|
+
* soft-deleted in NeonDB. PostgreSQL FK cascades cannot span separate
|
|
6
|
+
* database instances, so this utility bridges the gap.
|
|
7
|
+
*
|
|
8
|
+
* Affected Supabase tables:
|
|
9
|
+
* - agentMemories.siteId -> sites.id (NeonDB)
|
|
10
|
+
* - ragDocuments.workspaceId -> sites.id (NeonDB)
|
|
11
|
+
* - ragChunks.workspaceId -> sites.id (NeonDB)
|
|
12
|
+
*
|
|
13
|
+
* Safe to run multiple times (idempotent). Supports dry-run mode and
|
|
14
|
+
* configurable batch sizes via `configureCleanup()`.
|
|
15
|
+
*/
|
|
16
|
+
import type { NeonHttpDatabase } from 'drizzle-orm/neon-http';
|
|
17
|
+
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
18
|
+
export interface CleanupConfig {
|
|
19
|
+
/** Maximum number of IDs to delete per batch (default: 500) */
|
|
20
|
+
batchSize: number;
|
|
21
|
+
/** When true, report what would be deleted without actually deleting (default: false) */
|
|
22
|
+
dryRun: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Override cleanup configuration. Useful for tests (small batch sizes)
|
|
26
|
+
* or preview runs (dry-run mode).
|
|
27
|
+
*/
|
|
28
|
+
export declare function configureCleanup(overrides: Partial<CleanupConfig>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Minimal Drizzle client interface accepted by cleanup functions.
|
|
31
|
+
* Covers both NeonHttpDatabase and NodePgDatabase without importing
|
|
32
|
+
* the full schema generic, keeping the API flexible for callers.
|
|
33
|
+
*/
|
|
34
|
+
type DrizzleClient = NeonHttpDatabase<any> | NodePgDatabase<any>;
|
|
35
|
+
export interface CleanupResult {
|
|
36
|
+
/** Number of agent memories deleted (or that would be deleted in dry-run) */
|
|
37
|
+
agentMemoriesDeleted: number;
|
|
38
|
+
/** Number of RAG documents deleted (or that would be deleted in dry-run) */
|
|
39
|
+
ragDocumentsDeleted: number;
|
|
40
|
+
/** Number of RAG chunks deleted (or that would be deleted in dry-run) */
|
|
41
|
+
ragChunksDeleted: number;
|
|
42
|
+
/** Site IDs whose data was cleaned up */
|
|
43
|
+
deletedSiteIds: string[];
|
|
44
|
+
/** Whether this was a dry-run (no actual deletions) */
|
|
45
|
+
dryRun: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Removes orphaned vector data from Supabase for sites that have been
|
|
49
|
+
* soft-deleted in NeonDB (sites.deletedAt IS NOT NULL).
|
|
50
|
+
*
|
|
51
|
+
* Steps:
|
|
52
|
+
* 1. Query NeonDB for soft-deleted site IDs.
|
|
53
|
+
* 2. Query Supabase for agentMemories / ragDocuments / ragChunks referencing
|
|
54
|
+
* those site IDs.
|
|
55
|
+
* 3. Delete the orphaned records in batches.
|
|
56
|
+
*
|
|
57
|
+
* @param restDb - Drizzle client connected to NeonDB (REST database)
|
|
58
|
+
* @param vectorDb - Drizzle client connected to Supabase (vector database)
|
|
59
|
+
* @returns Summary of what was cleaned up
|
|
60
|
+
*/
|
|
61
|
+
export declare function cleanupOrphanedVectorData(restDb: DrizzleClient, vectorDb: DrizzleClient): Promise<CleanupResult>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=cross-db-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-db-cleanup.d.ts","sourceRoot":"","sources":["../../src/cleanup/cross-db-cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;CACjB;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAExE;AAMD;;;;GAIG;AAEH,KAAK,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Database Cleanup Utility
|
|
3
|
+
*
|
|
4
|
+
* Removes orphaned vector data (Supabase) when the owning site has been
|
|
5
|
+
* soft-deleted in NeonDB. PostgreSQL FK cascades cannot span separate
|
|
6
|
+
* database instances, so this utility bridges the gap.
|
|
7
|
+
*
|
|
8
|
+
* Affected Supabase tables:
|
|
9
|
+
* - agentMemories.siteId -> sites.id (NeonDB)
|
|
10
|
+
* - ragDocuments.workspaceId -> sites.id (NeonDB)
|
|
11
|
+
* - ragChunks.workspaceId -> sites.id (NeonDB)
|
|
12
|
+
*
|
|
13
|
+
* Safe to run multiple times (idempotent). Supports dry-run mode and
|
|
14
|
+
* configurable batch sizes via `configureCleanup()`.
|
|
15
|
+
*/
|
|
16
|
+
import { inArray, isNotNull } from 'drizzle-orm';
|
|
17
|
+
import { agentMemories } from '../schema/agents.js';
|
|
18
|
+
import { ragChunks, ragDocuments } from '../schema/rag.js';
|
|
19
|
+
import { sites } from '../schema/sites.js';
|
|
20
|
+
const DEFAULT_CONFIG = {
|
|
21
|
+
batchSize: 500,
|
|
22
|
+
dryRun: false,
|
|
23
|
+
};
|
|
24
|
+
let config = { ...DEFAULT_CONFIG };
|
|
25
|
+
/**
|
|
26
|
+
* Override cleanup configuration. Useful for tests (small batch sizes)
|
|
27
|
+
* or preview runs (dry-run mode).
|
|
28
|
+
*/
|
|
29
|
+
export function configureCleanup(overrides) {
|
|
30
|
+
config = { ...DEFAULT_CONFIG, ...overrides };
|
|
31
|
+
}
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// Core cleanup function
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Removes orphaned vector data from Supabase for sites that have been
|
|
37
|
+
* soft-deleted in NeonDB (sites.deletedAt IS NOT NULL).
|
|
38
|
+
*
|
|
39
|
+
* Steps:
|
|
40
|
+
* 1. Query NeonDB for soft-deleted site IDs.
|
|
41
|
+
* 2. Query Supabase for agentMemories / ragDocuments / ragChunks referencing
|
|
42
|
+
* those site IDs.
|
|
43
|
+
* 3. Delete the orphaned records in batches.
|
|
44
|
+
*
|
|
45
|
+
* @param restDb - Drizzle client connected to NeonDB (REST database)
|
|
46
|
+
* @param vectorDb - Drizzle client connected to Supabase (vector database)
|
|
47
|
+
* @returns Summary of what was cleaned up
|
|
48
|
+
*/
|
|
49
|
+
export async function cleanupOrphanedVectorData(restDb, vectorDb) {
|
|
50
|
+
// 1. Find all soft-deleted site IDs in NeonDB
|
|
51
|
+
const deletedSiteRows = await restDb
|
|
52
|
+
.select({ id: sites.id })
|
|
53
|
+
.from(sites)
|
|
54
|
+
.where(isNotNull(sites.deletedAt));
|
|
55
|
+
const deletedSiteIds = deletedSiteRows.map((row) => row.id);
|
|
56
|
+
if (deletedSiteIds.length === 0) {
|
|
57
|
+
return {
|
|
58
|
+
agentMemoriesDeleted: 0,
|
|
59
|
+
ragDocumentsDeleted: 0,
|
|
60
|
+
ragChunksDeleted: 0,
|
|
61
|
+
deletedSiteIds: [],
|
|
62
|
+
dryRun: config.dryRun,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// 2. Find orphaned records in Supabase (one query per table)
|
|
66
|
+
const orphanedMemoryIds = await findOrphanedMemoryIds(vectorDb, deletedSiteIds);
|
|
67
|
+
const orphanedDocumentIds = await findOrphanedDocumentIds(vectorDb, deletedSiteIds);
|
|
68
|
+
const orphanedChunkIds = await findOrphanedChunkIds(vectorDb, deletedSiteIds);
|
|
69
|
+
// 3. Delete orphaned records (unless dry-run)
|
|
70
|
+
if (!config.dryRun) {
|
|
71
|
+
await deleteMemoriesById(vectorDb, orphanedMemoryIds);
|
|
72
|
+
// Delete chunks before documents to respect FK ordering (chunks -> documents)
|
|
73
|
+
await deleteChunksById(vectorDb, orphanedChunkIds);
|
|
74
|
+
await deleteDocumentsById(vectorDb, orphanedDocumentIds);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
agentMemoriesDeleted: orphanedMemoryIds.length,
|
|
78
|
+
ragDocumentsDeleted: orphanedDocumentIds.length,
|
|
79
|
+
ragChunksDeleted: orphanedChunkIds.length,
|
|
80
|
+
deletedSiteIds,
|
|
81
|
+
dryRun: config.dryRun,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// Per-table find helpers (type-safe, no generics needed)
|
|
86
|
+
// =============================================================================
|
|
87
|
+
async function findOrphanedMemoryIds(vectorDb, deletedSiteIds) {
|
|
88
|
+
const allIds = [];
|
|
89
|
+
for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
|
|
90
|
+
const batch = deletedSiteIds.slice(i, i + config.batchSize);
|
|
91
|
+
const rows = await vectorDb
|
|
92
|
+
.select({ id: agentMemories.id })
|
|
93
|
+
.from(agentMemories)
|
|
94
|
+
.where(inArray(agentMemories.siteId, batch));
|
|
95
|
+
for (const row of rows) {
|
|
96
|
+
allIds.push(row.id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return allIds;
|
|
100
|
+
}
|
|
101
|
+
async function findOrphanedDocumentIds(vectorDb, deletedSiteIds) {
|
|
102
|
+
const allIds = [];
|
|
103
|
+
for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
|
|
104
|
+
const batch = deletedSiteIds.slice(i, i + config.batchSize);
|
|
105
|
+
const rows = await vectorDb
|
|
106
|
+
.select({ id: ragDocuments.id })
|
|
107
|
+
.from(ragDocuments)
|
|
108
|
+
.where(inArray(ragDocuments.workspaceId, batch));
|
|
109
|
+
for (const row of rows) {
|
|
110
|
+
allIds.push(row.id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return allIds;
|
|
114
|
+
}
|
|
115
|
+
async function findOrphanedChunkIds(vectorDb, deletedSiteIds) {
|
|
116
|
+
const allIds = [];
|
|
117
|
+
for (let i = 0; i < deletedSiteIds.length; i += config.batchSize) {
|
|
118
|
+
const batch = deletedSiteIds.slice(i, i + config.batchSize);
|
|
119
|
+
const rows = await vectorDb
|
|
120
|
+
.select({ id: ragChunks.id })
|
|
121
|
+
.from(ragChunks)
|
|
122
|
+
.where(inArray(ragChunks.workspaceId, batch));
|
|
123
|
+
for (const row of rows) {
|
|
124
|
+
allIds.push(row.id);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return allIds;
|
|
128
|
+
}
|
|
129
|
+
// =============================================================================
|
|
130
|
+
// Per-table delete helpers
|
|
131
|
+
// =============================================================================
|
|
132
|
+
async function deleteMemoriesById(vectorDb, ids) {
|
|
133
|
+
for (let i = 0; i < ids.length; i += config.batchSize) {
|
|
134
|
+
const batch = ids.slice(i, i + config.batchSize);
|
|
135
|
+
await vectorDb.delete(agentMemories).where(inArray(agentMemories.id, batch));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function deleteDocumentsById(vectorDb, ids) {
|
|
139
|
+
for (let i = 0; i < ids.length; i += config.batchSize) {
|
|
140
|
+
const batch = ids.slice(i, i + config.batchSize);
|
|
141
|
+
await vectorDb.delete(ragDocuments).where(inArray(ragDocuments.id, batch));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function deleteChunksById(vectorDb, ids) {
|
|
145
|
+
for (let i = 0; i < ids.length; i += config.batchSize) {
|
|
146
|
+
const batch = ids.slice(i, i + config.batchSize);
|
|
147
|
+
await vectorDb.delete(ragChunks).where(inArray(ragChunks.id, batch));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=cross-db-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-db-cleanup.js","sourceRoot":"","sources":["../../src/cleanup/cross-db-cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Database Cleanup Utilities
|
|
3
|
+
*
|
|
4
|
+
* Bridges the gap between NeonDB (REST) and Supabase (vector) databases
|
|
5
|
+
* by cleaning up orphaned records that FK cascades cannot reach across
|
|
6
|
+
* separate database instances.
|
|
7
|
+
*/
|
|
8
|
+
export { type CleanupConfig, type CleanupResult, cleanupOrphanedVectorData, configureCleanup, } from './cross-db-cleanup.js';
|
|
9
|
+
export { type CleanupTable, cleanupStaleTokens, type StaleTokenCleanupOptions, type StaleTokenCleanupResult, } from './stale-tokens.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cleanup/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,KAAK,YAAY,EACjB,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Database Cleanup Utilities
|
|
3
|
+
*
|
|
4
|
+
* Bridges the gap between NeonDB (REST) and Supabase (vector) databases
|
|
5
|
+
* by cleaning up orphaned records that FK cascades cannot reach across
|
|
6
|
+
* separate database instances.
|
|
7
|
+
*/
|
|
8
|
+
export { cleanupOrphanedVectorData, configureCleanup, } from './cross-db-cleanup.js';
|
|
9
|
+
export { cleanupStaleTokens, } from './stale-tokens.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cleanup/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAGL,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale Token Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Deletes expired/revoked rows from auth tables that accumulate over time.
|
|
5
|
+
* Mirrors the Vercel cron route logic so cleanup can be triggered manually
|
|
6
|
+
* via `revealui db cleanup` when crons are unavailable (e.g. Hobby plan).
|
|
7
|
+
*
|
|
8
|
+
* Tables:
|
|
9
|
+
* - sessions — expiresAt < now OR deletedAt IS NOT NULL
|
|
10
|
+
* - rate_limits — resetAt < now
|
|
11
|
+
* - password_reset_tokens — expiresAt < now
|
|
12
|
+
* - magic_links — expiresAt < now
|
|
13
|
+
* - pages (scheduled) — status = 'scheduled' AND scheduledAt <= now
|
|
14
|
+
*
|
|
15
|
+
* Idempotent — safe to run multiple times.
|
|
16
|
+
*/
|
|
17
|
+
export type CleanupTable = 'sessions' | 'rateLimits' | 'passwordResetTokens' | 'magicLinks' | 'scheduledPages';
|
|
18
|
+
export interface StaleTokenCleanupOptions {
|
|
19
|
+
/** When true, counts rows without deleting (default: false) */
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
/** Limit cleanup to specific tables; defaults to all */
|
|
22
|
+
tables?: CleanupTable[];
|
|
23
|
+
}
|
|
24
|
+
export interface StaleTokenCleanupResult {
|
|
25
|
+
sessions: number;
|
|
26
|
+
rateLimits: number;
|
|
27
|
+
passwordResetTokens: number;
|
|
28
|
+
magicLinks: number;
|
|
29
|
+
scheduledPages: number;
|
|
30
|
+
dryRun: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Cleans up (or counts, in dry-run mode) stale rows from auth tables.
|
|
34
|
+
* Reads POSTGRES_URL / DATABASE_URL from the environment via getClient().
|
|
35
|
+
*/
|
|
36
|
+
export declare function cleanupStaleTokens(options?: StaleTokenCleanupOptions): Promise<StaleTokenCleanupResult>;
|
|
37
|
+
//# sourceMappingURL=stale-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-tokens.d.ts","sourceRoot":"","sources":["../../src/cleanup/stale-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,YAAY,GACZ,qBAAqB,GACrB,YAAY,GACZ,gBAAgB,CAAC;AAErB,MAAM,WAAW,wBAAwB;IACvC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAUD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,CAmFlC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale Token Cleanup
|
|
3
|
+
*
|
|
4
|
+
* Deletes expired/revoked rows from auth tables that accumulate over time.
|
|
5
|
+
* Mirrors the Vercel cron route logic so cleanup can be triggered manually
|
|
6
|
+
* via `revealui db cleanup` when crons are unavailable (e.g. Hobby plan).
|
|
7
|
+
*
|
|
8
|
+
* Tables:
|
|
9
|
+
* - sessions — expiresAt < now OR deletedAt IS NOT NULL
|
|
10
|
+
* - rate_limits — resetAt < now
|
|
11
|
+
* - password_reset_tokens — expiresAt < now
|
|
12
|
+
* - magic_links — expiresAt < now
|
|
13
|
+
* - pages (scheduled) — status = 'scheduled' AND scheduledAt <= now
|
|
14
|
+
*
|
|
15
|
+
* Idempotent — safe to run multiple times.
|
|
16
|
+
*/
|
|
17
|
+
import { and, eq, isNotNull, lt, lte, or } from 'drizzle-orm';
|
|
18
|
+
import { getClient } from '../client/index.js';
|
|
19
|
+
import { magicLinks } from '../schema/magic-links.js';
|
|
20
|
+
import { pages } from '../schema/pages.js';
|
|
21
|
+
import { passwordResetTokens } from '../schema/password-reset-tokens.js';
|
|
22
|
+
import { rateLimits } from '../schema/rate-limits.js';
|
|
23
|
+
import { sessions } from '../schema/users.js';
|
|
24
|
+
const ALL_TABLES = [
|
|
25
|
+
'sessions',
|
|
26
|
+
'rateLimits',
|
|
27
|
+
'passwordResetTokens',
|
|
28
|
+
'magicLinks',
|
|
29
|
+
'scheduledPages',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Cleans up (or counts, in dry-run mode) stale rows from auth tables.
|
|
33
|
+
* Reads POSTGRES_URL / DATABASE_URL from the environment via getClient().
|
|
34
|
+
*/
|
|
35
|
+
export async function cleanupStaleTokens(options = {}) {
|
|
36
|
+
const { dryRun = false, tables = ALL_TABLES } = options;
|
|
37
|
+
const db = getClient();
|
|
38
|
+
const now = new Date();
|
|
39
|
+
const result = {
|
|
40
|
+
sessions: 0,
|
|
41
|
+
rateLimits: 0,
|
|
42
|
+
passwordResetTokens: 0,
|
|
43
|
+
magicLinks: 0,
|
|
44
|
+
scheduledPages: 0,
|
|
45
|
+
dryRun,
|
|
46
|
+
};
|
|
47
|
+
if (tables.includes('sessions')) {
|
|
48
|
+
const where = or(lt(sessions.expiresAt, now), isNotNull(sessions.deletedAt));
|
|
49
|
+
if (dryRun) {
|
|
50
|
+
const rows = await db.select({ id: sessions.id }).from(sessions).where(where);
|
|
51
|
+
result.sessions = rows.length;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const deleted = await db.delete(sessions).where(where).returning();
|
|
55
|
+
result.sessions = deleted.length;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (tables.includes('rateLimits')) {
|
|
59
|
+
const where = lt(rateLimits.resetAt, now);
|
|
60
|
+
if (dryRun) {
|
|
61
|
+
const rows = await db.select({ key: rateLimits.key }).from(rateLimits).where(where);
|
|
62
|
+
result.rateLimits = rows.length;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const deleted = await db.delete(rateLimits).where(where).returning();
|
|
66
|
+
result.rateLimits = deleted.length;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (tables.includes('passwordResetTokens')) {
|
|
70
|
+
const where = lt(passwordResetTokens.expiresAt, now);
|
|
71
|
+
if (dryRun) {
|
|
72
|
+
const rows = await db
|
|
73
|
+
.select({ id: passwordResetTokens.id })
|
|
74
|
+
.from(passwordResetTokens)
|
|
75
|
+
.where(where);
|
|
76
|
+
result.passwordResetTokens = rows.length;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const deleted = await db.delete(passwordResetTokens).where(where).returning();
|
|
80
|
+
result.passwordResetTokens = deleted.length;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (tables.includes('magicLinks')) {
|
|
84
|
+
const where = lt(magicLinks.expiresAt, now);
|
|
85
|
+
if (dryRun) {
|
|
86
|
+
const rows = await db.select({ id: magicLinks.id }).from(magicLinks).where(where);
|
|
87
|
+
result.magicLinks = rows.length;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const deleted = await db.delete(magicLinks).where(where).returning();
|
|
91
|
+
result.magicLinks = deleted.length;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (tables.includes('scheduledPages')) {
|
|
95
|
+
const where = and(eq(pages.status, 'scheduled'), isNotNull(pages.scheduledAt), lte(pages.scheduledAt, now));
|
|
96
|
+
if (dryRun) {
|
|
97
|
+
const rows = await db.select({ id: pages.id }).from(pages).where(where);
|
|
98
|
+
result.scheduledPages = rows.length;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const due = await db.select({ id: pages.id }).from(pages).where(where);
|
|
102
|
+
for (const page of due) {
|
|
103
|
+
await db
|
|
104
|
+
.update(pages)
|
|
105
|
+
.set({ status: 'published', publishedAt: now, updatedAt: now })
|
|
106
|
+
.where(eq(pages.id, page.id));
|
|
107
|
+
}
|
|
108
|
+
result.scheduledPages = due.length;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=stale-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-tokens.js","sourceRoot":"","sources":["../../src/cleanup/stale-tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -207,6 +207,19 @@ export declare function closeAllPools(): Promise<void>;
|
|
|
207
207
|
* await withTransaction(neonDb, async (tx) => { ... }) // Error!
|
|
208
208
|
* ```
|
|
209
209
|
*/
|
|
210
|
+
/**
|
|
211
|
+
* Asserts that a database type supports transactions. Call at app startup to fail fast.
|
|
212
|
+
*
|
|
213
|
+
* @param dbType - Database type to check ('rest' or 'vector')
|
|
214
|
+
* @throws {Error} If the database driver does not support transactions
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* // At app startup
|
|
219
|
+
* requiresTransactions('rest') // throws if REST DB is Neon HTTP
|
|
220
|
+
* ```
|
|
221
|
+
*/
|
|
222
|
+
export declare function requiresTransactions(dbType?: DatabaseType): void;
|
|
210
223
|
export declare function withTransaction<T>(db: Database, fn: (tx: Database) => Promise<T>): Promise<T>;
|
|
211
224
|
export { schema };
|
|
212
225
|
export type { AgentAction, AgentContext, AgentMemory, Conversation, CRDTOperation, GlobalFooter, GlobalHeader, GlobalSettings, Media, NewAgentAction, NewAgentContext, NewAgentMemory, NewConversation, NewCRDTOperation, NewGlobalFooter, NewGlobalHeader, NewGlobalSettings, NewMedia, NewNodeIdMapping, NewPage, NewPageRevision, NewPost, NewSession, NewSite, NewSiteCollaborator, NewUser, NodeIdMapping, Page, PageRevision, Post, Session, Site, SiteCollaborator, User, } from '../schema/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -31,6 +31,11 @@ import * as schema from '../schema/index.js'; // Full schema for backward compat
|
|
|
31
31
|
import * as restSchema from '../schema/rest.js';
|
|
32
32
|
import * as vectorSchema from '../schema/vector.js';
|
|
33
33
|
// =============================================================================
|
|
34
|
+
// Transaction Support Tracking
|
|
35
|
+
// =============================================================================
|
|
36
|
+
let restSupportsTransactions = false;
|
|
37
|
+
let vectorSupportsTransactions = false;
|
|
38
|
+
// =============================================================================
|
|
34
39
|
// Client Creation
|
|
35
40
|
// =============================================================================
|
|
36
41
|
/**
|
|
@@ -103,11 +108,13 @@ export function createClient(config, dbSchema = schema) {
|
|
|
103
108
|
if (isSupabase) {
|
|
104
109
|
// Use pg for Supabase connections
|
|
105
110
|
// This avoids the Neon driver's hostname transformation bug
|
|
111
|
+
const poolMax = parseInt(process.env.DB_POOL_MAX || '10', 10);
|
|
112
|
+
const poolIdleTimeout = parseInt(process.env.DB_POOL_IDLE_TIMEOUT || '30000', 10);
|
|
106
113
|
const pool = new Pool({
|
|
107
114
|
connectionString: config.connectionString,
|
|
108
115
|
ssl: getSSLConfig(config.connectionString), // Auto-detect SSL from connection string
|
|
109
|
-
max:
|
|
110
|
-
idleTimeoutMillis:
|
|
116
|
+
max: poolMax,
|
|
117
|
+
idleTimeoutMillis: poolIdleTimeout,
|
|
111
118
|
connectionTimeoutMillis: 10_000, // 10 seconds
|
|
112
119
|
});
|
|
113
120
|
// Track pool and register cleanup
|
|
@@ -179,7 +186,6 @@ function registerPoolCleanup() {
|
|
|
179
186
|
* ```
|
|
180
187
|
*/
|
|
181
188
|
// Note: DatabaseType | string union is intentional for backward compatibility (allows both type strings and connection strings)
|
|
182
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
183
189
|
export function getClient(typeOrConnectionString) {
|
|
184
190
|
// Legacy API: If first argument is a string and not 'rest' or 'vector', treat as connection string
|
|
185
191
|
if (typeOrConnectionString && typeof typeOrConnectionString === 'string') {
|
|
@@ -212,6 +218,7 @@ function getClientByType(type) {
|
|
|
212
218
|
'Set DATABASE_URL to your Supabase connection string.');
|
|
213
219
|
}
|
|
214
220
|
vectorClient = createClient({ connectionString: url }, vectorSchema);
|
|
221
|
+
vectorSupportsTransactions = isSupabaseConnection(url);
|
|
215
222
|
}
|
|
216
223
|
return vectorClient;
|
|
217
224
|
}
|
|
@@ -236,6 +243,7 @@ function getClientByType(type) {
|
|
|
236
243
|
'Either use @revealui/config, or set POSTGRES_URL (or DATABASE_URL) environment variable.');
|
|
237
244
|
}
|
|
238
245
|
restClient = createClient({ connectionString: url }, restSchema);
|
|
246
|
+
restSupportsTransactions = isSupabaseConnection(url);
|
|
239
247
|
}
|
|
240
248
|
return restClient;
|
|
241
249
|
}
|
|
@@ -276,6 +284,8 @@ export function getVectorClient() {
|
|
|
276
284
|
export function resetClient() {
|
|
277
285
|
restClient = null;
|
|
278
286
|
vectorClient = null;
|
|
287
|
+
restSupportsTransactions = false;
|
|
288
|
+
vectorSupportsTransactions = false;
|
|
279
289
|
}
|
|
280
290
|
// =============================================================================
|
|
281
291
|
// Pool Monitoring and Cleanup
|
|
@@ -375,15 +385,44 @@ export async function closeAllPools() {
|
|
|
375
385
|
* await withTransaction(neonDb, async (tx) => { ... }) // Error!
|
|
376
386
|
* ```
|
|
377
387
|
*/
|
|
388
|
+
/**
|
|
389
|
+
* Asserts that a database type supports transactions. Call at app startup to fail fast.
|
|
390
|
+
*
|
|
391
|
+
* @param dbType - Database type to check ('rest' or 'vector')
|
|
392
|
+
* @throws {Error} If the database driver does not support transactions
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* ```typescript
|
|
396
|
+
* // At app startup
|
|
397
|
+
* requiresTransactions('rest') // throws if REST DB is Neon HTTP
|
|
398
|
+
* ```
|
|
399
|
+
*/
|
|
400
|
+
export function requiresTransactions(dbType = 'rest') {
|
|
401
|
+
// Force client creation so we know the driver type
|
|
402
|
+
getClient(dbType);
|
|
403
|
+
const supports = dbType === 'vector' ? vectorSupportsTransactions : restSupportsTransactions;
|
|
404
|
+
if (!supports) {
|
|
405
|
+
throw new Error(`Transaction support required but not available for '${dbType}' database. ` +
|
|
406
|
+
'The Neon HTTP driver does not support transactions. ' +
|
|
407
|
+
'Switch to Supabase pooler or pg driver for transaction support.');
|
|
408
|
+
}
|
|
409
|
+
}
|
|
378
410
|
export async function withTransaction(db, fn) {
|
|
379
|
-
//
|
|
380
|
-
|
|
411
|
+
// Early check: fail fast with clear message based on tracked driver type
|
|
412
|
+
if (db === restClient && !restSupportsTransactions) {
|
|
413
|
+
throw new Error('Transaction not supported: REST database is using Neon HTTP driver. ' +
|
|
414
|
+
'Switch to Supabase pooler or pg driver for transaction support.');
|
|
415
|
+
}
|
|
416
|
+
if (db === vectorClient && !vectorSupportsTransactions) {
|
|
417
|
+
throw new Error('Transaction not supported: Vector database is using Neon HTTP driver. ' +
|
|
418
|
+
'Switch to Supabase pooler or pg driver for transaction support.');
|
|
419
|
+
}
|
|
420
|
+
// Fallback: Check if this is a pg Pool-based client (supports transactions)
|
|
381
421
|
const hasPgTransaction = 'transaction' in db && typeof db.transaction === 'function';
|
|
382
422
|
if (!hasPgTransaction) {
|
|
383
423
|
throw new Error('Transaction not supported: Database client is using Neon HTTP driver which does not support transactions. ' +
|
|
384
424
|
'To use transactions, configure your database with Supabase or localhost connection string. ' +
|
|
385
|
-
'Neon HTTP driver uses stateless requests and cannot maintain transaction state.
|
|
386
|
-
'See docs/PRODUCTION_BLOCKERS.md for migration guide.');
|
|
425
|
+
'Neon HTTP driver uses stateless requests and cannot maintain transaction state.');
|
|
387
426
|
}
|
|
388
427
|
// Use Drizzle's built-in transaction API
|
|
389
428
|
// This automatically handles BEGIN/COMMIT/ROLLBACK
|