@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.
- package/README.md +152 -0
- package/dist/adapters/axios.d.ts +5 -0
- package/dist/adapters/axios.d.ts.map +1 -0
- package/dist/adapters/axios.js +36 -0
- package/dist/adapters/axios.js.map +1 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/stub.d.ts +22 -0
- package/dist/adapters/stub.d.ts.map +1 -0
- package/dist/adapters/stub.js +36 -0
- package/dist/adapters/stub.js.map +1 -0
- package/dist/events/adapters/in-memory.d.ts +52 -0
- package/dist/events/adapters/in-memory.d.ts.map +1 -0
- package/dist/events/adapters/in-memory.js +70 -0
- package/dist/events/adapters/in-memory.js.map +1 -0
- package/dist/events/adapters/in-memory.test.d.ts +2 -0
- package/dist/events/adapters/in-memory.test.d.ts.map +1 -0
- package/dist/events/adapters/in-memory.test.js +109 -0
- package/dist/events/adapters/in-memory.test.js.map +1 -0
- package/dist/events/adapters/index.d.ts +9 -0
- package/dist/events/adapters/index.d.ts.map +1 -0
- package/dist/events/adapters/index.js +9 -0
- package/dist/events/adapters/index.js.map +1 -0
- package/dist/events/adapters/kinesis.d.ts +91 -0
- package/dist/events/adapters/kinesis.d.ts.map +1 -0
- package/dist/events/adapters/kinesis.js +136 -0
- package/dist/events/adapters/kinesis.js.map +1 -0
- package/dist/events/adapters/kinesis.test.d.ts +2 -0
- package/dist/events/adapters/kinesis.test.d.ts.map +1 -0
- package/dist/events/adapters/kinesis.test.js +249 -0
- package/dist/events/adapters/kinesis.test.js.map +1 -0
- package/dist/events/emitter.d.ts +68 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +83 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/emitter.test.d.ts +2 -0
- package/dist/events/emitter.test.d.ts.map +1 -0
- package/dist/events/emitter.test.js +262 -0
- package/dist/events/emitter.test.js.map +1 -0
- package/dist/events/index.d.ts +4 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +112 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +9 -0
- package/dist/events/types.js.map +1 -0
- package/dist/executor.d.ts +4 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +799 -0
- package/dist/executor.js.map +1 -0
- package/dist/executor.test.d.ts +2 -0
- package/dist/executor.test.d.ts.map +1 -0
- package/dist/executor.test.js +1584 -0
- package/dist/executor.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/secrets/factory.d.ts +121 -0
- package/dist/secrets/factory.d.ts.map +1 -0
- package/dist/secrets/factory.js +137 -0
- package/dist/secrets/factory.js.map +1 -0
- package/dist/secrets/index.d.ts +14 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +18 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/providers/aws.d.ts +63 -0
- package/dist/secrets/providers/aws.d.ts.map +1 -0
- package/dist/secrets/providers/aws.js +110 -0
- package/dist/secrets/providers/aws.js.map +1 -0
- package/dist/secrets/providers/env.d.ts +36 -0
- package/dist/secrets/providers/env.d.ts.map +1 -0
- package/dist/secrets/providers/env.js +37 -0
- package/dist/secrets/providers/env.js.map +1 -0
- package/dist/secrets/providers/index.d.ts +7 -0
- package/dist/secrets/providers/index.d.ts.map +1 -0
- package/dist/secrets/providers/index.js +7 -0
- package/dist/secrets/providers/index.js.map +1 -0
- package/dist/secrets/providers/vault.d.ts +75 -0
- package/dist/secrets/providers/vault.d.ts.map +1 -0
- package/dist/secrets/providers/vault.js +143 -0
- package/dist/secrets/providers/vault.js.map +1 -0
- package/dist/secrets/registry.d.ts +39 -0
- package/dist/secrets/registry.d.ts.map +1 -0
- package/dist/secrets/registry.js +134 -0
- package/dist/secrets/registry.js.map +1 -0
- package/dist/secrets/resolver.d.ts +45 -0
- package/dist/secrets/resolver.d.ts.map +1 -0
- package/dist/secrets/resolver.js +188 -0
- package/dist/secrets/resolver.js.map +1 -0
- package/dist/secrets/secrets.test.d.ts +2 -0
- package/dist/secrets/secrets.test.d.ts.map +1 -0
- package/dist/secrets/secrets.test.js +317 -0
- package/dist/secrets/secrets.test.js.map +1 -0
- package/dist/secrets/types.d.ts +70 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +42 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/shared.d.ts +8 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +30 -0
- package/dist/shared.js.map +1 -0
- package/dist/test-monitor-types.d.ts +43 -0
- package/dist/test-monitor-types.d.ts.map +1 -0
- package/dist/test-monitor-types.js +2 -0
- package/dist/test-monitor-types.js.map +1 -0
- package/dist/test-plan-types.d.ts +43 -0
- package/dist/test-plan-types.d.ts.map +1 -0
- package/dist/test-plan-types.js +2 -0
- package/dist/test-plan-types.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/dates.d.ts +11 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +13 -0
- package/dist/utils/dates.js.map +1 -0
- package/package.json +39 -0
- package/src/adapters/axios.ts +39 -0
- package/src/adapters/index.ts +2 -0
- package/src/adapters/stub.ts +47 -0
- package/src/events/adapters/README.md +144 -0
- package/src/events/adapters/in-memory.test.ts +146 -0
- package/src/events/adapters/in-memory.ts +93 -0
- package/src/events/adapters/index.ts +9 -0
- package/src/events/adapters/kinesis.test.ts +323 -0
- package/src/events/adapters/kinesis.ts +211 -0
- package/src/events/emitter.test.ts +327 -0
- package/src/events/emitter.ts +133 -0
- package/src/events/index.ts +3 -0
- package/src/events/types.ts +136 -0
- package/src/executor.test.ts +1732 -0
- package/src/executor.ts +1075 -0
- package/src/index.ts +81 -0
- package/src/secrets/factory.ts +248 -0
- package/src/secrets/index.ts +48 -0
- package/src/secrets/providers/aws.ts +178 -0
- package/src/secrets/providers/env.ts +66 -0
- package/src/secrets/providers/index.ts +15 -0
- package/src/secrets/providers/vault.ts +257 -0
- package/src/secrets/resolver.ts +269 -0
- package/src/secrets/secrets.test.ts +402 -0
- package/src/secrets/types.ts +106 -0
- package/src/shared.ts +46 -0
- package/src/test-monitor-types.ts +49 -0
- package/src/types.ts +114 -0
- package/src/utils/dates.ts +13 -0
- package/tsconfig.json +20 -0
- 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"}
|
package/dist/shared.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"test-plan-types.js","sourceRoot":"","sources":["../src/test-plan-types.ts"],"names":[],"mappings":""}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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,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)
|