Files
VRCX/html/src/repository/config.js
2023-05-10 17:11:14 +12:00

80 lines
2.4 KiB
JavaScript

import sqliteService from '../service/sqlite.js';
import sharedRepository, { SharedRepository } from './shared.js';
var dirtyKeySet = new Set();
function transformKey(key) {
return `config:${String(key).toLowerCase()}`;
}
async function syncLoop() {
if (dirtyKeySet.size > 0) {
try {
await sqliteService.executeNonQuery('BEGIN');
try {
for (var key of dirtyKeySet) {
var value = sharedRepository.getString(key);
if (value === null) {
await sqliteService.executeNonQuery(
'DELETE FROM configs WHERE `key` = @key',
{
'@key': key
}
);
} else {
await sqliteService.executeNonQuery(
'INSERT OR REPLACE INTO configs (`key`, `value`) VALUES (@key, @value)',
{
'@key': key,
'@value': value
}
);
}
}
dirtyKeySet.clear();
} finally {
await sqliteService.executeNonQuery('COMMIT');
}
} catch (err) {
console.error(err);
}
}
setTimeout(syncLoop, 100);
}
class ConfigRepository extends SharedRepository {
async init() {
await sqliteService.executeNonQuery(
'CREATE TABLE IF NOT EXISTS configs (`key` TEXT PRIMARY KEY, `value` TEXT)'
);
await sqliteService.execute(
([key, value]) => sharedRepository.setString(key, value),
'SELECT `key`, `value` FROM configs'
);
syncLoop();
}
remove(key) {
var _key = transformKey(key);
sharedRepository.remove(_key);
dirtyKeySet.add(_key);
}
getString(key, defaultValue = null) {
var _key = transformKey(key);
return sharedRepository.getString(_key, defaultValue);
}
setString(key, value) {
var _key = transformKey(key);
var _value = String(value);
sharedRepository.setString(_key, _value);
dirtyKeySet.add(_key);
}
}
var self = new ConfigRepository();
window.configRepository = self;
export { self as default, ConfigRepository };