@xyo-network/node-abstract 2.72.9 → 2.73.1
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/docs.json +3789 -3413
- package/dist/{types/AbstractNode.d.ts → index.d.mts} +6 -4
- package/dist/index.d.ts +36 -0
- package/dist/index.js +246 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +221 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +39 -26
- package/tsup.config.ts +16 -0
- package/dist/cjs/AbstractNode.js +0 -218
- package/dist/cjs/AbstractNode.js.map +0 -1
- package/dist/cjs/index.js +0 -5
- package/dist/cjs/index.js.map +0 -1
- package/dist/esm/AbstractNode.js +0 -173
- package/dist/esm/AbstractNode.js.map +0 -1
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +0 -1
- package/dist/types/AbstractNode.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +0 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { QueryBoundWitness } from '@xyo-network/boundwitness-builder';
|
|
2
2
|
import { NodeManifestPayload } from '@xyo-network/manifest-model';
|
|
3
3
|
import { AbstractModuleInstance } from '@xyo-network/module-abstract';
|
|
4
|
-
import { Module,
|
|
4
|
+
import { Module, ModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model';
|
|
5
5
|
import { CompositeModuleResolver } from '@xyo-network/module-resolver';
|
|
6
|
-
import {
|
|
6
|
+
import { NodeModuleParams, NodeModuleEventData, NodeModule, NodeQueryBase } from '@xyo-network/node-model';
|
|
7
7
|
import { Payload } from '@xyo-network/payload-model';
|
|
8
8
|
import { Promisable } from '@xyo-network/promise';
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
declare abstract class AbstractNode<TParams extends NodeModuleParams = NodeModuleParams, TEventData extends NodeModuleEventData = NodeModuleEventData> extends AbstractModuleInstance<TParams, TEventData> implements NodeModule<TParams, TEventData>, Module<TParams, TEventData> {
|
|
10
11
|
static readonly configSchemas: string[];
|
|
11
12
|
protected readonly privateResolver: CompositeModuleResolver;
|
|
12
13
|
private readonly isNode;
|
|
@@ -31,4 +32,5 @@ export declare abstract class AbstractNode<TParams extends NodeModuleParams = No
|
|
|
31
32
|
abstract attach(nameOrAddress: string, external?: boolean): Promisable<string | undefined>;
|
|
32
33
|
abstract detach(nameOrAddress: string): Promisable<string | undefined>;
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
|
|
36
|
+
export { AbstractNode };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { QueryBoundWitness } from '@xyo-network/boundwitness-builder';
|
|
2
|
+
import { NodeManifestPayload } from '@xyo-network/manifest-model';
|
|
3
|
+
import { AbstractModuleInstance } from '@xyo-network/module-abstract';
|
|
4
|
+
import { Module, ModuleInstance, ModuleFilter, ModuleFilterOptions, ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model';
|
|
5
|
+
import { CompositeModuleResolver } from '@xyo-network/module-resolver';
|
|
6
|
+
import { NodeModuleParams, NodeModuleEventData, NodeModule, NodeQueryBase } from '@xyo-network/node-model';
|
|
7
|
+
import { Payload } from '@xyo-network/payload-model';
|
|
8
|
+
import { Promisable } from '@xyo-network/promise';
|
|
9
|
+
|
|
10
|
+
declare abstract class AbstractNode<TParams extends NodeModuleParams = NodeModuleParams, TEventData extends NodeModuleEventData = NodeModuleEventData> extends AbstractModuleInstance<TParams, TEventData> implements NodeModule<TParams, TEventData>, Module<TParams, TEventData> {
|
|
11
|
+
static readonly configSchemas: string[];
|
|
12
|
+
protected readonly privateResolver: CompositeModuleResolver;
|
|
13
|
+
private readonly isNode;
|
|
14
|
+
get isModuleResolver(): boolean;
|
|
15
|
+
get queries(): string[];
|
|
16
|
+
protected get _queryAccountPaths(): Record<NodeQueryBase['schema'], string>;
|
|
17
|
+
static isNode(module: unknown): boolean;
|
|
18
|
+
attached(): Promise<string[]>;
|
|
19
|
+
attachedModules(): Promise<Module[]>;
|
|
20
|
+
manifest(ignoreAddresses?: string[]): Promise<NodeManifestPayload>;
|
|
21
|
+
register(_module: ModuleInstance): Promisable<void>;
|
|
22
|
+
registered(): Promisable<string[]>;
|
|
23
|
+
registeredModules(): Promisable<Module[]>;
|
|
24
|
+
resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>;
|
|
25
|
+
resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>;
|
|
26
|
+
unregister(_module: ModuleInstance): Promisable<this>;
|
|
27
|
+
protected discoverHandler(): Promise<Payload[]>;
|
|
28
|
+
protected manifestHandler(ignoreAddresses?: string[]): Promise<NodeManifestPayload>;
|
|
29
|
+
protected queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(query: T, payloads?: Payload[], queryConfig?: TConfig): Promise<ModuleQueryHandlerResult>;
|
|
30
|
+
private resolveAll;
|
|
31
|
+
private resolvePrivate;
|
|
32
|
+
abstract attach(nameOrAddress: string, external?: boolean): Promisable<string | undefined>;
|
|
33
|
+
abstract detach(nameOrAddress: string): Promisable<string | undefined>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { AbstractNode };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.ts
|
|
22
|
+
var src_exports = {};
|
|
23
|
+
__export(src_exports, {
|
|
24
|
+
AbstractNode: () => AbstractNode
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(src_exports);
|
|
27
|
+
|
|
28
|
+
// src/AbstractNode.ts
|
|
29
|
+
var import_assert = require("@xylabs/assert");
|
|
30
|
+
var import_address_payload_plugin = require("@xyo-network/address-payload-plugin");
|
|
31
|
+
var import_boundwitness_builder = require("@xyo-network/boundwitness-builder");
|
|
32
|
+
var import_manifest_model = require("@xyo-network/manifest-model");
|
|
33
|
+
var import_module_abstract = require("@xyo-network/module-abstract");
|
|
34
|
+
var import_module_model = require("@xyo-network/module-model");
|
|
35
|
+
var import_module_resolver = require("@xyo-network/module-resolver");
|
|
36
|
+
var import_node_model = require("@xyo-network/node-model");
|
|
37
|
+
var import_payload_builder = require("@xyo-network/payload-builder");
|
|
38
|
+
var AbstractNode = class extends import_module_abstract.AbstractModuleInstance {
|
|
39
|
+
static {
|
|
40
|
+
__name(this, "AbstractNode");
|
|
41
|
+
}
|
|
42
|
+
static configSchemas = [
|
|
43
|
+
import_node_model.NodeConfigSchema
|
|
44
|
+
];
|
|
45
|
+
privateResolver = new import_module_resolver.CompositeModuleResolver();
|
|
46
|
+
isNode = true;
|
|
47
|
+
get isModuleResolver() {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
get queries() {
|
|
51
|
+
return [
|
|
52
|
+
import_node_model.NodeAttachQuerySchema,
|
|
53
|
+
import_node_model.NodeDetachQuerySchema,
|
|
54
|
+
import_node_model.NodeAttachedQuerySchema,
|
|
55
|
+
import_node_model.NodeRegisteredQuerySchema,
|
|
56
|
+
...super.queries
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
get _queryAccountPaths() {
|
|
60
|
+
return {
|
|
61
|
+
"network.xyo.query.node.attach": "1/1",
|
|
62
|
+
"network.xyo.query.node.attached": "1/2",
|
|
63
|
+
"network.xyo.query.node.detach": "1/3",
|
|
64
|
+
"network.xyo.query.node.registered": "1/4"
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
static isNode(module2) {
|
|
68
|
+
return module2.isNode;
|
|
69
|
+
}
|
|
70
|
+
async attached() {
|
|
71
|
+
return (await this.attachedModules()).map((module2) => module2.address);
|
|
72
|
+
}
|
|
73
|
+
async attachedModules() {
|
|
74
|
+
return (await (this.resolve(void 0, {
|
|
75
|
+
direction: "down",
|
|
76
|
+
maxDepth: 2
|
|
77
|
+
}) ?? [])).filter((module2) => module2.address !== this.address);
|
|
78
|
+
}
|
|
79
|
+
async manifest(ignoreAddresses) {
|
|
80
|
+
return await this.manifestHandler(ignoreAddresses);
|
|
81
|
+
}
|
|
82
|
+
register(_module) {
|
|
83
|
+
throw new Error("Method not implemented.");
|
|
84
|
+
}
|
|
85
|
+
registered() {
|
|
86
|
+
throw new Error("Method not implemented.");
|
|
87
|
+
}
|
|
88
|
+
registeredModules() {
|
|
89
|
+
throw new Error("Method not implemented.");
|
|
90
|
+
}
|
|
91
|
+
async resolve(nameOrAddressOrFilter, options) {
|
|
92
|
+
if (typeof nameOrAddressOrFilter === "string") {
|
|
93
|
+
switch (options?.visibility) {
|
|
94
|
+
case "private": {
|
|
95
|
+
return await this.resolvePrivate(nameOrAddressOrFilter);
|
|
96
|
+
}
|
|
97
|
+
case "all": {
|
|
98
|
+
return await this.resolveAll(nameOrAddressOrFilter);
|
|
99
|
+
}
|
|
100
|
+
default: {
|
|
101
|
+
return await super.resolve(nameOrAddressOrFilter, options);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
switch (options?.visibility) {
|
|
106
|
+
case "all": {
|
|
107
|
+
return await this.resolveAll(nameOrAddressOrFilter);
|
|
108
|
+
}
|
|
109
|
+
case "private": {
|
|
110
|
+
return await this.resolvePrivate(nameOrAddressOrFilter);
|
|
111
|
+
}
|
|
112
|
+
default: {
|
|
113
|
+
return await super.resolve(nameOrAddressOrFilter, options);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
unregister(_module) {
|
|
119
|
+
throw new Error("Method not implemented.");
|
|
120
|
+
}
|
|
121
|
+
async discoverHandler() {
|
|
122
|
+
const childMods = await this.attachedModules();
|
|
123
|
+
const childModAddresses = childMods.map((mod) => new import_payload_builder.PayloadBuilder({
|
|
124
|
+
schema: import_address_payload_plugin.AddressSchema
|
|
125
|
+
}).fields({
|
|
126
|
+
address: mod.address,
|
|
127
|
+
name: mod.config.name
|
|
128
|
+
}).build());
|
|
129
|
+
return [
|
|
130
|
+
...await super.discoverHandler(),
|
|
131
|
+
...childModAddresses
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
async manifestHandler(ignoreAddresses = []) {
|
|
135
|
+
const manifest = {
|
|
136
|
+
...await super.manifestHandler(),
|
|
137
|
+
schema: import_manifest_model.NodeManifestPayloadSchema
|
|
138
|
+
};
|
|
139
|
+
const newIgnoreAddresses = [
|
|
140
|
+
...ignoreAddresses,
|
|
141
|
+
this.address
|
|
142
|
+
];
|
|
143
|
+
const notThisModule = /* @__PURE__ */ __name((module2) => module2.address !== this.address && !ignoreAddresses.includes(module2.address), "notThisModule");
|
|
144
|
+
const toManifest = /* @__PURE__ */ __name((module2) => module2.manifest(newIgnoreAddresses), "toManifest");
|
|
145
|
+
const privateModules = await Promise.all((await this.privateResolver.resolve()).filter(notThisModule).map(toManifest));
|
|
146
|
+
if (privateModules.length > 0) {
|
|
147
|
+
manifest.modules = manifest.modules ?? {};
|
|
148
|
+
manifest.modules.private = privateModules;
|
|
149
|
+
}
|
|
150
|
+
const publicModules = await Promise.all((await this.resolve()).filter(notThisModule).map(toManifest));
|
|
151
|
+
if (publicModules.length > 0) {
|
|
152
|
+
manifest.modules = manifest.modules ?? {};
|
|
153
|
+
manifest.modules.public = publicModules;
|
|
154
|
+
}
|
|
155
|
+
return manifest;
|
|
156
|
+
}
|
|
157
|
+
async queryHandler(query, payloads, queryConfig) {
|
|
158
|
+
const wrapper = import_boundwitness_builder.QueryBoundWitnessWrapper.parseQuery(query, payloads);
|
|
159
|
+
const queryPayload = await wrapper.getQuery();
|
|
160
|
+
(0, import_assert.assertEx)(this.queryable(query, payloads, queryConfig));
|
|
161
|
+
const resultPayloads = [];
|
|
162
|
+
switch (queryPayload.schema) {
|
|
163
|
+
case import_node_model.NodeAttachQuerySchema: {
|
|
164
|
+
const address = await this.attach(queryPayload.nameOrAddress, queryPayload.external);
|
|
165
|
+
if (address) {
|
|
166
|
+
const payload = new import_payload_builder.PayloadBuilder({
|
|
167
|
+
schema: import_address_payload_plugin.AddressSchema
|
|
168
|
+
}).fields({
|
|
169
|
+
address
|
|
170
|
+
}).build();
|
|
171
|
+
resultPayloads.push(payload);
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case import_node_model.NodeDetachQuerySchema: {
|
|
176
|
+
const address = await this.detach(queryPayload.nameOrAddress);
|
|
177
|
+
if (address) {
|
|
178
|
+
const payload = new import_payload_builder.PayloadBuilder({
|
|
179
|
+
schema: import_address_payload_plugin.AddressSchema
|
|
180
|
+
}).fields({
|
|
181
|
+
address
|
|
182
|
+
}).build();
|
|
183
|
+
resultPayloads.push(payload);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case import_node_model.NodeAttachedQuerySchema: {
|
|
188
|
+
const addresses = await this.attached();
|
|
189
|
+
for (const address of addresses) {
|
|
190
|
+
const payload = new import_payload_builder.PayloadBuilder({
|
|
191
|
+
schema: import_address_payload_plugin.AddressSchema
|
|
192
|
+
}).fields({
|
|
193
|
+
address
|
|
194
|
+
}).build();
|
|
195
|
+
resultPayloads.push(payload);
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case import_node_model.NodeRegisteredQuerySchema: {
|
|
200
|
+
const addresses = await this.registered();
|
|
201
|
+
for (const address of addresses) {
|
|
202
|
+
const payload = new import_payload_builder.PayloadBuilder({
|
|
203
|
+
schema: import_address_payload_plugin.AddressSchema
|
|
204
|
+
}).fields({
|
|
205
|
+
address
|
|
206
|
+
}).build();
|
|
207
|
+
resultPayloads.push(payload);
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
default:
|
|
212
|
+
return await super.queryHandler(query, payloads);
|
|
213
|
+
}
|
|
214
|
+
return resultPayloads;
|
|
215
|
+
}
|
|
216
|
+
async resolveAll(nameOrAddressOrFilter, options) {
|
|
217
|
+
switch (typeof nameOrAddressOrFilter) {
|
|
218
|
+
case "string": {
|
|
219
|
+
return await this.resolvePrivate(nameOrAddressOrFilter, options) ?? await super.resolve(nameOrAddressOrFilter, options);
|
|
220
|
+
}
|
|
221
|
+
default: {
|
|
222
|
+
return [
|
|
223
|
+
...await this.resolvePrivate(nameOrAddressOrFilter, options),
|
|
224
|
+
...await super.resolve(nameOrAddressOrFilter, options)
|
|
225
|
+
].filter(import_module_model.duplicateModules);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
async resolvePrivate(nameOrAddressOrFilter, options) {
|
|
230
|
+
const direction = options?.direction ?? "all";
|
|
231
|
+
const down = direction === "down" || direction === "all";
|
|
232
|
+
switch (typeof nameOrAddressOrFilter) {
|
|
233
|
+
case "string": {
|
|
234
|
+
return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : void 0;
|
|
235
|
+
}
|
|
236
|
+
default: {
|
|
237
|
+
return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : void 0;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
243
|
+
0 && (module.exports = {
|
|
244
|
+
AbstractNode
|
|
245
|
+
});
|
|
246
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/AbstractNode.ts"],"sourcesContent":["export * from './AbstractNode'\n","import { assertEx } from '@xylabs/assert'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { QueryBoundWitness, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport {\n duplicateModules,\n Module,\n ModuleConfig,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleQueryHandlerResult,\n} from '@xyo-network/module-model'\nimport { CompositeModuleResolver } from '@xyo-network/module-resolver'\nimport {\n NodeAttachedQuerySchema,\n NodeAttachQuerySchema,\n NodeConfigSchema,\n NodeDetachQuerySchema,\n NodeModule,\n NodeModuleEventData,\n NodeModuleParams,\n NodeQuery,\n NodeQueryBase,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Promisable } from '@xyo-network/promise'\n\nexport abstract class AbstractNode<TParams extends NodeModuleParams = NodeModuleParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends AbstractModuleInstance<TParams, TEventData>\n implements NodeModule<TParams, TEventData>, Module<TParams, TEventData>\n{\n static override readonly configSchemas: string[] = [NodeConfigSchema]\n\n protected readonly privateResolver = new CompositeModuleResolver()\n\n private readonly isNode = true\n\n get isModuleResolver(): boolean {\n return true\n }\n\n override get queries(): string[] {\n return [NodeAttachQuerySchema, NodeDetachQuerySchema, NodeAttachedQuerySchema, NodeRegisteredQuerySchema, ...super.queries]\n }\n\n protected override get _queryAccountPaths(): Record<NodeQueryBase['schema'], string> {\n return {\n 'network.xyo.query.node.attach': '1/1',\n 'network.xyo.query.node.attached': '1/2',\n 'network.xyo.query.node.detach': '1/3',\n 'network.xyo.query.node.registered': '1/4',\n }\n }\n\n static isNode(module: unknown) {\n return (module as AbstractNode).isNode\n }\n\n async attached(): Promise<string[]> {\n return (await this.attachedModules()).map((module) => module.address)\n }\n\n async attachedModules(): Promise<Module[]> {\n // return (await (this.resolve(undefined, { direction: 'down', maxDepth: CompositeModuleResolver.defaultMaxDepth }) ?? [])).filter(\n // (module) => module.address !== this.address,\n // )\n return (await (this.resolve(undefined, { direction: 'down', maxDepth: 2 }) ?? [])).filter((module) => module.address !== this.address)\n }\n\n override async manifest(ignoreAddresses?: string[]): Promise<NodeManifestPayload> {\n return await this.manifestHandler(ignoreAddresses)\n }\n\n register(_module: ModuleInstance): Promisable<void> {\n throw new Error('Method not implemented.')\n }\n\n registered(): Promisable<string[]> {\n throw new Error('Method not implemented.')\n }\n\n registeredModules(): Promisable<Module[]> {\n throw new Error('Method not implemented.')\n }\n\n override async resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n override async resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n override async resolve(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n //checking type of nameOrAddressOrFilter before calling other functions since TS seems\n //to need help here narrowing before the call\n if (typeof nameOrAddressOrFilter === 'string') {\n switch (options?.visibility) {\n case 'private': {\n return await this.resolvePrivate(nameOrAddressOrFilter)\n }\n case 'all': {\n return await this.resolveAll(nameOrAddressOrFilter)\n }\n default: {\n return await super.resolve(nameOrAddressOrFilter, options)\n }\n }\n } else {\n switch (options?.visibility) {\n case 'all': {\n return await this.resolveAll(nameOrAddressOrFilter)\n }\n case 'private': {\n return await this.resolvePrivate(nameOrAddressOrFilter)\n }\n default: {\n return await super.resolve(nameOrAddressOrFilter, options)\n }\n }\n }\n }\n\n unregister(_module: ModuleInstance): Promisable<this> {\n throw new Error('Method not implemented.')\n }\n\n protected override async discoverHandler(): Promise<Payload[]> {\n const childMods = await this.attachedModules()\n const childModAddresses = childMods.map((mod) =>\n new PayloadBuilder<AddressPayload>({ schema: AddressSchema }).fields({ address: mod.address, name: mod.config.name }).build(),\n )\n\n return [...(await super.discoverHandler()), ...childModAddresses]\n }\n\n protected override async manifestHandler(ignoreAddresses: string[] = []): Promise<NodeManifestPayload> {\n const manifest: NodeManifestPayload = { ...(await super.manifestHandler()), schema: NodeManifestPayloadSchema }\n const newIgnoreAddresses = [...ignoreAddresses, this.address]\n\n const notThisModule = (module: ModuleInstance) => module.address !== this.address && !ignoreAddresses.includes(module.address)\n const toManifest = (module: ModuleInstance) => module.manifest(newIgnoreAddresses)\n\n const privateModules = await Promise.all((await this.privateResolver.resolve()).filter(notThisModule).map(toManifest))\n if (privateModules.length > 0) {\n manifest.modules = manifest.modules ?? {}\n manifest.modules.private = privateModules\n }\n\n const publicModules = await Promise.all((await this.resolve()).filter(notThisModule).map(toManifest))\n if (publicModules.length > 0) {\n manifest.modules = manifest.modules ?? {}\n manifest.modules.public = publicModules\n }\n\n return manifest\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = QueryBoundWitnessWrapper.parseQuery<NodeQuery>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case NodeAttachQuerySchema: {\n const address = await this.attach(queryPayload.nameOrAddress, queryPayload.external)\n if (address) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeDetachQuerySchema: {\n const address = await this.detach(queryPayload.nameOrAddress)\n if (address) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeAttachedQuerySchema: {\n const addresses = await this.attached()\n for (const address of addresses) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeRegisteredQuerySchema: {\n const addresses = await this.registered()\n for (const address of addresses) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n default:\n return await super.queryHandler(query, payloads)\n }\n return resultPayloads\n }\n\n private async resolveAll(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n private async resolveAll(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n private async resolveAll(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n switch (typeof nameOrAddressOrFilter) {\n case 'string': {\n return (await this.resolvePrivate(nameOrAddressOrFilter, options)) ?? (await super.resolve(nameOrAddressOrFilter, options))\n }\n default: {\n return [...(await this.resolvePrivate(nameOrAddressOrFilter, options)), ...(await super.resolve(nameOrAddressOrFilter, options))].filter(\n duplicateModules,\n )\n }\n }\n }\n\n private async resolvePrivate(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n private async resolvePrivate(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n private async resolvePrivate(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n const direction = options?.direction ?? 'all'\n const down = direction === 'down' || direction === 'all'\n switch (typeof nameOrAddressOrFilter) {\n case 'string': {\n return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : undefined\n }\n default: {\n return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : undefined\n }\n }\n }\n\n abstract attach(nameOrAddress: string, external?: boolean): Promisable<string | undefined>\n abstract detach(nameOrAddress: string): Promisable<string | undefined>\n}\n"],"mappings":"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","names":["AbstractNode","AbstractModuleInstance","configSchemas","NodeConfigSchema","privateResolver","CompositeModuleResolver","isNode","isModuleResolver","queries","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeAttachedQuerySchema","NodeRegisteredQuerySchema","_queryAccountPaths","module","attached","attachedModules","map","address","resolve","undefined","direction","maxDepth","filter","manifest","ignoreAddresses","manifestHandler","register","_module","Error","registered","registeredModules","nameOrAddressOrFilter","options","visibility","resolvePrivate","resolveAll","unregister","discoverHandler","childMods","childModAddresses","mod","PayloadBuilder","schema","AddressSchema","fields","name","config","build","NodeManifestPayloadSchema","newIgnoreAddresses","notThisModule","includes","toManifest","privateModules","Promise","all","length","modules","private","publicModules","public","queryHandler","query","payloads","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","assertEx","queryable","resultPayloads","attach","nameOrAddress","external","payload","push","detach","addresses","duplicateModules","down"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/AbstractNode.ts
|
|
5
|
+
import { assertEx } from "@xylabs/assert";
|
|
6
|
+
import { AddressSchema } from "@xyo-network/address-payload-plugin";
|
|
7
|
+
import { QueryBoundWitnessWrapper } from "@xyo-network/boundwitness-builder";
|
|
8
|
+
import { NodeManifestPayloadSchema } from "@xyo-network/manifest-model";
|
|
9
|
+
import { AbstractModuleInstance } from "@xyo-network/module-abstract";
|
|
10
|
+
import { duplicateModules } from "@xyo-network/module-model";
|
|
11
|
+
import { CompositeModuleResolver } from "@xyo-network/module-resolver";
|
|
12
|
+
import { NodeAttachedQuerySchema, NodeAttachQuerySchema, NodeConfigSchema, NodeDetachQuerySchema, NodeRegisteredQuerySchema } from "@xyo-network/node-model";
|
|
13
|
+
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
14
|
+
var AbstractNode = class extends AbstractModuleInstance {
|
|
15
|
+
static {
|
|
16
|
+
__name(this, "AbstractNode");
|
|
17
|
+
}
|
|
18
|
+
static configSchemas = [
|
|
19
|
+
NodeConfigSchema
|
|
20
|
+
];
|
|
21
|
+
privateResolver = new CompositeModuleResolver();
|
|
22
|
+
isNode = true;
|
|
23
|
+
get isModuleResolver() {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
get queries() {
|
|
27
|
+
return [
|
|
28
|
+
NodeAttachQuerySchema,
|
|
29
|
+
NodeDetachQuerySchema,
|
|
30
|
+
NodeAttachedQuerySchema,
|
|
31
|
+
NodeRegisteredQuerySchema,
|
|
32
|
+
...super.queries
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
get _queryAccountPaths() {
|
|
36
|
+
return {
|
|
37
|
+
"network.xyo.query.node.attach": "1/1",
|
|
38
|
+
"network.xyo.query.node.attached": "1/2",
|
|
39
|
+
"network.xyo.query.node.detach": "1/3",
|
|
40
|
+
"network.xyo.query.node.registered": "1/4"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
static isNode(module) {
|
|
44
|
+
return module.isNode;
|
|
45
|
+
}
|
|
46
|
+
async attached() {
|
|
47
|
+
return (await this.attachedModules()).map((module) => module.address);
|
|
48
|
+
}
|
|
49
|
+
async attachedModules() {
|
|
50
|
+
return (await (this.resolve(void 0, {
|
|
51
|
+
direction: "down",
|
|
52
|
+
maxDepth: 2
|
|
53
|
+
}) ?? [])).filter((module) => module.address !== this.address);
|
|
54
|
+
}
|
|
55
|
+
async manifest(ignoreAddresses) {
|
|
56
|
+
return await this.manifestHandler(ignoreAddresses);
|
|
57
|
+
}
|
|
58
|
+
register(_module) {
|
|
59
|
+
throw new Error("Method not implemented.");
|
|
60
|
+
}
|
|
61
|
+
registered() {
|
|
62
|
+
throw new Error("Method not implemented.");
|
|
63
|
+
}
|
|
64
|
+
registeredModules() {
|
|
65
|
+
throw new Error("Method not implemented.");
|
|
66
|
+
}
|
|
67
|
+
async resolve(nameOrAddressOrFilter, options) {
|
|
68
|
+
if (typeof nameOrAddressOrFilter === "string") {
|
|
69
|
+
switch (options?.visibility) {
|
|
70
|
+
case "private": {
|
|
71
|
+
return await this.resolvePrivate(nameOrAddressOrFilter);
|
|
72
|
+
}
|
|
73
|
+
case "all": {
|
|
74
|
+
return await this.resolveAll(nameOrAddressOrFilter);
|
|
75
|
+
}
|
|
76
|
+
default: {
|
|
77
|
+
return await super.resolve(nameOrAddressOrFilter, options);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
switch (options?.visibility) {
|
|
82
|
+
case "all": {
|
|
83
|
+
return await this.resolveAll(nameOrAddressOrFilter);
|
|
84
|
+
}
|
|
85
|
+
case "private": {
|
|
86
|
+
return await this.resolvePrivate(nameOrAddressOrFilter);
|
|
87
|
+
}
|
|
88
|
+
default: {
|
|
89
|
+
return await super.resolve(nameOrAddressOrFilter, options);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
unregister(_module) {
|
|
95
|
+
throw new Error("Method not implemented.");
|
|
96
|
+
}
|
|
97
|
+
async discoverHandler() {
|
|
98
|
+
const childMods = await this.attachedModules();
|
|
99
|
+
const childModAddresses = childMods.map((mod) => new PayloadBuilder({
|
|
100
|
+
schema: AddressSchema
|
|
101
|
+
}).fields({
|
|
102
|
+
address: mod.address,
|
|
103
|
+
name: mod.config.name
|
|
104
|
+
}).build());
|
|
105
|
+
return [
|
|
106
|
+
...await super.discoverHandler(),
|
|
107
|
+
...childModAddresses
|
|
108
|
+
];
|
|
109
|
+
}
|
|
110
|
+
async manifestHandler(ignoreAddresses = []) {
|
|
111
|
+
const manifest = {
|
|
112
|
+
...await super.manifestHandler(),
|
|
113
|
+
schema: NodeManifestPayloadSchema
|
|
114
|
+
};
|
|
115
|
+
const newIgnoreAddresses = [
|
|
116
|
+
...ignoreAddresses,
|
|
117
|
+
this.address
|
|
118
|
+
];
|
|
119
|
+
const notThisModule = /* @__PURE__ */ __name((module) => module.address !== this.address && !ignoreAddresses.includes(module.address), "notThisModule");
|
|
120
|
+
const toManifest = /* @__PURE__ */ __name((module) => module.manifest(newIgnoreAddresses), "toManifest");
|
|
121
|
+
const privateModules = await Promise.all((await this.privateResolver.resolve()).filter(notThisModule).map(toManifest));
|
|
122
|
+
if (privateModules.length > 0) {
|
|
123
|
+
manifest.modules = manifest.modules ?? {};
|
|
124
|
+
manifest.modules.private = privateModules;
|
|
125
|
+
}
|
|
126
|
+
const publicModules = await Promise.all((await this.resolve()).filter(notThisModule).map(toManifest));
|
|
127
|
+
if (publicModules.length > 0) {
|
|
128
|
+
manifest.modules = manifest.modules ?? {};
|
|
129
|
+
manifest.modules.public = publicModules;
|
|
130
|
+
}
|
|
131
|
+
return manifest;
|
|
132
|
+
}
|
|
133
|
+
async queryHandler(query, payloads, queryConfig) {
|
|
134
|
+
const wrapper = QueryBoundWitnessWrapper.parseQuery(query, payloads);
|
|
135
|
+
const queryPayload = await wrapper.getQuery();
|
|
136
|
+
assertEx(this.queryable(query, payloads, queryConfig));
|
|
137
|
+
const resultPayloads = [];
|
|
138
|
+
switch (queryPayload.schema) {
|
|
139
|
+
case NodeAttachQuerySchema: {
|
|
140
|
+
const address = await this.attach(queryPayload.nameOrAddress, queryPayload.external);
|
|
141
|
+
if (address) {
|
|
142
|
+
const payload = new PayloadBuilder({
|
|
143
|
+
schema: AddressSchema
|
|
144
|
+
}).fields({
|
|
145
|
+
address
|
|
146
|
+
}).build();
|
|
147
|
+
resultPayloads.push(payload);
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case NodeDetachQuerySchema: {
|
|
152
|
+
const address = await this.detach(queryPayload.nameOrAddress);
|
|
153
|
+
if (address) {
|
|
154
|
+
const payload = new PayloadBuilder({
|
|
155
|
+
schema: AddressSchema
|
|
156
|
+
}).fields({
|
|
157
|
+
address
|
|
158
|
+
}).build();
|
|
159
|
+
resultPayloads.push(payload);
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case NodeAttachedQuerySchema: {
|
|
164
|
+
const addresses = await this.attached();
|
|
165
|
+
for (const address of addresses) {
|
|
166
|
+
const payload = new PayloadBuilder({
|
|
167
|
+
schema: AddressSchema
|
|
168
|
+
}).fields({
|
|
169
|
+
address
|
|
170
|
+
}).build();
|
|
171
|
+
resultPayloads.push(payload);
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case NodeRegisteredQuerySchema: {
|
|
176
|
+
const addresses = await this.registered();
|
|
177
|
+
for (const address of addresses) {
|
|
178
|
+
const payload = new PayloadBuilder({
|
|
179
|
+
schema: AddressSchema
|
|
180
|
+
}).fields({
|
|
181
|
+
address
|
|
182
|
+
}).build();
|
|
183
|
+
resultPayloads.push(payload);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
default:
|
|
188
|
+
return await super.queryHandler(query, payloads);
|
|
189
|
+
}
|
|
190
|
+
return resultPayloads;
|
|
191
|
+
}
|
|
192
|
+
async resolveAll(nameOrAddressOrFilter, options) {
|
|
193
|
+
switch (typeof nameOrAddressOrFilter) {
|
|
194
|
+
case "string": {
|
|
195
|
+
return await this.resolvePrivate(nameOrAddressOrFilter, options) ?? await super.resolve(nameOrAddressOrFilter, options);
|
|
196
|
+
}
|
|
197
|
+
default: {
|
|
198
|
+
return [
|
|
199
|
+
...await this.resolvePrivate(nameOrAddressOrFilter, options),
|
|
200
|
+
...await super.resolve(nameOrAddressOrFilter, options)
|
|
201
|
+
].filter(duplicateModules);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
async resolvePrivate(nameOrAddressOrFilter, options) {
|
|
206
|
+
const direction = options?.direction ?? "all";
|
|
207
|
+
const down = direction === "down" || direction === "all";
|
|
208
|
+
switch (typeof nameOrAddressOrFilter) {
|
|
209
|
+
case "string": {
|
|
210
|
+
return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : void 0;
|
|
211
|
+
}
|
|
212
|
+
default: {
|
|
213
|
+
return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : void 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
export {
|
|
219
|
+
AbstractNode
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/AbstractNode.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { AddressPayload, AddressSchema } from '@xyo-network/address-payload-plugin'\nimport { QueryBoundWitness, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { NodeManifestPayload, NodeManifestPayloadSchema } from '@xyo-network/manifest-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport {\n duplicateModules,\n Module,\n ModuleConfig,\n ModuleFilter,\n ModuleFilterOptions,\n ModuleInstance,\n ModuleQueryHandlerResult,\n} from '@xyo-network/module-model'\nimport { CompositeModuleResolver } from '@xyo-network/module-resolver'\nimport {\n NodeAttachedQuerySchema,\n NodeAttachQuerySchema,\n NodeConfigSchema,\n NodeDetachQuerySchema,\n NodeModule,\n NodeModuleEventData,\n NodeModuleParams,\n NodeQuery,\n NodeQueryBase,\n NodeRegisteredQuerySchema,\n} from '@xyo-network/node-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Promisable } from '@xyo-network/promise'\n\nexport abstract class AbstractNode<TParams extends NodeModuleParams = NodeModuleParams, TEventData extends NodeModuleEventData = NodeModuleEventData>\n extends AbstractModuleInstance<TParams, TEventData>\n implements NodeModule<TParams, TEventData>, Module<TParams, TEventData>\n{\n static override readonly configSchemas: string[] = [NodeConfigSchema]\n\n protected readonly privateResolver = new CompositeModuleResolver()\n\n private readonly isNode = true\n\n get isModuleResolver(): boolean {\n return true\n }\n\n override get queries(): string[] {\n return [NodeAttachQuerySchema, NodeDetachQuerySchema, NodeAttachedQuerySchema, NodeRegisteredQuerySchema, ...super.queries]\n }\n\n protected override get _queryAccountPaths(): Record<NodeQueryBase['schema'], string> {\n return {\n 'network.xyo.query.node.attach': '1/1',\n 'network.xyo.query.node.attached': '1/2',\n 'network.xyo.query.node.detach': '1/3',\n 'network.xyo.query.node.registered': '1/4',\n }\n }\n\n static isNode(module: unknown) {\n return (module as AbstractNode).isNode\n }\n\n async attached(): Promise<string[]> {\n return (await this.attachedModules()).map((module) => module.address)\n }\n\n async attachedModules(): Promise<Module[]> {\n // return (await (this.resolve(undefined, { direction: 'down', maxDepth: CompositeModuleResolver.defaultMaxDepth }) ?? [])).filter(\n // (module) => module.address !== this.address,\n // )\n return (await (this.resolve(undefined, { direction: 'down', maxDepth: 2 }) ?? [])).filter((module) => module.address !== this.address)\n }\n\n override async manifest(ignoreAddresses?: string[]): Promise<NodeManifestPayload> {\n return await this.manifestHandler(ignoreAddresses)\n }\n\n register(_module: ModuleInstance): Promisable<void> {\n throw new Error('Method not implemented.')\n }\n\n registered(): Promisable<string[]> {\n throw new Error('Method not implemented.')\n }\n\n registeredModules(): Promisable<Module[]> {\n throw new Error('Method not implemented.')\n }\n\n override async resolve(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n override async resolve(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n override async resolve(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n //checking type of nameOrAddressOrFilter before calling other functions since TS seems\n //to need help here narrowing before the call\n if (typeof nameOrAddressOrFilter === 'string') {\n switch (options?.visibility) {\n case 'private': {\n return await this.resolvePrivate(nameOrAddressOrFilter)\n }\n case 'all': {\n return await this.resolveAll(nameOrAddressOrFilter)\n }\n default: {\n return await super.resolve(nameOrAddressOrFilter, options)\n }\n }\n } else {\n switch (options?.visibility) {\n case 'all': {\n return await this.resolveAll(nameOrAddressOrFilter)\n }\n case 'private': {\n return await this.resolvePrivate(nameOrAddressOrFilter)\n }\n default: {\n return await super.resolve(nameOrAddressOrFilter, options)\n }\n }\n }\n }\n\n unregister(_module: ModuleInstance): Promisable<this> {\n throw new Error('Method not implemented.')\n }\n\n protected override async discoverHandler(): Promise<Payload[]> {\n const childMods = await this.attachedModules()\n const childModAddresses = childMods.map((mod) =>\n new PayloadBuilder<AddressPayload>({ schema: AddressSchema }).fields({ address: mod.address, name: mod.config.name }).build(),\n )\n\n return [...(await super.discoverHandler()), ...childModAddresses]\n }\n\n protected override async manifestHandler(ignoreAddresses: string[] = []): Promise<NodeManifestPayload> {\n const manifest: NodeManifestPayload = { ...(await super.manifestHandler()), schema: NodeManifestPayloadSchema }\n const newIgnoreAddresses = [...ignoreAddresses, this.address]\n\n const notThisModule = (module: ModuleInstance) => module.address !== this.address && !ignoreAddresses.includes(module.address)\n const toManifest = (module: ModuleInstance) => module.manifest(newIgnoreAddresses)\n\n const privateModules = await Promise.all((await this.privateResolver.resolve()).filter(notThisModule).map(toManifest))\n if (privateModules.length > 0) {\n manifest.modules = manifest.modules ?? {}\n manifest.modules.private = privateModules\n }\n\n const publicModules = await Promise.all((await this.resolve()).filter(notThisModule).map(toManifest))\n if (publicModules.length > 0) {\n manifest.modules = manifest.modules ?? {}\n manifest.modules.public = publicModules\n }\n\n return manifest\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = QueryBoundWitnessWrapper.parseQuery<NodeQuery>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case NodeAttachQuerySchema: {\n const address = await this.attach(queryPayload.nameOrAddress, queryPayload.external)\n if (address) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeDetachQuerySchema: {\n const address = await this.detach(queryPayload.nameOrAddress)\n if (address) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeAttachedQuerySchema: {\n const addresses = await this.attached()\n for (const address of addresses) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n case NodeRegisteredQuerySchema: {\n const addresses = await this.registered()\n for (const address of addresses) {\n const payload = new PayloadBuilder({ schema: AddressSchema }).fields({ address }).build()\n resultPayloads.push(payload)\n }\n break\n }\n default:\n return await super.queryHandler(query, payloads)\n }\n return resultPayloads\n }\n\n private async resolveAll(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n private async resolveAll(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n private async resolveAll(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n switch (typeof nameOrAddressOrFilter) {\n case 'string': {\n return (await this.resolvePrivate(nameOrAddressOrFilter, options)) ?? (await super.resolve(nameOrAddressOrFilter, options))\n }\n default: {\n return [...(await this.resolvePrivate(nameOrAddressOrFilter, options)), ...(await super.resolve(nameOrAddressOrFilter, options))].filter(\n duplicateModules,\n )\n }\n }\n }\n\n private async resolvePrivate(filter?: ModuleFilter, options?: ModuleFilterOptions): Promise<ModuleInstance[]>\n private async resolvePrivate(nameOrAddress: string, options?: ModuleFilterOptions): Promise<ModuleInstance | undefined>\n private async resolvePrivate(\n nameOrAddressOrFilter?: ModuleFilter | string,\n options?: ModuleFilterOptions,\n ): Promise<ModuleInstance | ModuleInstance[] | undefined> {\n const direction = options?.direction ?? 'all'\n const down = direction === 'down' || direction === 'all'\n switch (typeof nameOrAddressOrFilter) {\n case 'string': {\n return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : undefined\n }\n default: {\n return down ? await this.privateResolver.resolve(nameOrAddressOrFilter) : undefined\n }\n }\n }\n\n abstract attach(nameOrAddress: string, external?: boolean): Promisable<string | undefined>\n abstract detach(nameOrAddress: string): Promisable<string | undefined>\n}\n"],"mappings":"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","names":["assertEx","AddressSchema","QueryBoundWitnessWrapper","NodeManifestPayloadSchema","AbstractModuleInstance","duplicateModules","CompositeModuleResolver","NodeAttachedQuerySchema","NodeAttachQuerySchema","NodeConfigSchema","NodeDetachQuerySchema","NodeRegisteredQuerySchema","PayloadBuilder","AbstractNode","AbstractModuleInstance","configSchemas","NodeConfigSchema","privateResolver","CompositeModuleResolver","isNode","isModuleResolver","queries","NodeAttachQuerySchema","NodeDetachQuerySchema","NodeAttachedQuerySchema","NodeRegisteredQuerySchema","_queryAccountPaths","module","attached","attachedModules","map","address","resolve","undefined","direction","maxDepth","filter","manifest","ignoreAddresses","manifestHandler","register","_module","Error","registered","registeredModules","nameOrAddressOrFilter","options","visibility","resolvePrivate","resolveAll","unregister","discoverHandler","childMods","childModAddresses","mod","PayloadBuilder","schema","AddressSchema","fields","name","config","build","NodeManifestPayloadSchema","newIgnoreAddresses","notThisModule","includes","toManifest","privateModules","Promise","all","length","modules","private","publicModules","public","queryHandler","query","payloads","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","assertEx","queryable","resultPayloads","attach","nameOrAddress","external","payload","push","detach","addresses","duplicateModules","down"]}
|