@openclaw-cloud/agent-controller 0.1.1 → 0.1.2
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/__tests__/backup.test.ts +1 -1
- package/dist/handlers/backup.js +11 -10
- package/dist/handlers/backup.js.map +1 -1
- package/package.json +1 -1
- package/src/handlers/backup.ts +11 -13
package/__tests__/backup.test.ts
CHANGED
|
@@ -92,7 +92,7 @@ describe('handleBackup', () => {
|
|
|
92
92
|
fakeExecSuccess();
|
|
93
93
|
mockStat.mockResolvedValue({ size: 512 });
|
|
94
94
|
mockReadFile.mockResolvedValue(Buffer.from('fake'));
|
|
95
|
-
mockFetch.mockResolvedValue({ ok: false, status: 500, statusText: 'Internal Server Error' });
|
|
95
|
+
mockFetch.mockResolvedValue({ ok: false, status: 500, statusText: 'Internal Server Error', text: () => Promise.resolve('') });
|
|
96
96
|
|
|
97
97
|
const cmd: AgentCommand = {
|
|
98
98
|
id: '4',
|
package/dist/handlers/backup.js
CHANGED
|
@@ -7,6 +7,7 @@ const TAR_TIMEOUT = 120_000;
|
|
|
7
7
|
const UPLOAD_TIMEOUT = 120_000;
|
|
8
8
|
export function handleBackup(command) {
|
|
9
9
|
const uploadUrl = command.payload.uploadUrl;
|
|
10
|
+
const token = command.payload.token;
|
|
10
11
|
if (!uploadUrl) {
|
|
11
12
|
return Promise.resolve({
|
|
12
13
|
id: command.id,
|
|
@@ -19,7 +20,7 @@ export function handleBackup(command) {
|
|
|
19
20
|
const filename = `backup-${timestamp}.tar.gz`;
|
|
20
21
|
const archivePath = path.join(BACKUP_DIR, filename);
|
|
21
22
|
return createArchive(archivePath)
|
|
22
|
-
.then(() => uploadArchive(archivePath, uploadUrl))
|
|
23
|
+
.then(() => uploadArchive(archivePath, uploadUrl, token))
|
|
23
24
|
.then(async (size) => {
|
|
24
25
|
await cleanup(archivePath);
|
|
25
26
|
return {
|
|
@@ -51,22 +52,22 @@ function createArchive(archivePath) {
|
|
|
51
52
|
});
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
|
-
async function uploadArchive(archivePath, uploadUrl) {
|
|
55
|
+
async function uploadArchive(archivePath, uploadUrl, token) {
|
|
55
56
|
const stat = await fs.stat(archivePath);
|
|
56
57
|
const fileBuffer = await fs.readFile(archivePath);
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const body = Buffer.concat([header, fileBuffer, footer]);
|
|
58
|
+
const headers = { 'Content-Type': 'application/gzip' };
|
|
59
|
+
if (token) {
|
|
60
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
61
|
+
}
|
|
62
62
|
const response = await fetch(uploadUrl, {
|
|
63
63
|
method: 'POST',
|
|
64
|
-
headers
|
|
65
|
-
body,
|
|
64
|
+
headers,
|
|
65
|
+
body: fileBuffer,
|
|
66
66
|
signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
|
|
67
67
|
});
|
|
68
68
|
if (!response.ok) {
|
|
69
|
-
|
|
69
|
+
const text = await response.text().catch(() => '');
|
|
70
|
+
throw new Error(`Upload failed: ${response.status} ${response.statusText} ${text}`);
|
|
70
71
|
}
|
|
71
72
|
return stat.size;
|
|
72
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/handlers/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,aAAa,GAAG,gCAAgC,CAAC;AACvD,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,UAAU,YAAY,CAAC,OAAqB;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAmB,CAAC;IACtD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,UAAU,SAAS,SAAS,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEpD,OAAO,aAAa,CAAC,WAAW,CAAC;SAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/handlers/backup.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/handlers/backup.ts
CHANGED
|
@@ -10,6 +10,7 @@ const UPLOAD_TIMEOUT = 120_000;
|
|
|
10
10
|
|
|
11
11
|
export function handleBackup(command: AgentCommand): Promise<AgentResponse> {
|
|
12
12
|
const uploadUrl = command.payload.uploadUrl as string;
|
|
13
|
+
const token = command.payload.token as string;
|
|
13
14
|
if (!uploadUrl) {
|
|
14
15
|
return Promise.resolve({
|
|
15
16
|
id: command.id,
|
|
@@ -24,7 +25,7 @@ export function handleBackup(command: AgentCommand): Promise<AgentResponse> {
|
|
|
24
25
|
const archivePath = path.join(BACKUP_DIR, filename);
|
|
25
26
|
|
|
26
27
|
return createArchive(archivePath)
|
|
27
|
-
.then(() => uploadArchive(archivePath, uploadUrl))
|
|
28
|
+
.then(() => uploadArchive(archivePath, uploadUrl, token))
|
|
28
29
|
.then(async (size) => {
|
|
29
30
|
await cleanup(archivePath);
|
|
30
31
|
return {
|
|
@@ -61,28 +62,25 @@ function createArchive(archivePath: string): Promise<void> {
|
|
|
61
62
|
});
|
|
62
63
|
}
|
|
63
64
|
|
|
64
|
-
async function uploadArchive(archivePath: string, uploadUrl: string): Promise<number> {
|
|
65
|
+
async function uploadArchive(archivePath: string, uploadUrl: string, token?: string): Promise<number> {
|
|
65
66
|
const stat = await fs.stat(archivePath);
|
|
66
67
|
const fileBuffer = await fs.readFile(archivePath);
|
|
67
68
|
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${filename}"\r\nContent-Type: application/gzip\r\n\r\n`,
|
|
73
|
-
);
|
|
74
|
-
const footer = Buffer.from(`\r\n--${boundary}--\r\n`);
|
|
75
|
-
const body = Buffer.concat([header, fileBuffer, footer]);
|
|
69
|
+
const headers: Record<string, string> = { 'Content-Type': 'application/gzip' };
|
|
70
|
+
if (token) {
|
|
71
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
72
|
+
}
|
|
76
73
|
|
|
77
74
|
const response = await fetch(uploadUrl, {
|
|
78
75
|
method: 'POST',
|
|
79
|
-
headers
|
|
80
|
-
body,
|
|
76
|
+
headers,
|
|
77
|
+
body: fileBuffer,
|
|
81
78
|
signal: AbortSignal.timeout(UPLOAD_TIMEOUT),
|
|
82
79
|
});
|
|
83
80
|
|
|
84
81
|
if (!response.ok) {
|
|
85
|
-
|
|
82
|
+
const text = await response.text().catch(() => '');
|
|
83
|
+
throw new Error(`Upload failed: ${response.status} ${response.statusText} ${text}`);
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
return stat.size;
|