Skip to content

Commit 6e39dd1

Browse files
committed
fix(rsc-mf): execute remote actions against remote origin
1 parent ca5b321 commit 6e39dd1

4 files changed

Lines changed: 38 additions & 30 deletions

File tree

tests/integration/rsc-mf/host/modern.config.ts

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@ import path from 'path';
22
import { appTools, defineConfig } from '@modern-js/app-tools';
33
import { moduleFederationPlugin } from '@module-federation/modern-js-v3';
44

5+
const serverOnlyEmptyPath = path.join(
6+
path.dirname(require.resolve('server-only')),
7+
'empty.js',
8+
);
9+
const remoteOrigin = `http://127.0.0.1:${process.env.RSC_MF_REMOTE_PORT || '3008'}`;
10+
511
export default defineConfig({
612
server: {
713
rsc: true,
14+
port: Number(process.env.PORT || 3007),
815
},
916
// Keep RSC server entries synchronous for MF+RSC handlers.
1017
source: {
1118
enableAsyncEntry: false,
19+
define: {
20+
__RSC_MF_REMOTE_ORIGIN__: JSON.stringify(remoteOrigin),
21+
},
1222
},
1323
output: {
1424
polyfill: 'off',
@@ -25,29 +35,10 @@ export default defineConfig({
2535
chain.target('async-node');
2636
chain.resolve.conditionNames
2737
.clear()
28-
.add('react-server')
29-
.add('require')
30-
.add('import')
31-
.add('default');
32-
chain.module
33-
.rule('rsc-mf-ssr-no-react-server')
34-
.test(/\.[cm]?[jt]sx?$/)
35-
.issuerLayer('server-side-rendering')
36-
.resolve.conditionNames.clear()
3738
.add('require')
3839
.add('import')
3940
.add('default');
40-
chain.module
41-
.rule('rsc-mf-host-runtime-react-alias')
42-
.resource(
43-
/packages[\\/]runtime[\\/]plugin-runtime[\\/]dist[\\/]esm[\\/]core[\\/].*\.mjs$/,
44-
)
45-
.resolve.alias.set('react$', require.resolve('react'))
46-
.set('react/jsx-runtime$', require.resolve('react/jsx-runtime'))
47-
.set(
48-
'react/jsx-dev-runtime$',
49-
require.resolve('react/jsx-dev-runtime'),
50-
);
41+
chain.resolve.alias.set('server-only$', serverOnlyEmptyPath);
5142
}
5243

5344
chain.resolve.modules
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
/// <reference types='@modern-js/app-tools/types' />
22
/// <reference types="react/canary" />
33
/// <reference types="react-dom/canary" />
4+
5+
declare const __RSC_MF_REMOTE_ORIGIN__: string;

tests/integration/rsc-mf/host/src/server-component-root/HostRemoteActionRunner.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
'use client';
22

3-
import { callServer } from '@modern-js/runtime/rsc/client';
43
import { useState } from 'react';
54
import RemoteClientBadge from 'rscRemote/RemoteClientBadge';
65
import { RemoteClientCounter as RemoteClientCounterBridge } from 'rscRemote/RemoteClientCounter';
@@ -12,7 +11,7 @@ export default function HostRemoteActionRunner() {
1211
// Keep this import in the client graph so federated RSC bridge IDs
1312
// can map back to a concrete remote module factory at runtime.
1413
void RemoteClientCounterBridge;
15-
registerRemoteServerCallback(callServer as any);
14+
registerRemoteServerCallback(__RSC_MF_REMOTE_ORIGIN__);
1615
const [defaultResult, setDefaultResult] = useState('');
1716
const [echoResult, setEchoResult] = useState('');
1817
const [isPending, setIsPending] = useState(false);
Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
1-
import { setServerCallback } from 'rsc-mf-react-server-dom-client-browser';
1+
import {
2+
createFromFetch,
3+
createTemporaryReferenceSet,
4+
encodeReply,
5+
setServerCallback,
6+
} from 'rsc-mf-react-server-dom-client-browser';
27

3-
type CallServer = (id: string, args: unknown[]) => Promise<unknown>;
8+
let registeredRemoteOrigin = '';
49

5-
let hasRegisteredRemoteServerCallback = false;
6-
7-
export function registerRemoteServerCallback(callServer: CallServer) {
8-
if (hasRegisteredRemoteServerCallback) {
10+
export function registerRemoteServerCallback(remoteOrigin: string) {
11+
if (!remoteOrigin || registeredRemoteOrigin === remoteOrigin) {
912
return;
1013
}
11-
setServerCallback(callServer as any);
12-
hasRegisteredRemoteServerCallback = true;
14+
15+
const remoteActionUrl = new URL('/', remoteOrigin).toString();
16+
setServerCallback(async (id, args) => {
17+
const temporaryReferences = createTemporaryReferenceSet();
18+
const response = fetch(remoteActionUrl, {
19+
method: 'POST',
20+
headers: {
21+
Accept: 'text/x-component',
22+
'x-rsc-action': id,
23+
},
24+
body: await encodeReply(args, { temporaryReferences }),
25+
});
26+
return createFromFetch(response, { temporaryReferences });
27+
});
28+
registeredRemoteOrigin = remoteOrigin;
1329
}

0 commit comments

Comments
 (0)