Skip to content

Commit

Permalink
fix: actually set global actual object lifecycle prefs
Browse files Browse the repository at this point in the history
  • Loading branch information
mederka committed Oct 3, 2024
1 parent 1b087b2 commit 2d1bb72
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 8 deletions.
15 changes: 10 additions & 5 deletions projects/fal/src/fal/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from fal.api import RouteSignature
from fal.exceptions import RequestCancelledException
from fal.logging import get_logger
from fal.toolkit.file import get_lifecycle_preference
from fal.toolkit.file.providers import fal as fal_provider_module

REALTIME_APP_REQUIREMENTS = ["websockets", "msgpack"]
Expand Down Expand Up @@ -266,19 +267,23 @@ async def provide_hints_headers(request, call_next):

@app.middleware("http")
async def set_global_object_preference(request, call_next):
response = await call_next(request)
try:
fal_provider_module.GLOBAL_LIFECYCLE_PREFERENCE = request.headers.get(
"X-Fal-Object-Lifecycle-Preference"
)
preference_dict = get_lifecycle_preference(request)
if preference_dict is not None:
fal_provider_module.GLOBAL_LIFECYCLE_PREFERENCE = (
fal_provider_module.ObjectLifecyclePreference.from_dict(
preference_dict
)
)

except Exception:
from fastapi.logger import logger

logger.exception(
"Failed set a global lifecycle preference %s",
self.__class__.__name__,
)
return response
return await call_next(request)

@app.exception_handler(RequestCancelledException)
async def value_error_exception_handler(
Expand Down
6 changes: 3 additions & 3 deletions projects/fal/src/fal/toolkit/file/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ def from_bytes(

fdata = FileData(data, content_type, file_name)

object_lifecycle_preference = _get_lifecycle_preference(request)
object_lifecycle_preference = get_lifecycle_preference(request)

try:
url = repo.save(fdata, object_lifecycle_preference)
Expand Down Expand Up @@ -191,7 +191,7 @@ def from_path(
)

content_type = content_type or "application/octet-stream"
object_lifecycle_preference = _get_lifecycle_preference(request)
object_lifecycle_preference = get_lifecycle_preference(request)

try:
url, data = repo.save_file(
Expand Down Expand Up @@ -274,7 +274,7 @@ def __del__(self):
shutil.rmtree(self.extract_dir)


def _get_lifecycle_preference(request: Request) -> dict[str, str] | None:
def get_lifecycle_preference(request: Request) -> dict[str, str] | None:
import json

preference_str = (
Expand Down
16 changes: 16 additions & 0 deletions projects/fal/src/fal/toolkit/file/providers/fal.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from dataclasses import dataclass
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
from urllib.error import HTTPError
from urllib.parse import urlparse, urlunparse
from urllib.request import Request, urlopen
Expand Down Expand Up @@ -94,6 +95,21 @@ def _refresh_token(self) -> None:
class ObjectLifecyclePreference:
expiration_duration_seconds: int

@classmethod
def from_dict(cls, data: dict[str, Any]) -> ObjectLifecyclePreference:
expiration_duration_seconds_raw = data.get("expiration_duration_seconds")

if expiration_duration_seconds_raw is None:
raise ValueError(
"expiration_duration_seconds is required and must be provided."
)
try:
expiration_duration_seconds = int(expiration_duration_seconds_raw)
except (ValueError, TypeError):
raise ValueError("The expiration_duration_seconds must be an integer.")

return cls(expiration_duration_seconds=expiration_duration_seconds)


GLOBAL_LIFECYCLE_PREFERENCE = ObjectLifecyclePreference(
expiration_duration_seconds=86400
Expand Down

0 comments on commit 2d1bb72

Please sign in to comment.