Skip to content
30 changes: 11 additions & 19 deletions src/jsc/JSPromise.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,6 @@ unsafe extern "C" {
arg0: &JSGlobalObject,
js_value1: JSValue,
) -> *mut JSPromise;
/// **DEPRECATED** This function does not notify the VM about the rejection,
/// meaning it will not trigger unhandled rejection handling. Use
/// `JSC__JSPromise__rejectedPromise` instead.
safe fn JSC__JSPromise__rejectedPromiseValue(
arg0: &JSGlobalObject,
js_value1: JSValue,
) -> JSValue;
safe fn JSC__JSPromise__resolvedPromise(
arg0: &JSGlobalObject,
js_value1: JSValue,
Expand Down Expand Up @@ -232,10 +225,8 @@ impl JSPromise {
return value;
}

if value.is_any_error() {
return Self::dangerously_create_rejected_promise_value_without_notifying_vm(
global, value,
);
if let Some(err) = value.to_error() {
return Self::rejected_promise(global, err).to_js();
}

Self::resolved_promise_value(global, value)
Expand Down Expand Up @@ -293,15 +284,16 @@ impl JSPromise {
JSPromise::opaque_mut(JSC__JSPromise__rejectedPromise(global, value))
}

/// **DEPRECATED** use `rejected_promise` instead.
///
/// Create a new rejected promise without notifying the VM. Unhandled
/// rejections created this way will not trigger unhandled rejection handling.
pub fn dangerously_create_rejected_promise_value_without_notifying_vm(
/// Create a new promise rejected with the exception `err` proves is pending,
/// taking it off the VM. The reason is converted like [`reject`](Self::reject)
/// does; a termination is propagated instead of becoming a reason.
pub fn rejected_promise_with_caught_exception(
global: &JSGlobalObject,
value: JSValue,
) -> JSValue {
JSC__JSPromise__rejectedPromiseValue(global, value)
err: JsError,
) -> JsResult<&mut JSPromise> {
let promise = Self::create(global);
promise.reject(global, Err(err))?;
Ok(promise)
}

/// Fulfill an existing promise with the value.
Expand Down
14 changes: 0 additions & 14 deletions src/jsc/bindings/bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5157,20 +5157,6 @@ void JSC__VM__throwError(JSC::VM* vm_, JSC::JSGlobalObject* arg1, JSC::EncodedJS
scope.throwException(arg1, exception);
}

/// **DEPRECATED** This function does not notify the VM about the rejection,
/// meaning it will not trigger unhandled rejection handling. Use JSC__JSPromise__rejectedPromise instead.
JSC::EncodedJSValue JSC__JSPromise__rejectedPromiseValue(JSC::JSGlobalObject* globalObject,
JSC::EncodedJSValue JSValue1)
{
auto& vm = JSC::getVM(globalObject);
JSC::JSPromise* promise = JSC::JSPromise::create(vm, globalObject->promiseStructure());
promise->setFlags(static_cast<uint16_t>(JSC::JSPromise::Status::Rejected));
promise->setSlot(vm, JSC::JSValue::decode(JSValue1));
JSC::ensureStillAliveHere(promise);
JSC::ensureStillAliveHere(JSC::JSValue::decode(JSValue1));
return JSC::JSValue::encode(promise);
}

JSC::EncodedJSValue JSC__JSPromise__resolvedPromiseValue(JSC::JSGlobalObject* globalObject,
JSC::EncodedJSValue JSValue1)
{
Expand Down
1 change: 0 additions & 1 deletion src/jsc/bindings/headers.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 1 addition & 5 deletions src/runtime/api/BunObject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1152,12 +1152,8 @@ fn resolve(global_object: &JSGlobalObject, callframe: &CallFrame) -> JsResult<JS
let value = match do_resolve(global_object, callframe.arguments()) {
Ok(v) => v,
Err(e) => {
let err = global_object.take_error(e);
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global_object,
err,
),
JSPromise::rejected_promise_with_caught_exception(global_object, e)?.to_js(),
);
}
};
Expand Down
5 changes: 1 addition & 4 deletions src/runtime/api/bun/subprocess.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1371,10 +1371,7 @@ impl Subprocess<'_> {
),
Status::Err(err) => {
let js_err = err.to_js(global_this);
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
global_this,
js_err,
)
JSPromise::rejected_promise(global_this, js_err).to_js()
}
_ => {
let promise = JSPromise::create(global_this).to_js();
Expand Down
83 changes: 37 additions & 46 deletions src/runtime/server/server_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2240,26 +2240,24 @@ where
jsc::mark_binding!();

if self.config.on_request.is_empty() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ctx.create_error_instance(format_args!(
"fetch() requires the server to have a fetch handler"
)),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ctx.create_error_instance(format_args!(
"fetch() requires the server to have a fetch handler"
)),
)
.to_js());
}

let arguments = callframe.arguments();
if arguments.is_empty() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ctx.create_error_instance(format_args!(
"fetch() expects a string but received no arguments."
)),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ctx.create_error_instance(format_args!(
"fetch() expects a string but received no arguments."
)),
)
.to_js());
}

let mut headers: Option<HeadersRef> = None;
Expand All @@ -2277,14 +2275,13 @@ where
let temp_url_str = url_utf8.slice();

if temp_url_str.is_empty() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ctx.create_error_instance(format_args!(
"fetch() URL must not be a blank string."
)),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ctx.create_error_instance(format_args!(
"fetch() URL must not be a blank string."
)),
)
.to_js());
}

let mut url = URL::parse(temp_url_str);
Expand Down Expand Up @@ -2333,11 +2330,11 @@ where
if let Some(body__) = opts.fast_get(ctx, jsc::BuiltinName::Body)? {
match Blob::get::<true, false>(ctx, body__) {
Ok(new_blob) => body = BodyValue::Blob(new_blob),
Err(_) => {
return Ok(JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ctx.create_error_instance(format_args!("fetch() received invalid body")),
));
Err(err) => {
return Ok(JSPromise::rejected_promise_with_caught_exception(
ctx, err,
)?
.to_js());
}
}
}
Expand All @@ -2362,9 +2359,7 @@ where
} else {
let fetch_error = Fetch::fetch_type_error_string(first_arg);
let err = jsc::ErrorCode::INVALID_ARG_TYPE.fmt(ctx, format_args!("{}", fetch_error));
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(ctx, err),
);
return Ok(JSPromise::rejected_promise(ctx, err).to_js());
};

// `Request::to_js` stores `self as *mut
Expand All @@ -2382,25 +2377,21 @@ where
let response_value =
match on_request.call(&global_this, self.js_value_assert_alive(), &[request_value]) {
Ok(v) => v,
Err(err) => global_this.take_exception(err),
Err(err) => {
return Ok(JSPromise::rejected_promise_with_caught_exception(ctx, err)?.to_js());
}
};

if response_value.is_any_error() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
response_value,
),
);
if let Some(err) = response_value.to_error() {
return Ok(JSPromise::rejected_promise(ctx, err).to_js());
}

if response_value.is_empty_or_undefined_or_null() {
return Ok(
JSPromise::dangerously_create_rejected_promise_value_without_notifying_vm(
ctx,
ctx.create_error_instance(format_args!("fetch() returned an empty value")),
),
);
return Ok(JSPromise::rejected_promise(
ctx,
ctx.create_error_instance(format_args!("fetch() returned an empty value")),
)
.to_js());
}

if response_value.as_any_promise().is_some() {
Expand Down
Loading
Loading