Skip to content

Commit 8e97108

Browse files
committed
Various fixes and accepted recommendations by CodeRabbit
1 parent 2c3daba commit 8e97108

18 files changed

+110
-38
lines changed

apps/webapp/app/routes/api.v1.packets.$.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { ActionFunctionArgs } from "@remix-run/server-runtime";
22
import { json } from "@remix-run/server-runtime";
33
import { z } from "zod";
44
import { authenticateApiRequest } from "~/services/apiAuth.server";
5-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
5+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
66
import { generatePresignedUrl } from "~/v3/r2.server";
77

88
const ParamsSchema = z.object({

apps/webapp/app/routes/api.v1.projects.$projectRef.runs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ApiRunListPresenter,
66
ApiRunListSearchParams,
77
} from "~/presenters/v3/ApiRunListPresenter.server";
8-
import { createLoaderPATApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
8+
import { createLoaderPATApiRoute } from "~/services/routeBuilders/apiBuilder.server";
99

1010
const ParamsSchema = z.object({
1111
projectRef: z.string(),

apps/webapp/app/routes/api.v1.runs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {
33
ApiRunListPresenter,
44
ApiRunListSearchParams,
55
} from "~/presenters/v3/ApiRunListPresenter.server";
6-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
6+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
77

88
export const loader = createLoaderApiRoute(
99
{

apps/webapp/app/routes/api.v1.tasks.$taskId.trigger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { z } from "zod";
55
import { env } from "~/env.server";
66
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
77
import { logger } from "~/services/logger.server";
8-
import { createActionApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
8+
import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server";
99
import { ServiceValidationError } from "~/v3/services/baseService.server";
1010
import { OutOfEntitlementError, TriggerTaskService } from "~/v3/services/triggerTask.server";
1111

apps/webapp/app/routes/api.v3.runs.$runId.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { json } from "@remix-run/server-runtime";
22
import { z } from "zod";
33
import { ApiRetrieveRunPresenter } from "~/presenters/v3/ApiRetrieveRunPresenter.server";
4-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
4+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
55

66
const ParamsSchema = z.object({
77
runId: z.string(),

apps/webapp/app/routes/realtime.v1.batches.$batchId.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { json } from "@remix-run/server-runtime";
22
import { z } from "zod";
33
import { $replica } from "~/db.server";
44
import { realtimeClient } from "~/services/realtimeClientGlobal.server";
5-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
5+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
66

77
const ParamsSchema = z.object({
88
batchId: z.string(),

apps/webapp/app/routes/realtime.v1.runs.$runId.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { json } from "@remix-run/server-runtime";
22
import { z } from "zod";
33
import { $replica } from "~/db.server";
44
import { realtimeClient } from "~/services/realtimeClientGlobal.server";
5-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
5+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
66

77
const ParamsSchema = z.object({
88
runId: z.string(),

apps/webapp/app/routes/realtime.v1.runs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { z } from "zod";
22
import { realtimeClient } from "~/services/realtimeClientGlobal.server";
3-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
3+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
44

55
const SearchParamsSchema = z.object({
66
tags: z

apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ActionFunctionArgs } from "@remix-run/server-runtime";
22
import { z } from "zod";
33
import { $replica } from "~/db.server";
44
import { realtimeStreams } from "~/services/realtimeStreamsGlobal.server";
5-
import { createLoaderApiRoute } from "~/services/routeBuiilders/apiBuilder.server";
5+
import { createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
66

77
const ParamsSchema = z.object({
88
runId: z.string(),

apps/webapp/app/services/routeBuiilders/apiBuilder.server.ts renamed to apps/webapp/app/services/routeBuilders/apiBuilder.server.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
authenticateApiRequestWithPersonalAccessToken,
1414
PersonalAccessTokenAuthenticationResult,
1515
} from "../personalAccessToken.server";
16+
import { safeJsonParse } from "~/utils/json";
1617

1718
type ApiKeyRouteBuilderOptions<
1819
TParamsSchema extends z.AnyZodObject | undefined = undefined,
@@ -448,7 +449,17 @@ export function createActionApiRoute<
448449
);
449450
}
450451

451-
const body = bodySchema.safeParse(JSON.parse(rawBody));
452+
const rawParsedJson = safeJsonParse(rawBody);
453+
454+
if (!rawParsedJson) {
455+
return wrapResponse(
456+
request,
457+
json({ error: "Invalid JSON" }, { status: 400 }),
458+
corsStrategy !== "none"
459+
);
460+
}
461+
462+
const body = bodySchema.safeParse(rawParsedJson);
452463
if (!body.success) {
453464
return wrapResponse(
454465
request,

packages/core/src/v3/runMetadata/manager.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -173,25 +173,31 @@ export class StandardMetadataManager implements RunMetadataManager {
173173
return $value;
174174
}
175175

176-
// Add the key to the special stream metadata object
177-
this.setKey(`$$stream.${key}`, key);
176+
try {
177+
// Add the key to the special stream metadata object
178+
this.setKey(`$$stream.${key}`, key);
178179

179-
await this.flush();
180+
await this.flush();
180181

181-
const streamInstance = new MetadataStream({
182-
key,
183-
runId: this.runId,
184-
iterator: $value[Symbol.asyncIterator](),
185-
baseUrl: this.streamsBaseUrl,
186-
signal,
187-
});
182+
const streamInstance = new MetadataStream({
183+
key,
184+
runId: this.runId,
185+
iterator: $value[Symbol.asyncIterator](),
186+
baseUrl: this.streamsBaseUrl,
187+
signal,
188+
});
188189

189-
this.activeStreams.set(key, streamInstance);
190+
this.activeStreams.set(key, streamInstance);
190191

191-
// Clean up when stream completes
192-
streamInstance.wait().finally(() => this.activeStreams.delete(key));
192+
// Clean up when stream completes
193+
streamInstance.wait().finally(() => this.activeStreams.delete(key));
193194

194-
return streamInstance;
195+
return streamInstance;
196+
} catch (error) {
197+
// Clean up metadata key if stream creation fails
198+
this.deleteKey(`$$stream.${key}`);
199+
throw error;
200+
}
195201
}
196202

197203
public hasActiveStreams(): boolean {

packages/core/src/v3/runMetadata/metadataStream.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { run } from "node:test";
2-
31
export type MetadataOptions<T> = {
42
baseUrl: string;
53
runId: string;

packages/react-hooks/src/hooks/useApiClient.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ export type UseApiClientOptions = {
1212
export function useApiClient(options?: UseApiClientOptions): ApiClient {
1313
const auth = useTriggerAuthContextOptional();
1414

15-
const baseUrl = auth?.baseURL ?? options?.baseURL ?? "https://api.trigger.dev";
16-
const accessToken = auth?.accessToken ?? options?.accessToken;
15+
const baseUrl = options?.baseURL ?? auth?.baseURL ?? "https://api.trigger.dev";
16+
const accessToken = options?.accessToken ?? auth?.accessToken;
1717

1818
if (!accessToken) {
1919
throw new Error("Missing accessToken in TriggerAuthContext or useApiClient options");

packages/react-hooks/src/hooks/useRealtime.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ export function useRealtimeRun<TTask extends AnyTask>(
8787
}
8888

8989
setError(err as Error);
90+
} finally {
91+
if (abortControllerRef.current) {
92+
abortControllerRef.current = null;
93+
}
9094
}
9195
}, [runId, mutateRun, abortControllerRef, apiClient, setError]);
9296

@@ -104,7 +108,7 @@ export function useRealtimeRun<TTask extends AnyTask>(
104108
return () => {
105109
stop();
106110
};
107-
}, [runId, stop, options?.enabled]);
111+
}, [runId, stop, options?.enabled, triggerRequest]);
108112

109113
return { run, error, stop };
110114
}
@@ -208,6 +212,10 @@ export function useRealtimeRunWithStreams<
208212
}
209213

210214
setError(err as Error);
215+
} finally {
216+
if (abortControllerRef.current) {
217+
abortControllerRef.current = null;
218+
}
211219
}
212220
}, [runId, mutateRun, mutateStreams, streamsRef, abortControllerRef, apiClient, setError]);
213221

@@ -225,7 +233,7 @@ export function useRealtimeRunWithStreams<
225233
return () => {
226234
stop();
227235
};
228-
}, [runId, stop, options?.enabled]);
236+
}, [runId, stop, options?.enabled, triggerRequest]);
229237

230238
return { run, streams: streams ?? initialStreamsFallback, error, stop };
231239
}
@@ -290,6 +298,10 @@ export function useRealtimeRunsWithTag<TTask extends AnyTask>(
290298
}
291299

292300
setError(err as Error);
301+
} finally {
302+
if (abortControllerRef.current) {
303+
abortControllerRef.current = null;
304+
}
293305
}
294306
}, [tag, mutateRuns, runsRef, abortControllerRef, apiClient, setError]);
295307

@@ -303,7 +315,7 @@ export function useRealtimeRunsWithTag<TTask extends AnyTask>(
303315
return () => {
304316
stop();
305317
};
306-
}, [tag, stop, options?.enabled]);
318+
}, [tag, stop, options?.enabled, triggerRequest]);
307319

308320
return { runs: runs ?? [], error, stop };
309321
}
@@ -371,6 +383,10 @@ export function useRealtimeBatch<TTask extends AnyTask>(
371383
}
372384

373385
setError(err as Error);
386+
} finally {
387+
if (abortControllerRef.current) {
388+
abortControllerRef.current = null;
389+
}
374390
}
375391
}, [batchId, mutateRuns, runsRef, abortControllerRef, apiClient, setError]);
376392

@@ -384,7 +400,7 @@ export function useRealtimeBatch<TTask extends AnyTask>(
384400
return () => {
385401
stop();
386402
};
387-
}, [batchId, stop, options?.enabled]);
403+
}, [batchId, stop, options?.enabled, triggerRequest]);
388404

389405
return { runs: runs ?? [], error, stop };
390406
}

packages/react-hooks/src/hooks/useTaskTrigger.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface TriggerInstance<TTask extends AnyTask> {
2323
submit: (payload: TaskPayload<TTask>) => void;
2424
isLoading: boolean;
2525
handle?: RunHandleFromTypes<InferRunTypes<TTask>>;
26+
error?: Error;
2627
}
2728

2829
export type UseTaskTriggerOptions = UseApiClientOptions;
@@ -69,6 +70,7 @@ export function useTaskTrigger<TTask extends AnyTask>(
6970
},
7071
isLoading: mutation.isMutating,
7172
handle: mutation.data as RunHandleFromTypes<InferRunTypes<TTask>>,
73+
error: mutation.error,
7274
};
7375
}
7476

@@ -124,7 +126,11 @@ export function useRealtimeTaskTrigger<TTask extends AnyTask>(
124126
});
125127

126128
return {
127-
...realtimeInstance,
128-
...triggerInstance,
129+
submit: triggerInstance.submit,
130+
isLoading: triggerInstance.isLoading,
131+
handle: triggerInstance.handle,
132+
run: realtimeInstance.run,
133+
error: realtimeInstance.error ?? triggerInstance.error,
134+
stop: realtimeInstance.stop,
129135
};
130136
}

packages/rsc/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"repository": {
1010
"type": "git",
1111
"url": "https://github.com/triggerdotdev/trigger.dev",
12-
"directory": "packages/react-hooks"
12+
"directory": "packages/rsc"
1313
},
1414
"type": "module",
1515
"files": [

packages/trigger-sdk/src/v3/metadata.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,48 @@ function saveMetadata(metadata: RunMetadata): void {
109109
runMetadata.update(metadata);
110110
}
111111

112-
function incrementMetadataKey(key: string, value: number) {
112+
/**
113+
* Increments a numeric value in the metadata of the current run by the specified amount.
114+
* This function allows you to atomically increment a numeric metadata value.
115+
*
116+
* @param {string} key - The key of the numeric value to increment.
117+
* @param {number} value - The amount to increment the value by.
118+
*
119+
* @example
120+
* metadata.increment("counter", 1); // Increments counter by 1
121+
* metadata.increment("score", 10); // Increments score by 10
122+
*/
123+
function incrementMetadataKey(key: string, value: number = 1) {
113124
runMetadata.incrementKey(key, value);
114125
}
115126

116-
function decrementMetadataKey(key: string, value: number) {
127+
/**
128+
* Decrements a numeric value in the metadata of the current run by the specified amount.
129+
* This function allows you to atomically decrement a numeric metadata value.
130+
*
131+
* @param {string} key - The key of the numeric value to decrement.
132+
* @param {number} value - The amount to decrement the value by.
133+
*
134+
* @example
135+
* metadata.decrement("counter", 1); // Decrements counter by 1
136+
* metadata.decrement("score", 5); // Decrements score by 5
137+
*/
138+
function decrementMetadataKey(key: string, value: number = 1) {
117139
runMetadata.decrementKey(key, value);
118140
}
119141

142+
/**
143+
* Appends a value to an array in the metadata of the current run.
144+
* If the key doesn't exist, it creates a new array with the value.
145+
* If the key exists but isn't an array, it converts the existing value to an array.
146+
*
147+
* @param {string} key - The key of the array in metadata.
148+
* @param {DeserializedJson} value - The value to append to the array.
149+
*
150+
* @example
151+
* metadata.append("logs", "User logged in");
152+
* metadata.append("events", { type: "click", timestamp: Date.now() });
153+
*/
120154
function appendMetadataKey(key: string, value: DeserializedJson) {
121155
runMetadata.appendKey(key, value);
122156
}

packages/trigger-sdk/src/v3/shared.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import type {
4444
BatchRunHandleFromTypes,
4545
InferRunTypes,
4646
inferSchemaIn,
47+
inferToolParameters,
4748
RetrieveRunResult,
4849
RunHandle,
4950
RunHandleFromTypes,
@@ -231,7 +232,7 @@ export function createToolTask<
231232
tool: {
232233
parameters: params.parameters,
233234
description: params.description,
234-
execute: async (args: any) => {
235+
execute: async (args: inferToolParameters<TParameters>) => {
235236
return task.triggerAndWait(args).unwrap();
236237
},
237238
},

0 commit comments

Comments
 (0)