aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/bun-types/bun.d.ts5
-rw-r--r--src/bun.js/bindings/ScriptExecutionContext.h1
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp10
-rw-r--r--src/js/builtins/ImportMetaObject.ts2
-rw-r--r--src/js/out/WebCoreJSBuiltins.cpp4
-rw-r--r--test/js/bun/util/bun-isMainThread.test.js15
-rw-r--r--test/js/bun/util/main-worker-file.js14
7 files changed, 48 insertions, 3 deletions
diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts
index efd8a91b6..20f247d91 100644
--- a/packages/bun-types/bun.d.ts
+++ b/packages/bun-types/bun.d.ts
@@ -3179,6 +3179,11 @@ declare module "bun" {
const plugin: BunRegisterPlugin;
+ /**
+ * Is the current global scope the main thread?
+ */
+ const isMainThread: boolean;
+
interface Socket<Data = undefined> {
/**
* Write `data` to the socket
diff --git a/src/bun.js/bindings/ScriptExecutionContext.h b/src/bun.js/bindings/ScriptExecutionContext.h
index 520954c29..580c1be25 100644
--- a/src/bun.js/bindings/ScriptExecutionContext.h
+++ b/src/bun.js/bindings/ScriptExecutionContext.h
@@ -112,6 +112,7 @@ public:
{
return m_url;
}
+ bool isMainThread() const { return static_cast<unsigned>(m_identifier) == 1; }
bool activeDOMObjectsAreSuspended() { return false; }
bool activeDOMObjectsAreStopped() { return false; }
bool isContextThread() { return true; }
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 746412d78..b853f585e 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -4454,6 +4454,16 @@ void GlobalObject::installAPIGlobals(JSClassRef* globals, int count, JSC::VM& vm
{
+ JSC::Identifier identifier = JSC::Identifier::fromString(vm, "isMainThread"_s);
+ object->putDirect(vm, identifier,
+ jsBoolean(scriptExecutionContext()->isMainThread()),
+ JSC::PropertyAttribute::DontDelete
+ | JSC::PropertyAttribute::ReadOnly
+ | 0);
+ }
+
+ {
+
JSC::Identifier identifier = JSC::Identifier::fromString(vm, pathToFileURLString);
object->putDirectNativeFunction(vm, this, identifier, 1, functionPathToFileURL, ImplementationVisibility::Public, NoIntrinsic,
JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly);
diff --git a/src/js/builtins/ImportMetaObject.ts b/src/js/builtins/ImportMetaObject.ts
index 46c00534a..4a08524c6 100644
--- a/src/js/builtins/ImportMetaObject.ts
+++ b/src/js/builtins/ImportMetaObject.ts
@@ -216,5 +216,5 @@ export function createRequireCache() {
$getter;
export function main(this: ImportMetaObject) {
- return this.path === Bun.main;
+ return this.path === Bun.main && Bun.isMainThread;
}
diff --git a/src/js/out/WebCoreJSBuiltins.cpp b/src/js/out/WebCoreJSBuiltins.cpp
index 9ae90e82a..a28464a57 100644
--- a/src/js/out/WebCoreJSBuiltins.cpp
+++ b/src/js/out/WebCoreJSBuiltins.cpp
@@ -2288,9 +2288,9 @@ const char* const s_importMetaObjectCreateRequireCacheCode = "(function (){\"use
const JSC::ConstructAbility s_importMetaObjectMainCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_importMetaObjectMainCodeConstructorKind = JSC::ConstructorKind::None;
const JSC::ImplementationVisibility s_importMetaObjectMainCodeImplementationVisibility = JSC::ImplementationVisibility::Public;
-const int s_importMetaObjectMainCodeLength = 57;
+const int s_importMetaObjectMainCodeLength = 76;
static const JSC::Intrinsic s_importMetaObjectMainCodeIntrinsic = JSC::NoIntrinsic;
-const char* const s_importMetaObjectMainCode = "(function (){\"use strict\";return this.path===@Bun.main})\n";
+const char* const s_importMetaObjectMainCode = "(function (){\"use strict\";return this.path===@Bun.main&&@Bun.isMainThread})\n";
#define DEFINE_BUILTIN_GENERATOR(codeName, functionName, overriddenName, argumentCount) \
JSC::FunctionExecutable* codeName##Generator(JSC::VM& vm) \
diff --git a/test/js/bun/util/bun-isMainThread.test.js b/test/js/bun/util/bun-isMainThread.test.js
new file mode 100644
index 000000000..87f74d136
--- /dev/null
+++ b/test/js/bun/util/bun-isMainThread.test.js
@@ -0,0 +1,15 @@
+import { test, expect } from "bun:test";
+import { bunEnv, bunExe } from "harness";
+
+test("Bun.isMainThread", () => {
+ expect(Bun.isMainThread).toBeTrue();
+
+ const { stdout, exitCode } = Bun.spawnSync({
+ cmd: [bunExe(), import.meta.resolveSync("./main-worker-file.js")],
+ stderr: "inherit",
+ stdout: "pipe",
+ env: bunEnv,
+ });
+ expect(exitCode).toBe(0);
+ expect(stdout.toString()).toBe("isMainThread true\nisMainThread false\n");
+});
diff --git a/test/js/bun/util/main-worker-file.js b/test/js/bun/util/main-worker-file.js
new file mode 100644
index 000000000..376480397
--- /dev/null
+++ b/test/js/bun/util/main-worker-file.js
@@ -0,0 +1,14 @@
+import { isMainThread } from "bun";
+
+console.log("isMainThread", isMainThread);
+
+if (isMainThread) {
+ const worker = new Worker(import.meta.url);
+ const { promise, resolve } = Promise.withResolvers();
+
+ worker.addEventListener("open", () => {
+ resolve();
+ });
+
+ await promise;
+}