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.
- package/dist/browser/client.js +1 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.js +1 -1
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/agent-os/index.cjs +15 -1
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.js +15 -1
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-KTNBYGRU.js → chunk-5NJB7EE2.js} +2 -2
- package/dist/tsup/{chunk-PRXTIERO.cjs → chunk-5RC3H5MH.cjs} +2 -2
- package/dist/tsup/{chunk-PRXTIERO.cjs.map → chunk-5RC3H5MH.cjs.map} +1 -1
- package/dist/tsup/{chunk-62LSMTP2.cjs → chunk-CKKFRK2T.cjs} +3 -3
- package/dist/tsup/{chunk-62LSMTP2.cjs.map → chunk-CKKFRK2T.cjs.map} +1 -1
- package/dist/tsup/{chunk-GMN45CQ6.cjs → chunk-COPUTOJF.cjs} +7 -7
- package/dist/tsup/{chunk-GMN45CQ6.cjs.map → chunk-COPUTOJF.cjs.map} +1 -1
- package/dist/tsup/{chunk-IB73AMGJ.js → chunk-D5TT3ZDY.js} +2 -2
- package/dist/tsup/{chunk-WRZEVVLL.js → chunk-DNGOGOHS.js} +3 -3
- package/dist/tsup/{chunk-GEYQLGXC.cjs → chunk-HV4FLJQR.cjs} +139 -139
- package/dist/tsup/{chunk-GEYQLGXC.cjs.map → chunk-HV4FLJQR.cjs.map} +1 -1
- package/dist/tsup/{chunk-I336PMWT.cjs → chunk-IVUL2OMZ.cjs} +4 -4
- package/dist/tsup/{chunk-I336PMWT.cjs.map → chunk-IVUL2OMZ.cjs.map} +1 -1
- package/dist/tsup/{chunk-XAIMHUPG.js → chunk-MUPT34DY.js} +4 -4
- package/dist/tsup/{chunk-ITWJ6Y7G.js → chunk-VBASTLLY.js} +2 -2
- package/dist/tsup/{chunk-7IVUT2JT.js → chunk-VL3UZ6XX.js} +4 -4
- package/dist/tsup/{chunk-OUDV3ITX.cjs → chunk-VP3RWGXE.cjs} +5 -5
- package/dist/tsup/{chunk-OUDV3ITX.cjs.map → chunk-VP3RWGXE.cjs.map} +1 -1
- package/dist/tsup/{chunk-XZ62SWSC.js → chunk-XPXLCL5I.js} +2 -2
- package/dist/tsup/{chunk-XZ62SWSC.js.map → chunk-XPXLCL5I.js.map} +1 -1
- package/dist/tsup/{chunk-3GC3EP6D.cjs → chunk-YPIVGZVX.cjs} +10 -10
- package/dist/tsup/{chunk-3GC3EP6D.cjs.map → chunk-YPIVGZVX.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.js +5 -5
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/db/drizzle.cjs +14 -0
- package/dist/tsup/db/drizzle.cjs.map +1 -1
- package/dist/tsup/db/drizzle.d.cts +3 -1
- package/dist/tsup/db/drizzle.d.ts +3 -1
- package/dist/tsup/db/drizzle.js +14 -0
- package/dist/tsup/db/drizzle.js.map +1 -1
- package/dist/tsup/db/mod.cjs +14 -0
- package/dist/tsup/db/mod.cjs.map +1 -1
- package/dist/tsup/db/mod.js +14 -0
- package/dist/tsup/db/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +5 -5
- package/dist/tsup/inspector/mod.js +4 -4
- package/dist/tsup/mod.cjs +62 -62
- package/dist/tsup/mod.js +5 -5
- package/dist/tsup/test/mod.cjs +9 -9
- package/dist/tsup/test/mod.js +5 -5
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +7 -7
- package/dist/tsup/workflow/mod.js +4 -4
- package/package.json +8 -8
- package/src/common/bare/generated/actor-uds-protocol/v1.ts +802 -0
- package/src/common/database/mod.test.ts +54 -0
- package/src/common/database/mod.ts +14 -0
- package/src/db/drizzle.ts +24 -2
- /package/dist/tsup/{chunk-KTNBYGRU.js.map → chunk-5NJB7EE2.js.map} +0 -0
- /package/dist/tsup/{chunk-IB73AMGJ.js.map → chunk-D5TT3ZDY.js.map} +0 -0
- /package/dist/tsup/{chunk-WRZEVVLL.js.map → chunk-DNGOGOHS.js.map} +0 -0
- /package/dist/tsup/{chunk-XAIMHUPG.js.map → chunk-MUPT34DY.js.map} +0 -0
- /package/dist/tsup/{chunk-ITWJ6Y7G.js.map → chunk-VBASTLLY.js.map} +0 -0
- /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>;
|
package/dist/tsup/db/drizzle.js
CHANGED
|
@@ -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":"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","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":";;;;;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;AAeP,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,UAAI,oBAAoB;AACxB,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;AAxHT;AAyHK,qBAAW;AACX,cAAI,CAAC,SAAS,mBAAmB;AAChC,kBAAM,IAAI;AAAA,cACT;AAAA,YACD;AAAA,UACD;AAEA,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,wBAGgB;AAChB,cAAI,SAAS,mBAAmB;AAC/B,kBAAM,IAAI;AAAA,cACT;AAAA,YACD;AAAA,UACD;AACA,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,8BAAoB;AACpB,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,UAAE;AACD,gCAAoB;AAAA,UACrB;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;AA/SF;AAgTC,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;AAlYnB;AAmYC,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"]}
|
package/dist/tsup/db/mod.cjs
CHANGED
|
@@ -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) => {
|
package/dist/tsup/db/mod.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/tsup/db/mod.js
CHANGED
|
@@ -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) => {
|
package/dist/tsup/db/mod.js.map
CHANGED
|
@@ -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
|
|
3
|
+
var _chunkYPIVGZVXcjs = require('../chunk-YPIVGZVX.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
require('../chunk-
|
|
9
|
-
require('../chunk-
|
|
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 =
|
|
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-
|
|
3
|
+
} from "../chunk-VL3UZ6XX.js";
|
|
4
4
|
import {
|
|
5
5
|
decodeWorkflowHistoryTransport,
|
|
6
6
|
encodeWorkflowHistoryTransport
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
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
|