import Listener from './Listener' import Throttle from './Throttle' import Request from './Request' export type NervNodeType = 'CenterNode' | 'ComponentNode' | 'AdHocNode' export default class NervNode { public name: string public type: NervNodeType public parent: NervNode = null public children: Array = [] private centerNode: NervNode private listener: Listener private inThrottle: Throttle private outThrottle: Throttle constructor(name: string, type: NervNodeType, listener: Listener, inThrottle: Throttle, outThrottle: Throttle, centerNode: NervNode) { this.name = name this.type = type this.listener = listener this.inThrottle = inThrottle this.outThrottle = outThrottle this.centerNode = centerNode } public bind(child: NervNode) :void { child.parent = this this.children.push(child) } public unbind(child: NervNode) :void { const i = this.children.indexOf(child) child.parent = null this.children.splice(i, 1) } public setCenterNervNode(center: NervNode) { this.centerNode = center } public dispatch(request: Request) { // down this.children.map(child => child.walkDown(request)) // up if (this.parent === null) return if (!this.outThrottle.check(request)) return this.parent.walkUp(request, this) } public dispatchUp(request: Request) { // up if (this.parent === null) return if (!this.outThrottle.check(request)) return this.parent.walkUp(request, this) } public dispatchDown(request: Request) { // down this.children.map(child => child.walkDown(request)) } public broadcast(request: Request) { if (this.type !== 'CenterNode') { this.centerNode.broadcast(request) } else { this.children.map(child => child.walkDown(request)) } } private walkDown(request: Request) { if (!this.inThrottle.check(request)) return // console.log(request.path + ' In ' + this.name) this.listener.check(request) this.children.map(child => child.walkDown(request)) } private walkUp(request: Request, resource: NervNode) { this.listener.check(request) this.children.filter(child => child !== resource).map(child => child.walkDown(request)) if (this.parent === null) return if (!this.outThrottle.check(request)) return // console.log(request.path + ' Out ' + this.name) this.parent.walkUp(request, this) } }