MCPcopy Create free account
hub / github.com/vercel/vercel / app

Function app

python/vercel-runtime/src/vercel_runtime/crons.py:96–155  ·  view source on GitHub ↗
(
        scope: dict[str, Any],
        receive: Callable[[], Awaitable[dict[str, Any]]],
        send: Callable[[dict[str, Any]], Awaitable[None]],
    )

Source from the content-addressed store, hash-verified

94 """ASGI app that dispatches to different handlers based on request path."""
95
96 async def app(
97 scope: dict[str, Any],
98 receive: Callable[[], Awaitable[dict[str, Any]]],
99 send: Callable[[dict[str, Any]], Awaitable[None]],
100 ) -> None:
101 scope_type = scope.get("type")
102
103 if scope_type == "lifespan":
104 while True:
105 message = await receive()
106 message_type = message.get("type")
107 if message_type == "lifespan.startup":
108 await send({"type": "lifespan.startup.complete"})
109 elif message_type == "lifespan.shutdown":
110 await send({"type": "lifespan.shutdown.complete"})
111 return
112
113 if scope_type != "http":
114 return
115
116 method = str(scope.get("method") or "GET").upper()
117 if method not in ("GET", "POST"):
118 await drain_body(receive)
119 await send_json_response(send, 405, {"error": "method not allowed"})
120 return
121
122 cron_secret = os.environ.get("CRON_SECRET")
123 if cron_secret:
124 authorization = get_header(scope, "authorization")
125 expected = f"Bearer {cron_secret}"
126 if not authorization or not hmac.compare_digest(
127 authorization, expected
128 ):
129 await drain_body(receive)
130 await send_json_response(send, 401, {"error": "unauthorized"})
131 return
132
133 path = str(scope.get("path") or "/")
134 route = routes.get(path)
135 if route is None:
136 await drain_body(receive)
137 await send_json_response(
138 send, 404, {"error": f"no cron handler for path: {path}"}
139 )
140 return
141
142 run_job, is_async = route
143 await drain_body(receive)
144
145 try:
146 if is_async:
147 await cast("AsyncCronHandler", run_job)()
148 else:
149 await asyncio.to_thread(cast("SyncCronHandler", run_job))
150 except Exception:
151 traceback.print_exc()
152 await send_json_response(send, 500, {"error": "internal"})
153 return

Callers 9

__call__Method · 0.70
run_asgiMethod · 0.50
run_asgiMethod · 0.50
mainMethod · 0.50
run_wsgi_appFunction · 0.50
applicationMethod · 0.50
executeMethod · 0.50
__call__Method · 0.50
__call__Method · 0.50

Calls 7

drain_bodyFunction · 0.90
send_json_responseFunction · 0.90
get_headerFunction · 0.90
receiveFunction · 0.85
upperMethod · 0.80
sendFunction · 0.70
getMethod · 0.65

Tested by 1

run_wsgi_appFunction · 0.40