{
  "version": 3,
  "sources": ["../../src/modules/sentinel-abstract/AbstractSentinel.ts"],
  "sourcesContent": ["import { assertEx, forget } from '@ariestools/sdk'\nimport type {\n  AccountInstance, BoundWitness, Payload, QueryBoundWitness, Schema,\n} from '@xyo-network/sdk-protocol'\nimport {\n  BoundWitnessBuilder, isBoundWitness, PayloadBuilder, QueryBoundWitnessWrapper,\n} from '@xyo-network/sdk-protocol'\n\nimport { AbstractModuleInstance } from '#module-abstract'\nimport type {\n  ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '#module-model'\nimport type {\n  AttachableSentinelInstance,\n  CustomSentinelInstance,\n  ResolvedTask,\n  SentinelInstance,\n  SentinelJob,\n  SentinelModuleEventData,\n  SentinelParams,\n  SentinelQueries,\n  SentinelReportQuery,\n} from '#sentinel-model'\nimport {\n  SentinelConfigSchema,\n  SentinelReportQuerySchema,\n} from '#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>, AttachableSentinelInstance<TParams, TEventData> {\n  static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n  static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n  history: BoundWitness[] = []\n  private _jobPromise?: Promise<SentinelJob>\n\n  get jobPromise(): Promise<SentinelJob> {\n    this._jobPromise = this._jobPromise ?? this.generateJob()\n    return this._jobPromise\n  }\n\n  override get queries(): Schema[] {\n    return [SentinelReportQuerySchema, ...super.queries]\n  }\n\n  get synchronous(): boolean {\n    return this.config.synchronous ?? true\n  }\n\n  get throwErrors(): boolean {\n    return this.config.throwErrors ?? true\n  }\n\n  async report(inPayloads?: Payload[]): Promise<Payload[]> {\n    this._noOverride('report')\n    this.isSupportedQuery(SentinelReportQuerySchema, 'report')\n    return await this.spanAsync('report', async () => {\n      const reportPromise = (async () => {\n        if (this.reentrancy?.scope === 'global' && this.reentrancy?.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {\n          console.warn(`Skipping report for ${this.id} due to global reentrancy lock`)\n          return []\n        }\n        try {\n          await this.globalReentrancyMutex?.acquire()\n          await this.emit('reportStart', { inPayloads, mod: this })\n          const payloads = await this.reportHandler(inPayloads)\n\n          // create boundwitness\n          const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n          if (this.config.archiving) {\n            forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` })\n          }\n\n          await this.emitReportEnd(inPayloads, result)\n          return result\n        } finally {\n          this.globalReentrancyMutex?.release()\n        }\n      }\n      )()\n      if (this.synchronous) {\n        return await reportPromise\n      } else {\n        forget(reportPromise, { name: `AbstractSentinel.report [${this.id}]` })\n        return []\n      }\n    }, { timeBudgetLimit: 200 })\n  }\n\n  async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n    this._noOverride('reportQuery')\n    const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n    return await this.sendQueryRaw(queryPayload, payloads, account)\n  }\n\n  protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]): Promise<void> {\n    const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n    const outPayloads = payloads?.filter(payload => !isBoundWitness(payload)) ?? []\n    const boundwitness = boundwitnesses.find(bw => bw.addresses.includes(this.address))\n    await this.emit('reportEnd', {\n      boundwitness, inPayloads, mod: this, outPayloads,\n    })\n  }\n\n  protected async generateJob(): Promise<SentinelJob> {\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        mod: assertEx(await this.resolve(task.mod), () => `Unable to resolve task module [${task.mod}]`),\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.some(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)\n          }\n          if (Array.isArray(input)) {\n            return previousTasks.some(\n              prevTask => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address),\n            )\n          }\n          return false\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        return !(\n          Array.isArray(input)\n          && tasks.some(\n            remainingTask => input.includes(remainingTask.mod.address) || input.includes(remainingTask.mod.modName ?? remainingTask.mod.address),\n          )\n        )\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<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 PayloadBuilder.omitPrivateStorageMeta(resultPayloads)\n  }\n\n  abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],
  "mappings": "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",
  "names": []
}
