Skip to content

Commit 93af0d1

Browse files
committed
Fix race condition in mod asset extraction
1 parent 93b03a2 commit 93af0d1

1 file changed

Lines changed: 34 additions & 31 deletions

File tree

lib/modloader/ModLoader.ts

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -333,42 +333,45 @@ export class ModLoader {
333333
openZip(modFile, { lazyEntries: true, autoClose: true }, (e, f) => {
334334
if (e) {
335335
reject(e);
336+
} else {
337+
resolve(f);
336338
}
337-
resolve(f);
338339
});
339340
});
340341

341-
zipFile.readEntry();
342-
zipFile.on('error', e => process.stdout.write(String(e)));
343-
zipFile.on('entry', (entry: Entry) => {
344-
if (entry.fileName.endsWith('/')) {
345-
// Directory
346-
zipFile.readEntry();
347-
} else if (entry.fileName.startsWith('assets/') || entry.fileName.startsWith('data/')) {
348-
// File
349-
const prefix = entry.fileName.startsWith('assets/') ? 7 : 5;
350-
const targetFile = join(
351-
this.path,
352-
'mod_assets',
353-
entry.fileName.slice(prefix, entry.fileName.length),
354-
);
355-
const targetDir = dirname(targetFile);
356-
void this.ensureDirExists(targetDir).then(() => {
357-
zipFile.openReadStream(entry, (e, readStream) => {
358-
if (e) {
359-
throw e;
360-
}
361-
readStream.pipe(createWriteStream(targetFile));
362-
readStream.on('end', () => zipFile.readEntry());
363-
});
364-
}).catch((e: unknown) => {
365-
throw e;
366-
});
367-
} else {
368-
zipFile.readEntry();
369-
}
342+
await new Promise<void>((resolve, reject) => {
343+
zipFile.on('error', reject);
344+
zipFile.on('end', resolve);
345+
zipFile.on('entry', (entry: Entry) => {
346+
if (entry.fileName.endsWith('/')) {
347+
// Directory
348+
zipFile.readEntry();
349+
} else if (entry.fileName.startsWith('assets/') || entry.fileName.startsWith('data/')) {
350+
// File
351+
const prefix = entry.fileName.startsWith('assets/') ? 7 : 5;
352+
const targetFile = join(
353+
this.path,
354+
'mod_assets',
355+
entry.fileName.slice(prefix, entry.fileName.length),
356+
);
357+
const targetDir = dirname(targetFile);
358+
this.ensureDirExists(targetDir).then(() => {
359+
zipFile.openReadStream(entry, (e, readStream) => {
360+
if (e) {
361+
reject(e);
362+
return;
363+
}
364+
readStream.on('error', reject);
365+
readStream.pipe(createWriteStream(targetFile));
366+
readStream.on('end', () => zipFile.readEntry());
367+
});
368+
}).catch(reject);
369+
} else {
370+
zipFile.readEntry();
371+
}
372+
});
373+
zipFile.readEntry();
370374
});
371-
await new Promise(resolve => zipFile.on('end', resolve));
372375
}
373376

374377
/**

0 commit comments

Comments
 (0)