diff options
Diffstat (limited to 'runtime/js/98_global_scope_worker.js')
-rw-r--r-- | runtime/js/98_global_scope_worker.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/runtime/js/98_global_scope_worker.js b/runtime/js/98_global_scope_worker.js new file mode 100644 index 000000000..6b0ad480c --- /dev/null +++ b/runtime/js/98_global_scope_worker.js @@ -0,0 +1,112 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +import { core, primordials } from "ext:core/mod.js"; +const ops = core.ops; +const { + ObjectDefineProperties, + ObjectPrototypeIsPrototypeOf, + SymbolFor, +} = primordials; + +import * as util from "ext:runtime/06_util.js"; +import * as location from "ext:deno_web/12_location.js"; +import * as console from "ext:deno_console/01_console.js"; +import * as webidl from "ext:deno_webidl/00_webidl.js"; +import * as globalInterfaces from "ext:deno_web/04_global_interfaces.js"; +import { loadWebGPU, webgpu } from "ext:deno_webgpu/00_init.js"; + +function memoizeLazy(f) { + let v_ = null; + return () => { + if (v_ === null) { + v_ = f(); + } + return v_; + }; +} + +const numCpus = memoizeLazy(() => ops.op_bootstrap_numcpus()); +const userAgent = memoizeLazy(() => ops.op_bootstrap_user_agent()); +const language = memoizeLazy(() => ops.op_bootstrap_language()); + +class WorkerNavigator { + constructor() { + webidl.illegalConstructor(); + } + + [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) { + return inspect( + console.createFilteredInspectProxy({ + object: this, + evaluate: ObjectPrototypeIsPrototypeOf(WorkerNavigatorPrototype, this), + keys: [ + "hardwareConcurrency", + "userAgent", + "language", + "languages", + ], + }), + inspectOptions, + ); + } +} + +const workerNavigator = webidl.createBranded(WorkerNavigator); + +ObjectDefineProperties(WorkerNavigator.prototype, { + gpu: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + loadWebGPU(); + return webgpu.gpu; + }, + }, + hardwareConcurrency: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return numCpus(); + }, + }, + userAgent: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return userAgent(); + }, + }, + language: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return language(); + }, + }, + languages: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return [language()]; + }, + }, +}); +const WorkerNavigatorPrototype = WorkerNavigator.prototype; + +const workerRuntimeGlobalProperties = { + WorkerLocation: location.workerLocationConstructorDescriptor, + location: location.workerLocationDescriptor, + WorkerGlobalScope: globalInterfaces.workerGlobalScopeConstructorDescriptor, + DedicatedWorkerGlobalScope: + globalInterfaces.dedicatedWorkerGlobalScopeConstructorDescriptor, + WorkerNavigator: util.nonEnumerable(WorkerNavigator), + navigator: util.getterOnly(() => workerNavigator), + self: util.getterOnly(() => globalThis), +}; + +export { workerRuntimeGlobalProperties }; |