{
  "version": 3,
  "sources": ["../../src/modules/sentinel-memory/MemorySentinel.ts", "../../src/modules/sentinel-memory/SentinelRunner.ts", "../../src/modules/sentinel-memory/SentinelIntervalAutomationWrapper.ts"],
  "sourcesContent": ["import { fulfilled, rejected } from '@ariestools/sdk'\nimport type {\n  Payload, Schema, XyoAddress,\n} from '@xyo-network/sdk-protocol'\n\nimport { asDivinerInstance } from '#diviner-model'\nimport { type AnyConfigSchema, type ModuleIdentifier } from '#module-model'\nimport { AbstractSentinel } from '#sentinel-abstract'\nimport type {\n  ResolvedTask,\n  SentinelConfig,\n  SentinelInstance,\n  SentinelModuleEventData,\n  SentinelParams,\n} from '#sentinel-model'\nimport {\n  asSentinelInstance,\n  SentinelConfigSchema,\n} from '#sentinel-model'\nimport { asWitnessInstance } from '#witness-model'\n\nimport { SentinelRunner } from './SentinelRunner.ts'\n\nexport type MemorySentinelParams<TConfig extends AnyConfigSchema<SentinelConfig> = AnyConfigSchema<SentinelConfig>> = SentinelParams<TConfig>\n\nexport class MemorySentinel<\n  TParams extends MemorySentinelParams = MemorySentinelParams,\n  TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n> extends AbstractSentinel<TParams, TEventData> {\n  static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n  static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n\n  private runner?: SentinelRunner\n\n  async reportHandler(inPayloads: Payload[] = []): Promise<Payload[]> {\n    await this.startedAsync('throw')\n    this.logger?.debug(`reportHandler:in: ${JSON.stringify(inPayloads)}`)\n    const job = await this.jobPromise\n\n    let index = 0\n    let previousResults: Record<XyoAddress, Payload[]> = {}\n    while (index < job.tasks.length) {\n      const generatedPayloads = await this.runJob(job.tasks[index], previousResults, inPayloads)\n      previousResults = generatedPayloads\n      index++\n    }\n    const result = Object.values(previousResults).flat()\n    this.logger?.debug(`reportHandler:out: ${JSON.stringify(result)}`)\n    return result\n  }\n\n  override async startHandler(): Promise<void> {\n    await super.startHandler()\n    if ((this.config.automations?.length ?? 0) > 0) {\n      this.runner = new SentinelRunner({\n        sentinel: this, automations: this.config.automations, traceProvider: this.params.traceProvider,\n      })\n      this.runner.start()\n    }\n  }\n\n  override async stopHandler(): Promise<void> {\n    if (this.runner) {\n      this.runner.stop()\n      this.runner = undefined\n    }\n    await super.stopHandler()\n  }\n\n  private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<XyoAddress[]> {\n    if (Array.isArray(input)) {\n      return (await Promise.all(input.map(async inputItem => await this.inputAddresses(inputItem)))).flat()\n    } else {\n      const resolved = await this.resolve(input)\n      return resolved ? [resolved.address] : []\n    }\n  }\n\n  private processPreviousResults(payloads: Record<string, Payload[]>, inputs: string[]) {\n    return inputs.flatMap(input => payloads[input] ?? [])\n  }\n\n  private async runJob(\n    tasks: ResolvedTask[],\n    previousResults: Record<XyoAddress, Payload[]>,\n    inPayloads?: Payload[],\n  ): Promise<Record<XyoAddress, Payload[]>> {\n    await this.emit('jobStart', { inPayloads, mod: this })\n    this.logger?.debug(`runJob:tasks: ${JSON.stringify(tasks.length)}`)\n    this.logger?.debug(`runJob:previous: ${JSON.stringify(previousResults)}`)\n    this.logger?.debug(`runJob:in: ${JSON.stringify(inPayloads)}`)\n    const results: PromiseSettledResult<[XyoAddress, Payload[]]>[] = await Promise.allSettled(\n      tasks?.map(async (task) => {\n        const input = task.input ?? false\n        const inPayloadsFound\n          = input === true\n            ? inPayloads\n            : input === false\n              ? []\n              : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n        const witness = asWitnessInstance(task.mod)\n        if (witness) {\n          await this.emit('taskStart', {\n            address: witness.address, inPayloads: inPayloadsFound, mod: this,\n          })\n          const observed = await witness.observe(inPayloadsFound)\n          this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n          await this.emit('taskEnd', {\n            address: witness.address, inPayloads: inPayloadsFound, mod: this, outPayloads: observed,\n          })\n          return [witness.address, observed]\n        }\n        const diviner = asDivinerInstance(task.mod)\n        if (diviner) {\n          await this.emit('taskStart', {\n            address: diviner.address, inPayloads: inPayloadsFound, mod: this,\n          })\n          const divined = await diviner.divine(inPayloadsFound)\n          this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n          await this.emit('taskEnd', {\n            address: diviner.address, inPayloads: inPayloadsFound, mod: this, outPayloads: divined,\n          })\n          return [diviner.address, divined]\n        }\n        const sentinel = asSentinelInstance(task.mod)\n        if (sentinel) {\n          await this.emit('taskStart', {\n            address: sentinel.address, inPayloads: inPayloadsFound, mod: this,\n          })\n          const reported = await sentinel.report(inPayloadsFound)\n          this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n          await this.emit('taskEnd', {\n            address: sentinel.address, inPayloads: inPayloadsFound, mod: this, outPayloads: reported,\n          })\n          return [sentinel.address, reported]\n        }\n        throw new Error('Unsupported module type')\n      }),\n    )\n    const finalResult: Record<XyoAddress, Payload[]> = {}\n    for (const result of results.filter(fulfilled)) {\n      const [address, payloads] = result.value\n      finalResult[address] = finalResult[address] ?? []\n      finalResult[address].push(...payloads)\n    }\n    if (this.throwErrors) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n      const errors = results.filter(rejected).map(result => result.reason)\n      if (errors.length > 0) {\n        throw new Error('At least one module failed')\n      }\n    }\n    this.logger?.debug(`generateResults:out: ${JSON.stringify(finalResult)}`)\n    await this.emit('jobEnd', {\n      finalResult, inPayloads, mod: this,\n    })\n    return finalResult\n  }\n}\n", "import type { BaseParams, BrandedHash } from '@ariestools/sdk'\nimport {\n  assertEx, Base, forget,\n  isDefined, spanRootAsync,\n} from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk-protocol'\nimport { PayloadBuilder } from '@xyo-network/sdk-protocol'\n\nimport type {\n  SentinelAutomationPayload,\n  SentinelInstance,\n  SentinelIntervalAutomationPayload,\n} from '#sentinel-model'\nimport { isSentinelIntervalAutomation } from '#sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper.ts'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport interface SentinelRunnerParams extends BaseParams {\n  automations?: SentinelAutomationPayload[]\n  onTriggerResult?: OnSentinelRunnerTriggerResult\n  sentinel: SentinelInstance\n}\n\nexport class SentinelRunner extends Base {\n  protected _automations: Record<string, SentinelAutomationPayload> = {}\n  protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n  protected sentinel: SentinelInstance\n  protected timeoutId?: ReturnType<typeof setTimeout> | string | number\n\n  constructor(params: SentinelRunnerParams) {\n    super(params)\n    this.sentinel = params.sentinel\n    this.onTriggerResult = params.onTriggerResult\n\n    if (params.automations) for (const automation of params.automations) forget(this.add(automation))\n  }\n\n  get automations(): Record<string, SentinelAutomationPayload> {\n    return this._automations\n  }\n\n  private get next() {\n    return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n      if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n        return (current.start ?? Number.POSITIVE_INFINITY) < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n      }\n      return current\n    }, undefined)\n  }\n\n  async add(automation: SentinelAutomationPayload, restart = true): Promise<BrandedHash> {\n    const hash = await PayloadBuilder.dataHash(automation)\n    this._automations[hash] = automation\n    if (restart) this.restart()\n    return hash\n  }\n\n  find(hash: string): [string, SentinelAutomationPayload] | undefined {\n    return Object.entries(this._automations).find(([key]) => key === hash)\n  }\n\n  remove(hash: string, restart = true): void {\n    delete this._automations[hash]\n    if (restart) this.restart()\n  }\n\n  removeAll(): void {\n    this.stop()\n    this._automations = {}\n  }\n\n  restart(): void {\n    this.stop()\n    this.start()\n  }\n\n  start(): void {\n    this.startHandler()\n  }\n\n  startHandler(): void {\n    assertEx(this.timeoutId === undefined, () => 'Already started')\n    const automation = this.next\n    if (isSentinelIntervalAutomation(automation)) {\n      const now = Date.now()\n      const start = Math.max(automation.start ?? now, now)\n      const delay = Math.max(start - now, 0)\n      if (delay < Number.POSITIVE_INFINITY) {\n        // eslint-disable-next-line @typescript-eslint/no-misused-promises\n        this.timeoutId = setTimeout(async () => {\n          this.timeoutId = undefined\n          return await spanRootAsync('start.setTimeout', async () => {\n            try {\n            // Run the automation\n              await this.trigger(automation)\n              this.stop()\n            } catch (ex) {\n              this.logger?.error('Error running automation', { error: ex })\n              this.stop()\n            } finally {\n              // No matter what start the next automation\n              this.start()\n            }\n          }, { tracer: this.tracer })\n        }, delay)\n      }\n    } else if (isDefined(automation) && automation.type === 'interval' && automation.start !== Number.POSITIVE_INFINITY) {\n      // A start of POSITIVE_INFINITY means the automation has intentionally completed\n      // (remaining exhausted or past end). Anything else failing validation here would\n      // otherwise silently stop the runner, so surface it.\n      this.logger?.warn(`Unschedulable interval automation; runner stopped [${JSON.stringify(automation)}]`)\n    }\n  }\n\n  stop(): void {\n    if (isDefined(this.timeoutId)) {\n      clearTimeout(this.timeoutId)\n      this.timeoutId = undefined\n    }\n  }\n\n  async update(hash: string, automation: SentinelAutomationPayload, restart = true): Promise<void> {\n    this.remove(hash, false)\n    await this.add(automation, false)\n    if (restart) this.restart()\n  }\n\n  private async trigger(automation: SentinelIntervalAutomationPayload) {\n    return await spanRootAsync('trigger', async () => {\n      const wrapper = new SentinelIntervalAutomationWrapper(automation)\n      this.remove(await wrapper.dataHash(), false)\n      wrapper.next()\n      await this.add(wrapper.payload, false)\n      const triggerResult = await this.sentinel.report()\n      this.onTriggerResult?.(triggerResult)\n    }, { tracer: this.tracer })\n  }\n}\n", "import { PayloadWrapper } from '@xyo-network/sdk-protocol'\n\nimport type { SentinelIntervalAutomationPayload } from '#sentinel-model'\n\nexport class SentinelIntervalAutomationWrapper<\n  T extends SentinelIntervalAutomationPayload = SentinelIntervalAutomationPayload,\n> extends PayloadWrapper<T> {\n  constructor(payload: T) {\n    super(payload)\n  }\n\n  protected get frequencyMillis(): number {\n    const frequency = this.payload.frequency\n    if (frequency === undefined) return Number.POSITIVE_INFINITY\n    const frequencyUnits = this.payload.frequencyUnits\n    switch (frequencyUnits ?? 'hour') {\n      case 'millis': {\n        return frequency\n      }\n      case 'second': {\n        return frequency * 1000\n      }\n      case 'minute': {\n        return frequency * 60 * 1000\n      }\n      case 'hour': {\n        return frequency * 60 * 60 * 1000\n      }\n      case 'day': {\n        return frequency * 24 * 60 * 60 * 1000\n      }\n      default: {\n        return Number.POSITIVE_INFINITY\n      }\n    }\n  }\n\n  protected get remaining(): number {\n    return this.payload.remaining ?? Number.POSITIVE_INFINITY\n  }\n\n  next(): this {\n    const now = Date.now()\n    const previousStart = this.payload?.start ?? now\n    const start = Math.max(previousStart, now)\n    const nextStart = start + this.frequencyMillis\n    this.setStart(nextStart)\n    this.consumeRemaining()\n    this.checkEnd()\n    return this\n  }\n\n  protected checkEnd(): void {\n    if ((this.payload.start ?? 0) > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n      this.setStart(Number.POSITIVE_INFINITY)\n    }\n  }\n\n  protected consumeRemaining(count = 1): void {\n    // Infinite reruns are represented by an absent remaining field. Leave the field\n    // absent since a non-finite value is not a valid payload field value and would\n    // cause the automation to fail schema validation on subsequent scheduling.\n    if (this.payload.remaining === undefined) return\n    const remaining = Math.max(this.remaining - count, 0)\n    this.setRemaining(remaining)\n    if (remaining <= 0) this.setStart(Number.POSITIVE_INFINITY)\n  }\n\n  /**\n   * Sets the remaining of the wrapped automation\n   * @param remaining The remaining time in milliseconds\n   */\n  protected setRemaining(remaining: number): void {\n    this.payload.remaining = remaining\n  }\n\n  /**\n   * Sets the start of the wrapped automation\n   * @param start The start time in milliseconds\n   */\n  protected setStart(start: number): void {\n    this.payload.start = start\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
