package kernel.net; import kernel.log.Log; using tink.CoreApi; /** Virtual network interface that handles packages to the same id as the sender. **/ class Loopback implements INetworkInterface { public static final instance:Loopback = new Loopback(); public var onMessage(default, null):Signal<{pack:Package,dist:Null}>; private final onMessageTrigger: SignalTrigger<{pack:Package,dist:Null}> = Signal.trigger(); private var openChans: Array = []; private function new() { this.onMessage = onMessageTrigger.asSignal(); } public function listen(chan:Int) { if (!this.openChans.contains(chan)){ this.openChans.push(chan); } } public function close(chan:Int) { this.openChans.remove(chan); } public function isListening(chan:Int):Bool { return this.openChans.contains(chan); } public function closeAll() { this.openChans = []; } public function send(chan:Int, replyChan:Int, payload:Any) { if (this.openChans.contains(chan)){ this.onMessageTrigger.trigger({pack:payload,dist:null}); }else{ Log.silly("Loopback got package on non open channel"); } } public function name():String { return "loopback"; } public function getBaseRoutingCost():Int { return 0; } }