aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 71113e9a6..c19d3888b 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -2182,6 +2182,90 @@ void GlobalObject::finishCreation(VM& vm)
RELEASE_ASSERT(classInfo());
}
+JSC_DEFINE_HOST_FUNCTION(functionBunPeek,
+ (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ JSC::VM& vm = globalObject->vm();
+
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ JSValue promiseValue = callFrame->argument(0);
+ if (UNLIKELY(!promiseValue)) {
+ return JSValue::encode(jsUndefined());
+ } else if (!promiseValue.isCell()) {
+ return JSValue::encode(promiseValue);
+ }
+
+ auto* promise = jsDynamicCast<JSPromise*>(promiseValue);
+
+ if (!promise) {
+ return JSValue::encode(promiseValue);
+ }
+
+ JSValue invalidateValue = callFrame->argument(1);
+ bool invalidate = invalidateValue.isBoolean() && invalidateValue.asBoolean();
+
+ switch (promise->status(vm)) {
+ case JSPromise::Status::Pending: {
+ break;
+ }
+ case JSPromise::Status::Fulfilled: {
+ JSValue result = promise->result(vm);
+ if (invalidate) {
+ promise->internalField(JSC::JSPromise::Field::ReactionsOrResult).set(vm, promise, jsUndefined());
+ }
+ return JSValue::encode(result);
+ }
+ case JSPromise::Status::Rejected: {
+ JSValue result = promise->result(vm);
+ JSC::EnsureStillAliveScope ensureStillAliveScope(result);
+
+ if (invalidate) {
+ promise->internalField(JSC::JSPromise::Field::Flags).set(vm, promise, jsNumber(promise->internalField(JSC::JSPromise::Field::Flags).get().asUInt32() | JSC::JSPromise::isHandledFlag));
+ promise->internalField(JSC::JSPromise::Field::ReactionsOrResult).set(vm, promise, JSC::jsUndefined());
+ }
+
+ return JSValue::encode(result);
+ }
+ }
+
+ return JSValue::encode(promiseValue);
+}
+
+JSC_DEFINE_HOST_FUNCTION(functionBunPeekStatus,
+ (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame))
+{
+ JSC::VM& vm = globalObject->vm();
+ static NeverDestroyed<String> fulfilled = MAKE_STATIC_STRING_IMPL("fulfilled");
+
+ auto scope = DECLARE_THROW_SCOPE(vm);
+ JSValue promiseValue = callFrame->argument(0);
+ if (!promiseValue || !promiseValue.isCell()) {
+ return JSValue::encode(jsOwnedString(vm, fulfilled));
+ }
+
+ auto* promise = jsDynamicCast<JSPromise*>(promiseValue);
+
+ if (!promise) {
+ return JSValue::encode(jsOwnedString(vm, fulfilled));
+ }
+
+ switch (promise->status(vm)) {
+ case JSPromise::Status::Pending: {
+ static NeverDestroyed<String> pending = MAKE_STATIC_STRING_IMPL("pending");
+ return JSValue::encode(jsOwnedString(vm, pending));
+ }
+ case JSPromise::Status::Fulfilled: {
+ return JSValue::encode(jsOwnedString(vm, fulfilled));
+ }
+ case JSPromise::Status::Rejected: {
+ static NeverDestroyed<String> rejected = MAKE_STATIC_STRING_IMPL("rejected");
+ return JSValue::encode(jsOwnedString(vm, rejected));
+ }
+ }
+
+ return JSValue::encode(jsUndefined());
+}
+
extern "C" void Bun__setOnEachMicrotaskTick(JSC::VM* vm, void* ptr, void (*callback)(void* ptr))
{
if (callback == nullptr) {
@@ -2547,6 +2631,15 @@ void GlobalObject::installAPIGlobals(JSClassRef* globals, int count, JSC::VM& vm
}
{
+ JSC::Identifier identifier = JSC::Identifier::fromString(vm, "peek"_s);
+ JSFunction* peekFunction = JSFunction::create(vm, this, 2, WTF::String("peek"_s), functionBunPeek, ImplementationVisibility::Public, NoIntrinsic);
+ JSFunction* peekStatus = JSFunction::create(vm, this, 1, WTF::String("status"_s), functionBunPeekStatus, ImplementationVisibility::Public, NoIntrinsic);
+ peekFunction->putDirect(vm, PropertyName(JSC::Identifier::fromString(vm, "status"_s)), peekStatus, JSC::PropertyAttribute::Function | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontDelete | 0);
+ object->putDirect(vm, PropertyName(identifier), JSValue(peekFunction),
+ JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DontDelete | 0);
+ }
+
+ {
JSC::Identifier identifier = JSC::Identifier::fromString(vm, "readableStreamToArrayBuffer"_s);
object->putDirectBuiltinFunction(vm, this, identifier, readableStreamReadableStreamToArrayBufferCodeGenerator(vm),
JSC::PropertyAttribute::Function | JSC::PropertyAttribute::DontDelete | 0);