Skip to content

Commit 2bdc76e

Browse files
committed
hardening
1 parent b32947c commit 2bdc76e

File tree

3 files changed

+2379
-2329
lines changed

3 files changed

+2379
-2329
lines changed

src/components/MDX/Sandpack/sandpack-rsc/sandbox-code/src/rsc-client.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function initClient() {
4242
var worker = new Worker(workerUrl);
4343

4444
// Render tracking
45-
var renderRequestId = 0;
45+
var nextStreamId = 0;
4646
var chunkControllers = {};
4747
var setCurrentPromise;
4848
var firstRender = true;
@@ -126,8 +126,8 @@ export function initClient() {
126126

127127
function callServer(id, args) {
128128
return encodeReply(args).then(function (body) {
129-
renderRequestId++;
130-
var reqId = renderRequestId;
129+
nextStreamId++;
130+
var reqId = nextStreamId;
131131

132132
var stream = new ReadableStream({
133133
start: function (controller) {
@@ -184,8 +184,8 @@ export function initClient() {
184184
delete chunkControllers[id];
185185
});
186186

187-
renderRequestId++;
188-
var reqId = renderRequestId;
187+
nextStreamId++;
188+
var reqId = nextStreamId;
189189

190190
var stream = new ReadableStream({
191191
start: function (controller) {
@@ -250,7 +250,6 @@ export function initClient() {
250250
});
251251
worker.postMessage({
252252
type: 'deploy',
253-
requestId: ++renderRequestId,
254253
files: userFiles,
255254
});
256255
}

src/components/MDX/Sandpack/sandpack-rsc/sandbox-code/src/rsc-server.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,43 @@ function deploy(files) {
212212
module: mainModule.exports,
213213
};
214214

215+
// Collect only client-reachable compiled code.
216+
// Start from 'use client' entries and trace their require() calls.
217+
var clientReachable = {};
218+
function traceClientDeps(filePath) {
219+
if (clientReachable[filePath]) return;
220+
clientReachable[filePath] = true;
221+
var code = compiled[filePath];
222+
if (!code) return;
223+
var requireRegex = /require\(["']([^"']+)["']\)/g;
224+
var match;
225+
while ((match = requireRegex.exec(code)) !== null) {
226+
var dep = match[1];
227+
if (
228+
dep === 'react' ||
229+
dep === 'react/jsx-runtime' ||
230+
dep === 'react/jsx-dev-runtime' ||
231+
dep.endsWith('.css')
232+
)
233+
continue;
234+
var resolved = resolveModuleId(filePath, dep);
235+
if (compiled[resolved]) {
236+
traceClientDeps(resolved);
237+
}
238+
}
239+
}
240+
Object.keys(detectedClientFiles).forEach(function (filePath) {
241+
traceClientDeps(filePath);
242+
});
243+
244+
var clientCompiled = {};
245+
Object.keys(clientReachable).forEach(function (filePath) {
246+
clientCompiled[filePath] = compiled[filePath];
247+
});
248+
215249
return {
216250
type: 'deployed',
217-
compiledClients: compiled,
251+
compiledClients: clientCompiled,
218252
clientEntries: detectedClientFiles,
219253
};
220254
}
@@ -300,20 +334,17 @@ self.onmessage = function (e) {
300334
if (result && result.type === 'error') {
301335
self.postMessage({
302336
type: 'rsc-error',
303-
requestId: msg.requestId,
304337
error: result.error,
305338
});
306339
} else if (result) {
307340
self.postMessage({
308341
type: 'deploy-result',
309-
requestId: msg.requestId,
310342
result: result,
311343
});
312344
}
313345
} catch (err) {
314346
self.postMessage({
315347
type: 'rsc-error',
316-
requestId: msg.requestId,
317348
error: String(err),
318349
});
319350
}

0 commit comments

Comments
 (0)