added NameSystem
This commit is contained in:
parent
1efa8fa212
commit
3484503ba1
71
src/bin/ns/NameSystem.hx
Normal file
71
src/bin/ns/NameSystem.hx
Normal file
@ -0,0 +1,71 @@
|
||||
package bin.ns;
|
||||
|
||||
import lib.KVStore;
|
||||
import haxe.ds.StringMap;
|
||||
import kernel.net.Package.NetworkID;
|
||||
import bin.ns.NameSystemRPC.INameSystemRPC;
|
||||
import kernel.ps.ProcessHandle;
|
||||
import kernel.ps.IProcess;
|
||||
|
||||
using Lambda;
|
||||
using tink.CoreApi;
|
||||
|
||||
@:build(macros.Binstore.includeBin("NameSystem", ["ns", "namesystem"]))
|
||||
class NameSystem implements IProcess implements INameSystemRPC {
|
||||
private var handle:ProcessHandle;
|
||||
|
||||
private var idRecords:StringMap<NetworkID> = new StringMap();
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function run(handle:ProcessHandle) {
|
||||
this.handle = handle;
|
||||
|
||||
this.load();
|
||||
|
||||
kernel.net.Net.registerProto("ns", (p) -> {
|
||||
NameSystemRPC.handlePackage(this, p);
|
||||
});
|
||||
}
|
||||
|
||||
private function load() {
|
||||
var kv = new KVStore("NameSystem");
|
||||
kv.load();
|
||||
|
||||
this.idRecords = kv.get("idRecords", new StringMap());
|
||||
}
|
||||
|
||||
private function save() {
|
||||
var kv = new KVStore("NameSystem");
|
||||
|
||||
kv.set("idRecords", this.idRecords);
|
||||
|
||||
kv.save();
|
||||
}
|
||||
|
||||
public function setIDRecord(name:String, id:NetworkID):Noise {
|
||||
this.idRecords.set(name, id);
|
||||
this.save();
|
||||
return Noise;
|
||||
}
|
||||
|
||||
public function getIDRecord(name:String):Null<NetworkID> {
|
||||
return this.idRecords.get(name);
|
||||
}
|
||||
|
||||
public function removeIDRecord(name:String):Noise {
|
||||
this.idRecords.remove(name);
|
||||
this.save();
|
||||
return Noise;
|
||||
}
|
||||
|
||||
public function listIDRecords():Array<{name:String, id:NetworkID}> {
|
||||
var rtn = [];
|
||||
|
||||
for (k => v in this.idRecords) {
|
||||
rtn.push({name: k, id: v});
|
||||
}
|
||||
|
||||
return rtn;
|
||||
}
|
||||
}
|
89
src/bin/ns/NameSystemCLI.hx
Normal file
89
src/bin/ns/NameSystemCLI.hx
Normal file
@ -0,0 +1,89 @@
|
||||
package bin.ns;
|
||||
|
||||
import lib.CLIAppBase;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
@:build(macros.Binstore.includeBin("NameSystemCLI", ["ns-cli"]))
|
||||
class NameSystemCLI extends CLIAppBase {
|
||||
public function new() {
|
||||
registerAsyncSubcommand("get", (args) -> {
|
||||
if (args.length < 1) {
|
||||
return Future.sync(false);
|
||||
}
|
||||
|
||||
var ns = NameSystemRPC.getDefault();
|
||||
|
||||
return ns.getIDRecord(args[0]).map((r) -> {
|
||||
switch r {
|
||||
case Success(data):
|
||||
handle.writeLine('Resolved: $data');
|
||||
case Failure(failure):
|
||||
handle.writeLine('Failed: $failure');
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}, "<name>");
|
||||
|
||||
registerAsyncSubcommand("register", (args) -> {
|
||||
if (args.length < 2) {
|
||||
return Future.sync(false);
|
||||
}
|
||||
|
||||
var id = Std.parseInt(args[1]);
|
||||
|
||||
if (id == null) {
|
||||
handle.writeLine("Not a valid id");
|
||||
return Future.sync(false);
|
||||
}
|
||||
|
||||
var ns = NameSystemRPC.getDefault();
|
||||
|
||||
return ns.setIDRecord(args[0], id).map((r) -> {
|
||||
switch r {
|
||||
case Success(_):
|
||||
handle.writeLine('Set');
|
||||
case Failure(failure):
|
||||
handle.writeLine('Failed: $failure');
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}, "<name> <id>");
|
||||
|
||||
registerAsyncSubcommand("list", (args) -> {
|
||||
var ns = NameSystemRPC.getDefault();
|
||||
|
||||
return ns.listIDRecords().map((r) -> {
|
||||
switch r {
|
||||
case Success(data):
|
||||
handle.writeLine('List: $data');
|
||||
case Failure(failure):
|
||||
handle.writeLine('Failed: $failure');
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
});
|
||||
|
||||
registerAsyncSubcommand("unregister", (args) -> {
|
||||
if (args.length < 1) {
|
||||
return Future.sync(false);
|
||||
}
|
||||
|
||||
var ns = NameSystemRPC.getDefault();
|
||||
|
||||
return ns.removeIDRecord(args[0]).map((r) -> {
|
||||
switch r {
|
||||
case Success(_):
|
||||
handle.writeLine('Unregisterd');
|
||||
case Failure(failure):
|
||||
handle.writeLine('Failed: $failure');
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}, "<name>");
|
||||
}
|
||||
}
|
31
src/bin/ns/NameSystemRPC.hx
Normal file
31
src/bin/ns/NameSystemRPC.hx
Normal file
@ -0,0 +1,31 @@
|
||||
package bin.ns;
|
||||
|
||||
import kernel.KernelSettings;
|
||||
import macros.rpc.RPCBase;
|
||||
import kernel.net.Package.NetworkID;
|
||||
|
||||
using tink.CoreApi;
|
||||
|
||||
interface INameSystemRPC {
|
||||
function setIDRecord(name:String, id:NetworkID):Noise;
|
||||
function getIDRecord(name:String):Null<NetworkID>;
|
||||
function removeIDRecord(name:String):Noise;
|
||||
function listIDRecords():Array<{name:String, id:NetworkID}>;
|
||||
}
|
||||
|
||||
@:build(macros.rpc.RPC.buildRPC(INameSystemRPC))
|
||||
class NameSystemRPC extends RPCBase {
|
||||
public static function getDefault():NameSystemRPC {
|
||||
return new NameSystemRPC(KernelSettings.nameServer, "ns");
|
||||
}
|
||||
|
||||
public static function resolve(input:String):Promise<Null<NetworkID>> {
|
||||
if (input == "12345") {
|
||||
return Promise.resolve(Std.parseInt(input));
|
||||
}
|
||||
|
||||
var ns = getDefault();
|
||||
|
||||
return ns.getIDRecord(input);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user