Skip to content

Commit

Permalink
feat(async-ssr-manager): rename rerenderAfter to scheduleRerender
Browse files Browse the repository at this point in the history
  • Loading branch information
unstubbable committed Feb 5, 2019
1 parent 0d6abce commit e5ddae9
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 31 deletions.
14 changes: 7 additions & 7 deletions docs/guides/server-side-rendering.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ in its Feature App definition.
> Service only on the server. The Feature App can determine from its presence
> whether it is currently rendered on the server or on the client.
On the server, the Feature App can use the `rerenderAfter` method to tell the
On the server, the Feature App can use the `scheduleRerender` method to tell the
Async SSR Manager that another render pass is required after the data has been
loaded:

Expand Down Expand Up @@ -188,7 +188,7 @@ const myFeatureAppDefinition = {
const asyncSsrManager = env.featureServices['s2:async-ssr-manager'];

if (asyncSsrManager) {
asyncSsrManager.rerenderAfter(dataPromise);
asyncSsrManager.scheduleRerender(dataPromise);
}

return {
Expand All @@ -200,8 +200,8 @@ const myFeatureAppDefinition = {
};
```

> The `rerenderAfter` method must be called synchronously during a render pass,
> since the Async SSR Manager synchronously checks after every render pass
> The `scheduleRerender` method must be called synchronously during a render
> pass, since the Async SSR Manager synchronously checks after every render pass
> whether there are rerender promises it needs to await, and then do another
> render pass.
Expand All @@ -214,8 +214,8 @@ const myFeatureAppDefinition = {
### As a Feature Service

If a Feature Service consumer changes shared state of a Feature Service during a
render pass on the server, the Feature Service should trigger a rerender to give
its consumers a chance to update themselves based on the state change:
render pass on the server, the Feature Service should schedule a rerender to
give its consumers a chance to update themselves based on the state change:

```js
const myFeatureServiceDefinition = {
Expand All @@ -239,7 +239,7 @@ const myFeatureServiceDefinition = {
count = newCount;

if (asyncSsrManager) {
asyncSsrManager.rerenderAfter(Promise.resolve());
asyncSsrManager.scheduleRerender(Promise.resolve());
}
},

Expand Down
8 changes: 5 additions & 3 deletions packages/async-ssr-manager/src/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ describe('asyncSsrManagerDefinition', () => {
const render = () => {
if (firstRender) {
firstRender = false;
asyncSsrManager.rerenderAfter(Promise.resolve());
asyncSsrManager.scheduleRerender(Promise.resolve());
}
};

Expand Down Expand Up @@ -114,7 +114,7 @@ describe('asyncSsrManagerDefinition', () => {
});
});

describe('with an integrator, and two consumers that both trigger a rerender in the first render pass', () => {
describe('with an integrator, and two consumers that both schedule a rerender in the first render pass', () => {
it('resolves with an html string after the second render pass', async () => {
const asyncSsrManagerIntegrator = asyncSsrManagerBinder(
'test:integrator'
Expand Down Expand Up @@ -163,7 +163,9 @@ describe('asyncSsrManagerDefinition', () => {
it('rejects with an error after the configured timeout', async () => {
const asyncSsrManager = asyncSsrManagerBinder('test').featureService;
const mockRender = jest.fn(() => {
asyncSsrManager.rerenderAfter(new Promise<void>(() => undefined));
asyncSsrManager.scheduleRerender(
new Promise<void>(() => undefined)
);

return 'testHtml';
});
Expand Down
4 changes: 2 additions & 2 deletions packages/async-ssr-manager/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export interface AsyncSsrManagerConfig {
export interface AsyncSsrManagerV0 {
/**
* This method is intended for the integrator. It calls the given render
* function at least once. When {@link rerenderAfter} was called during a
* function at least once. When {@link scheduleRerender} was called during a
* render pass, another render pass is triggered after the last provided
* promise has been resolved. This cycle is repeated until a render pass does
* not yield any more rerender promises. It resolves with the result of the
Expand All @@ -49,7 +49,7 @@ export interface AsyncSsrManagerV0 {
*
* @param promise When this promise resolves, a rerender should be triggered.
*/
rerenderAfter(promise: Promise<unknown>): void;
scheduleRerender(promise: Promise<unknown>): void;
}

export interface SharedAsyncSsrManager extends SharedFeatureService {
Expand Down
4 changes: 2 additions & 2 deletions packages/async-ssr-manager/src/internal/async-ssr-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ export class AsyncSsrManager implements AsyncSsrManagerV0 {
return Promise.race([renderPromise, renderingTimeout(this.timeout)]);
}

public rerenderAfter(promise: Promise<unknown>): void {
public scheduleRerender(promise: Promise<unknown>): void {
this.rerenderPromises.add(promise);
}

private async renderingLoop(render: () => string): Promise<string> {
let html = render();

// During a render pass, rerender promises might be added via the
// rerenderAfter method.
// scheduleRerender method.
while (this.rerenderPromises.size > 0) {
await Promise.all(this.rerenderPromises.values());
this.rerenderPromises.clear();
Expand Down
2 changes: 1 addition & 1 deletion packages/demos/src/server-side-rendering/feature-app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const featureAppDefinition: FeatureAppDefinition<
if (asyncSsrManager) {
serializedStateManager.register(() => subject);

asyncSsrManager.rerenderAfter(
asyncSsrManager.scheduleRerender(
(async () => (subject = await fetchSubject()))()
);
} else {
Expand Down
18 changes: 9 additions & 9 deletions packages/react/src/__tests__/feature-app-loader.node.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import * as ReactDOM from 'react-dom/server';
import {FeatureAppLoader, FeatureHubContextProvider} from '..';

interface MockAsyncSsrManager extends AsyncSsrManagerV0 {
rerenderAfter: ((promise: Promise<unknown>) => void) & jest.Mock;
scheduleRerender: ((promise: Promise<unknown>) => void) & jest.Mock;
}

jest.mock('../feature-app-container', () => ({
Expand Down Expand Up @@ -48,7 +48,7 @@ describe('FeatureAppLoader (on Node.js)', () => {
};

mockAsyncSsrManager = {
rerenderAfter: jest.fn(),
scheduleRerender: jest.fn(),
renderUntilCompleted: jest.fn()
};

Expand Down Expand Up @@ -81,10 +81,10 @@ describe('FeatureAppLoader (on Node.js)', () => {
expect(mockGetAsyncFeatureAppDefinition).not.toHaveBeenCalled();
});

it('does not trigger a rerender on the Async SSR Manager', () => {
it('does not schedule a rerender on the Async SSR Manager', () => {
renderWithFeatureHubContext(<FeatureAppLoader src="example.js" />);

expect(mockAsyncSsrManager.rerenderAfter).not.toHaveBeenCalled();
expect(mockAsyncSsrManager.scheduleRerender).not.toHaveBeenCalled();
});

it('does not add a URL for hydration', () => {
Expand All @@ -110,7 +110,7 @@ describe('FeatureAppLoader (on Node.js)', () => {
<FeatureAppLoader src="example.js" serverSrc="example-node.js" />
);

expect(mockAsyncSsrManager.rerenderAfter.mock.calls).toEqual([
expect(mockAsyncSsrManager.scheduleRerender.mock.calls).toEqual([
[mockAsyncFeatureAppDefinition.promise]
]);
});
Expand All @@ -137,12 +137,12 @@ describe('FeatureAppLoader (on Node.js)', () => {
);
});

it('does not trigger a rerender on the Async SSR Manager', () => {
it('does not schedule a rerender on the Async SSR Manager', () => {
renderWithFeatureHubContext(
<FeatureAppLoader src="example.js" serverSrc="example-node.js" />
);

expect(mockAsyncSsrManager.rerenderAfter).not.toHaveBeenCalled();
expect(mockAsyncSsrManager.scheduleRerender).not.toHaveBeenCalled();
});
});

Expand Down Expand Up @@ -173,14 +173,14 @@ describe('FeatureAppLoader (on Node.js)', () => {
]);
});

it('does not trigger a rerender on the Async SSR Manager', () => {
it('does not schedule a rerender on the Async SSR Manager', () => {
try {
renderWithFeatureHubContext(
<FeatureAppLoader src="example.js" serverSrc="example-node.js" />
);
} catch {}

expect(mockAsyncSsrManager.rerenderAfter).not.toHaveBeenCalled();
expect(mockAsyncSsrManager.scheduleRerender).not.toHaveBeenCalled();
});

it('adds the src URL for hydration', () => {
Expand Down
12 changes: 6 additions & 6 deletions packages/react/src/__tests__/feature-app-loader.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {FeatureAppContainer, FeatureAppLoader} from '..';
import {FeatureHubContextProvider} from '../feature-hub-context';

interface MockAsyncSsrManager extends AsyncSsrManagerV0 {
rerenderAfter: ((promise: Promise<unknown>) => void) & jest.Mock;
scheduleRerender: ((promise: Promise<unknown>) => void) & jest.Mock;
}

jest.mock('../feature-app-container', () => ({
Expand Down Expand Up @@ -49,7 +49,7 @@ describe('FeatureAppLoader', () => {
};

mockAsyncSsrManager = {
rerenderAfter: jest.fn(),
scheduleRerender: jest.fn(),
renderUntilCompleted: jest.fn()
};

Expand Down Expand Up @@ -163,12 +163,12 @@ describe('FeatureAppLoader', () => {
expect(FeatureAppContainer).toHaveBeenCalledWith(expectedProps, {});
});

it('does not trigger a rerender on the Async SSR Manager', () => {
it('does not schedule a rerender on the Async SSR Manager', () => {
renderWithFeatureHubContext(
<FeatureAppLoader src="example.js" serverSrc="example-node.js" />
);

expect(mockAsyncSsrManager.rerenderAfter).not.toHaveBeenCalled();
expect(mockAsyncSsrManager.scheduleRerender).not.toHaveBeenCalled();
});

it('does not add a URL for hydration', () => {
Expand Down Expand Up @@ -244,12 +244,12 @@ describe('FeatureAppLoader', () => {
expect(testRenderer.toJSON()).toBe('mocked FeatureAppContainer');
});

it('does not trigger a rerender on the Async SSR Manager', () => {
it('does not schedule a rerender on the Async SSR Manager', () => {
renderWithFeatureHubContext(
<FeatureAppLoader src="example.js" serverSrc="example-node.js" />
);

expect(mockAsyncSsrManager.rerenderAfter).not.toHaveBeenCalled();
expect(mockAsyncSsrManager.scheduleRerender).not.toHaveBeenCalled();
});

it('does not add a URL for hydration', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/react/src/feature-app-loader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class InternalFeatureAppLoader extends React.PureComponent<
} else if (asyncFeatureAppDefinition.value) {
this.state = {featureAppDefinition: asyncFeatureAppDefinition.value};
} else if (!inBrowser && asyncSsrManager) {
asyncSsrManager.rerenderAfter(asyncFeatureAppDefinition.promise);
asyncSsrManager.scheduleRerender(asyncFeatureAppDefinition.promise);
}
}

Expand Down

0 comments on commit e5ddae9

Please sign in to comment.