UNPKG

@cloudbase/storage

Version:
87 lines (75 loc) 2.71 kB
import { ICloudbase } from '@cloudbase/types' import { ICloudbaseComponent } from '@cloudbase/types/component' import { CloudbaseStorage, COMPONENT_NAME, ICloudbaseContext } from './storage' import { SupabaseFileAPILikeStorage } from './supabase' declare const cloudbase: ICloudbase const storage = new CloudbaseStorage() const component: ICloudbaseComponent = { name: COMPONENT_NAME, entity: { uploadFile: storage.uploadFile, deleteFile: storage.deleteFile, getTempFileURL: storage.getTempFileURL, downloadFile: storage.downloadFile, getUploadMetadata: storage.getUploadMetadata, copyFile: storage.copyFile, getFileInfo: storage.getFileInfo, isGateWay: storage.isGateWay, }, } const supabaseComponent: ICloudbaseComponent = { name: `${COMPONENT_NAME}/supabase`, IIFE: true, entity() { // 在 IIFE 中,this 是 Cloudbase 类(构造函数),不是实例 // 所以我们需要使用 getter 来延迟获取实例的 config 和 request // 使用 WeakMap 缓存每个实例的 storage 对象 const storageCache = new WeakMap<any, SupabaseFileAPILikeStorage>() // 定义 storage 属性的 getter,每个实例只创建一次 Object.defineProperty(this.prototype, 'storage', { get() { // 这里的 this 是 cloudbase 实例 // 如果已经创建过,直接返回缓存的实例 if (storageCache.has(this)) { return storageCache.get(this) } // 创建动态 context,从当前实例获取 config 和 request // eslint-disable-next-line @typescript-eslint/no-this-alias const instance = this // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const context = new Proxy<ICloudbaseContext>({} as ICloudbaseContext, { get: (_target, prop) => { if (prop === 'config') { return instance.config } if (prop === 'request') { return instance.request } return undefined }, }) // 创建新的 storage 实例并缓存 const storage = new SupabaseFileAPILikeStorage(context) storageCache.set(this, storage) return storage }, configurable: true, enumerable: true, }) }, } try { cloudbase.registerComponent(component) cloudbase.registerComponent(supabaseComponent) } catch (e) {} export function registerStorage(app: Pick<ICloudbase, 'registerComponent'>) { try { app.registerComponent(component) app.registerComponent(supabaseComponent) } catch (e) { console.warn(e) } } try { (window as any).registerStorage = registerStorage } catch (e) {}