@xyo-network/node-view 2.107.1 → 2.107.4
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.
- package/dist/browser/ViewNode.d.cts +2 -2
- package/dist/browser/ViewNode.d.cts.map +1 -1
- package/dist/browser/ViewNode.d.mts +2 -2
- package/dist/browser/ViewNode.d.mts.map +1 -1
- package/dist/browser/ViewNode.d.ts +2 -2
- package/dist/browser/ViewNode.d.ts.map +1 -1
- package/dist/browser/index.cjs +140 -1
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +119 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/neutral/ViewNode.d.cts +2 -2
- package/dist/neutral/ViewNode.d.cts.map +1 -1
- package/dist/neutral/ViewNode.d.mts +2 -2
- package/dist/neutral/ViewNode.d.mts.map +1 -1
- package/dist/neutral/ViewNode.d.ts +2 -2
- package/dist/neutral/ViewNode.d.ts.map +1 -1
- package/dist/neutral/index.cjs +140 -1
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.js +119 -1
- package/dist/neutral/index.js.map +1 -1
- package/dist/node/ViewNode.d.cts +2 -2
- package/dist/node/ViewNode.d.cts.map +1 -1
- package/dist/node/ViewNode.d.mts +2 -2
- package/dist/node/ViewNode.d.mts.map +1 -1
- package/dist/node/ViewNode.d.ts +2 -2
- package/dist/node/ViewNode.d.ts.map +1 -1
- package/dist/node/index.cjs +149 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +123 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +9 -9
- package/src/ViewNode.ts +6 -12
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode'\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,
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/ViewNode.ts"],"sourcesContent":["export * from './ViewNode'\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 module = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered modules`)\n\n module.addParent(this)\n\n const args = { module, name: module.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(module)\n\n if (isNodeModule(module)) {\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 module.on('moduleAttached', attachedListener)\n module.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((module) => module.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const module = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(module.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","assertEx","module","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","configSchemas","defaultConfigSchema","labels","ModuleLimitationViewLabel"]}
|
package/dist/node/index.js
CHANGED
|
@@ -1,2 +1,124 @@
|
|
|
1
|
-
var
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __reflectGet = Reflect.get;
|
|
4
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
8
|
+
|
|
9
|
+
// src/ViewNode.ts
|
|
10
|
+
import { assertEx } from "@xylabs/assert";
|
|
11
|
+
import { exists } from "@xylabs/exists";
|
|
12
|
+
import { isAddressModuleFilter, isNameModuleFilter, ModuleLimitationViewLabel } from "@xyo-network/module-model";
|
|
13
|
+
import { SimpleModuleResolver } from "@xyo-network/module-resolver";
|
|
14
|
+
import { MemoryNode, MemoryNodeHelper } from "@xyo-network/node-memory";
|
|
15
|
+
import { asNodeInstance, isNodeModule, NodeAttachQuerySchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema } from "@xyo-network/node-model";
|
|
16
|
+
import { Mutex } from "async-mutex";
|
|
17
|
+
var ViewNodeConfigSchema = "network.xyo.node.view.config";
|
|
18
|
+
var _ViewNode = class _ViewNode extends MemoryNode {
|
|
19
|
+
_buildMutex = new Mutex();
|
|
20
|
+
_built = false;
|
|
21
|
+
_limitedResolver = new SimpleModuleResolver({
|
|
22
|
+
root: this
|
|
23
|
+
});
|
|
24
|
+
get ids() {
|
|
25
|
+
return this.config.ids;
|
|
26
|
+
}
|
|
27
|
+
get queries() {
|
|
28
|
+
const disallowedQueries = /* @__PURE__ */ new Set([
|
|
29
|
+
NodeAttachQuerySchema,
|
|
30
|
+
NodeDetachQuerySchema,
|
|
31
|
+
NodeRegisteredQuerySchema
|
|
32
|
+
]);
|
|
33
|
+
const queries = [
|
|
34
|
+
...super.queries
|
|
35
|
+
];
|
|
36
|
+
return queries.filter((query) => !disallowedQueries.has(query));
|
|
37
|
+
}
|
|
38
|
+
get source() {
|
|
39
|
+
return this.config.source;
|
|
40
|
+
}
|
|
41
|
+
async build() {
|
|
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;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async resolve(idOrFilter = "*", options = {}) {
|
|
53
|
+
if (!this._built) {
|
|
54
|
+
await this.build();
|
|
55
|
+
}
|
|
56
|
+
const mods = await this._limitedResolver.resolve("*");
|
|
57
|
+
if (idOrFilter === "*") {
|
|
58
|
+
return mods;
|
|
59
|
+
}
|
|
60
|
+
switch (typeof idOrFilter) {
|
|
61
|
+
case "string": {
|
|
62
|
+
const mod = mods.find((mod2) => mod2.modName === idOrFilter || mod2.address === idOrFilter);
|
|
63
|
+
return mod;
|
|
64
|
+
}
|
|
65
|
+
case "object": {
|
|
66
|
+
if (isAddressModuleFilter(idOrFilter)) {
|
|
67
|
+
return (await Promise.all(idOrFilter.address.map(async (address) => await this.resolve(address, options)))).filter(exists);
|
|
68
|
+
} else if (isNameModuleFilter(idOrFilter)) {
|
|
69
|
+
return (await Promise.all(idOrFilter.name.map(async (name) => await this.resolve(name, options)))).filter(exists);
|
|
70
|
+
}
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async attachUsingAddress(address) {
|
|
76
|
+
const attached = await this.attached();
|
|
77
|
+
const mods = this.registeredModules().filter((mod) => attached.includes(mod.address));
|
|
78
|
+
const existingModule = mods.find((mod) => mod.address === address);
|
|
79
|
+
assertEx(!existingModule, () => `Module [${(existingModule == null ? void 0 : existingModule.modName) ?? (existingModule == null ? void 0 : existingModule.address)}] already attached at address [${address}]`);
|
|
80
|
+
const module = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered modules`);
|
|
81
|
+
module.addParent(this);
|
|
82
|
+
const args = {
|
|
83
|
+
module,
|
|
84
|
+
name: module.modName
|
|
85
|
+
};
|
|
86
|
+
await this.emit("moduleAttached", args);
|
|
87
|
+
this._limitedResolver.add(module);
|
|
88
|
+
if (isNodeModule(module)) {
|
|
89
|
+
const attachedListener = /* @__PURE__ */ __name(async (args2) => await this.emit("moduleAttached", args2), "attachedListener");
|
|
90
|
+
const detachedListener = /* @__PURE__ */ __name(async (args2) => await this.emit("moduleDetached", args2), "detachedListener");
|
|
91
|
+
module.on("moduleAttached", attachedListener);
|
|
92
|
+
module.on("moduleDetached", detachedListener);
|
|
93
|
+
}
|
|
94
|
+
return address;
|
|
95
|
+
}
|
|
96
|
+
async attachedPublicModules() {
|
|
97
|
+
return (await this._limitedResolver.resolve("*")).filter((module) => module.address !== this.address);
|
|
98
|
+
}
|
|
99
|
+
async detachUsingAddress(address) {
|
|
100
|
+
const module = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`);
|
|
101
|
+
this._limitedResolver.remove(module.address);
|
|
102
|
+
return address;
|
|
103
|
+
}
|
|
104
|
+
async startHandler() {
|
|
105
|
+
await super.startHandler();
|
|
106
|
+
await this.build();
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
__name(_ViewNode, "ViewNode");
|
|
111
|
+
__publicField(_ViewNode, "configSchemas", [
|
|
112
|
+
...__superGet(_ViewNode, _ViewNode, "configSchemas"),
|
|
113
|
+
ViewNodeConfigSchema
|
|
114
|
+
]);
|
|
115
|
+
__publicField(_ViewNode, "defaultConfigSchema", ViewNodeConfigSchema);
|
|
116
|
+
__publicField(_ViewNode, "labels", {
|
|
117
|
+
...ModuleLimitationViewLabel
|
|
118
|
+
});
|
|
119
|
+
var ViewNode = _ViewNode;
|
|
120
|
+
export {
|
|
121
|
+
ViewNode,
|
|
122
|
+
ViewNodeConfigSchema
|
|
123
|
+
};
|
|
2
124
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -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, NodeHelper } 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 NodeHelper.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 module = this.registeredModuleMap[address]\n\n if (!module) {\n return\n }\n\n module.addParent(this)\n\n const args = { module, name: module.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(module)\n\n if (isNodeModule(module)) {\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 module.on('moduleAttached', attachedListener)\n module.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((module) => module.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const module = await this.downResolver.resolve(address)\n if (module) {\n this._limitedResolver.remove(address)\n return address\n }\n }\n\n protected override async startHandler(): Promise<boolean> {\n await super.startHandler()\n await this.build()\n return true\n }\n}\n"],"mappings":"gSAAA,OAASA,YAAAA,MAAgB,iBACzB,OAASC,UAAAA,MAAc,iBAGvB,OAEEC,yBAAAA,EACAC,sBAAAA,EAKAC,6BAAAA,MACK,4BACP,OAASC,wBAAAA,MAA4B,+BACrC,OAASC,cAAAA,EAAYC,cAAAA,MAAkB,2BACvC,OACEC,kBAAAA,EAEAC,gBAAAA,EACAC,yBAAAA,EAEAC,yBAAAA,EAGAC,6BAAAA,MACK,0BAEP,OAASC,SAAAA,MAAa,cAEf,IAAMC,EAAuB,+BAavBC,EAAN,MAAMA,UACHC,CAAAA,CAOAC,YAAc,IAAIC,EAClBC,OAAS,GACTC,iBAAmB,IAAIC,EAAqB,CAAEC,KAAM,IAAK,CAAA,EAEjE,IAAIC,KAAM,CACR,OAAO,KAAKC,OAAOD,GACrB,CAEA,IAAaE,SAAoB,CAC/B,IAAMC,EAAoB,IAAIC,IAAY,CAACC,EAAuBC,EAAuBC,EAA0B,EAEnH,MAD0B,IAAI,MAAML,SACrBM,OAAQC,GAAU,CAACN,EAAkBO,IAAID,CAAAA,CAAAA,CAC1D,CAEA,IAAIE,QAAS,CACX,OAAO,KAAKV,OAAOU,MACrB,CAEA,MAAMC,OAAQ,CACZ,OAAO,MAAM,KAAKlB,YAAYmB,aAAa,SAAA,CACzC,IAAMF,EAASG,EAAe,MAAM,MAAMC,QAAQ,KAAKJ,MAAM,CAAA,EACzDA,IACF,MAAMK,QAAQC,IACZ,KAAKjB,IAAIkB,IAAI,MAAOC,GAAAA,CAClB,MAAMC,EAAWC,qBAAqBV,EAAQQ,EAAI,IAAI,CACxD,CAAA,CAAA,EAEF,KAAKvB,OAAS,GAElB,CAAA,CACF,CAOA,MAAemB,QACbO,EAAiD,IACjDC,EAAkC,CAAC,EACL,CACzB,KAAK3B,QACR,MAAM,KAAKgB,MAAK,EAElB,IAAMY,EAAO,MAAM,KAAK3B,iBAAiBkB,QAAQ,GAAA,EACjD,GAAIO,IAAe,IACjB,OAAOE,EAET,OAAQ,OAAOF,EAAAA,CACb,IAAK,SAEH,OADYE,EAAKC,KAAMC,GAAQA,EAAIC,UAAYL,GAAcI,EAAIE,UAAYN,CAAAA,EAG/E,IAAK,SACH,OAAIO,EAAsBP,CAAAA,GAChB,MAAMN,QAAQC,IAAIK,EAAWM,QAAQV,IAAI,MAAOU,GAAY,MAAM,KAAKb,QAAQa,EAASL,CAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,CAAAA,EAC1GC,EAAmBT,CAAAA,GACpB,MAAMN,QAAQC,IAAIK,EAAWU,KAAKd,IAAI,MAAOc,GAAS,MAAM,KAAKjB,QAAQiB,EAAMT,CAAAA,CAAAA,CAAAA,GAAYf,OAAOsB,CAAAA,EAErG,CAAA,CAEX,CACF,CAEA,MAAyBG,mBAAmBL,EAAkB,CAC5D,IAAMM,EAAW,MAAM,KAAKA,SAAQ,EAE9BC,EADO,KAAKC,kBAAiB,EAAG5B,OAAQkB,GAAQQ,EAASG,SAASX,EAAIE,OAAO,CAAA,EACvDH,KAAMC,GAAQA,EAAIE,UAAYA,CAAAA,EAC1DU,EAAS,CAACH,EAAgB,IAAM,YAAWA,GAAAA,YAAAA,EAAgBR,WAAWQ,GAAAA,YAAAA,EAAgBP,QAAAA,kCAAyCA,CAAAA,GAAU,EACzI,IAAMW,EAAS,KAAKC,oBAAoBZ,CAAAA,EAExC,GAAI,CAACW,EACH,OAGFA,EAAOE,UAAU,IAAI,EAErB,IAAMC,EAAO,CAAEH,OAAAA,EAAQP,KAAMO,EAAOZ,OAAQ,EAK5C,GAJA,MAAM,KAAKgB,KAAK,iBAAkBD,CAAAA,EAElC,KAAK7C,iBAAiB+C,IAAIL,CAAAA,EAEtBM,EAAaN,CAAAA,EAAS,CACxB,IAAMO,EAAgEC,EAAA,MAAOL,GAC3E,MAAM,KAAKC,KAAK,iBAAkBD,CAAAA,EADkC,oBAGhEM,EAAgED,EAAA,MAAOL,GAC3E,MAAM,KAAKC,KAAK,iBAAkBD,CAAAA,EADkC,oBAGtEH,EAAOU,GAAG,iBAAkBH,CAAAA,EAC5BP,EAAOU,GAAG,iBAAkBD,CAAAA,CAC9B,CAEA,OAAOpB,CACT,CAEA,MAAyBsB,uBAAmD,CAC1E,OAAQ,MAAM,KAAKrD,iBAAiBkB,QAAQ,GAAA,GAAMP,OAAQ+B,GAAWA,EAAOX,UAAY,KAAKA,OAAO,CACtG,CAEA,MAAyBuB,mBAAmBvB,EAAkB,CAE5D,GADe,MAAM,KAAKwB,aAAarC,QAAQa,CAAAA,EAE7C,YAAK/B,iBAAiBwD,OAAOzB,CAAAA,EACtBA,CAEX,CAEA,MAAyB0B,cAAiC,CACxD,aAAM,MAAMA,aAAAA,EACZ,MAAM,KAAK1C,MAAK,EACT,EACT,CACF,EAxHUnB,EAAAA,EAAAA,YAGR8D,EAJW/D,EAIcgE,gBAA0B,IAAIC,EAAAC,IAAMF,iBAAejE,IAC5EgE,EALW/D,EAKcmE,sBAA8BpE,GACvDgE,EANW/D,EAMcoE,SAAS,CAAE,GAAGC,CAA0B,GAN5D,IAAMrE,EAANkE","names":["assertEx","exists","isAddressModuleFilter","isNameModuleFilter","ModuleLimitationViewLabel","SimpleModuleResolver","MemoryNode","NodeHelper","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","NodeHelper","attachToExistingNode","idOrFilter","options","mods","find","mod","modName","address","isAddressModuleFilter","exists","isNameModuleFilter","name","attachUsingAddress","attached","existingModule","registeredModules","includes","assertEx","module","registeredModuleMap","addParent","args","emit","add","isNodeModule","attachedListener","__name","detachedListener","on","attachedPublicModules","detachUsingAddress","downResolver","remove","startHandler","__publicField","configSchemas","__superGet","_ViewNode","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 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 module = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered modules`)\n\n module.addParent(this)\n\n const args = { module, name: module.modName }\n await this.emit('moduleAttached', args)\n\n this._limitedResolver.add(module)\n\n if (isNodeModule(module)) {\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 module.on('moduleAttached', attachedListener)\n module.on('moduleDetached', detachedListener)\n }\n\n return address\n }\n\n protected override async attachedPublicModules(): Promise<ModuleInstance[]> {\n return (await this._limitedResolver.resolve('*')).filter((module) => module.address !== this.address)\n }\n\n protected override async detachUsingAddress(address: Address) {\n const module = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)\n this._limitedResolver.remove(module.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","module","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.1",
|
|
14
14
|
"@xylabs/exists": "^3.5.1",
|
|
15
15
|
"@xylabs/hex": "^3.5.1",
|
|
16
|
-
"@xyo-network/module-events": "~2.107.
|
|
17
|
-
"@xyo-network/module-model": "~2.107.
|
|
18
|
-
"@xyo-network/module-resolver": "~2.107.
|
|
19
|
-
"@xyo-network/node-memory": "~2.107.
|
|
20
|
-
"@xyo-network/node-model": "~2.107.
|
|
21
|
-
"@xyo-network/payload-model": "~2.107.
|
|
16
|
+
"@xyo-network/module-events": "~2.107.4",
|
|
17
|
+
"@xyo-network/module-model": "~2.107.4",
|
|
18
|
+
"@xyo-network/module-resolver": "~2.107.4",
|
|
19
|
+
"@xyo-network/node-memory": "~2.107.4",
|
|
20
|
+
"@xyo-network/node-model": "~2.107.4",
|
|
21
|
+
"@xyo-network/payload-model": "~2.107.4",
|
|
22
22
|
"async-mutex": "^0.5.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@xylabs/ts-scripts-yarn3": "^3.11.
|
|
26
|
-
"@xylabs/tsconfig": "^3.11.
|
|
25
|
+
"@xylabs/ts-scripts-yarn3": "^3.11.10",
|
|
26
|
+
"@xylabs/tsconfig": "^3.11.10",
|
|
27
27
|
"typescript": "^5.5.2"
|
|
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.107.
|
|
68
|
+
"version": "2.107.4",
|
|
69
69
|
"type": "module"
|
|
70
70
|
}
|
package/src/ViewNode.ts
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
ModuleLimitationViewLabel,
|
|
14
14
|
} from '@xyo-network/module-model'
|
|
15
15
|
import { SimpleModuleResolver } from '@xyo-network/module-resolver'
|
|
16
|
-
import { MemoryNode,
|
|
16
|
+
import { MemoryNode, MemoryNodeHelper } from '@xyo-network/node-memory'
|
|
17
17
|
import {
|
|
18
18
|
asNodeInstance,
|
|
19
19
|
AttachableNodeInstance,
|
|
@@ -73,7 +73,7 @@ export class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventDat
|
|
|
73
73
|
if (source) {
|
|
74
74
|
await Promise.all(
|
|
75
75
|
this.ids.map(async (id) => {
|
|
76
|
-
await
|
|
76
|
+
await MemoryNodeHelper.attachToExistingNode(source, id, this)
|
|
77
77
|
}),
|
|
78
78
|
)
|
|
79
79
|
this._built = true
|
|
@@ -118,11 +118,7 @@ export class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventDat
|
|
|
118
118
|
const mods = this.registeredModules().filter((mod) => attached.includes(mod.address))
|
|
119
119
|
const existingModule = mods.find((mod) => mod.address === address)
|
|
120
120
|
assertEx(!existingModule, () => `Module [${existingModule?.modName ?? existingModule?.address}] already attached at address [${address}]`)
|
|
121
|
-
const module = this.registeredModuleMap[address]
|
|
122
|
-
|
|
123
|
-
if (!module) {
|
|
124
|
-
return
|
|
125
|
-
}
|
|
121
|
+
const module = assertEx(this.registeredModuleMap[address], () => `Module [${address}] not found in registered modules`)
|
|
126
122
|
|
|
127
123
|
module.addParent(this)
|
|
128
124
|
|
|
@@ -150,11 +146,9 @@ export class ViewNode<TParams extends ViewNodeParams = ViewNodeParams, TEventDat
|
|
|
150
146
|
}
|
|
151
147
|
|
|
152
148
|
protected override async detachUsingAddress(address: Address) {
|
|
153
|
-
const module = await this.downResolver.resolve(address)
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return address
|
|
157
|
-
}
|
|
149
|
+
const module = assertEx(await this.downResolver.resolve(address), () => `Module [${address}] not found in down resolver`)
|
|
150
|
+
this._limitedResolver.remove(module.address)
|
|
151
|
+
return address
|
|
158
152
|
}
|
|
159
153
|
|
|
160
154
|
protected override async startHandler(): Promise<boolean> {
|