123 lines
3.8 KiB
JavaScript
123 lines
3.8 KiB
JavaScript
/**
|
|
* Удобное хранение и освобождение временных ссылок
|
|
* ВНИМАНИЕ: При очистке освобождаются все ссылки
|
|
*
|
|
* @class RefManager
|
|
* @property {Map<string, string>} refs - хранилище
|
|
*/
|
|
class RefManager {
|
|
/**
|
|
* @param {Map<string, string> | Object} [refs]
|
|
*/
|
|
constructor (refs = null) {
|
|
recovery((self) => {
|
|
/** Инициализация хранилища */
|
|
self.refs = new Map()
|
|
|
|
if(refs) {
|
|
if(Array.isArray(refs))
|
|
refs.forEach(ref => { self.save({ref}) });
|
|
else {
|
|
/** Связки из аргумента refs */
|
|
const refs_entries = (refs instanceof Map)
|
|
? refs.entries()
|
|
: (typeof refs === 'object' && refs !== null)
|
|
? Object.entries(refs)
|
|
: (() => {throw new Error("Невалидный аргумент")})()
|
|
|
|
/** Сохранение ссылок в хранилище */
|
|
Array.from(refs_entries).forEach(
|
|
([key, ref]) => self.save({key, ref})
|
|
)
|
|
}
|
|
}
|
|
}, (...e) => {
|
|
console.log("Ошибка инициализии RefManager");
|
|
e.forEach(er => {throw er});
|
|
}) (this)
|
|
}
|
|
|
|
/**
|
|
* Проверка ссылки
|
|
* @static @method
|
|
* @param {string} ref - ссылка
|
|
* @returns {string}
|
|
*/
|
|
static check = recovery(ref => {
|
|
if(typeof ref !== 'string')
|
|
throw Error("Неизвестный объект в массиве строк")
|
|
return ref
|
|
}, (...e) => {
|
|
console.log("Ошибка при проверке значения (RefManager.check)");
|
|
e.forEach(er => {throw er});
|
|
})
|
|
|
|
/**
|
|
* Сохранение сслыки
|
|
* @method
|
|
* @param {string} [key] - ключ
|
|
* @param {string} ref - ссылка
|
|
* @returns {{key: string, ref: string}}
|
|
*/
|
|
save = recovery(
|
|
({key = null, ref}) => {
|
|
var now_key = key
|
|
? key
|
|
: (Date.now() + Math.random()).toString(36)
|
|
|
|
this.refs.set(RefManager.check(now_key), RefManager.check(ref))
|
|
return {key: now_key, ref}
|
|
},
|
|
(...e) => {
|
|
console.log("Ошибка при сохранении (save)");
|
|
e.forEach(er => {throw er});
|
|
}
|
|
)
|
|
|
|
/**
|
|
* Получение ссылки по ключу
|
|
* @method
|
|
* @param {string} key - ключ
|
|
* @returns {string}
|
|
*/
|
|
get = recovery(
|
|
key => {
|
|
return this.refs.get(RefManager.check(key))
|
|
},
|
|
(...e) => {
|
|
console.log("Ошибка при извлечении ссылки (get)");
|
|
e.forEach(er => {throw er});
|
|
}
|
|
)
|
|
|
|
/**
|
|
* Очищает все сохранённые ссылки и освобождает ресурсы
|
|
* @method
|
|
*/
|
|
clear = recovery(
|
|
() => {
|
|
Array.from(this.refs.values()).forEach(URL.revokeObjectURL);
|
|
this.refs.clear()
|
|
},
|
|
(...e) => {
|
|
console.log("Ошибка при очищении (clear)");
|
|
e.forEach(er => {throw er});
|
|
}
|
|
)
|
|
|
|
/**
|
|
* Возвращает сконвертированную в объект список
|
|
* @method
|
|
* @returns {Object}
|
|
*/
|
|
get_all = recovery(
|
|
() => {
|
|
return Object.fromEntries(this.refs)
|
|
},
|
|
(...e) => {
|
|
console.log("Ошибка при конвертации и получени (get_all)");
|
|
e.forEach(er => {throw er});
|
|
}
|
|
)
|
|
|
|
} |