mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 07:14:47 -05:00
feat: support AbortSignal in writeFile (#11568)
This commit is contained in:
parent
466d3df9d1
commit
2b53602d3c
3 changed files with 51 additions and 1 deletions
6
cli/dts/lib.deno.ns.d.ts
vendored
6
cli/dts/lib.deno.ns.d.ts
vendored
|
@ -1714,6 +1714,12 @@ declare namespace Deno {
|
|||
create?: boolean;
|
||||
/** Permissions always applied to file. */
|
||||
mode?: number;
|
||||
/**
|
||||
* An abort signal to allow cancellation of the file write operation.
|
||||
* If the signal becomes aborted the writeFile operation will be stopped
|
||||
* and the promise returned will be rejected with an AbortError.
|
||||
*/
|
||||
signal?: AbortSignal;
|
||||
}
|
||||
|
||||
/** Synchronously write `data` to the given `path`, by default creating a new
|
||||
|
|
|
@ -239,3 +239,39 @@ unitTest(
|
|||
assertEquals("Hello", actual);
|
||||
},
|
||||
);
|
||||
|
||||
unitTest(
|
||||
{ perms: { read: true, write: true } },
|
||||
async function writeFileAbortSignal(): Promise<void> {
|
||||
const ac = new AbortController();
|
||||
const enc = new TextEncoder();
|
||||
const data = enc.encode("Hello");
|
||||
const filename = Deno.makeTempDirSync() + "/test.txt";
|
||||
queueMicrotask(() => ac.abort());
|
||||
try {
|
||||
await Deno.writeFile(filename, data, { signal: ac.signal });
|
||||
} catch (e) {
|
||||
assertEquals(e.name, "AbortError");
|
||||
}
|
||||
const stat = Deno.statSync(filename);
|
||||
assertEquals(stat.size, 0);
|
||||
},
|
||||
);
|
||||
|
||||
unitTest(
|
||||
{ perms: { read: true, write: true } },
|
||||
async function writeFileAbortSignalPreAborted(): Promise<void> {
|
||||
const ac = new AbortController();
|
||||
ac.abort();
|
||||
const enc = new TextEncoder();
|
||||
const data = enc.encode("Hello");
|
||||
const filename = Deno.makeTempDirSync() + "/test.txt";
|
||||
try {
|
||||
await Deno.writeFile(filename, data, { signal: ac.signal });
|
||||
} catch (e) {
|
||||
assertEquals(e.name, "AbortError");
|
||||
}
|
||||
const stat = Deno.statSync(filename);
|
||||
assertEquals(stat.size, 0);
|
||||
},
|
||||
);
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
data,
|
||||
options = {},
|
||||
) {
|
||||
if (options?.signal?.aborted) {
|
||||
throw new DOMException("The write operation was aborted.", "AbortError");
|
||||
}
|
||||
if (options.create !== undefined) {
|
||||
const create = !!options.create;
|
||||
if (!create) {
|
||||
|
@ -68,12 +71,17 @@
|
|||
await chmod(path, options.mode);
|
||||
}
|
||||
|
||||
const signal = options?.signal ?? null;
|
||||
let nwritten = 0;
|
||||
while (nwritten < data.length) {
|
||||
while (!signal?.aborted && nwritten < data.length) {
|
||||
nwritten += await file.write(TypedArrayPrototypeSubarray(data, nwritten));
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
if (signal?.aborted) {
|
||||
throw new DOMException("The write operation was aborted.", "AbortError");
|
||||
}
|
||||
}
|
||||
|
||||
function writeTextFileSync(
|
||||
|
|
Loading…
Reference in a new issue