nv-data-fullmesh
Version:
full-mesh,mesh-map,sender-recver
146 lines (130 loc) • 3.67 kB
JavaScript
const nvmap = require("nv-map-basic");
const {
creat_id,
get_abbr,
ZWNJ,
add_repr,
} = require("nv-facutil-basic");
const {rename_cls} = require("nv-facutil-name");
const {
SYM_MP,
SYM_CTRL,
SYM_RECV_FROM,
SYM_ND_RECV_FROM_CTRL,
SYM_CTRL_RECV_FROM_ND,
DFLT_RECV_FROM_HANDLER
} = require("./cmmn");
function _init_id(id,autoid) {
id = (id === undefined)?autoid:id.toString()
return(id)
}
const _handler = {
get: function(target,key,receiver) {
let mp = target[SYM_MP];
let cond = mp.has(key);
if(cond) {
return(mp.get(key))
} else {
let ks = Array.from(mp.keys());
ks = ks.filter(k=>k.startsWith(key));
ks.forEach(k=>console.log(k))
}
},
set: function (target, key, value, receiver) {
let c = Reflect.get(target,key);
let mp = target[SYM_MP];
if(c instanceof _Node) {
c.data = value;
} else {
let nd = new _Node(mp,value,key);
mp.set(key,nd);
let ctrl = target[SYM_CTRL]
ctrl[key] = nd;
}
},
deleteProperty: function(target, property) {
let mp = target[SYM_MP];
let ctrl = target[SYM_CTRL];
delete ctrl[property];
return(mp.delete(property));
}
}
class _Node {
#ctrl
#id = creat_id()
#data
#recv_from_handler = DFLT_RECV_FROM_HANDLER
#recv_from_ctrl_handler = DFLT_RECV_FROM_HANDLER
constructor(ctrl,data,id){
this.#ctrl = ctrl;
this.#id = _init_id(id,this.#id);
this.#data = data;
//this.#ctrl[id] = this 在controller中执行
}
get [SYM_CTRL]() {return(this.#ctrl)}
get [SYM_MP]() {return(this.#ctrl[SYM_MP])}
get id() {return(this.#id)}
get data() {return(this.#data)}
set data(v) {this.#data = v}
get recv_from_handler() {return(this.#recv_from_handler)}
set recv_from_handler(handler) {this.#recv_from_handler = handler}
[SYM_RECV_FROM](src,msg,include_self=false) {
if(src === this && !include_self) {
} else {
this.#recv_from_handler(src,msg,this);
}
}
broadcast(msg,include_self=false) {
this[SYM_MP].forEach(
nd => nd[SYM_RECV_FROM](this,msg,include_self)
);
}
multicast(dsts,msg,include_self=false) {
dsts.forEach(
nd => nd[SYM_RECV_FROM](this,msg,include_self)
);
}
send_to(dst,msg,include_self=false) {
dst[SYM_RECV_FROM](this,msg,include_self)
}
////
get recv_from_ctrl_handler() {return(this.#recv_from_ctrl_handler)}
set recv_from_ctrl_handler(handler) {this.#recv_from_ctrl_handler = handler}
[SYM_ND_RECV_FROM_CTRL](ctrl,msg) {
this.#recv_from_ctrl_handler(ctrl,msg,this);
}
send_to_ctrl(msg) {
this.#ctrl[SYM_CTRL_RECV_FROM_ND](this,msg)
}
////
neighbors(filter=(r,id)=>true) {
let d = nvmap.to_dict(this.#ctrl[SYM_MP]);
delete d[this.#id];
for(let k in d) {
let cond = filter(d[k],k);
if(!cond) {delete d[k]}
}
return(d)
}
////
get [Symbol.toStringTag]() { return(get_abbr(this.#id))}
get ["$$"]() {
let proxy = new Proxy(this,_handler);
return(proxy)
}
////
////
disconn() {
////
let mp = this[SYM_MP];
let id = this.#id;
mp.delete(id);
delete this.#ctrl[id];
////
return(this.data)
}
}
rename_cls(_Node,ZWNJ);
function _repr(that) {return(that.data)}
add_repr(_Node,_repr);
module.exports = _Node;