@xyo-network/sentinel-memory 2.107.6 → 2.108.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.
@@ -255,7 +255,7 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
255
255
  async runJob(tasks, previousResults, inPayloads) {
256
256
  await this.emit("jobStart", {
257
257
  inPayloads,
258
- module: this
258
+ mod: this
259
259
  });
260
260
  this.logger?.debug(`runJob:tasks: ${JSON.stringify(tasks.length)}`);
261
261
  this.logger?.debug(`runJob:previous: ${JSON.stringify(previousResults)}`);
@@ -263,19 +263,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
263
263
  const results = await Promise.allSettled(tasks?.map(async (task) => {
264
264
  const input = task.input ?? false;
265
265
  const inPayloadsFound = input === true ? inPayloads : input === false ? [] : this.processPreviousResults(previousResults, await this.inputAddresses(input));
266
- const witness = (0, import_witness_model.asWitnessInstance)(task.module);
266
+ const witness = (0, import_witness_model.asWitnessInstance)(task.mod);
267
267
  if (witness) {
268
268
  await this.emit("taskStart", {
269
269
  address: witness.address,
270
270
  inPayloads: inPayloadsFound,
271
- module: this
271
+ mod: this
272
272
  });
273
273
  const observed = await witness.observe(inPayloadsFound);
274
274
  this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`);
275
275
  await this.emit("taskEnd", {
276
276
  address: witness.address,
277
277
  inPayloads: inPayloadsFound,
278
- module: this,
278
+ mod: this,
279
279
  outPayloads: observed
280
280
  });
281
281
  return [
@@ -283,19 +283,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
283
283
  observed
284
284
  ];
285
285
  }
286
- const diviner = (0, import_diviner_model.asDivinerInstance)(task.module);
286
+ const diviner = (0, import_diviner_model.asDivinerInstance)(task.mod);
287
287
  if (diviner) {
288
288
  await this.emit("taskStart", {
289
289
  address: diviner.address,
290
290
  inPayloads: inPayloadsFound,
291
- module: this
291
+ mod: this
292
292
  });
293
293
  const divined = await diviner.divine(inPayloadsFound);
294
294
  this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`);
295
295
  await this.emit("taskEnd", {
296
296
  address: diviner.address,
297
297
  inPayloads: inPayloadsFound,
298
- module: this,
298
+ mod: this,
299
299
  outPayloads: divined
300
300
  });
301
301
  return [
@@ -303,19 +303,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
303
303
  divined
304
304
  ];
305
305
  }
306
- const sentinel = (0, import_sentinel_model2.asSentinelInstance)(task.module);
306
+ const sentinel = (0, import_sentinel_model2.asSentinelInstance)(task.mod);
307
307
  if (sentinel) {
308
308
  await this.emit("taskStart", {
309
309
  address: sentinel.address,
310
310
  inPayloads: inPayloadsFound,
311
- module: this
311
+ mod: this
312
312
  });
313
313
  const reported = await sentinel.report(inPayloadsFound);
314
314
  this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`);
315
315
  await this.emit("taskEnd", {
316
316
  address: sentinel.address,
317
317
  inPayloads: inPayloadsFound,
318
- module: this,
318
+ mod: this,
319
319
  outPayloads: reported
320
320
  });
321
321
  return [
@@ -341,7 +341,7 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
341
341
  await this.emit("jobEnd", {
342
342
  finalResult,
343
343
  inPayloads,
344
- module: this
344
+ mod: this
345
345
  });
346
346
  return finalResult;
347
347
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["export * from './MemorySentinel'\nexport * from './SentinelIntervalAutomationWrapper'\nexport * from './SentinelRunner'\n","import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, Payload[]>> {\n await this.emit('jobStart', { inPayloads, module: 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.module)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, module: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, module: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.module)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, module: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, module: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.module)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, module: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, module: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, module: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["import_sentinel_model","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","module","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["export * from './MemorySentinel'\nexport * from './SentinelIntervalAutomationWrapper'\nexport * from './SentinelRunner'\n","import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.mod)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, mod: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, mod: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.mod)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, mod: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, mod: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.mod)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, mod: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["import_sentinel_model","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","mod","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}
@@ -229,7 +229,7 @@ var MemorySentinel = class extends AbstractSentinel {
229
229
  async runJob(tasks, previousResults, inPayloads) {
230
230
  await this.emit("jobStart", {
231
231
  inPayloads,
232
- module: this
232
+ mod: this
233
233
  });
234
234
  this.logger?.debug(`runJob:tasks: ${JSON.stringify(tasks.length)}`);
235
235
  this.logger?.debug(`runJob:previous: ${JSON.stringify(previousResults)}`);
@@ -237,19 +237,19 @@ var MemorySentinel = class extends AbstractSentinel {
237
237
  const results = await Promise.allSettled(tasks?.map(async (task) => {
238
238
  const input = task.input ?? false;
239
239
  const inPayloadsFound = input === true ? inPayloads : input === false ? [] : this.processPreviousResults(previousResults, await this.inputAddresses(input));
240
- const witness = asWitnessInstance(task.module);
240
+ const witness = asWitnessInstance(task.mod);
241
241
  if (witness) {
242
242
  await this.emit("taskStart", {
243
243
  address: witness.address,
244
244
  inPayloads: inPayloadsFound,
245
- module: this
245
+ mod: this
246
246
  });
247
247
  const observed = await witness.observe(inPayloadsFound);
248
248
  this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`);
249
249
  await this.emit("taskEnd", {
250
250
  address: witness.address,
251
251
  inPayloads: inPayloadsFound,
252
- module: this,
252
+ mod: this,
253
253
  outPayloads: observed
254
254
  });
255
255
  return [
@@ -257,19 +257,19 @@ var MemorySentinel = class extends AbstractSentinel {
257
257
  observed
258
258
  ];
259
259
  }
260
- const diviner = asDivinerInstance(task.module);
260
+ const diviner = asDivinerInstance(task.mod);
261
261
  if (diviner) {
262
262
  await this.emit("taskStart", {
263
263
  address: diviner.address,
264
264
  inPayloads: inPayloadsFound,
265
- module: this
265
+ mod: this
266
266
  });
267
267
  const divined = await diviner.divine(inPayloadsFound);
268
268
  this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`);
269
269
  await this.emit("taskEnd", {
270
270
  address: diviner.address,
271
271
  inPayloads: inPayloadsFound,
272
- module: this,
272
+ mod: this,
273
273
  outPayloads: divined
274
274
  });
275
275
  return [
@@ -277,19 +277,19 @@ var MemorySentinel = class extends AbstractSentinel {
277
277
  divined
278
278
  ];
279
279
  }
280
- const sentinel = asSentinelInstance(task.module);
280
+ const sentinel = asSentinelInstance(task.mod);
281
281
  if (sentinel) {
282
282
  await this.emit("taskStart", {
283
283
  address: sentinel.address,
284
284
  inPayloads: inPayloadsFound,
285
- module: this
285
+ mod: this
286
286
  });
287
287
  const reported = await sentinel.report(inPayloadsFound);
288
288
  this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`);
289
289
  await this.emit("taskEnd", {
290
290
  address: sentinel.address,
291
291
  inPayloads: inPayloadsFound,
292
- module: this,
292
+ mod: this,
293
293
  outPayloads: reported
294
294
  });
295
295
  return [
@@ -315,7 +315,7 @@ var MemorySentinel = class extends AbstractSentinel {
315
315
  await this.emit("jobEnd", {
316
316
  finalResult,
317
317
  inPayloads,
318
- module: this
318
+ mod: this
319
319
  });
320
320
  return finalResult;
321
321
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, Payload[]>> {\n await this.emit('jobStart', { inPayloads, module: 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.module)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, module: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, module: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.module)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, module: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, module: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.module)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, module: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, module: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, module: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["fulfilled","rejected","asDivinerInstance","AbstractSentinel","asSentinelInstance","SentinelConfigSchema","asWitnessInstance","assertEx","forget","PayloadBuilder","isSentinelIntervalAutomation","PayloadWrapper","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","module","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}
1
+ {"version":3,"sources":["../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.mod)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, mod: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, mod: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.mod)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, mod: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, mod: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.mod)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, mod: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["fulfilled","rejected","asDivinerInstance","AbstractSentinel","asSentinelInstance","SentinelConfigSchema","asWitnessInstance","assertEx","forget","PayloadBuilder","isSentinelIntervalAutomation","PayloadWrapper","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","mod","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}
@@ -255,7 +255,7 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
255
255
  async runJob(tasks, previousResults, inPayloads) {
256
256
  await this.emit("jobStart", {
257
257
  inPayloads,
258
- module: this
258
+ mod: this
259
259
  });
260
260
  this.logger?.debug(`runJob:tasks: ${JSON.stringify(tasks.length)}`);
261
261
  this.logger?.debug(`runJob:previous: ${JSON.stringify(previousResults)}`);
@@ -263,19 +263,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
263
263
  const results = await Promise.allSettled(tasks?.map(async (task) => {
264
264
  const input = task.input ?? false;
265
265
  const inPayloadsFound = input === true ? inPayloads : input === false ? [] : this.processPreviousResults(previousResults, await this.inputAddresses(input));
266
- const witness = (0, import_witness_model.asWitnessInstance)(task.module);
266
+ const witness = (0, import_witness_model.asWitnessInstance)(task.mod);
267
267
  if (witness) {
268
268
  await this.emit("taskStart", {
269
269
  address: witness.address,
270
270
  inPayloads: inPayloadsFound,
271
- module: this
271
+ mod: this
272
272
  });
273
273
  const observed = await witness.observe(inPayloadsFound);
274
274
  this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`);
275
275
  await this.emit("taskEnd", {
276
276
  address: witness.address,
277
277
  inPayloads: inPayloadsFound,
278
- module: this,
278
+ mod: this,
279
279
  outPayloads: observed
280
280
  });
281
281
  return [
@@ -283,19 +283,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
283
283
  observed
284
284
  ];
285
285
  }
286
- const diviner = (0, import_diviner_model.asDivinerInstance)(task.module);
286
+ const diviner = (0, import_diviner_model.asDivinerInstance)(task.mod);
287
287
  if (diviner) {
288
288
  await this.emit("taskStart", {
289
289
  address: diviner.address,
290
290
  inPayloads: inPayloadsFound,
291
- module: this
291
+ mod: this
292
292
  });
293
293
  const divined = await diviner.divine(inPayloadsFound);
294
294
  this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`);
295
295
  await this.emit("taskEnd", {
296
296
  address: diviner.address,
297
297
  inPayloads: inPayloadsFound,
298
- module: this,
298
+ mod: this,
299
299
  outPayloads: divined
300
300
  });
301
301
  return [
@@ -303,19 +303,19 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
303
303
  divined
304
304
  ];
305
305
  }
306
- const sentinel = (0, import_sentinel_model2.asSentinelInstance)(task.module);
306
+ const sentinel = (0, import_sentinel_model2.asSentinelInstance)(task.mod);
307
307
  if (sentinel) {
308
308
  await this.emit("taskStart", {
309
309
  address: sentinel.address,
310
310
  inPayloads: inPayloadsFound,
311
- module: this
311
+ mod: this
312
312
  });
313
313
  const reported = await sentinel.report(inPayloadsFound);
314
314
  this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`);
315
315
  await this.emit("taskEnd", {
316
316
  address: sentinel.address,
317
317
  inPayloads: inPayloadsFound,
318
- module: this,
318
+ mod: this,
319
319
  outPayloads: reported
320
320
  });
321
321
  return [
@@ -341,7 +341,7 @@ var MemorySentinel = class extends import_sentinel_abstract.AbstractSentinel {
341
341
  await this.emit("jobEnd", {
342
342
  finalResult,
343
343
  inPayloads,
344
- module: this
344
+ mod: this
345
345
  });
346
346
  return finalResult;
347
347
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["export * from './MemorySentinel'\nexport * from './SentinelIntervalAutomationWrapper'\nexport * from './SentinelRunner'\n","import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, Payload[]>> {\n await this.emit('jobStart', { inPayloads, module: 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.module)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, module: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, module: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.module)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, module: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, module: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.module)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, module: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, module: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, module: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["import_sentinel_model","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","module","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/MemorySentinel.ts","../../src/SentinelRunner.ts","../../src/SentinelIntervalAutomationWrapper.ts"],"sourcesContent":["export * from './MemorySentinel'\nexport * from './SentinelIntervalAutomationWrapper'\nexport * from './SentinelRunner'\n","import { Address } from '@xylabs/hex'\nimport { fulfilled, rejected } from '@xylabs/promise'\nimport { asDivinerInstance } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, ModuleIdentifier } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { AbstractSentinel } from '@xyo-network/sentinel-abstract'\nimport {\n asSentinelInstance,\n ResolvedTask,\n SentinelConfig,\n SentinelConfigSchema,\n SentinelInstance,\n SentinelModuleEventData,\n SentinelParams,\n} from '@xyo-network/sentinel-model'\nimport { asWitnessInstance } from '@xyo-network/witness-model'\n\nimport { SentinelRunner } from './SentinelRunner'\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.started('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<Address, 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 start(timeout?: number | undefined): Promise<boolean> {\n if (await super.start(timeout)) {\n if ((this.config.automations?.length ?? 0) > 0) {\n this.runner = new SentinelRunner(this, this.config.automations)\n this.runner.start()\n }\n return true\n }\n return false\n }\n\n override async stop(timeout?: number | undefined): Promise<boolean> {\n if (this.runner) {\n this.runner.stop()\n this.runner = undefined\n }\n return await super.stop(timeout)\n }\n\n private async inputAddresses(input: ModuleIdentifier | ModuleIdentifier[]): Promise<Address[]> {\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<Address, Payload[]>,\n inPayloads?: Payload[],\n ): Promise<Record<Address, 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<[Address, Payload[]]>[] = await Promise.allSettled(\n tasks?.map(async (task) => {\n const input = task.input ?? false\n const inPayloadsFound =\n input === true ? inPayloads\n : input === false ? []\n : this.processPreviousResults(previousResults, await this.inputAddresses(input))\n const witness = asWitnessInstance(task.mod)\n if (witness) {\n await this.emit('taskStart', { address: witness.address, inPayloads: inPayloadsFound, mod: this })\n const observed = await witness.observe(inPayloadsFound)\n this.logger?.debug(`observed [${witness.id}]: ${JSON.stringify(observed)}`)\n await this.emit('taskEnd', { address: witness.address, inPayloads: inPayloadsFound, mod: this, outPayloads: observed })\n return [witness.address, observed]\n }\n const diviner = asDivinerInstance(task.mod)\n if (diviner) {\n await this.emit('taskStart', { address: diviner.address, inPayloads: inPayloadsFound, mod: this })\n const divined = await diviner.divine(inPayloadsFound)\n this.logger?.debug(`divined [${diviner.id}]: ${JSON.stringify(divined)}`)\n await this.emit('taskEnd', { address: diviner.address, inPayloads: inPayloadsFound, mod: this, outPayloads: divined })\n return [diviner.address, divined]\n }\n const sentinel = asSentinelInstance(task.mod)\n if (sentinel) {\n await this.emit('taskStart', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this })\n const reported = await sentinel.report(inPayloadsFound)\n this.logger?.debug(`reported [${sentinel.id}]: ${JSON.stringify(reported)}`)\n await this.emit('taskEnd', { address: sentinel.address, inPayloads: inPayloadsFound, mod: this, outPayloads: reported })\n return [sentinel.address, reported]\n }\n throw new Error('Unsupported module type')\n }),\n )\n const finalResult: Record<Address, 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 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', { finalResult, inPayloads, mod: this })\n return finalResult\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n isSentinelIntervalAutomation,\n SentinelAutomationPayload,\n SentinelInstance,\n SentinelIntervalAutomationPayload,\n} from '@xyo-network/sentinel-model'\n\nimport { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper'\n\nexport type OnSentinelRunnerTriggerResult = (result: Payload[]) => void\n\nexport class SentinelRunner {\n protected _automations: Record<string, SentinelAutomationPayload> = {}\n protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined\n protected sentinel: SentinelInstance\n protected timeoutId?: NodeJS.Timeout | string | number\n\n constructor(sentinel: SentinelInstance, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult) {\n this.sentinel = sentinel\n this.onTriggerResult = onTriggerResult\n if (automations) for (const automation of automations) forget(this.add(automation))\n }\n\n get automations() {\n return this._automations\n }\n\n private get next() {\n // eslint-disable-next-line unicorn/no-array-reduce\n return Object.values(this._automations).reduce<SentinelAutomationPayload | undefined>((previous, current) => {\n if (isSentinelIntervalAutomation(current) && isSentinelIntervalAutomation(previous)) {\n return current.start < (previous?.start ?? Number.POSITIVE_INFINITY) ? current : previous\n }\n return current\n // eslint-disable-next-line unicorn/no-useless-undefined\n }, undefined)\n }\n\n async add(automation: SentinelAutomationPayload, restart = true) {\n const hash = await PayloadBuilder.dataHash(automation)\n this._automations[hash] = automation\n if (restart) await this.restart()\n return hash\n }\n\n find(hash: string) {\n Object.entries(this._automations).find(([key]) => key === hash)\n }\n\n async remove(hash: string, restart = true) {\n delete this._automations[hash]\n if (restart) await this.restart()\n }\n\n removeAll() {\n this.stop()\n this._automations = {}\n }\n\n restart() {\n this.stop()\n this.start()\n }\n\n start() {\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 try {\n // Run the automation\n await this.trigger(automation)\n this.stop()\n } finally {\n // No matter what start the next automation\n this.start()\n }\n }, delay)\n }\n }\n }\n\n stop() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId)\n this.timeoutId = undefined\n }\n }\n\n async update(hash: string, automation: SentinelAutomationPayload, restart = true) {\n await this.remove(hash, false)\n await this.add(automation, false)\n if (restart) await this.restart()\n }\n\n private async trigger(automation: SentinelIntervalAutomationPayload) {\n const wrapper = new SentinelIntervalAutomationWrapper(automation)\n await 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 // await this.start()\n }\n}\n","import { PayloadWrapper } from '@xyo-network/payload-wrapper'\nimport { SentinelIntervalAutomationPayload } from '@xyo-network/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() {\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 '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() {\n return this.payload.remaining ?? Number.POSITIVE_INFINITY\n }\n\n next() {\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() {\n if (this.payload.start > (this.payload.end ?? Number.POSITIVE_INFINITY)) {\n this.setStart(Number.POSITIVE_INFINITY)\n }\n }\n\n protected consumeRemaining(count = 1) {\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) {\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) {\n this.payload.start = start\n }\n}\n"],"mappings":"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","names":["import_sentinel_model","SentinelIntervalAutomationWrapper","PayloadWrapper","constructor","payload","frequencyMillis","frequency","undefined","Number","POSITIVE_INFINITY","frequencyUnits","remaining","next","now","Date","previousStart","start","Math","max","nextStart","setStart","consumeRemaining","checkEnd","end","count","setRemaining","SentinelRunner","_automations","onTriggerResult","sentinel","timeoutId","constructor","automations","automation","forget","add","next","Object","values","reduce","previous","current","isSentinelIntervalAutomation","start","Number","POSITIVE_INFINITY","undefined","restart","hash","PayloadBuilder","dataHash","find","entries","key","remove","removeAll","stop","assertEx","now","Date","Math","max","delay","setTimeout","trigger","clearTimeout","update","wrapper","SentinelIntervalAutomationWrapper","payload","triggerResult","report","MemorySentinel","AbstractSentinel","configSchemas","SentinelConfigSchema","defaultConfigSchema","runner","reportHandler","inPayloads","started","logger","debug","JSON","stringify","job","jobPromise","index","previousResults","tasks","length","generatedPayloads","runJob","result","Object","values","flat","start","timeout","config","automations","SentinelRunner","stop","undefined","inputAddresses","input","Array","isArray","Promise","all","map","inputItem","resolved","resolve","address","processPreviousResults","payloads","inputs","flatMap","emit","mod","results","allSettled","task","inPayloadsFound","witness","asWitnessInstance","observed","observe","id","outPayloads","diviner","asDivinerInstance","divined","divine","sentinel","asSentinelInstance","reported","report","Error","finalResult","filter","fulfilled","value","push","throwErrors","errors","rejected","reason"]}