@auxiora/updater 1.10.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/LICENSE +191 -0
- package/dist/detector.d.ts +10 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +106 -0
- package/dist/detector.js.map +1 -0
- package/dist/health-checker.d.ts +15 -0
- package/dist/health-checker.d.ts.map +1 -0
- package/dist/health-checker.js +41 -0
- package/dist/health-checker.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/strategies/apt.d.ts +10 -0
- package/dist/strategies/apt.d.ts.map +1 -0
- package/dist/strategies/apt.js +46 -0
- package/dist/strategies/apt.js.map +1 -0
- package/dist/strategies/brew.d.ts +10 -0
- package/dist/strategies/brew.d.ts.map +1 -0
- package/dist/strategies/brew.js +43 -0
- package/dist/strategies/brew.js.map +1 -0
- package/dist/strategies/docker.d.ts +10 -0
- package/dist/strategies/docker.d.ts.map +1 -0
- package/dist/strategies/docker.js +75 -0
- package/dist/strategies/docker.js.map +1 -0
- package/dist/strategies/git.d.ts +10 -0
- package/dist/strategies/git.d.ts.map +1 -0
- package/dist/strategies/git.js +59 -0
- package/dist/strategies/git.js.map +1 -0
- package/dist/strategies/index.d.ts +10 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +31 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/k8s.d.ts +10 -0
- package/dist/strategies/k8s.d.ts.map +1 -0
- package/dist/strategies/k8s.js +53 -0
- package/dist/strategies/k8s.js.map +1 -0
- package/dist/strategies/npm.d.ts +10 -0
- package/dist/strategies/npm.d.ts.map +1 -0
- package/dist/strategies/npm.js +50 -0
- package/dist/strategies/npm.js.map +1 -0
- package/dist/strategies/tarball.d.ts +11 -0
- package/dist/strategies/tarball.d.ts.map +1 -0
- package/dist/strategies/tarball.js +72 -0
- package/dist/strategies/tarball.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +28 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +225 -0
- package/dist/updater.js.map +1 -0
- package/dist/util/download.d.ts +2 -0
- package/dist/util/download.d.ts.map +1 -0
- package/dist/util/download.js +20 -0
- package/dist/util/download.js.map +1 -0
- package/dist/util/exec.d.ts +17 -0
- package/dist/util/exec.d.ts.map +1 -0
- package/dist/util/exec.js +32 -0
- package/dist/util/exec.js.map +1 -0
- package/dist/version-checker.d.ts +12 -0
- package/dist/version-checker.d.ts.map +1 -0
- package/dist/version-checker.js +108 -0
- package/dist/version-checker.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getLogger } from '@auxiora/logger';
|
|
2
|
+
import { safeExecFile } from '../util/exec.js';
|
|
3
|
+
const logger = getLogger('updater:strategies:docker');
|
|
4
|
+
const IMAGE_BASE = 'ghcr.io/trollbyte/auxiora';
|
|
5
|
+
const CONTAINER_NAME = 'auxiora';
|
|
6
|
+
export class DockerStrategy {
|
|
7
|
+
method = 'docker';
|
|
8
|
+
async stage(target, info) {
|
|
9
|
+
const imageTag = `${IMAGE_BASE}:v${target.latestVersion}`;
|
|
10
|
+
logger.info('Pulling docker image', { image: imageTag });
|
|
11
|
+
const result = await safeExecFile('docker', ['pull', imageTag]);
|
|
12
|
+
if (result.status === 'error') {
|
|
13
|
+
throw new Error(`docker pull failed: ${result.stderr}`);
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
targetVersion: target.latestVersion,
|
|
17
|
+
previousVersion: info.currentVersion,
|
|
18
|
+
backupPath: '',
|
|
19
|
+
stagedPath: imageTag,
|
|
20
|
+
method: this.method,
|
|
21
|
+
timestamp: Date.now(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async apply(staged) {
|
|
25
|
+
const newImage = `${IMAGE_BASE}:v${staged.targetVersion}`;
|
|
26
|
+
logger.info('Deploying new docker container', { image: newImage });
|
|
27
|
+
const stopResult = await safeExecFile('docker', ['stop', CONTAINER_NAME]);
|
|
28
|
+
if (stopResult.status === 'error') {
|
|
29
|
+
throw new Error(`docker stop failed: ${stopResult.stderr}`);
|
|
30
|
+
}
|
|
31
|
+
const rmResult = await safeExecFile('docker', ['rm', CONTAINER_NAME]);
|
|
32
|
+
if (rmResult.status === 'error') {
|
|
33
|
+
throw new Error(`docker rm failed: ${rmResult.stderr}`);
|
|
34
|
+
}
|
|
35
|
+
const runResult = await safeExecFile('docker', [
|
|
36
|
+
'run', '-d',
|
|
37
|
+
'--name', CONTAINER_NAME,
|
|
38
|
+
'--restart', 'unless-stopped',
|
|
39
|
+
newImage,
|
|
40
|
+
]);
|
|
41
|
+
if (runResult.status === 'error') {
|
|
42
|
+
throw new Error(`docker run failed: ${runResult.stderr}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async restart(_info) {
|
|
46
|
+
// Implicit: a new container was started during apply()
|
|
47
|
+
logger.info('Docker container restart is implicit via apply()');
|
|
48
|
+
}
|
|
49
|
+
async rollback(staged) {
|
|
50
|
+
const prevImage = `${IMAGE_BASE}:v${staged.previousVersion}`;
|
|
51
|
+
logger.info('Rolling back docker container', { image: prevImage });
|
|
52
|
+
const stopResult = await safeExecFile('docker', ['stop', CONTAINER_NAME]);
|
|
53
|
+
if (stopResult.status === 'error') {
|
|
54
|
+
throw new Error(`docker stop failed: ${stopResult.stderr}`);
|
|
55
|
+
}
|
|
56
|
+
const rmResult = await safeExecFile('docker', ['rm', CONTAINER_NAME]);
|
|
57
|
+
if (rmResult.status === 'error') {
|
|
58
|
+
throw new Error(`docker rm failed: ${rmResult.stderr}`);
|
|
59
|
+
}
|
|
60
|
+
const runResult = await safeExecFile('docker', [
|
|
61
|
+
'run', '-d',
|
|
62
|
+
'--name', CONTAINER_NAME,
|
|
63
|
+
'--restart', 'unless-stopped',
|
|
64
|
+
prevImage,
|
|
65
|
+
]);
|
|
66
|
+
if (runResult.status === 'error') {
|
|
67
|
+
throw new Error(`docker run rollback failed: ${runResult.stderr}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async cleanup(_staged) {
|
|
71
|
+
logger.info('Pruning unused docker images');
|
|
72
|
+
await safeExecFile('docker', ['image', 'prune', '-f']);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/strategies/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UpdateStrategy, InstallMethod, UpdateCheckResult, InstallationInfo, StagedUpdate } from '../types.js';
|
|
2
|
+
export declare class GitStrategy implements UpdateStrategy {
|
|
3
|
+
readonly method: InstallMethod;
|
|
4
|
+
stage(target: UpdateCheckResult, info: InstallationInfo): Promise<StagedUpdate>;
|
|
5
|
+
apply(staged: StagedUpdate): Promise<void>;
|
|
6
|
+
restart(_info: InstallationInfo): Promise<void>;
|
|
7
|
+
rollback(staged: StagedUpdate): Promise<void>;
|
|
8
|
+
cleanup(_staged: StagedUpdate): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/strategies/git.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKpH,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAS;IAEjC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB/E,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1C,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7C,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getLogger } from '@auxiora/logger';
|
|
2
|
+
import { safeExecFile } from '../util/exec.js';
|
|
3
|
+
const logger = getLogger('updater:strategies:git');
|
|
4
|
+
export class GitStrategy {
|
|
5
|
+
method = 'git';
|
|
6
|
+
async stage(target, info) {
|
|
7
|
+
logger.info('Fetching git tags', { version: target.latestVersion });
|
|
8
|
+
const result = await safeExecFile('git', ['fetch', '--tags'], { cwd: info.installPath });
|
|
9
|
+
if (result.status === 'error') {
|
|
10
|
+
throw new Error(`git fetch failed: ${result.stderr}`);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
targetVersion: target.latestVersion,
|
|
14
|
+
previousVersion: info.currentVersion,
|
|
15
|
+
backupPath: '',
|
|
16
|
+
stagedPath: info.installPath,
|
|
17
|
+
method: this.method,
|
|
18
|
+
timestamp: Date.now(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async apply(staged) {
|
|
22
|
+
logger.info('Checking out git tag', { version: staged.targetVersion });
|
|
23
|
+
const checkoutResult = await safeExecFile('git', ['checkout', `v${staged.targetVersion}`], { cwd: staged.stagedPath });
|
|
24
|
+
if (checkoutResult.status === 'error') {
|
|
25
|
+
throw new Error(`git checkout failed: ${checkoutResult.stderr}`);
|
|
26
|
+
}
|
|
27
|
+
const installResult = await safeExecFile('pnpm', ['install'], { cwd: staged.stagedPath });
|
|
28
|
+
if (installResult.status === 'error') {
|
|
29
|
+
throw new Error(`pnpm install failed: ${installResult.stderr}`);
|
|
30
|
+
}
|
|
31
|
+
const buildResult = await safeExecFile('pnpm', ['build'], { cwd: staged.stagedPath });
|
|
32
|
+
if (buildResult.status === 'error') {
|
|
33
|
+
throw new Error(`pnpm build failed: ${buildResult.stderr}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async restart(_info) {
|
|
37
|
+
logger.info('Restarting gateway process');
|
|
38
|
+
await safeExecFile('pkill', ['-f', 'auxiora-gateway']);
|
|
39
|
+
}
|
|
40
|
+
async rollback(staged) {
|
|
41
|
+
logger.info('Rolling back git checkout', { version: staged.previousVersion });
|
|
42
|
+
const checkoutResult = await safeExecFile('git', ['checkout', `v${staged.previousVersion}`], { cwd: staged.stagedPath });
|
|
43
|
+
if (checkoutResult.status === 'error') {
|
|
44
|
+
throw new Error(`git checkout rollback failed: ${checkoutResult.stderr}`);
|
|
45
|
+
}
|
|
46
|
+
const installResult = await safeExecFile('pnpm', ['install'], { cwd: staged.stagedPath });
|
|
47
|
+
if (installResult.status === 'error') {
|
|
48
|
+
throw new Error(`pnpm install rollback failed: ${installResult.stderr}`);
|
|
49
|
+
}
|
|
50
|
+
const buildResult = await safeExecFile('pnpm', ['build'], { cwd: staged.stagedPath });
|
|
51
|
+
if (buildResult.status === 'error') {
|
|
52
|
+
throw new Error(`pnpm build rollback failed: ${buildResult.stderr}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async cleanup(_staged) {
|
|
56
|
+
// No-op: git repo stays in place
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/strategies/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InstallMethod, UpdateStrategy } from '../types.js';
|
|
2
|
+
export declare function createStrategyMap(): Map<InstallMethod, UpdateStrategy>;
|
|
3
|
+
export { NpmStrategy } from './npm.js';
|
|
4
|
+
export { GitStrategy } from './git.js';
|
|
5
|
+
export { DockerStrategy } from './docker.js';
|
|
6
|
+
export { AptStrategy } from './apt.js';
|
|
7
|
+
export { BrewStrategy } from './brew.js';
|
|
8
|
+
export { TarballStrategy } from './tarball.js';
|
|
9
|
+
export { K8sStrategy } from './k8s.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASjE,wBAAgB,iBAAiB,IAAI,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAgBtE;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { NpmStrategy } from './npm.js';
|
|
2
|
+
import { GitStrategy } from './git.js';
|
|
3
|
+
import { DockerStrategy } from './docker.js';
|
|
4
|
+
import { AptStrategy } from './apt.js';
|
|
5
|
+
import { BrewStrategy } from './brew.js';
|
|
6
|
+
import { TarballStrategy } from './tarball.js';
|
|
7
|
+
import { K8sStrategy } from './k8s.js';
|
|
8
|
+
export function createStrategyMap() {
|
|
9
|
+
const strategies = [
|
|
10
|
+
new NpmStrategy(),
|
|
11
|
+
new GitStrategy(),
|
|
12
|
+
new DockerStrategy(),
|
|
13
|
+
new AptStrategy(),
|
|
14
|
+
new BrewStrategy(),
|
|
15
|
+
new TarballStrategy(),
|
|
16
|
+
new K8sStrategy(),
|
|
17
|
+
];
|
|
18
|
+
const map = new Map();
|
|
19
|
+
for (const s of strategies) {
|
|
20
|
+
map.set(s.method, s);
|
|
21
|
+
}
|
|
22
|
+
return map;
|
|
23
|
+
}
|
|
24
|
+
export { NpmStrategy } from './npm.js';
|
|
25
|
+
export { GitStrategy } from './git.js';
|
|
26
|
+
export { DockerStrategy } from './docker.js';
|
|
27
|
+
export { AptStrategy } from './apt.js';
|
|
28
|
+
export { BrewStrategy } from './brew.js';
|
|
29
|
+
export { TarballStrategy } from './tarball.js';
|
|
30
|
+
export { K8sStrategy } from './k8s.js';
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAqB;QACnC,IAAI,WAAW,EAAE;QACjB,IAAI,WAAW,EAAE;QACjB,IAAI,cAAc,EAAE;QACpB,IAAI,WAAW,EAAE;QACjB,IAAI,YAAY,EAAE;QAClB,IAAI,eAAe,EAAE;QACrB,IAAI,WAAW,EAAE;KAClB,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAiC,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UpdateStrategy, InstallMethod, UpdateCheckResult, InstallationInfo, StagedUpdate } from '../types.js';
|
|
2
|
+
export declare class K8sStrategy implements UpdateStrategy {
|
|
3
|
+
readonly method: InstallMethod;
|
|
4
|
+
stage(target: UpdateCheckResult, info: InstallationInfo): Promise<StagedUpdate>;
|
|
5
|
+
apply(staged: StagedUpdate): Promise<void>;
|
|
6
|
+
restart(_info: InstallationInfo): Promise<void>;
|
|
7
|
+
rollback(_staged: StagedUpdate): Promise<void>;
|
|
8
|
+
cleanup(_staged: StagedUpdate): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=k8s.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s.d.ts","sourceRoot":"","sources":["../../src/strategies/k8s.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQpH,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAS;IAEjC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB/E,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1C,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { getLogger } from '@auxiora/logger';
|
|
2
|
+
import { safeExecFile } from '../util/exec.js';
|
|
3
|
+
const logger = getLogger('updater:strategies:k8s');
|
|
4
|
+
const IMAGE_BASE = 'ghcr.io/trollbyte/auxiora';
|
|
5
|
+
const DEPLOYMENT = 'auxiora';
|
|
6
|
+
export class K8sStrategy {
|
|
7
|
+
method = 'k8s';
|
|
8
|
+
async stage(target, info) {
|
|
9
|
+
logger.info('Validating kubernetes deployment exists');
|
|
10
|
+
const result = await safeExecFile('kubectl', ['get', 'deployment', DEPLOYMENT, '-o', 'json']);
|
|
11
|
+
if (result.status === 'error') {
|
|
12
|
+
throw new Error(`kubectl get deployment failed: ${result.stderr}`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
targetVersion: target.latestVersion,
|
|
16
|
+
previousVersion: info.currentVersion,
|
|
17
|
+
backupPath: '',
|
|
18
|
+
stagedPath: '',
|
|
19
|
+
method: this.method,
|
|
20
|
+
timestamp: Date.now(),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async apply(staged) {
|
|
24
|
+
const newImage = `${IMAGE_BASE}:v${staged.targetVersion}`;
|
|
25
|
+
logger.info('Updating kubernetes deployment image', { image: newImage });
|
|
26
|
+
const result = await safeExecFile('kubectl', [
|
|
27
|
+
'set', 'image',
|
|
28
|
+
`deployment/${DEPLOYMENT}`,
|
|
29
|
+
`${DEPLOYMENT}=${newImage}`,
|
|
30
|
+
]);
|
|
31
|
+
if (result.status === 'error') {
|
|
32
|
+
throw new Error(`kubectl set image failed: ${result.stderr}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async restart(_info) {
|
|
36
|
+
logger.info('Restarting kubernetes deployment');
|
|
37
|
+
const result = await safeExecFile('kubectl', ['rollout', 'restart', `deployment/${DEPLOYMENT}`]);
|
|
38
|
+
if (result.status === 'error') {
|
|
39
|
+
throw new Error(`kubectl rollout restart failed: ${result.stderr}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async rollback(_staged) {
|
|
43
|
+
logger.info('Undoing kubernetes deployment rollout');
|
|
44
|
+
const result = await safeExecFile('kubectl', ['rollout', 'undo', `deployment/${DEPLOYMENT}`]);
|
|
45
|
+
if (result.status === 'error') {
|
|
46
|
+
throw new Error(`kubectl rollout undo failed: ${result.stderr}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async cleanup(_staged) {
|
|
50
|
+
// No-op: kubernetes manages its own resources
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=k8s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"k8s.js","sourceRoot":"","sources":["../../src/strategies/k8s.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,MAAM,GAAG,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAEnD,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAC/C,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,MAAM,OAAO,WAAW;IACb,MAAM,GAAkB,KAAK,CAAC;IAEvC,KAAK,CAAC,KAAK,CAAC,MAAyB,EAAE,IAAsB;QAC3D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO;YACL,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC9B,MAAM,QAAQ,GAAG,GAAG,UAAU,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE;YAC3C,KAAK,EAAE,OAAO;YACd,cAAc,UAAU,EAAE;YAC1B,GAAG,UAAU,IAAI,QAAQ,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAuB;QACnC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC;QACjG,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAqB;QAClC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAqB;QACjC,8CAA8C;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { UpdateStrategy, InstallMethod, UpdateCheckResult, InstallationInfo, StagedUpdate } from '../types.js';
|
|
2
|
+
export declare class NpmStrategy implements UpdateStrategy {
|
|
3
|
+
readonly method: InstallMethod;
|
|
4
|
+
stage(target: UpdateCheckResult, info: InstallationInfo): Promise<StagedUpdate>;
|
|
5
|
+
apply(staged: StagedUpdate): Promise<void>;
|
|
6
|
+
restart(_info: InstallationInfo): Promise<void>;
|
|
7
|
+
rollback(staged: StagedUpdate): Promise<void>;
|
|
8
|
+
cleanup(staged: StagedUpdate): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../src/strategies/npm.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKpH,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAS;IAEjC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAqB/E,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAInD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as os from 'node:os';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import { getLogger } from '@auxiora/logger';
|
|
5
|
+
import { safeExecFile } from '../util/exec.js';
|
|
6
|
+
const logger = getLogger('updater:strategies:npm');
|
|
7
|
+
export class NpmStrategy {
|
|
8
|
+
method = 'npm';
|
|
9
|
+
async stage(target, info) {
|
|
10
|
+
const timestamp = Date.now();
|
|
11
|
+
const stagingDir = path.join(os.tmpdir(), `auxiora-update-npm-${timestamp}`);
|
|
12
|
+
fs.mkdirSync(stagingDir, { recursive: true });
|
|
13
|
+
logger.info('Staging npm package', { version: target.latestVersion });
|
|
14
|
+
const result = await safeExecFile('npm', ['pack', `auxiora@${target.latestVersion}`], { cwd: stagingDir });
|
|
15
|
+
if (result.status === 'error') {
|
|
16
|
+
throw new Error(`npm pack failed: ${result.stderr}`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
targetVersion: target.latestVersion,
|
|
20
|
+
previousVersion: info.currentVersion,
|
|
21
|
+
backupPath: path.join(stagingDir, 'backup'),
|
|
22
|
+
stagedPath: stagingDir,
|
|
23
|
+
method: this.method,
|
|
24
|
+
timestamp,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async apply(staged) {
|
|
28
|
+
logger.info('Installing npm package globally', { version: staged.targetVersion });
|
|
29
|
+
const result = await safeExecFile('npm', ['install', '-g', `auxiora@${staged.targetVersion}`]);
|
|
30
|
+
if (result.status === 'error') {
|
|
31
|
+
throw new Error(`npm install failed: ${result.stderr}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async restart(_info) {
|
|
35
|
+
logger.info('Restarting gateway process');
|
|
36
|
+
await safeExecFile('pkill', ['-f', 'auxiora-gateway']);
|
|
37
|
+
}
|
|
38
|
+
async rollback(staged) {
|
|
39
|
+
logger.info('Rolling back npm package', { version: staged.previousVersion });
|
|
40
|
+
const result = await safeExecFile('npm', ['install', '-g', `auxiora@${staged.previousVersion}`]);
|
|
41
|
+
if (result.status === 'error') {
|
|
42
|
+
throw new Error(`npm rollback failed: ${result.stderr}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async cleanup(staged) {
|
|
46
|
+
logger.info('Cleaning up npm staging directory');
|
|
47
|
+
await safeExecFile('rm', ['-rf', staged.stagedPath]);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/strategies/npm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UpdateStrategy, InstallMethod, UpdateCheckResult, InstallationInfo, StagedUpdate } from '../types.js';
|
|
2
|
+
export declare class TarballStrategy implements UpdateStrategy {
|
|
3
|
+
readonly method: InstallMethod;
|
|
4
|
+
stage(target: UpdateCheckResult, info: InstallationInfo): Promise<StagedUpdate>;
|
|
5
|
+
apply(staged: StagedUpdate): Promise<void>;
|
|
6
|
+
restart(_info: InstallationInfo): Promise<void>;
|
|
7
|
+
rollback(staged: StagedUpdate): Promise<void>;
|
|
8
|
+
cleanup(staged: StagedUpdate): Promise<void>;
|
|
9
|
+
private getInstallPath;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=tarball.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tarball.d.ts","sourceRoot":"","sources":["../../src/strategies/tarball.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMpH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAa;IAErC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuB/E,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1C,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD,OAAO,CAAC,cAAc;CAKvB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { getLogger } from '@auxiora/logger';
|
|
5
|
+
import { safeExecFile } from '../util/exec.js';
|
|
6
|
+
import { downloadFile } from '../util/download.js';
|
|
7
|
+
const logger = getLogger('updater:strategies:tarball');
|
|
8
|
+
export class TarballStrategy {
|
|
9
|
+
method = 'tarball';
|
|
10
|
+
async stage(target, info) {
|
|
11
|
+
const timestamp = Date.now();
|
|
12
|
+
const stagingDir = path.join(os.tmpdir(), `auxiora-update-${timestamp}`);
|
|
13
|
+
fs.mkdirSync(stagingDir, { recursive: true });
|
|
14
|
+
const asset = target.assets.find(a => a.name.endsWith('.tar.gz'));
|
|
15
|
+
if (!asset) {
|
|
16
|
+
throw new Error('No .tar.gz asset found in release');
|
|
17
|
+
}
|
|
18
|
+
const tarballPath = path.join(stagingDir, asset.name);
|
|
19
|
+
await downloadFile(asset.url, tarballPath);
|
|
20
|
+
return {
|
|
21
|
+
targetVersion: target.latestVersion,
|
|
22
|
+
previousVersion: info.currentVersion,
|
|
23
|
+
backupPath: path.join(stagingDir, 'backup'),
|
|
24
|
+
stagedPath: tarballPath,
|
|
25
|
+
method: this.method,
|
|
26
|
+
timestamp,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
async apply(staged) {
|
|
30
|
+
// Create backup of current installation
|
|
31
|
+
fs.mkdirSync(staged.backupPath, { recursive: true });
|
|
32
|
+
// The install path is derived from the staged path's parent
|
|
33
|
+
const installPath = this.getInstallPath();
|
|
34
|
+
// Move current install to backup
|
|
35
|
+
const result = await safeExecFile('cp', ['-a', installPath, path.join(staged.backupPath, 'app')]);
|
|
36
|
+
if (result.status === 'error') {
|
|
37
|
+
throw new Error(`Backup failed: ${result.stderr}`);
|
|
38
|
+
}
|
|
39
|
+
// Extract new version
|
|
40
|
+
const extractResult = await safeExecFile('tar', ['-xzf', staged.stagedPath, '-C', installPath, '--strip-components=1']);
|
|
41
|
+
if (extractResult.status === 'error') {
|
|
42
|
+
throw new Error(`Extract failed: ${extractResult.stderr}`);
|
|
43
|
+
}
|
|
44
|
+
logger.info('Applied tarball update', { version: staged.targetVersion });
|
|
45
|
+
}
|
|
46
|
+
async restart(_info) {
|
|
47
|
+
logger.info('Restarting gateway process');
|
|
48
|
+
await safeExecFile('pkill', ['-f', 'auxiora-gateway']);
|
|
49
|
+
}
|
|
50
|
+
async rollback(staged) {
|
|
51
|
+
const installPath = this.getInstallPath();
|
|
52
|
+
const backupAppPath = path.join(staged.backupPath, 'app');
|
|
53
|
+
if (fs.existsSync(backupAppPath)) {
|
|
54
|
+
// Remove failed installation
|
|
55
|
+
await safeExecFile('rm', ['-rf', installPath]);
|
|
56
|
+
// Restore backup
|
|
57
|
+
await safeExecFile('mv', [backupAppPath, installPath]);
|
|
58
|
+
logger.info('Rolled back to previous version', { version: staged.previousVersion });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async cleanup(staged) {
|
|
62
|
+
const stagingDir = path.dirname(staged.stagedPath);
|
|
63
|
+
await safeExecFile('rm', ['-rf', stagingDir]);
|
|
64
|
+
logger.info('Cleaned up staging directory');
|
|
65
|
+
}
|
|
66
|
+
getInstallPath() {
|
|
67
|
+
const home = process.env.HOME ?? '';
|
|
68
|
+
const localPath = path.join(home, '.local/lib/auxiora');
|
|
69
|
+
return fs.existsSync(localPath) ? localPath : '/opt/auxiora';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=tarball.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tarball.js","sourceRoot":"","sources":["../../src/strategies/tarball.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type InstallMethod = 'npm' | 'git' | 'docker' | 'apt' | 'brew' | 'tarball' | 'k8s' | 'unknown';
|
|
2
|
+
export type UpdateChannel = 'stable' | 'beta' | 'nightly';
|
|
3
|
+
export interface InstallationInfo {
|
|
4
|
+
method: InstallMethod;
|
|
5
|
+
currentVersion: string;
|
|
6
|
+
installPath: string;
|
|
7
|
+
canSelfUpdate: boolean;
|
|
8
|
+
requiresSudo: boolean;
|
|
9
|
+
containerRuntime?: 'docker' | 'podman';
|
|
10
|
+
}
|
|
11
|
+
export interface ReleaseAsset {
|
|
12
|
+
name: string;
|
|
13
|
+
url: string;
|
|
14
|
+
size: number;
|
|
15
|
+
contentType: string;
|
|
16
|
+
}
|
|
17
|
+
export interface UpdateCheckResult {
|
|
18
|
+
available: boolean;
|
|
19
|
+
currentVersion: string;
|
|
20
|
+
latestVersion: string;
|
|
21
|
+
channel: UpdateChannel;
|
|
22
|
+
releaseUrl: string;
|
|
23
|
+
releaseNotes: string;
|
|
24
|
+
publishedAt: number;
|
|
25
|
+
assets: ReleaseAsset[];
|
|
26
|
+
}
|
|
27
|
+
export interface StagedUpdate {
|
|
28
|
+
targetVersion: string;
|
|
29
|
+
previousVersion: string;
|
|
30
|
+
backupPath: string;
|
|
31
|
+
stagedPath: string;
|
|
32
|
+
method: InstallMethod;
|
|
33
|
+
timestamp: number;
|
|
34
|
+
}
|
|
35
|
+
export interface UpdateResult {
|
|
36
|
+
success: boolean;
|
|
37
|
+
previousVersion: string;
|
|
38
|
+
newVersion: string;
|
|
39
|
+
method: InstallMethod;
|
|
40
|
+
rolledBack: boolean;
|
|
41
|
+
error?: string;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
}
|
|
44
|
+
export interface UpdatePreferences {
|
|
45
|
+
channel: UpdateChannel;
|
|
46
|
+
disableUpdateCheck: boolean;
|
|
47
|
+
checkIntervalHours: number;
|
|
48
|
+
autoUpdate: boolean;
|
|
49
|
+
lastCheckTimestamp: number;
|
|
50
|
+
lastUpdateResult?: UpdateResult;
|
|
51
|
+
}
|
|
52
|
+
export declare const DEFAULT_UPDATE_PREFERENCES: UpdatePreferences;
|
|
53
|
+
export interface UpdateStrategy {
|
|
54
|
+
readonly method: InstallMethod;
|
|
55
|
+
stage(target: UpdateCheckResult, info: InstallationInfo): Promise<StagedUpdate>;
|
|
56
|
+
apply(staged: StagedUpdate): Promise<void>;
|
|
57
|
+
restart(info: InstallationInfo): Promise<void>;
|
|
58
|
+
rollback(staged: StagedUpdate): Promise<void>;
|
|
59
|
+
cleanup(staged: StagedUpdate): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAEtG,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,YAAY,CAAC;CACjC;AAED,eAAO,MAAM,0BAA0B,EAAE,iBAMxC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA2DA,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D,OAAO,EAAE,QAAQ;IACjB,kBAAkB,EAAE,KAAK;IACzB,kBAAkB,EAAE,EAAE;IACtB,UAAU,EAAE,KAAK;IACjB,kBAAkB,EAAE,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { UpdateResult, UpdateChannel, InstallMethod, UpdateStrategy } from './types.js';
|
|
2
|
+
import type { InstallationDetector } from './detector.js';
|
|
3
|
+
import type { VersionChecker } from './version-checker.js';
|
|
4
|
+
import type { HealthChecker } from './health-checker.js';
|
|
5
|
+
export interface UpdaterOptions {
|
|
6
|
+
detector: InstallationDetector;
|
|
7
|
+
versionChecker: VersionChecker;
|
|
8
|
+
healthChecker: HealthChecker;
|
|
9
|
+
strategies: Map<InstallMethod, UpdateStrategy>;
|
|
10
|
+
}
|
|
11
|
+
export declare class Updater {
|
|
12
|
+
private readonly detector;
|
|
13
|
+
private readonly versionChecker;
|
|
14
|
+
private readonly healthChecker;
|
|
15
|
+
private readonly strategies;
|
|
16
|
+
constructor(options: UpdaterOptions);
|
|
17
|
+
update(channel?: UpdateChannel): Promise<UpdateResult>;
|
|
18
|
+
/** Recover from a previously incomplete update (crash recovery). */
|
|
19
|
+
recoverIfNeeded(): Promise<UpdateResult | null>;
|
|
20
|
+
/** Manual rollback command. */
|
|
21
|
+
rollback(): Promise<void>;
|
|
22
|
+
private getDataDir;
|
|
23
|
+
private getStagedUpdatePath;
|
|
24
|
+
private persistStagedUpdate;
|
|
25
|
+
private loadStagedUpdate;
|
|
26
|
+
private removeStagedUpdate;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqD,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChJ,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;CAChD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;gBAEpD,OAAO,EAAE,cAAc;IAO7B,MAAM,CAAC,OAAO,GAAE,aAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IA+HtE,oEAAoE;IAC9D,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiCrD,+BAA+B;IACzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,kBAAkB;CAW3B"}
|