kadi-harness-runtime 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/dist/adapter-loader.d.ts +35 -0
- package/dist/adapter-loader.d.ts.map +1 -0
- package/dist/adapter-loader.js +109 -0
- package/dist/adapter-loader.js.map +1 -0
- package/dist/event-bus.d.ts +55 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +170 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-normalizer.d.ts +41 -0
- package/dist/event-normalizer.d.ts.map +1 -0
- package/dist/event-normalizer.js +68 -0
- package/dist/event-normalizer.js.map +1 -0
- package/dist/gateways/artifacts.d.ts +24 -0
- package/dist/gateways/artifacts.d.ts.map +1 -0
- package/dist/gateways/artifacts.js +128 -0
- package/dist/gateways/artifacts.js.map +1 -0
- package/dist/gateways/authorization.d.ts +38 -0
- package/dist/gateways/authorization.d.ts.map +1 -0
- package/dist/gateways/authorization.js +118 -0
- package/dist/gateways/authorization.js.map +1 -0
- package/dist/gateways/events.d.ts +31 -0
- package/dist/gateways/events.d.ts.map +1 -0
- package/dist/gateways/events.js +135 -0
- package/dist/gateways/events.js.map +1 -0
- package/dist/gateways/redaction.d.ts +2 -0
- package/dist/gateways/redaction.d.ts.map +1 -0
- package/dist/gateways/redaction.js +2 -0
- package/dist/gateways/redaction.js.map +1 -0
- package/dist/gateways/sessions.d.ts +27 -0
- package/dist/gateways/sessions.d.ts.map +1 -0
- package/dist/gateways/sessions.js +167 -0
- package/dist/gateways/sessions.js.map +1 -0
- package/dist/gateways/tools.d.ts +36 -0
- package/dist/gateways/tools.d.ts.map +1 -0
- package/dist/gateways/tools.js +135 -0
- package/dist/gateways/tools.js.map +1 -0
- package/dist/index.d.ts +82 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +23 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +63 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/policy/redaction.d.ts +10 -0
- package/dist/policy/redaction.d.ts.map +1 -0
- package/dist/policy/redaction.js +48 -0
- package/dist/policy/redaction.js.map +1 -0
- package/dist/protocol/context-client.d.ts +50 -0
- package/dist/protocol/context-client.d.ts.map +1 -0
- package/dist/protocol/context-client.js +49 -0
- package/dist/protocol/context-client.js.map +1 -0
- package/dist/protocol/context-server.d.ts +19 -0
- package/dist/protocol/context-server.d.ts.map +1 -0
- package/dist/protocol/context-server.js +103 -0
- package/dist/protocol/context-server.js.map +1 -0
- package/dist/registry.d.ts +42 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +210 -0
- package/dist/registry.js.map +1 -0
- package/dist/run-coordinator.d.ts +47 -0
- package/dist/run-coordinator.d.ts.map +1 -0
- package/dist/run-coordinator.js +241 -0
- package/dist/run-coordinator.js.map +1 -0
- package/dist/runner/cli.d.ts +18 -0
- package/dist/runner/cli.d.ts.map +1 -0
- package/dist/runner/cli.js +54 -0
- package/dist/runner/cli.js.map +1 -0
- package/dist/runner/runner-service.d.ts +88 -0
- package/dist/runner/runner-service.d.ts.map +1 -0
- package/dist/runner/runner-service.js +138 -0
- package/dist/runner/runner-service.js.map +1 -0
- package/dist/runtime.d.ts +96 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +330 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scheduling/request-store.d.ts +71 -0
- package/dist/scheduling/request-store.d.ts.map +1 -0
- package/dist/scheduling/request-store.js +173 -0
- package/dist/scheduling/request-store.js.map +1 -0
- package/dist/scheduling/signing.d.ts +57 -0
- package/dist/scheduling/signing.d.ts.map +1 -0
- package/dist/scheduling/signing.js +142 -0
- package/dist/scheduling/signing.js.map +1 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# kadi-harness-runtime
|
|
2
|
+
|
|
3
|
+
Frontend-neutral KADI harness execution runtime.
|
|
4
|
+
|
|
5
|
+
## Runner binary
|
|
6
|
+
|
|
7
|
+
The package exposes `kadi-harness-runner` through the npm `bin` field. After
|
|
8
|
+
installing the package, invoke it directly from a shell or from
|
|
9
|
+
`kadi-schedule`'s child-process task executor:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
kadi-harness-runner --reference <base64url-signed-reference>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
For local development, use `npm link` (or `npx kadi-harness-runner`) so the
|
|
16
|
+
binary resolves from the package's `dist/runner/cli.js`. The runner loads a
|
|
17
|
+
deployment-specific module named by `KADI_HARNESS_RUNNER_MODULE`; that module
|
|
18
|
+
exports `createRunnerService()` and supplies the runtime registry, request
|
|
19
|
+
store, signing-key provider, and replay guard. This keeps credentials and KADI
|
|
20
|
+
service wiring out of scheduled task commands.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AdapterIdentity, HarnessAdapter, KadiError } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
export type AdapterFactory = () => HarnessAdapter | Promise<HarnessAdapter>;
|
|
3
|
+
export interface AdapterPackageSource {
|
|
4
|
+
readonly specifier: string;
|
|
5
|
+
readonly load?: () => Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface AdapterLoaderOptions {
|
|
8
|
+
/** Package specifiers are sorted before loading for deterministic discovery. */
|
|
9
|
+
readonly packages: readonly (string | AdapterPackageSource)[];
|
|
10
|
+
readonly importModule?: (specifier: string) => Promise<unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface LoadedAdapter {
|
|
13
|
+
readonly adapter: HarnessAdapter;
|
|
14
|
+
readonly source: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AdapterLoadFailure {
|
|
17
|
+
readonly source: string;
|
|
18
|
+
readonly error: KadiError;
|
|
19
|
+
}
|
|
20
|
+
export interface AdapterLoadResult {
|
|
21
|
+
readonly adapters: readonly LoadedAdapter[];
|
|
22
|
+
readonly failures: readonly AdapterLoadFailure[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Loads explicitly configured adapter packages. Discovery is metadata/factory
|
|
26
|
+
* based and never calls adapter.initialize(), so native harness processes are
|
|
27
|
+
* not started until the runtime selects a strategy for a run.
|
|
28
|
+
*/
|
|
29
|
+
export declare class AdapterLoader {
|
|
30
|
+
private readonly options;
|
|
31
|
+
constructor(options: AdapterLoaderOptions);
|
|
32
|
+
load(): Promise<AdapterLoadResult>;
|
|
33
|
+
}
|
|
34
|
+
export type AdapterIdentitySummary = Pick<AdapterIdentity, "id" | "name" | "version" | "contractVersion">;
|
|
35
|
+
//# sourceMappingURL=adapter-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-loader.d.ts","sourceRoot":"","sources":["../src/adapter-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAEjH,MAAM,MAAM,cAAc,GAAG,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC;IAC9D,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AAmED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAE5B,OAAO,EAAE,oBAAoB;IAInC,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAoChD;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const ADAPTER_EXPORTS = ["default", "adapter", "kadiHarnessAdapter", "createAdapter", "adapters"];
|
|
2
|
+
function asRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null ? value : undefined;
|
|
4
|
+
}
|
|
5
|
+
function isHarnessAdapter(value) {
|
|
6
|
+
const candidate = asRecord(value);
|
|
7
|
+
return (candidate !== undefined &&
|
|
8
|
+
typeof candidate.identity === "object" &&
|
|
9
|
+
candidate.identity !== null &&
|
|
10
|
+
typeof candidate.transport === "object" &&
|
|
11
|
+
candidate.transport !== null &&
|
|
12
|
+
typeof candidate.getCapabilities === "function" &&
|
|
13
|
+
typeof candidate.initialize === "function" &&
|
|
14
|
+
typeof candidate.run === "function" &&
|
|
15
|
+
typeof candidate.cancel === "function" &&
|
|
16
|
+
typeof candidate.close === "function");
|
|
17
|
+
}
|
|
18
|
+
function toMessage(error) {
|
|
19
|
+
return error instanceof Error ? error.message : String(error);
|
|
20
|
+
}
|
|
21
|
+
function loadError(source, message, cause) {
|
|
22
|
+
const details = { source };
|
|
23
|
+
if (cause !== undefined)
|
|
24
|
+
details.cause = toMessage(cause);
|
|
25
|
+
return {
|
|
26
|
+
source,
|
|
27
|
+
error: {
|
|
28
|
+
code: "adapter_load_failed",
|
|
29
|
+
category: "adapter_unavailable",
|
|
30
|
+
message,
|
|
31
|
+
retryable: true,
|
|
32
|
+
details,
|
|
33
|
+
cause: cause === undefined ? undefined : { message: toMessage(cause) },
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function factoriesFromModule(moduleValue) {
|
|
38
|
+
const moduleRecord = asRecord(moduleValue);
|
|
39
|
+
if (moduleRecord === undefined)
|
|
40
|
+
return [moduleValue];
|
|
41
|
+
const candidates = [];
|
|
42
|
+
for (const exportName of ADAPTER_EXPORTS) {
|
|
43
|
+
const candidate = moduleRecord[exportName];
|
|
44
|
+
if (candidate !== undefined)
|
|
45
|
+
candidates.push(candidate);
|
|
46
|
+
}
|
|
47
|
+
return candidates.length > 0 ? candidates : [moduleValue];
|
|
48
|
+
}
|
|
49
|
+
async function materialize(candidate) {
|
|
50
|
+
const value = typeof candidate === "function" ? await candidate() : candidate;
|
|
51
|
+
if (Array.isArray(value)) {
|
|
52
|
+
const adapters = [];
|
|
53
|
+
for (const entry of value)
|
|
54
|
+
adapters.push(...(await materialize(entry)));
|
|
55
|
+
return adapters;
|
|
56
|
+
}
|
|
57
|
+
if (!isHarnessAdapter(value))
|
|
58
|
+
throw new Error("package export does not provide a conforming HarnessAdapter");
|
|
59
|
+
return [value];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Loads explicitly configured adapter packages. Discovery is metadata/factory
|
|
63
|
+
* based and never calls adapter.initialize(), so native harness processes are
|
|
64
|
+
* not started until the runtime selects a strategy for a run.
|
|
65
|
+
*/
|
|
66
|
+
export class AdapterLoader {
|
|
67
|
+
options;
|
|
68
|
+
constructor(options) {
|
|
69
|
+
this.options = options;
|
|
70
|
+
}
|
|
71
|
+
async load() {
|
|
72
|
+
const sources = [...this.options.packages].sort((left, right) => {
|
|
73
|
+
const leftSpecifier = typeof left === "string" ? left : left.specifier;
|
|
74
|
+
const rightSpecifier = typeof right === "string" ? right : right.specifier;
|
|
75
|
+
return leftSpecifier.localeCompare(rightSpecifier);
|
|
76
|
+
});
|
|
77
|
+
const adapters = [];
|
|
78
|
+
const failures = [];
|
|
79
|
+
for (const sourceEntry of sources) {
|
|
80
|
+
const sourceConfig = typeof sourceEntry === "string" ? undefined : sourceEntry;
|
|
81
|
+
const source = typeof sourceEntry === "string" ? sourceEntry : sourceEntry.specifier;
|
|
82
|
+
try {
|
|
83
|
+
const moduleValue = sourceConfig?.load
|
|
84
|
+
? await sourceConfig.load()
|
|
85
|
+
: await (this.options.importModule ?? ((specifier) => import(specifier)))(source);
|
|
86
|
+
const candidates = factoriesFromModule(moduleValue);
|
|
87
|
+
let found = false;
|
|
88
|
+
const moduleAdapterKeys = new Set();
|
|
89
|
+
for (const candidate of candidates) {
|
|
90
|
+
for (const adapter of await materialize(candidate)) {
|
|
91
|
+
const adapterKey = `${adapter.identity.id}\u0000${adapter.identity.version}`;
|
|
92
|
+
if (moduleAdapterKeys.has(adapterKey))
|
|
93
|
+
continue;
|
|
94
|
+
moduleAdapterKeys.add(adapterKey);
|
|
95
|
+
adapters.push({ adapter, source });
|
|
96
|
+
found = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!found)
|
|
100
|
+
failures.push(loadError(source, "package did not export an adapter"));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
failures.push(loadError(source, `failed to load adapter package '${source}'`, error));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { adapters, failures };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=adapter-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-loader.js","sourceRoot":"","sources":["../src/adapter-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type EventFilter, type HarnessEvent, type KadiError } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
import { EventNormalizer, type AdapterEventUpdate, type EventNormalizerOptions, type EventScope } from "./event-normalizer.js";
|
|
3
|
+
export interface EventObserveOptions extends EventFilter {
|
|
4
|
+
readonly signal?: AbortSignal;
|
|
5
|
+
}
|
|
6
|
+
export type EventDropReason = "duplicate_event" | "terminal_closed";
|
|
7
|
+
export interface EventPublishResult {
|
|
8
|
+
readonly accepted: boolean;
|
|
9
|
+
readonly event: HarnessEvent;
|
|
10
|
+
readonly reason?: EventDropReason;
|
|
11
|
+
}
|
|
12
|
+
export interface EventBusDiagnostics {
|
|
13
|
+
readonly published: number;
|
|
14
|
+
readonly duplicateEvents: number;
|
|
15
|
+
readonly droppedAfterTerminal: number;
|
|
16
|
+
readonly invalidEvents: number;
|
|
17
|
+
readonly activeSubscribers: number;
|
|
18
|
+
readonly terminalRuns: number;
|
|
19
|
+
readonly trackedRuns: number;
|
|
20
|
+
}
|
|
21
|
+
export interface EventBusOptions {
|
|
22
|
+
readonly contractVersion?: string;
|
|
23
|
+
readonly normalizer?: EventNormalizer;
|
|
24
|
+
readonly normalizerOptions?: EventNormalizerOptions;
|
|
25
|
+
}
|
|
26
|
+
export interface EventSubscription {
|
|
27
|
+
readonly events: AsyncIterable<HarnessEvent>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare class EventBusError extends Error {
|
|
31
|
+
readonly error: KadiError;
|
|
32
|
+
constructor(error: KadiError);
|
|
33
|
+
}
|
|
34
|
+
export declare class EventBus {
|
|
35
|
+
private readonly contractVersion;
|
|
36
|
+
private readonly normalizer;
|
|
37
|
+
private readonly runs;
|
|
38
|
+
private readonly subscribers;
|
|
39
|
+
private published;
|
|
40
|
+
private duplicateEvents;
|
|
41
|
+
private droppedAfterTerminal;
|
|
42
|
+
private invalidEvents;
|
|
43
|
+
constructor(options?: EventBusOptions);
|
|
44
|
+
publish(event: HarnessEvent): Promise<EventPublishResult>;
|
|
45
|
+
publishUpdate(scope: EventScope, update: AdapterEventUpdate): Promise<EventPublishResult>;
|
|
46
|
+
subscribe(runId: string, options?: EventObserveOptions): EventSubscription;
|
|
47
|
+
observe(runId: string, options?: EventObserveOptions): AsyncIterable<HarnessEvent>;
|
|
48
|
+
diagnostics(): EventBusDiagnostics;
|
|
49
|
+
private createRun;
|
|
50
|
+
private replay;
|
|
51
|
+
private deliver;
|
|
52
|
+
private next;
|
|
53
|
+
private closeSubscriber;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAEjB,KAAK,SAAS,EAEf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,iBAAiB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;CACrD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA6CD,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAgB,KAAK,EAAE,SAAS,CAAC;gBAEd,KAAK,EAAE,SAAS;CAKpC;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;IACrD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,aAAa,CAAK;gBAEP,OAAO,GAAE,eAAoB;IAQnC,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuCzD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAS/F,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,iBAAiB;IA8B9E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,aAAa,CAAC,YAAY,CAAC;IAItF,WAAW,IAAI,mBAAmB;IAYzC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;YAQE,eAAe;CAQ9B"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { CONTRACT_VERSION, HarnessEventSchema, } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
import { EventNormalizer, EventNormalizationError, } from "./event-normalizer.js";
|
|
3
|
+
function makeError(code, message, details = {}) {
|
|
4
|
+
return {
|
|
5
|
+
code,
|
|
6
|
+
category: "validation",
|
|
7
|
+
message,
|
|
8
|
+
retryable: false,
|
|
9
|
+
details: Object.fromEntries(Object.entries(details).filter(([, value]) => value !== undefined)),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function isTerminal(type) {
|
|
13
|
+
return type === "completed" || type === "failed" || type === "cancelled";
|
|
14
|
+
}
|
|
15
|
+
function matches(event, types) {
|
|
16
|
+
return types === undefined || types.includes(event.type);
|
|
17
|
+
}
|
|
18
|
+
export class EventBusError extends Error {
|
|
19
|
+
error;
|
|
20
|
+
constructor(error) {
|
|
21
|
+
super(error.message);
|
|
22
|
+
this.name = "EventBusError";
|
|
23
|
+
this.error = error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class EventBus {
|
|
27
|
+
contractVersion;
|
|
28
|
+
normalizer;
|
|
29
|
+
runs = new Map();
|
|
30
|
+
subscribers = new Set();
|
|
31
|
+
published = 0;
|
|
32
|
+
duplicateEvents = 0;
|
|
33
|
+
droppedAfterTerminal = 0;
|
|
34
|
+
invalidEvents = 0;
|
|
35
|
+
constructor(options = {}) {
|
|
36
|
+
this.contractVersion = options.contractVersion ?? CONTRACT_VERSION;
|
|
37
|
+
this.normalizer = options.normalizer ?? new EventNormalizer({
|
|
38
|
+
contractVersion: this.contractVersion,
|
|
39
|
+
...options.normalizerOptions,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async publish(event) {
|
|
43
|
+
const parsed = HarnessEventSchema.safeParse(event);
|
|
44
|
+
if (!parsed.success) {
|
|
45
|
+
this.invalidEvents += 1;
|
|
46
|
+
throw new EventBusError(makeError("invalid_harness_event", "event does not satisfy the published HarnessEvent schema", { issues: parsed.error.issues.map((issue) => ({ path: issue.path.map(String).join("."), message: issue.message })) }));
|
|
47
|
+
}
|
|
48
|
+
const normalized = parsed.data;
|
|
49
|
+
if (normalized.contractVersion !== this.contractVersion) {
|
|
50
|
+
this.invalidEvents += 1;
|
|
51
|
+
throw new EventBusError({
|
|
52
|
+
...makeError("incompatible_harness_event", `event contract ${normalized.contractVersion} does not match bus contract ${this.contractVersion}`, { eventContractVersion: normalized.contractVersion, busContractVersion: this.contractVersion }),
|
|
53
|
+
category: "contract_incompatible",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
const run = this.runs.get(normalized.runId) ?? this.createRun(normalized.runId);
|
|
57
|
+
if (run.eventIds.has(normalized.eventId)) {
|
|
58
|
+
this.duplicateEvents += 1;
|
|
59
|
+
return { accepted: false, event: normalized, reason: "duplicate_event" };
|
|
60
|
+
}
|
|
61
|
+
if (run.terminal) {
|
|
62
|
+
this.droppedAfterTerminal += 1;
|
|
63
|
+
return { accepted: false, event: normalized, reason: "terminal_closed" };
|
|
64
|
+
}
|
|
65
|
+
run.eventIds.add(normalized.eventId);
|
|
66
|
+
run.events.push(normalized);
|
|
67
|
+
this.published += 1;
|
|
68
|
+
if (isTerminal(normalized.type))
|
|
69
|
+
run.terminal = true;
|
|
70
|
+
this.deliver(normalized);
|
|
71
|
+
return { accepted: true, event: normalized };
|
|
72
|
+
}
|
|
73
|
+
async publishUpdate(scope, update) {
|
|
74
|
+
try {
|
|
75
|
+
return await this.publish(this.normalizer.normalize(update, scope));
|
|
76
|
+
}
|
|
77
|
+
catch (caught) {
|
|
78
|
+
if (caught instanceof EventNormalizationError)
|
|
79
|
+
this.invalidEvents += 1;
|
|
80
|
+
throw caught;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
subscribe(runId, options = {}) {
|
|
84
|
+
const stored = this.runs.get(runId);
|
|
85
|
+
const subscriber = {
|
|
86
|
+
runId,
|
|
87
|
+
types: options.types,
|
|
88
|
+
queue: this.replay(stored?.events ?? [], options),
|
|
89
|
+
pending: [],
|
|
90
|
+
closed: false,
|
|
91
|
+
};
|
|
92
|
+
this.subscribers.add(subscriber);
|
|
93
|
+
if (options.signal) {
|
|
94
|
+
const abort = () => { void this.closeSubscriber(subscriber); };
|
|
95
|
+
if (options.signal.aborted)
|
|
96
|
+
abort();
|
|
97
|
+
else {
|
|
98
|
+
options.signal.addEventListener("abort", abort, { once: true });
|
|
99
|
+
subscriber.removeAbortListener = () => options.signal?.removeEventListener("abort", abort);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const close = async () => this.closeSubscriber(subscriber);
|
|
103
|
+
const iterator = {
|
|
104
|
+
next: () => this.next(subscriber),
|
|
105
|
+
return: async () => {
|
|
106
|
+
await close();
|
|
107
|
+
return { done: true, value: undefined };
|
|
108
|
+
},
|
|
109
|
+
[Symbol.asyncIterator]() { return this; },
|
|
110
|
+
};
|
|
111
|
+
return { events: iterator, close };
|
|
112
|
+
}
|
|
113
|
+
observe(runId, options = {}) {
|
|
114
|
+
return this.subscribe(runId, options).events;
|
|
115
|
+
}
|
|
116
|
+
diagnostics() {
|
|
117
|
+
return {
|
|
118
|
+
published: this.published,
|
|
119
|
+
duplicateEvents: this.duplicateEvents,
|
|
120
|
+
droppedAfterTerminal: this.droppedAfterTerminal,
|
|
121
|
+
invalidEvents: this.invalidEvents,
|
|
122
|
+
activeSubscribers: this.subscribers.size,
|
|
123
|
+
terminalRuns: [...this.runs.values()].filter((run) => run.terminal).length,
|
|
124
|
+
trackedRuns: this.runs.size,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
createRun(runId) {
|
|
128
|
+
const run = { events: [], eventIds: new Set(), terminal: false };
|
|
129
|
+
this.runs.set(runId, run);
|
|
130
|
+
return run;
|
|
131
|
+
}
|
|
132
|
+
replay(events, options) {
|
|
133
|
+
let start = 0;
|
|
134
|
+
if (options.afterEventId) {
|
|
135
|
+
const index = events.findIndex((event) => event.eventId === options.afterEventId);
|
|
136
|
+
start = index >= 0 ? index + 1 : 0;
|
|
137
|
+
}
|
|
138
|
+
return events.slice(start).filter((event) => matches(event, options.types));
|
|
139
|
+
}
|
|
140
|
+
deliver(event) {
|
|
141
|
+
for (const subscriber of this.subscribers) {
|
|
142
|
+
if (subscriber.closed || subscriber.runId !== event.runId || !matches(event, subscriber.types))
|
|
143
|
+
continue;
|
|
144
|
+
const pending = subscriber.pending.shift();
|
|
145
|
+
if (pending)
|
|
146
|
+
pending.resolve({ done: false, value: event });
|
|
147
|
+
else
|
|
148
|
+
subscriber.queue.push(event);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
next(subscriber) {
|
|
152
|
+
if (subscriber.queue.length > 0) {
|
|
153
|
+
return Promise.resolve({ done: false, value: subscriber.queue.shift() });
|
|
154
|
+
}
|
|
155
|
+
if (subscriber.closed)
|
|
156
|
+
return Promise.resolve({ done: true, value: undefined });
|
|
157
|
+
return new Promise((resolve) => subscriber.pending.push({ resolve }));
|
|
158
|
+
}
|
|
159
|
+
async closeSubscriber(subscriber) {
|
|
160
|
+
if (subscriber.closed)
|
|
161
|
+
return;
|
|
162
|
+
subscriber.closed = true;
|
|
163
|
+
this.subscribers.delete(subscriber);
|
|
164
|
+
subscriber.removeAbortListener?.();
|
|
165
|
+
const pending = subscriber.pending.splice(0);
|
|
166
|
+
for (const waiter of pending)
|
|
167
|
+
waiter.resolve({ done: true, value: undefined });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAMnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,uBAAuB,GAIxB,MAAM,uBAAuB,CAAC;AAsD/B,SAAS,SAAS,CAChB,IAAY,EACZ,OAAe,EACf,UAAmC,EAAE;IAErC,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,YAAY;QACtB,OAAO;QACP,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,MAAM,CAAC,WAAW,CACzB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CACrD;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAsB;IACxC,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,CAAC;AAC3E,CAAC;AAED,SAAS,OAAO,CAAC,KAAmB,EAAE,KAA8C;IAClF,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtB,KAAK,CAAY;IAEjC,YAAmB,KAAgB;QACjC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,MAAM,OAAO,QAAQ;IACF,eAAe,CAAS;IACxB,UAAU,CAAkB;IAC5B,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IACpC,WAAW,GAAG,IAAI,GAAG,EAAc,CAAC;IAC7C,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,CAAC,CAAC;IACpB,oBAAoB,GAAG,CAAC,CAAC;IACzB,aAAa,GAAG,CAAC,CAAC;IAE1B,YAAmB,UAA2B,EAAE;QAC9C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,gBAAgB,CAAC;QACnE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,eAAe,CAAC;YAC1D,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,GAAG,OAAO,CAAC,iBAAiB;SAC7B,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,KAAmB;QACtC,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;YACxB,MAAM,IAAI,aAAa,CAAC,SAAS,CAC/B,uBAAuB,EACvB,0DAA0D,EAC1D,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CACrH,CAAC,CAAC;QACL,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,UAAU,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACxD,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;YACxB,MAAM,IAAI,aAAa,CAAC;gBACtB,GAAG,SAAS,CACV,4BAA4B,EAC5B,kBAAkB,UAAU,CAAC,eAAe,gCAAgC,IAAI,CAAC,eAAe,EAAE,EAClG,EAAE,oBAAoB,EAAE,UAAU,CAAC,eAAe,EAAE,kBAAkB,EAAE,IAAI,CAAC,eAAe,EAAE,CAC/F;gBACD,QAAQ,EAAE,uBAAuB;aAClC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;YAC1B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC3E,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAC/B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC3E,CAAC;QACD,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,KAAiB,EAAE,MAA0B;QACtE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,MAAM,YAAY,uBAAuB;gBAAE,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;YACvE,MAAM,MAAM,CAAC;QACf,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,KAAa,EAAE,UAA+B,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,UAAU,GAAe;YAC7B,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC;YACjD,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,KAAK;SACd,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;gBAAE,KAAK,EAAE,CAAC;iBAC/B,CAAC;gBACJ,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChE,UAAU,CAAC,mBAAmB,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAwC;YACpD,IAAI,EAAE,GAA0C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YACxE,MAAM,EAAE,KAAK,IAA2C,EAAE;gBACxD,MAAM,KAAK,EAAE,CAAC;gBACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC;YACnD,CAAC;YACD,CAAC,MAAM,CAAC,aAAa,CAAC,KAA0C,OAAO,IAAI,CAAC,CAAC,CAAC;SAC/E,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAEM,OAAO,CAAC,KAAa,EAAE,UAA+B,EAAE;QAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC;IAEM,WAAW;QAChB,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YACxC,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM;YAC1E,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;SAC5B,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,KAAa;QAC7B,MAAM,GAAG,GAAc,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,MAA+B,EAAE,OAA4B;QAC1E,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;YAClF,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,OAAO,CAAC,KAAmB;QACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAS;YACzG,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,OAAO;gBAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;;gBACvD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,UAAsB;QACjC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,EAAkB,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,UAAU,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC,CAAC;QACzF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,UAAsB;QAClD,IAAI,UAAU,CAAC,MAAM;YAAE,OAAO;QAC9B,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,UAAU,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC,CAAC;IAC1F,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type CorrelationMetadata, type HarnessEvent, type HarnessEventType, type KadiError, type JsonObject, type NativeEventExtension } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
export interface EventScope {
|
|
3
|
+
readonly contractVersion?: string;
|
|
4
|
+
readonly sessionId: string;
|
|
5
|
+
readonly runId: string;
|
|
6
|
+
readonly adapterId: string;
|
|
7
|
+
readonly correlation: CorrelationMetadata;
|
|
8
|
+
}
|
|
9
|
+
/** Adapter translators convert native updates into this small generic shape. */
|
|
10
|
+
export interface AdapterEventUpdate {
|
|
11
|
+
readonly type: HarnessEventType;
|
|
12
|
+
readonly eventId?: string;
|
|
13
|
+
readonly timestamp?: string;
|
|
14
|
+
readonly correlation?: CorrelationMetadata;
|
|
15
|
+
readonly payload?: JsonObject;
|
|
16
|
+
readonly native?: NativeEventExtension;
|
|
17
|
+
}
|
|
18
|
+
export type EventIdFactory = (scope: EventScope) => string;
|
|
19
|
+
export type EventClock = () => string;
|
|
20
|
+
export interface EventNormalizerOptions {
|
|
21
|
+
readonly contractVersion?: string;
|
|
22
|
+
readonly eventIdFactory?: EventIdFactory;
|
|
23
|
+
readonly clock?: EventClock;
|
|
24
|
+
}
|
|
25
|
+
export declare class EventNormalizationError extends Error {
|
|
26
|
+
readonly error: KadiError;
|
|
27
|
+
constructor(error: KadiError);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Converts adapter-neutral updates into the versioned event envelope. Native
|
|
31
|
+
* adapters can supply translators without adding harness branches here.
|
|
32
|
+
*/
|
|
33
|
+
export declare class EventNormalizer {
|
|
34
|
+
private readonly contractVersion;
|
|
35
|
+
private readonly eventIdFactory;
|
|
36
|
+
private readonly clock;
|
|
37
|
+
constructor(options?: EventNormalizerOptions);
|
|
38
|
+
normalize(update: AdapterEventUpdate, scope: EventScope): HarnessEvent;
|
|
39
|
+
private mergeCorrelation;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=event-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-normalizer.d.ts","sourceRoot":"","sources":["../src/event-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,oBAAoB,EAC1B,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;CAC3C;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACxC;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC;AAEtC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CAC7B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,KAAK,EAAE,SAAS,CAAC;gBAEd,KAAK,EAAE,SAAS;CAKpC;AAqBD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;gBAEhB,OAAO,GAAE,sBAA2B;IAMhD,SAAS,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY;IA+B7E,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CONTRACT_VERSION, HarnessEventSchema, } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
export class EventNormalizationError extends Error {
|
|
3
|
+
error;
|
|
4
|
+
constructor(error) {
|
|
5
|
+
super(error.message);
|
|
6
|
+
this.name = "EventNormalizationError";
|
|
7
|
+
this.error = error;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
let generatedEventId = 0;
|
|
11
|
+
function defaultEventIdFactory(scope) {
|
|
12
|
+
generatedEventId += 1;
|
|
13
|
+
return `${scope.adapterId}-event-${Date.now().toString(36)}-${generatedEventId.toString(36)}`;
|
|
14
|
+
}
|
|
15
|
+
function makeError(message, details = {}) {
|
|
16
|
+
return {
|
|
17
|
+
code: "invalid_harness_event",
|
|
18
|
+
category: "validation",
|
|
19
|
+
message,
|
|
20
|
+
retryable: false,
|
|
21
|
+
details: Object.fromEntries(Object.entries(details).filter(([, value]) => value !== undefined)),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Converts adapter-neutral updates into the versioned event envelope. Native
|
|
26
|
+
* adapters can supply translators without adding harness branches here.
|
|
27
|
+
*/
|
|
28
|
+
export class EventNormalizer {
|
|
29
|
+
contractVersion;
|
|
30
|
+
eventIdFactory;
|
|
31
|
+
clock;
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.contractVersion = options.contractVersion ?? CONTRACT_VERSION;
|
|
34
|
+
this.eventIdFactory = options.eventIdFactory ?? defaultEventIdFactory;
|
|
35
|
+
this.clock = options.clock ?? (() => new Date().toISOString());
|
|
36
|
+
}
|
|
37
|
+
normalize(update, scope) {
|
|
38
|
+
const event = {
|
|
39
|
+
type: update.type,
|
|
40
|
+
contractVersion: scope.contractVersion ?? this.contractVersion,
|
|
41
|
+
eventId: update.eventId ?? this.eventIdFactory(scope),
|
|
42
|
+
timestamp: update.timestamp ?? this.clock(),
|
|
43
|
+
sessionId: scope.sessionId,
|
|
44
|
+
runId: scope.runId,
|
|
45
|
+
adapterId: scope.adapterId,
|
|
46
|
+
correlation: this.mergeCorrelation(scope.correlation, update.correlation),
|
|
47
|
+
payload: update.payload,
|
|
48
|
+
native: update.native,
|
|
49
|
+
};
|
|
50
|
+
const parsed = HarnessEventSchema.safeParse(event);
|
|
51
|
+
if (!parsed.success) {
|
|
52
|
+
throw new EventNormalizationError(makeError("adapter update does not satisfy the published HarnessEvent contract", {
|
|
53
|
+
sessionId: scope.sessionId,
|
|
54
|
+
runId: scope.runId,
|
|
55
|
+
adapterId: scope.adapterId,
|
|
56
|
+
issues: parsed.error.issues.map((issue) => ({
|
|
57
|
+
path: issue.path.map(String).join("."),
|
|
58
|
+
message: issue.message,
|
|
59
|
+
})),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
return parsed.data;
|
|
63
|
+
}
|
|
64
|
+
mergeCorrelation(scopeCorrelation, updateCorrelation) {
|
|
65
|
+
return { ...scopeCorrelation, ...updateCorrelation };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=event-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-normalizer.js","sourceRoot":"","sources":["../src/event-normalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ArtifactContent, type ArtifactReference, type ArtifactWriteRequest, type ScopedArtifactService, type ServiceResult } from "@kadi.build/kadi-harness-contracts";
|
|
2
|
+
import type { GatewayAuthorizer } from "./tools.js";
|
|
3
|
+
import type { GatewayScope } from "./tools.js";
|
|
4
|
+
export interface ArtifactBackend {
|
|
5
|
+
put(scope: GatewayScope, request: ArtifactWriteRequest): Promise<unknown> | unknown;
|
|
6
|
+
get(scope: GatewayScope, reference: ArtifactReference): Promise<unknown> | unknown;
|
|
7
|
+
list(scope: GatewayScope): Promise<unknown> | unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface ArtifactGatewayOptions {
|
|
10
|
+
readonly scope: GatewayScope;
|
|
11
|
+
readonly backend: ArtifactBackend;
|
|
12
|
+
readonly authorize?: GatewayAuthorizer;
|
|
13
|
+
}
|
|
14
|
+
export declare function normalizeArtifactReference(value: unknown, scope: GatewayScope): ArtifactReference;
|
|
15
|
+
/** Scoped artifact facade over session-state storage or another durable backend. */
|
|
16
|
+
export declare class ArtifactGateway implements ScopedArtifactService {
|
|
17
|
+
private readonly options;
|
|
18
|
+
constructor(options: ArtifactGatewayOptions);
|
|
19
|
+
put(request: ArtifactWriteRequest): Promise<ServiceResult<ArtifactReference>>;
|
|
20
|
+
get(reference: ArtifactReference): Promise<ServiceResult<ArtifactContent | undefined>>;
|
|
21
|
+
list(): Promise<ServiceResult<readonly ArtifactReference[]>>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createArtifactGateway(options: ArtifactGatewayOptions): ArtifactGateway;
|
|
24
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/gateways/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAEzB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACpF,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACnF,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACvD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACxC;AA0CD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,iBAAiB,CA2BjG;AAED,oFAAoF;AACpF,qBAAa,eAAgB,YAAW,qBAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAE9B,OAAO,EAAE,sBAAsB;IAIrC,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAY7E,GAAG,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IActF,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CAY1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAEtF"}
|