@xyo-network/sentinel 2.43.37

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.
Files changed (63) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/cjs/Automation.js +5 -0
  4. package/dist/cjs/Automation.js.map +1 -0
  5. package/dist/cjs/Queries/Report.js +5 -0
  6. package/dist/cjs/Queries/Report.js.map +1 -0
  7. package/dist/cjs/Queries/index.js +5 -0
  8. package/dist/cjs/Queries/index.js.map +1 -0
  9. package/dist/cjs/Sentinel.js +134 -0
  10. package/dist/cjs/Sentinel.js.map +1 -0
  11. package/dist/cjs/SentinelIntervalAutomationWrapper.js +44 -0
  12. package/dist/cjs/SentinelIntervalAutomationWrapper.js.map +1 -0
  13. package/dist/cjs/SentinelModel.js +3 -0
  14. package/dist/cjs/SentinelModel.js.map +1 -0
  15. package/dist/cjs/SentinelRunner.js +102 -0
  16. package/dist/cjs/SentinelRunner.js.map +1 -0
  17. package/dist/cjs/index.js +9 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/docs.json +16084 -0
  20. package/dist/esm/Automation.js +2 -0
  21. package/dist/esm/Automation.js.map +1 -0
  22. package/dist/esm/Queries/Report.js +2 -0
  23. package/dist/esm/Queries/Report.js.map +1 -0
  24. package/dist/esm/Queries/index.js +2 -0
  25. package/dist/esm/Queries/index.js.map +1 -0
  26. package/dist/esm/Sentinel.js +102 -0
  27. package/dist/esm/Sentinel.js.map +1 -0
  28. package/dist/esm/SentinelIntervalAutomationWrapper.js +37 -0
  29. package/dist/esm/SentinelIntervalAutomationWrapper.js.map +1 -0
  30. package/dist/esm/SentinelModel.js +2 -0
  31. package/dist/esm/SentinelModel.js.map +1 -0
  32. package/dist/esm/SentinelRunner.js +86 -0
  33. package/dist/esm/SentinelRunner.js.map +1 -0
  34. package/dist/esm/index.js +6 -0
  35. package/dist/esm/index.js.map +1 -0
  36. package/dist/types/Automation.d.ts +28 -0
  37. package/dist/types/Automation.d.ts.map +1 -0
  38. package/dist/types/Queries/Report.d.ts +7 -0
  39. package/dist/types/Queries/Report.d.ts.map +1 -0
  40. package/dist/types/Queries/index.d.ts +6 -0
  41. package/dist/types/Queries/index.d.ts.map +1 -0
  42. package/dist/types/Sentinel.d.ts +35 -0
  43. package/dist/types/Sentinel.d.ts.map +1 -0
  44. package/dist/types/SentinelIntervalAutomationWrapper.d.ts +10 -0
  45. package/dist/types/SentinelIntervalAutomationWrapper.d.ts.map +1 -0
  46. package/dist/types/SentinelModel.d.ts +11 -0
  47. package/dist/types/SentinelModel.d.ts.map +1 -0
  48. package/dist/types/SentinelRunner.d.ts +25 -0
  49. package/dist/types/SentinelRunner.d.ts.map +1 -0
  50. package/dist/types/index.d.ts +6 -0
  51. package/dist/types/index.d.ts.map +1 -0
  52. package/package.json +67 -0
  53. package/src/Automation.ts +39 -0
  54. package/src/Queries/Report.ts +8 -0
  55. package/src/Queries/index.ts +11 -0
  56. package/src/Sentinel.ts +141 -0
  57. package/src/SentinelIntervalAutomationWrapper.ts +45 -0
  58. package/src/SentinelModel.ts +11 -0
  59. package/src/SentinelRunner.ts +104 -0
  60. package/src/index.ts +5 -0
  61. package/src/spec/Sentinel.spec.ts +215 -0
  62. package/src/spec/SentinelRunner.spec.ts +47 -0
  63. package/typedoc.json +10 -0
@@ -0,0 +1,2 @@
1
+ export const AutomationSchema = 'network.xyo.automation';
2
+ //# sourceMappingURL=Automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Automation.js","sourceRoot":"","sources":["../../src/Automation.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,gBAAgB,GAAG,wBAAwB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export const SentinelReportQuerySchema = 'network.xyo.query.sentinel.report';
2
+ //# sourceMappingURL=Report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Report.js","sourceRoot":"","sources":["../../../src/Queries/Report.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,yBAAyB,GAA8B,mCAAmC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './Report';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Queries/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA"}
@@ -0,0 +1,102 @@
1
+ import { assertEx } from '@xylabs/assert';
2
+ import { Account } from '@xyo-network/account';
3
+ import { ArchivingModule } from '@xyo-network/archivist';
4
+ import { ArchivistWrapper } from '@xyo-network/archivist-wrapper';
5
+ import { QueryBoundWitnessWrapper, XyoErrorBuilder, } from '@xyo-network/module';
6
+ import { WitnessWrapper } from '@xyo-network/witness';
7
+ import compact from 'lodash/compact';
8
+ import uniq from 'lodash/uniq';
9
+ import { SentinelReportQuerySchema } from './Queries';
10
+ export const SentinelConfigSchema = 'network.xyo.sentinel.config';
11
+ export class Sentinel extends ArchivingModule {
12
+ static configSchema;
13
+ history = [];
14
+ _archivists;
15
+ _witnesses;
16
+ static async create(params) {
17
+ return (await super.create(params));
18
+ }
19
+ addWitness(address) {
20
+ this.config.witnesses = uniq([...address, ...(this.config.witnesses ?? [])]);
21
+ this._witnesses = undefined;
22
+ }
23
+ async getArchivists() {
24
+ const addresses = this.config?.archivists ? (Array.isArray(this.config.archivists) ? this.config?.archivists : [this.config.archivists]) : [];
25
+ this._archivists =
26
+ this._archivists ||
27
+ (await this.resolver?.resolve({ address: addresses })).map((witness) => new ArchivistWrapper(witness));
28
+ return this._archivists;
29
+ }
30
+ async getWitnesses() {
31
+ const addresses = this.config?.witnesses ? (Array.isArray(this.config.witnesses) ? this.config?.witnesses : [this.config.witnesses]) : [];
32
+ this._witnesses =
33
+ this._witnesses || (await this.resolver?.resolve({ address: addresses })).map((witness) => new WitnessWrapper(witness));
34
+ return this._witnesses;
35
+ }
36
+ queries() {
37
+ return [SentinelReportQuerySchema, ...super.queries()];
38
+ }
39
+ async query(query, payloads, queryConfig) {
40
+ const wrapper = QueryBoundWitnessWrapper.parseQuery(query, payloads);
41
+ const typedQuery = wrapper.query;
42
+ assertEx(this.queryable(query, payloads, queryConfig));
43
+ const queryAccount = new Account();
44
+ const resultPayloads = [];
45
+ try {
46
+ switch (typedQuery.schemaName) {
47
+ case SentinelReportQuerySchema: {
48
+ const reportResult = await this.report(payloads);
49
+ resultPayloads.push(...(reportResult[0], reportResult[1]));
50
+ break;
51
+ }
52
+ default:
53
+ return super.query(query, payloads);
54
+ }
55
+ }
56
+ catch (ex) {
57
+ const error = ex;
58
+ resultPayloads.push(new XyoErrorBuilder([wrapper.hash], error.message).build());
59
+ }
60
+ return await this.bindResult(resultPayloads, queryAccount);
61
+ }
62
+ removeArchivist(address) {
63
+ this.config.archivists = (this.config.archivists ?? []).filter((archivist) => !address.includes(archivist));
64
+ this._archivists = undefined;
65
+ }
66
+ removeWitness(address) {
67
+ this.config.witnesses = (this.config.witnesses ?? []).filter((witness) => !address.includes(witness));
68
+ this._witnesses = undefined;
69
+ }
70
+ async report(payloads = []) {
71
+ const errors = [];
72
+ this.config?.onReportStart?.();
73
+ const allWitnesses = [...(await this.getWitnesses())];
74
+ const allPayloads = [];
75
+ try {
76
+ const generatedPayloads = compact(await this.generatePayloads(allWitnesses));
77
+ const combinedPayloads = [...generatedPayloads, ...payloads];
78
+ allPayloads.push(...combinedPayloads);
79
+ }
80
+ catch (e) {
81
+ errors.push(e);
82
+ }
83
+ const [newBoundWitness] = await this.bindResult(allPayloads);
84
+ this.history.push(assertEx(newBoundWitness));
85
+ this.config?.onReportEnd?.(newBoundWitness, errors.length > 0 ? errors : undefined);
86
+ return [newBoundWitness, allPayloads];
87
+ }
88
+ async tryReport(payloads = []) {
89
+ try {
90
+ return await this.report(payloads);
91
+ }
92
+ catch (ex) {
93
+ const error = ex;
94
+ this.logger?.warn(`report failed [${error.message}]`);
95
+ return [null, []];
96
+ }
97
+ }
98
+ async generatePayloads(witnesses) {
99
+ return (await Promise.all(witnesses?.map(async (witness) => await witness.observe()))).flat();
100
+ }
101
+ }
102
+ //# sourceMappingURL=Sentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sentinel.js","sourceRoot":"","sources":["../../src/Sentinel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper';
2
+ export class SentinelIntervalAutomationWrapper extends PayloadWrapper {
3
+ get frequencyMillis() {
4
+ if (this.payload.frequency === undefined)
5
+ return Infinity;
6
+ switch (this.payload.frequencyUnits ?? 'hour') {
7
+ case 'minute':
8
+ return this.payload.frequency * 60 * 1000;
9
+ case 'hour':
10
+ return this.payload.frequency * 60 * 60 * 1000;
11
+ case 'day':
12
+ return this.payload.frequency * 24 * 60 * 60 * 1000;
13
+ }
14
+ }
15
+ get remaining() {
16
+ //if remaining is not defined, we assume Infinity
17
+ return this.payload.remaining ?? Infinity;
18
+ }
19
+ next() {
20
+ this.payload.start = this.payload.start + this.frequencyMillis;
21
+ this.consumeRemaining();
22
+ this.checkEnd();
23
+ return this;
24
+ }
25
+ checkEnd() {
26
+ if (this.payload.start > (this.payload.end ?? Infinity)) {
27
+ this.payload.start = Infinity;
28
+ }
29
+ }
30
+ consumeRemaining(count = 1) {
31
+ this.payload.remaining = this.remaining - count;
32
+ if (this.payload.remaining <= 0) {
33
+ this.payload.start = Infinity;
34
+ }
35
+ }
36
+ }
37
+ //# sourceMappingURL=SentinelIntervalAutomationWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelIntervalAutomationWrapper.js","sourceRoot":"","sources":["../../src/SentinelIntervalAutomationWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAI7D,MAAM,OAAO,iCAEX,SAAQ,cAAiB;IACzB,IAAc,eAAe;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAA;QACzD,QAAQ,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM,EAAE;YAC7C,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAA;YAC3C,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;YAChD,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;SACtD;IACH,CAAC;IAED,IAAc,SAAS;QACrB,iDAAiD;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAA;IAC3C,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAA;QAC9D,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAES,QAAQ;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE;YACvD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAA;SAC9B;IACH,CAAC;IAES,gBAAgB,CAAC,KAAK,GAAG,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QAE/C,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAA;SAC9B;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SentinelModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelModel.js","sourceRoot":"","sources":["../../src/SentinelModel.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { assertEx } from '@xylabs/assert';
2
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper';
3
+ import { SentinelIntervalAutomationWrapper } from './SentinelIntervalAutomationWrapper';
4
+ export class SentinelRunner {
5
+ _automations = {};
6
+ onTriggerResult;
7
+ sentinel;
8
+ timeoutId;
9
+ constructor(sentinel, automations, onTriggerResult) {
10
+ this.sentinel = sentinel;
11
+ this.onTriggerResult = onTriggerResult;
12
+ automations?.forEach((automation) => this.add(automation));
13
+ }
14
+ get automations() {
15
+ return this._automations;
16
+ }
17
+ get next() {
18
+ return Object.values(this._automations).reduce((previous, current) => {
19
+ if (current.type === 'interval') {
20
+ return current.start < (previous?.start ?? Infinity) ? current : previous;
21
+ }
22
+ }, undefined);
23
+ }
24
+ async add(automation, restart = true) {
25
+ const hash = new PayloadWrapper(automation).hash;
26
+ this._automations[hash] = automation;
27
+ if (restart)
28
+ await this.restart();
29
+ return hash;
30
+ }
31
+ find(hash) {
32
+ Object.entries(this._automations).find(([key]) => key === hash);
33
+ }
34
+ async remove(hash, restart = true) {
35
+ delete this._automations[hash];
36
+ if (restart)
37
+ await this.restart();
38
+ }
39
+ removeAll() {
40
+ this.stop();
41
+ this._automations = {};
42
+ }
43
+ async restart() {
44
+ this.stop();
45
+ await this.start();
46
+ }
47
+ async start() {
48
+ assertEx(this.timeoutId === undefined, 'Already started');
49
+ const automation = this.next;
50
+ if (automation) {
51
+ const delay = automation.start - Date.now();
52
+ if (delay < 0) {
53
+ //automation is due, just do it
54
+ await this.trigger(automation);
55
+ }
56
+ else {
57
+ this.timeoutId = setTimeout(async () => {
58
+ this.timeoutId = undefined;
59
+ await this.start();
60
+ }, delay > 0 ? delay : 0);
61
+ }
62
+ }
63
+ }
64
+ stop() {
65
+ if (this.timeoutId) {
66
+ clearTimeout(this.timeoutId);
67
+ this.timeoutId = undefined;
68
+ }
69
+ }
70
+ async update(hash, automation, restart = true) {
71
+ await this.remove(hash, false);
72
+ await this.add(automation, false);
73
+ if (restart)
74
+ await this.restart();
75
+ }
76
+ async trigger(automation) {
77
+ const wrapper = new SentinelIntervalAutomationWrapper(automation);
78
+ await this.remove(wrapper.hash, false);
79
+ wrapper.next();
80
+ await this.add(wrapper.payload, false);
81
+ const triggerResult = await this.sentinel.tryReport();
82
+ this.onTriggerResult?.(triggerResult);
83
+ await this.start();
84
+ }
85
+ }
86
+ //# sourceMappingURL=SentinelRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelRunner.js","sourceRoot":"","sources":["../../src/SentinelRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './Automation';
2
+ export * from './Sentinel';
3
+ export * from './SentinelIntervalAutomationWrapper';
4
+ export * from './SentinelModel';
5
+ export * from './SentinelRunner';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { EmptyObject } from '@xyo-network/core';
2
+ import { XyoPayload } from '@xyo-network/payload-model';
3
+ export type SentinelAutomationSchema = 'network.xyo.automation';
4
+ export declare const AutomationSchema = "network.xyo.automation";
5
+ export type SentinelBaseAutomationPayload<T extends EmptyObject = EmptyObject> = XyoPayload<T & {
6
+ schema: SentinelAutomationSchema;
7
+ type?: 'interval' | 'change';
8
+ /** @field The list of witnesses to invoke [all if undefined] */
9
+ witnesses?: string[];
10
+ }>;
11
+ export type SentinelIntervalAutomationPayload = SentinelBaseAutomationPayload<{
12
+ /** @field epoch after which any reoccurrence stops */
13
+ end?: number;
14
+ /** @field time between triggers [non-repeating if undefined] */
15
+ frequency?: number;
16
+ /** @field units for frequency field [hour if undefined] */
17
+ frequencyUnits?: 'minute' | 'hour' | 'day';
18
+ /** @field remaining triggers [infinite if undefined] */
19
+ remaining?: number;
20
+ /** @field epoch of the next trigger */
21
+ start: number;
22
+ type: 'interval';
23
+ }>;
24
+ export type SentinelChangeAutomationPayload = SentinelBaseAutomationPayload<{
25
+ type: 'change';
26
+ }>;
27
+ export type SentinelAutomationPayload = SentinelIntervalAutomationPayload | SentinelChangeAutomationPayload;
28
+ //# sourceMappingURL=Automation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Automation.d.ts","sourceRoot":"","sources":["../../src/Automation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAA;AAC/D,eAAO,MAAM,gBAAgB,2BAA2B,CAAA;AAExD,MAAM,MAAM,6BAA6B,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,UAAU,CACzF,CAAC,GAAG;IACF,MAAM,EAAE,wBAAwB,CAAA;IAChC,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;IAC5B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB,CACF,CAAA;AAED,MAAM,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;IAC5E,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAA;IAE1C,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAA;IAEb,IAAI,EAAE,UAAU,CAAA;CACjB,CAAC,CAAA;AAEF,MAAM,MAAM,+BAA+B,GAAG,6BAA6B,CAAC;IAC1E,IAAI,EAAE,QAAQ,CAAA;CACf,CAAC,CAAA;AAEF,MAAM,MAAM,yBAAyB,GAAG,iCAAiC,GAAG,+BAA+B,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { XyoQuery } from '@xyo-network/module-model';
2
+ export type SentinelReportQuerySchema = 'network.xyo.query.sentinel.report';
3
+ export declare const SentinelReportQuerySchema: SentinelReportQuerySchema;
4
+ export type SentinelReportQuery = XyoQuery<{
5
+ schema: SentinelReportQuerySchema;
6
+ }>;
7
+ //# sourceMappingURL=Report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Report.d.ts","sourceRoot":"","sources":["../../../src/Queries/Report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEpD,MAAM,MAAM,yBAAyB,GAAG,mCAAmC,CAAA;AAC3E,eAAO,MAAM,yBAAyB,EAAE,yBAA+D,CAAA;AAEvG,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,yBAAyB,CAAA;CAClC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ export * from './Report';
2
+ import { AbstractModuleQuery, XyoQuery } from '@xyo-network/module-model';
3
+ import { SentinelReportQuery } from './Report';
4
+ export type SentinelQueryBase = SentinelReportQuery;
5
+ export type SentinelQuery<TQuery extends XyoQuery | void = void> = AbstractModuleQuery<TQuery extends XyoQuery ? SentinelQueryBase | TQuery : SentinelQueryBase>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Queries/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AAExB,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9C,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAA;AAEnD,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,QAAQ,GAAG,IAAI,GAAG,IAAI,IAAI,mBAAmB,CACpF,MAAM,SAAS,QAAQ,GAAG,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,CACzE,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { ArchivingModule, ArchivingModuleConfig } from '@xyo-network/archivist';
2
+ import { ArchivistWrapper } from '@xyo-network/archivist-wrapper';
3
+ import { XyoBoundWitness } from '@xyo-network/boundwitness-model';
4
+ import { AbstractModuleConfig, ModuleParams, ModuleQueryResult, XyoQueryBoundWitness } from '@xyo-network/module';
5
+ import { XyoPayload } from '@xyo-network/payload-model';
6
+ import { WitnessWrapper } from '@xyo-network/witness';
7
+ import { SentinelModule } from './SentinelModel';
8
+ export type SentinelConfigSchema = 'network.xyo.sentinel.config';
9
+ export declare const SentinelConfigSchema: SentinelConfigSchema;
10
+ export type SentinelConfig = ArchivingModuleConfig<{
11
+ onReportEnd?: (boundWitness?: XyoBoundWitness, errors?: Error[]) => void;
12
+ onReportStart?: () => void;
13
+ onWitnessReportEnd?: (witness: WitnessWrapper, error?: Error) => void;
14
+ onWitnessReportStart?: (witness: WitnessWrapper) => void;
15
+ schema: SentinelConfigSchema;
16
+ witnesses?: string[];
17
+ }>;
18
+ export declare class Sentinel extends ArchivingModule<SentinelConfig> implements SentinelModule {
19
+ static configSchema: SentinelConfigSchema;
20
+ history: XyoBoundWitness[];
21
+ private _archivists;
22
+ private _witnesses;
23
+ static create(params?: Partial<ModuleParams<SentinelConfig>>): Promise<Sentinel>;
24
+ addWitness(address: string[]): void;
25
+ getArchivists(): Promise<ArchivistWrapper[]>;
26
+ getWitnesses(): Promise<WitnessWrapper[]>;
27
+ queries(): string[];
28
+ query<T extends XyoQueryBoundWitness = XyoQueryBoundWitness, TConfig extends AbstractModuleConfig = AbstractModuleConfig>(query: T, payloads?: XyoPayload[], queryConfig?: TConfig): Promise<ModuleQueryResult>;
29
+ removeArchivist(address: string[]): void;
30
+ removeWitness(address: string[]): void;
31
+ report(payloads?: XyoPayload[]): Promise<[XyoBoundWitness, XyoPayload[]]>;
32
+ tryReport(payloads?: XyoPayload[]): Promise<[XyoBoundWitness | null, XyoPayload[]]>;
33
+ private generatePayloads;
34
+ }
35
+ //# sourceMappingURL=Sentinel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sentinel.d.ts","sourceRoot":"","sources":["../../src/Sentinel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EAGjB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAmB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAKtE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,MAAM,MAAM,oBAAoB,GAAG,6BAA6B,CAAA;AAChE,eAAO,MAAM,oBAAoB,EAAE,oBAAoD,CAAA;AAEvF,MAAM,MAAM,cAAc,GAAG,qBAAqB,CAAC;IACjD,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;IACxE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IACrE,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IACxD,MAAM,EAAE,oBAAoB,CAAA;IAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB,CAAC,CAAA;AAEF,qBAAa,QAAS,SAAQ,eAAe,CAAC,cAAc,CAAE,YAAW,cAAc;IACrF,OAAgB,YAAY,EAAE,oBAAoB,CAAA;IAE3C,OAAO,EAAE,eAAe,EAAE,CAAK;IACtC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,UAAU,CAA8B;WAE1B,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIxF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE;IAKtB,aAAa;IASb,YAAY;IAQT,OAAO,IAAI,MAAM,EAAE;IAIpB,KAAK,CAAC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,EAAE,OAAO,SAAS,oBAAoB,GAAG,oBAAoB,EACrI,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,UAAU,EAAE,EACvB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,iBAAiB,CAAC;IAuBtB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE;IAKjC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE;IAKzB,MAAM,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;IAoB7E,SAAS,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAUtF,gBAAgB;CAG/B"}
@@ -0,0 +1,10 @@
1
+ import { PayloadWrapper } from '@xyo-network/payload-wrapper';
2
+ import { SentinelIntervalAutomationPayload } from './Automation';
3
+ export declare class SentinelIntervalAutomationWrapper<T extends SentinelIntervalAutomationPayload = SentinelIntervalAutomationPayload> extends PayloadWrapper<T> {
4
+ protected get frequencyMillis(): number;
5
+ protected get remaining(): number;
6
+ next(): this;
7
+ protected checkEnd(): void;
8
+ protected consumeRemaining(count?: number): void;
9
+ }
10
+ //# sourceMappingURL=SentinelIntervalAutomationWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelIntervalAutomationWrapper.d.ts","sourceRoot":"","sources":["../../src/SentinelIntervalAutomationWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAA;AAEhE,qBAAa,iCAAiC,CAC5C,CAAC,SAAS,iCAAiC,GAAG,iCAAiC,CAC/E,SAAQ,cAAc,CAAC,CAAC,CAAC;IACzB,SAAS,KAAK,eAAe,WAU5B;IAED,SAAS,KAAK,SAAS,WAGtB;IAEM,IAAI;IAOX,SAAS,CAAC,QAAQ;IAMlB,SAAS,CAAC,gBAAgB,CAAC,KAAK,SAAI;CAOrC"}
@@ -0,0 +1,11 @@
1
+ import { XyoBoundWitness } from '@xyo-network/boundwitness-model';
2
+ import { Module } from '@xyo-network/module-model';
3
+ import { XyoPayload } from '@xyo-network/payload-model';
4
+ import { Promisable } from '@xyo-network/promise';
5
+ export interface SentinelModel {
6
+ report: (payloads?: XyoPayload[]) => Promisable<[XyoBoundWitness, XyoPayload[]]>;
7
+ tryReport: (payloads?: XyoPayload[]) => Promisable<[XyoBoundWitness | null, XyoPayload[]]>;
8
+ }
9
+ export interface SentinelModule extends Module, SentinelModel {
10
+ }
11
+ //# sourceMappingURL=SentinelModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelModel.d.ts","sourceRoot":"","sources":["../../src/SentinelModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEjD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAChF,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC,CAAC,eAAe,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;CAC3F;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,EAAE,aAAa;CAAG"}
@@ -0,0 +1,25 @@
1
+ /// <reference types="node" />
2
+ import { XyoBoundWitness } from '@xyo-network/boundwitness-model';
3
+ import { XyoPayload } from '@xyo-network/payload-model';
4
+ import { SentinelAutomationPayload } from './Automation';
5
+ import { SentinelModel } from './SentinelModel';
6
+ export type OnSentinelRunnerTriggerResult = (result: [XyoBoundWitness | null, XyoPayload[]]) => void;
7
+ export declare class SentinelRunner {
8
+ protected _automations: Record<string, SentinelAutomationPayload>;
9
+ protected onTriggerResult: OnSentinelRunnerTriggerResult | undefined;
10
+ protected sentinel: SentinelModel;
11
+ protected timeoutId?: NodeJS.Timer;
12
+ constructor(sentinel: SentinelModel, automations?: SentinelAutomationPayload[], onTriggerResult?: OnSentinelRunnerTriggerResult);
13
+ get automations(): Record<string, SentinelAutomationPayload>;
14
+ private get next();
15
+ add(automation: SentinelAutomationPayload, restart?: boolean): Promise<string>;
16
+ find(hash: string): void;
17
+ remove(hash: string, restart?: boolean): Promise<void>;
18
+ removeAll(): void;
19
+ restart(): Promise<void>;
20
+ start(): Promise<void>;
21
+ stop(): void;
22
+ update(hash: string, automation: SentinelAutomationPayload, restart?: boolean): Promise<void>;
23
+ private trigger;
24
+ }
25
+ //# sourceMappingURL=SentinelRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentinelRunner.d.ts","sourceRoot":"","sources":["../../src/SentinelRunner.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAGvD,OAAO,EAAE,yBAAyB,EAAqC,MAAM,cAAc,CAAA;AAE3F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,MAAM,MAAM,6BAA6B,GAAG,CAAC,MAAM,EAAE,CAAC,eAAe,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,KAAK,IAAI,CAAA;AAEpG,qBAAa,cAAc;IACzB,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAK;IACtE,SAAS,CAAC,eAAe,EAAE,6BAA6B,GAAG,SAAS,CAAA;IACpE,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAA;IACjC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,CAAA;gBAEtB,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,yBAAyB,EAAE,EAAE,eAAe,CAAC,EAAE,6BAA6B;IAM/H,IAAW,WAAW,8CAErB;IAED,OAAO,KAAK,IAAI,GAMf;IAEY,GAAG,CAAC,UAAU,EAAE,yBAAyB,EAAE,OAAO,UAAO;IAO/D,IAAI,CAAC,IAAI,EAAE,MAAM;IAIX,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAO;IAKzC,SAAS;IAKH,OAAO;IAKP,KAAK;IAoBX,IAAI;IAOE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,yBAAyB,EAAE,OAAO,UAAO;YAMzE,OAAO;CAStB"}
@@ -0,0 +1,6 @@
1
+ export * from './Automation';
2
+ export * from './Sentinel';
3
+ export * from './SentinelIntervalAutomationWrapper';
4
+ export * from './SentinelModel';
5
+ export * from './SentinelRunner';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@xyo-network/sentinel",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/assert": "^2.7.1",
14
+ "@xyo-network/account": "^2.43.37",
15
+ "@xyo-network/archivist": "^2.43.37",
16
+ "@xyo-network/archivist-wrapper": "^2.43.37",
17
+ "@xyo-network/boundwitness-model": "^2.43.37",
18
+ "@xyo-network/core": "^2.43.37",
19
+ "@xyo-network/module": "^2.43.37",
20
+ "@xyo-network/module-model": "^2.43.37",
21
+ "@xyo-network/payload-model": "^2.43.37",
22
+ "@xyo-network/payload-wrapper": "^2.43.37",
23
+ "@xyo-network/promise": "^2.43.37",
24
+ "@xyo-network/witness": "^2.43.37",
25
+ "lodash": "^4.17.21"
26
+ },
27
+ "description": "Primary SDK for using XYO Protocol 2.0",
28
+ "devDependencies": {
29
+ "@types/lodash": "^4.14.191",
30
+ "@xylabs/ts-scripts-yarn3": "^2.14.14",
31
+ "@xylabs/tsconfig": "^2.14.14",
32
+ "typescript": "^4.9.5"
33
+ },
34
+ "browser": "dist/esm/index.js",
35
+ "docs": "dist/docs.json",
36
+ "exports": {
37
+ ".": {
38
+ "node": {
39
+ "import": "./dist/esm/index.js",
40
+ "require": "./dist/cjs/index.js"
41
+ },
42
+ "browser": {
43
+ "import": "./dist/esm/index.js",
44
+ "require": "./dist/cjs/index.js"
45
+ },
46
+ "default": "./dist/esm/index.js"
47
+ },
48
+ "./dist/docs.json": {
49
+ "default": "./dist/docs.json"
50
+ },
51
+ "./package.json": "./package.json"
52
+ },
53
+ "main": "dist/cjs/index.js",
54
+ "module": "dist/esm/index.js",
55
+ "homepage": "https://xyo.network",
56
+ "license": "LGPL-3.0",
57
+ "publishConfig": {
58
+ "access": "public"
59
+ },
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
63
+ },
64
+ "sideEffects": false,
65
+ "types": "dist/types/index.d.ts",
66
+ "version": "2.43.37"
67
+ }
@@ -0,0 +1,39 @@
1
+ import { EmptyObject } from '@xyo-network/core'
2
+ import { XyoPayload } from '@xyo-network/payload-model'
3
+
4
+ export type SentinelAutomationSchema = 'network.xyo.automation'
5
+ export const AutomationSchema = 'network.xyo.automation'
6
+
7
+ export type SentinelBaseAutomationPayload<T extends EmptyObject = EmptyObject> = XyoPayload<
8
+ T & {
9
+ schema: SentinelAutomationSchema
10
+ type?: 'interval' | 'change'
11
+ /** @field The list of witnesses to invoke [all if undefined] */
12
+ witnesses?: string[]
13
+ }
14
+ >
15
+
16
+ export type SentinelIntervalAutomationPayload = SentinelBaseAutomationPayload<{
17
+ /** @field epoch after which any reoccurrence stops */
18
+ end?: number
19
+
20
+ /** @field time between triggers [non-repeating if undefined] */
21
+ frequency?: number
22
+
23
+ /** @field units for frequency field [hour if undefined] */
24
+ frequencyUnits?: 'minute' | 'hour' | 'day'
25
+
26
+ /** @field remaining triggers [infinite if undefined] */
27
+ remaining?: number
28
+
29
+ /** @field epoch of the next trigger */
30
+ start: number
31
+
32
+ type: 'interval'
33
+ }>
34
+
35
+ export type SentinelChangeAutomationPayload = SentinelBaseAutomationPayload<{
36
+ type: 'change'
37
+ }>
38
+
39
+ export type SentinelAutomationPayload = SentinelIntervalAutomationPayload | SentinelChangeAutomationPayload
@@ -0,0 +1,8 @@
1
+ import { XyoQuery } from '@xyo-network/module-model'
2
+
3
+ export type SentinelReportQuerySchema = 'network.xyo.query.sentinel.report'
4
+ export const SentinelReportQuerySchema: SentinelReportQuerySchema = 'network.xyo.query.sentinel.report'
5
+
6
+ export type SentinelReportQuery = XyoQuery<{
7
+ schema: SentinelReportQuerySchema
8
+ }>
@@ -0,0 +1,11 @@
1
+ export * from './Report'
2
+
3
+ import { AbstractModuleQuery, XyoQuery } from '@xyo-network/module-model'
4
+
5
+ import { SentinelReportQuery } from './Report'
6
+
7
+ export type SentinelQueryBase = SentinelReportQuery
8
+
9
+ export type SentinelQuery<TQuery extends XyoQuery | void = void> = AbstractModuleQuery<
10
+ TQuery extends XyoQuery ? SentinelQueryBase | TQuery : SentinelQueryBase
11
+ >