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.
111 lines
1.9 KiB
111 lines
1.9 KiB
'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
|
|
};
|