Skip to content
This repository has been archived by the owner on Jul 15, 2020. It is now read-only.

Commit

Permalink
Fix regression: Errors not emitted in streams
Browse files Browse the repository at this point in the history
Regression introduced in facebook#14182 resulted in errors no longer being emitted on streams, breaking many consumers.

Co-authored-by: Elliot Jalgard <elliot.j@live.se>
  • Loading branch information
voxpelli and digli committed Nov 23, 2018
1 parent 7475120 commit 28ba994
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
46 changes: 46 additions & 0 deletions packages/react-dom/src/__tests__/ReactServerRendering-test.js
Expand Up @@ -556,6 +556,52 @@ describe('ReactDOMServer', () => {
});
});

describe('renderToNodeStream', () => {
it('should generate simple markup', () => {
const SuccessfulElement = React.createElement(() => <img />);
const response = ReactDOMServer.renderToNodeStream(SuccessfulElement);
expect(response.read().toString()).toMatch(
new RegExp('<img data-reactroot=""' + '/>'),
);
});

it('should handle errors correctly', () => {
const FailingElement = React.createElement(() => {
throw new Error('An Error');
});
const response = ReactDOMServer.renderToNodeStream(FailingElement);
return new Promise(resolve => {
response.once('error', () => {
resolve();
});
expect(response.read()).toBeNull();
});
});
});

describe('renderToStaticNodeStream', () => {
it('should generate simple markup', () => {
const SuccessfulElement = React.createElement(() => <img />);
const response = ReactDOMServer.renderToStaticNodeStream(
SuccessfulElement,
);
expect(response.read().toString()).toMatch(new RegExp('<img' + '/>'));
});

it('should handle errors correctly', () => {
const FailingElement = React.createElement(() => {
throw new Error('An Error');
});
const response = ReactDOMServer.renderToStaticNodeStream(FailingElement);
return new Promise(resolve => {
response.once('error', () => {
resolve();
});
expect(response.read()).toBeNull();
});
});
});

it('warns with a no-op when an async setState is triggered', () => {
class Foo extends React.Component {
UNSAFE_componentWillMount() {
Expand Down
3 changes: 2 additions & 1 deletion packages/react-dom/src/server/ReactDOMNodeStreamRenderer.js
Expand Up @@ -18,8 +18,9 @@ class ReactMarkupReadableStream extends Readable {
this.partialRenderer = new ReactPartialRenderer(element, makeStaticMarkup);
}

_destroy() {
_destroy(err, callback) {
this.partialRenderer.destroy();
callback(err);
}

_read(size) {
Expand Down

0 comments on commit 28ba994

Please sign in to comment.