Skip to content

Commit 54ac089

Browse files
committed
improve s3 pre-signing errors
1 parent 8f6e8be commit 54ac089

File tree

4 files changed

+77
-20
lines changed

4 files changed

+77
-20
lines changed

apps/webapp/app/presenters/v3/ApiRetrieveRunPresenter.server.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,21 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
117117
payloadPacket.dataType === "application/store" &&
118118
typeof payloadPacket.data === "string"
119119
) {
120-
$payloadPresignedUrl = await generatePresignedUrl(
120+
const signed = await generatePresignedUrl(
121121
env.project.externalRef,
122122
env.slug,
123123
payloadPacket.data,
124124
"GET"
125125
);
126+
127+
if (signed.success) {
128+
$payloadPresignedUrl = signed.url;
129+
} else {
130+
logger.error(`Failed to generate presigned URL for payload: ${signed.error}`, {
131+
taskRunId: taskRun.id,
132+
payload: payloadPacket.data,
133+
});
134+
}
126135
} else {
127136
$payload = await parsePacket(payloadPacket);
128137
}
@@ -137,12 +146,21 @@ export class ApiRetrieveRunPresenter extends BasePresenter {
137146
outputPacket.dataType === "application/store" &&
138147
typeof outputPacket.data === "string"
139148
) {
140-
$outputPresignedUrl = await generatePresignedUrl(
149+
const signed = await generatePresignedUrl(
141150
env.project.externalRef,
142151
env.slug,
143152
outputPacket.data,
144153
"GET"
145154
);
155+
156+
if (signed.success) {
157+
$outputPresignedUrl = signed.url;
158+
} else {
159+
logger.error(`Failed to generate presigned URL for output: ${signed.error}`, {
160+
taskRunId: taskRun.id,
161+
output: outputPacket.data,
162+
});
163+
}
146164
} else {
147165
$output = await parsePacket(outputPacket);
148166
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ export async function action({ request, params }: ActionFunctionArgs) {
2525
const parsedParams = ParamsSchema.parse(params);
2626
const filename = parsedParams["*"];
2727

28-
const presignedUrl = await generatePresignedUrl(
28+
const signed = await generatePresignedUrl(
2929
authenticationResult.environment.project.externalRef,
3030
authenticationResult.environment.slug,
3131
filename,
3232
"PUT"
3333
);
3434

35-
if (!presignedUrl) {
36-
return json({ error: "Failed to generate presigned URL" }, { status: 500 });
35+
if (!signed.success) {
36+
return json({ error: `Failed to generate presigned URL: ${signed.error}` }, { status: 500 });
3737
}
3838

3939
// Caller can now use this URL to upload to that object.
40-
return json({ presignedUrl });
40+
return json({ presignedUrl: signed.url });
4141
}
4242

4343
export const loader = createLoaderApiRoute(
@@ -50,18 +50,18 @@ export const loader = createLoaderApiRoute(
5050
async ({ params, authentication }) => {
5151
const filename = params["*"];
5252

53-
const presignedUrl = await generatePresignedUrl(
53+
const signed = await generatePresignedUrl(
5454
authentication.environment.project.externalRef,
5555
authentication.environment.slug,
5656
filename,
5757
"GET"
5858
);
5959

60-
if (!presignedUrl) {
61-
return json({ error: "Failed to generate presigned URL" }, { status: 500 });
60+
if (!signed.success) {
61+
return json({ error: `Failed to generate presigned URL: ${signed.error}` }, { status: 500 });
6262
}
6363

6464
// Caller can now use this URL to fetch that object.
65-
return json({ presignedUrl });
65+
return json({ presignedUrl: signed.url });
6666
}
6767
);

apps/webapp/app/routes/resources.packets.$environmentId.$.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
4141
"GET"
4242
);
4343

44-
if (!signed) {
45-
return new Response("Failed to generate presigned URL", { status: 500 });
44+
if (!signed.success) {
45+
return new Response(`Failed to generate presigned URL: ${signed.error}`, { status: 500 });
4646
}
4747

48-
const response = await fetch(signed.url, {
49-
headers: signed.headers,
48+
const response = await fetch(signed.request.url, {
49+
headers: signed.request.headers,
5050
});
5151

5252
return new Response(response.body, {

apps/webapp/app/v3/r2.server.ts

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,28 @@ export async function generatePresignedRequest(
152152
envSlug: string,
153153
filename: string,
154154
method: "PUT" | "GET" = "PUT"
155-
) {
155+
): Promise<
156+
| {
157+
success: false;
158+
error: string;
159+
}
160+
| {
161+
success: true;
162+
request: Request;
163+
}
164+
> {
156165
if (!env.OBJECT_STORE_BASE_URL) {
157-
return;
166+
return {
167+
success: false,
168+
error: "Object store base URL is not set",
169+
};
158170
}
159171

160172
if (!r2) {
161-
return;
173+
return {
174+
success: false,
175+
error: "Object store client is not initialized",
176+
};
162177
}
163178

164179
const url = new URL(env.OBJECT_STORE_BASE_URL);
@@ -182,16 +197,40 @@ export async function generatePresignedRequest(
182197
filename,
183198
});
184199

185-
return signed;
200+
return {
201+
success: true,
202+
request: signed,
203+
};
186204
}
187205

188206
export async function generatePresignedUrl(
189207
projectRef: string,
190208
envSlug: string,
191209
filename: string,
192210
method: "PUT" | "GET" = "PUT"
193-
) {
211+
): Promise<
212+
| {
213+
success: false;
214+
error: string;
215+
}
216+
| {
217+
success: true;
218+
url: string;
219+
}
220+
> {
194221
const signed = await generatePresignedRequest(projectRef, envSlug, filename, method);
195222

196-
return signed?.url;
223+
if (!signed.success) {
224+
return {
225+
success: false,
226+
error: signed.error,
227+
};
228+
}
229+
230+
signed;
231+
232+
return {
233+
success: true,
234+
url: signed.request.url,
235+
};
197236
}

0 commit comments

Comments
 (0)