You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB
JavaScript

class Server {
async getEnv(variables) {
return Object.fromEntries(
await Promise.all(
variables.map(async variable => {
const {state} = await Deno.permissions.query({
name: 'env', variable
})
if (state === 'granted') {
return [variable, Deno.env.get(variable)]
} else {
return [variable, undefined]
}
})
)
)
}
async configure() {
const env = await this.getEnv([
'PORT', 'BASE_URL'
])
this.port = env.PORT ?? 3000
this.baseUrl = env.BASE_URL ?? '/macchiato'
}
async serveRequest(event) {
const {pathname} = new URL(event.request.url)
if (pathname === `${this.baseUrl}/api/auth`) {
event.respondWith(new Response(
'extract query and redirect', {status: 200}
))
} else {
event.respondWith(new Response(
'here', {status: 404}
))
}
}
async serveConn(conn) {
console.log({conn})
const httpConn = Deno.serveHttp(conn)
for await (const event of httpConn) {
this.serveRequest(event)
}
}
async serve() {
await this.configure()
this.server = Deno.listen({
port: this.port,
})
for await (const conn of this.server) {
this.serveConn(conn)
}
}
}