@xyo-network/sentinel-abstract 2.100.28 → 2.101.0

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.
@@ -127,16 +127,16 @@ var AbstractSentinel = class _AbstractSentinel extends import_module_abstract.Ab
127
127
  return true;
128
128
  }
129
129
  if (typeof input === "string") {
130
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
130
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
131
131
  }
132
132
  if (Array.isArray(input)) {
133
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
133
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
134
134
  }
135
135
  })
136
136
  );
137
137
  const newList = newListCandidates.filter((taskCandidate) => {
138
138
  const input = taskCandidate.input;
139
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
139
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
140
140
  return false;
141
141
  }
142
142
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AACvB,oBAA+B;AAE/B,kCAAoC;AACpC,gCAAiF;AACjF,kCAAyC;AACzC,6BAAuC;AAGvC,4BAWO;AAEA,IAAeA,mBAAf,MAAeA,0BAIZC,8CAAAA;EA3BV,OA2BUA;;;EAGR,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeC;;EAC5E,OAAyBC,sBAA8BD;EACvD,OAAyBE,iBAAaC,8BAAe,oBAAoBN,mBAAkB,KAAA;EAC3FO,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAgE;AACrF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,gDAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,gCAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAMe,YAAYZ,UAAsBK,SAAuD;AAC7F,UAAMQ,eAAoC;MAAEC,QAAQzB;IAA0B;AAC9E,WAAO,MAAM,KAAK0B,aAAaF,cAAcb,UAAUK,OAAAA;EACzD;EAEA,MAAgBK,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMgB,iBAAiBhB,UAAUiB,OAAOC,wCAAAA,KAAmB,CAAA;AAC3D,UAAMC,cAAcnB,UAAUiB,OAAOG,yCAAAA,KAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAK5B,KAAK,aAAa;MAAEuB;MAAc1B;MAAYI,QAAQ;MAAMoB;IAAY,CAAA;EACrF;EAEA,MAAgBhC,cAAc;AAC5B,UAAMwC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKvC,OAAOqC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrBlC,YAAQmC,wBAAS,MAAM,KAAKC,QAAQH,KAAKjC,MAAM,GAAG,MAAM,kCAAkCiC,KAAKjC,MAAM,GAAG;IAC1G,EAAA,CAAA;AAEF,WAAO6B,MAAMQ,SAAS,GAAG;AACvB,YAAMC,gBAAgBV,IAAIC,MAAMU,GAAG,EAAC,KAAM,CAAA;AAC1C,YAAMC;;QAEJX,MAAMX,OAAO,CAACe,SAAAA;AACZ,gBAAMC,QAAQD,KAAKC;AACnB,cAAIA,UAAUO,QAAW;AACvB,mBAAO;UACT;AACA,cAAI,OAAOP,UAAU,WAAW;AAC9B,mBAAO;UACT;AACA,cAAI,OAAOA,UAAU,UAAU;AAC7B,mBAAOI,cAAcf,KAAK,CAACmB,aAAaA,SAAS1C,OAAO2B,YAAYO,SAASQ,SAAS1C,OAAOR,OAAOmD,SAAST,KAAAA;UAC/G;AACA,cAAIU,MAAMC,QAAQX,KAAAA,GAAQ;AACxB,mBAAOI,cAAcf,KACnB,CAACmB,aAAaR,MAAMR,SAASgB,SAAS1C,OAAO2B,OAAO,KAAKO,MAAMR,SAASgB,SAAS1C,OAAOR,OAAOmD,QAAQD,SAAS1C,OAAO2B,OAAO,CAAA;UAElI;QACF,CAAA;;AAEF,YAAMmB,UAAUN,kBAAkBtB,OAAO,CAAC6B,kBAAAA;AACxC,cAAMb,QAAQa,cAAcb;AAC5B,YACEU,MAAMC,QAAQX,KAAAA,KACdL,MAAMmB,KACJ,CAACC,kBACCf,MAAMR,SAASuB,cAAcjD,OAAO2B,OAAO,KAAKO,MAAMR,SAASuB,cAAcjD,OAAOR,OAAOmD,QAAQM,cAAcjD,OAAO2B,OAAO,CAAA,GAEnI;AACA,iBAAO;QACT;AACA,eAAO;MACT,CAAA;AACAQ,kCAASW,QAAQT,SAAS,GAAG,MAAM,0BAA0BR,MAAMQ,MAAM,GAAG;AAC5ET,UAAIC,MAAMqB,KAAKJ,OAAAA;AAEfjB,cAAQA,MAAMX,OAAO,CAACe,SAAS,CAACa,QAAQpB,SAASO,IAAAA,CAAAA;IACnD;AACA,WAAOL;EACT;EAEA,MAAyBuB,aACvBC,OACAnD,UACAoD,aACmC;AACnC,UAAMC,UAAU,MAAMC,qDAAyBC,WAA4BJ,OAAOnD,QAAAA;AAClF,UAAMa,eAAe,MAAMwC,QAAQG,SAAQ;AAC3CtB,gCAAS,MAAM,KAAKuB,UAAUN,OAAOnD,UAAUoD,WAAAA,CAAAA;AAC/C,UAAMM,iBAA4B,CAAA;AAClC,YAAQ7C,aAAaC,QAAM;MACzB,KAAKzB,iDAA2B;AAC9BqE,uBAAeT,KAAI,GAAK,MAAM,KAAKvD,OAAOM,QAAAA,CAAAA;AAC1C;MACF;MACA,SAAS;AACP,eAAO,MAAMkD,aAAaC,OAAOnD,QAAAA;MACnC;IACF;AACA,WAAO0D;EACT;AAGF;","names":["AbstractSentinel","AbstractModuleInstance","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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"]}
@@ -103,16 +103,16 @@ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
103
103
  return true;
104
104
  }
105
105
  if (typeof input === "string") {
106
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
106
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
107
107
  }
108
108
  if (Array.isArray(input)) {
109
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
109
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
110
110
  }
111
111
  })
112
112
  );
113
113
  const newList = newListCandidates.filter((taskCandidate) => {
114
114
  const input = taskCandidate.input;
115
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
115
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
116
116
  return false;
117
117
  }
118
118
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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"]}
@@ -127,16 +127,16 @@ var AbstractSentinel = class _AbstractSentinel extends import_module_abstract.Ab
127
127
  return true;
128
128
  }
129
129
  if (typeof input === "string") {
130
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
130
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
131
131
  }
132
132
  if (Array.isArray(input)) {
133
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
133
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
134
134
  }
135
135
  })
136
136
  );
137
137
  const newList = newListCandidates.filter((taskCandidate) => {
138
138
  const input = taskCandidate.input;
139
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
139
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
140
140
  return false;
141
141
  }
142
142
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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"]}
@@ -103,16 +103,16 @@ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
103
103
  return true;
104
104
  }
105
105
  if (typeof input === "string") {
106
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
106
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
107
107
  }
108
108
  if (Array.isArray(input)) {
109
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
109
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
110
110
  }
111
111
  })
112
112
  );
113
113
  const newList = newListCandidates.filter((taskCandidate) => {
114
114
  const input = taskCandidate.input;
115
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
115
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
116
116
  return false;
117
117
  }
118
118
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,cAAc;AACvB,SAASC,sBAAsB;AAE/B,SAASC,2BAA2B;AACpC,SAAuBC,gBAAgBC,uBAA0C;AACjF,SAASC,gCAAgC;AACzC,SAASC,8BAA8B;AAGvC,SAGEC,sBAOAC,iCACK;AAEA,IAAeC,mBAAf,MAAeA,0BAIZC,uBAAAA;EA3BV,OA2BUA;;;EAGR,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeC;;EAC5E,OAAyBC,sBAA8BD;EACvD,OAAyBE,aAAaC,eAAe,oBAAoBN,mBAAkB,KAAA;EAC3FO,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAgE;AACrF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,oBAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,aAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAMe,YAAYZ,UAAsBK,SAAuD;AAC7F,UAAMQ,eAAoC;MAAEC,QAAQzB;IAA0B;AAC9E,WAAO,MAAM,KAAK0B,aAAaF,cAAcb,UAAUK,OAAAA;EACzD;EAEA,MAAgBK,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMgB,iBAAiBhB,UAAUiB,OAAOC,cAAAA,KAAmB,CAAA;AAC3D,UAAMC,cAAcnB,UAAUiB,OAAOG,eAAAA,KAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAK5B,KAAK,aAAa;MAAEuB;MAAc1B;MAAYI,QAAQ;MAAMoB;IAAY,CAAA;EACrF;EAEA,MAAgBhC,cAAc;AAC5B,UAAMwC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKvC,OAAOqC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrBlC,QAAQmC,SAAS,MAAM,KAAKC,QAAQH,KAAKjC,MAAM,GAAG,MAAM,kCAAkCiC,KAAKjC,MAAM,GAAG;IAC1G,EAAA,CAAA;AAEF,WAAO6B,MAAMQ,SAAS,GAAG;AACvB,YAAMC,gBAAgBV,IAAIC,MAAMU,GAAG,EAAC,KAAM,CAAA;AAC1C,YAAMC;;QAEJX,MAAMX,OAAO,CAACe,SAAAA;AACZ,gBAAMC,QAAQD,KAAKC;AACnB,cAAIA,UAAUO,QAAW;AACvB,mBAAO;UACT;AACA,cAAI,OAAOP,UAAU,WAAW;AAC9B,mBAAO;UACT;AACA,cAAI,OAAOA,UAAU,UAAU;AAC7B,mBAAOI,cAAcf,KAAK,CAACmB,aAAaA,SAAS1C,OAAO2B,YAAYO,SAASQ,SAAS1C,OAAO2C,YAAYT,KAAAA;UAC3G;AACA,cAAIU,MAAMC,QAAQX,KAAAA,GAAQ;AACxB,mBAAOI,cAAcf,KACnB,CAACmB,aAAaR,MAAMR,SAASgB,SAAS1C,OAAO2B,OAAO,KAAKO,MAAMR,SAASgB,SAAS1C,OAAO2C,WAAWD,SAAS1C,OAAO2B,OAAO,CAAA;UAE9H;QACF,CAAA;;AAEF,YAAMmB,UAAUN,kBAAkBtB,OAAO,CAAC6B,kBAAAA;AACxC,cAAMb,QAAQa,cAAcb;AAC5B,YACEU,MAAMC,QAAQX,KAAAA,KACdL,MAAMmB,KACJ,CAACC,kBACCf,MAAMR,SAASuB,cAAcjD,OAAO2B,OAAO,KAAKO,MAAMR,SAASuB,cAAcjD,OAAO2C,WAAWM,cAAcjD,OAAO2B,OAAO,CAAA,GAE/H;AACA,iBAAO;QACT;AACA,eAAO;MACT,CAAA;AACAQ,eAASW,QAAQT,SAAS,GAAG,MAAM,0BAA0BR,MAAMQ,MAAM,GAAG;AAC5ET,UAAIC,MAAMqB,KAAKJ,OAAAA;AAEfjB,cAAQA,MAAMX,OAAO,CAACe,SAAS,CAACa,QAAQpB,SAASO,IAAAA,CAAAA;IACnD;AACA,WAAOL;EACT;EAEA,MAAyBuB,aACvBC,OACAnD,UACAoD,aACmC;AACnC,UAAMC,UAAU,MAAMC,yBAAyBC,WAA4BJ,OAAOnD,QAAAA;AAClF,UAAMa,eAAe,MAAMwC,QAAQG,SAAQ;AAC3CtB,aAAS,MAAM,KAAKuB,UAAUN,OAAOnD,UAAUoD,WAAAA,CAAAA;AAC/C,UAAMM,iBAA4B,CAAA;AAClC,YAAQ7C,aAAaC,QAAM;MACzB,KAAKzB,2BAA2B;AAC9BqE,uBAAeT,KAAI,GAAK,MAAM,KAAKvD,OAAOM,QAAAA,CAAAA;AAC1C;MACF;MACA,SAAS;AACP,eAAO,MAAMkD,aAAaC,OAAOnD,QAAAA;MACnC;IACF;AACA,WAAO0D;EACT;AAGF;","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","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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"]}
@@ -126,16 +126,16 @@ var _AbstractSentinel = class _AbstractSentinel extends import_module_abstract.A
126
126
  return true;
127
127
  }
128
128
  if (typeof input === "string") {
129
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
129
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
130
130
  }
131
131
  if (Array.isArray(input)) {
132
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
132
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
133
133
  }
134
134
  })
135
135
  );
136
136
  const newList = newListCandidates.filter((taskCandidate) => {
137
137
  const input = taskCandidate.input;
138
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
138
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
139
139
  return false;
140
140
  }
141
141
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique"]}
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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AACvB,oBAA+B;AAE/B,kCAAoC;AACpC,gCAAiF;AACjF,kCAAyC;AACzC,6BAAuC;AAGvC,4BAWO;AAEA,IAAeA,oBAAf,MAAeA,0BAIZC,8CAAAA;EAMRC,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAgE;AACrF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,gDAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,gCAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAMe,YAAYZ,UAAsBK,SAAuD;AAC7F,UAAMQ,eAAoC;MAAEC,QAAQzB;IAA0B;AAC9E,WAAO,MAAM,KAAK0B,aAAaF,cAAcb,UAAUK,OAAAA;EACzD;EAEA,MAAgBK,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMgB,kBAAiBhB,qCAAUiB,OAAOC,8CAAmB,CAAA;AAC3D,UAAMC,eAAcnB,qCAAUiB,OAAOG,+CAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAK5B,KAAK,aAAa;MAAEuB;MAAc1B;MAAYI,QAAQ;MAAMoB;IAAY,CAAA;EACrF;EAEA,MAAgBhC,cAAc;AAC5B,UAAMwC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKvC,OAAOqC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrBlC,YAAQmC,wBAAS,MAAM,KAAKC,QAAQH,KAAKjC,MAAM,GAAG,MAAM,kCAAkCiC,KAAKjC,MAAM,GAAG;IAC1G,EAAA,CAAA;AAEF,WAAO6B,MAAMQ,SAAS,GAAG;AACvB,YAAMC,gBAAgBV,IAAIC,MAAMU,GAAG,EAAC,KAAM,CAAA;AAC1C,YAAMC;;QAEJX,MAAMX,OAAO,CAACe,SAAAA;AACZ,gBAAMC,QAAQD,KAAKC;AACnB,cAAIA,UAAUO,QAAW;AACvB,mBAAO;UACT;AACA,cAAI,OAAOP,UAAU,WAAW;AAC9B,mBAAO;UACT;AACA,cAAI,OAAOA,UAAU,UAAU;AAC7B,mBAAOI,cAAcf,KAAK,CAACmB,aAAaA,SAAS1C,OAAO2B,YAAYO,SAASQ,SAAS1C,OAAO2C,YAAYT,KAAAA;UAC3G;AACA,cAAIU,MAAMC,QAAQX,KAAAA,GAAQ;AACxB,mBAAOI,cAAcf,KACnB,CAACmB,aAAaR,MAAMR,SAASgB,SAAS1C,OAAO2B,OAAO,KAAKO,MAAMR,SAASgB,SAAS1C,OAAO2C,WAAWD,SAAS1C,OAAO2B,OAAO,CAAA;UAE9H;QACF,CAAA;;AAEF,YAAMmB,UAAUN,kBAAkBtB,OAAO,CAAC6B,kBAAAA;AACxC,cAAMb,QAAQa,cAAcb;AAC5B,YACEU,MAAMC,QAAQX,KAAAA,KACdL,MAAMmB,KACJ,CAACC,kBACCf,MAAMR,SAASuB,cAAcjD,OAAO2B,OAAO,KAAKO,MAAMR,SAASuB,cAAcjD,OAAO2C,WAAWM,cAAcjD,OAAO2B,OAAO,CAAA,GAE/H;AACA,iBAAO;QACT;AACA,eAAO;MACT,CAAA;AACAQ,kCAASW,QAAQT,SAAS,GAAG,MAAM,0BAA0BR,MAAMQ,MAAM,GAAG;AAC5ET,UAAIC,MAAMqB,KAAKJ,OAAAA;AAEfjB,cAAQA,MAAMX,OAAO,CAACe,SAAS,CAACa,QAAQpB,SAASO,IAAAA,CAAAA;IACnD;AACA,WAAOL;EACT;EAEA,MAAyBuB,aACvBC,OACAnD,UACAoD,aACmC;AACnC,UAAMC,UAAU,MAAMC,qDAAyBC,WAA4BJ,OAAOnD,QAAAA;AAClF,UAAMa,eAAe,MAAMwC,QAAQG,SAAQ;AAC3CtB,gCAAS,MAAM,KAAKuB,UAAUN,OAAOnD,UAAUoD,WAAAA,CAAAA;AAC/C,UAAMM,iBAA4B,CAAA;AAClC,YAAQ7C,aAAaC,QAAM;MACzB,KAAKzB,iDAA2B;AAC9BqE,uBAAeT,KAAI,GAAK,MAAM,KAAKvD,OAAOM,QAAAA,CAAAA;AAC1C;MACF;MACA,SAAS;AACP,eAAO,MAAMkD,aAAaC,OAAOnD,QAAAA;MACnC;IACF;AACA,WAAO0D;EACT;AAGF;AA7IU3E;AAGR,cAPoBD,mBAOK6E,iBAA0B;KAAI,iDAAMA;EAAeC;;AAC5E,cARoB9E,mBAQK+E,uBAA8BD;AACvD,cAToB9E,mBASKgF,kBAAaC,8BAAe,oBAAoBjF,mBAAkB,KAAA;AATtF,IAAeA,mBAAf;","names":["AbstractSentinel","AbstractModuleInstance","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique"]}
@@ -102,16 +102,16 @@ var _AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
102
102
  return true;
103
103
  }
104
104
  if (typeof input === "string") {
105
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input);
105
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input);
106
106
  }
107
107
  if (Array.isArray(input)) {
108
- return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address));
108
+ return previousTasks.find((prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address));
109
109
  }
110
110
  })
111
111
  );
112
112
  const newList = newListCandidates.filter((taskCandidate) => {
113
113
  const input = taskCandidate.input;
114
- if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address))) {
114
+ if (Array.isArray(input) && tasks.some((remainingTask) => input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address))) {
115
115
  return false;
116
116
  }
117
117
  return true;
@@ -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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? 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.config.name ?? 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","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","getQuery","queryable","resultPayloads","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique"]}
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 protected override get _queryAccountPaths(): Record<SentinelQueries['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\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 (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await 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","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","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","configSchemas","SentinelConfigSchema","defaultConfigSchema","uniqueName","globallyUnique"]}
package/package.json CHANGED
@@ -13,14 +13,14 @@
13
13
  "@xylabs/assert": "^3.3.3",
14
14
  "@xylabs/forget": "^3.3.3",
15
15
  "@xylabs/object": "^3.3.3",
16
- "@xyo-network/account-model": "~2.100.28",
17
- "@xyo-network/boundwitness-builder": "~2.100.28",
18
- "@xyo-network/boundwitness-model": "~2.100.28",
19
- "@xyo-network/boundwitness-wrapper": "~2.100.28",
20
- "@xyo-network/module-abstract": "~2.100.28",
21
- "@xyo-network/module-model": "~2.100.28",
22
- "@xyo-network/payload-model": "~2.100.28",
23
- "@xyo-network/sentinel-model": "~2.100.28"
16
+ "@xyo-network/account-model": "~2.101.0",
17
+ "@xyo-network/boundwitness-builder": "~2.101.0",
18
+ "@xyo-network/boundwitness-model": "~2.101.0",
19
+ "@xyo-network/boundwitness-wrapper": "~2.101.0",
20
+ "@xyo-network/module-abstract": "~2.101.0",
21
+ "@xyo-network/module-model": "~2.101.0",
22
+ "@xyo-network/payload-model": "~2.101.0",
23
+ "@xyo-network/sentinel-model": "~2.101.0"
24
24
  },
25
25
  "description": "Primary SDK for using XYO Protocol 2.0",
26
26
  "devDependencies": {
@@ -66,6 +66,6 @@
66
66
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
67
67
  },
68
68
  "sideEffects": false,
69
- "version": "2.100.28",
69
+ "version": "2.101.0",
70
70
  "type": "module"
71
71
  }
@@ -114,11 +114,11 @@ export abstract class AbstractSentinel<
114
114
  return true
115
115
  }
116
116
  if (typeof input === 'string') {
117
- return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)
117
+ return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.modName === input)
118
118
  }
119
119
  if (Array.isArray(input)) {
120
120
  return previousTasks.find(
121
- (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),
121
+ (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.modName ?? prevTask.module.address),
122
122
  )
123
123
  }
124
124
  })
@@ -129,7 +129,7 @@ export abstract class AbstractSentinel<
129
129
  Array.isArray(input) &&
130
130
  tasks.some(
131
131
  (remainingTask) =>
132
- input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),
132
+ input.includes(remainingTask.module.address) || input.includes(remainingTask.module.modName ?? remainingTask.module.address),
133
133
  )
134
134
  ) {
135
135
  return false