package bin; import lib.exporter.Request; import kernel.ps.ProcessHandle; import lib.RessourceNames; import lib.exporter.Export; import kernel.ps.Process; import kernel.log.Log; import kernel.net.Package; import kernel.net.Net; import kernel.net.Package.GenericPackage; using tink.CoreApi; class ResManager implements Process { private var handle:ProcessHandle; private final exports:Map = []; public function new() {} public function run(handle:ProcessHandle) { this.handle = handle; Net.instance.registerProto("res",handlePackage); } public function register(id: String, export: Export): Future{ if (exports.exists(id)){ handle.writeLine("Ressource already exists: " + id); return Future.sync(false); } return registerName(id).map((success)->{ if (success){ exports.set(id,export); } return success; }); } private function handlePackage(pack: GenericPackage){ Log.debug("Handling ressource request" + pack); var requestPack: Package = cast pack; var id = requestPack.data.id; if (!exports.exists(id)){ requestPack.respond(lib.exporter.Response.NotFound); return; } var export = exports.get(id); var response = export.handleRequest(requestPack.data); requestPack.respond(response); } private function registerName(id: String){ return RessourceNames.register(id, Net.instance.networkID).map((res)->{ switch (res) { case Success(data): return data; case Failure(err): Log.error("Failed to register ressource: " + id + " " + err); return false; } }); } }