Skip to content

Commit 70f2574

Browse files
committed
webflow + fal
1 parent 42f4ecc commit 70f2574

File tree

8 files changed

+222
-129
lines changed

8 files changed

+222
-129
lines changed

plugins/fal/steps/generate-image.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@ type FalImageResponse = {
3131
error?: string;
3232
};
3333

34-
type GenerateImageResult = {
35-
imageUrl: string;
36-
width?: number;
37-
height?: number;
38-
};
34+
type GenerateImageResult =
35+
| { success: true; data: { imageUrl: string; width?: number; height?: number } }
36+
| { success: false; error: { message: string } };
3937

4038
export type FalGenerateImageCoreInput = {
4139
model: string;
@@ -104,7 +102,13 @@ async function stepHandler(
104102
const apiKey = credentials.FAL_API_KEY;
105103

106104
if (!apiKey) {
107-
throw new Error("FAL_API_KEY is not configured. Please add it in Project Integrations.");
105+
return {
106+
success: false,
107+
error: {
108+
message:
109+
"FAL_API_KEY is not configured. Please add it in Project Integrations.",
110+
},
111+
};
108112
}
109113

110114
try {
@@ -124,14 +128,20 @@ async function stepHandler(
124128

125129
if (!response.ok) {
126130
const errorText = await response.text();
127-
throw new Error(`HTTP ${response.status}: ${errorText}`);
131+
return {
132+
success: false,
133+
error: { message: `HTTP ${response.status}: ${errorText}` },
134+
};
128135
}
129136

130137
const queueResponse = (await response.json()) as FalQueueResponse;
131138

132139
// If the response is queued, poll for the result
133140
let result: FalImageResponse;
134-
if (queueResponse.status === "IN_QUEUE" || queueResponse.status === "IN_PROGRESS") {
141+
if (
142+
queueResponse.status === "IN_QUEUE" ||
143+
queueResponse.status === "IN_PROGRESS"
144+
) {
135145
result = await pollForResult(
136146
queueResponse.status_url,
137147
queueResponse.response_url,
@@ -143,21 +153,26 @@ async function stepHandler(
143153
}
144154

145155
if (result.error) {
146-
throw new Error(result.error);
156+
return { success: false, error: { message: result.error } };
147157
}
148158

149159
if (!result.images || result.images.length === 0) {
150-
throw new Error("No images returned from fal.ai");
160+
return {
161+
success: false,
162+
error: { message: "No images returned from fal.ai" },
163+
};
151164
}
152165

153166
const image = result.images[0];
154167
return {
155-
imageUrl: image.url,
156-
width: image.width,
157-
height: image.height,
168+
success: true,
169+
data: { imageUrl: image.url, width: image.width, height: image.height },
158170
};
159171
} catch (error) {
160-
throw new Error(`Failed to generate image: ${getErrorMessage(error)}`);
172+
return {
173+
success: false,
174+
error: { message: `Failed to generate image: ${getErrorMessage(error)}` },
175+
};
161176
}
162177
}
163178

plugins/fal/steps/generate-video.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ type FalVideoResponse = {
2828
error?: string;
2929
};
3030

31-
type GenerateVideoResult = {
32-
videoUrl: string;
33-
};
31+
type GenerateVideoResult =
32+
| { success: true; data: { videoUrl: string } }
33+
| { success: false; error: { message: string } };
3434

3535
export type FalGenerateVideoCoreInput = {
3636
model: string;
@@ -96,7 +96,13 @@ async function stepHandler(
9696
const apiKey = credentials.FAL_API_KEY;
9797

9898
if (!apiKey) {
99-
throw new Error("FAL_API_KEY is not configured. Please add it in Project Integrations.");
99+
return {
100+
success: false,
101+
error: {
102+
message:
103+
"FAL_API_KEY is not configured. Please add it in Project Integrations.",
104+
},
105+
};
100106
}
101107

102108
try {
@@ -121,13 +127,19 @@ async function stepHandler(
121127

122128
if (!response.ok) {
123129
const errorText = await response.text();
124-
throw new Error(`HTTP ${response.status}: ${errorText}`);
130+
return {
131+
success: false,
132+
error: { message: `HTTP ${response.status}: ${errorText}` },
133+
};
125134
}
126135

127136
const queueResponse = (await response.json()) as FalQueueResponse;
128137

129138
let result: FalVideoResponse;
130-
if (queueResponse.status === "IN_QUEUE" || queueResponse.status === "IN_PROGRESS") {
139+
if (
140+
queueResponse.status === "IN_QUEUE" ||
141+
queueResponse.status === "IN_PROGRESS"
142+
) {
131143
result = await pollForResult(
132144
queueResponse.status_url,
133145
queueResponse.response_url,
@@ -138,18 +150,22 @@ async function stepHandler(
138150
}
139151

140152
if (result.error) {
141-
throw new Error(result.error);
153+
return { success: false, error: { message: result.error } };
142154
}
143155

144156
if (!result.video?.url) {
145-
throw new Error("No video returned from fal.ai");
157+
return {
158+
success: false,
159+
error: { message: "No video returned from fal.ai" },
160+
};
146161
}
147162

163+
return { success: true, data: { videoUrl: result.video.url } };
164+
} catch (error) {
148165
return {
149-
videoUrl: result.video.url,
166+
success: false,
167+
error: { message: `Failed to generate video: ${getErrorMessage(error)}` },
150168
};
151-
} catch (error) {
152-
throw new Error(`Failed to generate video: ${getErrorMessage(error)}`);
153169
}
154170
}
155171

plugins/fal/steps/image-to-image.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,9 @@ type FalImageToImageResponse = {
3535
error?: string;
3636
};
3737

38-
type ImageToImageResult = {
39-
imageUrl: string;
40-
width?: number;
41-
height?: number;
42-
};
38+
type ImageToImageResult =
39+
| { success: true; data: { imageUrl: string; width?: number; height?: number } }
40+
| { success: false; error: { message: string } };
4341

4442
export type FalImageToImageCoreInput = {
4543
model: string;
@@ -99,7 +97,13 @@ async function stepHandler(
9997
const apiKey = credentials.FAL_API_KEY;
10098

10199
if (!apiKey) {
102-
throw new Error("FAL_API_KEY is not configured. Please add it in Project Integrations.");
100+
return {
101+
success: false,
102+
error: {
103+
message:
104+
"FAL_API_KEY is not configured. Please add it in Project Integrations.",
105+
},
106+
};
103107
}
104108

105109
try {
@@ -121,13 +125,19 @@ async function stepHandler(
121125

122126
if (!response.ok) {
123127
const errorText = await response.text();
124-
throw new Error(`HTTP ${response.status}: ${errorText}`);
128+
return {
129+
success: false,
130+
error: { message: `HTTP ${response.status}: ${errorText}` },
131+
};
125132
}
126133

127134
const queueResponse = (await response.json()) as FalQueueResponse;
128135

129136
let result: FalImageToImageResponse;
130-
if (queueResponse.status === "IN_QUEUE" || queueResponse.status === "IN_PROGRESS") {
137+
if (
138+
queueResponse.status === "IN_QUEUE" ||
139+
queueResponse.status === "IN_PROGRESS"
140+
) {
131141
result = await pollForResult(
132142
queueResponse.status_url,
133143
queueResponse.response_url,
@@ -138,22 +148,29 @@ async function stepHandler(
138148
}
139149

140150
if (result.error) {
141-
throw new Error(result.error);
151+
return { success: false, error: { message: result.error } };
142152
}
143153

144154
// Handle both array format (images) and single image format
145155
const image = result.images?.[0] || result.image;
146156
if (!image?.url) {
147-
throw new Error("No image returned from fal.ai");
157+
return {
158+
success: false,
159+
error: { message: "No image returned from fal.ai" },
160+
};
148161
}
149162

150163
return {
151-
imageUrl: image.url,
152-
width: image.width,
153-
height: image.height,
164+
success: true,
165+
data: { imageUrl: image.url, width: image.width, height: image.height },
154166
};
155167
} catch (error) {
156-
throw new Error(`Failed to transform image: ${getErrorMessage(error)}`);
168+
return {
169+
success: false,
170+
error: {
171+
message: `Failed to transform image: ${getErrorMessage(error)}`,
172+
},
173+
};
157174
}
158175
}
159176

plugins/fal/steps/remove-background.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ type FalRemoveBackgroundResponse = {
2828
error?: string;
2929
};
3030

31-
type RemoveBackgroundResult = {
32-
imageUrl: string;
33-
};
31+
type RemoveBackgroundResult =
32+
| { success: true; data: { imageUrl: string } }
33+
| { success: false; error: { message: string } };
3434

3535
export type FalRemoveBackgroundCoreInput = {
3636
imageUrl: string;
@@ -87,7 +87,13 @@ async function stepHandler(
8787
const apiKey = credentials.FAL_API_KEY;
8888

8989
if (!apiKey) {
90-
throw new Error("FAL_API_KEY is not configured. Please add it in Project Integrations.");
90+
return {
91+
success: false,
92+
error: {
93+
message:
94+
"FAL_API_KEY is not configured. Please add it in Project Integrations.",
95+
},
96+
};
9197
}
9298

9399
try {
@@ -104,13 +110,19 @@ async function stepHandler(
104110

105111
if (!response.ok) {
106112
const errorText = await response.text();
107-
throw new Error(`HTTP ${response.status}: ${errorText}`);
113+
return {
114+
success: false,
115+
error: { message: `HTTP ${response.status}: ${errorText}` },
116+
};
108117
}
109118

110119
const queueResponse = (await response.json()) as FalQueueResponse;
111120

112121
let result: FalRemoveBackgroundResponse;
113-
if (queueResponse.status === "IN_QUEUE" || queueResponse.status === "IN_PROGRESS") {
122+
if (
123+
queueResponse.status === "IN_QUEUE" ||
124+
queueResponse.status === "IN_PROGRESS"
125+
) {
114126
result = await pollForResult(
115127
queueResponse.status_url,
116128
queueResponse.response_url,
@@ -121,18 +133,24 @@ async function stepHandler(
121133
}
122134

123135
if (result.error) {
124-
throw new Error(result.error);
136+
return { success: false, error: { message: result.error } };
125137
}
126138

127139
if (!result.image?.url) {
128-
throw new Error("No image returned from fal.ai");
140+
return {
141+
success: false,
142+
error: { message: "No image returned from fal.ai" },
143+
};
129144
}
130145

146+
return { success: true, data: { imageUrl: result.image.url } };
147+
} catch (error) {
131148
return {
132-
imageUrl: result.image.url,
149+
success: false,
150+
error: {
151+
message: `Failed to remove background: ${getErrorMessage(error)}`,
152+
},
133153
};
134-
} catch (error) {
135-
throw new Error(`Failed to remove background: ${getErrorMessage(error)}`);
136154
}
137155
}
138156

0 commit comments

Comments
 (0)