forked from noxious/client
82 lines
2.1 KiB
TypeScript
82 lines
2.1 KiB
TypeScript
import config from '@/application/config'
|
|
import type { AssetDataT } from '@/application/types'
|
|
import Dexie from 'dexie'
|
|
|
|
export class Assets {
|
|
private db: Dexie
|
|
|
|
constructor() {
|
|
this.db = new Dexie('assets')
|
|
this.db.version(1).stores({
|
|
assets: 'key, group'
|
|
})
|
|
}
|
|
|
|
async download(asset: AssetDataT) {
|
|
try {
|
|
// Check if the asset already exists, then check if updatedAt is newer
|
|
const _asset = await this.db.table('assets').get(asset.key)
|
|
if (_asset && _asset.updatedAt > asset.updatedAt) {
|
|
return
|
|
}
|
|
|
|
// Download the asset
|
|
const response = await fetch(config.server_endpoint + asset.data)
|
|
const blob = await response.blob()
|
|
|
|
// Store the asset in the database
|
|
await this.db.table('assets').put({
|
|
key: asset.key,
|
|
data: blob,
|
|
group: asset.group,
|
|
updatedAt: asset.updatedAt,
|
|
originX: asset.originX,
|
|
originY: asset.originY,
|
|
isAnimated: asset.isAnimated,
|
|
frameRate: asset.frameRate,
|
|
frameWidth: asset.frameWidth,
|
|
frameHeight: asset.frameHeight,
|
|
frameCount: asset.frameCount
|
|
})
|
|
} catch (error) {
|
|
console.error(`Failed to add asset ${asset.key}:`, error)
|
|
}
|
|
}
|
|
|
|
async get(key: string) {
|
|
try {
|
|
const asset = await this.db.table('assets').get(key)
|
|
if (asset) {
|
|
return {
|
|
...asset,
|
|
data: URL.createObjectURL(asset.data) // Convert blob to data URL
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error(`Failed to retrieve asset ${key}:`, error)
|
|
}
|
|
return null
|
|
}
|
|
|
|
async getByGroup(group: string) {
|
|
try {
|
|
const assets = await this.db.table('assets').where('group').equals(group).toArray()
|
|
return assets.map((asset) => ({
|
|
...asset,
|
|
data: URL.createObjectURL(asset.data) // Convert blob to data URL
|
|
}))
|
|
} catch (error) {
|
|
console.error(`Failed to retrieve assets for group ${group}:`, error)
|
|
return []
|
|
}
|
|
}
|
|
|
|
async delete(key: string) {
|
|
try {
|
|
await this.db.table('assets').delete(key)
|
|
} catch (error) {
|
|
console.error(`Failed to delete asset ${key}:`, error)
|
|
}
|
|
}
|
|
}
|