UNPKG

nv-data-fullmesh

Version:

full-mesh,mesh-map,sender-recver

146 lines (130 loc) 3.67 kB
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;