All files / src handler.ts

100% Statements 24/24
100% Branches 1/1
100% Functions 5/5
100% Lines 24/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 674x   4x 4x                       67x 67x       67x       67x   7x   67x 67x 67x   67x       4x       4x           4x         87x 87x 141x 141x 83x       4x     4x 67x 67x    
import { getScriptDownloadPath, getGetResultPath, WorkerEnv, getStatusPagePath } from './env'
 
import { handleDownloadScript, handleIngressAPI, handleStatusPage } from './handlers'
import { createRoute } from './utils'
 
export type Route = {
  pathPattern: RegExp
  handler: (
    request: Request,
    env: WorkerEnv,
    routeMatchArray: RegExpMatchArray | undefined
  ) => Response | Promise<Response>
}
 
function createRoutes(env: WorkerEnv): Route[] {
  const routes: Route[] = []
  const downloadScriptRoute: Route = {
    pathPattern: createRoute(getScriptDownloadPath(env)),
    handler: handleDownloadScript,
  }
  const ingressAPIRoute: Route = {
    pathPattern: createRoute(getGetResultPath(env)),
    handler: handleIngressAPI,
  }
  const statusRoute: Route = {
    pathPattern: createRoute(getStatusPagePath()),
    handler: (request, env) => handleStatusPage(request, env),
  }
  routes.push(downloadScriptRoute)
  routes.push(ingressAPIRoute)
  routes.push(statusRoute)
 
  return routes
}
 
function handleNoMatch(urlPathname: string): Response {
  const responseHeaders = new Headers({
    'content-type': 'application/json',
  })
 
  return new Response(JSON.stringify({ error: `unmatched path ${urlPathname}` }), {
    status: 404,
    headers: responseHeaders,
  })
}
 
export function handleRequestWithRoutes(
  request: Request,
  env: WorkerEnv,
  routes: Route[]
): Promise<Response> | Response {
  const url = new URL(request.url)
  for (const route of routes) {
    const matches = url.pathname.match(route.pathPattern)
    if (matches) {
      return route.handler(request, env, matches)
    }
  }
 
  return handleNoMatch(url.pathname)
}
 
export async function handleRequest(request: Request, env: WorkerEnv): Promise<Response> {
  const routes = createRoutes(env)
  return handleRequestWithRoutes(request, env, routes)
}