diff --git a/benchmark/ffi/add-f64.js b/benchmark/ffi/add-f64.js index fab6457e33a09d..f4e1dbac4ac3d4 100644 --- a/benchmark/ffi/add-f64.js +++ b/benchmark/ffi/add-f64.js @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, { ensureFixtureLibrary(); const { lib, functions } = ffi.dlopen(libraryPath, { - add_f64: { result: 'f64', parameters: ['f64', 'f64'] }, + add_f64: { return: 'f64', arguments: ['f64', 'f64'] }, }); const add = functions.add_f64; diff --git a/benchmark/ffi/add-i32.js b/benchmark/ffi/add-i32.js index bc8e2c4138080e..9a77a6f998f79d 100644 --- a/benchmark/ffi/add-i32.js +++ b/benchmark/ffi/add-i32.js @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, { ensureFixtureLibrary(); const { lib, functions } = ffi.dlopen(libraryPath, { - add_i32: { result: 'i32', parameters: ['i32', 'i32'] }, + add_i32: { return: 'i32', arguments: ['i32', 'i32'] }, }); const add = functions.add_i32; diff --git a/benchmark/ffi/getpid.js b/benchmark/ffi/getpid.js index c2e7d4ed89c34e..8008f407305e49 100644 --- a/benchmark/ffi/getpid.js +++ b/benchmark/ffi/getpid.js @@ -10,7 +10,7 @@ const bench = common.createBenchmark(main, { }); const { lib, functions } = ffi.dlopen(null, { - uv_os_getpid: { result: 'i32', parameters: [] }, + uv_os_getpid: { return: 'i32', arguments: [] }, }); const getpid = functions.uv_os_getpid; diff --git a/benchmark/ffi/many-args.js b/benchmark/ffi/many-args.js index bacd873df52d1b..bc269ace0c3e26 100644 --- a/benchmark/ffi/many-args.js +++ b/benchmark/ffi/many-args.js @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, { ensureFixtureLibrary(); const { lib, functions } = ffi.dlopen(libraryPath, { - sum_6_i32: { result: 'i32', parameters: ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'] }, + sum_6_i32: { return: 'i32', arguments: ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'] }, }); const fn = functions.sum_6_i32; diff --git a/benchmark/ffi/pointer-bigint.js b/benchmark/ffi/pointer-bigint.js index c44ef7f1656a0c..9ea01d28490e00 100644 --- a/benchmark/ffi/pointer-bigint.js +++ b/benchmark/ffi/pointer-bigint.js @@ -13,7 +13,7 @@ const bench = common.createBenchmark(main, { ensureFixtureLibrary(); const { lib, functions } = ffi.dlopen(libraryPath, { - pointer_to_usize: { result: 'u64', parameters: ['pointer'] }, + pointer_to_usize: { return: 'u64', arguments: ['pointer'] }, }); const fn = functions.pointer_to_usize; diff --git a/benchmark/ffi/sum-buffer.js b/benchmark/ffi/sum-buffer.js index 3117f61aaedabf..60e25a85418565 100644 --- a/benchmark/ffi/sum-buffer.js +++ b/benchmark/ffi/sum-buffer.js @@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, { ensureFixtureLibrary(); const { lib, functions } = ffi.dlopen(libraryPath, { - sum_buffer: { result: 'u64', parameters: ['pointer', 'u64'] }, + sum_buffer: { return: 'u64', arguments: ['pointer', 'u64'] }, }); function main({ n, size }) { diff --git a/lib/internal/streams/iter/push.js b/lib/internal/streams/iter/push.js index f00ad396e1f2ca..0326cbdd6c3cfb 100644 --- a/lib/internal/streams/iter/push.js +++ b/lib/internal/streams/iter/push.js @@ -12,6 +12,7 @@ const { PromiseReject, PromiseResolve, PromiseWithResolvers, + Symbol, SymbolAsyncDispose, SymbolAsyncIterator, SymbolDispose, @@ -55,6 +56,8 @@ const { RingBuffer, } = require('internal/streams/iter/ringbuffer'); +const kNoFailReason = Symbol('kNoFailReason'); + // ============================================================================= // PushQueue - Internal Queue with Chunk-Based Backpressure // ============================================================================= @@ -317,14 +320,16 @@ class PushQueue { * No-op if errored or closed (fully drained). * If closing (draining), short-circuits the drain. */ - fail(reason) { + fail(reason = kNoFailReason) { if (this.#writerState === 'errored' || this.#writerState === 'closed') { return; } const wasClosing = this.#writerState === 'closing'; this.#writerState = 'errored'; - this.#error = reason ?? new ERR_INVALID_STATE('Failed'); + this.#error = reason === kNoFailReason ? + new ERR_INVALID_STATE('Failed') : + reason; this.#cleanup(); this.#rejectPendingReads(this.#error); this.#rejectPendingDrains(this.#error); @@ -413,7 +418,7 @@ class PushQueue { return { __proto__: null, done: true, value: undefined }; } - if (this.#writerState === 'errored' && this.#error) { + if (this.#writerState === 'errored') { throw this.#error; } @@ -488,7 +493,7 @@ class PushQueue { } else if (this.#writerState === 'closed') { const pending = this.#pendingReads.shift(); pending.resolve({ __proto__: null, done: true, value: undefined }); - } else if (this.#writerState === 'errored' && this.#error) { + } else if (this.#writerState === 'errored') { const pending = this.#pendingReads.shift(); pending.reject(this.#error); } else if (this.#consumerState === 'returned') { @@ -668,7 +673,7 @@ class PushWriter { } fail(reason) { - this.#queue.fail(reason); + this.#queue.fail(arguments.length === 0 ? kNoFailReason : reason); } [SymbolAsyncDispose]() { diff --git a/test/parallel/test-stream-iter-push-writer.js b/test/parallel/test-stream-iter-push-writer.js index f07ccb575ec570..e617a8a5309dae 100644 --- a/test/parallel/test-stream-iter-push-writer.js +++ b/test/parallel/test-stream-iter-push-writer.js @@ -451,6 +451,39 @@ async function testEndRejectsWhenErrored() { } } +async function testFailRejectsFutureReadWithFalsyReason() { + for (const reason of [0, null]) { + const { writer, readable } = push(); + + writer.fail(reason); + + const iter = readable[Symbol.asyncIterator](); + await iter.next().then( + common.mustNotCall(), + common.mustCall((rejection) => { + assert.strictEqual(rejection, reason); + }), + ); + } +} + +async function testFailRejectsPendingReadWithFalsyReason() { + const { writer, readable } = push(); + + const iter = readable[Symbol.asyncIterator](); + const readPromise = iter.next(); + + await new Promise(setImmediate); + + writer.fail(false); + await readPromise.then( + common.mustNotCall(), + common.mustCall((reason) => { + assert.strictEqual(reason, false); + }), + ); +} + Promise.all([ testOndrain(), testOndrainNonDrainable(), @@ -473,6 +506,8 @@ Promise.all([ testConsumerThrowRejectsWrites(), testEndResolvesPendingRead(), testFailRejectsPendingRead(), + testFailRejectsFutureReadWithFalsyReason(), + testFailRejectsPendingReadWithFalsyReason(), testConsumerReturnResolvesPendingRead(), testConsumerThrowRejectsPendingRead(), testEndRejectsPendingWrites(), diff --git a/tools/nix/pkgs.nix b/tools/nix/pkgs.nix index 512a184420a267..cc199923a01150 100644 --- a/tools/nix/pkgs.nix +++ b/tools/nix/pkgs.nix @@ -1,10 +1,10 @@ arg: let repo = "https://github.com/NixOS/nixpkgs"; - rev = "3d8f0f3f72a6cd4d93d0ad13203f2ea1cb7e1456"; + rev = "e9a7635a57597d9754eccebdfc7045e6c8600e6b"; nixpkgs = import (builtins.fetchTarball { url = "${repo}/archive/${rev}.tar.gz"; - sha256 = "1vq4c8nfn16zcz9sa3rjy4bhabdmnwy4pq3pdj20gzmgd3iwbrxb"; + sha256 = "1515byrd40ylb3z258g4f9mmhn1v608dvmxi8acci8vz4zzr99dv"; }) arg; in nixpkgs