@xyo-network/node-view 2.110.3 → 2.110.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -71,12 +71,14 @@ var ViewNode = class extends import_node_memory.MemoryNode {
71
71
  }
72
72
  async build() {
73
73
  return await this._buildMutex.runExclusive(async () => {
74
- const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
75
- if (source) {
76
- await Promise.all(this.ids.map(async (id) => {
77
- await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
78
- }));
79
- this._built = true;
74
+ if (!this._built) {
75
+ const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
76
+ if (source) {
77
+ await Promise.all(this.ids.map(async (id) => {
78
+ await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
79
+ }));
80
+ this._built = true;
81
+ }
80
82
  }
81
83
  });
82
84
  }
@@ -107,7 +109,9 @@ var ViewNode = class extends import_node_memory.MemoryNode {
107
109
  const attached = await this.attached();
108
110
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
109
111
  const existingModule = mods.find((mod2) => mod2.address === address);
110
- (0, import_assert.assertEx)(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
112
+ if (existingModule) {
113
+ this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
114
+ }
111
115
  const mod = (0, import_assert.assertEx)(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
112
116
  mod.addParent(this);
113
117
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
@@ -46,12 +46,14 @@ var ViewNode = class extends MemoryNode {
46
46
  }
47
47
  async build() {
48
48
  return await this._buildMutex.runExclusive(async () => {
49
- const source = asNodeInstance(await super.resolve(this.source));
50
- if (source) {
51
- await Promise.all(this.ids.map(async (id) => {
52
- await MemoryNodeHelper.attachToExistingNode(source, id, this);
53
- }));
54
- this._built = true;
49
+ if (!this._built) {
50
+ const source = asNodeInstance(await super.resolve(this.source));
51
+ if (source) {
52
+ await Promise.all(this.ids.map(async (id) => {
53
+ await MemoryNodeHelper.attachToExistingNode(source, id, this);
54
+ }));
55
+ this._built = true;
56
+ }
55
57
  }
56
58
  });
57
59
  }
@@ -82,7 +84,9 @@ var ViewNode = class extends MemoryNode {
82
84
  const attached = await this.attached();
83
85
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
84
86
  const existingModule = mods.find((mod2) => mod2.address === address);
85
- assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
87
+ if (existingModule) {
88
+ this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
89
+ }
86
90
  const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
87
91
  mod.addParent(this);
88
92
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
1
+ {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -71,12 +71,14 @@ var ViewNode = class extends import_node_memory.MemoryNode {
71
71
  }
72
72
  async build() {
73
73
  return await this._buildMutex.runExclusive(async () => {
74
- const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
75
- if (source) {
76
- await Promise.all(this.ids.map(async (id) => {
77
- await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
78
- }));
79
- this._built = true;
74
+ if (!this._built) {
75
+ const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
76
+ if (source) {
77
+ await Promise.all(this.ids.map(async (id) => {
78
+ await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
79
+ }));
80
+ this._built = true;
81
+ }
80
82
  }
81
83
  });
82
84
  }
@@ -107,7 +109,9 @@ var ViewNode = class extends import_node_memory.MemoryNode {
107
109
  const attached = await this.attached();
108
110
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
109
111
  const existingModule = mods.find((mod2) => mod2.address === address);
110
- (0, import_assert.assertEx)(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
112
+ if (existingModule) {
113
+ this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
114
+ }
111
115
  const mod = (0, import_assert.assertEx)(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
112
116
  mod.addParent(this);
113
117
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AAGvB,0BASO;AACP,6BAAqC;AACrC,yBAA6C;AAC7C,wBAUO;AAEP,yBAAsB;AAEf,IAAMA,uBAAuB;AAa7B,IAAMC,WAAN,cACGC,8BAAAA;EA5CV,OA4CUA;;;EAGR,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeH;;EAC5E,OAAyBI,sBAA8BJ;EACvD,OAAyBK,SAAS;IAAE,GAAGC;EAA0B;EAEzDC,cAAc,IAAIC,yBAAAA;EAClBC,SAAS;EACTC,mBAAmB,IAAIC,4CAAqB;IAAEC,MAAM;EAAK,CAAA;EAEjE,IAAIC,MAAM;AACR,WAAO,KAAKC,OAAOD;EACrB;EAEA,IAAaE,UAAoB;AAC/B,UAAMC,oBAAoB,oBAAIC,IAAY;MAACC;MAAuBC;MAAuBC;KAA0B;AACnH,UAAML,UAAoB;SAAI,MAAMA;;AACpC,WAAOA,QAAQM,OAAO,CAACC,UAAU,CAACN,kBAAkBO,IAAID,KAAAA,CAAAA;EAC1D;EAEA,IAAIE,SAAS;AACX,WAAO,KAAKV,OAAOU;EACrB;EAEA,MAAMC,QAAQ;AACZ,WAAO,MAAM,KAAKlB,YAAYmB,aAAa,YAAA;AACzC,YAAMF,aAASG,kCAAe,MAAM,MAAMC,QAAQ,KAAKJ,MAAM,CAAA;AAC7D,UAAIA,QAAQ;AACV,cAAMK,QAAQC,IACZ,KAAKjB,IAAIkB,IAAI,OAAOC,OAAAA;AAClB,gBAAMC,oCAAiBC,qBAAqBV,QAAQQ,IAAI,IAAI;QAC9D,CAAA,CAAA;AAEF,aAAKvB,SAAS;MAChB;IACF,CAAA;EACF;EAOA,MAAemB,QACbO,aAAiD,KACjDC,UAAkC,CAAC,GACL;AAC9B,QAAI,CAAC,KAAK3B,QAAQ;AAChB,YAAM,KAAKgB,MAAK;IAClB;AACA,UAAMY,OAAO,MAAM,KAAK3B,iBAAiBkB,QAAQ,GAAA;AACjD,QAAIO,eAAe,KAAK;AACtB,aAAOE;IACT;AACA,YAAQ,OAAOF,YAAAA;MACb,KAAK,UAAU;AACb,cAAMG,MAAMD,KAAKE,KAAK,CAACD,SAAQA,KAAIE,YAAYL,cAAcG,KAAIG,YAAYN,UAAAA;AAC7E,eAAOG;MACT;MACA,KAAK,UAAU;AACb,gBAAII,2CAAsBP,UAAAA,GAAa;AACrC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWM,QAAQV,IAAI,OAAOU,YAAY,MAAM,KAAKb,QAAQa,SAASL,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,oBAAAA;QACrH,eAAWC,wCAAmBT,UAAAA,GAAa;AACzC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWU,KAAKd,IAAI,OAAOc,SAAS,MAAM,KAAKjB,QAAQiB,MAAMT,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,oBAAAA;QAC5G;AACA,eAAO,CAAA;MACT;IACF;EACF;EAEA,MAAyBG,mBAAmBL,SAAkB;AAC5D,UAAMM,WAAW,MAAM,KAAKA,SAAQ;AACpC,UAAMV,OAAO,KAAKW,kBAAiB,EAAG3B,OAAO,CAACiB,SAAQS,SAASE,SAASX,KAAIG,OAAO,CAAA;AACnF,UAAMS,iBAAiBb,KAAKE,KAAK,CAACD,SAAQA,KAAIG,YAAYA,OAAAA;AAC1DU,gCAAS,CAACD,gBAAgB,MAAM,WAAWA,gBAAgBV,WAAWU,gBAAgBT,OAAAA,kCAAyCA,OAAAA,GAAU;AACzI,UAAMH,UAAMa,wBAAS,KAAKC,oBAAoBX,OAAAA,GAAU,MAAM,WAAWA,OAAAA,gCAAuC;AAEhHH,QAAIe,UAAU,IAAI;AAElB,UAAMC,OAAO;MAAEhB;MAAKO,MAAMP,IAAIE;IAAQ;AACtC,UAAM,KAAKe,KAAK,kBAAkBD,IAAAA;AAElC,SAAK5C,iBAAiB8C,IAAIlB,GAAAA;AAE1B,YAAImB,gCAAanB,GAAAA,GAAM;AACrB,YAAMoB,mBAAgE,8BAAOJ,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtE,YAAMK,mBAAgE,8BAAOL,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtEhB,UAAIsB,GAAG,kBAAkBF,gBAAAA;AACzBpB,UAAIsB,GAAG,kBAAkBD,gBAAAA;IAC3B;AAEA,WAAOlB;EACT;EAEA,MAAyBoB,wBAAmD;AAC1E,YAAQ,MAAM,KAAKnD,iBAAiBkB,QAAQ,GAAA,GAAMP,OAAO,CAACiB,QAAQA,IAAIG,YAAY,KAAKA,OAAO;EAChG;EAEA,MAAyBqB,mBAAmBrB,SAAkB;AAC5D,UAAMH,UAAMa,wBAAS,MAAM,KAAKY,aAAanC,QAAQa,OAAAA,GAAU,MAAM,WAAWA,OAAAA,8BAAqC;AACrH,SAAK/B,iBAAiBsD,OAAO1B,IAAIG,OAAO;AACxC,WAAOA;EACT;EAEA,MAAyBwB,eAAiC;AACxD,UAAM,MAAMA,aAAAA;AACZ,UAAM,KAAKxC,MAAK;AAChB,WAAO;EACT;AACF;","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
@@ -46,12 +46,14 @@ var ViewNode = class extends MemoryNode {
46
46
  }
47
47
  async build() {
48
48
  return await this._buildMutex.runExclusive(async () => {
49
- const source = asNodeInstance(await super.resolve(this.source));
50
- if (source) {
51
- await Promise.all(this.ids.map(async (id) => {
52
- await MemoryNodeHelper.attachToExistingNode(source, id, this);
53
- }));
54
- this._built = true;
49
+ if (!this._built) {
50
+ const source = asNodeInstance(await super.resolve(this.source));
51
+ if (source) {
52
+ await Promise.all(this.ids.map(async (id) => {
53
+ await MemoryNodeHelper.attachToExistingNode(source, id, this);
54
+ }));
55
+ this._built = true;
56
+ }
55
57
  }
56
58
  });
57
59
  }
@@ -82,7 +84,9 @@ var ViewNode = class extends MemoryNode {
82
84
  const attached = await this.attached();
83
85
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
84
86
  const existingModule = mods.find((mod2) => mod2.address === address);
85
- assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
87
+ if (existingModule) {
88
+ this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`);
89
+ }
86
90
  const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
87
91
  mod.addParent(this);
88
92
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,cAAc;AAGvB,SAEEC,uBACAC,oBAKAC,iCACK;AACP,SAASC,4BAA4B;AACrC,SAASC,YAAYC,wBAAwB;AAC7C,SACEC,gBAEAC,cACAC,uBAEAC,uBAGAC,iCACK;AAEP,SAASC,aAAa;AAEf,IAAMC,uBAAuB;AAa7B,IAAMC,WAAN,cACGC,WAAAA;EA5CV,OA4CUA;;;EAGR,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeH;;EAC5E,OAAyBI,sBAA8BJ;EACvD,OAAyBK,SAAS;IAAE,GAAGC;EAA0B;EAEzDC,cAAc,IAAIC,MAAAA;EAClBC,SAAS;EACTC,mBAAmB,IAAIC,qBAAqB;IAAEC,MAAM;EAAK,CAAA;EAEjE,IAAIC,MAAM;AACR,WAAO,KAAKC,OAAOD;EACrB;EAEA,IAAaE,UAAoB;AAC/B,UAAMC,oBAAoB,oBAAIC,IAAY;MAACC;MAAuBC;MAAuBC;KAA0B;AACnH,UAAML,UAAoB;SAAI,MAAMA;;AACpC,WAAOA,QAAQM,OAAO,CAACC,UAAU,CAACN,kBAAkBO,IAAID,KAAAA,CAAAA;EAC1D;EAEA,IAAIE,SAAS;AACX,WAAO,KAAKV,OAAOU;EACrB;EAEA,MAAMC,QAAQ;AACZ,WAAO,MAAM,KAAKlB,YAAYmB,aAAa,YAAA;AACzC,YAAMF,SAASG,eAAe,MAAM,MAAMC,QAAQ,KAAKJ,MAAM,CAAA;AAC7D,UAAIA,QAAQ;AACV,cAAMK,QAAQC,IACZ,KAAKjB,IAAIkB,IAAI,OAAOC,OAAAA;AAClB,gBAAMC,iBAAiBC,qBAAqBV,QAAQQ,IAAI,IAAI;QAC9D,CAAA,CAAA;AAEF,aAAKvB,SAAS;MAChB;IACF,CAAA;EACF;EAOA,MAAemB,QACbO,aAAiD,KACjDC,UAAkC,CAAC,GACL;AAC9B,QAAI,CAAC,KAAK3B,QAAQ;AAChB,YAAM,KAAKgB,MAAK;IAClB;AACA,UAAMY,OAAO,MAAM,KAAK3B,iBAAiBkB,QAAQ,GAAA;AACjD,QAAIO,eAAe,KAAK;AACtB,aAAOE;IACT;AACA,YAAQ,OAAOF,YAAAA;MACb,KAAK,UAAU;AACb,cAAMG,MAAMD,KAAKE,KAAK,CAACD,SAAQA,KAAIE,YAAYL,cAAcG,KAAIG,YAAYN,UAAAA;AAC7E,eAAOG;MACT;MACA,KAAK,UAAU;AACb,YAAII,sBAAsBP,UAAAA,GAAa;AACrC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWM,QAAQV,IAAI,OAAOU,YAAY,MAAM,KAAKb,QAAQa,SAASL,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,MAAAA;QACrH,WAAWC,mBAAmBT,UAAAA,GAAa;AACzC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWU,KAAKd,IAAI,OAAOc,SAAS,MAAM,KAAKjB,QAAQiB,MAAMT,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,MAAAA;QAC5G;AACA,eAAO,CAAA;MACT;IACF;EACF;EAEA,MAAyBG,mBAAmBL,SAAkB;AAC5D,UAAMM,WAAW,MAAM,KAAKA,SAAQ;AACpC,UAAMV,OAAO,KAAKW,kBAAiB,EAAG3B,OAAO,CAACiB,SAAQS,SAASE,SAASX,KAAIG,OAAO,CAAA;AACnF,UAAMS,iBAAiBb,KAAKE,KAAK,CAACD,SAAQA,KAAIG,YAAYA,OAAAA;AAC1DU,aAAS,CAACD,gBAAgB,MAAM,WAAWA,gBAAgBV,WAAWU,gBAAgBT,OAAAA,kCAAyCA,OAAAA,GAAU;AACzI,UAAMH,MAAMa,SAAS,KAAKC,oBAAoBX,OAAAA,GAAU,MAAM,WAAWA,OAAAA,gCAAuC;AAEhHH,QAAIe,UAAU,IAAI;AAElB,UAAMC,OAAO;MAAEhB;MAAKO,MAAMP,IAAIE;IAAQ;AACtC,UAAM,KAAKe,KAAK,kBAAkBD,IAAAA;AAElC,SAAK5C,iBAAiB8C,IAAIlB,GAAAA;AAE1B,QAAImB,aAAanB,GAAAA,GAAM;AACrB,YAAMoB,mBAAgE,8BAAOJ,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtE,YAAMK,mBAAgE,8BAAOL,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtEhB,UAAIsB,GAAG,kBAAkBF,gBAAAA;AACzBpB,UAAIsB,GAAG,kBAAkBD,gBAAAA;IAC3B;AAEA,WAAOlB;EACT;EAEA,MAAyBoB,wBAAmD;AAC1E,YAAQ,MAAM,KAAKnD,iBAAiBkB,QAAQ,GAAA,GAAMP,OAAO,CAACiB,QAAQA,IAAIG,YAAY,KAAKA,OAAO;EAChG;EAEA,MAAyBqB,mBAAmBrB,SAAkB;AAC5D,UAAMH,MAAMa,SAAS,MAAM,KAAKY,aAAanC,QAAQa,OAAAA,GAAU,MAAM,WAAWA,OAAAA,8BAAqC;AACrH,SAAK/B,iBAAiBsD,OAAO1B,IAAIG,OAAO;AACxC,WAAOA;EACT;EAEA,MAAyBwB,eAAiC;AACxD,UAAM,MAAMA,aAAAA;AACZ,UAAM,KAAKxC,MAAK;AAChB,WAAO;EACT;AACF;","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
1
+ {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAeI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA4BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
1
+ {"version":3,"file":"ViewNode.d.ts","sourceRoot":"","sources":["../../src/ViewNode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,OAAO,EACL,eAAe,EAGf,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,UAAU,EAAoB,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAEL,sBAAsB,EAGtB,UAAU,EAEV,mBAAmB,EACnB,UAAU,EAEX,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD,eAAO,MAAM,oBAAoB,gCAA0C,CAAA;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC;IACE,GAAG,EAAE,gBAAgB,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;CACzB,EACD,oBAAoB,CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAA;AAExE,qBAAa,QAAQ,CAAC,OAAO,SAAS,cAAc,GAAG,cAAc,EAAE,UAAU,SAAS,mBAAmB,GAAG,mBAAmB,CACjI,SAAQ,UAAU,CAAC,OAAO,EAAE,UAAU,CACtC,YAAW,sBAAsB;IAEjC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,MAAM;;MAAmC;IAElE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,IAAI,GAAG,aAEN;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAI/B;IAED,IAAI,MAAM,WAET;IAEK,KAAK;IAiBI,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACpC,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IACxH,OAAO,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;cA4BxH,kBAAkB,CAAC,OAAO,EAAE,OAAO;cA8BnC,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;cAIlD,kBAAkB,CAAC,OAAO,EAAE,OAAO;cAMnC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;CAK1D"}
@@ -65,12 +65,14 @@ var _ViewNode = class _ViewNode extends import_node_memory.MemoryNode {
65
65
  }
66
66
  async build() {
67
67
  return await this._buildMutex.runExclusive(async () => {
68
- const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
69
- if (source) {
70
- await Promise.all(this.ids.map(async (id) => {
71
- await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
72
- }));
73
- this._built = true;
68
+ if (!this._built) {
69
+ const source = (0, import_node_model.asNodeInstance)(await super.resolve(this.source));
70
+ if (source) {
71
+ await Promise.all(this.ids.map(async (id) => {
72
+ await import_node_memory.MemoryNodeHelper.attachToExistingNode(source, id, this);
73
+ }));
74
+ this._built = true;
75
+ }
74
76
  }
75
77
  });
76
78
  }
@@ -101,7 +103,9 @@ var _ViewNode = class _ViewNode extends import_node_memory.MemoryNode {
101
103
  const attached = await this.attached();
102
104
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
103
105
  const existingModule = mods.find((mod2) => mod2.address === address);
104
- (0, import_assert.assertEx)(!existingModule, () => `Module [${(existingModule == null ? void 0 : existingModule.modName) ?? (existingModule == null ? void 0 : existingModule.address)}] already attached at address [${address}]`);
106
+ if (existingModule) {
107
+ this.logger.warn(`ViewNode: Module [${(existingModule == null ? void 0 : existingModule.modName) ?? (existingModule == null ? void 0 : existingModule.address)}] already attached at address [${address}]`);
108
+ }
105
109
  const mod = (0, import_assert.assertEx)(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
106
110
  mod.addParent(this);
107
111
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AAGvB,0BASO;AACP,6BAAqC;AACrC,yBAA6C;AAC7C,wBAUO;AAEP,yBAAsB;AAEf,IAAMA,uBAAuB;AAa7B,IAAMC,YAAN,MAAMA,kBACHC,8BAAAA;EAOAC,cAAc,IAAIC,yBAAAA;EAClBC,SAAS;EACTC,mBAAmB,IAAIC,4CAAqB;IAAEC,MAAM;EAAK,CAAA;EAEjE,IAAIC,MAAM;AACR,WAAO,KAAKC,OAAOD;EACrB;EAEA,IAAaE,UAAoB;AAC/B,UAAMC,oBAAoB,oBAAIC,IAAY;MAACC;MAAuBC;MAAuBC;KAA0B;AACnH,UAAML,UAAoB;SAAI,MAAMA;;AACpC,WAAOA,QAAQM,OAAO,CAACC,UAAU,CAACN,kBAAkBO,IAAID,KAAAA,CAAAA;EAC1D;EAEA,IAAIE,SAAS;AACX,WAAO,KAAKV,OAAOU;EACrB;EAEA,MAAMC,QAAQ;AACZ,WAAO,MAAM,KAAKlB,YAAYmB,aAAa,YAAA;AACzC,YAAMF,aAASG,kCAAe,MAAM,MAAMC,QAAQ,KAAKJ,MAAM,CAAA;AAC7D,UAAIA,QAAQ;AACV,cAAMK,QAAQC,IACZ,KAAKjB,IAAIkB,IAAI,OAAOC,OAAAA;AAClB,gBAAMC,oCAAiBC,qBAAqBV,QAAQQ,IAAI,IAAI;QAC9D,CAAA,CAAA;AAEF,aAAKvB,SAAS;MAChB;IACF,CAAA;EACF;EAOA,MAAemB,QACbO,aAAiD,KACjDC,UAAkC,CAAC,GACL;AAC9B,QAAI,CAAC,KAAK3B,QAAQ;AAChB,YAAM,KAAKgB,MAAK;IAClB;AACA,UAAMY,OAAO,MAAM,KAAK3B,iBAAiBkB,QAAQ,GAAA;AACjD,QAAIO,eAAe,KAAK;AACtB,aAAOE;IACT;AACA,YAAQ,OAAOF,YAAAA;MACb,KAAK,UAAU;AACb,cAAMG,MAAMD,KAAKE,KAAK,CAACD,SAAQA,KAAIE,YAAYL,cAAcG,KAAIG,YAAYN,UAAAA;AAC7E,eAAOG;MACT;MACA,KAAK,UAAU;AACb,gBAAII,2CAAsBP,UAAAA,GAAa;AACrC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWM,QAAQV,IAAI,OAAOU,YAAY,MAAM,KAAKb,QAAQa,SAASL,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,oBAAAA;QACrH,eAAWC,wCAAmBT,UAAAA,GAAa;AACzC,kBAAQ,MAAMN,QAAQC,IAAIK,WAAWU,KAAKd,IAAI,OAAOc,SAAS,MAAM,KAAKjB,QAAQiB,MAAMT,OAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,oBAAAA;QAC5G;AACA,eAAO,CAAA;MACT;IACF;EACF;EAEA,MAAyBG,mBAAmBL,SAAkB;AAC5D,UAAMM,WAAW,MAAM,KAAKA,SAAQ;AACpC,UAAMV,OAAO,KAAKW,kBAAiB,EAAG3B,OAAO,CAACiB,SAAQS,SAASE,SAASX,KAAIG,OAAO,CAAA;AACnF,UAAMS,iBAAiBb,KAAKE,KAAK,CAACD,SAAQA,KAAIG,YAAYA,OAAAA;AAC1DU,gCAAS,CAACD,gBAAgB,MAAM,YAAWA,iDAAgBV,aAAWU,iDAAgBT,QAAAA,kCAAyCA,OAAAA,GAAU;AACzI,UAAMH,UAAMa,wBAAS,KAAKC,oBAAoBX,OAAAA,GAAU,MAAM,WAAWA,OAAAA,gCAAuC;AAEhHH,QAAIe,UAAU,IAAI;AAElB,UAAMC,OAAO;MAAEhB;MAAKO,MAAMP,IAAIE;IAAQ;AACtC,UAAM,KAAKe,KAAK,kBAAkBD,IAAAA;AAElC,SAAK5C,iBAAiB8C,IAAIlB,GAAAA;AAE1B,YAAImB,gCAAanB,GAAAA,GAAM;AACrB,YAAMoB,mBAAgE,8BAAOJ,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtE,YAAMK,mBAAgE,8BAAOL,UAC3E,MAAM,KAAKC,KAAK,kBAAkBD,KAAAA,GADkC;AAGtEhB,UAAIsB,GAAG,kBAAkBF,gBAAAA;AACzBpB,UAAIsB,GAAG,kBAAkBD,gBAAAA;IAC3B;AAEA,WAAOlB;EACT;EAEA,MAAyBoB,wBAAmD;AAC1E,YAAQ,MAAM,KAAKnD,iBAAiBkB,QAAQ,GAAA,GAAMP,OAAO,CAACiB,QAAQA,IAAIG,YAAY,KAAKA,OAAO;EAChG;EAEA,MAAyBqB,mBAAmBrB,SAAkB;AAC5D,UAAMH,UAAMa,wBAAS,MAAM,KAAKY,aAAanC,QAAQa,OAAAA,GAAU,MAAM,WAAWA,OAAAA,8BAAqC;AACrH,SAAK/B,iBAAiBsD,OAAO1B,IAAIG,OAAO;AACxC,WAAOA;EACT;EAEA,MAAyBwB,eAAiC;AACxD,UAAM,MAAMA,aAAAA;AACZ,UAAM,KAAKxC,MAAK;AAChB,WAAO;EACT;AACF;AAlHUnB;AAGR,cAJWD,WAIc6D,iBAA0B;KAAI,iCAAMA;EAAe9D;;AAC5E,cALWC,WAKc8D,uBAA8B/D;AACvD,cANWC,WAMc+D,UAAS;EAAE,GAAGC;AAA0B;AAN5D,IAAMhE,WAAN;","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode.js'\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["ViewNodeConfigSchema","ViewNode","MemoryNode","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel"]}
@@ -40,12 +40,14 @@ var _ViewNode = class _ViewNode extends MemoryNode {
40
40
  }
41
41
  async build() {
42
42
  return await this._buildMutex.runExclusive(async () => {
43
- const source = asNodeInstance(await super.resolve(this.source));
44
- if (source) {
45
- await Promise.all(this.ids.map(async (id) => {
46
- await MemoryNodeHelper.attachToExistingNode(source, id, this);
47
- }));
48
- this._built = true;
43
+ if (!this._built) {
44
+ const source = asNodeInstance(await super.resolve(this.source));
45
+ if (source) {
46
+ await Promise.all(this.ids.map(async (id) => {
47
+ await MemoryNodeHelper.attachToExistingNode(source, id, this);
48
+ }));
49
+ this._built = true;
50
+ }
49
51
  }
50
52
  });
51
53
  }
@@ -76,7 +78,9 @@ var _ViewNode = class _ViewNode extends MemoryNode {
76
78
  const attached = await this.attached();
77
79
  const mods = this.registeredModules().filter((mod2) => attached.includes(mod2.address));
78
80
  const existingModule = mods.find((mod2) => mod2.address === address);
79
- assertEx(!existingModule, () => `Module [${(existingModule == null ? void 0 : existingModule.modName) ?? (existingModule == null ? void 0 : existingModule.address)}] already attached at address [${address}]`);
81
+ if (existingModule) {
82
+ this.logger.warn(`ViewNode: Module [${(existingModule == null ? void 0 : existingModule.modName) ?? (existingModule == null ? void 0 : existingModule.address)}] already attached at address [${address}]`);
83
+ }
80
84
  const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`);
81
85
  mod.addParent(this);
82
86
  const args = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel"]}
1
+ {"version":3,"sources":["../../src/ViewNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { Address } from '@xylabs/hex'\nimport { EventListener } from '@xyo-network/module-events'\nimport {\n AnyConfigSchema,\n isAddressModuleFilter,\n isNameModuleFilter,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleIdentifier,\n ModuleInstance,\n ModuleLimitationViewLabel,\n} from '@xyo-network/module-model'\nimport { SimpleModuleResolver } from '@xyo-network/module-resolver'\nimport { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'\nimport {\n asNodeInstance,\n AttachableNodeInstance,\n isNodeModule,\n NodeAttachQuerySchema,\n NodeConfig,\n NodeDetachQuerySchema,\n NodeModuleEventData,\n NodeParams,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { Schema } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport const ViewNodeConfigSchema = 'network.xyo.node.view.config' as const\nexport type ViewNodeConfigSchema = typeof ViewNodeConfigSchema\n\nexport type ViewNodeConfig = NodeConfig<\n {\n ids: ModuleIdentifier[]\n source: ModuleIdentifier\n },\n ViewNodeConfigSchema\n>\n\nexport type ViewNodeParams = NodeParams<AnyConfigSchema<ViewNodeConfig>>\n\nexport class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends MemoryNode<TParams, TEventData>\n implements AttachableNodeInstance\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, ViewNodeConfigSchema]\n static override readonly defaultConfigSchema: Schema = ViewNodeConfigSchema\n static override readonly labels = { ...ModuleLimitationViewLabel }\n\n private _buildMutex = new Mutex()\n private _built = false\n private _limitedResolver = new SimpleModuleResolver({ root: this })\n\n get ids() {\n return this.config.ids\n }\n\n override get queries(): Schema[] {\n const disallowedQueries = new Set<Schema>([NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema])\n const queries: Schema[] = [...super.queries]\n return queries.filter((query) => !disallowedQueries.has(query))\n }\n\n get source() {\n return this.config.source\n }\n\n async build() {\n return await this._buildMutex.runExclusive(async () => {\n if (!this._built) {\n const source = asNodeInstance(await super.resolve(this.source))\n if (source) {\n await Promise.all(\n this.ids.map(async (id) => {\n await MemoryNodeHelper.attachToExistingNode(source, id, this)\n }),\n )\n this._built = true\n }\n }\n })\n }\n\n /** @deprecated do not pass undefined. If trying to get all, pass '*' */\n override async resolve(): Promise<ModuleInstance[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(all: '*', options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(filter: ModuleFilter, options?: ModuleFilterOptions<T>): Promise<T[]>\n override async resolve<T extends ModuleInstance = ModuleInstance>(id: ModuleIdentifier, options?: ModuleFilterOptions<T>): Promise<T | undefined>\n override async resolve<T extends ModuleInstance = ModuleInstance>(\n idOrFilter: ModuleFilter<T> | ModuleIdentifier = '*',\n options: ModuleFilterOptions<T> = {},\n ): Promise<T | T[] | undefined> {\n if (!this._built) {\n await this.build()\n }\n const mods = await this._limitedResolver.resolve('*')\n if (idOrFilter === '*') {\n return mods as unknown as T[]\n }\n switch (typeof idOrFilter) {\n case 'string': {\n const mod = mods.find((mod) => mod.modName === idOrFilter || mod.address === idOrFilter)\n return mod as unknown as T\n }\n case 'object': {\n if (isAddressModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists)\n } else if (isNameModuleFilter(idOrFilter)) {\n return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists)\n }\n return []\n }\n }\n }\n\n protected override async attachUsingAddress(address: Address) {\n const attached = await this.attached()\n const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))\n const existingModule = mods.find((mod) => mod.address === address)\n if (existingModule) {\n this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)\n }\n const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)\n\n mod.addParent(this)\n\n const args = { mod, name: mod.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(mod)\n\n if (isNodeModule(mod)) {\n const attachedListener: EventListener<TEventData['moduleAttached']> = async (args: TEventData['moduleAttached']) =>\n await this.emit('moduleAttached', args)\n\n const detachedListener: EventListener<TEventData['moduleDetached']> = async (args: TEventData['moduleDetached']) =>\n await this.emit('moduleDetached', args)\n\n mod.on('moduleAttached', attachedListener)\n mod.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((mod) => mod.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const mod = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(mod.address)\n return address\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"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","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","MemoryNodeHelper","asNodeInstance","isNodeModule","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","Mutex","ViewNodeConfigSchema","ViewNode","MemoryNode","_buildMutex","Mutex","_built","_limitedResolver","SimpleModuleResolver","root","ids","config","queries","disallowedQueries","Set","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","filter","query","has","source","build","runExclusive","asNodeInstance","resolve","Promise","all","map","id","MemoryNodeHelper","attachToExistingNode","idOrFilter","options","mods","mod","find","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","registeredModules","includes","existingModule","logger","warn","assertEx","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel"]}
package/package.json CHANGED
@@ -13,17 +13,17 @@
13
13
  "@xylabs/assert": "^3.5.9",
14
14
  "@xylabs/exists": "^3.5.9",
15
15
  "@xylabs/hex": "^3.5.9",
16
- "@xyo-network/module-events": "^2.110.3",
17
- "@xyo-network/module-model": "^2.110.3",
18
- "@xyo-network/module-resolver": "^2.110.3",
19
- "@xyo-network/node-memory": "^2.110.3",
20
- "@xyo-network/node-model": "^2.110.3",
21
- "@xyo-network/payload-model": "^2.110.3",
16
+ "@xyo-network/module-events": "^2.110.5",
17
+ "@xyo-network/module-model": "^2.110.5",
18
+ "@xyo-network/module-resolver": "^2.110.5",
19
+ "@xyo-network/node-memory": "^2.110.5",
20
+ "@xyo-network/node-model": "^2.110.5",
21
+ "@xyo-network/payload-model": "^2.110.5",
22
22
  "async-mutex": "^0.5.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@xylabs/ts-scripts-yarn3": "^3.11.12",
26
- "@xylabs/tsconfig": "^3.11.12",
25
+ "@xylabs/ts-scripts-yarn3": "^3.12.1",
26
+ "@xylabs/tsconfig": "^3.12.1",
27
27
  "typescript": "^5.5.3"
28
28
  },
29
29
  "description": "Primary SDK for using XYO Protocol 2.0",
@@ -65,6 +65,6 @@
65
65
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
66
66
  },
67
67
  "sideEffects": false,
68
- "version": "2.110.3",
68
+ "version": "2.110.5",
69
69
  "type": "module"
70
70
  }
package/src/ViewNode.ts CHANGED
@@ -69,14 +69,16 @@ export class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventDat
69
69
 
70
70
  async build() {
71
71
  return await this._buildMutex.runExclusive(async () => {
72
- const source = asNodeInstance(await super.resolve(this.source))
73
- if (source) {
74
- await Promise.all(
75
- this.ids.map(async (id) => {
76
- await MemoryNodeHelper.attachToExistingNode(source, id, this)
77
- }),
78
- )
79
- this._built = true
72
+ if (!this._built) {
73
+ const source = asNodeInstance(await super.resolve(this.source))
74
+ if (source) {
75
+ await Promise.all(
76
+ this.ids.map(async (id) => {
77
+ await MemoryNodeHelper.attachToExistingNode(source, id, this)
78
+ }),
79
+ )
80
+ this._built = true
81
+ }
80
82
  }
81
83
  })
82
84
  }
@@ -117,7 +119,9 @@ export class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventDat
117
119
  const attached = await this.attached()
118
120
  const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))
119
121
  const existingModule = mods.find((mod) => mod.address === address)
120
- assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)
122
+ if (existingModule) {
123
+ this.logger.warn(`ViewNode: Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)
124
+ }
121
125
  const mod = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered mods`)
122
126
 
123
127
  mod.addParent(this)