85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import * as tfrpc from '/tfrpc.js';
 | 
						|
 | 
						|
let g_db;
 | 
						|
 | 
						|
tfrpc.register(async function todo_get_all() {
 | 
						|
	let names = await todo_get_names();
 | 
						|
	let result = [];
 | 
						|
	for (let name of names) {
 | 
						|
		result.push({
 | 
						|
			name: name,
 | 
						|
			items: await todo_get(name),
 | 
						|
		});
 | 
						|
	}
 | 
						|
	return result;
 | 
						|
});
 | 
						|
 | 
						|
async function todo_get_names() {
 | 
						|
	return JSON.parse((await g_db.get('files')) ?? '[]');
 | 
						|
}
 | 
						|
 | 
						|
async function todo_add(list) {
 | 
						|
	let exchanged = false;
 | 
						|
	let tries = 10;
 | 
						|
	while (!exchanged && tries-- > 0) {
 | 
						|
		let original = await g_db.get('files');
 | 
						|
		let names = JSON.parse(original ?? '[]');
 | 
						|
		let set = new Set(names);
 | 
						|
		set.add(list);
 | 
						|
		names = JSON.stringify([...set].sort());
 | 
						|
		exchanged =
 | 
						|
			original === names || (await g_db.exchange('files', original, names));
 | 
						|
	}
 | 
						|
	return exchanged;
 | 
						|
}
 | 
						|
tfrpc.register(todo_add);
 | 
						|
 | 
						|
async function todo_remove(list) {
 | 
						|
	let exchanged = false;
 | 
						|
	let tries = 10;
 | 
						|
	while (!exchanged && tries-- > 0) {
 | 
						|
		let original = await g_db.get('files');
 | 
						|
		let names = JSON.parse(original ?? '[]');
 | 
						|
		let set = new Set(names);
 | 
						|
		set.delete(list);
 | 
						|
		names = JSON.stringify([...set].sort());
 | 
						|
		exchanged =
 | 
						|
			original === names || (await g_db.exchange('files', original, names));
 | 
						|
	}
 | 
						|
	await g_db.remove('list:' + list);
 | 
						|
	return exchanged;
 | 
						|
}
 | 
						|
tfrpc.register(todo_remove);
 | 
						|
 | 
						|
tfrpc.register(async function todo_rename(old_name, new_name) {
 | 
						|
	if (await g_db.get('list:' + new_name)) {
 | 
						|
		throw RuntimeError(`${new_name} already exists.`);
 | 
						|
	}
 | 
						|
	let list = await todo_get(old_name);
 | 
						|
	await todo_set(new_name, list);
 | 
						|
	await todo_add(new_name);
 | 
						|
	await todo_remove(old_name);
 | 
						|
});
 | 
						|
 | 
						|
async function todo_get(list) {
 | 
						|
	try {
 | 
						|
		let value = await g_db.get('list:' + list);
 | 
						|
		return JSON.parse(value ?? '[]');
 | 
						|
	} catch (error) {
 | 
						|
		print(error);
 | 
						|
		return [];
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
async function todo_set(list, value) {
 | 
						|
	await g_db.set('list:' + list, JSON.stringify(value));
 | 
						|
}
 | 
						|
tfrpc.register(todo_set);
 | 
						|
 | 
						|
async function main() {
 | 
						|
	g_db = await database('todo');
 | 
						|
	await app.setDocument(utf8Decode(getFile('index.html')));
 | 
						|
}
 | 
						|
 | 
						|
main();
 |