| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | import iofrom collections.abc import Generatorfrom pathlib import Pathfrom supabase import Clientfrom configs import dify_configfrom extensions.storage.base_storage import BaseStorageclass SupabaseStorage(BaseStorage):    """Implementation for supabase obs storage."""    def __init__(self):        super().__init__()        if dify_config.SUPABASE_URL is None:            raise ValueError("SUPABASE_URL is not set")        if dify_config.SUPABASE_API_KEY is None:            raise ValueError("SUPABASE_API_KEY is not set")        if dify_config.SUPABASE_BUCKET_NAME is None:            raise ValueError("SUPABASE_BUCKET_NAME is not set")        self.bucket_name = dify_config.SUPABASE_BUCKET_NAME        self.client = Client(supabase_url=dify_config.SUPABASE_URL, supabase_key=dify_config.SUPABASE_API_KEY)        self.create_bucket(id=dify_config.SUPABASE_BUCKET_NAME, bucket_name=dify_config.SUPABASE_BUCKET_NAME)    def create_bucket(self, id, bucket_name):        if not self.bucket_exists():            self.client.storage.create_bucket(id=id, name=bucket_name)    def save(self, filename, data):        self.client.storage.from_(self.bucket_name).upload(filename, data)    def load_once(self, filename: str) -> bytes:        content: bytes = self.client.storage.from_(self.bucket_name).download(filename)        return content    def load_stream(self, filename: str) -> Generator:        result = self.client.storage.from_(self.bucket_name).download(filename)        byte_stream = io.BytesIO(result)        while chunk := byte_stream.read(4096):  # Read in chunks of 4KB            yield chunk    def download(self, filename, target_filepath):        result = self.client.storage.from_(self.bucket_name).download(filename)        Path(target_filepath).write_bytes(result)    def exists(self, filename):        result = self.client.storage.from_(self.bucket_name).list(filename)        if result.count() > 0:            return True        return False    def delete(self, filename):        self.client.storage.from_(self.bucket_name).remove(filename)    def bucket_exists(self):        buckets = self.client.storage.list_buckets()        return any(bucket.name == self.bucket_name for bucket in buckets)
 |