@xyo-network/sentinel-abstract 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.
@@ -1,2 +1,162 @@
1
- "use strict";var l=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var p=(i,e)=>l(i,"name",{value:e,configurable:!0});var j=(i,e)=>{for(var t in e)l(i,t,{get:e[t],enumerable:!0})},A=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of S(e))!q.call(i,s)&&s!==t&&l(i,s,{get:()=>e[s],enumerable:!(r=P(e,s))||r.enumerable});return i};var E=i=>A(l({},"__esModule",{value:!0}),i);var Q={};j(Q,{AbstractSentinel:()=>f});module.exports=E(Q);var c=require("@xylabs/assert"),h=require("@xylabs/forget"),y=require("@xylabs/object"),w=require("@xyo-network/boundwitness-builder"),m=require("@xyo-network/boundwitness-model"),g=require("@xyo-network/boundwitness-wrapper"),b=require("@xyo-network/module-abstract"),d=require("@xyo-network/sentinel-model");var f=class i extends b.AbstractModuleInstance{static{p(this,"AbstractSentinel")}static configSchemas=[...super.configSchemas,d.SentinelConfigSchema];static defaultConfigSchema=d.SentinelConfigSchema;static uniqueName=(0,y.globallyUnique)("AbstractSentinel",i,"xyo");history=[];_jobPromise;get jobPromise(){return this._jobPromise=this._jobPromise??this.generateJob(),this._jobPromise}get queries(){return[d.SentinelReportQuerySchema,...super.queries]}get synchronous(){return this.config.synchronous??!1}get throwErrors(){return this.config.throwErrors??!0}async report(e){this._noOverride("report");let t=(async()=>{await this.emit("reportStart",{inPayloads:e,module:this});let r=await this.reportHandler(e),s=(await new w.BoundWitnessBuilder().payloads(r).signer(this.account).build()).flat();return this.config.archiving&&(0,h.forget)(this.storeToArchivists(s)),await this.emitReportEnd(e,s),s})();return this.synchronous?await t:((0,h.forget)(t),[])}async reportQuery(e,t){let r={schema:d.SentinelReportQuerySchema};return await this.sendQueryRaw(r,e,t)}async emitReportEnd(e,t){let r=t?.filter(m.isBoundWitness)??[],s=t?.filter(m.notBoundWitness)??[],u=r.find(n=>n.addresses.includes(this.address));await this.emit("reportEnd",{boundwitness:u,inPayloads:e,module:this,outPayloads:s})}async generateJob(){let e={tasks:[]},t=await Promise.all(this.config.tasks.map(async r=>({input:r.input??!1,module:(0,c.assertEx)(await this.resolve(r.module),()=>`Unable to resolve task module [${r.module}]`)})));for(;t.length>0;){let r=e.tasks.at(-1)??[],u=t.filter(n=>{let o=n.input;if(o===void 0||typeof o=="boolean")return!0;if(typeof o=="string")return r.find(a=>a.module.address===o||a.module.modName===o);if(Array.isArray(o))return r.find(a=>o.includes(a.module.address)||o.includes(a.module.modName??a.module.address))}).filter(n=>{let o=n.input;return!(Array.isArray(o)&&t.some(a=>o.includes(a.module.address)||o.includes(a.module.modName??a.module.address)))});(0,c.assertEx)(u.length>0,()=>`Unable to generateJob [${t.length}]`),e.tasks.push(u),t=t.filter(n=>!u.includes(n))}return e}async queryHandler(e,t,r){let u=await(await g.QueryBoundWitnessWrapper.parseQuery(e,t)).getQuery();(0,c.assertEx)(await this.queryable(e,t,r));let n=[];switch(u.schema){case d.SentinelReportQuerySchema:{n.push(...await this.report(t));break}default:return super.queryHandler(e,t)}return n}};
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
+ AbstractSentinel: () => AbstractSentinel
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/AbstractSentinel.ts
29
+ var import_assert = require("@xylabs/assert");
30
+ var import_forget = require("@xylabs/forget");
31
+ var import_object = require("@xylabs/object");
32
+ var import_boundwitness_builder = require("@xyo-network/boundwitness-builder");
33
+ var import_boundwitness_model = require("@xyo-network/boundwitness-model");
34
+ var import_boundwitness_wrapper = require("@xyo-network/boundwitness-wrapper");
35
+ var import_module_abstract = require("@xyo-network/module-abstract");
36
+ var import_sentinel_model = require("@xyo-network/sentinel-model");
37
+ var AbstractSentinel = class _AbstractSentinel extends import_module_abstract.AbstractModuleInstance {
38
+ static {
39
+ __name(this, "AbstractSentinel");
40
+ }
41
+ static configSchemas = [
42
+ ...super.configSchemas,
43
+ import_sentinel_model.SentinelConfigSchema
44
+ ];
45
+ static defaultConfigSchema = import_sentinel_model.SentinelConfigSchema;
46
+ static uniqueName = (0, import_object.globallyUnique)("AbstractSentinel", _AbstractSentinel, "xyo");
47
+ history = [];
48
+ _jobPromise;
49
+ get jobPromise() {
50
+ this._jobPromise = this._jobPromise ?? this.generateJob();
51
+ return this._jobPromise;
52
+ }
53
+ get queries() {
54
+ return [
55
+ import_sentinel_model.SentinelReportQuerySchema,
56
+ ...super.queries
57
+ ];
58
+ }
59
+ get synchronous() {
60
+ return this.config.synchronous ?? false;
61
+ }
62
+ get throwErrors() {
63
+ return this.config.throwErrors ?? true;
64
+ }
65
+ async report(inPayloads) {
66
+ this._noOverride("report");
67
+ const reportPromise = (async () => {
68
+ await this.emit("reportStart", {
69
+ inPayloads,
70
+ module: this
71
+ });
72
+ const payloads = await this.reportHandler(inPayloads);
73
+ const result = (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat();
74
+ if (this.config.archiving) {
75
+ (0, import_forget.forget)(this.storeToArchivists(result));
76
+ }
77
+ await this.emitReportEnd(inPayloads, result);
78
+ return result;
79
+ })();
80
+ if (this.synchronous) {
81
+ return await reportPromise;
82
+ } else {
83
+ (0, import_forget.forget)(reportPromise);
84
+ return [];
85
+ }
86
+ }
87
+ async reportQuery(payloads, account) {
88
+ const queryPayload = {
89
+ schema: import_sentinel_model.SentinelReportQuerySchema
90
+ };
91
+ return await this.sendQueryRaw(queryPayload, payloads, account);
92
+ }
93
+ async emitReportEnd(inPayloads, payloads) {
94
+ const boundwitnesses = payloads?.filter(import_boundwitness_model.isBoundWitness) ?? [];
95
+ const outPayloads = payloads?.filter(import_boundwitness_model.notBoundWitness) ?? [];
96
+ const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address));
97
+ await this.emit("reportEnd", {
98
+ boundwitness,
99
+ inPayloads,
100
+ module: this,
101
+ outPayloads
102
+ });
103
+ }
104
+ async generateJob() {
105
+ const job = {
106
+ tasks: []
107
+ };
108
+ let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
109
+ input: task.input ?? false,
110
+ module: (0, import_assert.assertEx)(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
111
+ })));
112
+ while (tasks.length > 0) {
113
+ const previousTasks = job.tasks.at(-1) ?? [];
114
+ const newListCandidates = (
115
+ //add all tasks that either require no previous input or have the previous input module already added
116
+ tasks.filter((task) => {
117
+ const input = task.input;
118
+ if (input === void 0) {
119
+ return true;
120
+ }
121
+ if (typeof input === "boolean") {
122
+ return true;
123
+ }
124
+ if (typeof input === "string") {
125
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
126
+ }
127
+ if (Array.isArray(input)) {
128
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
129
+ }
130
+ })
131
+ );
132
+ const newList = newListCandidates.filter((taskCandidate) => {
133
+ const input = taskCandidate.input;
134
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
135
+ return false;
136
+ }
137
+ return true;
138
+ });
139
+ (0, import_assert.assertEx)(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
140
+ job.tasks.push(newList);
141
+ tasks = tasks.filter((task) => !newList.includes(task));
142
+ }
143
+ return job;
144
+ }
145
+ async queryHandler(query, payloads, queryConfig) {
146
+ const wrapper = await import_boundwitness_wrapper.QueryBoundWitnessWrapper.parseQuery(query, payloads);
147
+ const queryPayload = await wrapper.getQuery();
148
+ (0, import_assert.assertEx)(await this.queryable(query, payloads, queryConfig));
149
+ const resultPayloads = [];
150
+ switch (queryPayload.schema) {
151
+ case import_sentinel_model.SentinelReportQuerySchema: {
152
+ resultPayloads.push(...await this.report(payloads));
153
+ break;
154
+ }
155
+ default: {
156
+ return super.queryHandler(query, payloads);
157
+ }
158
+ }
159
+ return resultPayloads;
160
+ }
161
+ };
2
162
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { globallyUnique } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result))\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\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 = await QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["src_exports","__export","AbstractSentinel","__toCommonJS","import_assert","import_forget","import_object","import_boundwitness_builder","import_boundwitness_model","import_boundwitness_wrapper","import_module_abstract","import_sentinel_model","AbstractSentinel","AbstractModuleInstance","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","signer","account","build","flat","archiving","forget","storeToArchivists","emitReportEnd","reportQuery","queryPayload","schema","sendQueryRaw","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newList","undefined","prevTask","modName","Array","isArray","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { globallyUnique } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result))\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\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 = await QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["AbstractSentinel","AbstractModuleInstance","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","signer","account","build","flat","archiving","forget","storeToArchivists","emitReportEnd","reportQuery","queryPayload","schema","sendQueryRaw","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","modName","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads"]}
@@ -1,2 +1,141 @@
1
- var p=Object.defineProperty;var c=(u,t)=>p(u,"name",{value:t,configurable:!0});import{assertEx as d}from"@xylabs/assert";import{forget as m}from"@xylabs/forget";import{globallyUnique as y}from"@xylabs/object";import{BoundWitnessBuilder as w}from"@xyo-network/boundwitness-builder";import{isBoundWitness as g,notBoundWitness as b}from"@xyo-network/boundwitness-model";import{QueryBoundWitnessWrapper as P}from"@xyo-network/boundwitness-wrapper";import{AbstractModuleInstance as S}from"@xyo-network/module-abstract";import{SentinelConfigSchema as h,SentinelReportQuerySchema as l}from"@xyo-network/sentinel-model";var f=class u extends S{static{c(this,"AbstractSentinel")}static configSchemas=[...super.configSchemas,h];static defaultConfigSchema=h;static uniqueName=y("AbstractSentinel",u,"xyo");history=[];_jobPromise;get jobPromise(){return this._jobPromise=this._jobPromise??this.generateJob(),this._jobPromise}get queries(){return[l,...super.queries]}get synchronous(){return this.config.synchronous??!1}get throwErrors(){return this.config.throwErrors??!0}async report(t){this._noOverride("report");let e=(async()=>{await this.emit("reportStart",{inPayloads:t,module:this});let r=await this.reportHandler(t),n=(await new w().payloads(r).signer(this.account).build()).flat();return this.config.archiving&&m(this.storeToArchivists(n)),await this.emitReportEnd(t,n),n})();return this.synchronous?await e:(m(e),[])}async reportQuery(t,e){let r={schema:l};return await this.sendQueryRaw(r,t,e)}async emitReportEnd(t,e){let r=e?.filter(g)??[],n=e?.filter(b)??[],a=r.find(o=>o.addresses.includes(this.address));await this.emit("reportEnd",{boundwitness:a,inPayloads:t,module:this,outPayloads:n})}async generateJob(){let t={tasks:[]},e=await Promise.all(this.config.tasks.map(async r=>({input:r.input??!1,module:d(await this.resolve(r.module),()=>`Unable to resolve task module [${r.module}]`)})));for(;e.length>0;){let r=t.tasks.at(-1)??[],a=e.filter(o=>{let s=o.input;if(s===void 0||typeof s=="boolean")return!0;if(typeof s=="string")return r.find(i=>i.module.address===s||i.module.modName===s);if(Array.isArray(s))return r.find(i=>s.includes(i.module.address)||s.includes(i.module.modName??i.module.address))}).filter(o=>{let s=o.input;return!(Array.isArray(s)&&e.some(i=>s.includes(i.module.address)||s.includes(i.module.modName??i.module.address)))});d(a.length>0,()=>`Unable to generateJob [${e.length}]`),t.tasks.push(a),e=e.filter(o=>!a.includes(o))}return t}async queryHandler(t,e,r){let a=await(await P.parseQuery(t,e)).getQuery();d(await this.queryable(t,e,r));let o=[];switch(a.schema){case l:{o.push(...await this.report(e));break}default:return super.queryHandler(t,e)}return o}};export{f as AbstractSentinel};
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/AbstractSentinel.ts
5
+ import { assertEx } from "@xylabs/assert";
6
+ import { forget } from "@xylabs/forget";
7
+ import { globallyUnique } from "@xylabs/object";
8
+ import { BoundWitnessBuilder } from "@xyo-network/boundwitness-builder";
9
+ import { isBoundWitness, notBoundWitness } from "@xyo-network/boundwitness-model";
10
+ import { QueryBoundWitnessWrapper } from "@xyo-network/boundwitness-wrapper";
11
+ import { AbstractModuleInstance } from "@xyo-network/module-abstract";
12
+ import { SentinelConfigSchema, SentinelReportQuerySchema } from "@xyo-network/sentinel-model";
13
+ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
14
+ static {
15
+ __name(this, "AbstractSentinel");
16
+ }
17
+ static configSchemas = [
18
+ ...super.configSchemas,
19
+ SentinelConfigSchema
20
+ ];
21
+ static defaultConfigSchema = SentinelConfigSchema;
22
+ static uniqueName = globallyUnique("AbstractSentinel", _AbstractSentinel, "xyo");
23
+ history = [];
24
+ _jobPromise;
25
+ get jobPromise() {
26
+ this._jobPromise = this._jobPromise ?? this.generateJob();
27
+ return this._jobPromise;
28
+ }
29
+ get queries() {
30
+ return [
31
+ SentinelReportQuerySchema,
32
+ ...super.queries
33
+ ];
34
+ }
35
+ get synchronous() {
36
+ return this.config.synchronous ?? false;
37
+ }
38
+ get throwErrors() {
39
+ return this.config.throwErrors ?? true;
40
+ }
41
+ async report(inPayloads) {
42
+ this._noOverride("report");
43
+ const reportPromise = (async () => {
44
+ await this.emit("reportStart", {
45
+ inPayloads,
46
+ module: this
47
+ });
48
+ const payloads = await this.reportHandler(inPayloads);
49
+ const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat();
50
+ if (this.config.archiving) {
51
+ forget(this.storeToArchivists(result));
52
+ }
53
+ await this.emitReportEnd(inPayloads, result);
54
+ return result;
55
+ })();
56
+ if (this.synchronous) {
57
+ return await reportPromise;
58
+ } else {
59
+ forget(reportPromise);
60
+ return [];
61
+ }
62
+ }
63
+ async reportQuery(payloads, account) {
64
+ const queryPayload = {
65
+ schema: SentinelReportQuerySchema
66
+ };
67
+ return await this.sendQueryRaw(queryPayload, payloads, account);
68
+ }
69
+ async emitReportEnd(inPayloads, payloads) {
70
+ const boundwitnesses = payloads?.filter(isBoundWitness) ?? [];
71
+ const outPayloads = payloads?.filter(notBoundWitness) ?? [];
72
+ const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address));
73
+ await this.emit("reportEnd", {
74
+ boundwitness,
75
+ inPayloads,
76
+ module: this,
77
+ outPayloads
78
+ });
79
+ }
80
+ async generateJob() {
81
+ const job = {
82
+ tasks: []
83
+ };
84
+ let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
85
+ input: task.input ?? false,
86
+ module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
87
+ })));
88
+ while (tasks.length > 0) {
89
+ const previousTasks = job.tasks.at(-1) ?? [];
90
+ const newListCandidates = (
91
+ //add all tasks that either require no previous input or have the previous input module already added
92
+ tasks.filter((task) => {
93
+ const input = task.input;
94
+ if (input === void 0) {
95
+ return true;
96
+ }
97
+ if (typeof input === "boolean") {
98
+ return true;
99
+ }
100
+ if (typeof input === "string") {
101
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
102
+ }
103
+ if (Array.isArray(input)) {
104
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
105
+ }
106
+ })
107
+ );
108
+ const newList = newListCandidates.filter((taskCandidate) => {
109
+ const input = taskCandidate.input;
110
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
111
+ return false;
112
+ }
113
+ return true;
114
+ });
115
+ assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
116
+ job.tasks.push(newList);
117
+ tasks = tasks.filter((task) => !newList.includes(task));
118
+ }
119
+ return job;
120
+ }
121
+ async queryHandler(query, payloads, queryConfig) {
122
+ const wrapper = await QueryBoundWitnessWrapper.parseQuery(query, payloads);
123
+ const queryPayload = await wrapper.getQuery();
124
+ assertEx(await this.queryable(query, payloads, queryConfig));
125
+ const resultPayloads = [];
126
+ switch (queryPayload.schema) {
127
+ case SentinelReportQuerySchema: {
128
+ resultPayloads.push(...await this.report(payloads));
129
+ break;
130
+ }
131
+ default: {
132
+ return super.queryHandler(query, payloads);
133
+ }
134
+ }
135
+ return resultPayloads;
136
+ }
137
+ };
138
+ export {
139
+ AbstractSentinel
140
+ };
2
141
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { globallyUnique } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result))\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\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 = await QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["assertEx","forget","globallyUnique","BoundWitnessBuilder","isBoundWitness","notBoundWitness","QueryBoundWitnessWrapper","AbstractModuleInstance","SentinelConfigSchema","SentinelReportQuerySchema","AbstractSentinel","AbstractModuleInstance","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","signer","account","build","flat","archiving","forget","storeToArchivists","emitReportEnd","reportQuery","queryPayload","schema","sendQueryRaw","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newList","undefined","prevTask","modName","Array","isArray","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads"]}
1
+ {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { globallyUnique } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result))\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\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 = await QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["assertEx","forget","globallyUnique","BoundWitnessBuilder","isBoundWitness","notBoundWitness","QueryBoundWitnessWrapper","AbstractModuleInstance","SentinelConfigSchema","SentinelReportQuerySchema","AbstractSentinel","AbstractModuleInstance","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","signer","account","build","flat","archiving","forget","storeToArchivists","emitReportEnd","reportQuery","queryPayload","schema","sendQueryRaw","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","modName","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads"]}
@@ -1,2 +1,162 @@
1
- "use strict";var l=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var p=(i,e)=>l(i,"name",{value:e,configurable:!0});var j=(i,e)=>{for(var t in e)l(i,t,{get:e[t],enumerable:!0})},A=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of S(e))!q.call(i,s)&&s!==t&&l(i,s,{get:()=>e[s],enumerable:!(r=P(e,s))||r.enumerable});return i};var E=i=>A(l({},"__esModule",{value:!0}),i);var Q={};j(Q,{AbstractSentinel:()=>f});module.exports=E(Q);var c=require("@xylabs/assert"),h=require("@xylabs/forget"),y=require("@xylabs/object"),w=require("@xyo-network/boundwitness-builder"),m=require("@xyo-network/boundwitness-model"),g=require("@xyo-network/boundwitness-wrapper"),b=require("@xyo-network/module-abstract"),d=require("@xyo-network/sentinel-model");var f=class i extends b.AbstractModuleInstance{static{p(this,"AbstractSentinel")}static configSchemas=[...super.configSchemas,d.SentinelConfigSchema];static defaultConfigSchema=d.SentinelConfigSchema;static uniqueName=(0,y.globallyUnique)("AbstractSentinel",i,"xyo");history=[];_jobPromise;get jobPromise(){return this._jobPromise=this._jobPromise??this.generateJob(),this._jobPromise}get queries(){return[d.SentinelReportQuerySchema,...super.queries]}get synchronous(){return this.config.synchronous??!1}get throwErrors(){return this.config.throwErrors??!0}async report(e){this._noOverride("report");let t=(async()=>{await this.emit("reportStart",{inPayloads:e,module:this});let r=await this.reportHandler(e),s=(await new w.BoundWitnessBuilder().payloads(r).signer(this.account).build()).flat();return this.config.archiving&&(0,h.forget)(this.storeToArchivists(s)),await this.emitReportEnd(e,s),s})();return this.synchronous?await t:((0,h.forget)(t),[])}async reportQuery(e,t){let r={schema:d.SentinelReportQuerySchema};return await this.sendQueryRaw(r,e,t)}async emitReportEnd(e,t){let r=t?.filter(m.isBoundWitness)??[],s=t?.filter(m.notBoundWitness)??[],u=r.find(n=>n.addresses.includes(this.address));await this.emit("reportEnd",{boundwitness:u,inPayloads:e,module:this,outPayloads:s})}async generateJob(){let e={tasks:[]},t=await Promise.all(this.config.tasks.map(async r=>({input:r.input??!1,module:(0,c.assertEx)(await this.resolve(r.module),()=>`Unable to resolve task module [${r.module}]`)})));for(;t.length>0;){let r=e.tasks.at(-1)??[],u=t.filter(n=>{let o=n.input;if(o===void 0||typeof o=="boolean")return!0;if(typeof o=="string")return r.find(a=>a.module.address===o||a.module.modName===o);if(Array.isArray(o))return r.find(a=>o.includes(a.module.address)||o.includes(a.module.modName??a.module.address))}).filter(n=>{let o=n.input;return!(Array.isArray(o)&&t.some(a=>o.includes(a.module.address)||o.includes(a.module.modName??a.module.address)))});(0,c.assertEx)(u.length>0,()=>`Unable to generateJob [${t.length}]`),e.tasks.push(u),t=t.filter(n=>!u.includes(n))}return e}async queryHandler(e,t,r){let u=await(await g.QueryBoundWitnessWrapper.parseQuery(e,t)).getQuery();(0,c.assertEx)(await this.queryable(e,t,r));let n=[];switch(u.schema){case d.SentinelReportQuerySchema:{n.push(...await this.report(t));break}default:return super.queryHandler(e,t)}return n}};
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
+ AbstractSentinel: () => AbstractSentinel
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+
28
+ // src/AbstractSentinel.ts
29
+ var import_assert = require("@xylabs/assert");
30
+ var import_forget = require("@xylabs/forget");
31
+ var import_object = require("@xylabs/object");
32
+ var import_boundwitness_builder = require("@xyo-network/boundwitness-builder");
33
+ var import_boundwitness_model = require("@xyo-network/boundwitness-model");
34
+ var import_boundwitness_wrapper = require("@xyo-network/boundwitness-wrapper");
35
+ var import_module_abstract = require("@xyo-network/module-abstract");
36
+ var import_sentinel_model = require("@xyo-network/sentinel-model");
37
+ var AbstractSentinel = class _AbstractSentinel extends import_module_abstract.AbstractModuleInstance {
38
+ static {
39
+ __name(this, "AbstractSentinel");
40
+ }
41
+ static configSchemas = [
42
+ ...super.configSchemas,
43
+ import_sentinel_model.SentinelConfigSchema
44
+ ];
45
+ static defaultConfigSchema = import_sentinel_model.SentinelConfigSchema;
46
+ static uniqueName = (0, import_object.globallyUnique)("AbstractSentinel", _AbstractSentinel, "xyo");
47
+ history = [];
48
+ _jobPromise;
49
+ get jobPromise() {
50
+ this._jobPromise = this._jobPromise ?? this.generateJob();
51
+ return this._jobPromise;
52
+ }
53
+ get queries() {
54
+ return [
55
+ import_sentinel_model.SentinelReportQuerySchema,
56
+ ...super.queries
57
+ ];
58
+ }
59
+ get synchronous() {
60
+ return this.config.synchronous ?? false;
61
+ }
62
+ get throwErrors() {
63
+ return this.config.throwErrors ?? true;
64
+ }
65
+ async report(inPayloads) {
66
+ this._noOverride("report");
67
+ const reportPromise = (async () => {
68
+ await this.emit("reportStart", {
69
+ inPayloads,
70
+ module: this
71
+ });
72
+ const payloads = await this.reportHandler(inPayloads);
73
+ const result = (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat();
74
+ if (this.config.archiving) {
75
+ (0, import_forget.forget)(this.storeToArchivists(result));
76
+ }
77
+ await this.emitReportEnd(inPayloads, result);
78
+ return result;
79
+ })();
80
+ if (this.synchronous) {
81
+ return await reportPromise;
82
+ } else {
83
+ (0, import_forget.forget)(reportPromise);
84
+ return [];
85
+ }
86
+ }
87
+ async reportQuery(payloads, account) {
88
+ const queryPayload = {
89
+ schema: import_sentinel_model.SentinelReportQuerySchema
90
+ };
91
+ return await this.sendQueryRaw(queryPayload, payloads, account);
92
+ }
93
+ async emitReportEnd(inPayloads, payloads) {
94
+ const boundwitnesses = payloads?.filter(import_boundwitness_model.isBoundWitness) ?? [];
95
+ const outPayloads = payloads?.filter(import_boundwitness_model.notBoundWitness) ?? [];
96
+ const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address));
97
+ await this.emit("reportEnd", {
98
+ boundwitness,
99
+ inPayloads,
100
+ module: this,
101
+ outPayloads
102
+ });
103
+ }
104
+ async generateJob() {
105
+ const job = {
106
+ tasks: []
107
+ };
108
+ let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
109
+ input: task.input ?? false,
110
+ module: (0, import_assert.assertEx)(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
111
+ })));
112
+ while (tasks.length > 0) {
113
+ const previousTasks = job.tasks.at(-1) ?? [];
114
+ const newListCandidates = (
115
+ //add all tasks that either require no previous input or have the previous input module already added
116
+ tasks.filter((task) => {
117
+ const input = task.input;
118
+ if (input === void 0) {
119
+ return true;
120
+ }
121
+ if (typeof input === "boolean") {
122
+ return true;
123
+ }
124
+ if (typeof input === "string") {
125
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
126
+ }
127
+ if (Array.isArray(input)) {
128
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
129
+ }
130
+ })
131
+ );
132
+ const newList = newListCandidates.filter((taskCandidate) => {
133
+ const input = taskCandidate.input;
134
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
135
+ return false;
136
+ }
137
+ return true;
138
+ });
139
+ (0, import_assert.assertEx)(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
140
+ job.tasks.push(newList);
141
+ tasks = tasks.filter((task) => !newList.includes(task));
142
+ }
143
+ return job;
144
+ }
145
+ async queryHandler(query, payloads, queryConfig) {
146
+ const wrapper = await import_boundwitness_wrapper.QueryBoundWitnessWrapper.parseQuery(query, payloads);
147
+ const queryPayload = await wrapper.getQuery();
148
+ (0, import_assert.assertEx)(await this.queryable(query, payloads, queryConfig));
149
+ const resultPayloads = [];
150
+ switch (queryPayload.schema) {
151
+ case import_sentinel_model.SentinelReportQuerySchema: {
152
+ resultPayloads.push(...await this.report(payloads));
153
+ break;
154
+ }
155
+ default: {
156
+ return super.queryHandler(query, payloads);
157
+ }
158
+ }
159
+ return resultPayloads;
160
+ }
161
+ };
2
162
  //# sourceMappingURL=index.cjs.map