made SRSC a rpc thing
This commit is contained in:
		
							parent
							
								
									da3f00acb6
								
							
						
					
					
						commit
						0fc2d4d397
					
				@ -1,10 +1,10 @@
 | 
			
		||||
package bin.exporter;
 | 
			
		||||
 | 
			
		||||
import kernel.KernelSettings;
 | 
			
		||||
import kernel.peripherals.Peripherals.Peripheral;
 | 
			
		||||
import lib.KVStore;
 | 
			
		||||
import lib.exporter.Request;
 | 
			
		||||
import kernel.ps.ProcessHandle;
 | 
			
		||||
import lib.RessourceNames;
 | 
			
		||||
import lib.exporter.Export;
 | 
			
		||||
import kernel.ps.Process;
 | 
			
		||||
import kernel.net.Package;
 | 
			
		||||
@ -53,7 +53,8 @@ class ResManager implements Process {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function registerName(id:String) {
 | 
			
		||||
		return RessourceNames.register(id, Net.networkID);
 | 
			
		||||
		var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
		return rpc.register(id, Net.networkID);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function persist() {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
package bin.srsc;
 | 
			
		||||
 | 
			
		||||
import kernel.KernelSettings;
 | 
			
		||||
import kernel.net.Package.NetworkID;
 | 
			
		||||
import lib.RessourceNames;
 | 
			
		||||
import lib.CLIAppBase;
 | 
			
		||||
 | 
			
		||||
using tink.CoreApi;
 | 
			
		||||
@ -14,7 +14,9 @@ class CLI extends CLIAppBase {
 | 
			
		||||
				return Future.sync(false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return RessourceNames.get(args[0]).map((res) -> {
 | 
			
		||||
			var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
 | 
			
		||||
			return rpc.get(args[0]).map((res) -> {
 | 
			
		||||
				switch (res) {
 | 
			
		||||
					case Success(data):
 | 
			
		||||
						if (data == null) {
 | 
			
		||||
@ -41,7 +43,9 @@ class CLI extends CLIAppBase {
 | 
			
		||||
				return Future.sync(false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return RessourceNames.register(args[0], id).map((res) -> {
 | 
			
		||||
			var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
 | 
			
		||||
			return rpc.register(args[0], id).map((res) -> {
 | 
			
		||||
				switch (res) {
 | 
			
		||||
					case Success(data):
 | 
			
		||||
						handle.writeLine("Success");
 | 
			
		||||
@ -59,20 +63,26 @@ class CLI extends CLIAppBase {
 | 
			
		||||
				return Future.sync(false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return RessourceNames.unregister(args[0]).map((res) -> {
 | 
			
		||||
				switch (res) {
 | 
			
		||||
					case Success(data):
 | 
			
		||||
						handle.writeLine("Success");
 | 
			
		||||
					case Failure(error):
 | 
			
		||||
						handle.writeLine("Error: " + error);
 | 
			
		||||
				}
 | 
			
		||||
			var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
 | 
			
		||||
				return true;
 | 
			
		||||
			});
 | 
			
		||||
			// FIXME
 | 
			
		||||
			return Future.sync(true);
 | 
			
		||||
			// return rpc.unregister(args[0]).map((res) -> {
 | 
			
		||||
			// 	switch (res) {
 | 
			
		||||
			// 		case Success(_):
 | 
			
		||||
			// 			handle.writeLine("Success");
 | 
			
		||||
			// 		case Failure(error):
 | 
			
		||||
			// 			handle.writeLine("Error: " + error);
 | 
			
		||||
			// 	}
 | 
			
		||||
 | 
			
		||||
			// 	return true;
 | 
			
		||||
			// });
 | 
			
		||||
		}, "<name>");
 | 
			
		||||
 | 
			
		||||
		registerAsyncSubcommand("list", (args) -> {
 | 
			
		||||
			return RessourceNames.list().map((res) -> {
 | 
			
		||||
			var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
 | 
			
		||||
			return rpc.list().map((res) -> {
 | 
			
		||||
				switch (res) {
 | 
			
		||||
					case Success(data):
 | 
			
		||||
						for (name in data) {
 | 
			
		||||
 | 
			
		||||
@ -1,36 +0,0 @@
 | 
			
		||||
package bin.srsc;
 | 
			
		||||
 | 
			
		||||
import kernel.net.Package.NetworkID;
 | 
			
		||||
 | 
			
		||||
typedef GetRequest = {
 | 
			
		||||
	public var ?type:String;
 | 
			
		||||
	public var name:String;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef GetResponse = {
 | 
			
		||||
	public var success:Bool;
 | 
			
		||||
	public var netID:NetworkID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef RegisterRequest = {
 | 
			
		||||
	public var ?type:String;
 | 
			
		||||
	public var name:String;
 | 
			
		||||
	public var netID:NetworkID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef RegisterResponse = {
 | 
			
		||||
	public var success:Bool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef UnregisterRequest = {
 | 
			
		||||
	public var ?type:String;
 | 
			
		||||
	public var name:String;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef UnregisterResponse = {
 | 
			
		||||
	public var success:Bool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef ListRequest = {
 | 
			
		||||
	public var ?type:String;
 | 
			
		||||
}
 | 
			
		||||
@ -1,19 +1,20 @@
 | 
			
		||||
package bin.srsc;
 | 
			
		||||
 | 
			
		||||
import macros.rpc.RPC;
 | 
			
		||||
import lib.KVStore;
 | 
			
		||||
import bin.srsc.PackageTypes;
 | 
			
		||||
import kernel.net.Package;
 | 
			
		||||
import kernel.ps.ProcessHandle;
 | 
			
		||||
import kernel.ps.Process;
 | 
			
		||||
 | 
			
		||||
using tink.CoreApi;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
	The SiteRessourceController is responsible for the management of ressources on the site.
 | 
			
		||||
	It makes sure that ressources are have a unique id and that they are not duplicated.
 | 
			
		||||
	It also keeps track of the responsible NetID for each ressource. Kinda like a DNS.
 | 
			
		||||
**/
 | 
			
		||||
@:build(macros.rpc.RPC.buildRPC())
 | 
			
		||||
class SiteRessourceController implements Process {
 | 
			
		||||
	public static inline final SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO:String = "srsc";
 | 
			
		||||
 | 
			
		||||
	private var handle:ProcessHandle;
 | 
			
		||||
	private var ressources:Map<String, NetworkID>;
 | 
			
		||||
 | 
			
		||||
@ -24,47 +25,10 @@ class SiteRessourceController implements Process {
 | 
			
		||||
 | 
			
		||||
		load();
 | 
			
		||||
 | 
			
		||||
		// Register proto
 | 
			
		||||
		kernel.net.Net.registerProto(SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, this.handleMsg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function handleMsg(pkg:GenericPackage) {
 | 
			
		||||
		/*
 | 
			
		||||
			There are 3 types of messages:
 | 
			
		||||
			- Register a new ressource name 
 | 
			
		||||
			- Unregister a ressource name 
 | 
			
		||||
			- Get the responsible NetID for a ressource name 
 | 
			
		||||
		 */
 | 
			
		||||
 | 
			
		||||
		switch (pkg.data.type) {
 | 
			
		||||
			case "register":
 | 
			
		||||
				pkg.respond(handleRegister(cast pkg.data));
 | 
			
		||||
			case "unregister":
 | 
			
		||||
				pkg.respond(handleUnregister(cast pkg.data));
 | 
			
		||||
			case "get":
 | 
			
		||||
				pkg.respond(handleGet(cast pkg.data));
 | 
			
		||||
			case "list":
 | 
			
		||||
				pkg.respond(list());
 | 
			
		||||
			default:
 | 
			
		||||
				handle.writeLine("Unknown message type: " + pkg.data.type);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function handleGet(data:GetRequest):GetResponse {
 | 
			
		||||
		var res = get(data.name);
 | 
			
		||||
		return {success: res != null, netID: res};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function handleRegister(data:RegisterRequest):RegisterResponse {
 | 
			
		||||
		var res = register(data.name, data.netID);
 | 
			
		||||
		return {success: res};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private function handleUnregister(data:UnregisterRequest):UnregisterResponse {
 | 
			
		||||
		unregister(data.name);
 | 
			
		||||
		return {success: true};
 | 
			
		||||
		RPC.generateRPCPackageHandle();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@rpc
 | 
			
		||||
	public function register(name:String, netID:NetworkID):Bool {
 | 
			
		||||
		if (ressources.exists(name) && ressources.get(name) != netID) {
 | 
			
		||||
			return false;
 | 
			
		||||
@ -75,18 +39,21 @@ class SiteRessourceController implements Process {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public function unregister(name:String) {
 | 
			
		||||
	@rpc
 | 
			
		||||
	public function unregister(name:String):Void {
 | 
			
		||||
		if (ressources.exists(name)) {
 | 
			
		||||
			ressources.remove(name);
 | 
			
		||||
		}
 | 
			
		||||
		save();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@rpc
 | 
			
		||||
	public function get(name:String):Null<NetworkID> {
 | 
			
		||||
		return ressources.get(name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private inline function list():Array<String> {
 | 
			
		||||
	@rpc
 | 
			
		||||
	public function list():Array<String> {
 | 
			
		||||
		return [for (k in ressources.keys()) k];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,71 +0,0 @@
 | 
			
		||||
package lib;
 | 
			
		||||
 | 
			
		||||
import bin.srsc.PackageTypes.ListRequest;
 | 
			
		||||
import kernel.KernelSettings;
 | 
			
		||||
import bin.srsc.PackageTypes.UnregisterRequest;
 | 
			
		||||
import bin.srsc.PackageTypes.RegisterRequest;
 | 
			
		||||
import bin.srsc.PackageTypes.GetRequest;
 | 
			
		||||
import bin.srsc.SiteRessourceController;
 | 
			
		||||
import kernel.net.Net;
 | 
			
		||||
import kernel.net.Package.NetworkID;
 | 
			
		||||
 | 
			
		||||
using tink.CoreApi;
 | 
			
		||||
 | 
			
		||||
class RessourceNames {
 | 
			
		||||
	public static function get(name:String, controllerID:NetworkID = -1):Promise<Null<NetworkID>> {
 | 
			
		||||
		if (controllerID == -1)
 | 
			
		||||
			controllerID = KernelSettings.siteController;
 | 
			
		||||
 | 
			
		||||
		var payload:GetRequest = {name: name, type: "get"};
 | 
			
		||||
 | 
			
		||||
		return Net.sendAndAwait(controllerID, SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, payload).map((res) -> {
 | 
			
		||||
			switch (res) {
 | 
			
		||||
				case Success(pkg):
 | 
			
		||||
					return Success(pkg.data.netID);
 | 
			
		||||
				case Failure(error):
 | 
			
		||||
					return Failure(error);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function register(name:String, netID:NetworkID, controllerID:NetworkID = -1):Promise<Bool> {
 | 
			
		||||
		if (controllerID == -1)
 | 
			
		||||
			controllerID = KernelSettings.siteController;
 | 
			
		||||
 | 
			
		||||
		var payload:RegisterRequest = {name: name, netID: netID, type: "register"};
 | 
			
		||||
 | 
			
		||||
		return Net.sendAndAwait(controllerID, SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, payload).map((res) -> {
 | 
			
		||||
			switch (res) {
 | 
			
		||||
				case Success(pkg):
 | 
			
		||||
					return Success(pkg.data.success);
 | 
			
		||||
				case Failure(error):
 | 
			
		||||
					return Failure(error);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function unregister(name:String, controllerID:NetworkID = -1):Promise<Noise> {
 | 
			
		||||
		if (controllerID == -1)
 | 
			
		||||
			controllerID = KernelSettings.siteController;
 | 
			
		||||
 | 
			
		||||
		var payload:UnregisterRequest = {name: name, type: "unregister"};
 | 
			
		||||
 | 
			
		||||
		return Net.sendAndAwait(controllerID, SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, payload);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static function list(controllerID:NetworkID = -1):Promise<Array<String>> {
 | 
			
		||||
		if (controllerID == -1)
 | 
			
		||||
			controllerID = KernelSettings.siteController;
 | 
			
		||||
 | 
			
		||||
		var payload:ListRequest = {type: "list"};
 | 
			
		||||
 | 
			
		||||
		return Net.sendAndAwait(controllerID, SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, payload).map(res -> {
 | 
			
		||||
			switch (res) {
 | 
			
		||||
				case Success(pkg):
 | 
			
		||||
					return Success(pkg.data);
 | 
			
		||||
				case Failure(error):
 | 
			
		||||
					return Failure(error);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
package lib.exporter;
 | 
			
		||||
 | 
			
		||||
import kernel.KernelSettings;
 | 
			
		||||
import kernel.net.Net;
 | 
			
		||||
import kernel.net.Package.NetworkID;
 | 
			
		||||
 | 
			
		||||
@ -8,8 +9,9 @@ using tink.CoreApi;
 | 
			
		||||
class Import {
 | 
			
		||||
	public static function get(ressourceLocator:String):Promise<Response> {
 | 
			
		||||
		var request = Request.fromString(ressourceLocator);
 | 
			
		||||
		var rpc = new SiteRessourceControllerRPC(KernelSettings.siteController);
 | 
			
		||||
 | 
			
		||||
		return RessourceNames.get(request.id).next((response) -> {
 | 
			
		||||
		return rpc.get(request.id).next((response) -> {
 | 
			
		||||
			return performRequest(response, request);
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user