You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
'use strict';
const { Validator } = require('./validator.js')
const { CacheKeyCascade } = require('./uni-cloud-cache.js')
const { BridgeError } = require('./bridge-error.js')
class Storage {
constructor(type, keys) { this._type = type || null this._keys = keys || [] }
async get(key, fallback) { this.validateKey(key) const result = await this.create(key, fallback).get() return result.value }
async set(key, value, expiresIn) { this.validateKey(key) this.validateValue(value) const expires_in = this.getExpiresIn(expiresIn) if (expires_in !== 0) { await this.create(key).set(this.getValue(value), expires_in) } }
async remove(key) { this.validateKey(key) await this.create(key).remove() }
// virtual
async update(key) { this.validateKey(key) }
async ttl(key) { this.validateKey(key) // 后续考虑支持
}
async fallback(key) {}
getKeyString(key) { const keyArray = [Storage.Prefix] this._keys.forEach((name) => { keyArray.push(key[name]) }) keyArray.push(this._type) return keyArray.join(':') }
getValue(value) { return value }
getExpiresIn(value) { if (value !== undefined) { return value } return -1 }
validateKey(key) { Validator.Key(this._keys, key) }
validateValue(value) { Validator.Value(value) }
create(key, fallback) { const keyString = this.getKeyString(key) const options = { layers: [{ type: 'database', key: keyString }, { type: 'redis', key: keyString }] }
const _this = this return new CacheKeyCascade({ ...options, fallback: async function() { if (fallback) { return fallback(key) } else if (_this.fallback) { return _this.fallback(key) } } }) } } Storage.Prefix = "uni-id"
module.exports = { Storage };
|