@griffin-app/griffin-executor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +152 -0
  2. package/dist/adapters/axios.d.ts +5 -0
  3. package/dist/adapters/axios.d.ts.map +1 -0
  4. package/dist/adapters/axios.js +36 -0
  5. package/dist/adapters/axios.js.map +1 -0
  6. package/dist/adapters/index.d.ts +3 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/stub.d.ts +22 -0
  11. package/dist/adapters/stub.d.ts.map +1 -0
  12. package/dist/adapters/stub.js +36 -0
  13. package/dist/adapters/stub.js.map +1 -0
  14. package/dist/events/adapters/in-memory.d.ts +52 -0
  15. package/dist/events/adapters/in-memory.d.ts.map +1 -0
  16. package/dist/events/adapters/in-memory.js +70 -0
  17. package/dist/events/adapters/in-memory.js.map +1 -0
  18. package/dist/events/adapters/in-memory.test.d.ts +2 -0
  19. package/dist/events/adapters/in-memory.test.d.ts.map +1 -0
  20. package/dist/events/adapters/in-memory.test.js +109 -0
  21. package/dist/events/adapters/in-memory.test.js.map +1 -0
  22. package/dist/events/adapters/index.d.ts +9 -0
  23. package/dist/events/adapters/index.d.ts.map +1 -0
  24. package/dist/events/adapters/index.js +9 -0
  25. package/dist/events/adapters/index.js.map +1 -0
  26. package/dist/events/adapters/kinesis.d.ts +91 -0
  27. package/dist/events/adapters/kinesis.d.ts.map +1 -0
  28. package/dist/events/adapters/kinesis.js +136 -0
  29. package/dist/events/adapters/kinesis.js.map +1 -0
  30. package/dist/events/adapters/kinesis.test.d.ts +2 -0
  31. package/dist/events/adapters/kinesis.test.d.ts.map +1 -0
  32. package/dist/events/adapters/kinesis.test.js +249 -0
  33. package/dist/events/adapters/kinesis.test.js.map +1 -0
  34. package/dist/events/emitter.d.ts +68 -0
  35. package/dist/events/emitter.d.ts.map +1 -0
  36. package/dist/events/emitter.js +83 -0
  37. package/dist/events/emitter.js.map +1 -0
  38. package/dist/events/emitter.test.d.ts +2 -0
  39. package/dist/events/emitter.test.d.ts.map +1 -0
  40. package/dist/events/emitter.test.js +262 -0
  41. package/dist/events/emitter.test.js.map +1 -0
  42. package/dist/events/index.d.ts +4 -0
  43. package/dist/events/index.d.ts.map +1 -0
  44. package/dist/events/index.js +4 -0
  45. package/dist/events/index.js.map +1 -0
  46. package/dist/events/types.d.ts +112 -0
  47. package/dist/events/types.d.ts.map +1 -0
  48. package/dist/events/types.js +9 -0
  49. package/dist/events/types.js.map +1 -0
  50. package/dist/executor.d.ts +4 -0
  51. package/dist/executor.d.ts.map +1 -0
  52. package/dist/executor.js +799 -0
  53. package/dist/executor.js.map +1 -0
  54. package/dist/executor.test.d.ts +2 -0
  55. package/dist/executor.test.d.ts.map +1 -0
  56. package/dist/executor.test.js +1584 -0
  57. package/dist/executor.test.js.map +1 -0
  58. package/dist/index.d.ts +9 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +15 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/secrets/factory.d.ts +121 -0
  63. package/dist/secrets/factory.d.ts.map +1 -0
  64. package/dist/secrets/factory.js +137 -0
  65. package/dist/secrets/factory.js.map +1 -0
  66. package/dist/secrets/index.d.ts +14 -0
  67. package/dist/secrets/index.d.ts.map +1 -0
  68. package/dist/secrets/index.js +18 -0
  69. package/dist/secrets/index.js.map +1 -0
  70. package/dist/secrets/providers/aws.d.ts +63 -0
  71. package/dist/secrets/providers/aws.d.ts.map +1 -0
  72. package/dist/secrets/providers/aws.js +110 -0
  73. package/dist/secrets/providers/aws.js.map +1 -0
  74. package/dist/secrets/providers/env.d.ts +36 -0
  75. package/dist/secrets/providers/env.d.ts.map +1 -0
  76. package/dist/secrets/providers/env.js +37 -0
  77. package/dist/secrets/providers/env.js.map +1 -0
  78. package/dist/secrets/providers/index.d.ts +7 -0
  79. package/dist/secrets/providers/index.d.ts.map +1 -0
  80. package/dist/secrets/providers/index.js +7 -0
  81. package/dist/secrets/providers/index.js.map +1 -0
  82. package/dist/secrets/providers/vault.d.ts +75 -0
  83. package/dist/secrets/providers/vault.d.ts.map +1 -0
  84. package/dist/secrets/providers/vault.js +143 -0
  85. package/dist/secrets/providers/vault.js.map +1 -0
  86. package/dist/secrets/registry.d.ts +39 -0
  87. package/dist/secrets/registry.d.ts.map +1 -0
  88. package/dist/secrets/registry.js +134 -0
  89. package/dist/secrets/registry.js.map +1 -0
  90. package/dist/secrets/resolver.d.ts +45 -0
  91. package/dist/secrets/resolver.d.ts.map +1 -0
  92. package/dist/secrets/resolver.js +188 -0
  93. package/dist/secrets/resolver.js.map +1 -0
  94. package/dist/secrets/secrets.test.d.ts +2 -0
  95. package/dist/secrets/secrets.test.d.ts.map +1 -0
  96. package/dist/secrets/secrets.test.js +317 -0
  97. package/dist/secrets/secrets.test.js.map +1 -0
  98. package/dist/secrets/types.d.ts +70 -0
  99. package/dist/secrets/types.d.ts.map +1 -0
  100. package/dist/secrets/types.js +42 -0
  101. package/dist/secrets/types.js.map +1 -0
  102. package/dist/shared.d.ts +8 -0
  103. package/dist/shared.d.ts.map +1 -0
  104. package/dist/shared.js +30 -0
  105. package/dist/shared.js.map +1 -0
  106. package/dist/test-monitor-types.d.ts +43 -0
  107. package/dist/test-monitor-types.d.ts.map +1 -0
  108. package/dist/test-monitor-types.js +2 -0
  109. package/dist/test-monitor-types.js.map +1 -0
  110. package/dist/test-plan-types.d.ts +43 -0
  111. package/dist/test-plan-types.d.ts.map +1 -0
  112. package/dist/test-plan-types.js +2 -0
  113. package/dist/test-plan-types.js.map +1 -0
  114. package/dist/types.d.ts +93 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +3 -0
  117. package/dist/types.js.map +1 -0
  118. package/dist/utils/dates.d.ts +11 -0
  119. package/dist/utils/dates.d.ts.map +1 -0
  120. package/dist/utils/dates.js +13 -0
  121. package/dist/utils/dates.js.map +1 -0
  122. package/package.json +39 -0
  123. package/src/adapters/axios.ts +39 -0
  124. package/src/adapters/index.ts +2 -0
  125. package/src/adapters/stub.ts +47 -0
  126. package/src/events/adapters/README.md +144 -0
  127. package/src/events/adapters/in-memory.test.ts +146 -0
  128. package/src/events/adapters/in-memory.ts +93 -0
  129. package/src/events/adapters/index.ts +9 -0
  130. package/src/events/adapters/kinesis.test.ts +323 -0
  131. package/src/events/adapters/kinesis.ts +211 -0
  132. package/src/events/emitter.test.ts +327 -0
  133. package/src/events/emitter.ts +133 -0
  134. package/src/events/index.ts +3 -0
  135. package/src/events/types.ts +136 -0
  136. package/src/executor.test.ts +1732 -0
  137. package/src/executor.ts +1075 -0
  138. package/src/index.ts +81 -0
  139. package/src/secrets/factory.ts +248 -0
  140. package/src/secrets/index.ts +48 -0
  141. package/src/secrets/providers/aws.ts +178 -0
  142. package/src/secrets/providers/env.ts +66 -0
  143. package/src/secrets/providers/index.ts +15 -0
  144. package/src/secrets/providers/vault.ts +257 -0
  145. package/src/secrets/resolver.ts +269 -0
  146. package/src/secrets/secrets.test.ts +402 -0
  147. package/src/secrets/types.ts +106 -0
  148. package/src/shared.ts +46 -0
  149. package/src/test-monitor-types.ts +49 -0
  150. package/src/types.ts +114 -0
  151. package/src/utils/dates.ts +13 -0
  152. package/tsconfig.json +20 -0
  153. package/vitest.config.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"AAyDA;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9B,GAAG,CAAS;IACZ,KAAK,CAAS;IAE9B,YAAY,OAAe,EAAE,OAAyC;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,YAAY,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IACE,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;QACnB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,GAAG,CAAC,OAAO,KAAK,IAAI,EACpB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAkC,CAAC;IAC1D,OAAO,OAAO,UAAU,CAAC,GAAG,KAAK,QAAQ,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,UAAU,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { TSchema, TSchemaOptions, TUnsafe, Static, Type } from "typebox";
2
+ export declare function Ref<T extends TSchema>(t: T, options?: TSchemaOptions): TUnsafe<Static<T>>;
3
+ export declare class TUnionOneOf<Types extends TSchema[] = TSchema[]> extends Type.Base<TSchema[]> {
4
+ oneOf: Types;
5
+ constructor(oneOf: Types);
6
+ }
7
+ export declare function UnionOneOf(oneOf: TSchema[]): TUnionOneOf;
8
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,cAAc,EACd,OAAO,EACP,MAAM,EAEN,IAAI,EACL,MAAM,SAAS,CAAC;AAIjB,wBAAgB,GAAG,CAAC,CAAC,SAAS,OAAO,EACnC,CAAC,EAAE,CAAC,EACJ,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAMpB;AAED,qBAAa,WAAW,CAAC,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,CAAE,SAAQ,IAAI,CAAC,IAAI,CAC7E,OAAO,EAAE,CACV;IACQ,KAAK,EAAE,KAAK,CAAC;gBACR,KAAK,EAAE,KAAK;CAIzB;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,WAAW,CAExD"}
package/dist/shared.js ADDED
@@ -0,0 +1,30 @@
1
+ import { Unsafe, Type, } from "typebox";
2
+ export function Ref(t, options = {}) {
3
+ const id = t.$id;
4
+ if (!id) {
5
+ throw new Error("missing ID on schema");
6
+ }
7
+ return Unsafe({ ...t, $ref: id, $id: undefined, ...options });
8
+ }
9
+ export class TUnionOneOf extends Type.Base {
10
+ oneOf;
11
+ constructor(oneOf) {
12
+ super();
13
+ this.oneOf = oneOf;
14
+ }
15
+ }
16
+ export function UnionOneOf(oneOf) {
17
+ return new TUnionOneOf(oneOf);
18
+ }
19
+ //export interface TUnionOneOf<Types extends TSchema[] = TSchema[]> extends TSchema {
20
+ // '~kind': 'UnionOneOf'
21
+ // //static: { [K in keyof Types]: Static<Types[K]> }[number]
22
+ // oneOf: Types
23
+ //}
24
+ //
25
+ //export function UnionOneOf<Types extends TSchema[]>(oneOf: [...Types], options: TSchemaOptions = {}) {
26
+ // return { ...options, ["~kind"]: 'UnionOneOf', oneOf } as TUnionOneOf<Types>
27
+ //
28
+ // ///return Memory.Create({ '~kind': 'UnionOneOf' }, { oneOf }, options) as never
29
+ //}
30
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,MAAM,EACN,IAAI,GACL,MAAM,SAAS,CAAC;AAIjB,MAAM,UAAU,GAAG,CACjB,CAAI,EACJ,UAA0B,EAAE;IAE5B,MAAM,EAAE,GAAI,CAAmD,CAAC,GAAG,CAAC;IACpE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAY,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,OAAO,WAAiD,SAAQ,IAAI,CAAC,IAE1E;IACQ,KAAK,CAAQ;IACpB,YAAY,KAAY;QACtB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AACD,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,qFAAqF;AACrF,yBAAyB;AACzB,8DAA8D;AAC9D,gBAAgB;AAChB,GAAG;AACH,EAAE;AACF,wGAAwG;AACxG,+EAA+E;AAC/E,EAAE;AACF,mFAAmF;AACnF,GAAG"}
@@ -0,0 +1,43 @@
1
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
2
+ export type ResponseFormat = "JSON" | "XML" | "TEXT";
3
+ export interface HttpRequest {
4
+ id: string;
5
+ type: "HTTP_REQUEST";
6
+ method: HttpMethod;
7
+ path: string;
8
+ response_format: ResponseFormat;
9
+ headers?: Record<string, string>;
10
+ body?: any;
11
+ }
12
+ export interface WaitNode {
13
+ id: string;
14
+ type: "WAIT";
15
+ duration_ms: number;
16
+ }
17
+ export interface AssertionNode {
18
+ id: string;
19
+ type: "ASSERTION";
20
+ assertions: Assertion[];
21
+ }
22
+ export interface Assertion {
23
+ type: string;
24
+ expected?: any;
25
+ actual?: any;
26
+ message?: string;
27
+ }
28
+ export interface Edge {
29
+ from: string;
30
+ to: string;
31
+ }
32
+ export interface Frequency {
33
+ every: number;
34
+ unit: "minute" | "hour" | "day";
35
+ }
36
+ export interface TestMonitor {
37
+ name: string;
38
+ endpoint_host: string;
39
+ frequency?: Frequency;
40
+ nodes: (HttpRequest | WaitNode | AssertionNode)[];
41
+ edges: Edge[];
42
+ }
43
+ //# sourceMappingURL=test-monitor-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-monitor-types.d.ts","sourceRoot":"","sources":["../src/test-monitor-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,CAAC,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC;IAClD,KAAK,EAAE,IAAI,EAAE,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-monitor-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-monitor-types.js","sourceRoot":"","sources":["../src/test-monitor-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
2
+ export type ResponseFormat = "JSON" | "XML" | "TEXT";
3
+ export interface HttpRequest {
4
+ id: string;
5
+ type: "HTTP_REQUEST";
6
+ method: HttpMethod;
7
+ path: string;
8
+ response_format: ResponseFormat;
9
+ headers?: Record<string, string>;
10
+ body?: any;
11
+ }
12
+ export interface WaitNode {
13
+ id: string;
14
+ type: "WAIT";
15
+ duration_ms: number;
16
+ }
17
+ export interface AssertionNode {
18
+ id: string;
19
+ type: "ASSERTION";
20
+ assertions: Assertion[];
21
+ }
22
+ export interface Assertion {
23
+ type: string;
24
+ expected?: any;
25
+ actual?: any;
26
+ message?: string;
27
+ }
28
+ export interface Edge {
29
+ from: string;
30
+ to: string;
31
+ }
32
+ export interface Frequency {
33
+ every: number;
34
+ unit: "minute" | "hour" | "day";
35
+ }
36
+ export interface TestPlan {
37
+ name: string;
38
+ endpoint_host: string;
39
+ frequency?: Frequency;
40
+ nodes: (HttpRequest | WaitNode | AssertionNode)[];
41
+ edges: Edge[];
42
+ }
43
+ //# sourceMappingURL=test-plan-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-plan-types.d.ts","sourceRoot":"","sources":["../src/test-plan-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,CAAC,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC;IAClD,KAAK,EAAE,IAAI,EAAE,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-plan-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-plan-types.js","sourceRoot":"","sources":["../src/test-plan-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import type { ExecutionEventEmitter } from "./events/index.js";
2
+ import type { SecretProvider } from "./secrets/index.js";
3
+ export declare const START: "__START__";
4
+ export declare const END: "__END__";
5
+ export type JSONValue = string | number | boolean | null | {
6
+ [key: string]: JSONValue;
7
+ } | JSONValue[];
8
+ /**
9
+ * Complete response data from an endpoint execution
10
+ */
11
+ export interface NodeResponseData {
12
+ body: JSONValue;
13
+ headers: Record<string, string>;
14
+ status: number;
15
+ duration_ms: number;
16
+ }
17
+ export interface HttpRequest {
18
+ method: string;
19
+ url: string;
20
+ headers?: Record<string, string>;
21
+ body?: unknown;
22
+ timeout?: number;
23
+ }
24
+ export interface HttpResponse {
25
+ status: number;
26
+ statusText: string;
27
+ data: unknown;
28
+ headers?: Record<string, string>;
29
+ }
30
+ export interface HttpClientAdapter {
31
+ request(req: HttpRequest): Promise<HttpResponse>;
32
+ }
33
+ /**
34
+ * Status update payload for run tracking.
35
+ */
36
+ export interface RunStatusUpdate {
37
+ status: "running" | "completed" | "failed";
38
+ completedAt?: string;
39
+ duration_ms?: number;
40
+ success?: boolean;
41
+ errors?: string[];
42
+ }
43
+ /**
44
+ * Callbacks for tracking execution status (typically for updating a run record).
45
+ */
46
+ export interface StatusCallbacks {
47
+ /**
48
+ * Called when monitor execution starts (after secret resolution, before graph execution).
49
+ */
50
+ onStart?: () => Promise<void>;
51
+ /**
52
+ * Called when monitor execution completes (success or failure).
53
+ */
54
+ onComplete?: (update: RunStatusUpdate) => Promise<void>;
55
+ }
56
+ export interface ExecutionOptions {
57
+ mode: "local" | "remote";
58
+ timeout?: number;
59
+ httpClient: HttpClientAdapter;
60
+ /** Optional event emitter for execution observability */
61
+ eventEmitter?: ExecutionEventEmitter;
62
+ /** Unique execution ID for correlating events (generated if not provided) */
63
+ executionId?: string;
64
+ secretProvider: SecretProvider | null;
65
+ /** Optional callbacks for tracking execution status (e.g., updating run records) */
66
+ statusCallbacks?: StatusCallbacks;
67
+ }
68
+ export interface NodeResult {
69
+ nodeId: string;
70
+ success: boolean;
71
+ response?: JSONValue;
72
+ error?: string;
73
+ duration_ms: number;
74
+ }
75
+ export interface ExecutionResult {
76
+ success: boolean;
77
+ results: NodeResult[];
78
+ errors: string[];
79
+ totalDuration_ms: number;
80
+ }
81
+ export interface HttpRequestResult {
82
+ success: boolean;
83
+ response?: JSONValue;
84
+ headers?: Record<string, string>;
85
+ status?: number;
86
+ error?: string;
87
+ duration_ms: number;
88
+ }
89
+ export interface WaitResult {
90
+ success: boolean;
91
+ duration_ms: number;
92
+ }
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ export const START = "__START__";
2
+ export const END = "__END__";
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,KAAK,GAAG,WAAoB,CAAC;AAC1C,MAAM,CAAC,MAAM,GAAG,GAAG,SAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Date utility functions for consistent UTC handling.
3
+ *
4
+ * All dates should be stored and transmitted as UTC (ISO 8601 strings with Z suffix).
5
+ */
6
+ /**
7
+ * Get the current time as a UTC ISO 8601 string.
8
+ * @returns ISO 8601 string with Z suffix (e.g., "2024-01-23T12:34:56.789Z")
9
+ */
10
+ export declare function utcNow(): string;
11
+ //# sourceMappingURL=dates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.d.ts","sourceRoot":"","sources":["../../src/utils/dates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Date utility functions for consistent UTC handling.
3
+ *
4
+ * All dates should be stored and transmitted as UTC (ISO 8601 strings with Z suffix).
5
+ */
6
+ /**
7
+ * Get the current time as a UTC ISO 8601 string.
8
+ * @returns ISO 8601 string with Z suffix (e.g., "2024-01-23T12:34:56.789Z")
9
+ */
10
+ export function utcNow() {
11
+ return new Date().toISOString();
12
+ }
13
+ //# sourceMappingURL=dates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dates.js","sourceRoot":"","sources":["../../src/utils/dates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@griffin-app/griffin-executor",
3
+ "version": "0.1.0",
4
+ "description": "Executor for griffin JSON test monitors",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "dev": "tsc --watch",
11
+ "test": "vitest run",
12
+ "test:watch": "vitest",
13
+ "test:ui": "vitest --ui"
14
+ },
15
+ "keywords": [
16
+ "griffin",
17
+ "api",
18
+ "testing",
19
+ "executor"
20
+ ],
21
+ "author": "",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "@aws-sdk/client-kinesis": "^3.975.0",
25
+ "@aws-sdk/client-secrets-manager": "^3.981.0",
26
+ "@aws-sdk/client-sts": "^3.981.0",
27
+ "@griffin-app/griffin-hub-sdk": "1.0.25",
28
+ "@griffin-app/griffin-core": "0.1.0",
29
+ "axios": "^1.13.2",
30
+ "ts-edge": "^1.0.4",
31
+ "typebox": "^1.0.77"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^20.10.0",
35
+ "@vitest/ui": "^4.0.17",
36
+ "typescript": "^5.3.3",
37
+ "vitest": "^4.0.17"
38
+ }
39
+ }
@@ -0,0 +1,39 @@
1
+ import axios from "axios";
2
+ import type { HttpClientAdapter, HttpRequest, HttpResponse } from "../types.js";
3
+
4
+ export class AxiosAdapter implements HttpClientAdapter {
5
+ async request(req: HttpRequest): Promise<HttpResponse> {
6
+ try {
7
+ const response = await axios({
8
+ method: req.method,
9
+ url: req.url,
10
+ headers: req.headers,
11
+ data: req.body,
12
+ timeout: req.timeout,
13
+ // Accept all status codes - let assertions determine success/failure
14
+ validateStatus: () => true,
15
+ });
16
+
17
+ return {
18
+ status: response.status,
19
+ statusText: response.statusText,
20
+ data: response.data,
21
+ headers: response.headers as Record<string, string>,
22
+ };
23
+ } catch (error: unknown) {
24
+ // Only throw for actual network/connection errors, not status codes
25
+ if (axios.isAxiosError(error)) {
26
+ if (error.code === "ECONNREFUSED") {
27
+ throw new Error(
28
+ `Connection refused - is the server running on ${req.url}?`,
29
+ );
30
+ }
31
+ if (error.code === "ETIMEDOUT") {
32
+ throw new Error(`Request timed out after ${req.timeout}ms`);
33
+ }
34
+ // Note: error.response will no longer occur due to validateStatus
35
+ }
36
+ throw error;
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,2 @@
1
+ export { AxiosAdapter } from "./axios.js";
2
+ export { StubAdapter, type StubResponse } from "./stub.js";
@@ -0,0 +1,47 @@
1
+ import type { HttpClientAdapter, HttpRequest, HttpResponse } from "../types.js";
2
+
3
+ export interface StubResponse {
4
+ /** URL pattern to match (string for exact, RegExp for pattern, or function for custom logic) */
5
+ match: string | RegExp | ((req: HttpRequest) => boolean);
6
+ response: HttpResponse;
7
+ }
8
+
9
+ export class StubAdapter implements HttpClientAdapter {
10
+ private stubs: StubResponse[] = [];
11
+
12
+ /**
13
+ * Add a stub response for matching requests
14
+ * @param stub - The stub configuration
15
+ * @returns this (for chaining)
16
+ */
17
+ addStub(stub: StubResponse): this {
18
+ this.stubs.push(stub);
19
+ return this;
20
+ }
21
+
22
+ /**
23
+ * Clear all configured stubs
24
+ */
25
+ clearStubs(): void {
26
+ this.stubs = [];
27
+ }
28
+
29
+ async request(req: HttpRequest): Promise<HttpResponse> {
30
+ for (const stub of this.stubs) {
31
+ if (this.matches(stub.match, req)) {
32
+ return stub.response;
33
+ }
34
+ }
35
+ throw new Error(`No stub matched request: ${req.method} ${req.url}`);
36
+ }
37
+
38
+ private matches(match: StubResponse["match"], req: HttpRequest): boolean {
39
+ if (typeof match === "string") {
40
+ return req.url === match;
41
+ }
42
+ if (match instanceof RegExp) {
43
+ return match.test(req.url);
44
+ }
45
+ return match(req);
46
+ }
47
+ }
@@ -0,0 +1,144 @@
1
+ # Event Bus Adapters
2
+
3
+ This directory contains adapters for publishing execution events to various durable event buses. All adapters implement the `DurableEventBusAdapter` interface and can be used with `DurableEventEmitter` for batched event publishing.
4
+
5
+ ## Available Adapters
6
+
7
+ ### KinesisAdapter
8
+
9
+ Publishes events to AWS Kinesis streams. Uses executionId as the partition key to maintain ordering within an execution.
10
+
11
+ **Installation:**
12
+
13
+ ```bash
14
+ npm install @aws-sdk/client-kinesis
15
+ ```
16
+
17
+ **Usage:**
18
+
19
+ ```typescript
20
+ import { KinesisClient } from "@aws-sdk/client-kinesis";
21
+ import {
22
+ DurableEventEmitter,
23
+ KinesisAdapter,
24
+ } from "@griffin-app/griffin-plan-executor";
25
+
26
+ // Create Kinesis client
27
+ const kinesisClient = new KinesisClient({ region: "us-east-1" });
28
+
29
+ // Create adapter
30
+ const adapter = new KinesisAdapter({
31
+ client: kinesisClient,
32
+ streamName: "griffin-execution-events",
33
+ maxRetries: 3,
34
+ retryDelayMs: 1000,
35
+ });
36
+
37
+ // Create emitter with adapter
38
+ const emitter = new DurableEventEmitter(adapter, {
39
+ batchSize: 50,
40
+ flushIntervalMs: 100,
41
+ });
42
+
43
+ // Use with executor
44
+ const result = await executeMonitorV1(monitor, {
45
+ eventEmitter: emitter,
46
+ });
47
+
48
+ // Ensure all events are flushed
49
+ await emitter.flush();
50
+ emitter.destroy();
51
+ ```
52
+
53
+ **Features:**
54
+
55
+ - Automatic batching up to 500 records (Kinesis limit)
56
+ - Retry logic with configurable attempts and delays
57
+ - Partition by executionId for ordering guarantees
58
+ - Handles partial failures gracefully
59
+
60
+ ### InMemoryAdapter
61
+
62
+ Simple in-memory storage for testing and local development.
63
+
64
+ **Usage:**
65
+
66
+ ```typescript
67
+ import {
68
+ DurableEventEmitter,
69
+ InMemoryAdapter,
70
+ } from "@griffin-app/griffin-plan-executor";
71
+
72
+ const adapter = new InMemoryAdapter({
73
+ latencyMs: 10, // Optional: simulate network latency
74
+ failureProbability: 0.1, // Optional: simulate failures for testing
75
+ });
76
+
77
+ const emitter = new DurableEventEmitter(adapter, {
78
+ batchSize: 10,
79
+ flushIntervalMs: 50,
80
+ });
81
+
82
+ // Execute monitor
83
+ await executeMonitorV1(monitor, { eventEmitter: emitter });
84
+ await emitter.flush();
85
+
86
+ // Inspect events
87
+ const allEvents = adapter.getEvents();
88
+ const planStartEvents = adapter.getEventsByType("MONITOR_START");
89
+ const executionEvents = adapter.getEventsForExecution("exec-123");
90
+ const publishCount = adapter.getPublishCount(); // Number of batches
91
+
92
+ // Clean up
93
+ adapter.clear();
94
+ emitter.destroy();
95
+ ```
96
+
97
+ **Features:**
98
+
99
+ - Store events in memory for inspection
100
+ - Query by type or executionId
101
+ - Simulate latency and failures
102
+ - Track batch publish count
103
+
104
+ ## Creating Custom Adapters
105
+
106
+ To create a new adapter, implement the `DurableEventBusAdapter` interface:
107
+
108
+ ```typescript
109
+ import type {
110
+ DurableEventBusAdapter,
111
+ ExecutionEvent,
112
+ } from "@griffin-app/griffin-plan-executor";
113
+
114
+ export class MyCustomAdapter implements DurableEventBusAdapter {
115
+ async publish(events: ExecutionEvent[]): Promise<void> {
116
+ // Serialize events
117
+ const serialized = events.map((e) => JSON.stringify(e));
118
+
119
+ // Publish to your event bus
120
+ await myEventBus.send(serialized);
121
+ }
122
+ }
123
+ ```
124
+
125
+ **Best Practices:**
126
+
127
+ - Handle serialization internally
128
+ - Implement retry logic for transient failures
129
+ - Consider partitioning strategies for ordering
130
+ - Log errors without throwing (events are best-effort)
131
+ - Support batching for efficiency
132
+
133
+ ## Adapter Comparison
134
+
135
+ | Adapter | Use Case | Ordering | Durability | Dependencies |
136
+ | --------------- | ------------------ | --------------- | ---------------- | ----------------------- |
137
+ | InMemoryAdapter | Testing, local dev | None | None (in-memory) | None |
138
+ | KinesisAdapter | Production AWS | Per executionId | High | @aws-sdk/client-kinesis |
139
+
140
+ ## Coming Soon
141
+
142
+ - SQS adapter (FIFO queues for ordering)
143
+ - Kafka adapter (for high-throughput scenarios)
144
+ - Redis Streams adapter (lightweight alternative)