mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 15:24:46 -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;
|
create?: boolean;
|
||||||
/** Permissions always applied to file. */
|
/** Permissions always applied to file. */
|
||||||
mode?: number;
|
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
|
/** Synchronously write `data` to the given `path`, by default creating a new
|
||||||
|
|
|
@ -239,3 +239,39 @@ unitTest(
|
||||||
assertEquals("Hello", actual);
|
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,
|
data,
|
||||||
options = {},
|
options = {},
|
||||||
) {
|
) {
|
||||||
|
if (options?.signal?.aborted) {
|
||||||
|
throw new DOMException("The write operation was aborted.", "AbortError");
|
||||||
|
}
|
||||||
if (options.create !== undefined) {
|
if (options.create !== undefined) {
|
||||||
const create = !!options.create;
|
const create = !!options.create;
|
||||||
if (!create) {
|
if (!create) {
|
||||||
|
@ -68,12 +71,17 @@
|
||||||
await chmod(path, options.mode);
|
await chmod(path, options.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const signal = options?.signal ?? null;
|
||||||
let nwritten = 0;
|
let nwritten = 0;
|
||||||
while (nwritten < data.length) {
|
while (!signal?.aborted && nwritten < data.length) {
|
||||||
nwritten += await file.write(TypedArrayPrototypeSubarray(data, nwritten));
|
nwritten += await file.write(TypedArrayPrototypeSubarray(data, nwritten));
|
||||||
}
|
}
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
if (signal?.aborted) {
|
||||||
|
throw new DOMException("The write operation was aborted.", "AbortError");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function writeTextFileSync(
|
function writeTextFileSync(
|
||||||
|
|
Loading…
Reference in a new issue