forked from cory/tildefriends
		
	Add File.stat. Use it to cache manifests to speed up task start. async spreads like a virus.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3377 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										26
									
								
								core/core.js
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								core/core.js
									
									
									
									
									
								
							| @@ -105,7 +105,7 @@ function databaseGetAll() { | ||||
| 	return getDatabase(this).getAll(); | ||||
| } | ||||
|  | ||||
| function getPackages() { | ||||
| async function getPackages() { | ||||
| 	var packages = []; | ||||
| 	var packageOwners = File.readDirectory("packages/"); | ||||
| 	for (var i = 0; i < packageOwners.length; i++) { | ||||
| @@ -116,7 +116,7 @@ function getPackages() { | ||||
| 					packages.push({ | ||||
| 						owner: packageOwners[i], | ||||
| 						name: packageNames[j], | ||||
| 						manifest: getManifest("packages/" + packageOwners[i] + "/" + packageNames[j] + "/" + packageNames[j] + ".js"), | ||||
| 						manifest: await getManifest("packages/" + packageOwners[i] + "/" + packageNames[j] + "/" + packageNames[j] + ".js"), | ||||
| 					}); | ||||
| 				} | ||||
| 			} | ||||
| @@ -195,7 +195,17 @@ function readFileUtf8(fileName) { | ||||
| 	return new TextDecoder("UTF-8").decode(File.readFile(fileName)); | ||||
| } | ||||
|  | ||||
| function getManifest(fileName) { | ||||
| let gManifestCache = {}; | ||||
|  | ||||
| async function getManifest(fileName) { | ||||
| 	let oldEntry = gManifestCache[fileName]; | ||||
| 	let stat = await File.stat(fileName); | ||||
| 	if (oldEntry) { | ||||
| 		if (oldEntry.stat.mtime == stat.mtime && oldEntry.stat.size == stat.size) { | ||||
| 			return oldEntry.manifest; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	let manifest = []; | ||||
| 	let lines = readFileUtf8(fileName).split("\n").map(x => x.trimRight()); | ||||
| 	for (let i = 0; i < lines.length; i++) { | ||||
| @@ -212,6 +222,12 @@ function getManifest(fileName) { | ||||
| 		print("ERROR: getManifest(" + fileName + "): ", error); | ||||
| 		// Oh well.  No manifest. | ||||
| 	} | ||||
|  | ||||
| 	gManifestCache[fileName] = { | ||||
| 		stat: stat, | ||||
| 		manifest: result, | ||||
| 	}; | ||||
|  | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| @@ -220,7 +236,7 @@ function packageNameToPath(name) { | ||||
| 	return "packages/" + process.packageOwner + "/" + name + "/"; | ||||
| } | ||||
|  | ||||
| function getProcess(packageOwner, packageName, key, options) { | ||||
| async function getProcess(packageOwner, packageName, key, options) { | ||||
| 	var process = gProcesses[key]; | ||||
| 	if (!process | ||||
| 		&& !(options && "create" in options && !options.create) | ||||
| @@ -229,7 +245,7 @@ function getProcess(packageOwner, packageName, key, options) { | ||||
| 		try { | ||||
| 			print("Creating task for " + packageName + " " + key); | ||||
| 			var fileName = "packages/" + packageOwner + "/" + packageName + "/" + packageName + ".js"; | ||||
| 			var manifest = getManifest(fileName); | ||||
| 			var manifest = await getManifest(fileName); | ||||
| 			process = {}; | ||||
| 			process.key = key; | ||||
| 			process.index = gProcessIndex++; | ||||
|   | ||||
| @@ -143,7 +143,7 @@ function socket(request, response, client) { | ||||
| 	} | ||||
| 	options.credentials = credentials; | ||||
|  | ||||
| 	response.onMessage = function(event) { | ||||
| 	response.onMessage = async function(event) { | ||||
| 		if (event.opCode == 0x1 || event.opCode == 0x2) { | ||||
| 			var message; | ||||
| 			try { | ||||
| @@ -164,7 +164,7 @@ function socket(request, response, client) { | ||||
| 				response.send(JSON.stringify({lines: [{action: "session", sessionId: sessionId, credentials: credentials}]}), 0x1); | ||||
|  | ||||
| 				options.terminalApi = message.terminalApi || []; | ||||
| 				process = getSessionProcess(packageOwner, packageName, sessionId, options); | ||||
| 				process = await getSessionProcess(packageOwner, packageName, sessionId, options); | ||||
| 				process.terminal.readOutput(function(message) { | ||||
| 					response.send(JSON.stringify(message), 0x1); | ||||
| 				}); | ||||
| @@ -226,7 +226,7 @@ function socket(request, response, client) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function handler(request, response, packageOwner, packageName, uri) { | ||||
| async function handler(request, response, packageOwner, packageName, uri) { | ||||
| 	var found = false; | ||||
|  | ||||
| 	if (badName(packageOwner) || badName(packageName)) { | ||||
| @@ -292,7 +292,7 @@ function handler(request, response, packageOwner, packageName, uri) { | ||||
| 				} | ||||
| 			} | ||||
| 		} else if (uri === "/submit") { | ||||
| 				var process = getServiceProcess(packageOwner, packageName, "submit"); | ||||
| 				var process = await getServiceProcess(packageOwner, packageName, "submit"); | ||||
| 				process.lastActive = Date.now(); | ||||
| 				return process.ready.then(function() { | ||||
| 					var payload = form.decodeForm(request.body, form.decodeForm(request.query)); | ||||
| @@ -308,7 +308,7 @@ function handler(request, response, packageOwner, packageName, uri) { | ||||
| 					}); | ||||
| 				}); | ||||
| 		} else if (uri === "/atom") { | ||||
| 			var process = getServiceProcess(packageOwner, packageName, "atom"); | ||||
| 			var process = await getServiceProcess(packageOwner, packageName, "atom"); | ||||
| 			process.lastActive = Date.now(); | ||||
| 			return process.ready.then(function() { | ||||
| 				var payload = form.decodeForm(request.body, form.decodeForm(request.query)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user