@xyo-network/sentinel-abstract 2.89.0-rc.6 → 2.89.0-rc.8
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.
- package/dist/browser/index.cjs +2 -2
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +2 -2
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +2 -2
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +2 -2
- package/dist/node/index.js.map +1 -1
- package/package.json +9 -9
- package/src/AbstractSentinel.ts +2 -2
package/dist/browser/index.cjs
CHANGED
|
@@ -98,7 +98,7 @@ var AbstractSentinel = class extends import_module_abstract.AbstractModuleInstan
|
|
|
98
98
|
};
|
|
99
99
|
let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
|
|
100
100
|
input: task.input ?? false,
|
|
101
|
-
module: (0, import_assert.assertEx)(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`)
|
|
101
|
+
module: (0, import_assert.assertEx)(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
|
|
102
102
|
})));
|
|
103
103
|
while (tasks.length > 0) {
|
|
104
104
|
const previousTasks = job.tasks.at(-1) ?? [];
|
|
@@ -127,7 +127,7 @@ var AbstractSentinel = class extends import_module_abstract.AbstractModuleInstan
|
|
|
127
127
|
}
|
|
128
128
|
return true;
|
|
129
129
|
});
|
|
130
|
-
(0, import_assert.assertEx)(newList.length > 0, `Unable to generateJob [${tasks.length}]`);
|
|
130
|
+
(0, import_assert.assertEx)(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
|
|
131
131
|
job.tasks.push(newList);
|
|
132
132
|
tasks = tasks.filter((task) => !newList.includes(task));
|
|
133
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AACvB,kCAA8D;AAC9D,gCAAiF;AACjF,6BAAuC;AAGvC,4BASO;AAEA,IAAeA,mBAAf,cAIGC,8CAAAA;EAtBV,OAsBUA;;;EAGRC,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAkE;AACvF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,gDAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,gCAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,iBAAiBZ,UAAUa,OAAOC,wCAAAA,KAAmB,CAAA;AAC3D,UAAMC,cAAcf,UAAUa,OAAOG,yCAAAA,KAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,YAAQ+B,wBAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["AbstractSentinel","AbstractModuleInstance","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","schema"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -74,7 +74,7 @@ var AbstractSentinel = class extends AbstractModuleInstance {
|
|
|
74
74
|
};
|
|
75
75
|
let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
|
|
76
76
|
input: task.input ?? false,
|
|
77
|
-
module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`)
|
|
77
|
+
module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
|
|
78
78
|
})));
|
|
79
79
|
while (tasks.length > 0) {
|
|
80
80
|
const previousTasks = job.tasks.at(-1) ?? [];
|
|
@@ -103,7 +103,7 @@ var AbstractSentinel = class extends AbstractModuleInstance {
|
|
|
103
103
|
}
|
|
104
104
|
return true;
|
|
105
105
|
});
|
|
106
|
-
assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`);
|
|
106
|
+
assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
|
|
107
107
|
job.tasks.push(newList);
|
|
108
108
|
tasks = tasks.filter((task) => !newList.includes(task));
|
|
109
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,cAAc;AACvB,SAASC,qBAAqBC,gCAAgC;AAC9D,SAAuBC,gBAAgBC,uBAA0C;AACjF,SAASC,8BAA8B;AAGvC,SAQEC,iCACK;AAEA,IAAeC,mBAAf,cAIGC,uBAAAA;EAtBV,OAsBUA;;;EAGRC,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAkE;AACvF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,oBAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,aAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,iBAAiBZ,UAAUa,OAAOC,cAAAA,KAAmB,CAAA;AAC3D,UAAMC,cAAcf,UAAUa,OAAOG,eAAAA,KAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,QAAQ+B,SAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["assertEx","forget","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","SentinelReportQuerySchema","AbstractSentinel","AbstractModuleInstance","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","schema"]}
|
package/dist/node/index.cjs
CHANGED
|
@@ -95,7 +95,7 @@ var _AbstractSentinel = class _AbstractSentinel extends import_module_abstract.A
|
|
|
95
95
|
};
|
|
96
96
|
let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
|
|
97
97
|
input: task.input ?? false,
|
|
98
|
-
module: (0, import_assert.assertEx)(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`)
|
|
98
|
+
module: (0, import_assert.assertEx)(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
|
|
99
99
|
})));
|
|
100
100
|
while (tasks.length > 0) {
|
|
101
101
|
const previousTasks = job.tasks.at(-1) ?? [];
|
|
@@ -124,7 +124,7 @@ var _AbstractSentinel = class _AbstractSentinel extends import_module_abstract.A
|
|
|
124
124
|
}
|
|
125
125
|
return true;
|
|
126
126
|
});
|
|
127
|
-
(0, import_assert.assertEx)(newList.length > 0, `Unable to generateJob [${tasks.length}]`);
|
|
127
|
+
(0, import_assert.assertEx)(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
|
|
128
128
|
job.tasks.push(newList);
|
|
129
129
|
tasks = tasks.filter((task) => !newList.includes(task));
|
|
130
130
|
}
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;ACAA,oBAAyB;AACzB,oBAAuB;AACvB,kCAA8D;AAC9D,gCAAiF;AACjF,6BAAuC;AAGvC,4BASO;AAEA,IAAeA,oBAAf,MAAeA,0BAIZC,8CAAAA;EAGRC,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAkE;AACvF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,gDAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,gCAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,kBAAiBZ,qCAAUa,OAAOC,8CAAmB,CAAA;AAC3D,UAAMC,eAAcf,qCAAUa,OAAOG,+CAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,YAAQ+B,wBAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/AbstractSentinel.ts"],"sourcesContent":["export * from './AbstractSentinel'\n","import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["AbstractSentinel","AbstractModuleInstance","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","schema"]}
|
package/dist/node/index.js
CHANGED
|
@@ -71,7 +71,7 @@ var _AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
|
|
|
71
71
|
};
|
|
72
72
|
let tasks = await Promise.all(this.config.tasks.map(async (task) => ({
|
|
73
73
|
input: task.input ?? false,
|
|
74
|
-
module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`)
|
|
74
|
+
module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`)
|
|
75
75
|
})));
|
|
76
76
|
while (tasks.length > 0) {
|
|
77
77
|
const previousTasks = job.tasks.at(-1) ?? [];
|
|
@@ -100,7 +100,7 @@ var _AbstractSentinel = class _AbstractSentinel extends AbstractModuleInstance {
|
|
|
100
100
|
}
|
|
101
101
|
return true;
|
|
102
102
|
});
|
|
103
|
-
assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`);
|
|
103
|
+
assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`);
|
|
104
104
|
job.tasks.push(newList);
|
|
105
105
|
tasks = tasks.filter((task) => !newList.includes(task));
|
|
106
106
|
}
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":";;;;AAAA,SAASA,gBAAgB;AACzB,SAASC,cAAc;AACvB,SAASC,qBAAqBC,gCAAgC;AAC9D,SAAuBC,gBAAgBC,uBAA0C;AACjF,SAASC,8BAA8B;AAGvC,SAQEC,iCACK;AAEA,IAAeC,oBAAf,MAAeA,0BAIZC,uBAAAA;EAGRC,UAA0B,CAAA;EAClBC;EAER,IAAIC,aAAa;AACf,SAAKD,cAAc,KAAKA,eAAe,KAAKE,YAAW;AACvD,WAAO,KAAKF;EACd;EAEA,IAAaG,UAAoB;AAC/B,WAAO;MAACC;SAA8B,MAAMD;;EAC9C;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKC,OAAOD,eAAe;EACpC;EAEA,IAAIE,cAAuB;AACzB,WAAO,KAAKD,OAAOC,eAAe;EACpC;EAEA,IAAuBC,qBAAkE;AACvF,WAAO;MACL,qCAAqC;IACvC;EACF;EAEA,MAAMC,OAAOC,YAA4C;AACvD,SAAKC,YAAY,QAAA;AACjB,UAAMC,iBAAiB,YAAA;AACrB,YAAM,KAAKC,KAAK,eAAe;QAAEH;QAAYI,QAAQ;MAAK,CAAA;AAC1D,YAAMC,WAAW,MAAM,KAAKC,cAAcN,UAAAA;AAG1C,YAAMO,UAAU,OAAO,MAAM,IAAIC,oBAAAA,EAAsBH,SAASA,QAAAA,GAAWI,QAAQ,KAAKC,OAAO,EAAEC,MAAK,GAAIC,KAAI;AAE9G,UAAI,KAAKhB,OAAOiB,WAAW;AACzB,cAAM,KAAKC,kBAAkBP,MAAAA;MAC/B;AAEA,YAAM,KAAKQ,cAAcf,YAAYO,MAAAA;AACrC,aAAOA;IACT,GAAA;AACA,QAAI,KAAKZ,aAAa;AACpB,aAAO,MAAMO;IACf,OAAO;AACLc,aAAOd,aAAAA;AACP,aAAO,CAAA;IACT;EACF;EAEA,MAAgBa,cAAcf,YAAwBK,UAAsB;AAC1E,UAAMY,kBAAiBZ,qCAAUa,OAAOC,oBAAmB,CAAA;AAC3D,UAAMC,eAAcf,qCAAUa,OAAOG,qBAAoB,CAAA;AACzD,UAAMC,eAAeL,eAAeM,KAAK,CAACC,OAAOA,GAAGC,UAAUC,SAAS,KAAKC,OAAO,CAAA;AACnF,UAAM,KAAKxB,KAAK,aAAa;MAAEmB;MAActB;MAAYI,QAAQ;MAAMgB;IAAY,CAAA;EACrF;EAEA,MAAgB5B,cAAc;AAC5B,UAAMoC,MAAmB;MAAEC,OAAO,CAAA;IAAG;AACrC,QAAIA,QAAwB,MAAMC,QAAQC,IACxC,KAAKnC,OAAOiC,MAAMG,IAAI,OAAOC,UAAU;MACrCC,OAAOD,KAAKC,SAAS;MACrB9B,QAAQ+B,SAAS,MAAM,KAAKC,QAAQH,KAAK7B,MAAM,GAAG,kCAAkC6B,KAAK7B,MAAM,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../src/AbstractSentinel.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { forget } from '@xylabs/forget'\nimport { BoundWitnessBuilder, QueryBoundWitnessWrapper } from '@xyo-network/boundwitness-builder'\nimport { BoundWitness, isBoundWitness, notBoundWitness, QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { AbstractModuleInstance } from '@xyo-network/module-abstract'\nimport { ModuleConfig, ModuleQueryHandlerResult } from '@xyo-network/module-model'\nimport { Payload } from '@xyo-network/payload-model'\nimport {\n CustomSentinelInstance,\n ResolvedTask,\n SentinelInstance,\n SentinelJob,\n SentinelModuleEventData,\n SentinelParams,\n SentinelQueryBase,\n SentinelReportQuerySchema,\n} from '@xyo-network/sentinel-model'\n\nexport abstract class AbstractSentinel<\n TParams extends SentinelParams = SentinelParams,\n TEventData extends SentinelModuleEventData<SentinelInstance<TParams>> = SentinelModuleEventData<SentinelInstance<TParams>>,\n >\n extends AbstractModuleInstance<TParams, TEventData>\n implements CustomSentinelInstance<TParams, TEventData>\n{\n history: BoundWitness[] = []\n private _jobPromise?: Promise<SentinelJob>\n\n get jobPromise() {\n this._jobPromise = this._jobPromise ?? this.generateJob()\n return this._jobPromise\n }\n\n override get queries(): string[] {\n return [SentinelReportQuerySchema, ...super.queries]\n }\n\n get synchronous(): boolean {\n return this.config.synchronous ?? false\n }\n\n get throwErrors(): boolean {\n return this.config.throwErrors ?? true\n }\n\n protected override get _queryAccountPaths(): Record<SentinelQueryBase['schema'], string> {\n return {\n 'network.xyo.query.sentinel.report': '1/1',\n }\n }\n\n async report(inPayloads?: Payload[]): Promise<Payload[]> {\n this._noOverride('report')\n const reportPromise = (async () => {\n await this.emit('reportStart', { inPayloads, module: this })\n const payloads = await this.reportHandler(inPayloads)\n\n //create boundwitness\n const result = (await (await new BoundWitnessBuilder().payloads(payloads)).witness(this.account).build()).flat()\n\n if (this.config.archiving) {\n await this.storeToArchivists(result)\n }\n\n await this.emitReportEnd(inPayloads, result)\n return result\n })()\n if (this.synchronous) {\n return await reportPromise\n } else {\n forget(reportPromise)\n return []\n }\n }\n\n protected async emitReportEnd(inPayloads?: Payload[], payloads?: Payload[]) {\n const boundwitnesses = payloads?.filter(isBoundWitness) ?? []\n const outPayloads = payloads?.filter(notBoundWitness) ?? []\n const boundwitness = boundwitnesses.find((bw) => bw.addresses.includes(this.address))\n await this.emit('reportEnd', { boundwitness, inPayloads, module: this, outPayloads })\n }\n\n protected async generateJob() {\n const job: SentinelJob = { tasks: [] }\n let tasks: ResolvedTask[] = await Promise.all(\n this.config.tasks.map(async (task) => ({\n input: task.input ?? false,\n module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),\n })),\n )\n while (tasks.length > 0) {\n const previousTasks = job.tasks.at(-1) ?? []\n const newListCandidates =\n //add all tasks that either require no previous input or have the previous input module already added\n tasks.filter((task) => {\n const input = task.input\n if (input === undefined) {\n return true\n }\n if (typeof input === 'boolean') {\n return true\n }\n if (typeof input === 'string') {\n return previousTasks.find((prevTask) => prevTask.module.address === input || prevTask.module.config.name === input)\n }\n if (Array.isArray(input)) {\n return previousTasks.find(\n (prevTask) => input.includes(prevTask.module.address) || input.includes(prevTask.module.config.name ?? prevTask.module.address),\n )\n }\n })\n //remove any tasks that have inputs that are in the current list or the remaining tasks\n const newList = newListCandidates.filter((taskCandidate) => {\n const input = taskCandidate.input\n if (\n Array.isArray(input) &&\n tasks.some(\n (remainingTask) =>\n input.includes(remainingTask.module.address) || input.includes(remainingTask.module.config.name ?? remainingTask.module.address),\n )\n ) {\n return false\n }\n return true\n })\n assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)\n job.tasks.push(newList)\n //remove the tasks we just added\n tasks = tasks.filter((task) => !newList.includes(task))\n }\n return job\n }\n\n protected override async queryHandler<T extends QueryBoundWitness = QueryBoundWitness, TConfig extends ModuleConfig = ModuleConfig>(\n query: T,\n payloads?: Payload[],\n queryConfig?: TConfig,\n ): Promise<ModuleQueryHandlerResult> {\n const wrapper = await QueryBoundWitnessWrapper.parseQuery<SentinelQueryBase>(query, payloads)\n const queryPayload = await wrapper.getQuery()\n assertEx(await this.queryable(query, payloads, queryConfig))\n const resultPayloads: Payload[] = []\n switch (queryPayload.schema) {\n case SentinelReportQuerySchema: {\n resultPayloads.push(...(await this.report(payloads)))\n break\n }\n default: {\n return super.queryHandler(query, payloads)\n }\n }\n return resultPayloads\n }\n\n abstract reportHandler(payloads?: Payload[]): Promise<Payload[]>\n}\n"],"mappings":"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","names":["assertEx","forget","BoundWitnessBuilder","QueryBoundWitnessWrapper","isBoundWitness","notBoundWitness","AbstractModuleInstance","SentinelReportQuerySchema","AbstractSentinel","AbstractModuleInstance","history","_jobPromise","jobPromise","generateJob","queries","SentinelReportQuerySchema","synchronous","config","throwErrors","_queryAccountPaths","report","inPayloads","_noOverride","reportPromise","emit","module","payloads","reportHandler","result","BoundWitnessBuilder","witness","account","build","flat","archiving","storeToArchivists","emitReportEnd","forget","boundwitnesses","filter","isBoundWitness","outPayloads","notBoundWitness","boundwitness","find","bw","addresses","includes","address","job","tasks","Promise","all","map","task","input","assertEx","resolve","length","previousTasks","at","newListCandidates","undefined","prevTask","name","Array","isArray","newList","taskCandidate","some","remainingTask","push","queryHandler","query","queryConfig","wrapper","QueryBoundWitnessWrapper","parseQuery","queryPayload","getQuery","queryable","resultPayloads","schema"]}
|
package/package.json
CHANGED
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/assert": "^2.
|
|
14
|
-
"@xylabs/forget": "^2.
|
|
15
|
-
"@xyo-network/boundwitness-builder": "~2.89.0-rc.
|
|
16
|
-
"@xyo-network/boundwitness-model": "~2.89.0-rc.
|
|
17
|
-
"@xyo-network/module-abstract": "~2.89.0-rc.
|
|
18
|
-
"@xyo-network/module-model": "~2.89.0-rc.
|
|
19
|
-
"@xyo-network/payload-model": "~2.89.0-rc.
|
|
20
|
-
"@xyo-network/sentinel-model": "~2.89.0-rc.
|
|
13
|
+
"@xylabs/assert": "^2.14.0",
|
|
14
|
+
"@xylabs/forget": "^2.14.0",
|
|
15
|
+
"@xyo-network/boundwitness-builder": "~2.89.0-rc.8",
|
|
16
|
+
"@xyo-network/boundwitness-model": "~2.89.0-rc.8",
|
|
17
|
+
"@xyo-network/module-abstract": "~2.89.0-rc.8",
|
|
18
|
+
"@xyo-network/module-model": "~2.89.0-rc.8",
|
|
19
|
+
"@xyo-network/payload-model": "~2.89.0-rc.8",
|
|
20
|
+
"@xyo-network/sentinel-model": "~2.89.0-rc.8"
|
|
21
21
|
},
|
|
22
22
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
23
23
|
"devDependencies": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
|
|
64
64
|
},
|
|
65
65
|
"sideEffects": false,
|
|
66
|
-
"version": "2.89.0-rc.
|
|
66
|
+
"version": "2.89.0-rc.8",
|
|
67
67
|
"type": "module",
|
|
68
68
|
"stableVersion": "2.88.3"
|
|
69
69
|
}
|
package/src/AbstractSentinel.ts
CHANGED
|
@@ -85,7 +85,7 @@ export abstract class AbstractSentinel<
|
|
|
85
85
|
let tasks: ResolvedTask[] = await Promise.all(
|
|
86
86
|
this.config.tasks.map(async (task) => ({
|
|
87
87
|
input: task.input ?? false,
|
|
88
|
-
module: assertEx(await this.resolve(task.module), `Unable to resolve task module [${task.module}]`),
|
|
88
|
+
module: assertEx(await this.resolve(task.module), () => `Unable to resolve task module [${task.module}]`),
|
|
89
89
|
})),
|
|
90
90
|
)
|
|
91
91
|
while (tasks.length > 0) {
|
|
@@ -123,7 +123,7 @@ export abstract class AbstractSentinel<
|
|
|
123
123
|
}
|
|
124
124
|
return true
|
|
125
125
|
})
|
|
126
|
-
assertEx(newList.length > 0, `Unable to generateJob [${tasks.length}]`)
|
|
126
|
+
assertEx(newList.length > 0, () => `Unable to generateJob [${tasks.length}]`)
|
|
127
127
|
job.tasks.push(newList)
|
|
128
128
|
//remove the tasks we just added
|
|
129
129
|
tasks = tasks.filter((task) => !newList.includes(task))
|