diff options
author | 2023-07-27 22:28:28 -0700 | |
---|---|---|
committer | 2023-07-27 22:28:28 -0700 | |
commit | 70b9bf743c21484b35918bb07ff2423f77207d2e (patch) | |
tree | 0328c61468c339bdcdb008f78ca1e887b330be1b | |
parent | f3153fbee9246c1a39e2eaafe115e104d78d8c64 (diff) | |
download | bun-70b9bf743c21484b35918bb07ff2423f77207d2e.tar.gz bun-70b9bf743c21484b35918bb07ff2423f77207d2e.tar.zst bun-70b9bf743c21484b35918bb07ff2423f77207d2e.zip |
Add `Bun.isMainThread`
-rw-r--r-- | packages/bun-types/bun.d.ts | 5 | ||||
-rw-r--r-- | src/bun.js/bindings/ScriptExecutionContext.h | 1 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 10 | ||||
-rw-r--r-- | src/js/builtins/ImportMetaObject.ts | 2 | ||||
-rw-r--r-- | src/js/out/WebCoreJSBuiltins.cpp | 4 | ||||
-rw-r--r-- | test/js/bun/util/bun-isMainThread.test.js | 15 | ||||
-rw-r--r-- | test/js/bun/util/main-worker-file.js | 14 |
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; +} |