@guanjinke/artifact-client 1.3.0 → 1.4.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 +135 -1
- package/dist/cli/config-manager.d.ts +15 -0
- package/dist/cli/config-manager.d.ts.map +1 -1
- package/dist/cli/config-manager.js +31 -0
- package/dist/cli/config-manager.js.map +1 -1
- package/dist/cli/environment.d.ts +6 -0
- package/dist/cli/environment.d.ts.map +1 -0
- package/dist/cli/environment.js +134 -0
- package/dist/cli/environment.js.map +1 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +160 -2
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/environment/archive.d.ts +7 -0
- package/dist/environment/archive.d.ts.map +1 -0
- package/dist/environment/archive.js +132 -0
- package/dist/environment/archive.js.map +1 -0
- package/dist/environment/builder.d.ts +6 -0
- package/dist/environment/builder.d.ts.map +1 -0
- package/dist/environment/builder.js +323 -0
- package/dist/environment/builder.js.map +1 -0
- package/dist/environment/catalog.d.ts +9 -0
- package/dist/environment/catalog.d.ts.map +1 -0
- package/dist/environment/catalog.js +35 -0
- package/dist/environment/catalog.js.map +1 -0
- package/dist/environment/config.d.ts +8 -0
- package/dist/environment/config.d.ts.map +1 -0
- package/dist/environment/config.js +60 -0
- package/dist/environment/config.js.map +1 -0
- package/dist/environment/manager.d.ts +43 -0
- package/dist/environment/manager.d.ts.map +1 -0
- package/dist/environment/manager.js +383 -0
- package/dist/environment/manager.js.map +1 -0
- package/dist/environment/plan.d.ts +10 -0
- package/dist/environment/plan.d.ts.map +1 -0
- package/dist/environment/plan.js +131 -0
- package/dist/environment/plan.js.map +1 -0
- package/dist/environment/process.d.ts +94 -0
- package/dist/environment/process.d.ts.map +1 -0
- package/dist/environment/process.js +381 -0
- package/dist/environment/process.js.map +1 -0
- package/dist/environment/registry.d.ts +45 -0
- package/dist/environment/registry.d.ts.map +1 -0
- package/dist/environment/registry.js +157 -0
- package/dist/environment/registry.js.map +1 -0
- package/dist/environment/root.d.ts +33 -0
- package/dist/environment/root.d.ts.map +1 -0
- package/dist/environment/root.js +119 -0
- package/dist/environment/root.js.map +1 -0
- package/dist/environment/types.d.ts +66 -0
- package/dist/environment/types.d.ts.map +1 -0
- package/dist/environment/types.js +3 -0
- package/dist/environment/types.js.map +1 -0
- package/dist/environment/update.d.ts +85 -0
- package/dist/environment/update.d.ts.map +1 -0
- package/dist/environment/update.js +644 -0
- package/dist/environment/update.js.map +1 -0
- package/dist/environment/validate.d.ts +36 -0
- package/dist/environment/validate.d.ts.map +1 -0
- package/dist/environment/validate.js +147 -0
- package/dist/environment/validate.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { LayoutMapping } from './types';
|
|
2
|
+
interface CatalogEntry {
|
|
3
|
+
plugin: string;
|
|
4
|
+
filename: (version: string, edition: string) => string;
|
|
5
|
+
mappings: LayoutMapping[];
|
|
6
|
+
}
|
|
7
|
+
export declare const catalog: Record<string, CatalogEntry>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/environment/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA6BhD,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.catalog = void 0;
|
|
4
|
+
const mapping = (source, destination, assemblies, role, service) => ({ source, destination, assemblies, role, ...(service ? { service } : {}) });
|
|
5
|
+
exports.catalog = {
|
|
6
|
+
server: {
|
|
7
|
+
plugin: 'gces-server', filename: (v, e) => `server-${e}.v${v}.zip`,
|
|
8
|
+
mappings: [mapping('', 'Server', ['Wyn.Server.dll'], 'server', 'Server')],
|
|
9
|
+
},
|
|
10
|
+
monitoring: {
|
|
11
|
+
plugin: 'gces-monitoring', filename: (v, e) => `monitoring-netcore.${v}-${e}.zip`,
|
|
12
|
+
mappings: [mapping('', 'Monitor', ['Wyn.ServiceMonitor.dll'], 'monitor')],
|
|
13
|
+
},
|
|
14
|
+
common: {
|
|
15
|
+
plugin: 'gces-common', filename: v => `dataset-and-account.${v}.zip`,
|
|
16
|
+
mappings: [mapping('dataset', 'Plugins/Dataset', ['Wyn.Dataset.Plugin.dll'], 'plugin'), mapping('account', 'Plugins/Account', ['Wyn.Account.Plugin.dll'], 'plugin'), mapping('cot-worker', 'CotWorker', ['Wyn.CotWorker.dll'], 'worker', 'CotWorker')],
|
|
17
|
+
},
|
|
18
|
+
dashboard: {
|
|
19
|
+
plugin: 'gces-dashboard', filename: v => `dashboard.${v}.zip`,
|
|
20
|
+
mappings: [mapping('dashboard', 'Plugins/Dashboard', ['Wyn.Dashboards.Plugin.dll'], 'plugin'), mapping('dashboard-worker', 'DashboardWorker', ['Wyn.Dashboards.Worker.dll'], 'worker', 'DashboardWorker')],
|
|
21
|
+
},
|
|
22
|
+
reporting: {
|
|
23
|
+
plugin: 'gces-reporting', filename: v => `reporting.v${v}.zip`,
|
|
24
|
+
mappings: [mapping('plugin', 'Plugins/Reporting', ['Wyn.Reporting.Plugin.dll', 'Gces.Reporting.Plugin.dll'], 'plugin'), mapping('worker', 'ReportingWorker', ['Wyn.Reporting.Worker.dll', 'ReportingWorker.dll'], 'worker', 'ReportingWorker')],
|
|
25
|
+
},
|
|
26
|
+
analysis: {
|
|
27
|
+
plugin: 'gces-analysis', filename: v => `analysis-model.${v}.zip`,
|
|
28
|
+
mappings: [mapping('analysis', 'Plugins/AnalysisModel', ['Wyn.AnalysisModel.Plugin.dll'], 'plugin')],
|
|
29
|
+
},
|
|
30
|
+
sheets: {
|
|
31
|
+
plugin: 'wyn-sheets', filename: v => `wyn-sheets.v${v}.zip`,
|
|
32
|
+
mappings: [mapping('', 'Plugins/Sheet', ['Wyn.Sheets.Plugin.dll'], 'plugin')],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/environment/catalog.ts"],"names":[],"mappings":";;;AAOA,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,WAAmB,EAAE,UAAoB,EAAE,IAA2B,EAAE,OAAgB,EAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7M,QAAA,OAAO,GAAiC;IACnD,MAAM,EAAE;QACN,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM;QAClE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC1E;IACD,UAAU,EAAE;QACV,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM;QACjF,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,wBAAwB,CAAC,EAAE,SAAS,CAAC,CAAC;KAC1E;IACD,MAAM,EAAE;QACN,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,MAAM;QACpE,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,wBAAwB,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,CAAC,wBAAwB,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;KACvP;IACD,SAAS,EAAE;QACT,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM;QAC7D,QAAQ,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,CAAC,2BAA2B,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC,2BAA2B,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;KAC3M;IACD,SAAS,EAAE;QACT,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM;QAC9D,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAC,0BAA0B,EAAE,2BAA2B,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC,0BAA0B,EAAE,qBAAqB,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;KAChP;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM;QACjE,QAAQ,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,uBAAuB,EAAE,CAAC,8BAA8B,CAAC,EAAE,QAAQ,CAAC,CAAC;KACrG;IACD,MAAM,EAAE;QACN,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM;QAC3D,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,CAAC;KAC9E;CACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EnvironmentPlan, EnvironmentSchema, LayoutMapping } from './types';
|
|
2
|
+
export declare function detectConfigurationSchema(template: string): EnvironmentSchema;
|
|
3
|
+
export interface RuntimeAssembly extends LayoutMapping {
|
|
4
|
+
assembly: string;
|
|
5
|
+
path: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function createEnvironmentConfig(plan: EnvironmentPlan, assemblies: RuntimeAssembly[]): string;
|
|
8
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/environment/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK5E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAQ7E;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAEzF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,CAuCpG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectConfigurationSchema = detectConfigurationSchema;
|
|
4
|
+
exports.createEnvironmentConfig = createEnvironmentConfig;
|
|
5
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
6
|
+
const schemaVersions = { V91: '9.1', V100: '10.0' };
|
|
7
|
+
const schemaNamespace = (schema) => `clr-namespace:ConfigMigration.Configuration.${schema};assembly=Wyn.Configuration`;
|
|
8
|
+
function detectConfigurationSchema(template) {
|
|
9
|
+
if (/<!DOCTYPE|<!ENTITY/i.test(template) || fast_xml_parser_1.XMLValidator.validate(template) !== true)
|
|
10
|
+
throw new Error('Invalid monitoring configuration template.');
|
|
11
|
+
const document = new fast_xml_parser_1.XMLParser({ ignoreAttributes: false, parseTagValue: false, processEntities: false }).parse(template);
|
|
12
|
+
const root = document?.SystemConfig;
|
|
13
|
+
for (const schema of ['V91', 'V100']) {
|
|
14
|
+
if (root?.['@_xmlns'] === schemaNamespace(schema) && root?.Version === schemaVersions[schema])
|
|
15
|
+
return schema;
|
|
16
|
+
}
|
|
17
|
+
throw new Error('Unsupported or mismatched monitoring configuration schema/version.');
|
|
18
|
+
}
|
|
19
|
+
function createEnvironmentConfig(plan, assemblies) {
|
|
20
|
+
if (plan.schema === 'pending')
|
|
21
|
+
throw new Error('Configuration schema must be detected from the monitoring package.');
|
|
22
|
+
const windowsPath = (value) => value.replace(/\//g, '\\');
|
|
23
|
+
const strings = (values) => ({ 'sys:string': values.map(windowsPath) });
|
|
24
|
+
const plugins = assemblies.filter(a => a.role === 'plugin');
|
|
25
|
+
plugins.sort((a, b) => Number(b.destination === 'Plugins/Dashboard') - Number(a.destination === 'Plugins/Dashboard'));
|
|
26
|
+
const services = {};
|
|
27
|
+
for (const entry of assemblies.filter(a => a.service)) {
|
|
28
|
+
services[entry.service] = {
|
|
29
|
+
Assembly: entry.assembly,
|
|
30
|
+
WorkingDirectory: windowsPath(entry.destination || '.'),
|
|
31
|
+
Disabled: entry.role === 'worker' ? 'true' : 'false',
|
|
32
|
+
...(entry.role === 'server' ? {
|
|
33
|
+
Urls: `http://localhost:${plan.port}`,
|
|
34
|
+
Plugins: strings(plugins.map(a => a.path)),
|
|
35
|
+
PluginWorkers: strings(assemblies.filter(a => a.role === 'worker').map(a => a.path)),
|
|
36
|
+
Storage: { StorageType: 'SQLite', ConnectionString: 'Data source=..\\wyndbs\\storage.db;' },
|
|
37
|
+
DataExtraction: { StorageType: 'SQLite', ConnectionString: 'Data source=..\\wyndbs\\extraction.db;' },
|
|
38
|
+
IdentityServer: { StorageType: 'SQLite', ConnectionString: 'Data source=..\\wyndbs\\is.db;' },
|
|
39
|
+
SchedulerConfig: { Mode: 'Embedded' },
|
|
40
|
+
ProductArchitecture: 'FullEmbedded',
|
|
41
|
+
DisableJavaDataSource: 'true',
|
|
42
|
+
} : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const document = {
|
|
46
|
+
'?xml': { '@_version': '1.0', '@_encoding': 'utf-8' },
|
|
47
|
+
SystemConfig: {
|
|
48
|
+
'@_xmlns': schemaNamespace(plan.schema),
|
|
49
|
+
'@_xmlns:sys': 'https://extendedxmlserializer.github.io/system',
|
|
50
|
+
Version: schemaVersions[plan.schema],
|
|
51
|
+
GlobalSettings: {
|
|
52
|
+
IdentityServerUrl: `http://localhost:${plan.port}`,
|
|
53
|
+
DataWarehouse: { Provider: 'DuckDB', ConnectionString: 'Data source=..\\wyndbs\\analysis.db' },
|
|
54
|
+
},
|
|
55
|
+
Services: services,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
return new fast_xml_parser_1.XMLBuilder({ ignoreAttributes: false, format: true, suppressEmptyNode: false }).build(document);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/environment/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { EnvironmentRegistry, EnvironmentRecord, RunMode } from './registry';
|
|
2
|
+
import { ProcessBackend } from './process';
|
|
3
|
+
import { EnvironmentClient, EnvironmentOptions, EnvironmentProgress, EnvironmentPlan, EnvironmentResult } from './types';
|
|
4
|
+
export { ownershipFile } from './validate';
|
|
5
|
+
export interface ManagerDependencies {
|
|
6
|
+
registry?: EnvironmentRegistry;
|
|
7
|
+
processes?: ProcessBackend;
|
|
8
|
+
portCheck?: (port: number) => Promise<void>;
|
|
9
|
+
platform?: NodeJS.Platform;
|
|
10
|
+
onProgress?: EnvironmentProgress;
|
|
11
|
+
/** Best-effort report of processes holding a directory, used in deletion errors. */
|
|
12
|
+
pathHolders?: (root: string) => Promise<string[]>;
|
|
13
|
+
}
|
|
14
|
+
export declare class EnvironmentManager {
|
|
15
|
+
private readonly dependencies;
|
|
16
|
+
readonly registry: EnvironmentRegistry;
|
|
17
|
+
private readonly processes;
|
|
18
|
+
private readonly portCheck;
|
|
19
|
+
private readonly pathHolders;
|
|
20
|
+
constructor(dependencies?: ManagerDependencies);
|
|
21
|
+
create(name: string, options: EnvironmentOptions, clientFactory: () => EnvironmentClient, onProgress?: EnvironmentProgress): Promise<EnvironmentPlan | EnvironmentResult>;
|
|
22
|
+
private activeCreator;
|
|
23
|
+
/**
|
|
24
|
+
* Observed state of every registered environment, including ownership
|
|
25
|
+
* problems and the runtime identity check (`observeRuntimeState`).
|
|
26
|
+
*/
|
|
27
|
+
list(): Promise<(EnvironmentRecord & {
|
|
28
|
+
observedState: string;
|
|
29
|
+
problem?: string;
|
|
30
|
+
})[]>;
|
|
31
|
+
private validateRuntime;
|
|
32
|
+
private stopEntry;
|
|
33
|
+
private fresh;
|
|
34
|
+
stop(name: string): Promise<void>;
|
|
35
|
+
private launch;
|
|
36
|
+
private foreground;
|
|
37
|
+
private runLaunch;
|
|
38
|
+
private validateMode;
|
|
39
|
+
start(name: string, mode?: RunMode): Promise<void>;
|
|
40
|
+
restart(name: string, mode?: RunMode): Promise<void>;
|
|
41
|
+
delete(name: string, confirm: (entry: EnvironmentRecord) => Promise<boolean>): Promise<boolean>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/environment/manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAsI,MAAM,WAAW,CAAC;AAE/K,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIzH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,oFAAoF;IACpF,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnD;AACD,qBAAa,kBAAkB;IAKjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJzC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;gBACrC,YAAY,GAAE,mBAAwB;IAC7D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,EAAE,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,GAAG,iBAAiB,CAAC;YAwBjK,aAAa;IAO3B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,iBAAiB,GAAG;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;YAS5E,eAAe;YAWf,SAAS;YAQT,KAAK;IACb,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YACzB,MAAM;YAoCN,UAAU;YAWV,SAAS;IAavB,OAAO,CAAC,YAAY;IACd,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CA0DtG"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.EnvironmentManager = exports.ownershipFile = void 0;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const crypto_1 = require("crypto");
|
|
40
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
41
|
+
const registry_1 = require("./registry");
|
|
42
|
+
const process_1 = require("./process");
|
|
43
|
+
const validate_1 = require("./validate");
|
|
44
|
+
const plan_1 = require("./plan");
|
|
45
|
+
const builder_1 = require("./builder");
|
|
46
|
+
var validate_2 = require("./validate");
|
|
47
|
+
Object.defineProperty(exports, "ownershipFile", { enumerable: true, get: function () { return validate_2.ownershipFile; } });
|
|
48
|
+
class EnvironmentManager {
|
|
49
|
+
dependencies;
|
|
50
|
+
registry;
|
|
51
|
+
processes;
|
|
52
|
+
portCheck;
|
|
53
|
+
pathHolders;
|
|
54
|
+
constructor(dependencies = {}) {
|
|
55
|
+
this.dependencies = dependencies;
|
|
56
|
+
this.registry = dependencies.registry ?? new registry_1.EnvironmentRegistry();
|
|
57
|
+
this.processes = dependencies.processes ?? new process_1.WindowsProcessBackend();
|
|
58
|
+
this.portCheck = dependencies.portCheck ?? process_1.checkPort;
|
|
59
|
+
this.pathHolders = dependencies.pathHolders ?? process_1.describePathHolders;
|
|
60
|
+
}
|
|
61
|
+
async create(name, options, clientFactory, onProgress) {
|
|
62
|
+
if (!options.dryRun && (this.dependencies.platform ?? process.platform) !== 'win32')
|
|
63
|
+
throw new Error('Environment execution is Windows-only. Use dry-run on other platforms.');
|
|
64
|
+
const normalized = await (0, plan_1.validateEnvironmentOptions)(options);
|
|
65
|
+
await (0, validate_1.validateEnvironmentRoot)({ root: normalized.root }, this.registry.directory);
|
|
66
|
+
this.registry.check(await this.registry.read(), name, normalized.root, normalized.port);
|
|
67
|
+
await this.portCheck(normalized.port);
|
|
68
|
+
if (options.dryRun) {
|
|
69
|
+
const plan = await (0, plan_1.buildEnvironmentPlan)(options, clientFactory(), onProgress);
|
|
70
|
+
return { ...plan, managed: { name, root: normalized.root, port: normalized.port } };
|
|
71
|
+
}
|
|
72
|
+
const creator = await this.processes.inspect(process.pid);
|
|
73
|
+
const record = { id: (0, crypto_1.randomUUID)(), name, root: normalized.root, port: normalized.port, edition: normalized.edition, major: normalized.major, profile: normalized.profile, modules: normalized.modules, manifest: path.join(normalized.root, 'environment.lock.json'), createdAt: new Date().toISOString(), state: 'creating', ...(creator.status === 'live' ? { creator: { ...creator.identity, command: `sha256:${(0, crypto_1.createHash)('sha256').update(creator.identity.command).digest('hex')}` } } : {}) };
|
|
74
|
+
await this.registry.update(entries => { this.registry.check(entries, name, record.root, record.port); entries.push(record); });
|
|
75
|
+
return this.registry.locked(`env-${record.id}`, async () => {
|
|
76
|
+
try {
|
|
77
|
+
const client = clientFactory();
|
|
78
|
+
const plan = await (0, plan_1.buildEnvironmentPlan)(options, client, onProgress);
|
|
79
|
+
const result = await (0, builder_1.executeEnvironmentPlan)(plan, { client, onProgress, platform: this.dependencies.platform, managed: { id: record.id, name } });
|
|
80
|
+
record.state = 'ready';
|
|
81
|
+
delete record.creator;
|
|
82
|
+
await this.registry.save(record);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
// Publication/registry failures must retain a recoverable ownership record.
|
|
87
|
+
let published = false;
|
|
88
|
+
try {
|
|
89
|
+
const marker = JSON.parse(await fs.readFile(path.join(record.root, validate_1.ownershipFile), 'utf8'));
|
|
90
|
+
published = marker.id === record.id;
|
|
91
|
+
}
|
|
92
|
+
catch (readError) {
|
|
93
|
+
if (readError.code !== 'ENOENT')
|
|
94
|
+
published = true;
|
|
95
|
+
}
|
|
96
|
+
if (!published)
|
|
97
|
+
await this.registry.remove(record.id);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
async activeCreator(entry) {
|
|
103
|
+
if (entry.state !== 'creating')
|
|
104
|
+
return;
|
|
105
|
+
if (!entry.creator)
|
|
106
|
+
throw new Error('Creating reservation has unknown owner; refusing lifecycle operation.');
|
|
107
|
+
const inspected = await this.processes.inspect(entry.creator.pid);
|
|
108
|
+
const live = inspected.status === 'live' && entry.creator.command.startsWith('sha256:') ? { ...inspected.identity, command: `sha256:${(0, crypto_1.createHash)('sha256').update(inspected.identity.command).digest('hex')}` } : inspected.status === 'live' ? inspected.identity : undefined;
|
|
109
|
+
if (inspected.status === 'unknown' || live && (0, process_1.sameProcess)(live, entry.creator))
|
|
110
|
+
throw new Error('Creation owner is active or uncertain; refusing lifecycle operation.');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Observed state of every registered environment, including ownership
|
|
114
|
+
* problems and the runtime identity check (`observeRuntimeState`).
|
|
115
|
+
*/
|
|
116
|
+
async list() {
|
|
117
|
+
return Promise.all((await this.registry.read()).map(async (entry) => {
|
|
118
|
+
let observedState = await (0, validate_1.observeRuntimeState)(entry, this.processes);
|
|
119
|
+
let problem;
|
|
120
|
+
try {
|
|
121
|
+
await (0, validate_1.validateEnvironmentOwnership)(entry, this.registry.directory);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
problem = error.message;
|
|
125
|
+
observedState = observedState === 'running' || observedState === 'unknown' ? observedState : problem.includes('ENOENT') ? 'missing' : 'broken';
|
|
126
|
+
}
|
|
127
|
+
if (entry.state === 'creating' && !entry.run) {
|
|
128
|
+
observedState = 'creating';
|
|
129
|
+
problem = problem ? `Creation not fully published: ${problem}` : 'Creating reservation; inspect creator identity before recovery.';
|
|
130
|
+
}
|
|
131
|
+
else if (observedState === 'unknown' && !problem)
|
|
132
|
+
problem = 'Runtime identity uncertain; inspect registry, OS processes and any .afm-runtime-recovery.json before recovery.';
|
|
133
|
+
return { ...entry, observedState, ...(problem ? { problem } : {}) };
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
async validateRuntime(entry) {
|
|
137
|
+
await (0, validate_1.validateEnvironmentOwnership)(entry, this.registry.directory);
|
|
138
|
+
await (0, validate_1.validateEnvironmentTree)(entry.root);
|
|
139
|
+
for (const file of [(0, validate_1.environmentDll)(entry), path.join(entry.root, 'Server', 'Wyn.Server.runtimeconfig.json'), path.join(entry.root, 'conf', 'Wyn.conf')]) {
|
|
140
|
+
const stat = await fs.lstat(file);
|
|
141
|
+
if (!stat.isFile() || stat.isSymbolicLink())
|
|
142
|
+
throw new Error('Runtime requires regular DLL, runtimeconfig and configuration files.');
|
|
143
|
+
}
|
|
144
|
+
const xml = await fs.readFile(path.join(entry.root, 'conf', 'Wyn.conf'), 'utf8');
|
|
145
|
+
if (/<!DOCTYPE|<!ENTITY/i.test(xml) || fast_xml_parser_1.XMLValidator.validate(xml) !== true)
|
|
146
|
+
throw new Error('Invalid environment configuration.');
|
|
147
|
+
const document = new fast_xml_parser_1.XMLParser({ ignoreAttributes: false, parseTagValue: false, processEntities: false }).parse(xml);
|
|
148
|
+
const expected = `http://localhost:${entry.port}`;
|
|
149
|
+
if (document?.SystemConfig?.Services?.Server?.Urls !== expected || document?.SystemConfig?.GlobalSettings?.IdentityServerUrl !== expected)
|
|
150
|
+
throw new Error('Configured port differs from registry; refusing startup.');
|
|
151
|
+
}
|
|
152
|
+
async stopEntry(entry) {
|
|
153
|
+
await this.activeCreator(entry);
|
|
154
|
+
const state = await (0, validate_1.observeRuntimeState)(entry, this.processes);
|
|
155
|
+
if (state === 'unknown')
|
|
156
|
+
throw new Error('Process identity uncertain; refusing stop/delete.');
|
|
157
|
+
if (state === 'running')
|
|
158
|
+
await this.processes.stop(entry.run);
|
|
159
|
+
if (entry.state !== 'stopped' || entry.run) {
|
|
160
|
+
entry.state = 'stopped';
|
|
161
|
+
delete entry.run;
|
|
162
|
+
await this.registry.save(entry);
|
|
163
|
+
}
|
|
164
|
+
this.dependencies.onProgress?.(`${entry.name}: stopped (verified).`);
|
|
165
|
+
}
|
|
166
|
+
async fresh(name, id) { const entry = await this.registry.get(name); if (entry.id !== id)
|
|
167
|
+
throw new Error('Environment UUID changed during operation.'); return entry; }
|
|
168
|
+
async stop(name) { const entry = await this.registry.get(name); await this.registry.locked(`env-${entry.id}`, async () => this.stopEntry(await this.fresh(name, entry.id))); }
|
|
169
|
+
async launch(entry, mode) {
|
|
170
|
+
await this.activeCreator(entry);
|
|
171
|
+
await this.validateRuntime(entry);
|
|
172
|
+
const state = await (0, validate_1.observeRuntimeState)(entry, this.processes, { ignoreAmbiguous: true });
|
|
173
|
+
if (state === 'running' || state === 'unknown')
|
|
174
|
+
throw new Error(`Cannot start environment: ${state}.`);
|
|
175
|
+
await this.portCheck(entry.port);
|
|
176
|
+
const stdout = path.join(entry.root, 'logs', 'server.stdout.log');
|
|
177
|
+
const stderr = path.join(entry.root, 'logs', 'server.stderr.log');
|
|
178
|
+
await fs.mkdir(path.join(entry.root, 'logs'), { recursive: true });
|
|
179
|
+
if (mode === 'background')
|
|
180
|
+
this.dependencies.onProgress?.('Background mode starts the monitor in its own hidden console so Wyn.Server can set its console title; output is appended to the log files.');
|
|
181
|
+
const remember = async (identity) => {
|
|
182
|
+
entry.state = 'running';
|
|
183
|
+
entry.lastMode = mode;
|
|
184
|
+
entry.run = { ...identity, mode, ...(mode === 'background' ? { stdout, stderr } : {}) };
|
|
185
|
+
try {
|
|
186
|
+
await this.registry.save(entry);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
await fs.writeFile(path.join(entry.root, '.afm-runtime-recovery.json'), JSON.stringify({ version: 1, id: entry.id, run: entry.run }, null, 2) + '\n', { flag: 'wx' });
|
|
190
|
+
throw new Error(`Runtime identity saved to ${path.join(entry.root, '.afm-runtime-recovery.json')}; registry recovery required: ${error.message}`);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
let child;
|
|
194
|
+
try {
|
|
195
|
+
child = await this.processes.start((0, validate_1.environmentDll)(entry), mode, stdout, stderr);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (error instanceof process_1.PendingProcessError)
|
|
199
|
+
await remember(error.identity);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const current = await this.processes.inspect(child.identity.pid);
|
|
204
|
+
if (current.status !== 'live' || !(0, process_1.sameProcess)(current.identity, child.identity) || !(0, process_1.isMonitor)(child.identity, (0, validate_1.environmentDll)(entry)))
|
|
205
|
+
throw new Error('Monitor exited or identity cannot be verified.');
|
|
206
|
+
entry.state = 'running';
|
|
207
|
+
entry.lastMode = mode;
|
|
208
|
+
entry.run = { ...child.identity, mode, ...(mode === 'background' ? { stdout, stderr } : {}) };
|
|
209
|
+
await this.registry.save(entry);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
try {
|
|
213
|
+
const status = await this.processes.inspect(child.identity.pid);
|
|
214
|
+
if (status.status !== 'absent')
|
|
215
|
+
await this.processes.stop(child.identity);
|
|
216
|
+
else if ((await this.processes.find((0, process_1.monitorCommand)((0, validate_1.environmentDll)(entry)))).some(candidate => candidate.status !== 'absent'))
|
|
217
|
+
throw new Error('Owned descendants or process inspection remain uncertain.');
|
|
218
|
+
}
|
|
219
|
+
catch (cleanupError) {
|
|
220
|
+
try {
|
|
221
|
+
await remember(child.identity);
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
child.unref();
|
|
225
|
+
}
|
|
226
|
+
throw new Error(`Launch failed and cleanup uncertain; runtime identity retained: ${cleanupError.message}`);
|
|
227
|
+
}
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
if (mode === 'background')
|
|
231
|
+
child.unref();
|
|
232
|
+
this.dependencies.onProgress?.(`${entry.name}: monitor running, PID ${child.identity.pid}, ${mode}${mode === 'background' ? `; stdout ${stdout}; stderr ${stderr}` : '; output inherited; Ctrl+C stops the monitor tree'}. HTTP readiness not checked.`);
|
|
233
|
+
return child;
|
|
234
|
+
}
|
|
235
|
+
async foreground(name, id, child) {
|
|
236
|
+
if (!child.exited)
|
|
237
|
+
throw new Error('Foreground launch did not provide a process handle.');
|
|
238
|
+
let cleanup;
|
|
239
|
+
const clean = async () => this.registry.locked(`env-${id}`, async () => { const entries = await this.registry.read(); const entry = entries.find(e => e.id === id); if (!entry || !entry.run || !(0, process_1.sameProcess)(entry.run, child.identity))
|
|
240
|
+
return false; await this.stopEntry(entry); return true; });
|
|
241
|
+
let wake;
|
|
242
|
+
const signalled = new Promise(resolve => { wake = resolve; });
|
|
243
|
+
const stop = () => { cleanup ??= clean(); void cleanup.then(wake, error => { console.error('Foreground cleanup failed:', error.message); process.exitCode = 1; wake(); }); };
|
|
244
|
+
process.on('SIGINT', stop);
|
|
245
|
+
process.on('SIGTERM', stop);
|
|
246
|
+
try {
|
|
247
|
+
await Promise.race([child.exited, signalled]);
|
|
248
|
+
if (cleanup)
|
|
249
|
+
await cleanup;
|
|
250
|
+
else {
|
|
251
|
+
const owned = await clean();
|
|
252
|
+
if (owned && child.exitCode && child.exitCode() !== 0)
|
|
253
|
+
throw new Error(`Monitor exited unexpectedly with code ${child.exitCode()}.`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
process.removeListener('SIGINT', stop);
|
|
258
|
+
process.removeListener('SIGTERM', stop);
|
|
259
|
+
if (cleanup)
|
|
260
|
+
child.unref();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async runLaunch(name, id, mode, action) {
|
|
264
|
+
let interrupted = false;
|
|
265
|
+
const mark = () => { interrupted = true; };
|
|
266
|
+
process.on('SIGINT', mark);
|
|
267
|
+
process.on('SIGTERM', mark);
|
|
268
|
+
let child;
|
|
269
|
+
try {
|
|
270
|
+
child = await this.registry.locked(`env-${id}`, action);
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
process.removeListener('SIGINT', mark);
|
|
274
|
+
process.removeListener('SIGTERM', mark);
|
|
275
|
+
}
|
|
276
|
+
if (interrupted) {
|
|
277
|
+
await this.registry.locked(`env-${id}`, async () => { const entries = await this.registry.read(); const entry = entries.find(e => e.id === id); if (entry?.run && (0, process_1.sameProcess)(entry.run, child.identity))
|
|
278
|
+
await this.stopEntry(entry); });
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (mode === 'foreground')
|
|
282
|
+
await this.foreground(name, id, child);
|
|
283
|
+
}
|
|
284
|
+
validateMode(mode) { if (!['foreground', 'background'].includes(mode))
|
|
285
|
+
throw new Error('Runtime mode must be foreground or background.'); }
|
|
286
|
+
async start(name, mode = 'foreground') {
|
|
287
|
+
this.validateMode(mode);
|
|
288
|
+
const entry = await this.registry.get(name);
|
|
289
|
+
await this.runLaunch(name, entry.id, mode, async () => this.launch(await this.fresh(name, entry.id), mode));
|
|
290
|
+
}
|
|
291
|
+
async restart(name, mode) {
|
|
292
|
+
if (mode !== undefined)
|
|
293
|
+
this.validateMode(mode);
|
|
294
|
+
const entry = await this.registry.get(name);
|
|
295
|
+
const selected = mode ?? entry.lastMode ?? 'foreground';
|
|
296
|
+
this.validateMode(selected);
|
|
297
|
+
await this.runLaunch(name, entry.id, selected, async () => { const fresh = await this.fresh(name, entry.id); await this.stopEntry(fresh); return this.launch(fresh, selected); });
|
|
298
|
+
}
|
|
299
|
+
async delete(name, confirm) {
|
|
300
|
+
const entry = await this.registry.get(name);
|
|
301
|
+
if (!await confirm(entry))
|
|
302
|
+
return false;
|
|
303
|
+
return this.registry.locked(`env-${entry.id}`, async () => {
|
|
304
|
+
const fresh = await this.registry.get(name);
|
|
305
|
+
if (fresh.id !== entry.id || fresh.root !== entry.root)
|
|
306
|
+
throw new Error('Environment changed after confirmation.');
|
|
307
|
+
await this.activeCreator(fresh);
|
|
308
|
+
const others = await this.registry.read();
|
|
309
|
+
if (others.some(e => e.id !== fresh.id && (e.root.toLowerCase().startsWith(fresh.root.toLowerCase() + path.sep) || fresh.root.toLowerCase().startsWith(e.root.toLowerCase() + path.sep))))
|
|
310
|
+
throw new Error('Environment roots overlap; refusing delete.');
|
|
311
|
+
const exists = await (0, validate_1.validateEnvironmentRoot)(fresh, this.registry.directory);
|
|
312
|
+
if (exists) {
|
|
313
|
+
await (0, validate_1.validateEnvironmentOwnership)(fresh, this.registry.directory);
|
|
314
|
+
await (0, validate_1.validateEnvironmentTree)(fresh.root);
|
|
315
|
+
}
|
|
316
|
+
await this.stopEntry(fresh);
|
|
317
|
+
if (exists) {
|
|
318
|
+
await (0, validate_1.validateEnvironmentOwnership)(fresh, this.registry.directory);
|
|
319
|
+
await (0, validate_1.validateEnvironmentTree)(fresh.root);
|
|
320
|
+
const link = path.join(fresh.root, 'Monitor', 'conf');
|
|
321
|
+
try {
|
|
322
|
+
if ((await fs.lstat(link)).isSymbolicLink())
|
|
323
|
+
await fs.unlink(link);
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
if (error.code !== 'ENOENT')
|
|
327
|
+
throw error;
|
|
328
|
+
}
|
|
329
|
+
const metadata = await Promise.all([validate_1.ownershipFile, 'environment.lock.json'].map(async (name) => ({ name, content: await fs.readFile(path.join(fresh.root, name), 'utf8') })));
|
|
330
|
+
const rootStat = await fs.lstat(fresh.root);
|
|
331
|
+
try {
|
|
332
|
+
for (const name of await fs.readdir(fresh.root)) {
|
|
333
|
+
if (metadata.some(file => file.name === name))
|
|
334
|
+
continue;
|
|
335
|
+
await fs.rm(path.join(fresh.root, name), { recursive: true });
|
|
336
|
+
}
|
|
337
|
+
for (const file of metadata)
|
|
338
|
+
await fs.unlink(path.join(fresh.root, file.name));
|
|
339
|
+
// A transient scanner or watcher lock can clear on its own: retry briefly
|
|
340
|
+
// before restoring the metadata and reporting.
|
|
341
|
+
for (let attempt = 0;; attempt++) {
|
|
342
|
+
try {
|
|
343
|
+
await fs.rmdir(fresh.root);
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
if (attempt >= 2)
|
|
348
|
+
throw error;
|
|
349
|
+
await new Promise(resolve => setTimeout(resolve, 250));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
// Restore missing metadata exclusively if final directory removal failed.
|
|
355
|
+
let restored = false;
|
|
356
|
+
try {
|
|
357
|
+
const current = await fs.lstat(fresh.root);
|
|
358
|
+
if (current.isDirectory() && !current.isSymbolicLink() && current.ino === rootStat.ino && current.dev === rootStat.dev) {
|
|
359
|
+
for (const file of metadata)
|
|
360
|
+
await fs.writeFile(path.join(fresh.root, file.name), file.content, { flag: 'wx' }).catch(writeError => { if (writeError.code !== 'EEXIST')
|
|
361
|
+
throw writeError; });
|
|
362
|
+
restored = true;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch { /* Keep registry and report manual recovery when metadata cannot be restored. */ }
|
|
366
|
+
const holders = await this.pathHolders(fresh.root).catch(() => []);
|
|
367
|
+
const owner = holders.length
|
|
368
|
+
? `Processes that mention this directory on their command line: ${holders.join(', ')}. Close them and run \`env delete ${fresh.name}\` again.`
|
|
369
|
+
: `A program, editor or terminal may still have this folder open. Close it and run \`env delete ${fresh.name}\` again.`;
|
|
370
|
+
const advice = restored
|
|
371
|
+
? `Ownership metadata was restored and the registry record retained, so that retry completes the removal. ${owner}`
|
|
372
|
+
: `Ownership metadata could not be restored; registry retained for manual recovery of the environment record. ${owner}`;
|
|
373
|
+
throw new Error(`Deletion incomplete for ${fresh.name} at ${fresh.root}; registry retained. ${advice} Cause: ${error.message}`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
await this.registry.remove(fresh.id);
|
|
377
|
+
this.dependencies.onProgress?.(`${fresh.name}: deleted directory ${fresh.root} and registry record.`);
|
|
378
|
+
return true;
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
exports.EnvironmentManager = EnvironmentManager;
|
|
383
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/environment/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EnvironmentClient, EnvironmentModule, EnvironmentOptions, EnvironmentPlan } from './types';
|
|
2
|
+
export declare function validateTarget(root: string): Promise<void>;
|
|
3
|
+
export declare function validateEnvironmentOptions(options: EnvironmentOptions): Promise<EnvironmentOptions & {
|
|
4
|
+
edition: 'cn' | 'en';
|
|
5
|
+
profile: 'embedded';
|
|
6
|
+
port: number;
|
|
7
|
+
modules: EnvironmentModule[];
|
|
8
|
+
}>;
|
|
9
|
+
export declare function buildEnvironmentPlan(options: EnvironmentOptions, client: EnvironmentClient, onProgress?: (message: string) => void): Promise<EnvironmentPlan>;
|
|
10
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/environment/plan.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpG,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhE;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAerM;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC,CAiCnK"}
|