feat(proxy): svelte support (#47)

This commit is contained in:
Daniel Rochetti 2024-02-05 13:55:16 -08:00 committed by GitHub
parent bc338dfafc
commit 9cc7cf5456
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 1164 additions and 19 deletions

View File

@ -1,6 +1,6 @@
{
"name": "@fal-ai/serverless-proxy",
"version": "0.7.3",
"version": "0.7.4",
"license": "MIT",
"repository": {
"type": "git",
@ -19,7 +19,8 @@
"exports": {
".": "./src/index.js",
"./express": "./src/express.js",
"./nextjs": "./src/nextjs.js"
"./nextjs": "./src/nextjs.js",
"./svelte": "./src/svelte.js"
},
"typesVersions": {
"*": {
@ -28,18 +29,25 @@
],
"nextjs": [
"src/nextjs.d.ts"
],
"svelte": [
"src/svelte.d.ts"
]
}
},
"main": "./src/index.js",
"types": "./src/index.d.ts",
"peerDependencies": {
"@sveltejs/kit": "^2.0.0",
"express": "^4.0.0",
"next": "13.4 - 14",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"peerDependenciesMeta": {
"@sveltejs/kit": {
"optional": true
},
"express": {
"optional": true
},

View File

@ -126,3 +126,15 @@ export async function handleRequest<ResponseType>(
const data = await res.text();
return behavior.respondWith(res.status, data);
}
export function fromHeaders(
headers: Headers
): Record<string, string | string[]> {
// TODO once Header.entries() is available, use that instead
// Object.fromEntries(headers.entries());
const result: Record<string, string | string[]> = {};
headers.forEach((value, key) => {
result[key] = value;
});
return result;
}

View File

@ -1,6 +1,6 @@
import { NextResponse, type NextRequest } from 'next/server';
import type { NextApiHandler } from 'next/types';
import { DEFAULT_PROXY_ROUTE, handleRequest } from './index';
import { DEFAULT_PROXY_ROUTE, fromHeaders, handleRequest } from './index';
/**
* The default Next API route for the fal.ai client proxy.
@ -27,16 +27,6 @@ export const handler: NextApiHandler = async (request, response) => {
});
};
function fromHeaders(headers: Headers): Record<string, string | string[]> {
// TODO once Header.entries() is available, use that instead
// Object.fromEntries(headers.entries());
const result: Record<string, string | string[]> = {};
headers.forEach((value, key) => {
result[key] = value;
});
return result;
}
/**
* The Next API route handler for the fal.ai client proxy on App Router apps.
*

48
libs/proxy/src/svelte.ts Normal file
View File

@ -0,0 +1,48 @@
import { type RequestHandler } from '@sveltejs/kit';
import { fromHeaders, handleRequest } from './index';
type RequestHandlerParams = {
/**
* The credentials to use for the request. Usually comes from `$env/static/private`
*/
credentials?: string | undefined;
};
/**
* Creates the SvelteKit request handler for the fal.ai client proxy on App Router apps.
* The passed credentials will be used to authenticate the request, if not provided the
* environment variable `FAL_KEY` will be used.
*
* @param params the request handler parameters.
* @returns the SvelteKit request handler.
*/
export const createRequestHandler = ({
credentials,
}: RequestHandlerParams = {}) => {
const handler: RequestHandler = async ({ request }) => {
const FAL_KEY = credentials || process.env.FAL_KEY || '';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const responseHeaders: Record<string, any> = {
'Content-Type': 'application/json',
};
return await handleRequest({
id: 'svelte-app-router',
method: request.method,
respondWith: (status, data) =>
new Response(JSON.stringify(data), {
status,
headers: responseHeaders,
}),
getHeaders: () => fromHeaders(request.headers),
getHeader: (name) => request.headers.get(name),
sendHeader: (name, value) => (responseHeaders[name] = value),
getBody: async () => request.text(),
resolveApiKey: () => Promise.resolve(FAL_KEY),
});
};
return {
requestHandler: handler,
GET: handler,
POST: handler,
};
};

1098
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -77,6 +77,7 @@
"@nx/workspace": "16.10.0",
"@secretlint/secretlint-rule-pattern": "^7.0.7",
"@secretlint/secretlint-rule-preset-recommend": "^7.0.7",
"@sveltejs/kit": "^2.5.0",
"@swc-node/core": "^1.10.6",
"@swc-node/register": "^1.6.8",
"@testing-library/react": "14.0.0",