@telorun/kernel 0.4.1 → 0.5.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/dist/controller-loader.d.ts +19 -20
- package/dist/controller-loader.d.ts.map +1 -1
- package/dist/controller-loader.js +67 -247
- package/dist/controller-loader.js.map +1 -1
- package/dist/controller-loaders/napi-loader.d.ts +27 -0
- package/dist/controller-loaders/napi-loader.d.ts.map +1 -0
- package/dist/controller-loaders/napi-loader.js +158 -0
- package/dist/controller-loaders/napi-loader.js.map +1 -0
- package/dist/controller-loaders/npm-loader.d.ts +20 -0
- package/dist/controller-loaders/npm-loader.d.ts.map +1 -0
- package/dist/controller-loaders/npm-loader.js +256 -0
- package/dist/controller-loaders/npm-loader.js.map +1 -0
- package/dist/controller-registry.d.ts +30 -20
- package/dist/controller-registry.d.ts.map +1 -1
- package/dist/controller-registry.js +50 -99
- package/dist/controller-registry.js.map +1 -1
- package/dist/controllers/module/import-controller.d.ts +11 -0
- package/dist/controllers/module/import-controller.d.ts.map +1 -1
- package/dist/controllers/module/import-controller.js +28 -1
- package/dist/controllers/module/import-controller.js.map +1 -1
- package/dist/controllers/resource-definition/abstract-controller.d.ts +35 -0
- package/dist/controllers/resource-definition/abstract-controller.d.ts.map +1 -0
- package/dist/controllers/resource-definition/abstract-controller.js +34 -0
- package/dist/controllers/resource-definition/abstract-controller.js.map +1 -0
- package/dist/controllers/resource-definition/resource-definition-controller.d.ts.map +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.js +1 -1
- package/dist/controllers/resource-definition/resource-definition-controller.js.map +1 -1
- package/dist/kernel.d.ts +1 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +35 -14
- package/dist/kernel.js.map +1 -1
- package/dist/manifest-schemas.d.ts +50 -0
- package/dist/manifest-schemas.d.ts.map +1 -1
- package/dist/manifest-schemas.js +31 -0
- package/dist/manifest-schemas.js.map +1 -1
- package/dist/module-context.d.ts +11 -1
- package/dist/module-context.d.ts.map +1 -1
- package/dist/module-context.js +6 -0
- package/dist/module-context.js.map +1 -1
- package/dist/resource-context.d.ts +2 -1
- package/dist/resource-context.d.ts.map +1 -1
- package/dist/resource-context.js +6 -1
- package/dist/resource-context.js.map +1 -1
- package/dist/runtime-registry.d.ts +50 -0
- package/dist/runtime-registry.d.ts.map +1 -0
- package/dist/runtime-registry.js +140 -0
- package/dist/runtime-registry.js.map +1 -0
- package/package.json +3 -3
- package/src/controller-loader.ts +77 -273
- package/src/controller-loaders/napi-loader.ts +191 -0
- package/src/controller-loaders/npm-loader.ts +285 -0
- package/src/controller-registry.ts +66 -129
- package/src/controllers/module/import-controller.ts +30 -1
- package/src/controllers/resource-definition/abstract-controller.ts +56 -0
- package/src/controllers/resource-definition/resource-definition-controller.ts +1 -0
- package/src/kernel.ts +43 -13
- package/src/manifest-schemas.ts +33 -0
- package/src/module-context.ts +22 -1
- package/src/resource-context.ts +8 -1
- package/src/runtime-registry.ts +170 -0
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { ControllerInstance } from "@telorun/sdk";
|
|
2
|
+
import { ControllerPolicy } from "./runtime-registry.js";
|
|
3
|
+
export type { ControllerPolicy } from "./runtime-registry.js";
|
|
4
|
+
/**
|
|
5
|
+
* Top-level controller-loader dispatcher. Picks a per-scheme sub-loader by
|
|
6
|
+
* PURL type and applies the resolved selection policy:
|
|
7
|
+
*
|
|
8
|
+
* ControllerLoader.load(candidates, baseUri, policy)
|
|
9
|
+
* └─ orderCandidates(candidates, policy)
|
|
10
|
+
* ├─ pkg:npm → NpmControllerLoader
|
|
11
|
+
* └─ pkg:cargo → NapiControllerLoader
|
|
12
|
+
*
|
|
13
|
+
* Recovery: env-missing failures (`ControllerEnvMissingError`) advance to the
|
|
14
|
+
* next candidate. User-code failures (`RuntimeError("ERR_CONTROLLER_BUILD_FAILED" | "ERR_CONTROLLER_INVALID")`)
|
|
15
|
+
* fail hard regardless of remaining candidates.
|
|
16
|
+
*/
|
|
2
17
|
export declare class ControllerLoader {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
load(purlCandidates: string[], baseUri: string): Promise<ControllerInstance>;
|
|
9
|
-
private ensureNpmPackageInstalled;
|
|
10
|
-
private getPackageName;
|
|
11
|
-
private getInstalledPackageRoot;
|
|
12
|
-
private getLocalPackageName;
|
|
13
|
-
private resolvePackageEntry;
|
|
14
|
-
private resolvePackageExportTarget;
|
|
15
|
-
private resolveExportTargetValue;
|
|
16
|
-
/**
|
|
17
|
-
* For Node.js, resolve .ts paths to their compiled .js equivalents in dist/.
|
|
18
|
-
* Bun can load .ts directly, so it returns the path unchanged.
|
|
19
|
-
*/
|
|
20
|
-
private resolveForRuntime;
|
|
21
|
-
private findInNodeModules;
|
|
22
|
-
private pathExists;
|
|
18
|
+
private npmLoader;
|
|
19
|
+
private napiLoader;
|
|
20
|
+
load(purlCandidates: string[], baseUri: string, policy?: ControllerPolicy): Promise<ControllerInstance>;
|
|
21
|
+
private dispatchOne;
|
|
23
22
|
}
|
|
24
23
|
//# sourceMappingURL=controller-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller-loader.d.ts","sourceRoot":"","sources":["../src/controller-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"controller-loader.d.ts","sourceRoot":"","sources":["../src/controller-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAmC,MAAM,uBAAuB,CAAC;AAE1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAA8B;IAE1C,IAAI,CACR,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,kBAAkB,CAAC;YA+BhB,WAAW;CAS1B"}
|
|
@@ -1,270 +1,90 @@
|
|
|
1
1
|
import { RuntimeError } from "@telorun/sdk";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
import { ControllerEnvMissingError, NapiControllerLoader } from "./controller-loaders/napi-loader.js";
|
|
3
|
+
import { NpmControllerLoader } from "./controller-loaders/npm-loader.js";
|
|
4
|
+
import { DEFAULT_POLICY, POLICY_WILDCARD } from "./runtime-registry.js";
|
|
5
|
+
/**
|
|
6
|
+
* Top-level controller-loader dispatcher. Picks a per-scheme sub-loader by
|
|
7
|
+
* PURL type and applies the resolved selection policy:
|
|
8
|
+
*
|
|
9
|
+
* ControllerLoader.load(candidates, baseUri, policy)
|
|
10
|
+
* └─ orderCandidates(candidates, policy)
|
|
11
|
+
* ├─ pkg:npm → NpmControllerLoader
|
|
12
|
+
* └─ pkg:cargo → NapiControllerLoader
|
|
13
|
+
*
|
|
14
|
+
* Recovery: env-missing failures (`ControllerEnvMissingError`) advance to the
|
|
15
|
+
* next candidate. User-code failures (`RuntimeError("ERR_CONTROLLER_BUILD_FAILED" | "ERR_CONTROLLER_INVALID")`)
|
|
16
|
+
* fail hard regardless of remaining candidates.
|
|
17
|
+
*/
|
|
15
18
|
export class ControllerLoader {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
async load(purlCandidates, baseUri) {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.npmLoader = new NpmControllerLoader();
|
|
21
|
+
this.napiLoader = new NapiControllerLoader();
|
|
22
|
+
}
|
|
23
|
+
async load(purlCandidates, baseUri, policy) {
|
|
22
24
|
if (!purlCandidates || purlCandidates.length === 0) {
|
|
23
25
|
throw new RuntimeError("ERR_CONTROLLER_NOT_FOUND", "Missing controller PURL candidates");
|
|
24
26
|
}
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const [type, namespace, name, versionSpec, qualifiers, entry] = PackageURL.parseString(purl);
|
|
30
|
-
const localPath = qualifiers?.get("local_path");
|
|
31
|
-
const cacheKey = createHash("sha256").update(purlCandidates[0]).digest("hex").slice(0, 12);
|
|
32
|
-
const installDir = path.join(npmCacheRoot, cacheKey);
|
|
33
|
-
let packageRoot;
|
|
34
|
-
const isLocalManifest = baseUri && !baseUri.startsWith("http://") && !baseUri.startsWith("https://");
|
|
35
|
-
if (localPath && isLocalManifest) {
|
|
36
|
-
const baseUriPath = baseUri.startsWith("file://") ? baseUri.slice("file://".length) : baseUri;
|
|
37
|
-
const manifestDir = path.dirname(baseUriPath);
|
|
38
|
-
const resolvedLocalPath = path.resolve(manifestDir, localPath);
|
|
39
|
-
if (await this.pathExists(resolvedLocalPath)) {
|
|
40
|
-
packageRoot = resolvedLocalPath;
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
const nodeModulesPath = await this.findInNodeModules(`${namespace}/${name}`);
|
|
44
|
-
if (nodeModulesPath) {
|
|
45
|
-
packageRoot = nodeModulesPath;
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
await this.ensureNpmPackageInstalled(installDir, `${namespace}/${name}@${versionSpec}`);
|
|
49
|
-
packageRoot = this.getInstalledPackageRoot(installDir, `${namespace}/${name}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
const nodeModulesPath = await this.findInNodeModules(`${namespace}/${name}`);
|
|
55
|
-
if (nodeModulesPath) {
|
|
56
|
-
packageRoot = nodeModulesPath;
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
await this.ensureNpmPackageInstalled(installDir, `${namespace}/${name}@${versionSpec}`);
|
|
60
|
-
packageRoot = this.getInstalledPackageRoot(installDir, `${namespace}/${name}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const entryFile = await this.resolvePackageEntry(packageRoot, entry ? `./${entry}` : ".");
|
|
64
|
-
const instance = await import(entryFile);
|
|
65
|
-
if (!instance || (!instance.create && !instance.register)) {
|
|
66
|
-
throw new Error(`Invalid controller loaded from "${purlCandidates[0]}": missing create or register function`);
|
|
67
|
-
}
|
|
68
|
-
return instance;
|
|
69
|
-
}
|
|
70
|
-
async ensureNpmPackageInstalled(installDir, packageSpec) {
|
|
71
|
-
const packageName = this.getPackageName(packageSpec.startsWith(".") || path.isAbsolute(packageSpec)
|
|
72
|
-
? await this.getLocalPackageName(packageSpec)
|
|
73
|
-
: packageSpec);
|
|
74
|
-
const packageRoot = this.getInstalledPackageRoot(installDir, packageName);
|
|
75
|
-
const packageJsonPath = path.join(packageRoot, "package.json");
|
|
76
|
-
if (await this.pathExists(packageJsonPath)) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
await fs.mkdir(installDir, { recursive: true });
|
|
80
|
-
const rootPackageJson = path.join(installDir, "package.json");
|
|
81
|
-
if (!(await this.pathExists(rootPackageJson))) {
|
|
82
|
-
await fs.writeFile(rootPackageJson, JSON.stringify({ name: "telo-cache", private: true }, null, 2));
|
|
83
|
-
}
|
|
84
|
-
const execFileAsync = promisify(execFile);
|
|
85
|
-
const args = [
|
|
86
|
-
"install",
|
|
87
|
-
"--no-audit",
|
|
88
|
-
"--no-fund",
|
|
89
|
-
"--silent",
|
|
90
|
-
"--prefix",
|
|
91
|
-
installDir,
|
|
92
|
-
packageSpec,
|
|
93
|
-
];
|
|
94
|
-
await execFileAsync("npm", args);
|
|
95
|
-
}
|
|
96
|
-
getPackageName(packageSpec) {
|
|
97
|
-
if (packageSpec.startsWith("@")) {
|
|
98
|
-
const lastAt = packageSpec.lastIndexOf("@");
|
|
99
|
-
return lastAt > 0 ? packageSpec.slice(0, lastAt) : packageSpec;
|
|
100
|
-
}
|
|
101
|
-
const [name] = packageSpec.split("@");
|
|
102
|
-
return name;
|
|
103
|
-
}
|
|
104
|
-
getInstalledPackageRoot(installDir, packageName) {
|
|
105
|
-
const nameParts = packageName.split("/");
|
|
106
|
-
return path.join(installDir, "node_modules", ...nameParts);
|
|
107
|
-
}
|
|
108
|
-
async getLocalPackageName(packagePath) {
|
|
109
|
-
const packageJsonPath = path.join(packagePath, "package.json");
|
|
110
|
-
if (!(await this.pathExists(packageJsonPath))) {
|
|
111
|
-
throw new Error(`Local package missing package.json: ${packagePath}`);
|
|
112
|
-
}
|
|
113
|
-
const content = await fs.readFile(packageJsonPath, "utf8");
|
|
114
|
-
const parsed = JSON.parse(content);
|
|
115
|
-
if (!parsed?.name) {
|
|
116
|
-
throw new Error(`Local package missing name in package.json: ${packagePath}`);
|
|
117
|
-
}
|
|
118
|
-
return parsed.name;
|
|
119
|
-
}
|
|
120
|
-
async resolvePackageEntry(packageRoot, entry, packageName) {
|
|
121
|
-
const packageJsonPath = path.join(packageRoot, "package.json");
|
|
122
|
-
let resolvedPackageName = packageName;
|
|
123
|
-
let packageJson = null;
|
|
124
|
-
if (!resolvedPackageName && (await this.pathExists(packageJsonPath))) {
|
|
125
|
-
const content = await fs.readFile(packageJsonPath, "utf8");
|
|
126
|
-
try {
|
|
127
|
-
packageJson = JSON.parse(content);
|
|
128
|
-
resolvedPackageName = packageJson?.name;
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
resolvedPackageName = packageName;
|
|
132
|
-
}
|
|
27
|
+
const effectivePolicy = policy ?? DEFAULT_POLICY;
|
|
28
|
+
const ordered = orderCandidates(purlCandidates, effectivePolicy);
|
|
29
|
+
if (ordered.length === 0) {
|
|
30
|
+
throw new RuntimeError("ERR_CONTROLLER_NOT_FOUND", `No controllers match runtime selection [${effectivePolicy.load.join(", ")}]; declared: ${purlCandidates.join(", ")}`);
|
|
133
31
|
}
|
|
134
|
-
|
|
32
|
+
const errors = [];
|
|
33
|
+
for (const purl of ordered) {
|
|
135
34
|
try {
|
|
136
|
-
|
|
35
|
+
return await this.dispatchOne(purl, baseUri);
|
|
137
36
|
}
|
|
138
|
-
catch {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const entryValue = entry.trim();
|
|
143
|
-
const exportTarget = this.resolvePackageExportTarget(packageJson?.exports, entryValue);
|
|
144
|
-
if (exportTarget) {
|
|
145
|
-
const resolved = path.resolve(packageRoot, exportTarget);
|
|
146
|
-
if (await this.pathExists(resolved)) {
|
|
147
|
-
return this.resolveForRuntime(resolved, packageRoot);
|
|
148
|
-
}
|
|
149
|
-
if (!path.extname(resolved)) {
|
|
150
|
-
const withJs = `${resolved}.js`;
|
|
151
|
-
if (await this.pathExists(withJs)) {
|
|
152
|
-
return withJs;
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err instanceof ControllerEnvMissingError) {
|
|
39
|
+
errors.push(`${purl}: ${err.message}`);
|
|
40
|
+
continue;
|
|
153
41
|
}
|
|
42
|
+
throw err;
|
|
154
43
|
}
|
|
155
44
|
}
|
|
156
|
-
|
|
157
|
-
const mainFields = ["module", "main"];
|
|
158
|
-
for (const field of mainFields) {
|
|
159
|
-
const target = packageJson[field];
|
|
160
|
-
if (typeof target === "string") {
|
|
161
|
-
const resolved = path.resolve(packageRoot, target);
|
|
162
|
-
if (await this.pathExists(resolved)) {
|
|
163
|
-
return this.resolveForRuntime(resolved, packageRoot);
|
|
164
|
-
}
|
|
165
|
-
if (!path.extname(resolved)) {
|
|
166
|
-
const withJs = `${resolved}.js`;
|
|
167
|
-
if (await this.pathExists(withJs)) {
|
|
168
|
-
return withJs;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const directPath = path.resolve(packageRoot, entryValue);
|
|
175
|
-
if (await this.pathExists(directPath)) {
|
|
176
|
-
return this.resolveForRuntime(directPath, packageRoot);
|
|
177
|
-
}
|
|
178
|
-
if (!path.extname(directPath)) {
|
|
179
|
-
const withJs = `${directPath}.js`;
|
|
180
|
-
if (await this.pathExists(withJs)) {
|
|
181
|
-
return withJs;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
throw new Error(`Controller entry "${entryValue}" could not be resolved in ${packageRoot}`);
|
|
185
|
-
}
|
|
186
|
-
resolvePackageExportTarget(exportsField, entry) {
|
|
187
|
-
if (!exportsField) {
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
const key = entry === "." || entry === "./" ? "." : entry;
|
|
191
|
-
const target = exportsField[key];
|
|
192
|
-
return this.resolveExportTargetValue(target);
|
|
45
|
+
throw new RuntimeError("ERR_CONTROLLER_NOT_FOUND", `No controller resolved. Tried ${ordered.length} candidate(s):\n${errors.join("\n")}`);
|
|
193
46
|
}
|
|
194
|
-
|
|
195
|
-
if (
|
|
196
|
-
return
|
|
47
|
+
async dispatchOne(purl, baseUri) {
|
|
48
|
+
if (purl.startsWith("pkg:npm")) {
|
|
49
|
+
return this.npmLoader.load(purl, baseUri);
|
|
197
50
|
}
|
|
198
|
-
if (
|
|
199
|
-
return
|
|
51
|
+
if (purl.startsWith("pkg:cargo")) {
|
|
52
|
+
return this.napiLoader.load(purl, baseUri);
|
|
200
53
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
54
|
+
throw new ControllerEnvMissingError(`Unsupported PURL scheme: ${purl}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function getPurlType(purl) {
|
|
58
|
+
const slashIdx = purl.indexOf("/", purl.indexOf(":") + 1);
|
|
59
|
+
return slashIdx === -1 ? purl : purl.slice(0, slashIdx);
|
|
60
|
+
}
|
|
61
|
+
function orderCandidates(candidates, policy) {
|
|
62
|
+
const result = [];
|
|
63
|
+
const seen = new Set();
|
|
64
|
+
const explicitTypes = new Set(policy.load.filter((t) => t !== POLICY_WILDCARD));
|
|
65
|
+
for (const entry of policy.load) {
|
|
66
|
+
if (entry === POLICY_WILDCARD) {
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
if (seen.has(candidate))
|
|
69
|
+
continue;
|
|
70
|
+
const type = getPurlType(candidate);
|
|
71
|
+
if (!explicitTypes.has(type)) {
|
|
72
|
+
result.push(candidate);
|
|
73
|
+
seen.add(candidate);
|
|
206
74
|
}
|
|
207
75
|
}
|
|
208
|
-
return null;
|
|
209
76
|
}
|
|
210
|
-
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
if (resolved) {
|
|
218
|
-
return resolved;
|
|
219
|
-
}
|
|
77
|
+
else {
|
|
78
|
+
for (const candidate of candidates) {
|
|
79
|
+
if (seen.has(candidate))
|
|
80
|
+
continue;
|
|
81
|
+
if (getPurlType(candidate) === entry) {
|
|
82
|
+
result.push(candidate);
|
|
83
|
+
seen.add(candidate);
|
|
220
84
|
}
|
|
221
85
|
}
|
|
222
86
|
}
|
|
223
|
-
return null;
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* For Node.js, resolve .ts paths to their compiled .js equivalents in dist/.
|
|
227
|
-
* Bun can load .ts directly, so it returns the path unchanged.
|
|
228
|
-
*/
|
|
229
|
-
async resolveForRuntime(resolvedPath, packageRoot) {
|
|
230
|
-
if (isBun || !resolvedPath.endsWith(".ts")) {
|
|
231
|
-
return resolvedPath;
|
|
232
|
-
}
|
|
233
|
-
// Try dist/ equivalent: src/foo.ts -> dist/foo.js
|
|
234
|
-
const relative = path.relative(packageRoot, resolvedPath);
|
|
235
|
-
const distEquivalent = path.resolve(packageRoot, relative.replace(/^src\//, "dist/").replace(/\.ts$/, ".js"));
|
|
236
|
-
if (await this.pathExists(distEquivalent)) {
|
|
237
|
-
return distEquivalent;
|
|
238
|
-
}
|
|
239
|
-
// Fallback: same location but .js
|
|
240
|
-
const jsPath = resolvedPath.replace(/\.ts$/, ".js");
|
|
241
|
-
if (await this.pathExists(jsPath)) {
|
|
242
|
-
return jsPath;
|
|
243
|
-
}
|
|
244
|
-
return resolvedPath;
|
|
245
|
-
}
|
|
246
|
-
async findInNodeModules(packageName) {
|
|
247
|
-
const nameParts = packageName.split("/");
|
|
248
|
-
const candidates = [
|
|
249
|
-
path.join(process.cwd(), "node_modules", ...nameParts),
|
|
250
|
-
path.join(process.cwd(), "node_modules", ".pnpm", "node_modules", ...nameParts),
|
|
251
|
-
];
|
|
252
|
-
for (const candidate of candidates) {
|
|
253
|
-
const packageJsonPath = path.join(candidate, "package.json");
|
|
254
|
-
if (await this.pathExists(packageJsonPath)) {
|
|
255
|
-
return candidate;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
async pathExists(filePath) {
|
|
261
|
-
try {
|
|
262
|
-
await fs.access(filePath);
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
return false;
|
|
267
|
-
}
|
|
268
87
|
}
|
|
88
|
+
return result;
|
|
269
89
|
}
|
|
270
90
|
//# sourceMappingURL=controller-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller-loader.js","sourceRoot":"","sources":["../src/controller-loader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"controller-loader.js","sourceRoot":"","sources":["../src/controller-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ControllerInstance } from "@telorun/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Recoverable resolution failure — the loader could not find the artifact in the
|
|
4
|
+
* environment (missing rustc, missing local_path, missing prebuilt dylib in dist
|
|
5
|
+
* mode). The dispatcher may try the next candidate when wildcard fallback is
|
|
6
|
+
* enabled. Distinguished from `RuntimeError("ERR_CONTROLLER_BUILD_FAILED" | …)`
|
|
7
|
+
* which is non-recoverable: those mean user code is broken and must surface.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ControllerEnvMissingError extends Error {
|
|
10
|
+
readonly _envMissing: true;
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class NapiControllerLoader {
|
|
14
|
+
/**
|
|
15
|
+
* Resolve a `pkg:cargo/...` PURL to a controller module instance by building
|
|
16
|
+
* the crate and loading the resulting native addon.
|
|
17
|
+
*
|
|
18
|
+
* Dev mode (local_path qualifier present): probe rustc, run `cargo build
|
|
19
|
+
* --release`, locate the dylib via `cargo metadata`, copy to
|
|
20
|
+
* `<libname>.node`, load via createRequire. Cached on success.
|
|
21
|
+
*
|
|
22
|
+
* Distribution mode (no local_path): out of scope for the PoC; the hook is
|
|
23
|
+
* left in place so the dispatcher reports env-missing and falls through.
|
|
24
|
+
*/
|
|
25
|
+
load(purl: string, baseUri: string): Promise<ControllerInstance>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=napi-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"napi-loader.d.ts","sourceRoot":"","sources":["../../src/controller-loaders/napi-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,cAAc,CAAC;AAWhE;;;;;;GAMG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,WAAW,EAAG,IAAI,CAAU;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAmBD,qBAAa,oBAAoB;IAC/B;;;;;;;;;;OAUG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAwFvE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { RuntimeError } from "@telorun/sdk";
|
|
2
|
+
import { execFile } from "child_process";
|
|
3
|
+
import * as fs from "fs/promises";
|
|
4
|
+
import { createRequire } from "module";
|
|
5
|
+
import { PackageURL } from "packageurl-js";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import { promisify } from "util";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const requireFromHere = createRequire(import.meta.url);
|
|
10
|
+
/**
|
|
11
|
+
* Recoverable resolution failure — the loader could not find the artifact in the
|
|
12
|
+
* environment (missing rustc, missing local_path, missing prebuilt dylib in dist
|
|
13
|
+
* mode). The dispatcher may try the next candidate when wildcard fallback is
|
|
14
|
+
* enabled. Distinguished from `RuntimeError("ERR_CONTROLLER_BUILD_FAILED" | …)`
|
|
15
|
+
* which is non-recoverable: those mean user code is broken and must surface.
|
|
16
|
+
*/
|
|
17
|
+
export class ControllerEnvMissingError extends Error {
|
|
18
|
+
constructor(message) {
|
|
19
|
+
super(message);
|
|
20
|
+
this._envMissing = true;
|
|
21
|
+
this.name = "ControllerEnvMissingError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Process-lifetime cache of resolved native modules keyed by the realpath of
|
|
26
|
+
* the crate directory. The first call for a given crate does the cargo build,
|
|
27
|
+
* dylib rename, and `require()` work; subsequent calls (e.g. a second kernel
|
|
28
|
+
* registering the same controller, or two manifests reaching the crate via
|
|
29
|
+
* different — possibly symlinked — paths) skip straight to the cached module.
|
|
30
|
+
*
|
|
31
|
+
* Beyond the obvious cost saving, this is load-bearing for Node compatibility:
|
|
32
|
+
* `fs.copyFile` overwriting a `.node` file that Node has already mmapped, plus
|
|
33
|
+
* the secondary `cargo metadata` / build invocations, can leave Node's native
|
|
34
|
+
* addon machinery in a state where finalize callbacks for class instances
|
|
35
|
+
* created in a previous kernel race and segfault. Keying on the canonical
|
|
36
|
+
* crate path (not on the caller's baseUri) ensures two distinct paths that
|
|
37
|
+
* point at the same crate share one cache entry.
|
|
38
|
+
*/
|
|
39
|
+
const _napiModuleCache = new Map();
|
|
40
|
+
export class NapiControllerLoader {
|
|
41
|
+
/**
|
|
42
|
+
* Resolve a `pkg:cargo/...` PURL to a controller module instance by building
|
|
43
|
+
* the crate and loading the resulting native addon.
|
|
44
|
+
*
|
|
45
|
+
* Dev mode (local_path qualifier present): probe rustc, run `cargo build
|
|
46
|
+
* --release`, locate the dylib via `cargo metadata`, copy to
|
|
47
|
+
* `<libname>.node`, load via createRequire. Cached on success.
|
|
48
|
+
*
|
|
49
|
+
* Distribution mode (no local_path): out of scope for the PoC; the hook is
|
|
50
|
+
* left in place so the dispatcher reports env-missing and falls through.
|
|
51
|
+
*/
|
|
52
|
+
async load(purl, baseUri) {
|
|
53
|
+
const [, , name, , qualifiers] = PackageURL.parseString(purl);
|
|
54
|
+
const localPath = qualifiers?.get("local_path");
|
|
55
|
+
const isLocalManifest = baseUri && !baseUri.startsWith("http://") && !baseUri.startsWith("https://");
|
|
56
|
+
if (!localPath || !isLocalManifest) {
|
|
57
|
+
throw new ControllerEnvMissingError(`pkg:cargo distribution-mode resolution is not implemented for the PoC; supply ?local_path=...`);
|
|
58
|
+
}
|
|
59
|
+
const baseUriPath = baseUri.startsWith("file://") ? baseUri.slice("file://".length) : baseUri;
|
|
60
|
+
const manifestDir = path.dirname(baseUriPath);
|
|
61
|
+
const cratePath = path.resolve(manifestDir, localPath);
|
|
62
|
+
if (!(await pathExists(cratePath))) {
|
|
63
|
+
throw new ControllerEnvMissingError(`pkg:cargo local_path does not exist: ${cratePath}`);
|
|
64
|
+
}
|
|
65
|
+
// Key the cache on the canonical crate location (realpath) — two manifests
|
|
66
|
+
// that reach the same crate via different baseUris (e.g. through symlinked
|
|
67
|
+
// workspace paths) must share one cache entry. A miss here would re-run
|
|
68
|
+
// cargo build and `fs.copyFile` over an already-mmapped `.node`, which
|
|
69
|
+
// can leave napi finalize callbacks racing and crash Node.
|
|
70
|
+
const canonicalCratePath = await fs.realpath(cratePath);
|
|
71
|
+
const cacheKey = canonicalCratePath;
|
|
72
|
+
const cached = _napiModuleCache.get(cacheKey);
|
|
73
|
+
if (cached) {
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await execFileAsync("rustc", ["--version"]);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new ControllerEnvMissingError("rustc not found on PATH");
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
// Plain `cargo build --release` — no `--features` flag. The SDK's
|
|
84
|
+
// `default = ["napi"]` selects the napi backend transitively, so the
|
|
85
|
+
// controller crate's Cargo.toml stays free of any `[features]` block
|
|
86
|
+
// or napi-rs deps. A future Rust kernel passes
|
|
87
|
+
// `--no-default-features --features native` here instead.
|
|
88
|
+
await execFileAsync("cargo", ["build", "--release"], {
|
|
89
|
+
cwd: cratePath,
|
|
90
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const stderr = err?.stderr ? `\n${err.stderr}` : "";
|
|
95
|
+
throw new RuntimeError("ERR_CONTROLLER_BUILD_FAILED", `cargo build failed for ${cratePath}:${stderr}`);
|
|
96
|
+
}
|
|
97
|
+
const { targetDir, libName } = await resolveCrateMetadata(cratePath, name ?? "");
|
|
98
|
+
const dylibPath = await findDylib(targetDir, libName);
|
|
99
|
+
if (!dylibPath) {
|
|
100
|
+
throw new RuntimeError("ERR_CONTROLLER_BUILD_FAILED", `cargo build succeeded but no cdylib found for ${libName} under ${path.join(targetDir, "release")}/`);
|
|
101
|
+
}
|
|
102
|
+
const nodePath = path.join(path.dirname(dylibPath), `${libName}.node`);
|
|
103
|
+
await fs.copyFile(dylibPath, nodePath);
|
|
104
|
+
let module;
|
|
105
|
+
try {
|
|
106
|
+
module = requireFromHere(nodePath);
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new RuntimeError("ERR_CONTROLLER_INVALID", `Failed to load native addon ${nodePath}: ${err.message}`);
|
|
110
|
+
}
|
|
111
|
+
if (!module || (!module.create && !module.register)) {
|
|
112
|
+
throw new RuntimeError("ERR_CONTROLLER_INVALID", `pkg:cargo controller at ${nodePath} exports neither create nor register`);
|
|
113
|
+
}
|
|
114
|
+
_napiModuleCache.set(cacheKey, module);
|
|
115
|
+
return module;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function resolveCrateMetadata(cratePath, fallbackName) {
|
|
119
|
+
const result = await execFileAsync("cargo", [
|
|
120
|
+
"metadata",
|
|
121
|
+
"--format-version",
|
|
122
|
+
"1",
|
|
123
|
+
"--manifest-path",
|
|
124
|
+
path.join(cratePath, "Cargo.toml"),
|
|
125
|
+
"--no-deps",
|
|
126
|
+
], { maxBuffer: 32 * 1024 * 1024 });
|
|
127
|
+
const metadata = JSON.parse(result.stdout);
|
|
128
|
+
const cratePackage = metadata.packages?.find((p) => p.manifest_path === path.join(cratePath, "Cargo.toml"));
|
|
129
|
+
const packageName = cratePackage?.name ?? fallbackName;
|
|
130
|
+
return {
|
|
131
|
+
targetDir: metadata.target_directory,
|
|
132
|
+
libName: packageName.replace(/-/g, "_"),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async function findDylib(targetDir, libName) {
|
|
136
|
+
const releaseDir = path.join(targetDir, "release");
|
|
137
|
+
const candidates = [
|
|
138
|
+
path.join(releaseDir, `lib${libName}.so`),
|
|
139
|
+
path.join(releaseDir, `lib${libName}.dylib`),
|
|
140
|
+
path.join(releaseDir, `${libName}.dll`),
|
|
141
|
+
];
|
|
142
|
+
for (const candidate of candidates) {
|
|
143
|
+
if (await pathExists(candidate)) {
|
|
144
|
+
return candidate;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
async function pathExists(filePath) {
|
|
150
|
+
try {
|
|
151
|
+
await fs.access(filePath);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=napi-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"napi-loader.js","sourceRoot":"","sources":["../../src/controller-loaders/napi-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ControllerInstance } from "@telorun/sdk";
|
|
2
|
+
export declare class NpmControllerLoader {
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a `pkg:npm/...` PURL to a controller module instance. Tries, in order:
|
|
5
|
+
* a relative `local_path` qualifier, the workspace's `node_modules`, and finally
|
|
6
|
+
* an isolated install under `~/.cache/telo/npm/<hash>`.
|
|
7
|
+
*/
|
|
8
|
+
load(purl: string, baseUri: string): Promise<ControllerInstance>;
|
|
9
|
+
private ensureNpmPackageInstalled;
|
|
10
|
+
private getPackageName;
|
|
11
|
+
private getInstalledPackageRoot;
|
|
12
|
+
private getLocalPackageName;
|
|
13
|
+
private resolvePackageEntry;
|
|
14
|
+
private resolvePackageExportTarget;
|
|
15
|
+
private resolveExportTargetValue;
|
|
16
|
+
private resolveForRuntime;
|
|
17
|
+
private findInNodeModules;
|
|
18
|
+
private pathExists;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=npm-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-loader.d.ts","sourceRoot":"","sources":["../../src/controller-loaders/npm-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAgBlD,qBAAa,mBAAmB;IAC9B;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;YA6CxD,yBAAyB;IAmCvC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,uBAAuB;YAKjB,mBAAmB;YAanB,mBAAmB;IAuEjC,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,wBAAwB;YAgClB,iBAAiB;YAmBjB,iBAAiB;YAejB,UAAU;CAQzB"}
|