@@ -865,52 +865,45 @@ function needFinish(state) { |
865 | 865 | )) === (kEnding | kConstructed) && state.length === 0); |
866 | 866 | } |
867 | 867 |
|
868 | | -function callFinal(stream, state) { |
869 | | - let called = false; |
870 | | - |
871 | | - function onFinish(err) { |
872 | | - if (called) { |
873 | | - errorOrDestroy(stream, err ?? ERR_MULTIPLE_CALLBACK()); |
874 | | - return; |
875 | | - } |
876 | | - called = true; |
877 | | - |
878 | | - state.pendingcb--; |
879 | | - if (err) { |
880 | | - callFinishedCallbacks(state, err); |
881 | | - errorOrDestroy(stream, err, (state[kState] & kSync) !== 0); |
882 | | - } else if (needFinish(state)) { |
883 | | - state[kState] |= kPrefinished; |
884 | | - stream.emit('prefinish'); |
885 | | - // Backwards compat. Don't check state.sync here. |
886 | | - // Some streams assume 'finish' will be emitted |
887 | | - // asynchronously relative to _final callback. |
888 | | - state.pendingcb++; |
889 | | - process.nextTick(finish, stream, state); |
890 | | - } |
| 868 | +function onFinish(stream, state, err) { |
| 869 | + if ((state[kState] & kPrefinished) !== 0) { |
| 870 | + errorOrDestroy(stream, err ?? ERR_MULTIPLE_CALLBACK()); |
| 871 | + return; |
891 | 872 | } |
892 | | - |
893 | | - state[kState] |= kSync; |
894 | | - state.pendingcb++; |
895 | | - |
896 | | - try { |
897 | | - stream._final(onFinish); |
898 | | - } catch (err) { |
899 | | - onFinish(err); |
| 873 | + state.pendingcb--; |
| 874 | + if (err) { |
| 875 | + callFinishedCallbacks(state, err); |
| 876 | + errorOrDestroy(stream, err, (state[kState] & kSync) !== 0); |
| 877 | + } else if (needFinish(state)) { |
| 878 | + state[kState] |= kPrefinished; |
| 879 | + stream.emit('prefinish'); |
| 880 | + // Backwards compat. Don't check state.sync here. |
| 881 | + // Some streams assume 'finish' will be emitted |
| 882 | + // asynchronously relative to _final callback. |
| 883 | + state.pendingcb++; |
| 884 | + process.nextTick(finish, stream, state); |
900 | 885 | } |
901 | | - |
902 | | - state[kState] &= ~kSync; |
903 | 886 | } |
904 | 887 |
|
905 | 888 | function prefinish(stream, state) { |
906 | | - if ((state[kState] & (kPrefinished | kFinalCalled)) === 0) { |
907 | | - if (typeof stream._final === 'function' && (state[kState] & kDestroyed) === 0) { |
908 | | - state[kState] |= kFinalCalled; |
909 | | - callFinal(stream, state); |
910 | | - } else { |
911 | | - state[kState] |= kPrefinished; |
912 | | - stream.emit('prefinish'); |
| 889 | + if ((state[kState] & (kPrefinished | kFinalCalled)) !== 0) { |
| 890 | + return; |
| 891 | + } |
| 892 | + |
| 893 | + if (typeof stream._final === 'function' && (state[kState] & kDestroyed) === 0) { |
| 894 | + state[kState] |= kFinalCalled | kSync; |
| 895 | + state.pendingcb++; |
| 896 | + |
| 897 | + try { |
| 898 | + stream._final((err) => onFinish(stream, state, err)); |
| 899 | + } catch (err) { |
| 900 | + onFinish(stream, state, err); |
913 | 901 | } |
| 902 | + |
| 903 | + state[kState] &= ~kSync; |
| 904 | + } else { |
| 905 | + state[kState] |= kFinalCalled | kPrefinished; |
| 906 | + stream.emit('prefinish'); |
914 | 907 | } |
915 | 908 | } |
916 | 909 |
|
|