@xyo-network/sentinel-abstract 2.88.3 → 2.89.0-rc.2

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.
@@ -67,7 +67,7 @@ var AbstractSentinel = class extends import_module_abstract.AbstractModuleInstan
67
67
  module: this
68
68
  });
69
69
  const payloads = await this.reportHandler(inPayloads);
70
- const result = (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads).witness(this.account).build()).flat();
70
+ const result = (await (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat();
71
71
  if (this.config.archiving) {
72
72
  await this.storeToArchivists(result);
73
73
  }
@@ -134,9 +134,9 @@ var AbstractSentinel = class extends import_module_abstract.AbstractModuleInstan
134
134
  return job;
135
135
  }
136
136
  async queryHandler(query, payloads, queryConfig) {
137
- const wrapper = import_boundwitness_builder.QueryBoundWitnessWrapper.parseQuery(query, payloads);
137
+ const wrapper = await import_boundwitness_builder.QueryBoundWitnessWrapper.parseQuery(query, payloads);
138
138
  const queryPayload = await wrapper.getQuery();
139
- (0, import_assert.assertEx)(this.queryable(query, payloads, queryConfig));
139
+ (0, import_assert.assertEx)(await this.queryable(query, payloads, queryConfig));
140
140
  const resultPayloads = [];
141
141
  switch (queryPayload.schema) {
142
142
  case import_sentinel_model.SentinelReportQuerySchema: {
@@ -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 { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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 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 = QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case 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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
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 { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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<SentinelQueryBase>(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,kCAA8D;AAC9D,gCAAiF;AACjF,6BAAuC;AAGvC,4BASO;AAEA,IAAeA,mBAAf,cAIGC,8CAAAA;EAtBV,OAsBUA;;;EAGRC,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,qBAAkE;AACvF,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,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,iBAAiBZ,UAAUa,OAAOC,wCAAAA,KAAmB,CAAA;AAC3D,UAAMC,cAAcf,UAAUa,OAAOG,yCAAAA,KAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,YAAQ+B,wBAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;IACpG,EAAA,CAAA;AAEF,WAAOyB,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,SAAStC,OAAOuB,YAAYO,SAASQ,SAAStC,OAAOR,OAAO+C,SAAST,KAAAA;UAC/G;AACA,cAAIU,MAAMC,QAAQX,KAAAA,GAAQ;AACxB,mBAAOI,cAAcf,KACnB,CAACmB,aAAaR,MAAMR,SAASgB,SAAStC,OAAOuB,OAAO,KAAKO,MAAMR,SAASgB,SAAStC,OAAOR,OAAO+C,QAAQD,SAAStC,OAAOuB,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,cAAc7C,OAAOuB,OAAO,KAAKO,MAAMR,SAASuB,cAAc7C,OAAOR,OAAO+C,QAAQM,cAAc7C,OAAOuB,OAAO,CAAA,GAEnI;AACA,iBAAO;QACT;AACA,eAAO;MACT,CAAA;AACAQ,kCAASW,QAAQT,SAAS,GAAG,0BAA0BR,MAAMQ,MAAM,GAAG;AACtET,UAAIC,MAAMqB,KAAKJ,OAAAA;AAEfjB,cAAQA,MAAMX,OAAO,CAACe,SAAS,CAACa,QAAQpB,SAASO,IAAAA,CAAAA;IACnD;AACA,WAAOL;EACT;EAEA,MAAyBuB,aACvBC,OACA/C,UACAgD,aACmC;AACnC,UAAMC,UAAU,MAAMC,qDAAyBC,WAA8BJ,OAAO/C,QAAAA;AACpF,UAAMoD,eAAe,MAAMH,QAAQI,SAAQ;AAC3CvB,gCAAS,MAAM,KAAKwB,UAAUP,OAAO/C,UAAUgD,WAAAA,CAAAA;AAC/C,UAAMO,iBAA4B,CAAA;AAClC,YAAQH,aAAaI,QAAM;MACzB,KAAKnE,iDAA2B;AAC9BkE,uBAAeV,KAAI,GAAK,MAAM,KAAKnD,OAAOM,QAAAA,CAAAA;AAC1C;MACF;MACA,SAAS;AACP,eAAO,MAAM8C,aAAaC,OAAO/C,QAAAA;MACnC;IACF;AACA,WAAOuD;EACT;AAGF;","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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
@@ -43,7 +43,7 @@ var AbstractSentinel = class extends AbstractModuleInstance {
43
43
  module: this
44
44
  });
45
45
  const payloads = await this.reportHandler(inPayloads);
46
- const result = (await new BoundWitnessBuilder().payloads(payloads).witness(this.account).build()).flat();
46
+ const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat();
47
47
  if (this.config.archiving) {
48
48
  await this.storeToArchivists(result);
49
49
  }
@@ -110,9 +110,9 @@ var AbstractSentinel = class extends AbstractModuleInstance {
110
110
  return job;
111
111
  }
112
112
  async queryHandler(query, payloads, queryConfig) {
113
- const wrapper = QueryBoundWitnessWrapper.parseQuery(query, payloads);
113
+ const wrapper = await QueryBoundWitnessWrapper.parseQuery(query, payloads);
114
114
  const queryPayload = await wrapper.getQuery();
115
- assertEx(this.queryable(query, payloads, queryConfig));
115
+ assertEx(await this.queryable(query, payloads, queryConfig));
116
116
  const resultPayloads = [];
117
117
  switch (queryPayload.schema) {
118
118
  case SentinelReportQuerySchema: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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 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 = QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case 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","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
1
+ {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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<SentinelQueryBase>(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","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
@@ -64,7 +64,7 @@ var _AbstractSentinel = class _AbstractSentinel extends import_module_abstract.A
64
64
  module: this
65
65
  });
66
66
  const payloads = await this.reportHandler(inPayloads);
67
- const result = (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads).witness(this.account).build()).flat();
67
+ const result = (await (await new import_boundwitness_builder.BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat();
68
68
  if (this.config.archiving) {
69
69
  await this.storeToArchivists(result);
70
70
  }
@@ -131,9 +131,9 @@ var _AbstractSentinel = class _AbstractSentinel extends import_module_abstract.A
131
131
  return job;
132
132
  }
133
133
  async queryHandler(query, payloads, queryConfig) {
134
- const wrapper = import_boundwitness_builder.QueryBoundWitnessWrapper.parseQuery(query, payloads);
134
+ const wrapper = await import_boundwitness_builder.QueryBoundWitnessWrapper.parseQuery(query, payloads);
135
135
  const queryPayload = await wrapper.getQuery();
136
- (0, import_assert.assertEx)(this.queryable(query, payloads, queryConfig));
136
+ (0, import_assert.assertEx)(await this.queryable(query, payloads, queryConfig));
137
137
  const resultPayloads = [];
138
138
  switch (queryPayload.schema) {
139
139
  case import_sentinel_model.SentinelReportQuerySchema: {
@@ -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 { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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 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 = QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case 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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
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 { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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<SentinelQueryBase>(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,kCAA8D;AAC9D,gCAAiF;AACjF,6BAAuC;AAGvC,4BASO;AAEA,IAAeA,oBAAf,MAAeA,0BAIZC,8CAAAA;EAGRC,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,qBAAkE;AACvF,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,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,kBAAiBZ,qCAAUa,OAAOC,8CAAmB,CAAA;AAC3D,UAAMC,eAAcf,qCAAUa,OAAOG,+CAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,YAAQ+B,wBAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;IACpG,EAAA,CAAA;AAEF,WAAOyB,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,SAAStC,OAAOuB,YAAYO,SAASQ,SAAStC,OAAOR,OAAO+C,SAAST,KAAAA;UAC/G;AACA,cAAIU,MAAMC,QAAQX,KAAAA,GAAQ;AACxB,mBAAOI,cAAcf,KACnB,CAACmB,aAAaR,MAAMR,SAASgB,SAAStC,OAAOuB,OAAO,KAAKO,MAAMR,SAASgB,SAAStC,OAAOR,OAAO+C,QAAQD,SAAStC,OAAOuB,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,cAAc7C,OAAOuB,OAAO,KAAKO,MAAMR,SAASuB,cAAc7C,OAAOR,OAAO+C,QAAQM,cAAc7C,OAAOuB,OAAO,CAAA,GAEnI;AACA,iBAAO;QACT;AACA,eAAO;MACT,CAAA;AACAQ,kCAASW,QAAQT,SAAS,GAAG,0BAA0BR,MAAMQ,MAAM,GAAG;AACtET,UAAIC,MAAMqB,KAAKJ,OAAAA;AAEfjB,cAAQA,MAAMX,OAAO,CAACe,SAAS,CAACa,QAAQpB,SAASO,IAAAA,CAAAA;IACnD;AACA,WAAOL;EACT;EAEA,MAAyBuB,aACvBC,OACA/C,UACAgD,aACmC;AACnC,UAAMC,UAAU,MAAMC,qDAAyBC,WAA8BJ,OAAO/C,QAAAA;AACpF,UAAMoD,eAAe,MAAMH,QAAQI,SAAQ;AAC3CvB,gCAAS,MAAM,KAAKwB,UAAUP,OAAO/C,UAAUgD,WAAAA,CAAAA;AAC/C,UAAMO,iBAA4B,CAAA;AAClC,YAAQH,aAAaI,QAAM;MACzB,KAAKnE,iDAA2B;AAC9BkE,uBAAeV,KAAI,GAAK,MAAM,KAAKnD,OAAOM,QAAAA,CAAAA;AAC1C;MACF;MACA,SAAS;AACP,eAAO,MAAM8C,aAAaC,OAAO/C,QAAAA;MACnC;IACF;AACA,WAAOuD;EACT;AAGF;AArIUxE;AAJH,IAAeD,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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
@@ -40,7 +40,7 @@ var _AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
40
40
  module: this
41
41
  });
42
42
  const payloads = await this.reportHandler(inPayloads);
43
- const result = (await new BoundWitnessBuilder().payloads(payloads).witness(this.account).build()).flat();
43
+ const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat();
44
44
  if (this.config.archiving) {
45
45
  await this.storeToArchivists(result);
46
46
  }
@@ -107,9 +107,9 @@ var _AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
107
107
  return job;
108
108
  }
109
109
  async queryHandler(query, payloads, queryConfig) {
110
- const wrapper = QueryBoundWitnessWrapper.parseQuery(query, payloads);
110
+ const wrapper = await QueryBoundWitnessWrapper.parseQuery(query, payloads);
111
111
  const queryPayload = await wrapper.getQuery();
112
- assertEx(this.queryable(query, payloads, queryConfig));
112
+ assertEx(await this.queryable(query, payloads, queryConfig));
113
113
  const resultPayloads = [];
114
114
  switch (queryPayload.schema) {
115
115
  case SentinelReportQuerySchema: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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 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 = QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case 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","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
1
+ {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\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 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<SentinelQueryBase['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 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<SentinelQueryBase>(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","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","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","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","queryPayload","getQuery","queryable","resultPayloads","schema"]}
package/package.json CHANGED
@@ -12,12 +12,12 @@
12
12
  "dependencies": {
13
13
  "@xylabs/assert": "^2.13.29",
14
14
  "@xylabs/forget": "^2.13.29",
15
- "@xyo-network/boundwitness-builder": "~2.88.3",
16
- "@xyo-network/boundwitness-model": "~2.88.3",
17
- "@xyo-network/module-abstract": "~2.88.3",
18
- "@xyo-network/module-model": "~2.88.3",
19
- "@xyo-network/payload-model": "~2.88.3",
20
- "@xyo-network/sentinel-model": "~2.88.3"
15
+ "@xyo-network/boundwitness-builder": "~2.89.0-rc.2",
16
+ "@xyo-network/boundwitness-model": "~2.89.0-rc.2",
17
+ "@xyo-network/module-abstract": "~2.89.0-rc.2",
18
+ "@xyo-network/module-model": "~2.89.0-rc.2",
19
+ "@xyo-network/payload-model": "~2.89.0-rc.2",
20
+ "@xyo-network/sentinel-model": "~2.89.0-rc.2"
21
21
  },
22
22
  "description": "Primary SDK for using XYO Protocol 2.0",
23
23
  "devDependencies": {
@@ -63,6 +63,7 @@
63
63
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
64
64
  },
65
65
  "sideEffects": false,
66
- "version": "2.88.3",
67
- "type": "module"
66
+ "version": "2.89.0-rc.2",
67
+ "type": "module",
68
+ "stableVersion": "2.88.3"
68
69
  }
@@ -56,7 +56,7 @@ export abstract class AbstractSentinel<
56
56
  const payloads = await this.reportHandler(inPayloads)
57
57
 
58
58
  //create boundwitness
59
- const result = (await new BoundWitnessBuilder().payloads(payloads).witness(this.account).build()).flat()
59
+ const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()
60
60
 
61
61
  if (this.config.archiving) {
62
62
  await this.storeToArchivists(result)
@@ -136,9 +136,9 @@ export abstract class AbstractSentinel<
136
136
  payloads?: Payload[],
137
137
  queryConfig?: TConfig,
138
138
  ): Promise<ModuleQueryHandlerResult> {
139
- const wrapper = QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)
139
+ const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)
140
140
  const queryPayload = await wrapper.getQuery()
141
- assertEx(this.queryable(query, payloads, queryConfig))
141
+ assertEx(await this.queryable(query, payloads, queryConfig))
142
142
  const resultPayloads: Payload[] = []
143
143
  switch (queryPayload.schema) {
144
144
  case SentinelReportQuerySchema: {