rivetkit 2.3.11-rc.9 → 2.3.12-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/client.d.ts +96 -14
- package/dist/browser/client.js +12 -2
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.d.ts +139 -139
- package/dist/browser/inspector/client.js +12 -2
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/agent-os/index.cjs +146 -76
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +83 -9
- package/dist/tsup/agent-os/index.d.ts +83 -9
- package/dist/tsup/agent-os/index.js +146 -76
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-IMRDHZM2.cjs → chunk-2D5PNV5A.cjs} +30 -5
- package/dist/tsup/chunk-2D5PNV5A.cjs.map +1 -0
- package/dist/tsup/{chunk-HNHLBM3Y.cjs → chunk-4KGXFC6M.cjs} +42 -5
- package/dist/tsup/chunk-4KGXFC6M.cjs.map +1 -0
- package/dist/tsup/{chunk-C5TORAVP.js → chunk-5UYNV4W6.js} +27 -2
- package/dist/tsup/{chunk-C5TORAVP.js.map → chunk-5UYNV4W6.js.map} +1 -1
- package/dist/tsup/{chunk-BZWKY6WO.cjs → chunk-6ETWXXAZ.cjs} +140 -140
- package/dist/tsup/{chunk-BZWKY6WO.cjs.map → chunk-6ETWXXAZ.cjs.map} +1 -1
- package/dist/tsup/{chunk-QWLJCP3X.js → chunk-6W5VGLFT.js} +42 -5
- package/dist/tsup/chunk-6W5VGLFT.js.map +1 -0
- package/dist/tsup/{chunk-HOZ3ZLZ2.js → chunk-A5BZEQOG.js} +6 -6
- package/dist/tsup/chunk-A5BZEQOG.js.map +1 -0
- package/dist/tsup/{chunk-6SBPWTXJ.cjs → chunk-BEPAAID2.cjs} +10 -9
- package/dist/tsup/chunk-BEPAAID2.cjs.map +1 -0
- package/dist/tsup/chunk-BZX4LYYD.cjs +14 -0
- package/dist/tsup/chunk-BZX4LYYD.cjs.map +1 -0
- package/dist/tsup/chunk-CMZBDX6Z.cjs +243 -0
- package/dist/tsup/chunk-CMZBDX6Z.cjs.map +1 -0
- package/dist/tsup/{chunk-V5CVATRU.cjs → chunk-DIHAXOB7.cjs} +7 -7
- package/dist/tsup/{chunk-V5CVATRU.cjs.map → chunk-DIHAXOB7.cjs.map} +1 -1
- package/dist/tsup/{chunk-LZ4TSBIP.js → chunk-HVHDZDM2.js} +13 -3
- package/dist/tsup/chunk-HVHDZDM2.js.map +1 -0
- package/dist/tsup/{chunk-XOOESJY7.js → chunk-JHHAMABO.js} +2 -2
- package/dist/tsup/{chunk-7AFZMFPQ.js → chunk-JTHHCZCZ.js} +10 -1
- package/dist/tsup/chunk-JTHHCZCZ.js.map +1 -0
- package/dist/tsup/chunk-KRPA4UOE.js +243 -0
- package/dist/tsup/chunk-KRPA4UOE.js.map +1 -0
- package/dist/tsup/{chunk-UEULFXUI.cjs → chunk-KVFIONKQ.cjs} +11 -2
- package/dist/tsup/chunk-KVFIONKQ.cjs.map +1 -0
- package/dist/tsup/chunk-MT33DKU4.js +14 -0
- package/dist/tsup/chunk-MT33DKU4.js.map +1 -0
- package/dist/tsup/{chunk-QVCO6DTZ.js → chunk-OZWVDFCA.js} +8 -7
- package/dist/tsup/chunk-OZWVDFCA.js.map +1 -0
- package/dist/tsup/{chunk-T56IZ42M.cjs → chunk-T4MKKCRF.cjs} +13 -3
- package/dist/tsup/chunk-T4MKKCRF.cjs.map +1 -0
- package/dist/tsup/{chunk-T5XVTVQY.cjs → chunk-VJ4KLJO5.cjs} +3 -3
- package/dist/tsup/{chunk-T5XVTVQY.cjs.map → chunk-VJ4KLJO5.cjs.map} +1 -1
- package/dist/tsup/{chunk-IOLZ3ONU.js → chunk-ZTPFJOBX.js} +3 -3
- package/dist/tsup/client/mod.cjs +6 -6
- package/dist/tsup/client/mod.d.cts +4 -3
- package/dist/tsup/client/mod.d.ts +4 -3
- package/dist/tsup/client/mod.js +5 -5
- package/dist/tsup/common/log.cjs +2 -2
- package/dist/tsup/common/log.js +1 -1
- package/dist/tsup/common/websocket.cjs +3 -3
- package/dist/tsup/common/websocket.js +2 -2
- package/dist/tsup/{config-CZcjyT5B.d.ts → config-C4OSv0QP.d.ts} +92 -7
- package/dist/tsup/{config-rGWrumlO.d.cts → config-DTGoWdkG.d.cts} +92 -7
- package/dist/tsup/{config-BxOimoGX.d.cts → config-ey2I2zz5.d.cts} +46 -6
- package/dist/tsup/{config-BxOimoGX.d.ts → config-ey2I2zz5.d.ts} +46 -6
- package/dist/tsup/{context-B8W8E8nW.d.cts → context-C6cvDNyk.d.cts} +2 -2
- package/dist/tsup/{context-_UrDZhEh.d.ts → context-CMygeBxS.d.ts} +2 -2
- package/dist/tsup/db/drizzle.cjs +18 -10
- package/dist/tsup/db/drizzle.cjs.map +1 -1
- package/dist/tsup/db/drizzle.d.cts +5 -6
- package/dist/tsup/db/drizzle.d.ts +5 -6
- package/dist/tsup/db/drizzle.js +13 -5
- package/dist/tsup/db/drizzle.js.map +1 -1
- package/dist/tsup/db/mod.cjs +5 -175
- package/dist/tsup/db/mod.cjs.map +1 -1
- package/dist/tsup/db/mod.d.cts +11 -4
- package/dist/tsup/db/mod.d.ts +11 -4
- package/dist/tsup/db/mod.js +4 -174
- package/dist/tsup/db/mod.js.map +1 -1
- package/dist/tsup/dynamic/mod.cjs +2 -2
- package/dist/tsup/dynamic/mod.d.cts +3 -2
- package/dist/tsup/dynamic/mod.d.ts +3 -2
- package/dist/tsup/dynamic/mod.js +1 -1
- package/dist/tsup/inspector/mod.cjs +5 -4
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +12 -146
- package/dist/tsup/inspector/mod.d.ts +12 -146
- package/dist/tsup/inspector/mod.js +4 -3
- package/dist/tsup/inspector/mod.js.map +1 -1
- package/dist/tsup/inspector/workflow.cjs +21 -0
- package/dist/tsup/inspector/workflow.cjs.map +1 -0
- package/dist/tsup/inspector/workflow.d.cts +144 -0
- package/dist/tsup/inspector/workflow.d.ts +144 -0
- package/dist/tsup/inspector/workflow.js +21 -0
- package/dist/tsup/inspector/workflow.js.map +1 -0
- package/dist/tsup/inspector-tab/mod.cjs +2 -2
- package/dist/tsup/inspector-tab/mod.d.cts +4 -3
- package/dist/tsup/inspector-tab/mod.d.ts +4 -3
- package/dist/tsup/inspector-tab/mod.js +1 -1
- package/dist/tsup/mod.cjs +743 -247
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +6 -5
- package/dist/tsup/mod.d.ts +6 -5
- package/dist/tsup/mod.js +670 -174
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +7 -7
- package/dist/tsup/test/mod.d.cts +3 -2
- package/dist/tsup/test/mod.d.ts +3 -2
- package/dist/tsup/test/mod.js +5 -5
- package/dist/tsup/unstable/migrations.d.cts +1 -1
- package/dist/tsup/unstable/migrations.d.ts +1 -1
- package/dist/tsup/utils.cjs +2 -2
- package/dist/tsup/utils.js +1 -1
- package/dist/tsup/workflow/mod.cjs +89 -95
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.d.cts +5 -4
- package/dist/tsup/workflow/mod.d.ts +5 -4
- package/dist/tsup/workflow/mod.js +86 -92
- package/dist/tsup/workflow/mod.js.map +1 -1
- package/package.json +19 -9
- package/src/actor/config.test.ts +65 -1
- package/src/actor/config.ts +169 -5
- package/src/actor/mod.ts +10 -1
- package/src/client/actor-common.ts +5 -14
- package/src/common/database/config.ts +50 -3
- package/src/common/database/mod.test.ts +142 -4
- package/src/common/database/mod.ts +210 -98
- package/src/common/database/native-database.ts +42 -3
- package/src/common/database/shared.ts +9 -0
- package/src/db/drizzle.test.ts +8 -1
- package/src/db/drizzle.ts +15 -4
- package/src/db/mod.ts +3 -0
- package/src/inspector/workflow.ts +61 -0
- package/src/registry/napi-runtime.ts +69 -1
- package/src/registry/native.ts +474 -161
- package/src/registry/run-handler-coordinator.test.ts +252 -0
- package/src/registry/run-handler-coordinator.ts +219 -0
- package/src/registry/runtime.ts +34 -1
- package/src/registry/wasm-runtime.ts +122 -17
- package/src/utils/node.ts +44 -28
- package/src/workflow/driver.ts +56 -58
- package/src/workflow/inspector.ts +10 -15
- package/src/workflow/mod.ts +48 -70
- package/dist/tsup/chunk-6SBPWTXJ.cjs.map +0 -1
- package/dist/tsup/chunk-7AFZMFPQ.js.map +0 -1
- package/dist/tsup/chunk-HNHLBM3Y.cjs.map +0 -1
- package/dist/tsup/chunk-HOZ3ZLZ2.js.map +0 -1
- package/dist/tsup/chunk-IMRDHZM2.cjs.map +0 -1
- package/dist/tsup/chunk-LZ4TSBIP.js.map +0 -1
- package/dist/tsup/chunk-QVCO6DTZ.js.map +0 -1
- package/dist/tsup/chunk-QWLJCP3X.js.map +0 -1
- package/dist/tsup/chunk-T56IZ42M.cjs.map +0 -1
- package/dist/tsup/chunk-UEULFXUI.cjs.map +0 -1
- /package/dist/tsup/{chunk-XOOESJY7.js.map → chunk-JHHAMABO.js.map} +0 -0
- /package/dist/tsup/{chunk-IOLZ3ONU.js.map → chunk-ZTPFJOBX.js.map} +0 -0
|
@@ -4,7 +4,7 @@ interface ActorMetricsLike {
|
|
|
4
4
|
totalKvWrites: number;
|
|
5
5
|
trackSql(query: string, durationMs: number): void;
|
|
6
6
|
}
|
|
7
|
-
type InferDatabaseClient<DBProvider extends AnyDatabaseProvider> = DBProvider extends DatabaseProvider<any> ? Awaited<ReturnType<DBProvider["createClient"]>> :
|
|
7
|
+
type InferDatabaseClient<DBProvider extends AnyDatabaseProvider> = DBProvider extends DatabaseProvider<any> ? Awaited<ReturnType<DBProvider["createClient"]>> : RawAccess;
|
|
8
8
|
type SqliteBindings = unknown[] | Record<string, unknown>;
|
|
9
9
|
interface SqliteQueryResult {
|
|
10
10
|
columns: string[];
|
|
@@ -18,6 +18,41 @@ interface SqliteBatchStatement {
|
|
|
18
18
|
sql: string;
|
|
19
19
|
params?: SqliteBindings;
|
|
20
20
|
}
|
|
21
|
+
interface SqliteTransactionOptions {
|
|
22
|
+
/** Static operation name used to aggregate transaction performance. */
|
|
23
|
+
name?: string;
|
|
24
|
+
/** Deadlock-safety timeout in milliseconds. */
|
|
25
|
+
timeout?: number;
|
|
26
|
+
/** @experimental */
|
|
27
|
+
experimental?: {
|
|
28
|
+
/**
|
|
29
|
+
* Atomically includes actor and hibernatable connection state.
|
|
30
|
+
* Only single-statement `execute` calls are supported in the transaction.
|
|
31
|
+
* Concurrent actions that try to mutate state while the transaction is
|
|
32
|
+
* active fail with `actor.state_transaction_conflict`.
|
|
33
|
+
*/
|
|
34
|
+
includeState?: boolean;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SQLite profiling configuration.
|
|
39
|
+
*
|
|
40
|
+
* @experimental This entire configuration surface is experimental and subject
|
|
41
|
+
* to change without notice.
|
|
42
|
+
*/
|
|
43
|
+
interface SqliteProfilingOptions {
|
|
44
|
+
enabled?: boolean;
|
|
45
|
+
maxTrackedStatementFingerprints?: number;
|
|
46
|
+
maxTrackedTransactionFingerprints?: number;
|
|
47
|
+
maxPrometheusSeries?: number;
|
|
48
|
+
maxStatementsPerTransactionTrace?: number;
|
|
49
|
+
maxGetPagesRequestsPerTrace?: number;
|
|
50
|
+
maxTransactionNameBytes?: number;
|
|
51
|
+
slowOperationThresholdMs?: number;
|
|
52
|
+
baselineSampleRate?: number;
|
|
53
|
+
maxDiagnosticEventsPerMinute?: number;
|
|
54
|
+
diagnosticEventQueueCapacity?: number;
|
|
55
|
+
}
|
|
21
56
|
interface SqliteNativeMetrics {
|
|
22
57
|
requestBuildNs: number;
|
|
23
58
|
serializeNs: number;
|
|
@@ -35,7 +70,7 @@ interface SqliteDatabase {
|
|
|
35
70
|
exec(sql: string, callback?: (row: unknown[], columns: string[]) => void): Promise<void>;
|
|
36
71
|
execute(sql: string, params?: SqliteBindings): Promise<SqliteExecuteResult>;
|
|
37
72
|
executeBatch(statements: SqliteBatchStatement[]): Promise<SqliteExecuteResult[]>;
|
|
38
|
-
beginTransaction(timeoutMs?: number): Promise<SqliteTransactionDatabase>;
|
|
73
|
+
beginTransaction(timeoutMs?: number, name?: string): Promise<SqliteTransactionDatabase>;
|
|
39
74
|
run(sql: string, params?: SqliteBindings): Promise<void>;
|
|
40
75
|
query(sql: string, params?: SqliteBindings): Promise<SqliteQueryResult>;
|
|
41
76
|
nativeMetrics?(): SqliteNativeMetrics | Promise<SqliteNativeMetrics | null> | null;
|
|
@@ -90,6 +125,13 @@ interface DatabaseProviderContext {
|
|
|
90
125
|
nativeDatabaseProvider?: NativeDatabaseProvider;
|
|
91
126
|
}
|
|
92
127
|
type DatabaseProvider<DB extends RawAccess> = {
|
|
128
|
+
/**
|
|
129
|
+
* Local SQLite profiling controls consumed by the actor runtime.
|
|
130
|
+
*
|
|
131
|
+
* @experimental This entire configuration surface is experimental and
|
|
132
|
+
* subject to change without notice.
|
|
133
|
+
*/
|
|
134
|
+
sqliteProfiling?: SqliteProfilingOptions;
|
|
93
135
|
/**
|
|
94
136
|
* Creates a new database client for the actor.
|
|
95
137
|
* The result is passed to the actor context as `c.db`.
|
|
@@ -120,9 +162,7 @@ type RawAccess = {
|
|
|
120
162
|
*/
|
|
121
163
|
execute: ExecuteFunction;
|
|
122
164
|
/** Runs a callback in an isolated SQLite transaction. */
|
|
123
|
-
transaction: <T>(callback: (tx: RawAccess) => Promise<T> | T, options?:
|
|
124
|
-
timeout?: number;
|
|
125
|
-
}) => Promise<T>;
|
|
165
|
+
transaction: <T>(callback: (tx: RawAccess) => Promise<T> | T, options?: SqliteTransactionOptions) => Promise<T>;
|
|
126
166
|
/**
|
|
127
167
|
* Returns native SQLite metrics when the active runtime supports them.
|
|
128
168
|
*/
|
|
@@ -133,4 +173,4 @@ type RawAccess = {
|
|
|
133
173
|
close: () => Promise<void>;
|
|
134
174
|
};
|
|
135
175
|
|
|
136
|
-
export type { AnyDatabaseProvider as A, DatabaseProvider as D, InferDatabaseClient as I, NativeDatabaseProvider as N, RawAccess as R,
|
|
176
|
+
export type { AnyDatabaseProvider as A, DatabaseProvider as D, InferDatabaseClient as I, NativeDatabaseProvider as N, RawAccess as R, SqliteTransactionOptions as S, SqliteProfilingOptions as a, DatabaseProviderContext as b, RawDatabaseClient as c, SqliteBindings as d, SqliteDatabase as e, SqliteNativeMetrics as f, SqliteQueryResult as g };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as AnyActorDefinition, B as BaseActorDefinition, E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext, F as ActorLogger,
|
|
1
|
+
import { A as AnyActorDefinition, B as BaseActorDefinition, E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext, F as ActorLogger, au as QueueFilterName, az as QueueNextOptions, aA as QueueResultMessageForName, ay as QueueNextBatchOptions, aF as Registry, a3 as Client, am as InferEventArgs, an as InferSchemaMap } from './config-DTGoWdkG.cjs';
|
|
2
2
|
import { WorkflowContextInterface, StepConfig, TryStepResult, TryStepConfig, TryBlockResult, TryBlockConfig, LoopResult, LoopConfig, BranchConfig, BranchOutput, EntryKindType } from '@rivetkit/workflow-engine';
|
|
3
|
-
import { A as AnyDatabaseProvider, I as InferDatabaseClient } from './config-
|
|
3
|
+
import { A as AnyDatabaseProvider, I as InferDatabaseClient } from './config-ey2I2zz5.cjs';
|
|
4
4
|
|
|
5
5
|
type WorkflowActorQueueNextOptions<TName extends string, TCompletable extends boolean> = Omit<QueueNextOptions<TName, TCompletable>, "signal">;
|
|
6
6
|
type WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<QueueNextOptions<string, TCompletable>, "signal">;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as AnyActorDefinition, B as BaseActorDefinition, E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext, F as ActorLogger,
|
|
1
|
+
import { A as AnyActorDefinition, B as BaseActorDefinition, E as EventSchemaConfig, Q as QueueSchemaConfig, h as RunContext, F as ActorLogger, au as QueueFilterName, az as QueueNextOptions, aA as QueueResultMessageForName, ay as QueueNextBatchOptions, aF as Registry, a3 as Client, am as InferEventArgs, an as InferSchemaMap } from './config-C4OSv0QP.js';
|
|
2
2
|
import { WorkflowContextInterface, StepConfig, TryStepResult, TryStepConfig, TryBlockResult, TryBlockConfig, LoopResult, LoopConfig, BranchConfig, BranchOutput, EntryKindType } from '@rivetkit/workflow-engine';
|
|
3
|
-
import { A as AnyDatabaseProvider, I as InferDatabaseClient } from './config-
|
|
3
|
+
import { A as AnyDatabaseProvider, I as InferDatabaseClient } from './config-ey2I2zz5.js';
|
|
4
4
|
|
|
5
5
|
type WorkflowActorQueueNextOptions<TName extends string, TCompletable extends boolean> = Omit<QueueNextOptions<TName, TCompletable>, "signal">;
|
|
6
6
|
type WorkflowActorQueueNextOptionsFallback<TCompletable extends boolean> = Omit<QueueNextOptions<string, TCompletable>, "signal">;
|
package/dist/tsup/db/drizzle.cjs
CHANGED
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var _chunkUEULFXUIcjs = require('../chunk-UEULFXUI.cjs');
|
|
7
6
|
|
|
7
|
+
var _chunkKVFIONKQcjs = require('../chunk-KVFIONKQ.cjs');
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
var _chunkT4MKKCRFcjs = require('../chunk-T4MKKCRF.cjs');
|
|
10
11
|
require('../chunk-4FC7TVS6.cjs');
|
|
11
12
|
|
|
12
13
|
// src/db/drizzle.ts
|
|
@@ -54,9 +55,11 @@ function db({
|
|
|
54
55
|
schema,
|
|
55
56
|
migrations,
|
|
56
57
|
onMigrate,
|
|
57
|
-
warnOnManualTransactions = true
|
|
58
|
+
warnOnManualTransactions = true,
|
|
59
|
+
profiling
|
|
58
60
|
} = {}) {
|
|
59
61
|
return {
|
|
62
|
+
sqliteProfiling: profiling,
|
|
60
63
|
createClient: async (ctx) => {
|
|
61
64
|
const override = ctx.overrideDrizzleDatabaseClient ? await ctx.overrideDrizzleDatabaseClient() : void 0;
|
|
62
65
|
if (override) {
|
|
@@ -89,7 +92,7 @@ function db({
|
|
|
89
92
|
try {
|
|
90
93
|
const { rows } = await target.execute(
|
|
91
94
|
query,
|
|
92
|
-
|
|
95
|
+
_chunkKVFIONKQcjs.toSqliteBindings.call(void 0, params)
|
|
93
96
|
);
|
|
94
97
|
if (method === "run") {
|
|
95
98
|
return { rows: [] };
|
|
@@ -129,9 +132,11 @@ function db({
|
|
|
129
132
|
);
|
|
130
133
|
};
|
|
131
134
|
drizzleDb.transaction = async (transactionCallback, options) => {
|
|
132
|
-
|
|
135
|
+
_chunkKVFIONKQcjs.validateTransactionTimeout.call(void 0, options == null ? void 0 : options.timeout);
|
|
136
|
+
_chunkKVFIONKQcjs.validateTransactionName.call(void 0, options == null ? void 0 : options.name);
|
|
133
137
|
const transaction = await nativeDb.beginTransaction(
|
|
134
|
-
options == null ? void 0 : options.timeout
|
|
138
|
+
options == null ? void 0 : options.timeout,
|
|
139
|
+
options == null ? void 0 : options.name
|
|
135
140
|
);
|
|
136
141
|
const tx = createDrizzleClient(transaction, true);
|
|
137
142
|
try {
|
|
@@ -155,11 +160,11 @@ function db({
|
|
|
155
160
|
return drizzleDb;
|
|
156
161
|
};
|
|
157
162
|
const warnForManualTransaction = (query, transactionScoped) => {
|
|
158
|
-
if (transactionScoped || !warnOnManualTransactions || manualTransactionWarned || hasMultipleStatements(query) || !
|
|
163
|
+
if (transactionScoped || !warnOnManualTransactions || manualTransactionWarned || hasMultipleStatements(query) || !_chunkKVFIONKQcjs.isManualTransactionControl.call(void 0, query)) {
|
|
159
164
|
return;
|
|
160
165
|
}
|
|
161
166
|
manualTransactionWarned = true;
|
|
162
|
-
|
|
167
|
+
_chunkT4MKKCRFcjs.getLogger.call(void 0, "database").warn(
|
|
163
168
|
{ actorId: ctx.actorId },
|
|
164
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."
|
|
165
170
|
);
|
|
@@ -202,7 +207,10 @@ async function withMigrationSavepoint(client, callback) {
|
|
|
202
207
|
throw error;
|
|
203
208
|
}
|
|
204
209
|
},
|
|
205
|
-
{
|
|
210
|
+
{
|
|
211
|
+
name: "rivetkit-drizzle-migration",
|
|
212
|
+
timeout: _chunkKVFIONKQcjs.MIGRATION_TRANSACTION_TIMEOUT_MS
|
|
213
|
+
}
|
|
206
214
|
);
|
|
207
215
|
}
|
|
208
216
|
async function runMigrations(db2, migrations) {
|
|
@@ -269,7 +277,7 @@ async function executeRaw(db2, ctx, ensureOpen, query, args, warnForManualTransa
|
|
|
269
277
|
if (args.length > 0) {
|
|
270
278
|
const { rows, columns } = await db2.execute(
|
|
271
279
|
query,
|
|
272
|
-
|
|
280
|
+
_chunkKVFIONKQcjs.toSqliteBindings.call(void 0, args)
|
|
273
281
|
);
|
|
274
282
|
return rows.map((row) => rowToObject(row, columns));
|
|
275
283
|
}
|
|
@@ -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\tSqliteDatabase,\n\tSqliteTransactionDatabase,\n} from \"@/common/database/config\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\ttoSqliteBindings,\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?: { timeout?: number },\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\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\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}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet 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?: { timeout?: number },\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\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{ timeout: MIGRATION_TRANSACTION_TIMEOUT_MS },\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":"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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,12 +1,10 @@
|
|
|
1
1
|
import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
|
|
2
|
-
import { R as RawAccess, D as DatabaseProvider } from '../config-
|
|
2
|
+
import { R as RawAccess, S as SqliteTransactionOptions, a as SqliteProfilingOptions, D as DatabaseProvider } from '../config-ey2I2zz5.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
6
|
type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<RawAccess, "transaction"> & {
|
|
7
|
-
transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?:
|
|
8
|
-
timeout?: number;
|
|
9
|
-
}) => Promise<T>;
|
|
7
|
+
transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?: SqliteTransactionOptions) => Promise<T>;
|
|
10
8
|
};
|
|
11
9
|
interface DrizzleMigrations {
|
|
12
10
|
journal: unknown;
|
|
@@ -17,6 +15,7 @@ interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {
|
|
|
17
15
|
migrations?: DrizzleMigrations;
|
|
18
16
|
onMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;
|
|
19
17
|
warnOnManualTransactions?: boolean;
|
|
18
|
+
profiling?: SqliteProfilingOptions;
|
|
20
19
|
}
|
|
21
20
|
interface DrizzleKitConfig {
|
|
22
21
|
out?: string;
|
|
@@ -27,6 +26,6 @@ interface DrizzleKitConfig {
|
|
|
27
26
|
declare function defineConfig<TConfig extends DrizzleKitConfig>(config: TConfig): TConfig & {
|
|
28
27
|
dialect: "sqlite";
|
|
29
28
|
};
|
|
30
|
-
declare function db<TSchema extends DrizzleSchema = Record<string, never>>({ schema, migrations, onMigrate, warnOnManualTransactions, }?: DrizzleDatabaseFactoryConfig<TSchema>): DatabaseProvider<DrizzleDatabase<TSchema>>;
|
|
29
|
+
declare function db<TSchema extends DrizzleSchema = Record<string, never>>({ schema, migrations, onMigrate, warnOnManualTransactions, profiling, }?: DrizzleDatabaseFactoryConfig<TSchema>): DatabaseProvider<DrizzleDatabase<TSchema>>;
|
|
31
30
|
|
|
32
|
-
export { db, defineConfig };
|
|
31
|
+
export { type DrizzleDatabaseFactoryConfig, db, defineConfig };
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { SqliteRemoteDatabase } from 'drizzle-orm/sqlite-proxy';
|
|
2
|
-
import { R as RawAccess, D as DatabaseProvider } from '../config-
|
|
2
|
+
import { R as RawAccess, S as SqliteTransactionOptions, a as SqliteProfilingOptions, D as DatabaseProvider } from '../config-ey2I2zz5.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
6
|
type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<SqliteRemoteDatabase<TSchema>, "transaction"> & Omit<RawAccess, "transaction"> & {
|
|
7
|
-
transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?:
|
|
8
|
-
timeout?: number;
|
|
9
|
-
}) => Promise<T>;
|
|
7
|
+
transaction: <T>(callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T, options?: SqliteTransactionOptions) => Promise<T>;
|
|
10
8
|
};
|
|
11
9
|
interface DrizzleMigrations {
|
|
12
10
|
journal: unknown;
|
|
@@ -17,6 +15,7 @@ interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {
|
|
|
17
15
|
migrations?: DrizzleMigrations;
|
|
18
16
|
onMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;
|
|
19
17
|
warnOnManualTransactions?: boolean;
|
|
18
|
+
profiling?: SqliteProfilingOptions;
|
|
20
19
|
}
|
|
21
20
|
interface DrizzleKitConfig {
|
|
22
21
|
out?: string;
|
|
@@ -27,6 +26,6 @@ interface DrizzleKitConfig {
|
|
|
27
26
|
declare function defineConfig<TConfig extends DrizzleKitConfig>(config: TConfig): TConfig & {
|
|
28
27
|
dialect: "sqlite";
|
|
29
28
|
};
|
|
30
|
-
declare function db<TSchema extends DrizzleSchema = Record<string, never>>({ schema, migrations, onMigrate, warnOnManualTransactions, }?: DrizzleDatabaseFactoryConfig<TSchema>): DatabaseProvider<DrizzleDatabase<TSchema>>;
|
|
29
|
+
declare function db<TSchema extends DrizzleSchema = Record<string, never>>({ schema, migrations, onMigrate, warnOnManualTransactions, profiling, }?: DrizzleDatabaseFactoryConfig<TSchema>): DatabaseProvider<DrizzleDatabase<TSchema>>;
|
|
31
30
|
|
|
32
|
-
export { db, defineConfig };
|
|
31
|
+
export { type DrizzleDatabaseFactoryConfig, db, defineConfig };
|
package/dist/tsup/db/drizzle.js
CHANGED
|
@@ -2,11 +2,12 @@ import {
|
|
|
2
2
|
MIGRATION_TRANSACTION_TIMEOUT_MS,
|
|
3
3
|
isManualTransactionControl,
|
|
4
4
|
toSqliteBindings,
|
|
5
|
+
validateTransactionName,
|
|
5
6
|
validateTransactionTimeout
|
|
6
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-JTHHCZCZ.js";
|
|
7
8
|
import {
|
|
8
9
|
getLogger
|
|
9
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-HVHDZDM2.js";
|
|
10
11
|
import "../chunk-ZZ3WBRPD.js";
|
|
11
12
|
|
|
12
13
|
// src/db/drizzle.ts
|
|
@@ -54,9 +55,11 @@ function db({
|
|
|
54
55
|
schema,
|
|
55
56
|
migrations,
|
|
56
57
|
onMigrate,
|
|
57
|
-
warnOnManualTransactions = true
|
|
58
|
+
warnOnManualTransactions = true,
|
|
59
|
+
profiling
|
|
58
60
|
} = {}) {
|
|
59
61
|
return {
|
|
62
|
+
sqliteProfiling: profiling,
|
|
60
63
|
createClient: async (ctx) => {
|
|
61
64
|
const override = ctx.overrideDrizzleDatabaseClient ? await ctx.overrideDrizzleDatabaseClient() : void 0;
|
|
62
65
|
if (override) {
|
|
@@ -130,8 +133,10 @@ function db({
|
|
|
130
133
|
};
|
|
131
134
|
drizzleDb.transaction = async (transactionCallback, options) => {
|
|
132
135
|
validateTransactionTimeout(options == null ? void 0 : options.timeout);
|
|
136
|
+
validateTransactionName(options == null ? void 0 : options.name);
|
|
133
137
|
const transaction = await nativeDb.beginTransaction(
|
|
134
|
-
options == null ? void 0 : options.timeout
|
|
138
|
+
options == null ? void 0 : options.timeout,
|
|
139
|
+
options == null ? void 0 : options.name
|
|
135
140
|
);
|
|
136
141
|
const tx = createDrizzleClient(transaction, true);
|
|
137
142
|
try {
|
|
@@ -202,7 +207,10 @@ async function withMigrationSavepoint(client, callback) {
|
|
|
202
207
|
throw error;
|
|
203
208
|
}
|
|
204
209
|
},
|
|
205
|
-
{
|
|
210
|
+
{
|
|
211
|
+
name: "rivetkit-drizzle-migration",
|
|
212
|
+
timeout: MIGRATION_TRANSACTION_TIMEOUT_MS
|
|
213
|
+
}
|
|
206
214
|
);
|
|
207
215
|
}
|
|
208
216
|
async function runMigrations(db2, migrations) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/drizzle.ts","../../../src/utils/crypto.ts"],"sourcesContent":["import {\n\tdrizzle,\n\ttype RemoteCallback,\n\ttype SqliteRemoteDatabase,\n} from \"drizzle-orm/sqlite-proxy\";\nimport type {\n\tDatabaseProvider,\n\tDatabaseProviderContext,\n\tRawAccess,\n\tSqliteDatabase,\n\tSqliteTransactionDatabase,\n} from \"@/common/database/config\";\nimport { getLogger } from \"@/common/log\";\nimport {\n\tisManualTransactionControl,\n\tMIGRATION_TRANSACTION_TIMEOUT_MS,\n\ttoSqliteBindings,\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?: { timeout?: number },\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\ninterface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {\n\tschema?: TSchema;\n\tmigrations?: DrizzleMigrations;\n\tonMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;\n\twarnOnManualTransactions?: boolean;\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}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<\n\tDrizzleDatabase<TSchema>\n> {\n\treturn {\n\t\tcreateClient: async (ctx) => {\n\t\t\tconst override = ctx.overrideDrizzleDatabaseClient\n\t\t\t\t? await ctx.overrideDrizzleDatabaseClient()\n\t\t\t\t: undefined;\n\t\t\tif (override) {\n\t\t\t\treturn override as DrizzleDatabase<TSchema>;\n\t\t\t}\n\n\t\t\tconst nativeDatabaseProvider = ctx.nativeDatabaseProvider;\n\t\t\tif (!nativeDatabaseProvider) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"native SQLite is required, but the current runtime did not provide a native database provider\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst nativeDb = await nativeDatabaseProvider.open(ctx.actorId);\n\t\t\tlet closed = false;\n\t\t\tlet 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?: { timeout?: number },\n\t\t\t\t): Promise<T> => {\n\t\t\t\t\tvalidateTransactionTimeout(options?.timeout);\n\t\t\t\t\tconst transaction = await nativeDb.beginTransaction(\n\t\t\t\t\t\toptions?.timeout,\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{ timeout: MIGRATION_TRANSACTION_TIMEOUT_MS },\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\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":";;;;;;;;;;;;;AAAA;AAAA,EACC;AAAA,OAGM;;;ACqBP,eAAsB,UAAU,OAAgC;AAzBhE;AA0BC,MAAI,GAAC,gBAAW,WAAX,mBAAmB,SAAQ;AAC/B,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AAEA,QAAM,SAAS,MAAM,WAAW,OAAO,OAAO;AAAA,IAC7C;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,EAC/B;AACA,SAAO,MAAM;AAAA,IAAK,IAAI,WAAW,MAAM;AAAA,IAAG,CAAC,SAC1C,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAClC,EAAE,KAAK,EAAE;AACV;;;ADZA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAyCA,SAAS,aACf,QACkC;AAClC,SAAO;AAAA,IACN,SAAS;AAAA,IACT,GAAG;AAAA,EACJ;AACD;AAEO,SAAS,GAA0D;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA,2BAA2B;AAAA,EAC3B;AACD,IAA2C,CAAC,GAE1C;AACD,SAAO;AAAA,IACN,iBAAiB;AAAA,IACjB,cAAc,OAAO,QAAQ;AAC5B,YAAM,WAAW,IAAI,gCAClB,MAAM,IAAI,8BAA8B,IACxC;AACH,UAAI,UAAU;AACb,eAAO;AAAA,MACR;AAEA,YAAM,yBAAyB,IAAI;AACnC,UAAI,CAAC,wBAAwB;AAC5B,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA,YAAM,WAAW,MAAM,uBAAuB,KAAK,IAAI,OAAO;AAC9D,UAAI,SAAS;AACb,UAAI,0BAA0B;AAC9B,YAAM,aAAa,MAAM;AACxB,YAAI,QAAQ;AACX,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,YAAM,sBAAsB,CAC3B,QACA,oBAAoB,UACU;AAC9B,cAAM,SAAS,OACd,OACA,QACA,WACI;AApIT;AAqIK,qBAAW;AACX,mCAAyB,OAAO,iBAAiB;AAEjD,gBAAM,QAAQ,YAAY,IAAI;AAC9B,gBAAM,kBAAgB,SAAI,YAAJ,mBAAa,iBAAgB;AACnD,gBAAM,mBAAiB,SAAI,YAAJ,mBAAa,kBAAiB;AACrD,cAAI;AACH,kBAAM,EAAE,KAAK,IAAI,MAAM,OAAO;AAAA,cAC7B;AAAA,cACA,iBAAiB,MAAM;AAAA,YACxB;AACA,gBAAI,WAAW,OAAO;AACrB,qBAAO,EAAE,MAAM,CAAC,EAAE;AAAA,YACnB;AACA,gBAAI,WAAW,OAAO;AACrB,qBAAO,EAAE,MAAM,KAAK,CAAC,EAAE;AAAA,YACxB;AACA,mBAAO,EAAE,KAAK;AAAA,UACf,UAAE;AACD,kBAAM,aAAa,YAAY,IAAI,IAAI;AACvC,sBAAI,YAAJ,mBAAa,SAAS,OAAO;AAC7B,gBAAI,IAAI,SAAS;AAChB,wBAAI,QAAJ,mBAAS,MAAM;AAAA,gBACd,KAAK;AAAA,gBACL,OAAO,MAAM,MAAM,GAAG,GAAG;AAAA,gBACzB;AAAA,gBACA,SACC,IAAI,QAAQ,eAAe;AAAA,gBAC5B,UACC,IAAI,QAAQ,gBAAgB;AAAA,cAC9B;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAEA,cAAM,WAA2B,OAChC,OACA,QACA,WACI;AACJ,iBAAO,MAAM,OAAO,OAAO,QAAQ,MAAM;AAAA,QAC1C;AAEA,cAAM,YAAY,QAAQ,UAAU;AAAA,UACnC;AAAA,QACD,CAAC;AACD,kBAAU,UAAU,OAMnB,UACG,SACkB;AACrB,iBAAO,MAAM;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,MACC,yBAAyB,OAAO,iBAAiB;AAAA,UACnD;AAAA,QACD;AACA,kBAAU,cAAc,OACvB,qBAGA,YACgB;AAChB,qCAA2B,mCAAS,OAAO;AAC3C,kCAAwB,mCAAS,IAAI;AACrC,gBAAM,cAAc,MAAM,SAAS;AAAA,YAClC,mCAAS;AAAA,YACT,mCAAS;AAAA,UACV;AACA,gBAAM,KAAK,oBAAoB,aAAa,IAAI;AAChD,cAAI;AACH,kBAAM,SAAS,MAAM,oBAAoB,EAAE;AAC3C,kBAAM,YAAY,OAAO;AACzB,mBAAO;AAAA,UACR,SAAS,OAAO;AACf,gBAAI;AACH,oBAAM,YAAY,SAAS;AAAA,YAC5B,QAAQ;AAAA,YAER;AACA,kBAAM;AAAA,UACP;AAAA,QACD;AACA,kBAAU,QAAQ,YAAY;AAC7B,cAAI,CAAC,QAAQ;AACZ,qBAAS;AACT,kBAAM,SAAS,MAAM;AAAA,UACtB;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AAEA,YAAM,2BAA2B,CAChC,OACA,sBACI;AACJ,YACC,qBACA,CAAC,4BACD,2BACA,sBAAsB,KAAK,KAC3B,CAAC,2BAA2B,KAAK,GAChC;AACD;AAAA,QACD;AACA,kCAA0B;AAC1B,kBAAU,UAAU,EAAE;AAAA,UACrB,EAAE,SAAS,IAAI,QAAQ;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AAEA,aAAO,oBAAoB,QAAQ;AAAA,IACpC;AAAA,IACA,WAAW,OAAO,WAAW;AAC5B,UAAI,CAAC,cAAc,CAAC,WAAW;AAC9B;AAAA,MACD;AACA,YAAM,uBAAuB,QAAQ,OAAO,WAAW;AACtD,YAAI,YAAY;AACf,gBAAM,cAAc,QAAQ,UAAU;AAAA,QACvC;AACA,YAAI,WAAW;AACd,gBAAM,UAAU,MAAM;AAAA,QACvB;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,eAAe,uBACd,QACA,UACa;AACb,SAAO,MAAM,OAAO;AAAA,IACnB,OAAO,WAAW;AACjB,YAAM,OAAO,QAAQ,8BAA8B;AACnD,UAAI;AACH,cAAM,SAAS,MAAM,SAAS,MAAM;AACpC,cAAM,OAAO,QAAQ,sCAAsC;AAC3D,eAAO;AAAA,MACR,SAAS,OAAO;AACf,YAAI;AACH,gBAAM,OAAO;AAAA,YACZ;AAAA,UACD;AAAA,QACD,UAAE;AACD,gBAAM,OAAO;AAAA,YACZ;AAAA,UACD;AAAA,QACD;AACA,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,SAAS;AAAA,IACV;AAAA,EACD;AACD;AAEA,eAAe,cACdA,KACA,YACC;AAlTF;AAmTC,QAAM,UAAU,sBAAsB,WAAW,OAAO;AAExD,QAAMA,IAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB;AAED,QAAM,OAAO,MAAMA,IAAG;AAAA,IACrB;AAAA,EACD;AACA,QAAM,kBAAgB,UAAK,CAAC,MAAN,mBAAS,eAAc;AAE7C,aAAW,SAAS,QAAQ,SAAS;AACpC,QAAI,iBAAiB,MAAM,MAAM;AAChC;AAAA,IACD;AAEA,UAAM,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AACrD,UAAM,YAAY,WAAW,WAAW,GAAG;AAC3C,QAAI,cAAc,QAAW;AAC5B,YAAM,IAAI;AAAA,QACT,8BAA8B,GAAG,wBAAwB,MAAM,GAAG;AAAA,MACnE;AAAA,IACD;AAEA,UAAM,aAAa,UACjB,MAAM,0BAA0B,EAChC,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,EACnC,OAAO,OAAO;AAChB,eAAW,aAAa,YAAY;AACnC,YAAMA,IAAG,QAAQ,SAAS;AAAA,IAC3B;AAEA,UAAMA,IAAG;AAAA,MACR;AAAA,MACA,MAAM,UAAU,SAAS;AAAA,MACzB,MAAM;AAAA,IACP;AAAA,EACD;AACD;AAEA,SAAS,sBAAsB,SAE7B;AACD,MACC,CAAC,WACD,OAAO,YAAY,YACnB,EAAE,aAAa,YACf,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAC7B;AACD,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACpD;AAEA,SAAO;AACR;AAEA,SAAS,sBAAsB,OAAwB;AACtD,QAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ;AACxD,SAAO,QAAQ,SAAS,GAAG;AAC5B;AAEA,SAAS,YACR,KACA,SACO;AACP,QAAM,SAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,WAAO,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA,EAC3B;AACA,SAAO;AACR;AAEA,eAAe,WACdA,KACA,KACA,YACA,OACA,MACA,0BACkB;AArYnB;AAsYC,aAAW;AACX,2BAAyB;AAEzB,QAAM,QAAQ,YAAY,IAAI;AAC9B,QAAM,kBAAgB,SAAI,YAAJ,mBAAa,iBAAgB;AACnD,QAAM,mBAAiB,SAAI,YAAJ,mBAAa,kBAAiB;AACrD,MAAI;AACH,QAAI,KAAK,SAAS,GAAG;AACpB,YAAM,EAAE,MAAM,QAAQ,IAAI,MAAMA,IAAG;AAAA,QAClC;AAAA,QACA,iBAAiB,IAAI;AAAA,MACtB;AACA,aAAO,KAAK,IAAI,CAAC,QAAQ,YAAkB,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,QAAI,CAAC,sBAAsB,KAAK,GAAG;AAClC,YAAM,EAAE,MAAM,QAAQ,IAAI,MAAMA,IAAG,QAAQ,OAAO,MAAS;AAC3D,aAAO,KAAK,IAAI,CAAC,QAAQ,YAAkB,KAAK,OAAO,CAAC;AAAA,IACzD;AAEA,UAAM,UAAqC,CAAC;AAC5C,QAAI,cAA+B;AACnC,UAAMA,IAAG,KAAK,OAAO,CAAC,KAAK,YAAY;AACtC,UAAI,CAAC,aAAa;AACjB,sBAAc;AAAA,MACf;AACA,cAAQ,KAAK,YAAY,KAAK,WAAW,CAAC;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,EACR,UAAE;AACD,UAAM,aAAa,YAAY,IAAI,IAAI;AACvC,cAAI,YAAJ,mBAAa,SAAS,OAAO;AAC7B,QAAI,IAAI,SAAS;AAChB,gBAAI,QAAJ,mBAAS,MAAM;AAAA,QACd,KAAK;AAAA,QACL,OAAO,MAAM,MAAM,GAAG,GAAG;AAAA,QACzB;AAAA,QACA,SAAS,IAAI,QAAQ,eAAe;AAAA,QACpC,UAAU,IAAI,QAAQ,gBAAgB;AAAA,MACvC;AAAA,IACD;AAAA,EACD;AACD;","names":["db"]}
|