@cloudbase/storage
Version:
cloudbase js sdk storage module
87 lines (75 loc) • 2.71 kB
text/typescript
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) {}