Skip to content

Commit cd0ba41

Browse files
committed
Add iterator support as Replies
1 parent 8f2f516 commit cd0ba41

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

packages/react-client/src/ReactFlightReplyClient.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
REACT_ELEMENT_TYPE,
1616
REACT_LAZY_TYPE,
1717
REACT_PROVIDER_TYPE,
18+
getIteratorFn,
1819
} from 'shared/ReactSymbols';
1920

2021
import {
@@ -159,6 +160,12 @@ export function processReply(
159160
);
160161
return serializePromiseID(promiseId);
161162
}
163+
if (!isArray(value)) {
164+
const iteratorFn = getIteratorFn(value);
165+
if (iteratorFn) {
166+
return Array.from((value: any));
167+
}
168+
}
162169

163170
if (__DEV__) {
164171
if (value !== null && !isArray(value)) {

packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMReply-test.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@ global.TextDecoder = require('util').TextDecoder;
1717

1818
// let serverExports;
1919
let webpackServerMap;
20-
let act;
2120
let ReactServerDOMServer;
2221
let ReactServerDOMClient;
2322

2423
describe('ReactFlightDOMReply', () => {
2524
beforeEach(() => {
2625
jest.resetModules();
27-
act = require('internal-test-utils').act;
2826
const WebpackMock = require('./utils/WebpackMock');
2927
// serverExports = WebpackMock.serverExports;
3028
webpackServerMap = WebpackMock.webpackServerMap;
@@ -57,4 +55,23 @@ describe('ReactFlightDOMReply', () => {
5755
expect('3' in object.array).toBe(false);
5856
expect('prop' in object).toBe(false);
5957
});
58+
59+
it('can pass an iterable as a reply', async () => {
60+
const body = await ReactServerDOMClient.encodeReply({
61+
[Symbol.iterator]: function* () {
62+
yield 'A';
63+
yield 'B';
64+
yield 'C';
65+
},
66+
});
67+
const iterable = await ReactServerDOMServer.decodeReply(
68+
body,
69+
webpackServerMap,
70+
);
71+
const items = [];
72+
for (const item of iterable) {
73+
items.push(item);
74+
}
75+
expect(items).toEqual(['A', 'B', 'C']);
76+
});
6077
});

0 commit comments

Comments
 (0)