format
This commit is contained in:
@@ -16,13 +16,13 @@ using util.Extender.LambdaExtender;
|
||||
Class responsible for everything network related.
|
||||
Used to send and recceive packages.
|
||||
**/
|
||||
class Net{
|
||||
class Net {
|
||||
public static var instance:Net;
|
||||
|
||||
@:allow(kernel.Init)
|
||||
private function new () {
|
||||
KernelEvents.instance.onModemMessage.handle(params ->{
|
||||
var pack: Package = {
|
||||
private function new() {
|
||||
KernelEvents.instance.onModemMessage.handle(params -> {
|
||||
var pack:Package = {
|
||||
fromID: params.replyChannel,
|
||||
toID: params.channel,
|
||||
msgID: params.message.msgID,
|
||||
@@ -30,39 +30,38 @@ class Net{
|
||||
data: params.message.data,
|
||||
};
|
||||
|
||||
handelIncomming(pack,params.addr);
|
||||
handelIncomming(pack, params.addr);
|
||||
});
|
||||
|
||||
allModems = Peripheral.instance.getModems();
|
||||
open();
|
||||
discoverNeighbors();
|
||||
}
|
||||
|
||||
|
||||
public static inline final BRODCAST_PORT:Int = 65533;
|
||||
public static inline final MESSAGE_TIMEOUT:Int = 3;
|
||||
|
||||
private var networkID:Int = OS.getComputerID();
|
||||
private var responseBus: util.EventBus<Package> = new EventBus();
|
||||
private var protoHandlers: Map<String,Package -> Void> = new Map();
|
||||
private var responseBus:util.EventBus<Package> = new EventBus();
|
||||
private var protoHandlers:Map<String, Package->Void> = new Map();
|
||||
private var allModems:Array<kernel.peripherals.Modem>;
|
||||
private var routingTable: Map<Int,kernel.peripherals.Modem> = new Map();
|
||||
private var routingTable:Map<Int, kernel.peripherals.Modem> = new Map();
|
||||
|
||||
private function handelIncomming(pack: Package, ?addr:String) {
|
||||
private function handelIncomming(pack:Package, ?addr:String) {
|
||||
switch pack.type {
|
||||
case Data(_):
|
||||
routeTo(pack);
|
||||
case DataNoResponse(_):
|
||||
routeTo(pack);
|
||||
case Response | RouteDiscoverResponse:
|
||||
responseBus.emit(Std.string(pack.msgID),pack);
|
||||
responseBus.emit(Std.string(pack.msgID), pack);
|
||||
case RouteDiscover:
|
||||
handleRoute(pack,addr);
|
||||
|
||||
handleRoute(pack, addr);
|
||||
}
|
||||
}
|
||||
|
||||
private function newRoutPackage(): Package {
|
||||
var pack: Package = {
|
||||
private function newRoutPackage():Package {
|
||||
var pack:Package = {
|
||||
type: RouteDiscover,
|
||||
toID: BRODCAST_PORT,
|
||||
msgID: generateMessageID(),
|
||||
@@ -77,24 +76,24 @@ class Net{
|
||||
for (modem in allModems) {
|
||||
var pack = newRoutPackage();
|
||||
|
||||
var timeout: Timer = null;
|
||||
var responeListner = responseBus.on(Std.string(pack.msgID),pack -> {
|
||||
addRoute(pack.fromID,modem.addr);
|
||||
var timeout:Timer = null;
|
||||
var responeListner = responseBus.on(Std.string(pack.msgID), pack -> {
|
||||
addRoute(pack.fromID, modem.addr);
|
||||
});
|
||||
|
||||
timeout = new Timer(MESSAGE_TIMEOUT,() -> {
|
||||
timeout = new Timer(MESSAGE_TIMEOUT, () -> {
|
||||
responseBus.removeListner(responeListner);
|
||||
});
|
||||
|
||||
modem.transmit(BRODCAST_PORT,OS.getComputerID(),pack);
|
||||
modem.transmit(BRODCAST_PORT, OS.getComputerID(), pack);
|
||||
}
|
||||
}
|
||||
|
||||
private function handleRoute(pack: Package, addr: String) {
|
||||
addRoute(pack.fromID,addr);
|
||||
|
||||
private function handleRoute(pack:Package, addr:String) {
|
||||
addRoute(pack.fromID, addr);
|
||||
|
||||
// Respond to peer
|
||||
var response: Package = {
|
||||
var response:Package = {
|
||||
toID: pack.fromID,
|
||||
fromID: OS.getComputerID(),
|
||||
msgID: pack.msgID,
|
||||
@@ -103,20 +102,20 @@ class Net{
|
||||
}
|
||||
|
||||
for (reponseModem in allModems.filter(m -> m.addr == addr)) {
|
||||
reponseModem.transmit(pack.fromID,networkID,response);
|
||||
reponseModem.transmit(pack.fromID, networkID, response);
|
||||
}
|
||||
}
|
||||
|
||||
private function addRoute(toID: Int,addr: String) {
|
||||
Log.debug("Added new route to "+toID+" via "+addr);
|
||||
routingTable.set(toID,allModems.find(item -> item.addr == addr));
|
||||
private function addRoute(toID:Int, addr:String) {
|
||||
Log.debug("Added new route to " + toID + " via " + addr);
|
||||
routingTable.set(toID, allModems.find(item -> item.addr == addr));
|
||||
}
|
||||
|
||||
public function getAllNeighbors(): Array<Int> {
|
||||
public function getAllNeighbors():Array<Int> {
|
||||
return routingTable.mapi((index, item) -> index);
|
||||
}
|
||||
|
||||
private function generateMessageID(): Int {
|
||||
private function generateMessageID():Int {
|
||||
return Std.random(2147483647); // TODO: better uniqe number
|
||||
}
|
||||
|
||||
@@ -133,9 +132,8 @@ class Net{
|
||||
/**
|
||||
Send a message. Dont care if its reaches its destination nor it has a response.
|
||||
**/
|
||||
public function sendAndForget(dest:Int,proto:String,data: Dynamic){
|
||||
|
||||
var pack: Package = {
|
||||
public function sendAndForget(dest:Int, proto:String, data:Dynamic) {
|
||||
var pack:Package = {
|
||||
toID: dest,
|
||||
fromID: networkID,
|
||||
msgID: generateMessageID(),
|
||||
@@ -146,8 +144,8 @@ class Net{
|
||||
sendRaw(pack);
|
||||
}
|
||||
|
||||
public function respondTo(pack: Package,data: Dynamic) {
|
||||
if (pack.type.match(DataNoResponse(_))){
|
||||
public function respondTo(pack:Package, data:Dynamic) {
|
||||
if (pack.type.match(DataNoResponse(_))) {
|
||||
Log.warn("Responed to a no response package. Ignoring");
|
||||
return;
|
||||
}
|
||||
@@ -157,8 +155,8 @@ class Net{
|
||||
sendRaw(response);
|
||||
}
|
||||
|
||||
private function routeTo(pack: Package) {
|
||||
var proto: String = switch pack.type {
|
||||
private function routeTo(pack:Package) {
|
||||
var proto:String = switch pack.type {
|
||||
case Data(proto):
|
||||
proto;
|
||||
case DataNoResponse(proto):
|
||||
@@ -167,57 +165,56 @@ class Net{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!protoHandlers.exists(proto) && protoHandlers[proto] != null){
|
||||
if (!protoHandlers.exists(proto) && protoHandlers[proto] != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
protoHandlers[proto](pack);
|
||||
}
|
||||
|
||||
private function sendRaw(pack: Package){
|
||||
|
||||
if (pack.toID == networkID){
|
||||
private function sendRaw(pack:Package) {
|
||||
if (pack.toID == networkID) {
|
||||
// Loopback
|
||||
handelIncomming(pack);
|
||||
}else{
|
||||
if (routingTable.exists(pack.toID)){
|
||||
routingTable[pack.toID].transmit(pack.toID,pack.fromID,pack);
|
||||
}else{
|
||||
} else {
|
||||
if (routingTable.exists(pack.toID)) {
|
||||
routingTable[pack.toID].transmit(pack.toID, pack.fromID, pack);
|
||||
} else {
|
||||
// Route not found
|
||||
// TODO: forward package or report not reachable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function sendAndAwait(dest: Int,proto:String,data: Dynamic): Promise<Package> {
|
||||
public function sendAndAwait(dest:Int, proto:String, data:Dynamic):Promise<Package> {
|
||||
return new Promise<Package>((resolve, reject) -> {
|
||||
var pack: Package = {
|
||||
var pack:Package = {
|
||||
toID: dest,
|
||||
fromID: networkID,
|
||||
msgID: generateMessageID(),
|
||||
type: Data(proto),
|
||||
data: data
|
||||
}
|
||||
|
||||
var timeout: Timer = null;
|
||||
var responeListner = responseBus.once(Std.string(pack.msgID),p -> {
|
||||
|
||||
var timeout:Timer = null;
|
||||
var responeListner = responseBus.once(Std.string(pack.msgID), p -> {
|
||||
resolve(p);
|
||||
if (timeout != null){
|
||||
if (timeout != null) {
|
||||
timeout.cancle();
|
||||
}
|
||||
});
|
||||
|
||||
timeout = new Timer(MESSAGE_TIMEOUT,() -> {
|
||||
|
||||
timeout = new Timer(MESSAGE_TIMEOUT, () -> {
|
||||
responseBus.removeListner(responeListner);
|
||||
reject(new Exception("Timeout"));
|
||||
});
|
||||
|
||||
|
||||
sendRaw(pack);
|
||||
});
|
||||
}
|
||||
|
||||
public function registerProto(proto: String,cb: Package -> Void) {
|
||||
if (protoHandlers.exists(proto)){
|
||||
public function registerProto(proto:String, cb:Package->Void) {
|
||||
if (protoHandlers.exists(proto)) {
|
||||
// Failed. Handler already exist.
|
||||
// TODO: return error
|
||||
return;
|
||||
@@ -226,7 +223,7 @@ class Net{
|
||||
protoHandlers[proto] = cb;
|
||||
}
|
||||
|
||||
public function removeProto(proto: String) {
|
||||
public function removeProto(proto:String) {
|
||||
protoHandlers.remove(proto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package kernel.net;
|
||||
|
||||
enum PackageTypes {
|
||||
Data(proto: String);
|
||||
DataNoResponse(proto: String);
|
||||
Data(proto:String);
|
||||
DataNoResponse(proto:String);
|
||||
Response;
|
||||
RouteDiscover();
|
||||
RouteDiscoverResponse();
|
||||
@@ -21,7 +21,7 @@ enum PackageTypes {
|
||||
/**
|
||||
Parse package from an `modem_message` event.
|
||||
**/
|
||||
public static function fromEvent(params: Array<Dynamic>): Package {
|
||||
public static function fromEvent(params:Array<Dynamic>):Package {
|
||||
var payload = params[4];
|
||||
|
||||
return {
|
||||
@@ -36,7 +36,7 @@ enum PackageTypes {
|
||||
/**
|
||||
Create package that can be used as a response.
|
||||
**/
|
||||
public function createResponse(newData: Dynamic): Package {
|
||||
public function createResponse(newData:Dynamic):Package {
|
||||
return {
|
||||
toID: fromID,
|
||||
fromID: toID,
|
||||
@@ -49,7 +49,7 @@ enum PackageTypes {
|
||||
/**
|
||||
Wrapper for `Net.instance.respondTo`.
|
||||
**/
|
||||
public function respond(data: Dynamic) {
|
||||
Net.instance.respondTo(this,data);
|
||||
public function respond(data:Dynamic) {
|
||||
Net.instance.respondTo(this, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user