mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
### What does this PR do?
Fixes a crash related to the dev server overwriting the uws user context
pointer when setting abort callback.
Adds support for `return new Response(<jsx />, { ... })` and `return
Response.render(...)` and `return Response.redirect(...)`:
- Created a `SSRResponse` class to handle this (see
`JSBakeResponse.{h,cpp}`)
- `SSRResponse` is designed to "fake" being a React component
- This is done in JSBakeResponse::create inside of
src/bun.js/bindings/JSBakeResponse.cpp
- And `src/js/builtins/BakeSSRResponse.ts` defines a `wrapComponent`
function which wraps
the passed in component (when doing `new Response(<jsx />, ...)`). It
does
this to throw an error (in redirect()/render() case) or return the
component.
- Created a `BakeAdditionsToGlobal` struct which contains some
properties
needed for this
- Added some of the properties we need to fake to BunBuiltinNames.h
(e.g.
`$$typeof`), the rationale behind this is that we couldn't use
`structure->addPropertyTransition` because JSBakeResponse is not a final
JSObject.
- When bake and server-side, bundler rewrites `Response ->
Bun.SSRResponse` (see `src/ast/P.zig` and `src/ast/visitExpr.zig`)
- Created a new WebCore body variant (`Render: struct { path: []const u8
}`)
- Created when `return Response.render(...)`
- When handled, it re-invokes dev server to render the new path
Enables server-side sourcemaps for the dev server:
- New source providers for server-side:
(`DevServerSourceProvider.{h,cpp}`)
- IncrementalGraph and SourceMapStore are updated to support this
There are numerous other stuff:
- allow `app` configuration from Bun.serve(...)
- fix errors stopping dev server
- fix use after free related to in
RequestContext.finishRunningErrorHandler
- Request.cookies
- Make `"use client";` components work
- Fix some bugs using `require(...)` in dev server
- Fix catch-all routes not working in the dev server
- Updates `findSourceMappingURL(...)` to use `std.mem.lastIndexOf(...)`
because
the sourcemap that should be used is the last one anyway
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude Bot <claude-bot@bun.sh>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Alistair Smith <hi@alistair.sh>
75 lines
2.5 KiB
C++
75 lines
2.5 KiB
C++
#pragma once
|
|
#include "root.h"
|
|
#include "headers-handwritten.h"
|
|
#include "JavaScriptCore/SourceOrigin.h"
|
|
#include "ZigGlobalObject.h"
|
|
#include "MiString.h"
|
|
|
|
namespace Bake {
|
|
|
|
class DevServerSourceProvider;
|
|
|
|
// Function to be implemented in Zig to register the source provider
|
|
extern "C" void Bun__addDevServerSourceProvider(void* bun_vm, DevServerSourceProvider* opaque_source_provider, BunString* specifier);
|
|
extern "C" void Bun__removeDevServerSourceProvider(void* bun_vm, DevServerSourceProvider* opaque_source_provider, BunString* specifier);
|
|
|
|
class DevServerSourceProvider final : public JSC::StringSourceProvider {
|
|
public:
|
|
static Ref<DevServerSourceProvider> create(
|
|
JSC::JSGlobalObject* globalObject,
|
|
const String& source,
|
|
const char* sourceMapJSONPtr,
|
|
size_t sourceMapJSONLength,
|
|
const JSC::SourceOrigin& sourceOrigin,
|
|
String&& sourceURL,
|
|
const TextPosition& startPosition,
|
|
JSC::SourceProviderSourceType sourceType)
|
|
{
|
|
auto provider = adoptRef(*new DevServerSourceProvider(source, sourceMapJSONPtr, sourceMapJSONLength, sourceOrigin, WTFMove(sourceURL), startPosition, sourceType));
|
|
auto* zigGlobalObject = jsCast<::Zig::GlobalObject*>(globalObject);
|
|
auto specifier = Bun::toString(provider->sourceURL());
|
|
provider->m_globalObject = zigGlobalObject;
|
|
provider->m_specifier = specifier;
|
|
Bun__addDevServerSourceProvider(zigGlobalObject->bunVM(), provider.ptr(), &specifier);
|
|
return provider;
|
|
}
|
|
|
|
MiCString sourceMapJSON() const
|
|
{
|
|
return m_sourceMapJSON.asCString();
|
|
}
|
|
|
|
private:
|
|
DevServerSourceProvider(
|
|
const String& source,
|
|
const char* sourceMapJSONPtr,
|
|
size_t sourceMapJSONLength,
|
|
const JSC::SourceOrigin& sourceOrigin,
|
|
String&& sourceURL,
|
|
const TextPosition& startPosition,
|
|
JSC::SourceProviderSourceType sourceType)
|
|
: StringSourceProvider(
|
|
source,
|
|
sourceOrigin,
|
|
JSC::SourceTaintedOrigin::Untainted,
|
|
WTFMove(sourceURL),
|
|
startPosition,
|
|
sourceType)
|
|
, m_sourceMapJSON(sourceMapJSONPtr, sourceMapJSONLength)
|
|
{
|
|
}
|
|
|
|
~DevServerSourceProvider()
|
|
{
|
|
if (m_globalObject) {
|
|
Bun__removeDevServerSourceProvider(m_globalObject->bunVM(), this, &m_specifier);
|
|
}
|
|
}
|
|
|
|
MiString m_sourceMapJSON;
|
|
Zig::GlobalObject* m_globalObject;
|
|
BunString m_specifier;
|
|
};
|
|
|
|
} // namespace Bake
|