rivetkit 0.0.0-sqlite-uds.4e59a38 → 0.0.0-sqlite-uds.2015d80

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 (67) hide show
  1. package/dist/browser/client.js +1 -1
  2. package/dist/browser/client.js.map +1 -1
  3. package/dist/browser/inspector/client.js +1 -1
  4. package/dist/browser/inspector/client.js.map +1 -1
  5. package/dist/tsup/agent-os/index.cjs +15 -1
  6. package/dist/tsup/agent-os/index.cjs.map +1 -1
  7. package/dist/tsup/agent-os/index.js +15 -1
  8. package/dist/tsup/agent-os/index.js.map +1 -1
  9. package/dist/tsup/{chunk-KTNBYGRU.js → chunk-5NJB7EE2.js} +2 -2
  10. package/dist/tsup/{chunk-PRXTIERO.cjs → chunk-5RC3H5MH.cjs} +2 -2
  11. package/dist/tsup/{chunk-PRXTIERO.cjs.map → chunk-5RC3H5MH.cjs.map} +1 -1
  12. package/dist/tsup/{chunk-62LSMTP2.cjs → chunk-CKKFRK2T.cjs} +3 -3
  13. package/dist/tsup/{chunk-62LSMTP2.cjs.map → chunk-CKKFRK2T.cjs.map} +1 -1
  14. package/dist/tsup/{chunk-GMN45CQ6.cjs → chunk-COPUTOJF.cjs} +7 -7
  15. package/dist/tsup/{chunk-GMN45CQ6.cjs.map → chunk-COPUTOJF.cjs.map} +1 -1
  16. package/dist/tsup/{chunk-IB73AMGJ.js → chunk-D5TT3ZDY.js} +2 -2
  17. package/dist/tsup/{chunk-WRZEVVLL.js → chunk-DNGOGOHS.js} +3 -3
  18. package/dist/tsup/{chunk-GEYQLGXC.cjs → chunk-HV4FLJQR.cjs} +139 -139
  19. package/dist/tsup/{chunk-GEYQLGXC.cjs.map → chunk-HV4FLJQR.cjs.map} +1 -1
  20. package/dist/tsup/{chunk-I336PMWT.cjs → chunk-IVUL2OMZ.cjs} +4 -4
  21. package/dist/tsup/{chunk-I336PMWT.cjs.map → chunk-IVUL2OMZ.cjs.map} +1 -1
  22. package/dist/tsup/{chunk-XAIMHUPG.js → chunk-MUPT34DY.js} +4 -4
  23. package/dist/tsup/{chunk-ITWJ6Y7G.js → chunk-VBASTLLY.js} +2 -2
  24. package/dist/tsup/{chunk-7IVUT2JT.js → chunk-VL3UZ6XX.js} +4 -4
  25. package/dist/tsup/{chunk-OUDV3ITX.cjs → chunk-VP3RWGXE.cjs} +5 -5
  26. package/dist/tsup/{chunk-OUDV3ITX.cjs.map → chunk-VP3RWGXE.cjs.map} +1 -1
  27. package/dist/tsup/{chunk-XZ62SWSC.js → chunk-XPXLCL5I.js} +2 -2
  28. package/dist/tsup/{chunk-XZ62SWSC.js.map → chunk-XPXLCL5I.js.map} +1 -1
  29. package/dist/tsup/{chunk-3GC3EP6D.cjs → chunk-YPIVGZVX.cjs} +10 -10
  30. package/dist/tsup/{chunk-3GC3EP6D.cjs.map → chunk-YPIVGZVX.cjs.map} +1 -1
  31. package/dist/tsup/client/mod.cjs +6 -6
  32. package/dist/tsup/client/mod.js +5 -5
  33. package/dist/tsup/common/log.cjs +2 -2
  34. package/dist/tsup/common/log.js +1 -1
  35. package/dist/tsup/common/websocket.cjs +3 -3
  36. package/dist/tsup/common/websocket.js +2 -2
  37. package/dist/tsup/db/drizzle.cjs +14 -0
  38. package/dist/tsup/db/drizzle.cjs.map +1 -1
  39. package/dist/tsup/db/drizzle.d.cts +3 -1
  40. package/dist/tsup/db/drizzle.d.ts +3 -1
  41. package/dist/tsup/db/drizzle.js +14 -0
  42. package/dist/tsup/db/drizzle.js.map +1 -1
  43. package/dist/tsup/db/mod.cjs +14 -0
  44. package/dist/tsup/db/mod.cjs.map +1 -1
  45. package/dist/tsup/db/mod.js +14 -0
  46. package/dist/tsup/db/mod.js.map +1 -1
  47. package/dist/tsup/inspector/mod.cjs +5 -5
  48. package/dist/tsup/inspector/mod.js +4 -4
  49. package/dist/tsup/mod.cjs +62 -62
  50. package/dist/tsup/mod.js +5 -5
  51. package/dist/tsup/test/mod.cjs +9 -9
  52. package/dist/tsup/test/mod.js +5 -5
  53. package/dist/tsup/utils.cjs +2 -2
  54. package/dist/tsup/utils.js +1 -1
  55. package/dist/tsup/workflow/mod.cjs +7 -7
  56. package/dist/tsup/workflow/mod.js +4 -4
  57. package/package.json +8 -8
  58. package/src/common/bare/generated/actor-uds-protocol/v1.ts +802 -0
  59. package/src/common/database/mod.test.ts +54 -0
  60. package/src/common/database/mod.ts +14 -0
  61. package/src/db/drizzle.ts +24 -2
  62. /package/dist/tsup/{chunk-KTNBYGRU.js.map → chunk-5NJB7EE2.js.map} +0 -0
  63. /package/dist/tsup/{chunk-IB73AMGJ.js.map → chunk-D5TT3ZDY.js.map} +0 -0
  64. /package/dist/tsup/{chunk-WRZEVVLL.js.map → chunk-DNGOGOHS.js.map} +0 -0
  65. /package/dist/tsup/{chunk-XAIMHUPG.js.map → chunk-MUPT34DY.js.map} +0 -0
  66. /package/dist/tsup/{chunk-ITWJ6Y7G.js.map → chunk-VBASTLLY.js.map} +0 -0
  67. /package/dist/tsup/{chunk-7IVUT2JT.js.map → chunk-VL3UZ6XX.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/drizzle.cjs","../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"names":["db"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/drizzle.cjs","sourcesContent":[null,"import {\n\tdrizzle,\n\ttype RemoteCallback,\n\ttype SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport type {\n\tDatabaseProvider,\n\tDatabaseProviderContext,\n\tRawAccess,\n\tSqliteDatabase,\n} from \"@/common/database/config\";\nimport { toSqliteBindings } from \"@/common/database/shared\";\nimport { sha256Hex } from \"@/utils/crypto\";\n\nexport type { SQLiteTable } from \"drizzle-orm/sqlite-core\";\nexport {\n\talias,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tinteger,\n\tprimaryKey,\n\tsqliteTable,\n\tsqliteTableCreator,\n\ttext,\n\tunique,\n\tuniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\ntype DrizzleSchema = Record<string, unknown>;\ntype DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<\n\tSqliteRemoteDatabase<TSchema>,\n\t\"transaction\"\n> &\n\tRawAccess;\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\ninterface DrizzleMigrationJournalEntry {\n\tidx: number;\n\ttag: string;\n\twhen: number;\n\tbreakpoints?: boolean;\n}\n\ninterface DrizzleMigrations {\n\tjournal: unknown;\n\tmigrations: Record<string, string>;\n}\n\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n}\n\ninterface DrizzleKitConfig {\n\tout?: string;\n\tschema?: string;\n\tdialect?: \"sqlite\";\n\t[key: string]: unknown;\n}\n\nexport function defineConfig<TConfig extends DrizzleKitConfig>(\n\tconfig: TConfig,\n): TConfig & { dialect: \"sqlite\" } {\n\treturn {\n\t\tdialect: \"sqlite\",\n\t\t...config,\n\t};\n}\n\nexport function db<TSchema extends DrizzleSchema = Record<string, never>>({\n\tschema,\n\tmigrations,\n\tonMigrate,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): DrizzleDatabase<TSchema> => {\n\t\t\t\tconst runSql = async (\n\t\t\t\t\tquery: string,\n\t\t\t\t\tparams: unknown[],\n\t\t\t\t\tmethod: \"run\" | \"all\" | \"values\" | \"get\",\n\t\t\t\t) => {\n\t\t\t\t\tensureOpen();\n\n\t\t\t\t\tconst start = performance.now();\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { rows } = await nativeDb.execute(\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\ttoSqliteBindings(params),\n\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (method === \"run\") {\n\t\t\t\t\t\t\treturn { rows: [] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (method === \"get\") {\n\t\t\t\t\t\t\treturn { rows: rows[0] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { rows };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\t\t\t\t\tkvWrites:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst callback: RemoteCallback = async (\n\t\t\t\t\tquery,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t) => {\n\t\t\t\t\treturn await runSql(query, params, method);\n\t\t\t\t};\n\n\t\t\t\tconst drizzleDb = drizzle(callback, {\n\t\t\t\t\tschema,\n\t\t\t\t}) as unknown as DrizzleDatabase<TSchema>;\n\t\t\t\tdrizzleDb.execute = async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tensureOpen,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tlease,\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.transaction = async <T>(\n\t\t\t\t\ttransactionCallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createDrizzleClient(transactionLease);\n\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\"BEGIN\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await transactionCallback(tx);\n\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\"COMMIT\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after lease poisoning.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdrizzleDb.__withSqliteLease = async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tleaseCallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await leaseCallback(\n\t\t\t\t\t\tcreateDrizzleClient(internalLease),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.close = async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait nativeDb.close();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn drizzleDb;\n\t\t\t};\n\n\t\t\treturn createDrizzleClient();\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (!migrations && !onMigrate) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait withMigrationSavepoint(client, async (leased) => {\n\t\t\t\tif (migrations) {\n\t\t\t\t\tawait runMigrations(leased, migrations);\n\t\t\t\t}\n\t\t\t\tif (onMigrate) {\n\t\t\t\t\tawait onMigrate(leased);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n\nasync function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(\n\tclient: DrizzleDatabase<TSchema>,\n\tcallback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leasedAccess) => {\n\t\t\tconst leased = leasedAccess as DrizzleDatabase<TSchema>;\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n\nasync function runMigrations<TSchema extends DrizzleSchema>(\n\tdb: DrizzleDatabase<TSchema>,\n\tmigrations: DrizzleMigrations,\n) {\n\tconst journal = parseMigrationJournal(migrations.journal);\n\n\tawait db.execute(`\n\t\tCREATE TABLE IF NOT EXISTS __drizzle_migrations (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\thash TEXT NOT NULL,\n\t\t\tcreated_at NUMERIC\n\t\t)\n\t`);\n\n\tconst rows = await db.execute<{ created_at: number }>(\n\t\t\"SELECT created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1\",\n\t);\n\tconst lastMigration = rows[0]?.created_at ?? 0;\n\n\tfor (const entry of journal.entries) {\n\t\tif (lastMigration >= entry.when) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst key = `m${entry.idx.toString().padStart(4, \"0\")}`;\n\t\tconst migration = migrations.migrations[key];\n\t\tif (migration === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`missing Drizzle migration \"${key}\" for journal entry \"${entry.tag}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst statements = migration\n\t\t\t.split(\"--> statement-breakpoint\")\n\t\t\t.map((statement) => statement.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const statement of statements) {\n\t\t\tawait db.execute(statement);\n\t\t}\n\n\t\tawait db.execute(\n\t\t\t\"INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)\",\n\t\t\tawait sha256Hex(migration),\n\t\t\tentry.when,\n\t\t);\n\t}\n}\n\nfunction parseMigrationJournal(journal: unknown): {\n\tentries: DrizzleMigrationJournalEntry[];\n} {\n\tif (\n\t\t!journal ||\n\t\ttypeof journal !== \"object\" ||\n\t\t!(\"entries\" in journal) ||\n\t\t!Array.isArray(journal.entries)\n\t) {\n\t\tthrow new Error(\"invalid Drizzle migration journal\");\n\t}\n\n\treturn journal as { entries: DrizzleMigrationJournalEntry[] };\n}\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function executeRaw<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tensureOpen();\n\n\tconst start = performance.now();\n\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\ttry {\n\t\tif (args.length > 0) {\n\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\n\t\t\t\tlease,\n\t\t\t);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!hasMultipleStatements(query)) {\n\t\t\tconst { rows, columns } = await db.execute(query, undefined, lease);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tawait db.exec(\n\t\t\tquery,\n\t\t\t(row, columns) => {\n\t\t\t\tif (!columnNames) {\n\t\t\t\t\tcolumnNames = columns;\n\t\t\t\t}\n\t\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t\t},\n\t\t\tlease,\n\t\t);\n\t\treturn results as TRow[];\n\t} finally {\n\t\tconst durationMs = performance.now() - start;\n\t\tctx.metrics?.trackSql(query, durationMs);\n\t\tif (ctx.metrics) {\n\t\t\tctx.log?.debug({\n\t\t\t\tmsg: \"sql query\",\n\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\tdurationMs,\n\t\t\t\tkvReads: ctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\tkvWrites: ctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t});\n\t\t}\n\t}\n}\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n\tif (!globalThis.crypto?.subtle) {\n\t\tthrow new Error(\"Web Crypto API is required to compute SHA-256 hashes\");\n\t}\n\n\tconst digest = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tnew TextEncoder().encode(value),\n\t);\n\treturn Array.from(new Uint8Array(digest), (byte) =>\n\t\tbyte.toString(16).padStart(2, \"0\"),\n\t).join(\"\");\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/drizzle.cjs","../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"names":["db"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/drizzle.cjs","sourcesContent":[null,"import {\n\tdrizzle,\n\ttype RemoteCallback,\n\ttype SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport type {\n\tDatabaseProvider,\n\tDatabaseProviderContext,\n\tRawAccess,\n\tSqliteDatabase,\n} from \"@/common/database/config\";\nimport { toSqliteBindings } from \"@/common/database/shared\";\nimport { sha256Hex } from \"@/utils/crypto\";\n\nexport type { SQLiteTable } from \"drizzle-orm/sqlite-core\";\nexport {\n\talias,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tinteger,\n\tprimaryKey,\n\tsqliteTable,\n\tsqliteTableCreator,\n\ttext,\n\tunique,\n\tuniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\ntype DrizzleSchema = Record<string, unknown>;\ntype DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<\n\tSqliteRemoteDatabase<TSchema>,\n\t\"transaction\"\n> &\n\tOmit<RawAccess, \"transaction\"> & {\n\t\ttransaction: <T>(\n\t\t\tcallback: (\n\t\t\t\ttx: DrizzleDatabase<TSchema>,\n\t\t\t) => Promise<T> | T,\n\t\t) => Promise<T>;\n\t};\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\ninterface DrizzleMigrationJournalEntry {\n\tidx: number;\n\ttag: string;\n\twhen: number;\n\tbreakpoints?: boolean;\n}\n\ninterface DrizzleMigrations {\n\tjournal: unknown;\n\tmigrations: Record<string, string>;\n}\n\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n}\n\ninterface DrizzleKitConfig {\n\tout?: string;\n\tschema?: string;\n\tdialect?: \"sqlite\";\n\t[key: string]: unknown;\n}\n\nexport function defineConfig<TConfig extends DrizzleKitConfig>(\n\tconfig: TConfig,\n): TConfig & { dialect: \"sqlite\" } {\n\treturn {\n\t\tdialect: \"sqlite\",\n\t\t...config,\n\t};\n}\n\nexport function db<TSchema extends DrizzleSchema = Record<string, never>>({\n\tschema,\n\tmigrations,\n\tonMigrate,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet transactionActive = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): DrizzleDatabase<TSchema> => {\n\t\t\t\tconst runSql = async (\n\t\t\t\t\tquery: string,\n\t\t\t\t\tparams: unknown[],\n\t\t\t\t\tmethod: \"run\" | \"all\" | \"values\" | \"get\",\n\t\t\t\t) => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (!lease && transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst start = performance.now();\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { rows } = await nativeDb.execute(\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\ttoSqliteBindings(params),\n\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (method === \"run\") {\n\t\t\t\t\t\t\treturn { rows: [] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (method === \"get\") {\n\t\t\t\t\t\t\treturn { rows: rows[0] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { rows };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\t\t\t\t\tkvWrites:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst callback: RemoteCallback = async (\n\t\t\t\t\tquery,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t) => {\n\t\t\t\t\treturn await runSql(query, params, method);\n\t\t\t\t};\n\n\t\t\t\tconst drizzleDb = drizzle(callback, {\n\t\t\t\t\tschema,\n\t\t\t\t}) as unknown as DrizzleDatabase<TSchema>;\n\t\t\t\tdrizzleDb.execute = async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tensureOpen,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tlease,\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.transaction = async <T>(\n\t\t\t\t\ttransactionCallback: (\n\t\t\t\t\t\ttx: DrizzleDatabase<TSchema>,\n\t\t\t\t\t) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tif (lease || transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested or concurrent db.transaction() calls are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createDrizzleClient(transactionLease);\n\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\"BEGIN\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t);\n\t\t\t\t\ttransactionActive = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await transactionCallback(tx);\n\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\"COMMIT\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after lease poisoning.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttransactionActive = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdrizzleDb.__withSqliteLease = async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tleaseCallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await leaseCallback(\n\t\t\t\t\t\tcreateDrizzleClient(internalLease),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.close = async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait nativeDb.close();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn drizzleDb;\n\t\t\t};\n\n\t\t\treturn createDrizzleClient();\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (!migrations && !onMigrate) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait withMigrationSavepoint(client, async (leased) => {\n\t\t\t\tif (migrations) {\n\t\t\t\t\tawait runMigrations(leased, migrations);\n\t\t\t\t}\n\t\t\t\tif (onMigrate) {\n\t\t\t\t\tawait onMigrate(leased);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n\nasync function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(\n\tclient: DrizzleDatabase<TSchema>,\n\tcallback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leasedAccess) => {\n\t\t\tconst leased = leasedAccess as DrizzleDatabase<TSchema>;\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n\nasync function runMigrations<TSchema extends DrizzleSchema>(\n\tdb: DrizzleDatabase<TSchema>,\n\tmigrations: DrizzleMigrations,\n) {\n\tconst journal = parseMigrationJournal(migrations.journal);\n\n\tawait db.execute(`\n\t\tCREATE TABLE IF NOT EXISTS __drizzle_migrations (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\thash TEXT NOT NULL,\n\t\t\tcreated_at NUMERIC\n\t\t)\n\t`);\n\n\tconst rows = await db.execute<{ created_at: number }>(\n\t\t\"SELECT created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1\",\n\t);\n\tconst lastMigration = rows[0]?.created_at ?? 0;\n\n\tfor (const entry of journal.entries) {\n\t\tif (lastMigration >= entry.when) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst key = `m${entry.idx.toString().padStart(4, \"0\")}`;\n\t\tconst migration = migrations.migrations[key];\n\t\tif (migration === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`missing Drizzle migration \"${key}\" for journal entry \"${entry.tag}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst statements = migration\n\t\t\t.split(\"--> statement-breakpoint\")\n\t\t\t.map((statement) => statement.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const statement of statements) {\n\t\t\tawait db.execute(statement);\n\t\t}\n\n\t\tawait db.execute(\n\t\t\t\"INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)\",\n\t\t\tawait sha256Hex(migration),\n\t\t\tentry.when,\n\t\t);\n\t}\n}\n\nfunction parseMigrationJournal(journal: unknown): {\n\tentries: DrizzleMigrationJournalEntry[];\n} {\n\tif (\n\t\t!journal ||\n\t\ttypeof journal !== \"object\" ||\n\t\t!(\"entries\" in journal) ||\n\t\t!Array.isArray(journal.entries)\n\t) {\n\t\tthrow new Error(\"invalid Drizzle migration journal\");\n\t}\n\n\treturn journal as { entries: DrizzleMigrationJournalEntry[] };\n}\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function executeRaw<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tensureOpen();\n\n\tconst start = performance.now();\n\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\ttry {\n\t\tif (args.length > 0) {\n\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\n\t\t\t\tlease,\n\t\t\t);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!hasMultipleStatements(query)) {\n\t\t\tconst { rows, columns } = await db.execute(query, undefined, lease);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tawait db.exec(\n\t\t\tquery,\n\t\t\t(row, columns) => {\n\t\t\t\tif (!columnNames) {\n\t\t\t\t\tcolumnNames = columns;\n\t\t\t\t}\n\t\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t\t},\n\t\t\tlease,\n\t\t);\n\t\treturn results as TRow[];\n\t} finally {\n\t\tconst durationMs = performance.now() - start;\n\t\tctx.metrics?.trackSql(query, durationMs);\n\t\tif (ctx.metrics) {\n\t\t\tctx.log?.debug({\n\t\t\t\tmsg: \"sql query\",\n\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\tdurationMs,\n\t\t\t\tkvReads: ctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\tkvWrites: ctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t});\n\t\t}\n\t}\n}\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n\tif (!globalThis.crypto?.subtle) {\n\t\tthrow new Error(\"Web Crypto API is required to compute SHA-256 hashes\");\n\t}\n\n\tconst digest = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tnew TextEncoder().encode(value),\n\t);\n\treturn Array.from(new Uint8Array(digest), (byte) =>\n\t\tbyte.toString(16).padStart(2, \"0\"),\n\t).join(\"\");\n}\n"]}
@@ -3,7 +3,9 @@ import { R as RawAccess, D as DatabaseProvider } from '../config-DLOxy81E.cjs';
3
3
  export { SQLiteTable, alias, check, foreignKey, index, integer, primaryKey, sqliteTable, sqliteTableCreator, text, unique, uniqueIndex } from 'drizzle-orm/sqlite-core';
4
4
 
5
5
  type DrizzleSchema = Record<string, unknown>;
6
- type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & RawAccess;
6
+ type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<RawAccess, "transaction"> & {
7
+ transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T) => Promise<T>;
8
+ };
7
9
  interface DrizzleMigrations {
8
10
  journal: unknown;
9
11
  migrations: Record<string, string>;
@@ -3,7 +3,9 @@ import { R as RawAccess, D as DatabaseProvider } from '../config-DLOxy81E.js';
3
3
  export { SQLiteTable, alias, check, foreignKey, index, integer, primaryKey, sqliteTable, sqliteTableCreator, text, unique, uniqueIndex } from 'drizzle-orm/sqlite-core';
4
4
 
5
5
  type DrizzleSchema = Record<string, unknown>;
6
- type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & RawAccess;
6
+ type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<RawAccess, "transaction"> & {
7
+ transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T) => Promise<T>;
8
+ };
7
9
  interface DrizzleMigrations {
8
10
  journal: unknown;
9
11
  migrations: Record<string, string>;
@@ -63,6 +63,7 @@ function db({
63
63
  }
64
64
  const nativeDb = await nativeDatabaseProvider.open(ctx.actorId);
65
65
  let closed = false;
66
+ let transactionActive = false;
66
67
  const ensureOpen = () => {
67
68
  if (closed) {
68
69
  throw new Error(
@@ -74,6 +75,11 @@ function db({
74
75
  const runSql = async (query, params, method) => {
75
76
  var _a, _b, _c, _d;
76
77
  ensureOpen();
78
+ if (!lease && transactionActive) {
79
+ throw new Error(
80
+ "Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback."
81
+ );
82
+ }
77
83
  const start = performance.now();
78
84
  const kvReadsBefore = ((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads) ?? 0;
79
85
  const kvWritesBefore = ((_b = ctx.metrics) == null ? void 0 : _b.totalKvWrites) ?? 0;
@@ -121,6 +127,11 @@ function db({
121
127
  );
122
128
  };
123
129
  drizzleDb.transaction = async (transactionCallback) => {
130
+ if (lease || transactionActive) {
131
+ throw new Error(
132
+ "Nested or concurrent db.transaction() calls are not supported."
133
+ );
134
+ }
124
135
  const transactionLease = { key: crypto.randomUUID() };
125
136
  const tx = createDrizzleClient(transactionLease);
126
137
  await nativeDb.execute(
@@ -128,6 +139,7 @@ function db({
128
139
  void 0,
129
140
  transactionLease
130
141
  );
142
+ transactionActive = true;
131
143
  try {
132
144
  const result = await transactionCallback(tx);
133
145
  await nativeDb.execute(
@@ -146,6 +158,8 @@ function db({
146
158
  } catch {
147
159
  }
148
160
  throw error;
161
+ } finally {
162
+ transactionActive = false;
149
163
  }
150
164
  };
151
165
  drizzleDb.__withSqliteLease = async (timeoutMs, leaseCallback) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"sourcesContent":["import {\n\tdrizzle,\n\ttype RemoteCallback,\n\ttype SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport type {\n\tDatabaseProvider,\n\tDatabaseProviderContext,\n\tRawAccess,\n\tSqliteDatabase,\n} from \"@/common/database/config\";\nimport { toSqliteBindings } from \"@/common/database/shared\";\nimport { sha256Hex } from \"@/utils/crypto\";\n\nexport type { SQLiteTable } from \"drizzle-orm/sqlite-core\";\nexport {\n\talias,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tinteger,\n\tprimaryKey,\n\tsqliteTable,\n\tsqliteTableCreator,\n\ttext,\n\tunique,\n\tuniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\ntype DrizzleSchema = Record<string, unknown>;\ntype DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<\n\tSqliteRemoteDatabase<TSchema>,\n\t\"transaction\"\n> &\n\tRawAccess;\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\ninterface DrizzleMigrationJournalEntry {\n\tidx: number;\n\ttag: string;\n\twhen: number;\n\tbreakpoints?: boolean;\n}\n\ninterface DrizzleMigrations {\n\tjournal: unknown;\n\tmigrations: Record<string, string>;\n}\n\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n}\n\ninterface DrizzleKitConfig {\n\tout?: string;\n\tschema?: string;\n\tdialect?: \"sqlite\";\n\t[key: string]: unknown;\n}\n\nexport function defineConfig<TConfig extends DrizzleKitConfig>(\n\tconfig: TConfig,\n): TConfig & { dialect: \"sqlite\" } {\n\treturn {\n\t\tdialect: \"sqlite\",\n\t\t...config,\n\t};\n}\n\nexport function db<TSchema extends DrizzleSchema = Record<string, never>>({\n\tschema,\n\tmigrations,\n\tonMigrate,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): DrizzleDatabase<TSchema> => {\n\t\t\t\tconst runSql = async (\n\t\t\t\t\tquery: string,\n\t\t\t\t\tparams: unknown[],\n\t\t\t\t\tmethod: \"run\" | \"all\" | \"values\" | \"get\",\n\t\t\t\t) => {\n\t\t\t\t\tensureOpen();\n\n\t\t\t\t\tconst start = performance.now();\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { rows } = await nativeDb.execute(\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\ttoSqliteBindings(params),\n\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (method === \"run\") {\n\t\t\t\t\t\t\treturn { rows: [] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (method === \"get\") {\n\t\t\t\t\t\t\treturn { rows: rows[0] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { rows };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\t\t\t\t\tkvWrites:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst callback: RemoteCallback = async (\n\t\t\t\t\tquery,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t) => {\n\t\t\t\t\treturn await runSql(query, params, method);\n\t\t\t\t};\n\n\t\t\t\tconst drizzleDb = drizzle(callback, {\n\t\t\t\t\tschema,\n\t\t\t\t}) as unknown as DrizzleDatabase<TSchema>;\n\t\t\t\tdrizzleDb.execute = async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tensureOpen,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tlease,\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.transaction = async <T>(\n\t\t\t\t\ttransactionCallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createDrizzleClient(transactionLease);\n\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\"BEGIN\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await transactionCallback(tx);\n\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\"COMMIT\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after lease poisoning.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdrizzleDb.__withSqliteLease = async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tleaseCallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await leaseCallback(\n\t\t\t\t\t\tcreateDrizzleClient(internalLease),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.close = async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait nativeDb.close();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn drizzleDb;\n\t\t\t};\n\n\t\t\treturn createDrizzleClient();\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (!migrations && !onMigrate) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait withMigrationSavepoint(client, async (leased) => {\n\t\t\t\tif (migrations) {\n\t\t\t\t\tawait runMigrations(leased, migrations);\n\t\t\t\t}\n\t\t\t\tif (onMigrate) {\n\t\t\t\t\tawait onMigrate(leased);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n\nasync function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(\n\tclient: DrizzleDatabase<TSchema>,\n\tcallback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leasedAccess) => {\n\t\t\tconst leased = leasedAccess as DrizzleDatabase<TSchema>;\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n\nasync function runMigrations<TSchema extends DrizzleSchema>(\n\tdb: DrizzleDatabase<TSchema>,\n\tmigrations: DrizzleMigrations,\n) {\n\tconst journal = parseMigrationJournal(migrations.journal);\n\n\tawait db.execute(`\n\t\tCREATE TABLE IF NOT EXISTS __drizzle_migrations (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\thash TEXT NOT NULL,\n\t\t\tcreated_at NUMERIC\n\t\t)\n\t`);\n\n\tconst rows = await db.execute<{ created_at: number }>(\n\t\t\"SELECT created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1\",\n\t);\n\tconst lastMigration = rows[0]?.created_at ?? 0;\n\n\tfor (const entry of journal.entries) {\n\t\tif (lastMigration >= entry.when) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst key = `m${entry.idx.toString().padStart(4, \"0\")}`;\n\t\tconst migration = migrations.migrations[key];\n\t\tif (migration === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`missing Drizzle migration \"${key}\" for journal entry \"${entry.tag}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst statements = migration\n\t\t\t.split(\"--> statement-breakpoint\")\n\t\t\t.map((statement) => statement.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const statement of statements) {\n\t\t\tawait db.execute(statement);\n\t\t}\n\n\t\tawait db.execute(\n\t\t\t\"INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)\",\n\t\t\tawait sha256Hex(migration),\n\t\t\tentry.when,\n\t\t);\n\t}\n}\n\nfunction parseMigrationJournal(journal: unknown): {\n\tentries: DrizzleMigrationJournalEntry[];\n} {\n\tif (\n\t\t!journal ||\n\t\ttypeof journal !== \"object\" ||\n\t\t!(\"entries\" in journal) ||\n\t\t!Array.isArray(journal.entries)\n\t) {\n\t\tthrow new Error(\"invalid Drizzle migration journal\");\n\t}\n\n\treturn journal as { entries: DrizzleMigrationJournalEntry[] };\n}\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function executeRaw<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tensureOpen();\n\n\tconst start = performance.now();\n\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\ttry {\n\t\tif (args.length > 0) {\n\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\n\t\t\t\tlease,\n\t\t\t);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!hasMultipleStatements(query)) {\n\t\t\tconst { rows, columns } = await db.execute(query, undefined, lease);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tawait db.exec(\n\t\t\tquery,\n\t\t\t(row, columns) => {\n\t\t\t\tif (!columnNames) {\n\t\t\t\t\tcolumnNames = columns;\n\t\t\t\t}\n\t\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t\t},\n\t\t\tlease,\n\t\t);\n\t\treturn results as TRow[];\n\t} finally {\n\t\tconst durationMs = performance.now() - start;\n\t\tctx.metrics?.trackSql(query, durationMs);\n\t\tif (ctx.metrics) {\n\t\t\tctx.log?.debug({\n\t\t\t\tmsg: \"sql query\",\n\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\tdurationMs,\n\t\t\t\tkvReads: ctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\tkvWrites: ctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t});\n\t\t}\n\t}\n}\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n\tif (!globalThis.crypto?.subtle) {\n\t\tthrow new Error(\"Web Crypto API is required to compute SHA-256 hashes\");\n\t}\n\n\tconst digest = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tnew TextEncoder().encode(value),\n\t);\n\treturn Array.from(new Uint8Array(digest), (byte) =>\n\t\tbyte.toString(16).padStart(2, \"0\"),\n\t).join(\"\");\n}\n"],"mappings":";;;;;AAAA;AAAA,EACC;AAAA,OAGM;;;ACqBP,eAAsB,UAAU,OAAgC;AAzBhE;AA0BC,MAAI,GAAC,gBAAW,WAAX,mBAAmB,SAAQ;AAC/B,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAEA,QAAM,SAAS,MAAM,WAAW,OAAO,OAAO;AAAA,IAC7C;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM;AAAA,IAAK,IAAI,WAAW,MAAM;AAAA,IAAG,CAAC,SAC1C,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAClC,EAAE,KAAK,EAAE;AACV;;;ADtBA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AASP,IAAM,6BAA6B;AA2B5B,SAAS,aACf,QACkC;AAClC,SAAO;AAAA,IACN,SAAS;AAAA,IACT,GAAG;AAAA,EACJ;AACD;AAEO,SAAS,GAA0D;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACD,IAA2C,CAAC,GAE1C;AACD,SAAO;AAAA,IACN,cAAc,OAAO,QAAQ;AAC5B,YAAM,WAAW,IAAI,gCAClB,MAAM,IAAI,8BAA8B,IACxC;AACH,UAAI,UAAU;AACb,eAAO;AAAA,MACR;AAEA,YAAM,yBAAyB,IAAI;AACnC,UAAI,CAAC,wBAAwB;AAC5B,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA,YAAM,WAAW,MAAM,uBAAuB,KAAK,IAAI,OAAO;AAC9D,UAAI,SAAS;AACb,YAAM,aAAa,MAAM;AACxB,YAAI,QAAQ;AACX,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,YAAM,sBAAsB,CAAC,UAGG;AAC/B,cAAM,SAAS,OACd,OACA,QACA,WACI;AAjHT;AAkHK,qBAAW;AAEX,gBAAM,QAAQ,YAAY,IAAI;AAC9B,gBAAM,kBAAgB,SAAI,YAAJ,mBAAa,iBAAgB;AACnD,gBAAM,mBAAiB,SAAI,YAAJ,mBAAa,kBAAiB;AACrD,cAAI;AACH,kBAAM,EAAE,KAAK,IAAI,MAAM,SAAS;AAAA,cAC/B;AAAA,cACA,iBAAiB,MAAM;AAAA,cACvB;AAAA,YACD;AACA,gBAAI,WAAW,OAAO;AACrB,qBAAO,EAAE,MAAM,CAAC,EAAE;AAAA,YACnB;AACA,gBAAI,WAAW,OAAO;AACrB,qBAAO,EAAE,MAAM,KAAK,CAAC,EAAE;AAAA,YACxB;AACA,mBAAO,EAAE,KAAK;AAAA,UACf,UAAE;AACD,kBAAM,aAAa,YAAY,IAAI,IAAI;AACvC,sBAAI,YAAJ,mBAAa,SAAS,OAAO;AAC7B,gBAAI,IAAI,SAAS;AAChB,wBAAI,QAAJ,mBAAS,MAAM;AAAA,gBACd,KAAK;AAAA,gBACL,OAAO,MAAM,MAAM,GAAG,GAAG;AAAA,gBACzB;AAAA,gBACA,SACC,IAAI,QAAQ,eAAe;AAAA,gBAC5B,UACC,IAAI,QAAQ,gBAAgB;AAAA,cAC9B;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAEA,cAAM,WAA2B,OAChC,OACA,QACA,WACI;AACJ,iBAAO,MAAM,OAAO,OAAO,QAAQ,MAAM;AAAA,QAC1C;AAEA,cAAM,YAAY,QAAQ,UAAU;AAAA,UACnC;AAAA,QACD,CAAC;AACD,kBAAU,UAAU,OAMnB,UACG,SACkB;AACrB,iBAAO,MAAM;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QACD;AACA,kBAAU,cAAc,OACvB,wBACgB;AAChB,gBAAM,mBAAmB,EAAE,KAAK,OAAO,WAAW,EAAE;AACpD,gBAAM,KAAK,oBAAoB,gBAAgB;AAC/C,gBAAM,SAAS;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,UACD;AACA,cAAI;AACH,kBAAM,SAAS,MAAM,oBAAoB,EAAE;AAC3C,kBAAM,SAAS;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,YACD;AACA,mBAAO;AAAA,UACR,SAAS,OAAO;AACf,gBAAI;AACH,oBAAM,SAAS;AAAA,gBACd;AAAA,gBACA;AAAA,gBACA;AAAA,cACD;AAAA,YACD,QAAQ;AAAA,YAER;AACA,kBAAM;AAAA,UACP;AAAA,QACD;AACA,kBAAU,oBAAoB,OAC7B,WACA,kBACgB;AAChB,gBAAM,gBAAgB;AAAA,YACrB,KAAK,OAAO,WAAW;AAAA,YACvB;AAAA,UACD;AACA,iBAAO,MAAM;AAAA,YACZ,oBAAoB,aAAa;AAAA,UAClC;AAAA,QACD;AACA,kBAAU,QAAQ,YAAY;AAC7B,cAAI,CAAC,QAAQ;AACZ,qBAAS;AACT,kBAAM,SAAS,MAAM;AAAA,UACtB;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AAEA,aAAO,oBAAoB;AAAA,IAC5B;AAAA,IACA,WAAW,OAAO,WAAW;AAC5B,UAAI,CAAC,cAAc,CAAC,WAAW;AAC9B;AAAA,MACD;AACA,YAAM,uBAAuB,QAAQ,OAAO,WAAW;AACtD,YAAI,YAAY;AACf,gBAAM,cAAc,QAAQ,UAAU;AAAA,QACvC;AACA,YAAI,WAAW;AACd,gBAAM,UAAU,MAAM;AAAA,QACvB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,eAAe,uBACd,QACA,UACa;AACb,SAAO,MAAM,OAAO;AAAA,IACnB;AAAA,IACA,OAAO,iBAAiB;AACvB,YAAM,SAAS;AACf,YAAM,OAAO,QAAQ,8BAA8B;AACnD,UAAI;AACH,cAAM,SAAS,MAAM,SAAS,MAAM;AACpC,cAAM,OAAO,QAAQ,sCAAsC;AAC3D,eAAO;AAAA,MACR,SAAS,OAAO;AACf,YAAI;AACH,gBAAM,OAAO;AAAA,YACZ;AAAA,UACD;AAAA,QACD,UAAE;AACD,gBAAM,OAAO;AAAA,YACZ;AAAA,UACD;AAAA,QACD;AACA,cAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AACD;AAEA,eAAe,cACdA,KACA,YACC;AAzRF;AA0RC,QAAM,UAAU,sBAAsB,WAAW,OAAO;AAExD,QAAMA,IAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB;AAED,QAAM,OAAO,MAAMA,IAAG;AAAA,IACrB;AAAA,EACD;AACA,QAAM,kBAAgB,UAAK,CAAC,MAAN,mBAAS,eAAc;AAE7C,aAAW,SAAS,QAAQ,SAAS;AACpC,QAAI,iBAAiB,MAAM,MAAM;AAChC;AAAA,IACD;AAEA,UAAM,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACrD,UAAM,YAAY,WAAW,WAAW,GAAG;AAC3C,QAAI,cAAc,QAAW;AAC5B,YAAM,IAAI;AAAA,QACT,8BAA8B,GAAG,wBAAwB,MAAM,GAAG;AAAA,MACnE;AAAA,IACD;AAEA,UAAM,aAAa,UACjB,MAAM,0BAA0B,EAChC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,EACnC,OAAO,OAAO;AAChB,eAAW,aAAa,YAAY;AACnC,YAAMA,IAAG,QAAQ,SAAS;AAAA,IAC3B;AAEA,UAAMA,IAAG;AAAA,MACR;AAAA,MACA,MAAM,UAAU,SAAS;AAAA,MACzB,MAAM;AAAA,IACP;AAAA,EACD;AACD;AAEA,SAAS,sBAAsB,SAE7B;AACD,MACC,CAAC,WACD,OAAO,YAAY,YACnB,EAAE,aAAa,YACf,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAC7B;AACD,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACpD;AAEA,SAAO;AACR;AAEA,SAAS,sBAAsB,OAAwB;AACtD,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ;AACxD,SAAO,QAAQ,SAAS,GAAG;AAC5B;AAEA,SAAS,YACR,KACA,SACO;AACP,QAAM,SAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,WAAO,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA,EAC3B;AACA,SAAO;AACR;AAEA,eAAe,WACdA,KACA,KACA,YACA,OACA,MACA,OACkB;AA5WnB;AA6WC,aAAW;AAEX,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,kBAAgB,SAAI,YAAJ,mBAAa,iBAAgB;AACnD,QAAM,mBAAiB,SAAI,YAAJ,mBAAa,kBAAiB;AACrD,MAAI;AACH,QAAI,KAAK,SAAS,GAAG;AACpB,YAAM,EAAE,MAAM,QAAQ,IAAI,MAAMA,IAAG;AAAA,QAClC;AAAA,QACA,iBAAiB,IAAI;AAAA,QACrB;AAAA,MACD;AACA,aAAO,KAAK,IAAI,CAAC,QAAQ,YAAkB,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,QAAI,CAAC,sBAAsB,KAAK,GAAG;AAClC,YAAM,EAAE,MAAM,QAAQ,IAAI,MAAMA,IAAG,QAAQ,OAAO,QAAW,KAAK;AAClE,aAAO,KAAK,IAAI,CAAC,QAAQ,YAAkB,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,UAAM,UAAqC,CAAC;AAC5C,QAAI,cAA+B;AACnC,UAAMA,IAAG;AAAA,MACR;AAAA,MACA,CAAC,KAAK,YAAY;AACjB,YAAI,CAAC,aAAa;AACjB,wBAAc;AAAA,QACf;AACA,gBAAQ,KAAK,YAAY,KAAK,WAAW,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACD;AACA,WAAO;AAAA,EACR,UAAE;AACD,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,cAAI,YAAJ,mBAAa,SAAS,OAAO;AAC7B,QAAI,IAAI,SAAS;AAChB,gBAAI,QAAJ,mBAAS,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO,MAAM,MAAM,GAAG,GAAG;AAAA,QACzB;AAAA,QACA,SAAS,IAAI,QAAQ,eAAe;AAAA,QACpC,UAAU,IAAI,QAAQ,gBAAgB;AAAA,MACvC;AAAA,IACD;AAAA,EACD;AACD;","names":["db"]}
1
+ {"version":3,"sources":["../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"sourcesContent":["import {\n\tdrizzle,\n\ttype RemoteCallback,\n\ttype SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport type {\n\tDatabaseProvider,\n\tDatabaseProviderContext,\n\tRawAccess,\n\tSqliteDatabase,\n} from \"@/common/database/config\";\nimport { toSqliteBindings } from \"@/common/database/shared\";\nimport { sha256Hex } from \"@/utils/crypto\";\n\nexport type { SQLiteTable } from \"drizzle-orm/sqlite-core\";\nexport {\n\talias,\n\tcheck,\n\tforeignKey,\n\tindex,\n\tinteger,\n\tprimaryKey,\n\tsqliteTable,\n\tsqliteTableCreator,\n\ttext,\n\tunique,\n\tuniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\ntype DrizzleSchema = Record<string, unknown>;\ntype DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<\n\tSqliteRemoteDatabase<TSchema>,\n\t\"transaction\"\n> &\n\tOmit<RawAccess, \"transaction\"> & {\n\t\ttransaction: <T>(\n\t\t\tcallback: (\n\t\t\t\ttx: DrizzleDatabase<TSchema>,\n\t\t\t) => Promise<T> | T,\n\t\t) => Promise<T>;\n\t};\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\ninterface DrizzleMigrationJournalEntry {\n\tidx: number;\n\ttag: string;\n\twhen: number;\n\tbreakpoints?: boolean;\n}\n\ninterface DrizzleMigrations {\n\tjournal: unknown;\n\tmigrations: Record<string, string>;\n}\n\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n}\n\ninterface DrizzleKitConfig {\n\tout?: string;\n\tschema?: string;\n\tdialect?: \"sqlite\";\n\t[key: string]: unknown;\n}\n\nexport function defineConfig<TConfig extends DrizzleKitConfig>(\n\tconfig: TConfig,\n): TConfig & { dialect: \"sqlite\" } {\n\treturn {\n\t\tdialect: \"sqlite\",\n\t\t...config,\n\t};\n}\n\nexport function db<TSchema extends DrizzleSchema = Record<string, never>>({\n\tschema,\n\tmigrations,\n\tonMigrate,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet transactionActive = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): DrizzleDatabase<TSchema> => {\n\t\t\t\tconst runSql = async (\n\t\t\t\t\tquery: string,\n\t\t\t\t\tparams: unknown[],\n\t\t\t\t\tmethod: \"run\" | \"all\" | \"values\" | \"get\",\n\t\t\t\t) => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (!lease && transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst start = performance.now();\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { rows } = await nativeDb.execute(\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\ttoSqliteBindings(params),\n\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (method === \"run\") {\n\t\t\t\t\t\t\treturn { rows: [] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (method === \"get\") {\n\t\t\t\t\t\t\treturn { rows: rows[0] };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { rows };\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\t\t\t\t\tkvWrites:\n\t\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst callback: RemoteCallback = async (\n\t\t\t\t\tquery,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t) => {\n\t\t\t\t\treturn await runSql(query, params, method);\n\t\t\t\t};\n\n\t\t\t\tconst drizzleDb = drizzle(callback, {\n\t\t\t\t\tschema,\n\t\t\t\t}) as unknown as DrizzleDatabase<TSchema>;\n\t\t\t\tdrizzleDb.execute = async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tensureOpen,\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\targs,\n\t\t\t\t\t\tlease,\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.transaction = async <T>(\n\t\t\t\t\ttransactionCallback: (\n\t\t\t\t\t\ttx: DrizzleDatabase<TSchema>,\n\t\t\t\t\t) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tif (lease || transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested or concurrent db.transaction() calls are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createDrizzleClient(transactionLease);\n\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\"BEGIN\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t);\n\t\t\t\t\ttransactionActive = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await transactionCallback(tx);\n\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\"COMMIT\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait nativeDb.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after lease poisoning.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttransactionActive = false;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdrizzleDb.__withSqliteLease = async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tleaseCallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await leaseCallback(\n\t\t\t\t\t\tcreateDrizzleClient(internalLease),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.close = async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait nativeDb.close();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\treturn drizzleDb;\n\t\t\t};\n\n\t\t\treturn createDrizzleClient();\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (!migrations && !onMigrate) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait withMigrationSavepoint(client, async (leased) => {\n\t\t\t\tif (migrations) {\n\t\t\t\t\tawait runMigrations(leased, migrations);\n\t\t\t\t}\n\t\t\t\tif (onMigrate) {\n\t\t\t\t\tawait onMigrate(leased);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t};\n}\n\nasync function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(\n\tclient: DrizzleDatabase<TSchema>,\n\tcallback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leasedAccess) => {\n\t\t\tconst leased = leasedAccess as DrizzleDatabase<TSchema>;\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n\nasync function runMigrations<TSchema extends DrizzleSchema>(\n\tdb: DrizzleDatabase<TSchema>,\n\tmigrations: DrizzleMigrations,\n) {\n\tconst journal = parseMigrationJournal(migrations.journal);\n\n\tawait db.execute(`\n\t\tCREATE TABLE IF NOT EXISTS __drizzle_migrations (\n\t\t\tid INTEGER PRIMARY KEY AUTOINCREMENT,\n\t\t\thash TEXT NOT NULL,\n\t\t\tcreated_at NUMERIC\n\t\t)\n\t`);\n\n\tconst rows = await db.execute<{ created_at: number }>(\n\t\t\"SELECT created_at FROM __drizzle_migrations ORDER BY created_at DESC LIMIT 1\",\n\t);\n\tconst lastMigration = rows[0]?.created_at ?? 0;\n\n\tfor (const entry of journal.entries) {\n\t\tif (lastMigration >= entry.when) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst key = `m${entry.idx.toString().padStart(4, \"0\")}`;\n\t\tconst migration = migrations.migrations[key];\n\t\tif (migration === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`missing Drizzle migration \"${key}\" for journal entry \"${entry.tag}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst statements = migration\n\t\t\t.split(\"--> statement-breakpoint\")\n\t\t\t.map((statement) => statement.trim())\n\t\t\t.filter(Boolean);\n\t\tfor (const statement of statements) {\n\t\t\tawait db.execute(statement);\n\t\t}\n\n\t\tawait db.execute(\n\t\t\t\"INSERT INTO __drizzle_migrations (hash, created_at) VALUES (?, ?)\",\n\t\t\tawait sha256Hex(migration),\n\t\t\tentry.when,\n\t\t);\n\t}\n}\n\nfunction parseMigrationJournal(journal: unknown): {\n\tentries: DrizzleMigrationJournalEntry[];\n} {\n\tif (\n\t\t!journal ||\n\t\ttypeof journal !== \"object\" ||\n\t\t!(\"entries\" in journal) ||\n\t\t!Array.isArray(journal.entries)\n\t) {\n\t\tthrow new Error(\"invalid Drizzle migration journal\");\n\t}\n\n\treturn journal as { entries: DrizzleMigrationJournalEntry[] };\n}\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function executeRaw<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tensureOpen();\n\n\tconst start = performance.now();\n\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\ttry {\n\t\tif (args.length > 0) {\n\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\n\t\t\t\tlease,\n\t\t\t);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!hasMultipleStatements(query)) {\n\t\t\tconst { rows, columns } = await db.execute(query, undefined, lease);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tawait db.exec(\n\t\t\tquery,\n\t\t\t(row, columns) => {\n\t\t\t\tif (!columnNames) {\n\t\t\t\t\tcolumnNames = columns;\n\t\t\t\t}\n\t\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t\t},\n\t\t\tlease,\n\t\t);\n\t\treturn results as TRow[];\n\t} finally {\n\t\tconst durationMs = performance.now() - start;\n\t\tctx.metrics?.trackSql(query, durationMs);\n\t\tif (ctx.metrics) {\n\t\t\tctx.log?.debug({\n\t\t\t\tmsg: \"sql query\",\n\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\tdurationMs,\n\t\t\t\tkvReads: ctx.metrics.totalKvReads - kvReadsBefore,\n\t\t\t\tkvWrites: ctx.metrics.totalKvWrites - kvWritesBefore,\n\t\t\t});\n\t\t}\n\t}\n}\n","/**\n * Timing-safe comparison of two Uint8Arrays or strings.\n * This prevents timing attacks by always comparing all bytes.\n */\nexport function timingSafeEqual(\n\ta: Uint8Array | string,\n\tb: Uint8Array | string,\n): boolean {\n\tconst encoder = new TextEncoder();\n\tconst bufferA = typeof a === \"string\" ? encoder.encode(a) : a;\n\tconst bufferB = typeof b === \"string\" ? encoder.encode(b) : b;\n\n\t// Pad to max length to avoid leaking length information\n\tconst maxLength = Math.max(bufferA.byteLength, bufferB.byteLength);\n\tlet result = bufferA.byteLength ^ bufferB.byteLength;\n\n\tfor (let i = 0; i < maxLength; i++) {\n\t\tconst byteA = i < bufferA.byteLength ? bufferA[i] : 0;\n\t\tconst byteB = i < bufferB.byteLength ? bufferB[i] : 0;\n\t\tresult |= byteA ^ byteB;\n\t}\n\n\treturn result === 0;\n}\n\nexport async function sha256Hex(value: string): Promise<string> {\n\tif (!globalThis.crypto?.subtle) {\n\t\tthrow new Error(\"Web Crypto API is required to compute SHA-256 hashes\");\n\t}\n\n\tconst digest = await globalThis.crypto.subtle.digest(\n\t\t\"SHA-256\",\n\t\tnew TextEncoder().encode(value),\n\t);\n\treturn Array.from(new Uint8Array(digest), (byte) =>\n\t\tbyte.toString(16).padStart(2, \"0\"),\n\t).join(\"\");\n}\n"],"mappings":"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","names":["db"]}
@@ -22,6 +22,7 @@ function db({
22
22
  }
23
23
  const db2 = await nativeDatabaseProvider.open(ctx.actorId);
24
24
  let closed = false;
25
+ let transactionActive = false;
25
26
  const ensureOpen = () => {
26
27
  if (closed) {
27
28
  throw new Error(
@@ -33,6 +34,11 @@ function db({
33
34
  execute: async (query, ...args) => {
34
35
  var _a, _b, _c, _d;
35
36
  ensureOpen();
37
+ if (!lease && transactionActive) {
38
+ throw new Error(
39
+ "Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback."
40
+ );
41
+ }
36
42
  const kvReadsBefore = _nullishCoalesce(((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads), () => ( 0));
37
43
  const kvWritesBefore = _nullishCoalesce(((_b = ctx.metrics) == null ? void 0 : _b.totalKvWrites), () => ( 0));
38
44
  const start = performance.now();
@@ -76,9 +82,15 @@ function db({
76
82
  }
77
83
  },
78
84
  transaction: async (callback) => {
85
+ if (lease || transactionActive) {
86
+ throw new Error(
87
+ "Nested or concurrent db.transaction() calls are not supported."
88
+ );
89
+ }
79
90
  const transactionLease = { key: crypto.randomUUID() };
80
91
  const tx = createClient(transactionLease);
81
92
  await db2.execute("BEGIN", void 0, transactionLease);
93
+ transactionActive = true;
82
94
  try {
83
95
  const result = await callback(tx);
84
96
  await db2.execute("COMMIT", void 0, transactionLease);
@@ -93,6 +105,8 @@ function db({
93
105
  } catch (e) {
94
106
  }
95
107
  throw error;
108
+ } finally {
109
+ transactionActive = false;
96
110
  }
97
111
  },
98
112
  __withSqliteLease: async (timeoutMs, callback) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/mod.cjs","../../../src/common/database/mod.ts"],"names":["db"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/mod.cjs","sourcesContent":[null,"import type { DatabaseProvider, RawAccess, SqliteDatabase } from \"./config\";\nimport { isSqliteBindingObject, toSqliteBindings } from \"./shared\";\n\nexport type { RawAccess } from \"./config\";\n\ninterface DatabaseFactoryConfig {\n\tonMigrate?: (db: RawAccess) => Promise<void> | void;\n}\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nexport function db({\n\tonMigrate,\n}: DatabaseFactoryConfig = {}): DatabaseProvider<RawAccess> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst db = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): RawAccess => ({\n\t\t\t\texecute: async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\tensureOpen();\n\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\tconst start = performance.now();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\t\tconst bindings =\n\t\t\t\t\t\t\t\targs.length === 1 &&\n\t\t\t\t\t\t\t\tisSqliteBindingObject(args[0])\n\t\t\t\t\t\t\t\t\t? toSqliteBindings(args[0])\n\t\t\t\t\t\t\t\t\t: toSqliteBindings(args);\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tbindings,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!hasMultipleStatements(query)) {\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn await execMultiStatement<TRow>(db, query, lease);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tconst kvReads =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore;\n\t\t\t\t\t\t\tconst kvWrites =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore;\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads,\n\t\t\t\t\t\t\t\tkvWrites,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttransaction: async <T>(\n\t\t\t\t\tcallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createClient(transactionLease);\n\t\t\t\t\tawait db.execute(\"BEGIN\", undefined, transactionLease);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await callback(tx);\n\t\t\t\t\t\tawait db.execute(\"COMMIT\", undefined, transactionLease);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait db.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// A deadline poisons the lease key, so its cleanup rollback is\n\t\t\t\t\t\t\t// expected to fail. Preserve the callback or commit error.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t__withSqliteLease: async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tcallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await callback(createClient(internalLease));\n\t\t\t\t},\n\t\t\t\tclose: async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait db.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnativeMetrics: () => db.nativeMetrics?.() ?? null,\n\t\t\t});\n\t\t\tconst client = createClient();\n\t\t\treturn client;\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (onMigrate) {\n\t\t\t\tawait withMigrationSavepoint(client, (leased) =>\n\t\t\t\t\tonMigrate(leased),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function execMultiStatement<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tquery: string,\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tconst results: Record<string, unknown>[] = [];\n\tlet columnNames: string[] | null = null;\n\tawait db.exec(\n\t\tquery,\n\t\t(row: unknown[], columns: string[]) => {\n\t\t\tif (!columnNames) {\n\t\t\t\tcolumnNames = columns;\n\t\t\t}\n\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t},\n\t\tlease,\n\t);\n\treturn results as TRow[];\n}\n\nasync function withMigrationSavepoint<T>(\n\tclient: RawAccess,\n\tcallback: (leased: RawAccess) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leased) => {\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/mod.cjs","../../../src/common/database/mod.ts"],"names":["db"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/rivetkit/dist/tsup/db/mod.cjs","sourcesContent":[null,"import type { DatabaseProvider, RawAccess, SqliteDatabase } from \"./config\";\nimport { isSqliteBindingObject, toSqliteBindings } from \"./shared\";\n\nexport type { RawAccess } from \"./config\";\n\ninterface DatabaseFactoryConfig {\n\tonMigrate?: (db: RawAccess) => Promise<void> | void;\n}\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nexport function db({\n\tonMigrate,\n}: DatabaseFactoryConfig = {}): DatabaseProvider<RawAccess> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst db = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet transactionActive = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): RawAccess => ({\n\t\t\t\texecute: async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (!lease && transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\tconst start = performance.now();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\t\tconst bindings =\n\t\t\t\t\t\t\t\targs.length === 1 &&\n\t\t\t\t\t\t\t\tisSqliteBindingObject(args[0])\n\t\t\t\t\t\t\t\t\t? toSqliteBindings(args[0])\n\t\t\t\t\t\t\t\t\t: toSqliteBindings(args);\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tbindings,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!hasMultipleStatements(query)) {\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn await execMultiStatement<TRow>(db, query, lease);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tconst kvReads =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore;\n\t\t\t\t\t\t\tconst kvWrites =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore;\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads,\n\t\t\t\t\t\t\t\tkvWrites,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttransaction: async <T>(\n\t\t\t\t\tcallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tif (lease || transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested or concurrent db.transaction() calls are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createClient(transactionLease);\n\t\t\t\t\tawait db.execute(\"BEGIN\", undefined, transactionLease);\n\t\t\t\t\ttransactionActive = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await callback(tx);\n\t\t\t\t\t\tawait db.execute(\"COMMIT\", undefined, transactionLease);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait db.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// A deadline poisons the lease key, so its cleanup rollback is\n\t\t\t\t\t\t\t// expected to fail. Preserve the callback or commit error.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttransactionActive = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t__withSqliteLease: async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tcallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await callback(createClient(internalLease));\n\t\t\t\t},\n\t\t\t\tclose: async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait db.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnativeMetrics: () => db.nativeMetrics?.() ?? null,\n\t\t\t});\n\t\t\tconst client = createClient();\n\t\t\treturn client;\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (onMigrate) {\n\t\t\t\tawait withMigrationSavepoint(client, (leased) =>\n\t\t\t\t\tonMigrate(leased),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function execMultiStatement<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tquery: string,\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tconst results: Record<string, unknown>[] = [];\n\tlet columnNames: string[] | null = null;\n\tawait db.exec(\n\t\tquery,\n\t\t(row: unknown[], columns: string[]) => {\n\t\t\tif (!columnNames) {\n\t\t\t\tcolumnNames = columns;\n\t\t\t}\n\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t},\n\t\tlease,\n\t);\n\treturn results as TRow[];\n}\n\nasync function withMigrationSavepoint<T>(\n\tclient: RawAccess,\n\tcallback: (leased: RawAccess) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leased) => {\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n"]}
@@ -22,6 +22,7 @@ function db({
22
22
  }
23
23
  const db2 = await nativeDatabaseProvider.open(ctx.actorId);
24
24
  let closed = false;
25
+ let transactionActive = false;
25
26
  const ensureOpen = () => {
26
27
  if (closed) {
27
28
  throw new Error(
@@ -33,6 +34,11 @@ function db({
33
34
  execute: async (query, ...args) => {
34
35
  var _a, _b, _c, _d;
35
36
  ensureOpen();
37
+ if (!lease && transactionActive) {
38
+ throw new Error(
39
+ "Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback."
40
+ );
41
+ }
36
42
  const kvReadsBefore = ((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads) ?? 0;
37
43
  const kvWritesBefore = ((_b = ctx.metrics) == null ? void 0 : _b.totalKvWrites) ?? 0;
38
44
  const start = performance.now();
@@ -76,9 +82,15 @@ function db({
76
82
  }
77
83
  },
78
84
  transaction: async (callback) => {
85
+ if (lease || transactionActive) {
86
+ throw new Error(
87
+ "Nested or concurrent db.transaction() calls are not supported."
88
+ );
89
+ }
79
90
  const transactionLease = { key: crypto.randomUUID() };
80
91
  const tx = createClient(transactionLease);
81
92
  await db2.execute("BEGIN", void 0, transactionLease);
93
+ transactionActive = true;
82
94
  try {
83
95
  const result = await callback(tx);
84
96
  await db2.execute("COMMIT", void 0, transactionLease);
@@ -93,6 +105,8 @@ function db({
93
105
  } catch {
94
106
  }
95
107
  throw error;
108
+ } finally {
109
+ transactionActive = false;
96
110
  }
97
111
  },
98
112
  __withSqliteLease: async (timeoutMs, callback) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/common/database/mod.ts"],"sourcesContent":["import type { DatabaseProvider, RawAccess, SqliteDatabase } from \"./config\";\nimport { isSqliteBindingObject, toSqliteBindings } from \"./shared\";\n\nexport type { RawAccess } from \"./config\";\n\ninterface DatabaseFactoryConfig {\n\tonMigrate?: (db: RawAccess) => Promise<void> | void;\n}\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nexport function db({\n\tonMigrate,\n}: DatabaseFactoryConfig = {}): DatabaseProvider<RawAccess> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst db = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): RawAccess => ({\n\t\t\t\texecute: async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\tensureOpen();\n\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\tconst start = performance.now();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\t\tconst bindings =\n\t\t\t\t\t\t\t\targs.length === 1 &&\n\t\t\t\t\t\t\t\tisSqliteBindingObject(args[0])\n\t\t\t\t\t\t\t\t\t? toSqliteBindings(args[0])\n\t\t\t\t\t\t\t\t\t: toSqliteBindings(args);\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tbindings,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!hasMultipleStatements(query)) {\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn await execMultiStatement<TRow>(db, query, lease);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tconst kvReads =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore;\n\t\t\t\t\t\t\tconst kvWrites =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore;\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads,\n\t\t\t\t\t\t\t\tkvWrites,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttransaction: async <T>(\n\t\t\t\t\tcallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createClient(transactionLease);\n\t\t\t\t\tawait db.execute(\"BEGIN\", undefined, transactionLease);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await callback(tx);\n\t\t\t\t\t\tawait db.execute(\"COMMIT\", undefined, transactionLease);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait db.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// A deadline poisons the lease key, so its cleanup rollback is\n\t\t\t\t\t\t\t// expected to fail. Preserve the callback or commit error.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t__withSqliteLease: async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tcallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await callback(createClient(internalLease));\n\t\t\t\t},\n\t\t\t\tclose: async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait db.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnativeMetrics: () => db.nativeMetrics?.() ?? null,\n\t\t\t});\n\t\t\tconst client = createClient();\n\t\t\treturn client;\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (onMigrate) {\n\t\t\t\tawait withMigrationSavepoint(client, (leased) =>\n\t\t\t\t\tonMigrate(leased),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function execMultiStatement<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tquery: string,\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tconst results: Record<string, unknown>[] = [];\n\tlet columnNames: string[] | null = null;\n\tawait db.exec(\n\t\tquery,\n\t\t(row: unknown[], columns: string[]) => {\n\t\t\tif (!columnNames) {\n\t\t\t\tcolumnNames = columns;\n\t\t\t}\n\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t},\n\t\tlease,\n\t);\n\treturn results as TRow[];\n}\n\nasync function withMigrationSavepoint<T>(\n\tclient: RawAccess,\n\tcallback: (leased: RawAccess) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leased) => {\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["db"]}
1
+ {"version":3,"sources":["../../../src/common/database/mod.ts"],"sourcesContent":["import type { DatabaseProvider, RawAccess, SqliteDatabase } from \"./config\";\nimport { isSqliteBindingObject, toSqliteBindings } from \"./shared\";\n\nexport type { RawAccess } from \"./config\";\n\ninterface DatabaseFactoryConfig {\n\tonMigrate?: (db: RawAccess) => Promise<void> | void;\n}\n\nconst MIGRATION_LEASE_TIMEOUT_MS = 60_000;\n\nfunction hasMultipleStatements(query: string): boolean {\n\tconst trimmed = query.trim().replace(/;+$/, \"\").trimEnd();\n\treturn trimmed.includes(\";\");\n}\n\nexport function db({\n\tonMigrate,\n}: DatabaseFactoryConfig = {}): DatabaseProvider<RawAccess> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst db = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet transactionActive = false;\n\t\t\tconst ensureOpen = () => {\n\t\t\t\tif (closed) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Database is closed. This usually means a background timer (setInterval, setTimeout) or a stray promise is still running after the actor stopped. Use c.abortSignal to clean up timers before the actor shuts down.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createClient = (lease?: {\n\t\t\t\tkey: string;\n\t\t\t\ttimeoutMs?: number;\n\t\t\t}): RawAccess => ({\n\t\t\t\texecute: async <\n\t\t\t\t\tTRow extends Record<string, unknown> = Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>,\n\t\t\t\t>(\n\t\t\t\t\tquery: string,\n\t\t\t\t\t...args: unknown[]\n\t\t\t\t): Promise<TRow[]> => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (!lease && transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Use the tx argument inside db.transaction(); the outer database client cannot run work from the transaction callback.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;\n\t\t\t\t\tconst kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;\n\t\t\t\t\tconst start = performance.now();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (args.length > 0) {\n\t\t\t\t\t\t\tconst bindings =\n\t\t\t\t\t\t\t\targs.length === 1 &&\n\t\t\t\t\t\t\t\tisSqliteBindingObject(args[0])\n\t\t\t\t\t\t\t\t\t? toSqliteBindings(args[0])\n\t\t\t\t\t\t\t\t\t: toSqliteBindings(args);\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tbindings,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!hasMultipleStatements(query)) {\n\t\t\t\t\t\t\tconst { rows, columns } = await db.execute(\n\t\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tlease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn rows.map((row) =>\n\t\t\t\t\t\t\t\trowToObject<TRow>(row, columns),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn await execMultiStatement<TRow>(db, query, lease);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tconst durationMs = performance.now() - start;\n\t\t\t\t\t\tctx.metrics?.trackSql(query, durationMs);\n\t\t\t\t\t\tif (ctx.metrics) {\n\t\t\t\t\t\t\tconst kvReads =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvReads - kvReadsBefore;\n\t\t\t\t\t\t\tconst kvWrites =\n\t\t\t\t\t\t\t\tctx.metrics.totalKvWrites - kvWritesBefore;\n\t\t\t\t\t\t\tctx.log?.debug({\n\t\t\t\t\t\t\t\tmsg: \"sql query\",\n\t\t\t\t\t\t\t\tquery: query.slice(0, 120),\n\t\t\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\t\t\tkvReads,\n\t\t\t\t\t\t\t\tkvWrites,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttransaction: async <T>(\n\t\t\t\t\tcallback: (tx: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tif (lease || transactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested or concurrent db.transaction() calls are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst transactionLease = { key: crypto.randomUUID() };\n\t\t\t\t\tconst tx = createClient(transactionLease);\n\t\t\t\t\tawait db.execute(\"BEGIN\", undefined, transactionLease);\n\t\t\t\t\ttransactionActive = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await callback(tx);\n\t\t\t\t\t\tawait db.execute(\"COMMIT\", undefined, transactionLease);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait db.execute(\n\t\t\t\t\t\t\t\t\"ROLLBACK\",\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\ttransactionLease,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// A deadline poisons the lease key, so its cleanup rollback is\n\t\t\t\t\t\t\t// expected to fail. Preserve the callback or commit error.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t} finally {\n\t\t\t\t\t\ttransactionActive = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t__withSqliteLease: async <T>(\n\t\t\t\t\ttimeoutMs: number,\n\t\t\t\t\tcallback: (leased: RawAccess) => Promise<T> | T,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tconst internalLease = {\n\t\t\t\t\t\tkey: crypto.randomUUID(),\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t};\n\t\t\t\t\treturn await callback(createClient(internalLease));\n\t\t\t\t},\n\t\t\t\tclose: async () => {\n\t\t\t\t\tif (!closed) {\n\t\t\t\t\t\tclosed = true;\n\t\t\t\t\t\tawait db.close();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tnativeMetrics: () => db.nativeMetrics?.() ?? null,\n\t\t\t});\n\t\t\tconst client = createClient();\n\t\t\treturn client;\n\t\t},\n\t\tonMigrate: async (client) => {\n\t\t\tif (onMigrate) {\n\t\t\t\tawait withMigrationSavepoint(client, (leased) =>\n\t\t\t\t\tonMigrate(leased),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\nfunction rowToObject<TRow extends Record<string, unknown>>(\n\trow: unknown[],\n\tcolumns: string[],\n): TRow {\n\tconst rowObj: Record<string, unknown> = {};\n\tfor (let i = 0; i < columns.length; i++) {\n\t\trowObj[columns[i]] = row[i];\n\t}\n\treturn rowObj as TRow;\n}\n\nasync function execMultiStatement<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase,\n\tquery: string,\n\tlease?: { key: string; timeoutMs?: number },\n): Promise<TRow[]> {\n\tconst results: Record<string, unknown>[] = [];\n\tlet columnNames: string[] | null = null;\n\tawait db.exec(\n\t\tquery,\n\t\t(row: unknown[], columns: string[]) => {\n\t\t\tif (!columnNames) {\n\t\t\t\tcolumnNames = columns;\n\t\t\t}\n\t\t\tresults.push(rowToObject(row, columnNames));\n\t\t},\n\t\tlease,\n\t);\n\treturn results as TRow[];\n}\n\nasync function withMigrationSavepoint<T>(\n\tclient: RawAccess,\n\tcallback: (leased: RawAccess) => Promise<T> | T,\n): Promise<T> {\n\treturn await client.__withSqliteLease(\n\t\tMIGRATION_LEASE_TIMEOUT_MS,\n\t\tasync (leased) => {\n\t\t\tawait leased.execute(\"SAVEPOINT __rivet_on_migrate\");\n\t\t\ttry {\n\t\t\t\tconst result = await callback(leased);\n\t\t\t\tawait leased.execute(\"RELEASE SAVEPOINT __rivet_on_migrate\");\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"ROLLBACK TO SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t} finally {\n\t\t\t\t\tawait leased.execute(\n\t\t\t\t\t\t\"RELEASE SAVEPOINT __rivet_on_migrate\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t);\n}\n"],"mappings":"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","names":["db"]}
@@ -1,12 +1,12 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
2
2
 
3
- var _chunk3GC3EP6Dcjs = require('../chunk-3GC3EP6D.cjs');
3
+ var _chunkYPIVGZVXcjs = require('../chunk-YPIVGZVX.cjs');
4
4
 
5
5
 
6
6
 
7
- var _chunkI336PMWTcjs = require('../chunk-I336PMWT.cjs');
8
- require('../chunk-OUDV3ITX.cjs');
9
- require('../chunk-PRXTIERO.cjs');
7
+ var _chunkIVUL2OMZcjs = require('../chunk-IVUL2OMZ.cjs');
8
+ require('../chunk-VP3RWGXE.cjs');
9
+ require('../chunk-5RC3H5MH.cjs');
10
10
  require('../chunk-4FC7TVS6.cjs');
11
11
 
12
12
  // src/common/bare/generated/inspector/v5.ts
@@ -796,5 +796,5 @@ function decodeToClient(bytes) {
796
796
 
797
797
 
798
798
 
799
- exports.createWorkflowInspectorAdapter = _chunk3GC3EP6Dcjs.createWorkflowInspectorAdapter; exports.decodeToClient = decodeToClient; exports.decodeToServer = decodeToServer; exports.decodeWorkflowHistoryTransport = _chunkI336PMWTcjs.decodeWorkflowHistoryTransport; exports.encodeToClient = encodeToClient; exports.encodeToServer = encodeToServer; exports.encodeWorkflowHistoryTransport = _chunkI336PMWTcjs.encodeWorkflowHistoryTransport; exports.readActionRequest = readActionRequest; exports.readActionResponse = readActionResponse; exports.readConnection = readConnection; exports.readConnectionsRequest = readConnectionsRequest; exports.readConnectionsResponse = readConnectionsResponse; exports.readConnectionsUpdated = readConnectionsUpdated; exports.readDatabaseSchemaRequest = readDatabaseSchemaRequest; exports.readDatabaseSchemaResponse = readDatabaseSchemaResponse; exports.readDatabaseTableRowsRequest = readDatabaseTableRowsRequest; exports.readDatabaseTableRowsResponse = readDatabaseTableRowsResponse; exports.readError = readError; exports.readInit = readInit; exports.readPatchStateRequest = readPatchStateRequest; exports.readQueueMessageSummary = readQueueMessageSummary; exports.readQueueRequest = readQueueRequest; exports.readQueueResponse = readQueueResponse; exports.readQueueStatus = readQueueStatus; exports.readQueueUpdated = readQueueUpdated; exports.readRpcsListRequest = readRpcsListRequest; exports.readRpcsListResponse = readRpcsListResponse; exports.readState = readState; exports.readStateRequest = readStateRequest; exports.readStateResponse = readStateResponse; exports.readStateUpdated = readStateUpdated; exports.readTabConfigEntry = readTabConfigEntry; exports.readToClient = readToClient; exports.readToClientBody = readToClientBody; exports.readToServer = readToServer; exports.readToServerBody = readToServerBody; exports.readTraceQueryRequest = readTraceQueryRequest; exports.readTraceQueryResponse = readTraceQueryResponse; exports.readWorkflowHistory = readWorkflowHistory; exports.readWorkflowHistoryRequest = readWorkflowHistoryRequest; exports.readWorkflowHistoryResponse = readWorkflowHistoryResponse; exports.readWorkflowHistoryUpdated = readWorkflowHistoryUpdated; exports.readWorkflowReplayRequest = readWorkflowReplayRequest; exports.readWorkflowReplayResponse = readWorkflowReplayResponse; exports.writeActionRequest = writeActionRequest; exports.writeActionResponse = writeActionResponse; exports.writeConnection = writeConnection; exports.writeConnectionsRequest = writeConnectionsRequest; exports.writeConnectionsResponse = writeConnectionsResponse; exports.writeConnectionsUpdated = writeConnectionsUpdated; exports.writeDatabaseSchemaRequest = writeDatabaseSchemaRequest; exports.writeDatabaseSchemaResponse = writeDatabaseSchemaResponse; exports.writeDatabaseTableRowsRequest = writeDatabaseTableRowsRequest; exports.writeDatabaseTableRowsResponse = writeDatabaseTableRowsResponse; exports.writeError = writeError; exports.writeInit = writeInit; exports.writePatchStateRequest = writePatchStateRequest; exports.writeQueueMessageSummary = writeQueueMessageSummary; exports.writeQueueRequest = writeQueueRequest; exports.writeQueueResponse = writeQueueResponse; exports.writeQueueStatus = writeQueueStatus; exports.writeQueueUpdated = writeQueueUpdated; exports.writeRpcsListRequest = writeRpcsListRequest; exports.writeRpcsListResponse = writeRpcsListResponse; exports.writeState = writeState; exports.writeStateRequest = writeStateRequest; exports.writeStateResponse = writeStateResponse; exports.writeStateUpdated = writeStateUpdated; exports.writeTabConfigEntry = writeTabConfigEntry; exports.writeToClient = writeToClient; exports.writeToClientBody = writeToClientBody; exports.writeToServer = writeToServer; exports.writeToServerBody = writeToServerBody; exports.writeTraceQueryRequest = writeTraceQueryRequest; exports.writeTraceQueryResponse = writeTraceQueryResponse; exports.writeWorkflowHistory = writeWorkflowHistory; exports.writeWorkflowHistoryRequest = writeWorkflowHistoryRequest; exports.writeWorkflowHistoryResponse = writeWorkflowHistoryResponse; exports.writeWorkflowHistoryUpdated = writeWorkflowHistoryUpdated; exports.writeWorkflowReplayRequest = writeWorkflowReplayRequest; exports.writeWorkflowReplayResponse = writeWorkflowReplayResponse;
799
+ exports.createWorkflowInspectorAdapter = _chunkYPIVGZVXcjs.createWorkflowInspectorAdapter; exports.decodeToClient = decodeToClient; exports.decodeToServer = decodeToServer; exports.decodeWorkflowHistoryTransport = _chunkIVUL2OMZcjs.decodeWorkflowHistoryTransport; exports.encodeToClient = encodeToClient; exports.encodeToServer = encodeToServer; exports.encodeWorkflowHistoryTransport = _chunkIVUL2OMZcjs.encodeWorkflowHistoryTransport; exports.readActionRequest = readActionRequest; exports.readActionResponse = readActionResponse; exports.readConnection = readConnection; exports.readConnectionsRequest = readConnectionsRequest; exports.readConnectionsResponse = readConnectionsResponse; exports.readConnectionsUpdated = readConnectionsUpdated; exports.readDatabaseSchemaRequest = readDatabaseSchemaRequest; exports.readDatabaseSchemaResponse = readDatabaseSchemaResponse; exports.readDatabaseTableRowsRequest = readDatabaseTableRowsRequest; exports.readDatabaseTableRowsResponse = readDatabaseTableRowsResponse; exports.readError = readError; exports.readInit = readInit; exports.readPatchStateRequest = readPatchStateRequest; exports.readQueueMessageSummary = readQueueMessageSummary; exports.readQueueRequest = readQueueRequest; exports.readQueueResponse = readQueueResponse; exports.readQueueStatus = readQueueStatus; exports.readQueueUpdated = readQueueUpdated; exports.readRpcsListRequest = readRpcsListRequest; exports.readRpcsListResponse = readRpcsListResponse; exports.readState = readState; exports.readStateRequest = readStateRequest; exports.readStateResponse = readStateResponse; exports.readStateUpdated = readStateUpdated; exports.readTabConfigEntry = readTabConfigEntry; exports.readToClient = readToClient; exports.readToClientBody = readToClientBody; exports.readToServer = readToServer; exports.readToServerBody = readToServerBody; exports.readTraceQueryRequest = readTraceQueryRequest; exports.readTraceQueryResponse = readTraceQueryResponse; exports.readWorkflowHistory = readWorkflowHistory; exports.readWorkflowHistoryRequest = readWorkflowHistoryRequest; exports.readWorkflowHistoryResponse = readWorkflowHistoryResponse; exports.readWorkflowHistoryUpdated = readWorkflowHistoryUpdated; exports.readWorkflowReplayRequest = readWorkflowReplayRequest; exports.readWorkflowReplayResponse = readWorkflowReplayResponse; exports.writeActionRequest = writeActionRequest; exports.writeActionResponse = writeActionResponse; exports.writeConnection = writeConnection; exports.writeConnectionsRequest = writeConnectionsRequest; exports.writeConnectionsResponse = writeConnectionsResponse; exports.writeConnectionsUpdated = writeConnectionsUpdated; exports.writeDatabaseSchemaRequest = writeDatabaseSchemaRequest; exports.writeDatabaseSchemaResponse = writeDatabaseSchemaResponse; exports.writeDatabaseTableRowsRequest = writeDatabaseTableRowsRequest; exports.writeDatabaseTableRowsResponse = writeDatabaseTableRowsResponse; exports.writeError = writeError; exports.writeInit = writeInit; exports.writePatchStateRequest = writePatchStateRequest; exports.writeQueueMessageSummary = writeQueueMessageSummary; exports.writeQueueRequest = writeQueueRequest; exports.writeQueueResponse = writeQueueResponse; exports.writeQueueStatus = writeQueueStatus; exports.writeQueueUpdated = writeQueueUpdated; exports.writeRpcsListRequest = writeRpcsListRequest; exports.writeRpcsListResponse = writeRpcsListResponse; exports.writeState = writeState; exports.writeStateRequest = writeStateRequest; exports.writeStateResponse = writeStateResponse; exports.writeStateUpdated = writeStateUpdated; exports.writeTabConfigEntry = writeTabConfigEntry; exports.writeToClient = writeToClient; exports.writeToClientBody = writeToClientBody; exports.writeToServer = writeToServer; exports.writeToServerBody = writeToServerBody; exports.writeTraceQueryRequest = writeTraceQueryRequest; exports.writeTraceQueryResponse = writeTraceQueryResponse; exports.writeWorkflowHistory = writeWorkflowHistory; exports.writeWorkflowHistoryRequest = writeWorkflowHistoryRequest; exports.writeWorkflowHistoryResponse = writeWorkflowHistoryResponse; exports.writeWorkflowHistoryUpdated = writeWorkflowHistoryUpdated; exports.writeWorkflowReplayRequest = writeWorkflowReplayRequest; exports.writeWorkflowReplayResponse = writeWorkflowReplayResponse;
800
800
  //# sourceMappingURL=mod.cjs.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  createWorkflowInspectorAdapter
3
- } from "../chunk-7IVUT2JT.js";
3
+ } from "../chunk-VL3UZ6XX.js";
4
4
  import {
5
5
  decodeWorkflowHistoryTransport,
6
6
  encodeWorkflowHistoryTransport
7
- } from "../chunk-IB73AMGJ.js";
8
- import "../chunk-KTNBYGRU.js";
9
- import "../chunk-XZ62SWSC.js";
7
+ } from "../chunk-D5TT3ZDY.js";
8
+ import "../chunk-5NJB7EE2.js";
9
+ import "../chunk-XPXLCL5I.js";
10
10
  import "../chunk-ZZ3WBRPD.js";
11
11
 
12
12
  // src/common/bare/generated/inspector/v5.ts