Worker
Deno は Web Worker API
をサポートしています。
Worker はマルチスレッドでコードを実行するために使用します。 Worker
の各インスタンスは別々のスレッドで実行され、各スレッドは一つの worker に専念します。
現時点では、Deno は module
型の worker のみをサポートしています。 そのため新しい worker を作成するときに type: "module"
オプションを渡すことが必須です。
相対パスによるモジュールの指定子は現時点でサポートされていません。 かわりに、近くのスクリプトの指定子を簡単に作成するには URL
コンストラクタと import.meta.url
を使うことができます。
// Good
new Worker(new URL("worker.js", import.meta.url).href, { type: "module" });
// Bad
new Worker(new URL("worker.js", import.meta.url).href);
new Worker(new URL("worker.js", import.meta.url).href, { type: "classic" });
new Worker("./worker.js", { type: "module" });
Permissions
Creating a new Worker
instance is similar to a dynamic import; therefore Deno requires appropriate permission for this action.
For workers using local modules; --allow-read
permission is required:
main.ts
new Worker(new URL("worker.ts", import.meta.url).href, { type: "module" });
worker.ts
console.log("hello world");
self.close();
$ deno run main.ts
error: Uncaught PermissionDenied: read access to "./worker.ts", run again with the --allow-read flag
$ deno run --allow-read main.ts
hello world
For workers using remote modules; --allow-net
permission is required:
main.ts
new Worker("https://example.com/worker.ts", { type: "module" });
worker.ts (at https://example.com/worker.ts)
console.log("hello world");
self.close();
$ deno run main.ts
error: Uncaught PermissionDenied: net access to "https://example.com/worker.ts", run again with the --allow-net flag
$ deno run --allow-net main.ts
hello world
Using Deno in worker
This is an unstable Deno feature. Learn more about unstable features.
By default the Deno
namespace is not available in worker scope.
To add the Deno
namespace pass deno: true
option when creating new worker:
main.js
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
type: "module",
deno: true,
});
worker.postMessage({ filename: "./log.txt" });
worker.js
self.onmessage = async (e) => {
const { filename } = e.data;
const text = await Deno.readTextFile(filename);
console.log(text);
self.close();
};
log.txt
hello world
$ deno run --allow-read --unstable main.js
hello world
When the Deno
namespace is available in worker scope, the worker inherits its parent process' permissions (the ones specified using --allow-*
flags).
We intend to make permissions configurable for workers.