rivetkit 0.0.0-stack-chore-sync-engine-changes-from-enterprise-mszropyy.677d526 → 0.0.0-sync-sqlite.0ed739a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/browser/client.d.ts +25 -0
  2. package/dist/browser/client.js +17 -5
  3. package/dist/browser/client.js.map +1 -1
  4. package/dist/browser/inspector/client.js +1 -1
  5. package/dist/browser/inspector/client.js.map +1 -1
  6. package/dist/tsup/agent-os/index.cjs +145 -3
  7. package/dist/tsup/agent-os/index.cjs.map +1 -1
  8. package/dist/tsup/agent-os/index.d.cts +40 -2
  9. package/dist/tsup/agent-os/index.d.ts +40 -2
  10. package/dist/tsup/agent-os/index.js +144 -2
  11. package/dist/tsup/agent-os/index.js.map +1 -1
  12. package/dist/tsup/{chunk-FSD52J3H.cjs → chunk-24PL45D7.cjs} +3 -3
  13. package/dist/tsup/{chunk-FSD52J3H.cjs.map → chunk-24PL45D7.cjs.map} +1 -1
  14. package/dist/tsup/{chunk-7ZPRFCTV.cjs → chunk-3TNKROAF.cjs} +156 -144
  15. package/dist/tsup/chunk-3TNKROAF.cjs.map +1 -0
  16. package/dist/tsup/{chunk-ZYHZOZUQ.js → chunk-75H2CLHI.js} +2 -2
  17. package/dist/tsup/{chunk-OWSXJF7Z.js → chunk-BERJKIW5.js} +22 -10
  18. package/dist/tsup/chunk-BERJKIW5.js.map +1 -0
  19. package/dist/tsup/{chunk-XPT7SGBW.js → chunk-BZOI63CT.js} +4 -4
  20. package/dist/tsup/{chunk-M4RSGECU.js → chunk-EHAGZJ34.js} +2 -2
  21. package/dist/tsup/{chunk-VXJ26VPL.cjs → chunk-FZIA3IQ2.cjs} +10 -10
  22. package/dist/tsup/{chunk-VXJ26VPL.cjs.map → chunk-FZIA3IQ2.cjs.map} +1 -1
  23. package/dist/tsup/{chunk-LHT3TRDM.js → chunk-J7WM3KL5.js} +115 -4
  24. package/dist/tsup/chunk-J7WM3KL5.js.map +1 -0
  25. package/dist/tsup/{chunk-XNLSA7TO.cjs → chunk-JJMBATG7.cjs} +4 -4
  26. package/dist/tsup/{chunk-XNLSA7TO.cjs.map → chunk-JJMBATG7.cjs.map} +1 -1
  27. package/dist/tsup/{chunk-ZXV3CG4Y.cjs → chunk-K3DXAJQ2.cjs} +7 -7
  28. package/dist/tsup/{chunk-ZXV3CG4Y.cjs.map → chunk-K3DXAJQ2.cjs.map} +1 -1
  29. package/dist/tsup/{chunk-YHYNYVNZ.js → chunk-M7FOORLQ.js} +3 -3
  30. package/dist/tsup/{chunk-2TAUHMAC.cjs → chunk-MRFLWAPE.cjs} +2 -2
  31. package/dist/tsup/chunk-MRFLWAPE.cjs.map +1 -0
  32. package/dist/tsup/{chunk-GPD77M3M.js → chunk-NNPIJLBE.js} +2 -2
  33. package/dist/tsup/chunk-NNPIJLBE.js.map +1 -0
  34. package/dist/tsup/{chunk-TFACXNOP.cjs → chunk-R75W2PPM.cjs} +121 -10
  35. package/dist/tsup/chunk-R75W2PPM.cjs.map +1 -0
  36. package/dist/tsup/{chunk-UBGN2UE2.cjs → chunk-SHAZSNYB.cjs} +3 -3
  37. package/dist/tsup/{chunk-UBGN2UE2.cjs.map → chunk-SHAZSNYB.cjs.map} +1 -1
  38. package/dist/tsup/{chunk-L6DNN72S.js → chunk-SLAKWYOH.js} +2 -2
  39. package/dist/tsup/{chunk-JTHHCZCZ.js → chunk-WCEJTJHO.js} +34 -1
  40. package/dist/tsup/chunk-WCEJTJHO.js.map +1 -0
  41. package/dist/tsup/{chunk-KVFIONKQ.cjs → chunk-XMNL3AE2.cjs} +35 -2
  42. package/dist/tsup/chunk-XMNL3AE2.cjs.map +1 -0
  43. package/dist/tsup/client/mod.cjs +6 -6
  44. package/dist/tsup/client/mod.d.cts +3 -3
  45. package/dist/tsup/client/mod.d.ts +3 -3
  46. package/dist/tsup/client/mod.js +5 -5
  47. package/dist/tsup/common/log.cjs +2 -2
  48. package/dist/tsup/common/log.js +1 -1
  49. package/dist/tsup/common/websocket.cjs +3 -3
  50. package/dist/tsup/common/websocket.js +2 -2
  51. package/dist/tsup/{config-ey2I2zz5.d.cts → config-B0q37XhG.d.cts} +31 -1
  52. package/dist/tsup/{config-ey2I2zz5.d.ts → config-B0q37XhG.d.ts} +31 -1
  53. package/dist/tsup/{config-BGTanB_3.d.ts → config-BPJQ0mDo.d.ts} +9 -1
  54. package/dist/tsup/{config-NHz6oMb9.d.cts → config-CGUJyT5L.d.cts} +9 -1
  55. package/dist/tsup/{context-SHomdVV8.d.ts → context-DZ_lu12i.d.ts} +2 -2
  56. package/dist/tsup/{context-DB8zG_Ib.d.cts → context-WLBsDXrQ.d.cts} +2 -2
  57. package/dist/tsup/db/drizzle.cjs +113 -10
  58. package/dist/tsup/db/drizzle.cjs.map +1 -1
  59. package/dist/tsup/db/drizzle.d.cts +2 -2
  60. package/dist/tsup/db/drizzle.d.ts +2 -2
  61. package/dist/tsup/db/drizzle.js +106 -3
  62. package/dist/tsup/db/drizzle.js.map +1 -1
  63. package/dist/tsup/db/mod.cjs +4 -4
  64. package/dist/tsup/db/mod.d.cts +4 -4
  65. package/dist/tsup/db/mod.d.ts +4 -4
  66. package/dist/tsup/db/mod.js +3 -3
  67. package/dist/tsup/dynamic/mod.d.cts +2 -2
  68. package/dist/tsup/dynamic/mod.d.ts +2 -2
  69. package/dist/tsup/inspector/mod.cjs +5 -5
  70. package/dist/tsup/inspector/mod.js +4 -4
  71. package/dist/tsup/inspector/workflow.cjs +4 -4
  72. package/dist/tsup/inspector/workflow.js +3 -3
  73. package/dist/tsup/inspector-tab/mod.d.cts +3 -3
  74. package/dist/tsup/inspector-tab/mod.d.ts +3 -3
  75. package/dist/tsup/mod.cjs +296 -88
  76. package/dist/tsup/mod.cjs.map +1 -1
  77. package/dist/tsup/mod.d.cts +4 -4
  78. package/dist/tsup/mod.d.ts +4 -4
  79. package/dist/tsup/mod.js +225 -17
  80. package/dist/tsup/mod.js.map +1 -1
  81. package/dist/tsup/test/mod.cjs +7 -7
  82. package/dist/tsup/test/mod.d.cts +2 -2
  83. package/dist/tsup/test/mod.d.ts +2 -2
  84. package/dist/tsup/test/mod.js +5 -5
  85. package/dist/tsup/unstable/migrations.d.cts +1 -1
  86. package/dist/tsup/unstable/migrations.d.ts +1 -1
  87. package/dist/tsup/utils.cjs +2 -2
  88. package/dist/tsup/utils.js +1 -1
  89. package/dist/tsup/workflow/mod.cjs +7 -7
  90. package/dist/tsup/workflow/mod.d.cts +4 -4
  91. package/dist/tsup/workflow/mod.d.ts +4 -4
  92. package/dist/tsup/workflow/mod.js +4 -4
  93. package/package.json +9 -9
  94. package/src/agent-os/actor/index.ts +6 -3
  95. package/src/agent-os/actor/preview.ts +5 -2
  96. package/src/client/actor-handle.ts +15 -8
  97. package/src/client/raw-utils.ts +14 -0
  98. package/src/common/database/config.ts +54 -0
  99. package/src/common/database/mod.test.ts +162 -1
  100. package/src/common/database/mod.ts +154 -6
  101. package/src/common/database/native-database.test.ts +81 -2
  102. package/src/common/database/native-database.ts +172 -3
  103. package/src/common/database/shared.ts +49 -1
  104. package/src/db/drizzle.test.ts +82 -1
  105. package/src/db/drizzle.ts +136 -6
  106. package/src/db/mod.ts +2 -0
  107. package/src/registry/napi-runtime.ts +71 -0
  108. package/src/registry/native.ts +48 -14
  109. package/src/registry/runtime.ts +46 -0
  110. package/src/registry/wasm-runtime.ts +63 -0
  111. package/dist/tsup/chunk-2TAUHMAC.cjs.map +0 -1
  112. package/dist/tsup/chunk-7ZPRFCTV.cjs.map +0 -1
  113. package/dist/tsup/chunk-GPD77M3M.js.map +0 -1
  114. package/dist/tsup/chunk-JTHHCZCZ.js.map +0 -1
  115. package/dist/tsup/chunk-KVFIONKQ.cjs.map +0 -1
  116. package/dist/tsup/chunk-LHT3TRDM.js.map +0 -1
  117. package/dist/tsup/chunk-OWSXJF7Z.js.map +0 -1
  118. package/dist/tsup/chunk-TFACXNOP.cjs.map +0 -1
  119. /package/dist/tsup/{chunk-ZYHZOZUQ.js.map → chunk-75H2CLHI.js.map} +0 -0
  120. /package/dist/tsup/{chunk-XPT7SGBW.js.map → chunk-BZOI63CT.js.map} +0 -0
  121. /package/dist/tsup/{chunk-M4RSGECU.js.map → chunk-EHAGZJ34.js.map} +0 -0
  122. /package/dist/tsup/{chunk-YHYNYVNZ.js.map → chunk-M7FOORLQ.js.map} +0 -0
  123. /package/dist/tsup/{chunk-L6DNN72S.js.map → chunk-SLAKWYOH.js.map} +0 -0
@@ -4,10 +4,11 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkKVFIONKQcjs = require('../chunk-KVFIONKQ.cjs');
8
7
 
8
+ var _chunkXMNL3AE2cjs = require('../chunk-XMNL3AE2.cjs');
9
9
 
10
- var _chunk2TAUHMACcjs = require('../chunk-2TAUHMAC.cjs');
10
+
11
+ var _chunkMRFLWAPEcjs = require('../chunk-MRFLWAPE.cjs');
11
12
  require('../chunk-2JSYYH6P.cjs');
12
13
 
13
14
  // src/db/drizzle.ts
@@ -74,6 +75,7 @@ function db({
74
75
  const nativeDb = await nativeDatabaseProvider.open(ctx.actorId);
75
76
  let closed = false;
76
77
  let manualTransactionWarned = false;
78
+ let synchronousTransactionActive = false;
77
79
  const ensureOpen = () => {
78
80
  if (closed) {
79
81
  throw new Error(
@@ -81,10 +83,18 @@ function db({
81
83
  );
82
84
  }
83
85
  };
86
+ const ensureSynchronousTransactionClient = (transactionScoped) => {
87
+ if (!transactionScoped && synchronousTransactionActive) {
88
+ throw new Error(
89
+ "Use the transaction callback's tx value for queries inside db.transactionSync()."
90
+ );
91
+ }
92
+ };
84
93
  const createDrizzleClient = (target, transactionScoped = false) => {
85
94
  const runSql = async (query, params, method) => {
86
95
  var _a, _b, _c, _d;
87
96
  ensureOpen();
97
+ ensureSynchronousTransactionClient(transactionScoped);
88
98
  warnForManualTransaction(query, transactionScoped);
89
99
  const start = performance.now();
90
100
  const kvReadsBefore = _nullishCoalesce(((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads), () => ( 0));
@@ -92,7 +102,7 @@ function db({
92
102
  try {
93
103
  const { rows } = await target.execute(
94
104
  query,
95
- _chunkKVFIONKQcjs.toSqliteBindings.call(void 0, params)
105
+ _chunkXMNL3AE2cjs.toSqliteBindings.call(void 0, params)
96
106
  );
97
107
  if (method === "run") {
98
108
  return { rows: [] };
@@ -122,6 +132,7 @@ function db({
122
132
  schema
123
133
  });
124
134
  drizzleDb.execute = async (query, ...args) => {
135
+ ensureSynchronousTransactionClient(transactionScoped);
125
136
  return await executeRaw(
126
137
  target,
127
138
  ctx,
@@ -131,9 +142,22 @@ function db({
131
142
  () => warnForManualTransaction(query, transactionScoped)
132
143
  );
133
144
  };
145
+ drizzleDb.executeSync = (query, ...args) => {
146
+ ensureSynchronousTransactionClient(transactionScoped);
147
+ return executeRawSync(
148
+ target,
149
+ ctx,
150
+ ensureOpen,
151
+ query,
152
+ args,
153
+ () => warnForManualTransaction(query, transactionScoped)
154
+ );
155
+ };
134
156
  drizzleDb.transaction = async (transactionCallback, options) => {
135
- _chunkKVFIONKQcjs.validateTransactionTimeout.call(void 0, options == null ? void 0 : options.timeout);
136
- _chunkKVFIONKQcjs.validateTransactionName.call(void 0, options == null ? void 0 : options.name);
157
+ ensureOpen();
158
+ ensureSynchronousTransactionClient(transactionScoped);
159
+ _chunkXMNL3AE2cjs.validateTransactionTimeout.call(void 0, options == null ? void 0 : options.timeout);
160
+ _chunkXMNL3AE2cjs.validateTransactionName.call(void 0, options == null ? void 0 : options.name);
137
161
  const transaction = await nativeDb.beginTransaction(
138
162
  options == null ? void 0 : options.timeout,
139
163
  options == null ? void 0 : options.name
@@ -151,6 +175,33 @@ function db({
151
175
  throw error;
152
176
  }
153
177
  };
178
+ drizzleDb.transactionSync = (transactionCallback, options) => {
179
+ ensureOpen();
180
+ if (transactionScoped || synchronousTransactionActive) {
181
+ throw new Error(
182
+ "Nested synchronous SQLite transactions are not supported."
183
+ );
184
+ }
185
+ return _chunkXMNL3AE2cjs.runSqliteTransactionSync.call(void 0,
186
+ nativeDb,
187
+ (transaction) => {
188
+ const transactionClient = createDrizzleClient(
189
+ transaction,
190
+ true
191
+ );
192
+ const tx = {
193
+ executeSync: transactionClient.executeSync
194
+ };
195
+ synchronousTransactionActive = true;
196
+ try {
197
+ return transactionCallback(tx);
198
+ } finally {
199
+ synchronousTransactionActive = false;
200
+ }
201
+ },
202
+ options
203
+ );
204
+ };
154
205
  drizzleDb.close = async () => {
155
206
  if (!closed) {
156
207
  closed = true;
@@ -160,13 +211,13 @@ function db({
160
211
  return drizzleDb;
161
212
  };
162
213
  const warnForManualTransaction = (query, transactionScoped) => {
163
- if (transactionScoped || !warnOnManualTransactions || manualTransactionWarned || hasMultipleStatements(query) || !_chunkKVFIONKQcjs.isManualTransactionControl.call(void 0, query)) {
214
+ if (transactionScoped || !warnOnManualTransactions || manualTransactionWarned || hasMultipleStatements(query) || !_chunkXMNL3AE2cjs.isManualTransactionControl.call(void 0, query)) {
164
215
  return;
165
216
  }
166
217
  manualTransactionWarned = true;
167
- _chunk2TAUHMACcjs.getLogger.call(void 0, "database").warn(
218
+ _chunkMRFLWAPEcjs.getLogger.call(void 0, "database").warn(
168
219
  { actorId: ctx.actorId },
169
- "Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning."
220
+ "Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() or db.transactionSync() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning."
170
221
  );
171
222
  };
172
223
  return createDrizzleClient(nativeDb);
@@ -209,7 +260,7 @@ async function withMigrationSavepoint(client, callback) {
209
260
  },
210
261
  {
211
262
  name: "rivetkit-drizzle-migration",
212
- timeout: _chunkKVFIONKQcjs.MIGRATION_TRANSACTION_TIMEOUT_MS
263
+ timeout: _chunkXMNL3AE2cjs.MIGRATION_TRANSACTION_TIMEOUT_MS
213
264
  }
214
265
  );
215
266
  }
@@ -277,7 +328,7 @@ async function executeRaw(db2, ctx, ensureOpen, query, args, warnForManualTransa
277
328
  if (args.length > 0) {
278
329
  const { rows, columns } = await db2.execute(
279
330
  query,
280
- _chunkKVFIONKQcjs.toSqliteBindings.call(void 0, args)
331
+ _chunkXMNL3AE2cjs.toSqliteBindings.call(void 0, args)
281
332
  );
282
333
  return rows.map((row) => rowToObject(row, columns));
283
334
  }
@@ -308,6 +359,58 @@ async function executeRaw(db2, ctx, ensureOpen, query, args, warnForManualTransa
308
359
  }
309
360
  }
310
361
  }
362
+ function executeRawSync(db2, ctx, ensureOpen, query, args, warnForManualTransaction) {
363
+ var _a, _b, _c, _d;
364
+ ensureOpen();
365
+ warnForManualTransaction();
366
+ if (!db2.executeSync) {
367
+ throw new Error(
368
+ "Synchronous SQLite queries are only available in the Node.js native runtime."
369
+ );
370
+ }
371
+ const start = performance.now();
372
+ const kvReadsBefore = _nullishCoalesce(((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads), () => ( 0));
373
+ const kvWritesBefore = _nullishCoalesce(((_b = ctx.metrics) == null ? void 0 : _b.totalKvWrites), () => ( 0));
374
+ try {
375
+ if (args.length > 0) {
376
+ const { rows, columns } = db2.executeSync(
377
+ query,
378
+ _chunkXMNL3AE2cjs.toSqliteBindings.call(void 0, args)
379
+ );
380
+ return rows.map((row) => rowToObject(row, columns));
381
+ }
382
+ if (!hasMultipleStatements(query)) {
383
+ const { rows, columns } = db2.executeSync(query, void 0);
384
+ return rows.map((row) => rowToObject(row, columns));
385
+ }
386
+ if (!db2.execSync) {
387
+ throw new Error(
388
+ "Synchronous SQLite queries are only available in the Node.js native runtime."
389
+ );
390
+ }
391
+ const results = [];
392
+ let columnNames = null;
393
+ db2.execSync(query, (row, columns) => {
394
+ if (!columnNames) {
395
+ columnNames = columns;
396
+ }
397
+ results.push(rowToObject(row, columnNames));
398
+ });
399
+ return results;
400
+ } finally {
401
+ const durationMs = performance.now() - start;
402
+ (_c = ctx.metrics) == null ? void 0 : _c.trackSql(query, durationMs);
403
+ if (ctx.metrics) {
404
+ (_d = ctx.log) == null ? void 0 : _d.debug({
405
+ msg: "sql query",
406
+ query: query.slice(0, 120),
407
+ durationMs,
408
+ kvReads: ctx.metrics.totalKvReads - kvReadsBefore,
409
+ kvWrites: ctx.metrics.totalKvWrites - kvWritesBefore
410
+ });
411
+ }
412
+ }
413
+ }
311
414
 
312
415
 
313
416
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/actors/actors/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/actors/actors/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\tSqliteProfilingOptions,\n\tSqliteTransactionOptions,\n\tSqliteDatabase,\n\tSqliteTransactionDatabase,\n} from \"@/common/database/config\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\ttoSqliteBindings,\n\tvalidateTransactionName,\n\tvalidateTransactionTimeout,\n} 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: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,\n\t\t\toptions?: SqliteTransactionOptions,\n\t\t) => Promise<T>;\n\t};\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\nexport interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\n\tprofiling?: SqliteProfilingOptions;\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\twarnOnManualTransactions = true,\n\tprofiling,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tsqliteProfiling: profiling,\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 manualTransactionWarned = 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 = (\n\t\t\t\ttarget: SqliteDatabase | SqliteTransactionDatabase,\n\t\t\t\ttransactionScoped = false,\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\twarnForManualTransaction(query, transactionScoped);\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 target.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);\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\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\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\toptions?: SqliteTransactionOptions,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tvalidateTransactionName(options?.name);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\n\t\t\t\t\t\toptions?.name,\n\t\t\t\t\t);\n\t\t\t\t\tconst tx = createDrizzleClient(transaction, 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 transaction.commit();\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 transaction.rollback();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after expiry cleanup.\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.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\tconst warnForManualTransaction = (\n\t\t\t\tquery: string,\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\ttransactionScoped ||\n\t\t\t\t\t!warnOnManualTransactions ||\n\t\t\t\t\tmanualTransactionWarned ||\n\t\t\t\t\thasMultipleStatements(query) ||\n\t\t\t\t\t!isManualTransactionControl(query)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmanualTransactionWarned = true;\n\t\t\t\tgetLogger(\"database\").warn(\n\t\t\t\t\t{ actorId: ctx.actorId },\n\t\t\t\t\t\"Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning.\",\n\t\t\t\t);\n\t\t\t};\n\n\t\t\treturn createDrizzleClient(nativeDb);\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.transaction(\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\t{\n\t\t\tname: \"rivetkit-drizzle-migration\",\n\t\t\ttimeout: MIGRATION_TRANSACTION_TIMEOUT_MS,\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 | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): Promise<TRow[]> {\n\tensureOpen();\n\twarnForManualTransaction();\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);\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);\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(query, (row, columns) => {\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\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/actors/actors/rivetkit-typescript/packages/rivetkit/dist/tsup/db/drizzle.cjs","../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"names":["db"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACA;ACbA;AACC;AAAA,uDAGM;ADaP;AACA;AEOA,MAAA,SAAsB,SAAA,CAAU,KAAA,EAAgC;AAzBhE,EAAA,IAAA,EAAA;AA0BC,EAAA,GAAA,CAAI,CAAA,CAAA,CAAC,GAAA,EAAA,UAAA,CAAW,MAAA,EAAA,GAAX,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAmB,MAAA,CAAA,EAAQ;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,sDAAsD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,OAAA,EAAS,MAAM,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,IAC7C,SAAA;AAAA,IACA,IAAI,WAAA,CAAY,CAAA,CAAE,MAAA,CAAO,KAAK;AAAA,EAC/B,CAAA;AACA,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IAAK,IAAI,UAAA,CAAW,MAAM,CAAA;AAAA,IAAG,CAAC,IAAA,EAAA,GAC1C,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG;AAAA,EAClC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACV;AFJA;AACA;ACPA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,qDACM;AAyCA,SAAS,YAAA,CACf,MAAA,EACkC;AAClC,EAAA,OAAO;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,GAAG;AAAA,EACJ,CAAA;AACD;AAEO,SAAS,EAAA,CAA0D;AAAA,EACzE,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,yBAAA,EAA2B,IAAA;AAAA,EAC3B;AACD,EAAA,EAA2C,CAAC,CAAA,EAE1C;AACD,EAAA,OAAO;AAAA,IACN,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,MAAA,CAAO,GAAA,EAAA,GAAQ;AAC5B,MAAA,MAAM,SAAA,EAAW,GAAA,CAAI,8BAAA,EAClB,MAAM,GAAA,CAAI,6BAAA,CAA8B,EAAA,EACxC,KAAA,CAAA;AACH,MAAA,GAAA,CAAI,QAAA,EAAU;AACb,QAAA,OAAO,QAAA;AAAA,MACR;AAEA,MAAA,MAAM,uBAAA,EAAyB,GAAA,CAAI,sBAAA;AACnC,MAAA,GAAA,CAAI,CAAC,sBAAA,EAAwB;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACT;AAAA,QACD,CAAA;AAAA,MACD;AAEA,MAAA,MAAM,SAAA,EAAW,MAAM,sBAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC9D,MAAA,IAAI,OAAA,EAAS,KAAA;AACb,MAAA,IAAI,wBAAA,EAA0B,KAAA;AAC9B,MAAA,IAAI,6BAAA,EAA+B,KAAA;AACnC,MAAA,MAAM,WAAA,EAAa,CAAA,EAAA,GAAM;AACxB,QAAA,GAAA,CAAI,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA;AAAA,YACT;AAAA,UACD,CAAA;AAAA,QACD;AAAA,MACD,CAAA;AACA,MAAA,MAAM,mCAAA,EAAqC,CAC1C,iBAAA,EAAA,GACI;AACJ,QAAA,GAAA,CAAI,CAAC,kBAAA,GAAqB,4BAAA,EAA8B;AACvD,UAAA,MAAM,IAAI,KAAA;AAAA,YACT;AAAA,UACD,CAAA;AAAA,QACD;AAAA,MACD,CAAA;AAEA,MAAA,MAAM,oBAAA,EAAsB,CAC3B,MAAA,EACA,kBAAA,EAAoB,KAAA,EAAA,GACU;AAC9B,QAAA,MAAM,OAAA,EAAS,MAAA,CACd,KAAA,EACA,MAAA,EACA,MAAA,EAAA,GACI;AAhJT,UAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiJK,UAAA,UAAA,CAAW,CAAA;AACX,UAAA,kCAAA,CAAmC,iBAAiB,CAAA;AACpD,UAAA,wBAAA,CAAyB,KAAA,EAAO,iBAAiB,CAAA;AAEjD,UAAA,MAAM,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,CAAA;AAC9B,UAAA,MAAM,cAAA,mBAAA,CAAA,CAAgB,GAAA,EAAA,GAAA,CAAI,OAAA,EAAA,GAAJ,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAa,YAAA,CAAA,UAAgB,GAAA;AACnD,UAAA,MAAM,eAAA,mBAAA,CAAA,CAAiB,GAAA,EAAA,GAAA,CAAI,OAAA,EAAA,GAAJ,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAa,aAAA,CAAA,UAAiB,GAAA;AACrD,UAAA,IAAI;AACH,YAAA,MAAM,EAAE,KAAK,EAAA,EAAI,MAAM,MAAA,CAAO,OAAA;AAAA,cAC7B,KAAA;AAAA,cACA,gDAAA,MAAuB;AAAA,YACxB,CAAA;AACA,YAAA,GAAA,CAAI,OAAA,IAAW,KAAA,EAAO;AACrB,cAAA,OAAO,EAAE,IAAA,EAAM,CAAC,EAAE,CAAA;AAAA,YACnB;AACA,YAAA,GAAA,CAAI,OAAA,IAAW,KAAA,EAAO;AACrB,cAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,EAAE,CAAA;AAAA,YACxB;AACA,YAAA,OAAO,EAAE,KAAK,CAAA;AAAA,UACf,EAAA,QAAE;AACD,YAAA,MAAM,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,KAAA;AACvC,YAAA,CAAA,GAAA,EAAA,GAAA,CAAI,OAAA,EAAA,GAAJ,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAa,QAAA,CAAS,KAAA,EAAO,UAAA,CAAA;AAC7B,YAAA,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS;AAChB,cAAA,CAAA,GAAA,EAAA,GAAA,CAAI,GAAA,EAAA,GAAJ,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAS,KAAA,CAAM;AAAA,gBACd,GAAA,EAAK,WAAA;AAAA,gBACL,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,gBACzB,UAAA;AAAA,gBACA,OAAA,EACC,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,aAAA;AAAA,gBAC5B,QAAA,EACC,GAAA,CAAI,OAAA,CAAQ,cAAA,EAAgB;AAAA,cAC9B,CAAA,CAAA;AAAA,YACD;AAAA,UACD;AAAA,QACD,CAAA;AAEA,QAAA,MAAM,SAAA,EAA2B,MAAA,CAChC,KAAA,EACA,MAAA,EACA,MAAA,EAAA,GACI;AACJ,UAAA,OAAO,MAAM,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,QAC1C,CAAA;AAEA,QAAA,MAAM,UAAA,EAAY,kCAAA,QAAQ,EAAU;AAAA,UACnC;AAAA,QACD,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,QAAA,EAAU,MAAA,CAMnB,KAAA,EAAA,GACG,IAAA,EAAA,GACkB;AACrB,UAAA,kCAAA,CAAmC,iBAAiB,CAAA;AACpD,UAAA,OAAO,MAAM,UAAA;AAAA,YACZ,MAAA;AAAA,YACA,GAAA;AAAA,YACA,UAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,CAAA,EAAA,GACC,wBAAA,CAAyB,KAAA,EAAO,iBAAiB;AAAA,UACnD,CAAA;AAAA,QACD,CAAA;AACA,QAAA,SAAA,CAAU,YAAA,EAAc,CAMvB,KAAA,EAAA,GACG,IAAA,EAAA,GACS;AACZ,UAAA,kCAAA,CAAmC,iBAAiB,CAAA;AACpD,UAAA,OAAO,cAAA;AAAA,YACN,MAAA;AAAA,YACA,GAAA;AAAA,YACA,UAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,CAAA,EAAA,GACC,wBAAA,CAAyB,KAAA,EAAO,iBAAiB;AAAA,UACnD,CAAA;AAAA,QACD,CAAA;AACA,QAAA,SAAA,CAAU,YAAA,EAAc,MAAA,CACvB,mBAAA,EAGA,OAAA,EAAA,GACgB;AAChB,UAAA,UAAA,CAAW,CAAA;AACX,UAAA,kCAAA,CAAmC,iBAAiB,CAAA;AACpD,UAAA,0DAAA,QAA2B,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS,OAAO,CAAA;AAC3C,UAAA,uDAAA,QAAwB,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS,IAAI,CAAA;AACrC,UAAA,MAAM,YAAA,EAAc,MAAM,QAAA,CAAS,gBAAA;AAAA,YAClC,QAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS,OAAA;AAAA,YACT,QAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,OAAA,CAAS;AAAA,UACV,CAAA;AACA,UAAA,MAAM,GAAA,EAAK,mBAAA,CAAoB,WAAA,EAAa,IAAI,CAAA;AAChD,UAAA,IAAI;AACH,YAAA,MAAM,OAAA,EAAS,MAAM,mBAAA,CAAoB,EAAE,CAAA;AAC3C,YAAA,MAAM,WAAA,CAAY,MAAA,CAAO,CAAA;AACzB,YAAA,OAAO,MAAA;AAAA,UACR,EAAA,MAAA,CAAS,KAAA,EAAO;AACf,YAAA,IAAI;AACH,cAAA,MAAM,WAAA,CAAY,QAAA,CAAS,CAAA;AAAA,YAC5B,EAAA,UAAQ;AAAA,YAER;AACA,YAAA,MAAM,KAAA;AAAA,UACP;AAAA,QACD,CAAA;AACA,QAAA,SAAA,CAAU,gBAAA,EAAkB,CAC3B,mBAAA,EAGA,OAAA,EAAA,GACO;AACP,UAAA,UAAA,CAAW,CAAA;AACX,UAAA,GAAA,CAAI,kBAAA,GAAqB,4BAAA,EAA8B;AACtD,YAAA,MAAM,IAAI,KAAA;AAAA,cACT;AAAA,YACD,CAAA;AAAA,UACD;AACA,UAAA,OAAO,wDAAA;AAAA,YACN,QAAA;AAAA,YACA,CAAC,WAAA,EAAA,GAAgB;AAChB,cAAA,MAAM,kBAAA,EAAoB,mBAAA;AAAA,gBACzB,WAAA;AAAA,gBACA;AAAA,cACD,CAAA;AACA,cAAA,MAAM,GAAA,EAAmC;AAAA,gBACxC,WAAA,EAAa,iBAAA,CAAkB;AAAA,cAChC,CAAA;AACA,cAAA,6BAAA,EAA+B,IAAA;AAC/B,cAAA,IAAI;AACH,gBAAA,OAAO,mBAAA,CAAoB,EAAE,CAAA;AAAA,cAC9B,EAAA,QAAE;AACD,gBAAA,6BAAA,EAA+B,KAAA;AAAA,cAChC;AAAA,YACD,CAAA;AAAA,YACA;AAAA,UACD,CAAA;AAAA,QACD,CAAA;AACA,QAAA,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAA,EAAA,GAAY;AAC7B,UAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACZ,YAAA,OAAA,EAAS,IAAA;AACT,YAAA,MAAM,QAAA,CAAS,KAAA,CAAM,CAAA;AAAA,UACtB;AAAA,QACD,CAAA;AAEA,QAAA,OAAO,SAAA;AAAA,MACR,CAAA;AAEA,MAAA,MAAM,yBAAA,EAA2B,CAChC,KAAA,EACA,iBAAA,EAAA,GACI;AACJ,QAAA,GAAA,CACC,kBAAA,GACA,CAAC,yBAAA,GACD,wBAAA,GACA,qBAAA,CAAsB,KAAK,EAAA,GAC3B,CAAC,0DAAA,KAAgC,CAAA,EAChC;AACD,UAAA,MAAA;AAAA,QACD;AACA,QAAA,wBAAA,EAA0B,IAAA;AAC1B,QAAA,yCAAA,UAAoB,CAAA,CAAE,IAAA;AAAA,UACrB,EAAE,OAAA,EAAS,GAAA,CAAI,QAAQ,CAAA;AAAA,UACvB;AAAA,QACD,CAAA;AAAA,MACD,CAAA;AAEA,MAAA,OAAO,mBAAA,CAAoB,QAAQ,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,MAAA,EAAA,GAAW;AAC5B,MAAA,GAAA,CAAI,CAAC,WAAA,GAAc,CAAC,SAAA,EAAW;AAC9B,QAAA,MAAA;AAAA,MACD;AACA,MAAA,MAAM,sBAAA,CAAuB,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAA,GAAW;AACtD,QAAA,GAAA,CAAI,UAAA,EAAY;AACf,UAAA,MAAM,aAAA,CAAc,MAAA,EAAQ,UAAU,CAAA;AAAA,QACvC;AACA,QAAA,GAAA,CAAI,SAAA,EAAW;AACd,UAAA,MAAM,SAAA,CAAU,MAAM,CAAA;AAAA,QACvB;AAAA,MACD,CAAC,CAAA;AAAA,IACF;AAAA,EACD,CAAA;AACD;AAEA,MAAA,SAAe,sBAAA,CACd,MAAA,EACA,QAAA,EACa;AACb,EAAA,OAAO,MAAM,MAAA,CAAO,WAAA;AAAA,IACnB,MAAA,CAAO,MAAA,EAAA,GAAW;AACjB,MAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,8BAA8B,CAAA;AACnD,MAAA,IAAI;AACH,QAAA,MAAM,OAAA,EAAS,MAAM,QAAA,CAAS,MAAM,CAAA;AACpC,QAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,sCAAsC,CAAA;AAC3D,QAAA,OAAO,MAAA;AAAA,MACR,EAAA,MAAA,CAAS,KAAA,EAAO;AACf,QAAA,IAAI;AACH,UAAA,MAAM,MAAA,CAAO,OAAA;AAAA,YACZ;AAAA,UACD,CAAA;AAAA,QACD,EAAA,QAAE;AACD,UAAA,MAAM,MAAA,CAAO,OAAA;AAAA,YACZ;AAAA,UACD,CAAA;AAAA,QACD;AACA,QAAA,MAAM,KAAA;AAAA,MACP;AAAA,IACD,CAAA;AAAA,IACA;AAAA,MACC,IAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAS;AAAA,IACV;AAAA,EACD,CAAA;AACD;AAEA,MAAA,SAAe,aAAA,CACdA,GAAAA,EACA,UAAA,EACC;AAtXF,EAAA,IAAA,EAAA;AAuXC,EAAA,MAAM,QAAA,EAAU,qBAAA,CAAsB,UAAA,CAAW,OAAO,CAAA;AAExD,EAAA,MAAMA,GAAAA,CAAG,OAAA,CAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAMhB,CAAA;AAED,EAAA,MAAM,KAAA,EAAO,MAAMA,GAAAA,CAAG,OAAA;AAAA,IACrB;AAAA,EACD,CAAA;AACA,EAAA,MAAM,cAAA,mBAAA,CAAA,CAAgB,GAAA,EAAA,IAAA,CAAK,CAAC,CAAA,EAAA,GAAN,KAAA,EAAA,KAAA,EAAA,EAAA,EAAA,CAAS,UAAA,CAAA,UAAc,GAAA;AAE7C,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,OAAA,CAAQ,OAAA,EAAS;AACpC,IAAA,GAAA,CAAI,cAAA,GAAiB,KAAA,CAAM,IAAA,EAAM;AAChC,MAAA,QAAA;AAAA,IACD;AAEA,IAAA,MAAM,IAAA,EAAM,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACV,IAAA;AACd,IAAA;AAClB,MAAA;AACwB,QAAA;AAClC,MAAA;AACD,IAAA;AAGQ,IAAA;AAG4B,IAAA;AACT,MAAA;AAC3B,IAAA;AAES,IAAA;AACR,MAAA;AACyB,MAAA;AACnB,MAAA;AACP,IAAA;AACD,EAAA;AACD;AAIE;AAIE,EAAA;AAGiD,IAAA;AACpD,EAAA;AAEO,EAAA;AACR;AAEuD;AACE,EAAA;AAC7B,EAAA;AAC5B;AAKQ;AACkC,EAAA;AACA,EAAA;AACd,IAAA;AAC3B,EAAA;AACO,EAAA;AACR;AAOC;AAvcD,EAAA;AA0cY,EAAA;AACc,EAAA;AAEK,EAAA;AACR,EAAA;AACC,EAAA;AACnB,EAAA;AACkB,IAAA;AACe,MAAA;AAClC,QAAA;AACqB,QAAA;AACtB,MAAA;AACwD,MAAA;AACzD,IAAA;AAEmC,IAAA;AACgB,MAAA;AACM,MAAA;AACzD,IAAA;AAE4C,IAAA;AACT,IAAA;AACI,IAAA;AACpB,MAAA;AACH,QAAA;AACf,MAAA;AAC0C,MAAA;AAC1C,IAAA;AACM,IAAA;AACN,EAAA;AACsC,IAAA;AACjB,IAAA;AACL,IAAA;AACD,MAAA;AACT,QAAA;AACoB,QAAA;AACzB,QAAA;AACoC,QAAA;AACE,QAAA;AACvC,MAAA;AACD,IAAA;AACD,EAAA;AACD;AAOC;AA3fD,EAAA;AA8fY,EAAA;AACc,EAAA;AACJ,EAAA;AACV,IAAA;AACT,MAAA;AACD,IAAA;AACD,EAAA;AAE8B,EAAA;AACR,EAAA;AACC,EAAA;AACnB,EAAA;AACkB,IAAA;AACS,MAAA;AAC5B,QAAA;AACqB,QAAA;AACtB,MAAA;AACwD,MAAA;AACzD,IAAA;AAEmC,IAAA;AACc,MAAA;AACQ,MAAA;AACzD,IAAA;AAEkB,IAAA;AACP,MAAA;AACT,QAAA;AACD,MAAA;AACD,IAAA;AAC4C,IAAA;AACT,IAAA;AACE,IAAA;AAClB,MAAA;AACH,QAAA;AACf,MAAA;AAC0C,MAAA;AAC1C,IAAA;AACM,IAAA;AACN,EAAA;AACsC,IAAA;AACjB,IAAA;AACL,IAAA;AACD,MAAA;AACT,QAAA;AACoB,QAAA;AACzB,QAAA;AACoC,QAAA;AACE,QAAA;AACvC,MAAA;AACD,IAAA;AACD,EAAA;AACD;ADrJ0D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/actors/actors/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\tSqliteDatabase,\n\tSqliteProfilingOptions,\n\tSqliteTransactionDatabase,\n\tSqliteTransactionOptions,\n\tSynchronousRawAccess,\n\tSynchronousTransactionAccess,\n} from \"@/common/database/config\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\trunSqliteTransactionSync,\n\ttoSqliteBindings,\n\tvalidateTransactionName,\n\tvalidateTransactionTimeout,\n} from \"@/common/database/shared\";\nimport { getLogger } from \"@/common/log\";\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<SynchronousRawAccess, \"transaction\"> & {\n\t\ttransaction: <T>(\n\t\t\tcallback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,\n\t\t\toptions?: SqliteTransactionOptions,\n\t\t) => Promise<T>;\n\t};\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\nexport interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\n\tprofiling?: SqliteProfilingOptions;\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\twarnOnManualTransactions = true,\n\tprofiling,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tsqliteProfiling: profiling,\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 manualTransactionWarned = false;\n\t\t\tlet synchronousTransactionActive = 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\t\t\tconst ensureSynchronousTransactionClient = (\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (!transactionScoped && synchronousTransactionActive) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Use the transaction callback's tx value for queries inside db.transactionSync().\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (\n\t\t\t\ttarget: SqliteDatabase | SqliteTransactionDatabase,\n\t\t\t\ttransactionScoped = false,\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\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\twarnForManualTransaction(query, transactionScoped);\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 target.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);\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\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.executeSync = <\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): TRow[] => {\n\t\t\t\t\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\treturn executeRawSync<TRow>(\n\t\t\t\t\t\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\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\toptions?: SqliteTransactionOptions,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tvalidateTransactionName(options?.name);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\n\t\t\t\t\t\toptions?.name,\n\t\t\t\t\t);\n\t\t\t\t\tconst tx = createDrizzleClient(transaction, 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 transaction.commit();\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 transaction.rollback();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after expiry cleanup.\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.transactionSync = <T>(\n\t\t\t\t\ttransactionCallback: (\n\t\t\t\t\t\ttx: SynchronousTransactionAccess,\n\t\t\t\t\t) => T,\n\t\t\t\t\toptions?: Omit<SqliteTransactionOptions, \"experimental\">,\n\t\t\t\t): T => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (transactionScoped || synchronousTransactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested synchronous SQLite transactions are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn runSqliteTransactionSync(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\t(transaction) => {\n\t\t\t\t\t\t\tconst transactionClient = createDrizzleClient(\n\t\t\t\t\t\t\t\ttransaction,\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst tx: SynchronousTransactionAccess = {\n\t\t\t\t\t\t\t\texecuteSync: transactionClient.executeSync,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsynchronousTransactionActive = true;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn transactionCallback(tx);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tsynchronousTransactionActive = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions,\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\tconst warnForManualTransaction = (\n\t\t\t\tquery: string,\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\ttransactionScoped ||\n\t\t\t\t\t!warnOnManualTransactions ||\n\t\t\t\t\tmanualTransactionWarned ||\n\t\t\t\t\thasMultipleStatements(query) ||\n\t\t\t\t\t!isManualTransactionControl(query)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmanualTransactionWarned = true;\n\t\t\t\tgetLogger(\"database\").warn(\n\t\t\t\t\t{ actorId: ctx.actorId },\n\t\t\t\t\t\"Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() or db.transactionSync() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning.\",\n\t\t\t\t);\n\t\t\t};\n\n\t\t\treturn createDrizzleClient(nativeDb);\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.transaction(\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\t{\n\t\t\tname: \"rivetkit-drizzle-migration\",\n\t\t\ttimeout: MIGRATION_TRANSACTION_TIMEOUT_MS,\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 | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): Promise<TRow[]> {\n\tensureOpen();\n\twarnForManualTransaction();\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);\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);\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(query, (row, columns) => {\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\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\nfunction executeRawSync<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): TRow[] {\n\tensureOpen();\n\twarnForManualTransaction();\n\tif (!db.executeSync) {\n\t\tthrow new Error(\n\t\t\t\"Synchronous SQLite queries are only available in the Node.js native runtime.\",\n\t\t);\n\t}\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 } = db.executeSync(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\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 } = db.executeSync(query, undefined);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!db.execSync) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Synchronous SQLite queries are only available in the Node.js native runtime.\",\n\t\t\t);\n\t\t}\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tdb.execSync(query, (row, columns) => {\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\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,9 +1,9 @@
1
1
  import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
2
- import { R as RawAccess, S as SqliteTransactionOptions, a as SqliteProfilingOptions, D as DatabaseProvider } from '../config-ey2I2zz5.cjs';
2
+ import { S as SynchronousRawAccess, a as SqliteTransactionOptions, b as SqliteProfilingOptions, D as DatabaseProvider } from '../config-B0q37XhG.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"> & Omit<RawAccess, "transaction"> & {
6
+ type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<SynchronousRawAccess, "transaction"> & {
7
7
  transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?: SqliteTransactionOptions) => Promise<T>;
8
8
  };
9
9
  interface DrizzleMigrations {
@@ -1,9 +1,9 @@
1
1
  import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
2
- import { R as RawAccess, S as SqliteTransactionOptions, a as SqliteProfilingOptions, D as DatabaseProvider } from '../config-ey2I2zz5.js';
2
+ import { S as SynchronousRawAccess, a as SqliteTransactionOptions, b as SqliteProfilingOptions, D as DatabaseProvider } from '../config-B0q37XhG.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"> & Omit<RawAccess, "transaction"> & {
6
+ type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<SynchronousRawAccess, "transaction"> & {
7
7
  transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?: SqliteTransactionOptions) => Promise<T>;
8
8
  };
9
9
  interface DrizzleMigrations {
@@ -1,13 +1,14 @@
1
1
  import {
2
2
  MIGRATION_TRANSACTION_TIMEOUT_MS,
3
3
  isManualTransactionControl,
4
+ runSqliteTransactionSync,
4
5
  toSqliteBindings,
5
6
  validateTransactionName,
6
7
  validateTransactionTimeout
7
- } from "../chunk-JTHHCZCZ.js";
8
+ } from "../chunk-WCEJTJHO.js";
8
9
  import {
9
10
  getLogger
10
- } from "../chunk-GPD77M3M.js";
11
+ } from "../chunk-NNPIJLBE.js";
11
12
  import "../chunk-OUQUIBVW.js";
12
13
 
13
14
  // src/db/drizzle.ts
@@ -74,6 +75,7 @@ function db({
74
75
  const nativeDb = await nativeDatabaseProvider.open(ctx.actorId);
75
76
  let closed = false;
76
77
  let manualTransactionWarned = false;
78
+ let synchronousTransactionActive = false;
77
79
  const ensureOpen = () => {
78
80
  if (closed) {
79
81
  throw new Error(
@@ -81,10 +83,18 @@ function db({
81
83
  );
82
84
  }
83
85
  };
86
+ const ensureSynchronousTransactionClient = (transactionScoped) => {
87
+ if (!transactionScoped && synchronousTransactionActive) {
88
+ throw new Error(
89
+ "Use the transaction callback's tx value for queries inside db.transactionSync()."
90
+ );
91
+ }
92
+ };
84
93
  const createDrizzleClient = (target, transactionScoped = false) => {
85
94
  const runSql = async (query, params, method) => {
86
95
  var _a, _b, _c, _d;
87
96
  ensureOpen();
97
+ ensureSynchronousTransactionClient(transactionScoped);
88
98
  warnForManualTransaction(query, transactionScoped);
89
99
  const start = performance.now();
90
100
  const kvReadsBefore = ((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads) ?? 0;
@@ -122,6 +132,7 @@ function db({
122
132
  schema
123
133
  });
124
134
  drizzleDb.execute = async (query, ...args) => {
135
+ ensureSynchronousTransactionClient(transactionScoped);
125
136
  return await executeRaw(
126
137
  target,
127
138
  ctx,
@@ -131,7 +142,20 @@ function db({
131
142
  () => warnForManualTransaction(query, transactionScoped)
132
143
  );
133
144
  };
145
+ drizzleDb.executeSync = (query, ...args) => {
146
+ ensureSynchronousTransactionClient(transactionScoped);
147
+ return executeRawSync(
148
+ target,
149
+ ctx,
150
+ ensureOpen,
151
+ query,
152
+ args,
153
+ () => warnForManualTransaction(query, transactionScoped)
154
+ );
155
+ };
134
156
  drizzleDb.transaction = async (transactionCallback, options) => {
157
+ ensureOpen();
158
+ ensureSynchronousTransactionClient(transactionScoped);
135
159
  validateTransactionTimeout(options == null ? void 0 : options.timeout);
136
160
  validateTransactionName(options == null ? void 0 : options.name);
137
161
  const transaction = await nativeDb.beginTransaction(
@@ -151,6 +175,33 @@ function db({
151
175
  throw error;
152
176
  }
153
177
  };
178
+ drizzleDb.transactionSync = (transactionCallback, options) => {
179
+ ensureOpen();
180
+ if (transactionScoped || synchronousTransactionActive) {
181
+ throw new Error(
182
+ "Nested synchronous SQLite transactions are not supported."
183
+ );
184
+ }
185
+ return runSqliteTransactionSync(
186
+ nativeDb,
187
+ (transaction) => {
188
+ const transactionClient = createDrizzleClient(
189
+ transaction,
190
+ true
191
+ );
192
+ const tx = {
193
+ executeSync: transactionClient.executeSync
194
+ };
195
+ synchronousTransactionActive = true;
196
+ try {
197
+ return transactionCallback(tx);
198
+ } finally {
199
+ synchronousTransactionActive = false;
200
+ }
201
+ },
202
+ options
203
+ );
204
+ };
154
205
  drizzleDb.close = async () => {
155
206
  if (!closed) {
156
207
  closed = true;
@@ -166,7 +217,7 @@ function db({
166
217
  manualTransactionWarned = true;
167
218
  getLogger("database").warn(
168
219
  { actorId: ctx.actorId },
169
- "Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning."
220
+ "Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() or db.transactionSync() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning."
170
221
  );
171
222
  };
172
223
  return createDrizzleClient(nativeDb);
@@ -308,6 +359,58 @@ async function executeRaw(db2, ctx, ensureOpen, query, args, warnForManualTransa
308
359
  }
309
360
  }
310
361
  }
362
+ function executeRawSync(db2, ctx, ensureOpen, query, args, warnForManualTransaction) {
363
+ var _a, _b, _c, _d;
364
+ ensureOpen();
365
+ warnForManualTransaction();
366
+ if (!db2.executeSync) {
367
+ throw new Error(
368
+ "Synchronous SQLite queries are only available in the Node.js native runtime."
369
+ );
370
+ }
371
+ const start = performance.now();
372
+ const kvReadsBefore = ((_a = ctx.metrics) == null ? void 0 : _a.totalKvReads) ?? 0;
373
+ const kvWritesBefore = ((_b = ctx.metrics) == null ? void 0 : _b.totalKvWrites) ?? 0;
374
+ try {
375
+ if (args.length > 0) {
376
+ const { rows, columns } = db2.executeSync(
377
+ query,
378
+ toSqliteBindings(args)
379
+ );
380
+ return rows.map((row) => rowToObject(row, columns));
381
+ }
382
+ if (!hasMultipleStatements(query)) {
383
+ const { rows, columns } = db2.executeSync(query, void 0);
384
+ return rows.map((row) => rowToObject(row, columns));
385
+ }
386
+ if (!db2.execSync) {
387
+ throw new Error(
388
+ "Synchronous SQLite queries are only available in the Node.js native runtime."
389
+ );
390
+ }
391
+ const results = [];
392
+ let columnNames = null;
393
+ db2.execSync(query, (row, columns) => {
394
+ if (!columnNames) {
395
+ columnNames = columns;
396
+ }
397
+ results.push(rowToObject(row, columnNames));
398
+ });
399
+ return results;
400
+ } finally {
401
+ const durationMs = performance.now() - start;
402
+ (_c = ctx.metrics) == null ? void 0 : _c.trackSql(query, durationMs);
403
+ if (ctx.metrics) {
404
+ (_d = ctx.log) == null ? void 0 : _d.debug({
405
+ msg: "sql query",
406
+ query: query.slice(0, 120),
407
+ durationMs,
408
+ kvReads: ctx.metrics.totalKvReads - kvReadsBefore,
409
+ kvWrites: ctx.metrics.totalKvWrites - kvWritesBefore
410
+ });
411
+ }
412
+ }
413
+ }
311
414
  export {
312
415
  alias,
313
416
  check,
@@ -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\tSqliteProfilingOptions,\n\tSqliteTransactionOptions,\n\tSqliteDatabase,\n\tSqliteTransactionDatabase,\n} from \"@/common/database/config\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\ttoSqliteBindings,\n\tvalidateTransactionName,\n\tvalidateTransactionTimeout,\n} 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: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,\n\t\t\toptions?: SqliteTransactionOptions,\n\t\t) => Promise<T>;\n\t};\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\nexport interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\n\tprofiling?: SqliteProfilingOptions;\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\twarnOnManualTransactions = true,\n\tprofiling,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tsqliteProfiling: profiling,\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 manualTransactionWarned = 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 = (\n\t\t\t\ttarget: SqliteDatabase | SqliteTransactionDatabase,\n\t\t\t\ttransactionScoped = false,\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\twarnForManualTransaction(query, transactionScoped);\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 target.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);\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\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\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\toptions?: SqliteTransactionOptions,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tvalidateTransactionName(options?.name);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\n\t\t\t\t\t\toptions?.name,\n\t\t\t\t\t);\n\t\t\t\t\tconst tx = createDrizzleClient(transaction, 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 transaction.commit();\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 transaction.rollback();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after expiry cleanup.\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.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\tconst warnForManualTransaction = (\n\t\t\t\tquery: string,\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\ttransactionScoped ||\n\t\t\t\t\t!warnOnManualTransactions ||\n\t\t\t\t\tmanualTransactionWarned ||\n\t\t\t\t\thasMultipleStatements(query) ||\n\t\t\t\t\t!isManualTransactionControl(query)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmanualTransactionWarned = true;\n\t\t\t\tgetLogger(\"database\").warn(\n\t\t\t\t\t{ actorId: ctx.actorId },\n\t\t\t\t\t\"Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning.\",\n\t\t\t\t);\n\t\t\t};\n\n\t\t\treturn createDrizzleClient(nativeDb);\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.transaction(\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\t{\n\t\t\tname: \"rivetkit-drizzle-migration\",\n\t\t\ttimeout: MIGRATION_TRANSACTION_TIMEOUT_MS,\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 | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): Promise<TRow[]> {\n\tensureOpen();\n\twarnForManualTransaction();\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);\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);\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(query, (row, columns) => {\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\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\tSqliteDatabase,\n\tSqliteProfilingOptions,\n\tSqliteTransactionDatabase,\n\tSqliteTransactionOptions,\n\tSynchronousRawAccess,\n\tSynchronousTransactionAccess,\n} from \"@/common/database/config\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\trunSqliteTransactionSync,\n\ttoSqliteBindings,\n\tvalidateTransactionName,\n\tvalidateTransactionTimeout,\n} from \"@/common/database/shared\";\nimport { getLogger } from \"@/common/log\";\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<SynchronousRawAccess, \"transaction\"> & {\n\t\ttransaction: <T>(\n\t\t\tcallback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,\n\t\t\toptions?: SqliteTransactionOptions,\n\t\t) => Promise<T>;\n\t};\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\nexport interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\n\tprofiling?: SqliteProfilingOptions;\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\twarnOnManualTransactions = true,\n\tprofiling,\n}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tsqliteProfiling: profiling,\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 manualTransactionWarned = false;\n\t\t\tlet synchronousTransactionActive = 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\t\t\tconst ensureSynchronousTransactionClient = (\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (!transactionScoped && synchronousTransactionActive) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Use the transaction callback's tx value for queries inside db.transactionSync().\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst createDrizzleClient = (\n\t\t\t\ttarget: SqliteDatabase | SqliteTransactionDatabase,\n\t\t\t\ttransactionScoped = false,\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\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\twarnForManualTransaction(query, transactionScoped);\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 target.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);\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\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\treturn await executeRaw<TRow>(\n\t\t\t\t\t\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\n\t\t\t\t\t);\n\t\t\t\t};\n\t\t\t\tdrizzleDb.executeSync = <\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): TRow[] => {\n\t\t\t\t\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\treturn executeRawSync<TRow>(\n\t\t\t\t\t\ttarget,\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\t() =>\n\t\t\t\t\t\t\twarnForManualTransaction(query, transactionScoped),\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\toptions?: SqliteTransactionOptions,\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tensureSynchronousTransactionClient(transactionScoped);\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tvalidateTransactionName(options?.name);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\n\t\t\t\t\t\toptions?.name,\n\t\t\t\t\t);\n\t\t\t\t\tconst tx = createDrizzleClient(transaction, 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 transaction.commit();\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 transaction.rollback();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Preserve the callback or commit error after expiry cleanup.\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.transactionSync = <T>(\n\t\t\t\t\ttransactionCallback: (\n\t\t\t\t\t\ttx: SynchronousTransactionAccess,\n\t\t\t\t\t) => T,\n\t\t\t\t\toptions?: Omit<SqliteTransactionOptions, \"experimental\">,\n\t\t\t\t): T => {\n\t\t\t\t\tensureOpen();\n\t\t\t\t\tif (transactionScoped || synchronousTransactionActive) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Nested synchronous SQLite transactions are not supported.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn runSqliteTransactionSync(\n\t\t\t\t\t\tnativeDb,\n\t\t\t\t\t\t(transaction) => {\n\t\t\t\t\t\t\tconst transactionClient = createDrizzleClient(\n\t\t\t\t\t\t\t\ttransaction,\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst tx: SynchronousTransactionAccess = {\n\t\t\t\t\t\t\t\texecuteSync: transactionClient.executeSync,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsynchronousTransactionActive = true;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn transactionCallback(tx);\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\tsynchronousTransactionActive = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions,\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\tconst warnForManualTransaction = (\n\t\t\t\tquery: string,\n\t\t\t\ttransactionScoped: boolean,\n\t\t\t) => {\n\t\t\t\tif (\n\t\t\t\t\ttransactionScoped ||\n\t\t\t\t\t!warnOnManualTransactions ||\n\t\t\t\t\tmanualTransactionWarned ||\n\t\t\t\t\thasMultipleStatements(query) ||\n\t\t\t\t\t!isManualTransactionControl(query)\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmanualTransactionWarned = true;\n\t\t\t\tgetLogger(\"database\").warn(\n\t\t\t\t\t{ actorId: ctx.actorId },\n\t\t\t\t\t\"Manual cross-call SQLite transactions can interleave with other actor work. Use db.transaction() or db.transactionSync() for coordinated transactions. Set warnOnManualTransactions: false in your db(...) configuration to disable this warning.\",\n\t\t\t\t);\n\t\t\t};\n\n\t\t\treturn createDrizzleClient(nativeDb);\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.transaction(\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\t{\n\t\t\tname: \"rivetkit-drizzle-migration\",\n\t\t\ttimeout: MIGRATION_TRANSACTION_TIMEOUT_MS,\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 | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): Promise<TRow[]> {\n\tensureOpen();\n\twarnForManualTransaction();\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);\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);\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(query, (row, columns) => {\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\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\nfunction executeRawSync<TRow extends Record<string, unknown>>(\n\tdb: SqliteDatabase | SqliteTransactionDatabase,\n\tctx: DatabaseProviderContext,\n\tensureOpen: () => void,\n\tquery: string,\n\targs: unknown[],\n\twarnForManualTransaction: () => void,\n): TRow[] {\n\tensureOpen();\n\twarnForManualTransaction();\n\tif (!db.executeSync) {\n\t\tthrow new Error(\n\t\t\t\"Synchronous SQLite queries are only available in the Node.js native runtime.\",\n\t\t);\n\t}\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 } = db.executeSync(\n\t\t\t\tquery,\n\t\t\t\ttoSqliteBindings(args),\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 } = db.executeSync(query, undefined);\n\t\t\treturn rows.map((row) => rowToObject<TRow>(row, columns));\n\t\t}\n\n\t\tif (!db.execSync) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Synchronous SQLite queries are only available in the Node.js native runtime.\",\n\t\t\t);\n\t\t}\n\t\tconst results: Record<string, unknown>[] = [];\n\t\tlet columnNames: string[] | null = null;\n\t\tdb.execSync(query, (row, columns) => {\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\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"]}