Extended fal.ai client and server proxy with upload progress tracking and React Native support
npm install @rsemihkoca/fal-extendedAll-in-one fal.ai package with client and server proxy including upload progress tracking.
``bash`
npm install @rsemihkoca/fal-extended
This single package includes:
- π― Client - Browser/Node.js client with upload progress
- π Proxy - Server proxy with storage handlers
`typescript
import { fal } from '@rsemihkoca/fal-extended';
// Configure with your proxy
fal.config({
proxyUrl: 'http://localhost:3000/api/fal/proxy'
});
// Upload with progress
const url = await fal.storage.upload(file, {
onProgress: (e) => {
console.log(${e.progress}% - ${e.type});Part ${e.currentPart}/${e.totalParts}
if (e.currentPart) {
console.log();`
}
}
});
`typescript
import express from 'express';
import * as fal from '@rsemihkoca/fal-extended/proxy/express';
const app = express();
app.use(express.json());
// Single line setup!
app.use(${fal.route}/storage/upload, fal.storageHandler);
app.use(fal.route, fal.handler);
app.listen(3000);
`
`typescript
// Client
import { fal } from '@rsemihkoca/fal-extended';
// or
import { fal } from '@rsemihkoca/fal-extended/client';
// Proxy - Express
import * as fal from '@rsemihkoca/fal-extended/proxy/express';
// Proxy - Next.js
import * as fal from '@rsemihkoca/fal-extended/proxy/nextjs';
// Proxy - Hono
import * as fal from '@rsemihkoca/fal-extended/proxy/hono';
// Proxy - Core
import * as fal from '@rsemihkoca/fal-extended/proxy';
`
`typescript
import { fal } from '@rsemihkoca/fal-extended';
import { useState } from 'react';
function FileUploader() {
const [progress, setProgress] = useState(0);
const [status, setStatus] = useState('');
const handleUpload = async (file: File) => {
const url = await fal.storage.upload(file, {
onProgress: (e) => {
setProgress(e.progress);
setStatus(e.currentPart
? Uploading part ${e.currentPart}/${e.totalParts}
: e.type
);
}
});
return url;
};
return (
{status}
$3
`typescript
import express from 'express';
import cors from 'cors';
import * as fal from '@rsemihkoca/fal-extended/proxy/express';const app = express();
// Middleware
app.use(cors());
app.use(express.json());
// Logging (optional)
app.use((req, res, next) => {
console.log(
${req.method} ${req.url});
next();
});// fal.ai routes
app.use(
${fal.route}/storage/upload, fal.storageHandler);
app.use(fal.route, fal.handler);// Start server
app.listen(3000, () => {
console.log('π Proxy server running on http://localhost:3000');
console.log(
π‘ Storage endpoint: ${fal.route}/storage/upload);
console.log(π‘ General proxy: ${fal.route});
});
`$3
`bash
.env
FAL_KEY=your-fal-key-hereOr use separate key ID and secret
FAL_KEY_ID=your-key-id
FAL_KEY_SECRET=your-key-secret
`π Security
NEVER expose FAL_KEY in the browser!
β
Correct:
`typescript
// Client - uses proxy (credentials stay on server)
fal.config({ proxyUrl: 'https://your-server.com/api/fal/proxy' });
`β Wrong:
`typescript
// Client - exposes credentials!
fal.config({ credentials: 'fal-key-xxx' });
`π Upload Flow
`
ββββββββββββ βββββββββββ ββββββββββ
β Client βββββββββββββββββββΆβ Proxy ββββββββββββββββββΆβ fal.ai β
β (Browser)β No credentials β (Server)β With FAL_KEY β API β
ββββββββββββ βββββββββββ ββββββββββ
β β
β ββββββ signed URL βββββββββββ€
β
βΌ
ββββββββββββ
β Storage β Direct upload (S3/CDN)
β (Fast!) β No proxy overhead!
ββββββββββββ
`π Documentation
- Client README
- Proxy README
- Storage Upload Guide
π Framework Examples
$3
`typescript
// app/api/fal/[[...path]]/route.ts
export { GET, POST, PUT, DELETE } from '@rsemihkoca/fal-extended/proxy/nextjs';
`$3
`typescript
import { Hono } from 'hono';
import * as fal from '@rsemihkoca/fal-extended/proxy/hono';const app = new Hono();
app.use(
${fal.route}/storage/upload/*, fal.storageHandler);
app.use(${fal.route}/*, fal.handler);
`π¦ Package Size
This package includes both client and proxy code. If you only need one:
`typescript
// Tree-shaking will remove unused code in production builds// Only import what you need
import { fal } from '@rsemihkoca/fal-extended/client'; // Client only
import * as fal from '@rsemihkoca/fal-extended/proxy/express'; // Proxy only
``| Feature | Original fal.ai | @rsemihkoca/fal-extended |
|---------|----------------|--------------------------|
| Basic client | β
| β
|
| Server proxy | β
| β
|
| Upload progress | β | β
|
| Multipart progress | β | β
|
| Storage handlers | β | β
|
| Single handler | β | β
|
MIT
Based on @fal-ai/client. Contributions welcome!
Report issues at: https://github.com/rsemihkoca/fal-extended/issues