@xyo-network/sentinel-abstract 3.18.2 → 3.18.4

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.
@@ -26,7 +26,7 @@ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
26
26
  return [SentinelReportQuerySchema, ...super.queries];
27
27
  }
28
28
  get synchronous() {
29
- return this.config.synchronous ?? false;
29
+ return this.config.synchronous ?? true;
30
30
  }
31
31
  get throwErrors() {
32
32
  return this.config.throwErrors ?? true;
@@ -35,29 +35,30 @@ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
35
35
  this._noOverride("report");
36
36
  this.isSupportedQuery(SentinelReportQuerySchema, "report");
37
37
  return await spanAsync("report", async () => {
38
- if (this.reentrancy?.scope === "global" && this.reentrancy.action === "skip" && this.globalReentrancyMutex?.isLocked()) {
39
- return [];
40
- }
41
- try {
42
- await this.globalReentrancyMutex?.acquire();
43
- const reportPromise = (async () => {
38
+ const reportPromise = (async () => {
39
+ if (this.reentrancy?.scope === "global" && this.reentrancy?.action === "skip" && this.globalReentrancyMutex?.isLocked()) {
40
+ console.warn(`Skipping report for ${this.id} due to global reentrancy lock`);
41
+ return [];
42
+ }
43
+ try {
44
+ await this.globalReentrancyMutex?.acquire();
44
45
  await this.emit("reportStart", { inPayloads, mod: this });
45
46
  const payloads = await this.reportHandler(inPayloads);
46
47
  const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat();
47
48
  if (this.config.archiving) {
48
- forget(this.storeToArchivists(result));
49
+ forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` });
49
50
  }
50
51
  await this.emitReportEnd(inPayloads, result);
51
52
  return result;
52
- })();
53
- if (this.synchronous) {
54
- return await reportPromise;
55
- } else {
56
- forget(reportPromise);
57
- return [];
53
+ } finally {
54
+ this.globalReentrancyMutex?.release();
58
55
  }
59
- } finally {
60
- this.globalReentrancyMutex?.release();
56
+ })();
57
+ if (this.synchronous) {
58
+ return await reportPromise;
59
+ } else {
60
+ forget(reportPromise, { name: `AbstractSentinel.report [${this.id}]` });
61
+ return [];
61
62
  }
62
63
  }, this.tracer);
63
64
  }
@@ -97,13 +98,14 @@ var AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
97
98
  return true;
98
99
  }
99
100
  if (typeof input === "string") {
100
- return previousTasks.find((prevTask) => prevTask.mod.address === input || prevTask.mod.modName === input);
101
+ return previousTasks.some((prevTask) => prevTask.mod.address === input || prevTask.mod.modName === input);
101
102
  }
102
103
  if (Array.isArray(input)) {
103
- return previousTasks.find(
104
+ return previousTasks.some(
104
105
  (prevTask) => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address)
105
106
  );
106
107
  }
108
+ return false;
107
109
  });
108
110
  const newList = newListCandidates.filter((taskCandidate) => {
109
111
  const input = taskCandidate.input;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { globallyUnique } from '@xylabs/base'\nimport { forget } from '@xylabs/forget'\nimport { spanAsync } from '@xylabs/telemetry'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness, notBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport type {\n ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithoutPrivateStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n AttachableSentinelInstance,\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n} from '@xyo-network/sentinel-model'\nimport {\n SentinelConfigSchema,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n>\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>, AttachableSentinelInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<WithoutPrivateStorageMeta<Payload>[]> {\n this._noOverride('report')\n this.isSupportedQuery(SentinelReportQuerySchema, 'report')\n return await spanAsync('report', async () => {\n if (this.reentrancy?.scope === 'global' && this.reentrancy.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {\n return []\n }\n try {\n await this.globalReentrancyMutex?.acquire()\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, mod: this })\n const payloads = await this.reportHandler(inPayloads)\n\n // create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result))\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n } finally {\n this.globalReentrancyMutex?.release()\n }\n }, this.tracer)\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n this._noOverride('reportQuery')\n this.isSupportedQuery(SentinelReportQuerySchema, 'reportQuery')\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find(bw => bw.addresses.includes(this.address))\n await this.emit('reportEnd', {\n boundwitness, inPayloads, mod: this, outPayloads,\n })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async task => ({\n input: task.input ?? false,\n mod: assertEx(await this.resolve(task.mod), () => `Unable to resolve task module [${task.mod}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates\n // add all tasks that either require no previous input or have the previous input module already added\n = tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n prevTask => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address),\n )\n }\n })\n // remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n return !(\n Array.isArray(input)\n && tasks.some(\n remainingTask => input.includes(remainingTask.mod.address) || input.includes(remainingTask.mod.modName ?? remainingTask.mod.address),\n )\n )\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n // remove the tasks we just added\n tasks = tasks.filter(task => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return PayloadBuilder.omitPrivateStorageMeta(resultPayloads)\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { globallyUnique } from '@xylabs/base'\nimport { forget } from '@xylabs/forget'\nimport { spanAsync } from '@xylabs/telemetry'\nimport type { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitnessBuilder } from '@xyo-network/boundwitness-builder'\nimport type { BoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness, notBoundWitness } from '@xyo-network/boundwitness-model'\nimport { QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport type {\n ModuleConfig, ModuleQueryHandlerResult, ModuleQueryResult,\n} from '@xyo-network/module-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, Schema, WithoutPrivateStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n AttachableSentinelInstance,\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueries,\n SentinelReportQuery,\n} from '@xyo-network/sentinel-model'\nimport {\n SentinelConfigSchema,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n>\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>, AttachableSentinelInstance<TParams, TEventData> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, SentinelConfigSchema]\n static override readonly defaultConfigSchema: Schema = SentinelConfigSchema\n static override readonly uniqueName = globallyUnique('AbstractSentinel', AbstractSentinel, 'xyo')\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? true\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n async report(inPayloads?: Payload[]): Promise<WithoutPrivateStorageMeta<Payload>[]> {\n this._noOverride('report')\n this.isSupportedQuery(SentinelReportQuerySchema, 'report')\n return await spanAsync('report', async () => {\n const reportPromise = (async () => {\n if (this.reentrancy?.scope === 'global' && this.reentrancy?.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {\n console.warn(`Skipping report for ${this.id} due to global reentrancy lock`)\n return []\n }\n try {\n await this.globalReentrancyMutex?.acquire()\n await this.emit('reportStart', { inPayloads, mod: this })\n const payloads = await this.reportHandler(inPayloads)\n\n // create boundwitness\n const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()\n\n if (this.config.archiving) {\n forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` })\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n } finally {\n this.globalReentrancyMutex?.release()\n }\n }\n )()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise, { name: `AbstractSentinel.report [${this.id}]` })\n return []\n }\n }, this.tracer)\n }\n\n async reportQuery(payloads?: Payload[], account?: AccountInstance): Promise<ModuleQueryResult> {\n this._noOverride('reportQuery')\n this.isSupportedQuery(SentinelReportQuerySchema, 'reportQuery')\n const queryPayload: SentinelReportQuery = { schema: SentinelReportQuerySchema }\n return await this.sendQueryRaw(queryPayload, payloads, account)\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find(bw => bw.addresses.includes(this.address))\n await this.emit('reportEnd', {\n boundwitness, inPayloads, mod: this, outPayloads,\n })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async task => ({\n input: task.input ?? false,\n mod: assertEx(await this.resolve(task.mod), () => `Unable to resolve task module [${task.mod}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates\n // add all tasks that either require no previous input or have the previous input module already added\n = tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.some(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.some(\n prevTask => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address),\n )\n }\n return false\n })\n // remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n return !(\n Array.isArray(input)\n && tasks.some(\n remainingTask => input.includes(remainingTask.mod.address) || input.includes(remainingTask.mod.modName ?? remainingTask.mod.address),\n )\n )\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n // remove the tasks we just added\n tasks = tasks.filter(task => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = QueryBoundWitnessWrapper.parseQuery<SentinelQueries>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return PayloadBuilder.omitPrivateStorageMeta(resultPayloads)\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractSentinel.d.ts","sourceRoot":"","sources":["../../src/AbstractSentinel.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EACV,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAC1D,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EACV,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAC3C,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EAEtB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,cAAc,EAGf,MAAM,6BAA6B,CAAA;AAMpC,8BAAsB,gBAAgB,CACpC,OAAO,SAAS,cAAc,GAAG,cAAc,EAC/C,UAAU,SAAS,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAE1H,SAAQ,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAClD,YAAW,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC;IACvG,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,UAAU,SAA8D;IACjG,OAAO,EAAE,YAAY,EAAE,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAsB;IAE1C,IAAI,UAAU,yBAGb;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAE/B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;IAmC7E,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;cAO9E,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE;cAS1D,WAAW;cA+CF,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,OAAO,SAAS,YAAY,GAAG,YAAY,EAChI,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,OAAO,EAAE,EACpB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,wBAAwB,CAAC;IAiBpC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CACjE"}
1
+ {"version":3,"file":"AbstractSentinel.d.ts","sourceRoot":"","sources":["../../src/AbstractSentinel.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EACV,YAAY,EAAE,wBAAwB,EAAE,iBAAiB,EAC1D,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EACV,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAC3C,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EAEtB,gBAAgB,EAChB,WAAW,EACX,uBAAuB,EACvB,cAAc,EAGf,MAAM,6BAA6B,CAAA;AAMpC,8BAAsB,gBAAgB,CACpC,OAAO,SAAS,cAAc,GAAG,cAAc,EAC/C,UAAU,SAAS,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAE1H,SAAQ,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAClD,YAAW,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,0BAA0B,CAAC,OAAO,EAAE,UAAU,CAAC;IACvG,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiD;IACjG,gBAAyB,mBAAmB,EAAE,MAAM,CAAuB;IAC3E,gBAAyB,UAAU,SAA8D;IACjG,OAAO,EAAE,YAAY,EAAE,CAAK;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAsB;IAE1C,IAAI,UAAU,yBAGb;IAED,IAAa,OAAO,IAAI,MAAM,EAAE,CAE/B;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;IAqC7E,WAAW,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;cAO9E,aAAa,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE;cAS1D,WAAW;cAgDF,YAAY,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EAAE,OAAO,SAAS,YAAY,GAAG,YAAY,EAChI,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,OAAO,EAAE,EACpB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,wBAAwB,CAAC;IAiBpC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CACjE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/sentinel-abstract",
3
- "version": "3.18.2",
3
+ "version": "3.18.4",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,23 +29,24 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/types/index.d.ts",
31
31
  "dependencies": {
32
- "@xylabs/assert": "^4.11.10",
33
- "@xylabs/base": "^4.11.10",
34
- "@xylabs/forget": "^4.11.10",
35
- "@xylabs/telemetry": "^4.11.10",
36
- "@xyo-network/account-model": "^3.18.2",
37
- "@xyo-network/boundwitness-builder": "^3.18.2",
38
- "@xyo-network/boundwitness-model": "^3.18.2",
39
- "@xyo-network/boundwitness-wrapper": "^3.18.2",
40
- "@xyo-network/module-abstract": "^3.18.2",
41
- "@xyo-network/module-model": "^3.18.2",
42
- "@xyo-network/payload-builder": "^3.18.2",
43
- "@xyo-network/payload-model": "^3.18.2",
44
- "@xyo-network/sentinel-model": "^3.18.2"
32
+ "@xylabs/assert": "^4.11.14",
33
+ "@xylabs/base": "^4.11.14",
34
+ "@xylabs/forget": "^4.11.14",
35
+ "@xylabs/telemetry": "^4.11.14",
36
+ "@xyo-network/account-model": "^3.18.4",
37
+ "@xyo-network/boundwitness-builder": "^3.18.4",
38
+ "@xyo-network/boundwitness-model": "^3.18.4",
39
+ "@xyo-network/boundwitness-wrapper": "^3.18.4",
40
+ "@xyo-network/module-abstract": "^3.18.4",
41
+ "@xyo-network/module-model": "^3.18.4",
42
+ "@xyo-network/payload-builder": "^3.18.4",
43
+ "@xyo-network/payload-model": "^3.18.4",
44
+ "@xyo-network/sentinel-model": "^3.18.4",
45
+ "async-mutex": "^0.2.6"
45
46
  },
46
47
  "devDependencies": {
47
- "@xylabs/ts-scripts-yarn3": "^6.5.7",
48
- "@xylabs/tsconfig": "^6.5.7",
48
+ "@xylabs/ts-scripts-yarn3": "^6.5.8",
49
+ "@xylabs/tsconfig": "^6.5.8",
49
50
  "typescript": "^5.8.3"
50
51
  },
51
52
  "publishConfig": {
@@ -53,7 +53,7 @@ export abstract class AbstractSentinel<
53
53
  }
54
54
 
55
55
  get synchronous(): boolean {
56
- return this.config.synchronous ?? false
56
+ return this.config.synchronous ?? true
57
57
  }
58
58
 
59
59
  get throwErrors(): boolean {
@@ -64,12 +64,13 @@ export abstract class AbstractSentinel<
64
64
  this._noOverride('report')
65
65
  this.isSupportedQuery(SentinelReportQuerySchema, 'report')
66
66
  return await spanAsync('report', async () => {
67
- if (this.reentrancy?.scope === 'global' && this.reentrancy.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {
68
- return []
69
- }
70
- try {
71
- await this.globalReentrancyMutex?.acquire()
72
- const reportPromise = (async () => {
67
+ const reportPromise = (async () => {
68
+ if (this.reentrancy?.scope === 'global' && this.reentrancy?.action === 'skip' && this.globalReentrancyMutex?.isLocked()) {
69
+ console.warn(`Skipping report for ${this.id} due to global reentrancy lock`)
70
+ return []
71
+ }
72
+ try {
73
+ await this.globalReentrancyMutex?.acquire()
73
74
  await this.emit('reportStart', { inPayloads, mod: this })
74
75
  const payloads = await this.reportHandler(inPayloads)
75
76
 
@@ -77,20 +78,21 @@ export abstract class AbstractSentinel<
77
78
  const result = (await new BoundWitnessBuilder().payloads(payloads).signer(this.account).build()).flat()
78
79
 
79
80
  if (this.config.archiving) {
80
- forget(this.storeToArchivists(result))
81
+ forget(this.storeToArchivists(result), { name: `AbstractSentinel.report.storeArchivist [${this.id}]` })
81
82
  }
82
83
 
83
84
  await this.emitReportEnd(inPayloads, result)
84
85
  return result
85
- })()
86
- if (this.synchronous) {
87
- return await reportPromise
88
- } else {
89
- forget(reportPromise)
90
- return []
86
+ } finally {
87
+ this.globalReentrancyMutex?.release()
91
88
  }
92
- } finally {
93
- this.globalReentrancyMutex?.release()
89
+ }
90
+ )()
91
+ if (this.synchronous) {
92
+ return await reportPromise
93
+ } else {
94
+ forget(reportPromise, { name: `AbstractSentinel.report [${this.id}]` })
95
+ return []
94
96
  }
95
97
  }, this.tracer)
96
98
  }
@@ -132,13 +134,14 @@ export abstract class AbstractSentinel<
132
134
  return true
133
135
  }
134
136
  if (typeof input === 'string') {
135
- return previousTasks.find(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)
137
+ return previousTasks.some(prevTask => prevTask.mod.address === input || prevTask.mod.modName === input)
136
138
  }
137
139
  if (Array.isArray(input)) {
138
- return previousTasks.find(
140
+ return previousTasks.some(
139
141
  prevTask => input.includes(prevTask.mod.address) || input.includes(prevTask.mod.modName ?? prevTask.mod.address),
140
142
  )
141
143
  }
144
+ return false
142
145
  })
143
146
  // remove any tasks that have inputs that are in the current list or the remaining tasks
144
147
  const newList = newListCandidates.filter((taskCandidate) => {