rivetkit 2.3.3 → 2.3.5-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 +157 -9
- package/dist/browser/client.js +518 -542
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/inspector/client.d.ts +101 -2
- package/dist/browser/inspector/client.js +1245 -227
- package/dist/browser/inspector/client.js.map +1 -1
- package/dist/tsup/agent-os/index.cjs +103 -36
- package/dist/tsup/agent-os/index.cjs.map +1 -1
- package/dist/tsup/agent-os/index.d.cts +159 -11
- package/dist/tsup/agent-os/index.d.ts +159 -11
- package/dist/tsup/agent-os/index.js +103 -36
- package/dist/tsup/agent-os/index.js.map +1 -1
- package/dist/tsup/{chunk-34P567PO.cjs → chunk-4XKED5P5.cjs} +145 -176
- package/dist/tsup/chunk-4XKED5P5.cjs.map +1 -0
- package/dist/tsup/{chunk-PYO2U53V.cjs → chunk-6HQCLWAW.cjs} +384 -4
- package/dist/tsup/chunk-6HQCLWAW.cjs.map +1 -0
- package/dist/tsup/{chunk-JZ7TWV65.js → chunk-7AFZMFPQ.js} +15 -1
- package/dist/tsup/chunk-7AFZMFPQ.js.map +1 -0
- package/dist/tsup/{chunk-BLDO2FKO.js → chunk-B4IZU537.js} +382 -2
- package/dist/tsup/chunk-B4IZU537.js.map +1 -0
- package/dist/tsup/{chunk-3MHDOUD7.cjs → chunk-G3CCRCTK.cjs} +14 -9
- package/dist/tsup/chunk-G3CCRCTK.cjs.map +1 -0
- package/dist/tsup/{chunk-CXRPENO3.js → chunk-GAV4PKFT.js} +15 -46
- package/dist/tsup/{chunk-CXRPENO3.js.map → chunk-GAV4PKFT.js.map} +1 -1
- package/dist/tsup/{chunk-HXUEHHJF.js → chunk-JI6GZ2C2.js} +2 -11
- package/dist/tsup/{chunk-HXUEHHJF.js.map → chunk-JI6GZ2C2.js.map} +1 -1
- package/dist/tsup/{chunk-YUEC5SEY.cjs → chunk-M3FCXL3Q.cjs} +3 -3
- package/dist/tsup/{chunk-YUEC5SEY.cjs.map → chunk-M3FCXL3Q.cjs.map} +1 -1
- package/dist/tsup/{chunk-KEKWJECX.js → chunk-MGTSVSUC.js} +2 -2
- package/dist/tsup/{chunk-VE2X4KMG.cjs → chunk-MYWZCDML.cjs} +2 -11
- package/dist/tsup/chunk-MYWZCDML.cjs.map +1 -0
- package/dist/tsup/{chunk-DFA7SYSW.js → chunk-NIC3QLKL.js} +3 -3
- package/dist/tsup/{chunk-BZM4PMFS.js → chunk-P4OGQ4JL.js} +5 -7
- package/dist/tsup/{chunk-BZM4PMFS.js.map → chunk-P4OGQ4JL.js.map} +1 -1
- package/dist/tsup/{chunk-NT2NK3VT.js → chunk-PAG6G46L.js} +2 -2
- package/dist/tsup/{chunk-XIX5DOZN.js → chunk-SHBE77IT.js} +14 -9
- package/dist/tsup/chunk-SHBE77IT.js.map +1 -0
- package/dist/tsup/{chunk-TYLP3U4Y.cjs → chunk-TNIWIUNV.cjs} +9 -11
- package/dist/tsup/chunk-TNIWIUNV.cjs.map +1 -0
- package/dist/tsup/{chunk-S644FL73.cjs → chunk-TR5NLR5V.cjs} +4 -4
- package/dist/tsup/{chunk-S644FL73.cjs.map → chunk-TR5NLR5V.cjs.map} +1 -1
- package/dist/tsup/{chunk-ZA7FLHKH.cjs → chunk-UEULFXUI.cjs} +16 -2
- package/dist/tsup/chunk-UEULFXUI.cjs.map +1 -0
- package/dist/tsup/{chunk-X63ROSOG.cjs → chunk-UJ2FQY63.cjs} +7 -7
- package/dist/tsup/{chunk-X63ROSOG.cjs.map → chunk-UJ2FQY63.cjs.map} +1 -1
- package/dist/tsup/client/mod.cjs +7 -8
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +5 -4
- package/dist/tsup/client/mod.d.ts +5 -4
- package/dist/tsup/client/mod.js +6 -7
- 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-D49x8NpL.d.cts → config-BxOimoGX.d.cts} +16 -0
- package/dist/tsup/{config-D49x8NpL.d.ts → config-BxOimoGX.d.ts} +16 -0
- package/dist/tsup/{config-ZkIsRFsN.d.ts → config-BzdqbLAP.d.ts} +164 -27
- package/dist/tsup/{config-BfBhjEbk.d.cts → config-CPPEwn_e.d.cts} +164 -27
- package/dist/tsup/{context-sZ9GlaBK.d.cts → context-DSA9gFXB.d.cts} +2 -2
- package/dist/tsup/{context-B7-84u9K.d.ts → context-wWv-K2K_.d.ts} +2 -2
- package/dist/tsup/db/drizzle.cjs +120 -68
- package/dist/tsup/db/drizzle.cjs.map +1 -1
- package/dist/tsup/db/drizzle.d.cts +8 -3
- package/dist/tsup/db/drizzle.d.ts +8 -3
- package/dist/tsup/db/drizzle.js +120 -68
- package/dist/tsup/db/drizzle.js.map +1 -1
- package/dist/tsup/db/mod.cjs +74 -22
- package/dist/tsup/db/mod.cjs.map +1 -1
- package/dist/tsup/db/mod.d.cts +4 -3
- package/dist/tsup/db/mod.d.ts +4 -3
- package/dist/tsup/db/mod.js +74 -22
- 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 -3
- package/dist/tsup/dynamic/mod.d.ts +3 -3
- package/dist/tsup/dynamic/mod.js +1 -1
- package/dist/tsup/inspector/mod.cjs +4 -5
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.js +3 -4
- package/dist/tsup/inspector/mod.js.map +1 -1
- package/dist/tsup/inspector-tab/mod.cjs +2 -2
- package/dist/tsup/inspector-tab/mod.cjs.map +1 -1
- package/dist/tsup/inspector-tab/mod.d.cts +5 -5
- package/dist/tsup/inspector-tab/mod.d.ts +5 -5
- package/dist/tsup/inspector-tab/mod.js +1 -1
- package/dist/tsup/inspector-tab/mod.js.map +1 -1
- package/dist/tsup/mod.cjs +605 -158
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +5 -5
- package/dist/tsup/mod.d.ts +5 -5
- package/dist/tsup/mod.js +528 -81
- package/dist/tsup/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +10 -11
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +3 -3
- package/dist/tsup/test/mod.d.ts +3 -3
- package/dist/tsup/test/mod.js +6 -7
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils-CV0akuDD.d.ts +162 -0
- package/dist/tsup/utils-DQDCphrl.d.cts +162 -0
- package/dist/tsup/utils.cjs +6 -2
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +3 -146
- package/dist/tsup/utils.d.ts +3 -146
- package/dist/tsup/utils.js +5 -1
- package/dist/tsup/workflow/mod.cjs +198 -151
- package/dist/tsup/workflow/mod.cjs.map +1 -1
- package/dist/tsup/workflow/mod.d.cts +5 -5
- package/dist/tsup/workflow/mod.d.ts +5 -5
- package/dist/tsup/workflow/mod.js +187 -140
- package/dist/tsup/workflow/mod.js.map +1 -1
- package/package.json +8 -8
- package/src/actor/config.test.ts +14 -0
- package/src/actor/config.ts +104 -16
- package/src/actor/definition.ts +18 -7
- package/src/agent-os/actor/index.ts +2 -2
- package/src/common/bare/generated/actor-runtime-socket-protocol/v1.ts +848 -0
- package/src/common/bare/generated/inspector/v6.ts +1367 -0
- package/src/common/database/config.ts +24 -0
- package/src/common/database/mod.test.ts +148 -59
- package/src/common/database/mod.ts +93 -23
- package/src/common/database/native-database.test.ts +9 -0
- package/src/common/database/native-database.ts +151 -0
- package/src/common/database/shared.ts +15 -0
- package/src/common/encoding.ts +28 -21
- package/src/db/drizzle.test.ts +157 -0
- package/src/db/drizzle.ts +170 -79
- package/src/dynamic/isolate-runtime.ts +0 -2
- package/src/engine-client/driver.ts +0 -15
- package/src/engine-client/mod.ts +0 -41
- package/src/inspector/client.browser.ts +69 -8
- package/src/inspector-tab/mod.ts +1 -0
- package/src/registry/config/index.ts +1 -35
- package/src/registry/napi-runtime.ts +204 -16
- package/src/registry/native.ts +200 -30
- package/src/registry/runtime.ts +146 -3
- package/src/registry/wasm-runtime.ts +217 -6
- package/src/utils.ts +3 -0
- package/src/workflow/context.ts +5 -27
- package/src/workflow/driver.test.ts +62 -0
- package/src/workflow/driver.ts +231 -113
- package/src/workflow/mod.ts +3 -3
- package/dist/tsup/chunk-34P567PO.cjs.map +0 -1
- package/dist/tsup/chunk-3MHDOUD7.cjs.map +0 -1
- package/dist/tsup/chunk-APW73HCH.cjs +0 -382
- package/dist/tsup/chunk-APW73HCH.cjs.map +0 -1
- package/dist/tsup/chunk-BLDO2FKO.js.map +0 -1
- package/dist/tsup/chunk-DHXWD4DF.js +0 -382
- package/dist/tsup/chunk-DHXWD4DF.js.map +0 -1
- package/dist/tsup/chunk-JZ7TWV65.js.map +0 -1
- package/dist/tsup/chunk-PYO2U53V.cjs.map +0 -1
- package/dist/tsup/chunk-TYLP3U4Y.cjs.map +0 -1
- package/dist/tsup/chunk-VE2X4KMG.cjs.map +0 -1
- package/dist/tsup/chunk-XIX5DOZN.js.map +0 -1
- package/dist/tsup/chunk-ZA7FLHKH.cjs.map +0 -1
- package/src/actor/driver.ts +0 -141
- package/src/actor/instance/mod.ts +0 -2484
- package/src/drivers/engine/actor-driver.ts +0 -2473
- /package/dist/tsup/{chunk-KEKWJECX.js.map → chunk-MGTSVSUC.js.map} +0 -0
- /package/dist/tsup/{chunk-DFA7SYSW.js.map → chunk-NIC3QLKL.js.map} +0 -0
- /package/dist/tsup/{chunk-NT2NK3VT.js.map → chunk-PAG6G46L.js.map} +0 -0
package/src/db/drizzle.ts
CHANGED
|
@@ -8,8 +8,15 @@ import type {
|
|
|
8
8
|
DatabaseProviderContext,
|
|
9
9
|
RawAccess,
|
|
10
10
|
SqliteDatabase,
|
|
11
|
+
SqliteTransactionDatabase,
|
|
11
12
|
} from "@/common/database/config";
|
|
12
|
-
import {
|
|
13
|
+
import { getLogger } from "@/common/log";
|
|
14
|
+
import {
|
|
15
|
+
isManualTransactionControl,
|
|
16
|
+
MIGRATION_TRANSACTION_TIMEOUT_MS,
|
|
17
|
+
toSqliteBindings,
|
|
18
|
+
validateTransactionTimeout,
|
|
19
|
+
} from "@/common/database/shared";
|
|
13
20
|
import { sha256Hex } from "@/utils/crypto";
|
|
14
21
|
|
|
15
22
|
export type { SQLiteTable } from "drizzle-orm/sqlite-core";
|
|
@@ -28,8 +35,16 @@ export {
|
|
|
28
35
|
} from "drizzle-orm/sqlite-core";
|
|
29
36
|
|
|
30
37
|
type DrizzleSchema = Record<string, unknown>;
|
|
31
|
-
type DrizzleDatabase<TSchema extends DrizzleSchema> =
|
|
32
|
-
SqliteRemoteDatabase<TSchema
|
|
38
|
+
type DrizzleDatabase<TSchema extends DrizzleSchema> = Omit<
|
|
39
|
+
SqliteRemoteDatabase<TSchema>,
|
|
40
|
+
"transaction"
|
|
41
|
+
> &
|
|
42
|
+
Omit<RawAccess, "transaction"> & {
|
|
43
|
+
transaction: <T>(
|
|
44
|
+
callback: (tx: DrizzleDatabase<TSchema>) => Promise<T> | T,
|
|
45
|
+
options?: { timeout?: number },
|
|
46
|
+
) => Promise<T>;
|
|
47
|
+
};
|
|
33
48
|
|
|
34
49
|
interface DrizzleMigrationJournalEntry {
|
|
35
50
|
idx: number;
|
|
@@ -47,6 +62,7 @@ interface DrizzleDatabaseFactoryConfig<TSchema extends DrizzleSchema> {
|
|
|
47
62
|
schema?: TSchema;
|
|
48
63
|
migrations?: DrizzleMigrations;
|
|
49
64
|
onMigrate?: (db: DrizzleDatabase<TSchema>) => Promise<void> | void;
|
|
65
|
+
warnOnManualTransactions?: boolean;
|
|
50
66
|
}
|
|
51
67
|
|
|
52
68
|
interface DrizzleKitConfig {
|
|
@@ -69,6 +85,7 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
|
|
|
69
85
|
schema,
|
|
70
86
|
migrations,
|
|
71
87
|
onMigrate,
|
|
88
|
+
warnOnManualTransactions = true,
|
|
72
89
|
}: DrizzleDatabaseFactoryConfig<TSchema> = {}): DatabaseProvider<
|
|
73
90
|
DrizzleDatabase<TSchema>
|
|
74
91
|
> {
|
|
@@ -90,6 +107,7 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
|
|
|
90
107
|
|
|
91
108
|
const nativeDb = await nativeDatabaseProvider.open(ctx.actorId);
|
|
92
109
|
let closed = false;
|
|
110
|
+
let manualTransactionWarned = false;
|
|
93
111
|
const ensureOpen = () => {
|
|
94
112
|
if (closed) {
|
|
95
113
|
throw new Error(
|
|
@@ -98,107 +116,178 @@ export function db<TSchema extends DrizzleSchema = Record<string, never>>({
|
|
|
98
116
|
}
|
|
99
117
|
};
|
|
100
118
|
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
119
|
+
const createDrizzleClient = (
|
|
120
|
+
target: SqliteDatabase | SqliteTransactionDatabase,
|
|
121
|
+
transactionScoped = false,
|
|
122
|
+
): DrizzleDatabase<TSchema> => {
|
|
123
|
+
const runSql = async (
|
|
124
|
+
query: string,
|
|
125
|
+
params: unknown[],
|
|
126
|
+
method: "run" | "all" | "values" | "get",
|
|
127
|
+
) => {
|
|
128
|
+
ensureOpen();
|
|
129
|
+
warnForManualTransaction(query, transactionScoped);
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
131
|
+
const start = performance.now();
|
|
132
|
+
const kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;
|
|
133
|
+
const kvWritesBefore = ctx.metrics?.totalKvWrites ?? 0;
|
|
134
|
+
try {
|
|
135
|
+
const { rows } = await target.execute(
|
|
136
|
+
query,
|
|
137
|
+
toSqliteBindings(params),
|
|
138
|
+
);
|
|
139
|
+
if (method === "run") {
|
|
140
|
+
return { rows: [] };
|
|
141
|
+
}
|
|
142
|
+
if (method === "get") {
|
|
143
|
+
return { rows: rows[0] };
|
|
144
|
+
}
|
|
145
|
+
return { rows };
|
|
146
|
+
} finally {
|
|
147
|
+
const durationMs = performance.now() - start;
|
|
148
|
+
ctx.metrics?.trackSql(query, durationMs);
|
|
149
|
+
if (ctx.metrics) {
|
|
150
|
+
ctx.log?.debug({
|
|
151
|
+
msg: "sql query",
|
|
152
|
+
query: query.slice(0, 120),
|
|
153
|
+
durationMs,
|
|
154
|
+
kvReads:
|
|
155
|
+
ctx.metrics.totalKvReads - kvReadsBefore,
|
|
156
|
+
kvWrites:
|
|
157
|
+
ctx.metrics.totalKvWrites - kvWritesBefore,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const callback: RemoteCallback = async (
|
|
164
|
+
query,
|
|
165
|
+
params,
|
|
166
|
+
method,
|
|
167
|
+
) => {
|
|
168
|
+
return await runSql(query, params, method);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const drizzleDb = drizzle(callback, {
|
|
172
|
+
schema,
|
|
173
|
+
}) as unknown as DrizzleDatabase<TSchema>;
|
|
174
|
+
drizzleDb.execute = async <
|
|
175
|
+
TRow extends Record<string, unknown> = Record<
|
|
176
|
+
string,
|
|
177
|
+
unknown
|
|
178
|
+
>,
|
|
179
|
+
>(
|
|
180
|
+
query: string,
|
|
181
|
+
...args: unknown[]
|
|
182
|
+
): Promise<TRow[]> => {
|
|
183
|
+
return await executeRaw<TRow>(
|
|
184
|
+
target,
|
|
185
|
+
ctx,
|
|
186
|
+
ensureOpen,
|
|
113
187
|
query,
|
|
114
|
-
|
|
188
|
+
args,
|
|
189
|
+
() =>
|
|
190
|
+
warnForManualTransaction(query, transactionScoped),
|
|
115
191
|
);
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
192
|
+
};
|
|
193
|
+
drizzleDb.transaction = async <T>(
|
|
194
|
+
transactionCallback: (
|
|
195
|
+
tx: DrizzleDatabase<TSchema>,
|
|
196
|
+
) => Promise<T> | T,
|
|
197
|
+
options?: { timeout?: number },
|
|
198
|
+
): Promise<T> => {
|
|
199
|
+
validateTransactionTimeout(options?.timeout);
|
|
200
|
+
const transaction = await nativeDb.beginTransaction(
|
|
201
|
+
options?.timeout,
|
|
202
|
+
);
|
|
203
|
+
const tx = createDrizzleClient(transaction, true);
|
|
204
|
+
try {
|
|
205
|
+
const result = await transactionCallback(tx);
|
|
206
|
+
await transaction.commit();
|
|
207
|
+
return result;
|
|
208
|
+
} catch (error) {
|
|
209
|
+
try {
|
|
210
|
+
await transaction.rollback();
|
|
211
|
+
} catch {
|
|
212
|
+
// Preserve the callback or commit error after expiry cleanup.
|
|
213
|
+
}
|
|
214
|
+
throw error;
|
|
121
215
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
ctx.log?.debug({
|
|
128
|
-
msg: "sql query",
|
|
129
|
-
query: query.slice(0, 120),
|
|
130
|
-
durationMs,
|
|
131
|
-
kvReads: ctx.metrics.totalKvReads - kvReadsBefore,
|
|
132
|
-
kvWrites:
|
|
133
|
-
ctx.metrics.totalKvWrites - kvWritesBefore,
|
|
134
|
-
});
|
|
216
|
+
};
|
|
217
|
+
drizzleDb.close = async () => {
|
|
218
|
+
if (!closed) {
|
|
219
|
+
closed = true;
|
|
220
|
+
await nativeDb.close();
|
|
135
221
|
}
|
|
136
|
-
}
|
|
137
|
-
};
|
|
222
|
+
};
|
|
138
223
|
|
|
139
|
-
|
|
140
|
-
return await runSql(query, params, method);
|
|
224
|
+
return drizzleDb;
|
|
141
225
|
};
|
|
142
226
|
|
|
143
|
-
const
|
|
144
|
-
schema,
|
|
145
|
-
}) as DrizzleDatabase<TSchema>;
|
|
146
|
-
drizzleDb.execute = async <
|
|
147
|
-
TRow extends Record<string, unknown> = Record<string, unknown>,
|
|
148
|
-
>(
|
|
227
|
+
const warnForManualTransaction = (
|
|
149
228
|
query: string,
|
|
150
|
-
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
query
|
|
157
|
-
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
drizzleDb.close = async () => {
|
|
161
|
-
if (!closed) {
|
|
162
|
-
closed = true;
|
|
163
|
-
await nativeDb.close();
|
|
229
|
+
transactionScoped: boolean,
|
|
230
|
+
) => {
|
|
231
|
+
if (
|
|
232
|
+
transactionScoped ||
|
|
233
|
+
!warnOnManualTransactions ||
|
|
234
|
+
manualTransactionWarned ||
|
|
235
|
+
hasMultipleStatements(query) ||
|
|
236
|
+
!isManualTransactionControl(query)
|
|
237
|
+
) {
|
|
238
|
+
return;
|
|
164
239
|
}
|
|
240
|
+
manualTransactionWarned = true;
|
|
241
|
+
getLogger("database").warn(
|
|
242
|
+
{ actorId: ctx.actorId },
|
|
243
|
+
"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.",
|
|
244
|
+
);
|
|
165
245
|
};
|
|
166
246
|
|
|
167
|
-
return
|
|
247
|
+
return createDrizzleClient(nativeDb);
|
|
168
248
|
},
|
|
169
249
|
onMigrate: async (client) => {
|
|
170
250
|
if (!migrations && !onMigrate) {
|
|
171
251
|
return;
|
|
172
252
|
}
|
|
173
|
-
await withMigrationSavepoint(client, async () => {
|
|
253
|
+
await withMigrationSavepoint(client, async (leased) => {
|
|
174
254
|
if (migrations) {
|
|
175
|
-
await runMigrations(
|
|
255
|
+
await runMigrations(leased, migrations);
|
|
176
256
|
}
|
|
177
257
|
if (onMigrate) {
|
|
178
|
-
await onMigrate(
|
|
258
|
+
await onMigrate(leased);
|
|
179
259
|
}
|
|
180
260
|
});
|
|
181
261
|
},
|
|
182
262
|
};
|
|
183
263
|
}
|
|
184
264
|
|
|
185
|
-
async function withMigrationSavepoint<T>(
|
|
186
|
-
client:
|
|
187
|
-
callback: () => Promise<T> | T,
|
|
265
|
+
async function withMigrationSavepoint<TSchema extends DrizzleSchema, T>(
|
|
266
|
+
client: DrizzleDatabase<TSchema>,
|
|
267
|
+
callback: (leased: DrizzleDatabase<TSchema>) => Promise<T> | T,
|
|
188
268
|
): Promise<T> {
|
|
189
|
-
await client.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
269
|
+
return await client.transaction(
|
|
270
|
+
async (leased) => {
|
|
271
|
+
await leased.execute("SAVEPOINT __rivet_on_migrate");
|
|
272
|
+
try {
|
|
273
|
+
const result = await callback(leased);
|
|
274
|
+
await leased.execute("RELEASE SAVEPOINT __rivet_on_migrate");
|
|
275
|
+
return result;
|
|
276
|
+
} catch (error) {
|
|
277
|
+
try {
|
|
278
|
+
await leased.execute(
|
|
279
|
+
"ROLLBACK TO SAVEPOINT __rivet_on_migrate",
|
|
280
|
+
);
|
|
281
|
+
} finally {
|
|
282
|
+
await leased.execute(
|
|
283
|
+
"RELEASE SAVEPOINT __rivet_on_migrate",
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{ timeout: MIGRATION_TRANSACTION_TIMEOUT_MS },
|
|
290
|
+
);
|
|
202
291
|
}
|
|
203
292
|
|
|
204
293
|
async function runMigrations<TSchema extends DrizzleSchema>(
|
|
@@ -281,13 +370,15 @@ function rowToObject<TRow extends Record<string, unknown>>(
|
|
|
281
370
|
}
|
|
282
371
|
|
|
283
372
|
async function executeRaw<TRow extends Record<string, unknown>>(
|
|
284
|
-
db: SqliteDatabase,
|
|
373
|
+
db: SqliteDatabase | SqliteTransactionDatabase,
|
|
285
374
|
ctx: DatabaseProviderContext,
|
|
286
375
|
ensureOpen: () => void,
|
|
287
376
|
query: string,
|
|
288
377
|
args: unknown[],
|
|
378
|
+
warnForManualTransaction: () => void,
|
|
289
379
|
): Promise<TRow[]> {
|
|
290
380
|
ensureOpen();
|
|
381
|
+
warnForManualTransaction();
|
|
291
382
|
|
|
292
383
|
const start = performance.now();
|
|
293
384
|
const kvReadsBefore = ctx.metrics?.totalKvReads ?? 0;
|
|
@@ -302,7 +393,7 @@ async function executeRaw<TRow extends Record<string, unknown>>(
|
|
|
302
393
|
}
|
|
303
394
|
|
|
304
395
|
if (!hasMultipleStatements(query)) {
|
|
305
|
-
const { rows, columns } = await db.execute(query);
|
|
396
|
+
const { rows, columns } = await db.execute(query, undefined);
|
|
306
397
|
return rows.map((row) => rowToObject<TRow>(row, columns));
|
|
307
398
|
}
|
|
308
399
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { ActorDriver } from "@/actor/driver";
|
|
2
1
|
import type { Client } from "@/client/client";
|
|
3
2
|
import type { RegistryConfig } from "@/registry/config";
|
|
4
3
|
import type { DynamicActorLoader } from "./internal";
|
|
@@ -10,7 +9,6 @@ export interface DynamicActorIsolateRuntimeConfig {
|
|
|
10
9
|
input: unknown;
|
|
11
10
|
region: string;
|
|
12
11
|
loader: DynamicActorLoader;
|
|
13
|
-
actorDriver: ActorDriver;
|
|
14
12
|
inlineClient: Client<any>;
|
|
15
13
|
test: RegistryConfig["test"];
|
|
16
14
|
}
|
|
@@ -61,21 +61,6 @@ export interface EngineControlClient {
|
|
|
61
61
|
* Test-only helper that simulates an abrupt actor crash.
|
|
62
62
|
*/
|
|
63
63
|
hardCrashActor?(actorId: string): Promise<void>;
|
|
64
|
-
kvGet(actorId: string, key: Uint8Array): Promise<string | null>;
|
|
65
|
-
kvBatchGet(
|
|
66
|
-
actorId: string,
|
|
67
|
-
keys: Uint8Array[],
|
|
68
|
-
): Promise<(Uint8Array | null)[]>;
|
|
69
|
-
kvBatchPut(
|
|
70
|
-
actorId: string,
|
|
71
|
-
entries: [Uint8Array, Uint8Array][],
|
|
72
|
-
): Promise<void>;
|
|
73
|
-
kvBatchDelete(actorId: string, keys: Uint8Array[]): Promise<void>;
|
|
74
|
-
kvDeleteRange(
|
|
75
|
-
actorId: string,
|
|
76
|
-
start: Uint8Array,
|
|
77
|
-
end: Uint8Array,
|
|
78
|
-
): Promise<void>;
|
|
79
64
|
}
|
|
80
65
|
|
|
81
66
|
export interface RuntimeDisplayInformation {
|
package/src/engine-client/mod.ts
CHANGED
|
@@ -40,7 +40,6 @@ import {
|
|
|
40
40
|
getActor,
|
|
41
41
|
getActorByKey,
|
|
42
42
|
getOrCreateActor,
|
|
43
|
-
kvGet,
|
|
44
43
|
listActorsByName,
|
|
45
44
|
} from "./api-endpoints";
|
|
46
45
|
import { EngineApiError, getEndpoint } from "./api-utils";
|
|
@@ -372,46 +371,6 @@ export class RemoteEngineControlClient implements EngineControlClient {
|
|
|
372
371
|
return await upgradeWebSocket(() => args)(c, noopNext());
|
|
373
372
|
}
|
|
374
373
|
|
|
375
|
-
async kvGet(actorId: string, key: Uint8Array): Promise<string | null> {
|
|
376
|
-
await this.#metadataPromise;
|
|
377
|
-
|
|
378
|
-
logger().debug({ msg: "getting kv value via engine api", key });
|
|
379
|
-
|
|
380
|
-
const response = await kvGet(
|
|
381
|
-
this.#config,
|
|
382
|
-
actorId,
|
|
383
|
-
new TextDecoder("utf8").decode(key),
|
|
384
|
-
);
|
|
385
|
-
|
|
386
|
-
return response.value;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
async kvBatchGet(
|
|
390
|
-
_actorId: string,
|
|
391
|
-
_keys: Uint8Array[],
|
|
392
|
-
): Promise<(Uint8Array | null)[]> {
|
|
393
|
-
throw new Error("kvBatchGet not supported on remote engine client");
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
async kvBatchPut(
|
|
397
|
-
_actorId: string,
|
|
398
|
-
_entries: [Uint8Array, Uint8Array][],
|
|
399
|
-
): Promise<void> {
|
|
400
|
-
throw new Error("kvBatchPut not supported on remote engine client");
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
async kvBatchDelete(_actorId: string, _keys: Uint8Array[]): Promise<void> {
|
|
404
|
-
throw new Error("kvBatchDelete not supported on remote engine client");
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
async kvDeleteRange(
|
|
408
|
-
_actorId: string,
|
|
409
|
-
_start: Uint8Array,
|
|
410
|
-
_end: Uint8Array,
|
|
411
|
-
): Promise<void> {
|
|
412
|
-
throw new Error("kvDeleteRange not supported on remote engine client");
|
|
413
|
-
}
|
|
414
|
-
|
|
415
374
|
displayInformation(): RuntimeDisplayInformation {
|
|
416
375
|
return { properties: {} };
|
|
417
376
|
}
|
|
@@ -4,22 +4,24 @@ import * as v2 from "@/common/bare/generated/inspector/v2";
|
|
|
4
4
|
import * as v3 from "@/common/bare/generated/inspector/v3";
|
|
5
5
|
import * as v4 from "@/common/bare/generated/inspector/v4";
|
|
6
6
|
import * as v5 from "@/common/bare/generated/inspector/v5";
|
|
7
|
+
import * as v6 from "@/common/bare/generated/inspector/v6";
|
|
7
8
|
import {
|
|
8
9
|
decodeWorkflowHistoryTransport,
|
|
9
10
|
encodeWorkflowHistoryTransport,
|
|
10
11
|
} from "@/common/inspector-transport";
|
|
11
12
|
|
|
12
|
-
export * from "@/common/bare/generated/inspector/
|
|
13
|
+
export * from "@/common/bare/generated/inspector/v6";
|
|
13
14
|
export { decodeWorkflowHistoryTransport, encodeWorkflowHistoryTransport };
|
|
14
15
|
export type { WorkflowHistory as TransportWorkflowHistory } from "@/common/bare/transport/v1";
|
|
15
16
|
|
|
16
|
-
export const CURRENT_VERSION =
|
|
17
|
+
export const CURRENT_VERSION = 6;
|
|
17
18
|
|
|
18
19
|
const EVENTS_DROPPED_ERROR = "inspector.events_dropped";
|
|
19
20
|
const WORKFLOW_HISTORY_DROPPED_ERROR = "inspector.workflow_history_dropped";
|
|
20
21
|
const QUEUE_DROPPED_ERROR = "inspector.queue_dropped";
|
|
21
22
|
const TRACE_DROPPED_ERROR = "inspector.trace_dropped";
|
|
22
23
|
const DATABASE_DROPPED_ERROR = "inspector.database_dropped";
|
|
24
|
+
const SCHEDULES_DROPPED_ERROR = "inspector.schedules_dropped";
|
|
23
25
|
|
|
24
26
|
const v1ToClientToV2 = (v1Data: v1.ToClient): v2.ToClient => {
|
|
25
27
|
if (v1Data.body.tag === "Init") {
|
|
@@ -187,12 +189,59 @@ const v5ToClientToV4 = (v5Data: v5.ToClient): v4.ToClient => {
|
|
|
187
189
|
return v5Data as unknown as v4.ToClient;
|
|
188
190
|
};
|
|
189
191
|
|
|
192
|
+
const v5ToClientToV6 = (v5Data: v5.ToClient): v6.ToClient => {
|
|
193
|
+
if (v5Data.body.tag === "Init") {
|
|
194
|
+
return {
|
|
195
|
+
body: {
|
|
196
|
+
tag: "Init",
|
|
197
|
+
val: { ...v5Data.body.val, schedules: [] },
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return v5Data as unknown as v6.ToClient;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const v6ToClientToV5 = (v6Data: v6.ToClient): v5.ToClient => {
|
|
205
|
+
if (v6Data.body.tag === "Init") {
|
|
206
|
+
const { schedules: _schedules, ...rest } = v6Data.body.val;
|
|
207
|
+
return { body: { tag: "Init", val: rest } };
|
|
208
|
+
}
|
|
209
|
+
if (
|
|
210
|
+
v6Data.body.tag === "SchedulesUpdated" ||
|
|
211
|
+
v6Data.body.tag === "SchedulesResponse" ||
|
|
212
|
+
v6Data.body.tag === "ScheduleHistoryResponse" ||
|
|
213
|
+
v6Data.body.tag === "ScheduleDeleteResponse"
|
|
214
|
+
) {
|
|
215
|
+
return {
|
|
216
|
+
body: {
|
|
217
|
+
tag: "Error",
|
|
218
|
+
val: { message: SCHEDULES_DROPPED_ERROR },
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return v6Data as unknown as v5.ToClient;
|
|
223
|
+
};
|
|
224
|
+
|
|
190
225
|
const v4ToServerToV5 = (v4Data: v4.ToServer): v5.ToServer =>
|
|
191
226
|
v4Data as unknown as v5.ToServer;
|
|
192
227
|
|
|
193
228
|
const v5ToServerToV4 = (v5Data: v5.ToServer): v4.ToServer =>
|
|
194
229
|
v5Data as unknown as v4.ToServer;
|
|
195
230
|
|
|
231
|
+
const v5ToServerToV6 = (v5Data: v5.ToServer): v6.ToServer =>
|
|
232
|
+
v5Data as unknown as v6.ToServer;
|
|
233
|
+
|
|
234
|
+
const v6ToServerToV5 = (v6Data: v6.ToServer): v5.ToServer => {
|
|
235
|
+
if (
|
|
236
|
+
v6Data.body.tag === "SchedulesRequest" ||
|
|
237
|
+
v6Data.body.tag === "ScheduleHistoryRequest" ||
|
|
238
|
+
v6Data.body.tag === "ScheduleDeleteRequest"
|
|
239
|
+
) {
|
|
240
|
+
throw new Error("Cannot convert v6-only schedule requests to v5");
|
|
241
|
+
}
|
|
242
|
+
return v6Data as unknown as v5.ToServer;
|
|
243
|
+
};
|
|
244
|
+
|
|
196
245
|
const v1ToServerToV2 = (v1Data: v1.ToServer): v2.ToServer => {
|
|
197
246
|
if (
|
|
198
247
|
v1Data.body.tag === "EventsRequest" ||
|
|
@@ -243,7 +292,7 @@ const v4ToServerToV3 = (v4Data: v4.ToServer): v3.ToServer => {
|
|
|
243
292
|
return v4Data as unknown as v3.ToServer;
|
|
244
293
|
};
|
|
245
294
|
|
|
246
|
-
export const TO_SERVER_VERSIONED = createVersionedDataHandler<
|
|
295
|
+
export const TO_SERVER_VERSIONED = createVersionedDataHandler<v6.ToServer>({
|
|
247
296
|
serializeVersion: (data, version) => {
|
|
248
297
|
switch (version) {
|
|
249
298
|
case 1:
|
|
@@ -255,7 +304,9 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
|
|
|
255
304
|
case 4:
|
|
256
305
|
return v4.encodeToServer(data as unknown as v4.ToServer);
|
|
257
306
|
case 5:
|
|
258
|
-
return v5.encodeToServer(data);
|
|
307
|
+
return v5.encodeToServer(data as unknown as v5.ToServer);
|
|
308
|
+
case 6:
|
|
309
|
+
return v6.encodeToServer(data);
|
|
259
310
|
default:
|
|
260
311
|
throw new Error(`Unknown version ${version}`);
|
|
261
312
|
}
|
|
@@ -271,7 +322,9 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
|
|
|
271
322
|
case 4:
|
|
272
323
|
return v4.decodeToServer(bytes) as unknown as v5.ToServer;
|
|
273
324
|
case 5:
|
|
274
|
-
return v5.decodeToServer(bytes);
|
|
325
|
+
return v5.decodeToServer(bytes) as unknown as v6.ToServer;
|
|
326
|
+
case 6:
|
|
327
|
+
return v6.decodeToServer(bytes);
|
|
275
328
|
default:
|
|
276
329
|
throw new Error(`Unknown version ${version}`);
|
|
277
330
|
}
|
|
@@ -281,8 +334,10 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
|
|
|
281
334
|
v2ToServerToV3,
|
|
282
335
|
v3ToServerToV4,
|
|
283
336
|
v4ToServerToV5,
|
|
337
|
+
v5ToServerToV6,
|
|
284
338
|
],
|
|
285
339
|
serializeConverters: () => [
|
|
340
|
+
v6ToServerToV5,
|
|
286
341
|
v5ToServerToV4,
|
|
287
342
|
v4ToServerToV3,
|
|
288
343
|
v3ToServerToV2,
|
|
@@ -290,7 +345,7 @@ export const TO_SERVER_VERSIONED = createVersionedDataHandler<v5.ToServer>({
|
|
|
290
345
|
],
|
|
291
346
|
});
|
|
292
347
|
|
|
293
|
-
export const TO_CLIENT_VERSIONED = createVersionedDataHandler<
|
|
348
|
+
export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v6.ToClient>({
|
|
294
349
|
serializeVersion: (data, version) => {
|
|
295
350
|
switch (version) {
|
|
296
351
|
case 1:
|
|
@@ -302,7 +357,9 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
|
|
|
302
357
|
case 4:
|
|
303
358
|
return v4.encodeToClient(data as unknown as v4.ToClient);
|
|
304
359
|
case 5:
|
|
305
|
-
return v5.encodeToClient(data);
|
|
360
|
+
return v5.encodeToClient(data as unknown as v5.ToClient);
|
|
361
|
+
case 6:
|
|
362
|
+
return v6.encodeToClient(data);
|
|
306
363
|
default:
|
|
307
364
|
throw new Error(`Unknown version ${version}`);
|
|
308
365
|
}
|
|
@@ -318,7 +375,9 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
|
|
|
318
375
|
case 4:
|
|
319
376
|
return v4.decodeToClient(bytes) as unknown as v5.ToClient;
|
|
320
377
|
case 5:
|
|
321
|
-
return v5.decodeToClient(bytes);
|
|
378
|
+
return v5.decodeToClient(bytes) as unknown as v6.ToClient;
|
|
379
|
+
case 6:
|
|
380
|
+
return v6.decodeToClient(bytes);
|
|
322
381
|
default:
|
|
323
382
|
throw new Error(`Unknown version ${version}`);
|
|
324
383
|
}
|
|
@@ -328,8 +387,10 @@ export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v5.ToClient>({
|
|
|
328
387
|
v2ToClientToV3,
|
|
329
388
|
v3ToClientToV4,
|
|
330
389
|
v4ToClientToV5,
|
|
390
|
+
v5ToClientToV6,
|
|
331
391
|
],
|
|
332
392
|
serializeConverters: () => [
|
|
393
|
+
v6ToClientToV5,
|
|
333
394
|
v5ToClientToV4,
|
|
334
395
|
v4ToClientToV3,
|
|
335
396
|
v3ToClientToV2,
|
package/src/inspector-tab/mod.ts
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { getRunMetadata } from "@/actor/config";
|
|
3
|
-
import type {
|
|
4
|
-
AnyActorDefinition,
|
|
5
|
-
BaseActorDefinition,
|
|
6
|
-
} from "@/actor/definition";
|
|
7
|
-
import {
|
|
8
|
-
KEYS,
|
|
9
|
-
queueMessagesPrefix,
|
|
10
|
-
queueMetadataKey,
|
|
11
|
-
workflowStoragePrefix,
|
|
12
|
-
} from "@/actor/keys";
|
|
3
|
+
import type { AnyActorDefinition } from "@/actor/definition";
|
|
13
4
|
import { buildEngineEndpoint, ENGINE_HOST, ENGINE_PORT } from "@/common/engine";
|
|
14
5
|
import { type Logger, LogLevelSchema } from "@/common/log";
|
|
15
6
|
import { VERSION } from "@/utils";
|
|
@@ -440,31 +431,6 @@ export function buildActorNames(
|
|
|
440
431
|
// Actor options take precedence over run metadata
|
|
441
432
|
metadata.icon = options.icon ?? runMeta.icon;
|
|
442
433
|
metadata.name = options.name ?? runMeta.name;
|
|
443
|
-
metadata.preload = {
|
|
444
|
-
keys: [
|
|
445
|
-
Array.from(KEYS.PERSIST_DATA),
|
|
446
|
-
Array.from(KEYS.INSPECTOR_TOKEN),
|
|
447
|
-
Array.from(queueMetadataKey()),
|
|
448
|
-
Array.from(KEYS.LAST_PUSHED_ALARM),
|
|
449
|
-
],
|
|
450
|
-
prefixes: [
|
|
451
|
-
{
|
|
452
|
-
prefix: Array.from(workflowStoragePrefix()),
|
|
453
|
-
maxBytes: options.preloadMaxWorkflowBytes ?? 131_072,
|
|
454
|
-
partial: false,
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
prefix: Array.from(KEYS.CONN_PREFIX),
|
|
458
|
-
maxBytes: options.preloadMaxConnectionsBytes ?? 65_536,
|
|
459
|
-
partial: false,
|
|
460
|
-
},
|
|
461
|
-
{
|
|
462
|
-
prefix: Array.from(queueMessagesPrefix()),
|
|
463
|
-
maxBytes: 65_536,
|
|
464
|
-
partial: false,
|
|
465
|
-
},
|
|
466
|
-
],
|
|
467
|
-
};
|
|
468
434
|
// Remove undefined values
|
|
469
435
|
if (!metadata.icon) delete metadata.icon;
|
|
470
436
|
if (!metadata.name) delete metadata.name;
|