| 2759 | } |
| 2760 | |
| 2761 | function writeAll(fd, isUserFd, buffer, offset, length, signal, flush, callback) { |
| 2762 | if (signal?.aborted) { |
| 2763 | const abortError = new AbortError(undefined, { cause: signal.reason }); |
| 2764 | if (isUserFd) { |
| 2765 | callback(abortError); |
| 2766 | } else { |
| 2767 | fs.close(fd, (err) => { |
| 2768 | callback(aggregateTwoErrors(err, abortError)); |
| 2769 | }); |
| 2770 | } |
| 2771 | return; |
| 2772 | } |
| 2773 | // write(fd, buffer, offset, length, position, callback) |
| 2774 | fs.write(fd, buffer, offset, length, null, (writeErr, written) => { |
| 2775 | if (writeErr) { |
| 2776 | if (isUserFd) { |
| 2777 | callback(writeErr); |
| 2778 | } else { |
| 2779 | fs.close(fd, (err) => { |
| 2780 | callback(aggregateTwoErrors(err, writeErr)); |
| 2781 | }); |
| 2782 | } |
| 2783 | } else if (written === length) { |
| 2784 | if (!flush) { |
| 2785 | if (isUserFd) { |
| 2786 | callback(null); |
| 2787 | } else { |
| 2788 | fs.close(fd, callback); |
| 2789 | } |
| 2790 | } else { |
| 2791 | fs.fsync(fd, (syncErr) => { |
| 2792 | if (syncErr) { |
| 2793 | if (isUserFd) { |
| 2794 | callback(syncErr); |
| 2795 | } else { |
| 2796 | fs.close(fd, (err) => { |
| 2797 | callback(aggregateTwoErrors(err, syncErr)); |
| 2798 | }); |
| 2799 | } |
| 2800 | } else if (isUserFd) { |
| 2801 | callback(null); |
| 2802 | } else { |
| 2803 | fs.close(fd, callback); |
| 2804 | } |
| 2805 | }); |
| 2806 | } |
| 2807 | } else { |
| 2808 | offset += written; |
| 2809 | length -= written; |
| 2810 | writeAll(fd, isUserFd, buffer, offset, length, signal, flush, callback); |
| 2811 | } |
| 2812 | }); |
| 2813 | } |
| 2814 | |
| 2815 | /** |
| 2816 | * Asynchronously writes data to the file. |