mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-30 11:21:04 +00:00
fix: retry media materialization after cleanup race
This commit is contained in:
@@ -303,6 +303,37 @@ describe("media store", () => {
|
||||
});
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "retries buffer materialization when cleanup prunes the target dir",
|
||||
run: async () => {
|
||||
await withTempStore(async (store) => {
|
||||
const originalMkdir = fs.mkdir.bind(fs);
|
||||
let pruned = false;
|
||||
vi.spyOn(fs, "mkdir").mockImplementation(async (...args) => {
|
||||
const result = await originalMkdir(...args);
|
||||
const target = args[0];
|
||||
if (
|
||||
!pruned &&
|
||||
typeof target === "string" &&
|
||||
path.normalize(target).endsWith(`${path.sep}media${path.sep}materialization-race`)
|
||||
) {
|
||||
pruned = true;
|
||||
await fs.rm(target, { force: true, recursive: true });
|
||||
}
|
||||
return result;
|
||||
});
|
||||
|
||||
const saved = await store.saveMediaBuffer(
|
||||
Buffer.from("race bytes"),
|
||||
"text/plain",
|
||||
"materialization-race",
|
||||
);
|
||||
|
||||
expect(pruned).toBe(true);
|
||||
await expect(fs.readFile(saved.path, "utf8")).resolves.toBe("race bytes");
|
||||
});
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "rejects traversal media subdirs before saving buffers",
|
||||
run: async () => {
|
||||
|
||||
@@ -661,18 +661,20 @@ async function materializeMediaBufferPath(params: {
|
||||
buffer: Buffer;
|
||||
}): Promise<string> {
|
||||
const dir = resolveMediaScopedDir(params.subdir, "materializeMediaBufferPath");
|
||||
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
||||
const written = await writeSiblingTempFile({
|
||||
dir,
|
||||
mode: MEDIA_FILE_MODE,
|
||||
tempPrefix: `.${params.id}`,
|
||||
writeTemp: async (tempPath) => {
|
||||
await fs.writeFile(tempPath, params.buffer, { mode: MEDIA_FILE_MODE });
|
||||
return undefined;
|
||||
},
|
||||
resolveFinalPath: () => path.join(dir, params.id),
|
||||
return await retryAfterRecreatingDir(dir, async () => {
|
||||
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
||||
const written = await writeSiblingTempFile({
|
||||
dir,
|
||||
mode: MEDIA_FILE_MODE,
|
||||
tempPrefix: `.${params.id}`,
|
||||
writeTemp: async (tempPath) => {
|
||||
await fs.writeFile(tempPath, params.buffer, { mode: MEDIA_FILE_MODE });
|
||||
return undefined;
|
||||
},
|
||||
resolveFinalPath: () => path.join(dir, params.id),
|
||||
});
|
||||
return written.filePath;
|
||||
});
|
||||
return written.filePath;
|
||||
}
|
||||
|
||||
async function writeMediaStreamToFile(params: {
|
||||
|
||||
Reference in New Issue
Block a user