@telorun/kernel 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-definition.d.ts +14 -0
- package/dist/base-definition.d.ts.map +1 -0
- package/dist/base-definition.js +17 -0
- package/dist/base-definition.js.map +1 -0
- package/dist/capabilities/component.d.ts +3 -0
- package/dist/capabilities/component.d.ts.map +1 -0
- package/dist/capabilities/component.js +4 -0
- package/dist/capabilities/component.js.map +1 -0
- package/dist/capabilities/executable.d.ts +3 -0
- package/dist/capabilities/executable.d.ts.map +1 -0
- package/dist/capabilities/executable.js +5 -0
- package/dist/capabilities/executable.js.map +1 -0
- package/dist/capabilities/handler.d.ts +3 -0
- package/dist/capabilities/handler.d.ts.map +1 -0
- package/dist/capabilities/handler.js +4 -0
- package/dist/capabilities/handler.js.map +1 -0
- package/dist/capabilities/invokable.d.ts +3 -0
- package/dist/capabilities/invokable.d.ts.map +1 -0
- package/dist/capabilities/invokable.js +5 -0
- package/dist/capabilities/invokable.js.map +1 -0
- package/dist/capabilities/listener.d.ts +3 -0
- package/dist/capabilities/listener.d.ts.map +1 -0
- package/dist/capabilities/listener.js +5 -0
- package/dist/capabilities/listener.js.map +1 -0
- package/dist/capabilities/mount.d.ts +3 -0
- package/dist/capabilities/mount.d.ts.map +1 -0
- package/dist/capabilities/mount.js +5 -0
- package/dist/capabilities/mount.js.map +1 -0
- package/dist/capabilities/provider.d.ts +3 -0
- package/dist/capabilities/provider.d.ts.map +1 -0
- package/dist/capabilities/provider.js +8 -0
- package/dist/capabilities/provider.js.map +1 -0
- package/dist/capabilities/runnable.d.ts +3 -0
- package/dist/capabilities/runnable.d.ts.map +1 -0
- package/dist/capabilities/runnable.js +5 -0
- package/dist/capabilities/runnable.js.map +1 -0
- package/dist/capabilities/service.d.ts +3 -0
- package/dist/capabilities/service.d.ts.map +1 -0
- package/dist/capabilities/service.js +5 -0
- package/dist/capabilities/service.js.map +1 -0
- package/dist/capabilities/template.d.ts +3 -0
- package/dist/capabilities/template.d.ts.map +1 -0
- package/dist/capabilities/template.js +5 -0
- package/dist/capabilities/template.js.map +1 -0
- package/dist/capabilities/type.d.ts +3 -0
- package/dist/capabilities/type.d.ts.map +1 -0
- package/dist/capabilities/type.js +5 -0
- package/dist/capabilities/type.js.map +1 -0
- package/dist/controller-loader.d.ts.map +1 -1
- package/dist/controller-loader.js +2 -1
- package/dist/controller-loader.js.map +1 -1
- package/dist/controller-registry.d.ts +0 -4
- package/dist/controller-registry.d.ts.map +1 -1
- package/dist/controller-registry.js +11 -22
- package/dist/controller-registry.js.map +1 -1
- package/dist/controllers/capability/capability-controller.d.ts +0 -5
- package/dist/controllers/capability/capability-controller.d.ts.map +1 -1
- package/dist/controllers/capability/capability-controller.js +1 -5
- package/dist/controllers/capability/capability-controller.js.map +1 -1
- package/dist/controllers/module/import-controller.d.ts +0 -3
- package/dist/controllers/module/import-controller.d.ts.map +1 -1
- package/dist/controllers/module/import-controller.js +21 -27
- package/dist/controllers/module/import-controller.js.map +1 -1
- package/dist/controllers/module/module-controller.d.ts +0 -59
- package/dist/controllers/module/module-controller.d.ts.map +1 -1
- package/dist/controllers/module/module-controller.js +0 -45
- package/dist/controllers/module/module-controller.js.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts +3 -4
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.js +6 -8
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -1
- package/dist/controllers/resource-definition/resource-template-controller.d.ts +12 -0
- package/dist/controllers/resource-definition/resource-template-controller.d.ts.map +1 -0
- package/dist/controllers/resource-definition/resource-template-controller.js +112 -0
- package/dist/controllers/resource-definition/resource-template-controller.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +21 -24
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +254 -189
- package/dist/kernel.js.map +1 -1
- package/dist/loader.d.ts +9 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +50 -132
- package/dist/loader.js.map +1 -1
- package/dist/manifest-adapters/http-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/http-adapter.js +3 -1
- package/dist/manifest-adapters/http-adapter.js.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.d.ts +7 -5
- package/dist/manifest-adapters/local-file-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/local-file-adapter.js +21 -26
- package/dist/manifest-adapters/local-file-adapter.js.map +1 -1
- package/dist/manifest-adapters/manifest-adapter.d.ts +2 -0
- package/dist/manifest-adapters/manifest-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/registry-adapter.d.ts.map +1 -1
- package/dist/manifest-adapters/registry-adapter.js +3 -1
- package/dist/manifest-adapters/registry-adapter.js.map +1 -1
- package/dist/manifest-schemas.d.ts +61 -25
- package/dist/manifest-schemas.d.ts.map +1 -1
- package/dist/manifest-schemas.js +56 -16
- package/dist/manifest-schemas.js.map +1 -1
- package/dist/resource-context.d.ts +2 -5
- package/dist/resource-context.d.ts.map +1 -1
- package/dist/resource-context.js +31 -21
- package/dist/resource-context.js.map +1 -1
- package/dist/schema-valiator.d.ts.map +1 -1
- package/dist/schema-valiator.js +13 -2
- package/dist/schema-valiator.js.map +1 -1
- package/package.json +6 -7
- package/src/controller-loader.ts +2 -1
- package/src/controller-registry.ts +11 -26
- package/src/controllers/module/import-controller.ts +30 -30
- package/src/controllers/module/module-controller.ts +0 -51
- package/src/controllers/resource-definition/resource-definition-controller.ts +14 -15
- package/src/controllers/resource-definition/resource-template-controller.ts +138 -0
- package/src/index.ts +1 -1
- package/src/kernel.ts +313 -224
- package/src/loader.ts +54 -165
- package/src/manifest-adapters/local-file-adapter.ts +24 -31
- package/src/manifest-adapters/manifest-adapter.ts +2 -0
- package/src/manifest-schemas.ts +60 -24
- package/src/resource-context.ts +31 -30
- package/src/schema-valiator.ts +14 -3
- package/src/capabilities/component.yaml +0 -4
- package/src/capabilities/executable.yaml +0 -8
- package/src/capabilities/handler.yaml +0 -4
- package/src/capabilities/listener.yaml +0 -4
- package/src/capabilities/provider.yaml +0 -4
- package/src/capabilities/template.yaml +0 -4
- package/src/capabilities/type.yaml +0 -4
- package/src/controllers/capability/capability-controller.ts +0 -41
- package/src/controllers/module/module.json +0 -48
- package/src/controllers/module/module.yaml +0 -32
- package/src/manifest-adapters/http-adapter.ts +0 -35
- package/src/manifest-adapters/registry-adapter.ts +0 -56
|
@@ -6,18 +6,18 @@ import type {
|
|
|
6
6
|
} from "@telorun/sdk";
|
|
7
7
|
import { ControllerLoader } from "../../controller-loader.js";
|
|
8
8
|
import { formatAjvErrors, validateResourceDefinition } from "../../manifest-schemas.js";
|
|
9
|
+
import { createTemplateController } from "./resource-template-controller.js";
|
|
9
10
|
|
|
10
11
|
type ResourceDefinitionResource = RuntimeResource & {
|
|
11
|
-
kind: "Definition";
|
|
12
|
+
kind: "Kernel.Definition";
|
|
12
13
|
metadata: {
|
|
13
14
|
[key: string]: any;
|
|
14
15
|
name: string;
|
|
15
16
|
module?: string;
|
|
16
17
|
};
|
|
17
18
|
schema: Record<string, any>;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
controllers: Array<string>;
|
|
19
|
+
capability?: string;
|
|
20
|
+
controllers?: Array<string>;
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -33,16 +33,15 @@ class ResourceDefinition implements ResourceInstance {
|
|
|
33
33
|
) {}
|
|
34
34
|
|
|
35
35
|
async init(ctx: ResourceContext) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
36
|
+
if (!this.resource.controllers?.length) {
|
|
37
|
+
const controllerInstance = createTemplateController(this.resource as any);
|
|
38
|
+
ctx.registerDefinition(this.resource);
|
|
39
|
+
await ctx.registerController(
|
|
40
|
+
this.resource.metadata.module,
|
|
41
|
+
this.resource.metadata.name,
|
|
42
|
+
controllerInstance,
|
|
43
|
+
);
|
|
44
|
+
return;
|
|
46
45
|
}
|
|
47
46
|
ctx.emit("ControllerLoading", { controllers: this.resource.controllers });
|
|
48
47
|
try {
|
|
@@ -77,7 +76,7 @@ export async function create(resource: any, ctx: ResourceContext): Promise<Resou
|
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
// Return a fully-formed ResourceDefinition instance
|
|
80
|
-
const definition = resource as ResourceDefinitionResource;
|
|
79
|
+
const definition = resource as unknown as ResourceDefinitionResource;
|
|
81
80
|
return new ResourceDefinition(definition, new ControllerLoader());
|
|
82
81
|
}
|
|
83
82
|
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { ControllerInstance, ResourceContext, ResourceInstance } from "@telorun/sdk";
|
|
2
|
+
import { isCompiledValue } from "@telorun/sdk";
|
|
3
|
+
|
|
4
|
+
export function createTemplateController(definition: {
|
|
5
|
+
schema: Record<string, any>;
|
|
6
|
+
resources?: any[];
|
|
7
|
+
invoke?: string | { kind?: string; name: string; inputs?: Record<string, any> };
|
|
8
|
+
run?: string;
|
|
9
|
+
}): ControllerInstance {
|
|
10
|
+
return {
|
|
11
|
+
schema: definition.schema ?? { type: "object", additionalProperties: true },
|
|
12
|
+
|
|
13
|
+
create: async (resource: any, ctx: ResourceContext): Promise<ResourceInstance> => {
|
|
14
|
+
const self = { ...resource, name: resource.metadata.name };
|
|
15
|
+
|
|
16
|
+
// Old string form: invoke is a plain string or a CompiledValue (after precompile).
|
|
17
|
+
// New object form: invoke is a plain object (non-CompiledValue) with at least `name`.
|
|
18
|
+
const objectInvoke =
|
|
19
|
+
definition.invoke !== null &&
|
|
20
|
+
typeof definition.invoke === "object" &&
|
|
21
|
+
!isCompiledValue(definition.invoke)
|
|
22
|
+
? (definition.invoke as { kind?: string; name: string; inputs?: Record<string, any> })
|
|
23
|
+
: null;
|
|
24
|
+
const invokeNameTemplate = objectInvoke ? objectInvoke.name : (definition.invoke ?? null);
|
|
25
|
+
const invokeTarget = invokeNameTemplate
|
|
26
|
+
? (ctx.moduleContext.expandWith(invokeNameTemplate, { self }) as string)
|
|
27
|
+
: null;
|
|
28
|
+
const runTarget = definition.run
|
|
29
|
+
? (ctx.moduleContext.expandWith(definition.run, { self }) as string)
|
|
30
|
+
: null;
|
|
31
|
+
|
|
32
|
+
const persistentManifests: any[] = [];
|
|
33
|
+
let ephemeralTemplate: any = null;
|
|
34
|
+
|
|
35
|
+
for (const template of definition.resources ?? []) {
|
|
36
|
+
const expandedName = ctx.moduleContext.expandWith(template.metadata?.name ?? "", {
|
|
37
|
+
self,
|
|
38
|
+
}) as string;
|
|
39
|
+
const isTarget = expandedName === invokeTarget || expandedName === runTarget;
|
|
40
|
+
if (isTarget) {
|
|
41
|
+
ephemeralTemplate = template;
|
|
42
|
+
} else {
|
|
43
|
+
persistentManifests.push(ctx.moduleContext.expandWith(template, { self }));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const childContext = ctx.spawnChildContext();
|
|
48
|
+
|
|
49
|
+
// Registers an ephemeral manifest on ctx.moduleContext so it shares the same
|
|
50
|
+
// resource scope (and can access connections, etc. via getInstance).
|
|
51
|
+
// Tears down and removes the resource after fn() completes.
|
|
52
|
+
const withEphemeral = async (expandedManifest: any, fn: (name: string) => Promise<any>) => {
|
|
53
|
+
const uniqueName = `${expandedManifest.metadata?.name ?? "eph"}__${Math.random().toString(16).slice(2, 8)}`;
|
|
54
|
+
const manifest = {
|
|
55
|
+
...expandedManifest,
|
|
56
|
+
metadata: {
|
|
57
|
+
...expandedManifest.metadata,
|
|
58
|
+
name: uniqueName,
|
|
59
|
+
module: resource.metadata.module,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
ctx.moduleContext.registerManifest(manifest);
|
|
63
|
+
await ctx.moduleContext.initializeResources();
|
|
64
|
+
const entry = ctx.moduleContext.resourceInstances.get(uniqueName);
|
|
65
|
+
try {
|
|
66
|
+
return await fn(uniqueName);
|
|
67
|
+
} finally {
|
|
68
|
+
if (entry?.instance?.teardown) await entry.instance.teardown();
|
|
69
|
+
ctx.moduleContext.resourceInstances.delete(uniqueName);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
init: async () => {
|
|
75
|
+
for (const m of persistentManifests) childContext.registerManifest(m);
|
|
76
|
+
await childContext.initializeResources();
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
...(invokeTarget && {
|
|
80
|
+
invoke: async (inputs: any) => {
|
|
81
|
+
if (!ephemeralTemplate) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Template '${resource.metadata.name}': no ephemeral resource for invoke target '${invokeTarget}'`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
const extraContext = { self, inputs };
|
|
87
|
+
const expanded = ctx.moduleContext.expandWith(
|
|
88
|
+
ctx.moduleContext.expandWith(ephemeralTemplate, extraContext),
|
|
89
|
+
extraContext,
|
|
90
|
+
) as any;
|
|
91
|
+
return withEphemeral(expanded, async (name) => {
|
|
92
|
+
const entry = ctx.moduleContext.resourceInstances.get(name);
|
|
93
|
+
if (!entry?.instance?.invoke) {
|
|
94
|
+
throw new Error(`Ephemeral resource '${name}' is not invocable`);
|
|
95
|
+
}
|
|
96
|
+
// New object form: expand objectInvoke.inputs with invoke context and pass as arg.
|
|
97
|
+
// Old string form: the manifest inputs were computed during template expansion;
|
|
98
|
+
// pass expanded.inputs so Sql.Exec/Query controllers receive { sql, bindings }.
|
|
99
|
+
const invokeInputs = objectInvoke?.inputs != null
|
|
100
|
+
? ctx.moduleContext.expandWith(
|
|
101
|
+
ctx.moduleContext.expandWith(objectInvoke.inputs, extraContext),
|
|
102
|
+
extraContext,
|
|
103
|
+
)
|
|
104
|
+
: expanded.inputs ?? inputs;
|
|
105
|
+
return entry.instance.invoke(invokeInputs);
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
}),
|
|
109
|
+
|
|
110
|
+
...(runTarget && {
|
|
111
|
+
run: async () => {
|
|
112
|
+
if (!ephemeralTemplate) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
`Template '${resource.metadata.name}': no ephemeral resource for run target '${runTarget}'`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
const extraContext = { self };
|
|
118
|
+
const expanded = ctx.moduleContext.expandWith(
|
|
119
|
+
ctx.moduleContext.expandWith(ephemeralTemplate, extraContext),
|
|
120
|
+
extraContext,
|
|
121
|
+
);
|
|
122
|
+
return withEphemeral(expanded, async (name) => {
|
|
123
|
+
const entry = ctx.moduleContext.resourceInstances.get(name);
|
|
124
|
+
if (!entry?.instance?.run) {
|
|
125
|
+
throw new Error(`Ephemeral resource '${name}' is not runnable`);
|
|
126
|
+
}
|
|
127
|
+
return entry.instance.run();
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
}),
|
|
131
|
+
|
|
132
|
+
teardown: async () => {
|
|
133
|
+
await childContext.teardownResources();
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { ControllerRegistry } from "./controller-registry.js";
|
|
2
2
|
export { EventStream } from "./event-stream.js";
|
|
3
3
|
export { Kernel } from "./kernel.js";
|
|
4
|
-
export { Loader } from "./loader.js";
|
|
5
4
|
export { ManifestRegistry as Registry } from "./registry.js";
|
|
6
5
|
export { ResourceURI } from "./resource-uri.js";
|
|
6
|
+
export type { RuntimeDiagnostic } from "@telorun/sdk";
|
|
7
7
|
|