forked from cory/tildefriends
		
	Adding a number of work-in-progress packages. Some data structures built on top of the key-value store and an http client, among others.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3310 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										106
									
								
								packages/cory/libdocument/libdocument.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								packages/cory/libdocument/libdocument.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| "use strict"; | ||||
|  | ||||
| // A document store. | ||||
|  | ||||
| //! {"category": "libraries"} | ||||
|  | ||||
| class DocumentStore { | ||||
| 	constructor(prefix) { | ||||
| 		this._prefix = prefix; | ||||
| 	} | ||||
|  | ||||
| 	async _get(name) { | ||||
| 		let node; | ||||
| 		try { | ||||
| 			node = JSON.parse(await database.get(this._prefix + ":node:" + JSON.stringify(name))); | ||||
| 		} catch (error) { | ||||
| 			node = {version: null}; | ||||
| 		} | ||||
| 		return node; | ||||
| 	} | ||||
|  | ||||
| 	async _addKey(name) { | ||||
| 		let list = JSON.parse(await database.get(this._prefix + ":keys") || "[]"); | ||||
| 		if (list.indexOf(name) == -1) { | ||||
| 			list.push(name); | ||||
| 			list.sort(); | ||||
| 		} | ||||
| 		await database.set(this._prefix + ":keys", JSON.stringify(list)); | ||||
| 	} | ||||
|  | ||||
| 	async _removeKey(name) { | ||||
| 		let list = JSON.parse(await database.get(this._prefix + ":keys") || "[]"); | ||||
| 		let index = list.indexOf(name); | ||||
| 		if (index != -1) { | ||||
| 			list.splice(index, 1); | ||||
| 		} | ||||
| 		await database.set(this._prefix + ":keys", JSON.stringify(list)); | ||||
| 	} | ||||
|  | ||||
| 	async set(name, value) { | ||||
| 		let node = await this._get(name); | ||||
| 		let version = (node.version || 0) + 1; | ||||
| 		await database.set(this._prefix + ":version:" + JSON.stringify(name) + ":" + version.toString(), JSON.stringify(value)); | ||||
| 		node.deleted = value == undefined; | ||||
| 		node.version = version; | ||||
| 		await database.set(this._prefix + ":node:" + JSON.stringify(name), JSON.stringify(node)); | ||||
| 		if (node.deleted) { | ||||
| 			await this._removeKey(name); | ||||
| 		} else { | ||||
| 			await this._addKey(name); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	async get(name, version) { | ||||
| 		let queryVersion = version || (await this._get(name)).version || 0; | ||||
| 		let value = await database.get(this._prefix + ":version:" + JSON.stringify(name) + ":" + queryVersion.toString()); | ||||
| 		return value ? JSON.parse(value) : undefined; | ||||
| 	} | ||||
|  | ||||
| 	async getAll() { | ||||
| 		return JSON.parse(await database.get(this._prefix + ":keys") || "[]"); | ||||
| 	} | ||||
|  | ||||
| 	async setVersion(name, version, value) { | ||||
| 		await database.set(this._prefix + ":version:" + JSON.stringify(name) + ":" + version.toString(), JSON.stringify(value)); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| async function dump() { | ||||
| 	terminal.print("Dumping everything."); | ||||
| 	let keys = await database.getAll(); | ||||
| 	for (let key in keys) { | ||||
| 		terminal.print(keys[key], " = ", await database.get(keys[key])); | ||||
| 		database.remove(keys[key]); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| async function test() { | ||||
| 	terminal.print("Running a test."); | ||||
| 	let ds = new DocumentStore("cory"); | ||||
| 	await ds.set("cory", 1); | ||||
| 	await ds.set("cory", 2); | ||||
| 	await ds.set("cory", 3); | ||||
| 	terminal.print((await ds.get("cory")).toString()); | ||||
| 	await ds.set("alice", "hello, world!"); | ||||
| 	terminal.print(await ds.get("alice")); | ||||
| 	terminal.print(JSON.stringify(await ds.getAll())); | ||||
| 	await ds.set("cory", null); | ||||
| 	terminal.print(JSON.stringify(await ds.getAll())); | ||||
| 	terminal.print((await ds.get("cory", 2)).toString()); | ||||
| 	terminal.print("Done."); | ||||
| } | ||||
|  | ||||
| if (imports.terminal) { | ||||
| 	//dump().then(test).then(dump).catch(terminal.print); | ||||
| } | ||||
|  | ||||
| exports.DocumentStore = function(name) { | ||||
| 	let ds = new DocumentStore(name); | ||||
| 	return { | ||||
| 		get: ds.get.bind(ds), | ||||
| 		set: ds.set.bind(ds), | ||||
| 		getAll: ds.getAll.bind(ds), | ||||
| 		setVersion: ds.setVersion.bind(ds), | ||||
| 	}; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user