mirror of
https://github.com/denoland/deno.git
synced 2024-10-31 09:14:20 -04:00
122 lines
2.8 KiB
Markdown
122 lines
2.8 KiB
Markdown
## Workers
|
|
|
|
Deno supports
|
|
[`Web Worker API`](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker).
|
|
|
|
Workers can be used to run code on multiple threads. Each instance of `Worker`
|
|
is run on a separate thread, dedicated only to that worker.
|
|
|
|
Currently Deno supports only `module` type workers; thus it's essential to pass
|
|
the `type: "module"` option when creating a new worker.
|
|
|
|
Relative module specifiers are
|
|
[not supported](https://github.com/denoland/deno/issues/5216) at the moment. You
|
|
can instead use the `URL` constructor and `import.meta.url` to easily create a
|
|
specifier for some nearby script.
|
|
|
|
```ts
|
|
// 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**
|
|
|
|
```ts
|
|
new Worker(new URL("worker.ts", import.meta.url).href, { type: "module" });
|
|
```
|
|
|
|
**worker.ts**
|
|
|
|
```ts
|
|
console.log("hello world");
|
|
self.close();
|
|
```
|
|
|
|
```shell
|
|
$ 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**
|
|
|
|
```ts
|
|
new Worker("https://example.com/worker.ts", { type: "module" });
|
|
```
|
|
|
|
**worker.ts** (at https[]()://example.com/worker.ts)
|
|
|
|
```ts
|
|
console.log("hello world");
|
|
self.close();
|
|
```
|
|
|
|
```shell
|
|
$ 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](./stability.md).
|
|
|
|
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**
|
|
|
|
```ts
|
|
const worker = new Worker(new URL("worker.js", import.meta.url).href, {
|
|
type: "module",
|
|
deno: true,
|
|
});
|
|
worker.postMessage({ filename: "./log.txt" });
|
|
```
|
|
|
|
**worker.js**
|
|
|
|
```ts
|
|
self.onmessage = async (e) => {
|
|
const { filename } = e.data;
|
|
const text = await Deno.readTextFile(filename);
|
|
console.log(text);
|
|
self.close();
|
|
};
|
|
```
|
|
|
|
**log.txt**
|
|
|
|
```
|
|
hello world
|
|
```
|
|
|
|
```shell
|
|
$ 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.
|