Skip to content

Instantly share code, notes, and snippets.

@daliborgogic
Last active September 12, 2022 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save daliborgogic/11c93fdee89e73472d499eab70695860 to your computer and use it in GitHub Desktop.
Save daliborgogic/11c93fdee89e73472d499eab70695860 to your computer and use it in GitHub Desktop.
Gateway as a Service (GaaS)
function createApi(baseUrl, defaults = {}) {
const callable = () => {}
callable.url = baseUrl
return new Proxy(callable, {
get({ url }, key) {
const method = key.toUpperCase()
if (['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(method)) {
return (data, overrides = {}) => {
const payload = { method, ...defaults, ...overrides }
switch (method) {
case 'GET': {
if (data) url = `${url}?${new URLSearchParams(data)}`
break
}
case 'POST':
case 'PUT':
case 'PATCH': {
payload.body = JSON.stringify(data)
}
}
return fetch(url, payload).then(d => d.json())
}
}
return createApi(`${url}/${key}`, defaults)
}
})
}
export { createApi }
{
"scripts": {
"dev": "wrangler dev --local --port 3000 --inspect false worker.mjs"
},
"devDependencies": {
"wrangler": "^2.0.29"
}
}
import { createApi } from './api.mjs'
export default {
async fetch(request) {
try {
const headers = request.headers
const uri = new URL(request.url)
const { origin, pathname } = new URL(uri.pathname.substring(1))
const api = createApi(origin, { headers })
const payload = await api[pathname][request.method](uri.searchParams)
return Response.json(payload)
} catch (error) {
return Response.json({ error: error.message })
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment