From b4b138a2b57f3a602d20247d9b9bf73aec83ffe0 Mon Sep 17 00:00:00 2001 From: Samuel Macleod Date: Mon, 9 Dec 2024 16:59:03 +0000 Subject: [PATCH 1/8] initial import --- .../workers/miniflare/core/compatibility.mdx | 34 ++ .../docs/workers/miniflare/core/fetch.md | 105 ++++ .../docs/workers/miniflare/core/index.mdx | 6 + .../docs/workers/miniflare/core/modules.md | 72 +++ .../miniflare/core/multiple-workers.md | 122 +++++ .../docs/workers/miniflare/core/queues.md | 73 +++ .../docs/workers/miniflare/core/scheduled.md | 73 +++ .../docs/workers/miniflare/core/standards.md | 168 +++++++ .../miniflare/core/variables-secrets.md | 81 +++ .../workers/miniflare/core/web-assembly.md | 70 +++ .../workers/miniflare/core/web-sockets.md | 100 ++++ .../developing/debugger-webstorm-node-add.png | Bin 0 -> 5675 bytes .../developing/debugger-webstorm-node-run.png | Bin 0 -> 11422 bytes .../developing/debugger-webstorm-npm.png | Bin 0 -> 26157 bytes .../developing/debugger-webstorm-settings.png | Bin 0 -> 57702 bytes .../workers/miniflare/developing/debugger.md | 70 +++ .../workers/miniflare/developing/index.md | 6 + .../miniflare/developing/live-reload.md | 35 ++ .../miniflare/developing/source-maps.md | 47 ++ .../workers/miniflare/get-started/index.md | 466 ++++++++++++++++++ .../miniflare/get-started/migrating.md | 247 ++++++++++ src/content/docs/workers/miniflare/index.mdx | 51 ++ .../docs/workers/miniflare/storage/cache.md | 108 ++++ .../docs/workers/miniflare/storage/d1.md | 46 ++ .../miniflare/storage/durable-objects.md | 214 ++++++++ .../docs/workers/miniflare/storage/index.md | 6 + .../docs/workers/miniflare/storage/kv.md | 109 ++++ .../docs/workers/miniflare/storage/r2.md | 69 +++ .../docs/workers/miniflare/storage/sites.md | 71 +++ 29 files changed, 2449 insertions(+) create mode 100644 src/content/docs/workers/miniflare/core/compatibility.mdx create mode 100644 src/content/docs/workers/miniflare/core/fetch.md create mode 100644 src/content/docs/workers/miniflare/core/index.mdx create mode 100644 src/content/docs/workers/miniflare/core/modules.md create mode 100644 src/content/docs/workers/miniflare/core/multiple-workers.md create mode 100644 src/content/docs/workers/miniflare/core/queues.md create mode 100644 src/content/docs/workers/miniflare/core/scheduled.md create mode 100644 src/content/docs/workers/miniflare/core/standards.md create mode 100644 src/content/docs/workers/miniflare/core/variables-secrets.md create mode 100644 src/content/docs/workers/miniflare/core/web-assembly.md create mode 100644 src/content/docs/workers/miniflare/core/web-sockets.md create mode 100644 src/content/docs/workers/miniflare/developing/debugger-webstorm-node-add.png create mode 100644 src/content/docs/workers/miniflare/developing/debugger-webstorm-node-run.png create mode 100644 src/content/docs/workers/miniflare/developing/debugger-webstorm-npm.png create mode 100644 src/content/docs/workers/miniflare/developing/debugger-webstorm-settings.png create mode 100644 src/content/docs/workers/miniflare/developing/debugger.md create mode 100644 src/content/docs/workers/miniflare/developing/index.md create mode 100644 src/content/docs/workers/miniflare/developing/live-reload.md create mode 100644 src/content/docs/workers/miniflare/developing/source-maps.md create mode 100644 src/content/docs/workers/miniflare/get-started/index.md create mode 100644 src/content/docs/workers/miniflare/get-started/migrating.md create mode 100644 src/content/docs/workers/miniflare/index.mdx create mode 100644 src/content/docs/workers/miniflare/storage/cache.md create mode 100644 src/content/docs/workers/miniflare/storage/d1.md create mode 100644 src/content/docs/workers/miniflare/storage/durable-objects.md create mode 100644 src/content/docs/workers/miniflare/storage/index.md create mode 100644 src/content/docs/workers/miniflare/storage/kv.md create mode 100644 src/content/docs/workers/miniflare/storage/r2.md create mode 100644 src/content/docs/workers/miniflare/storage/sites.md diff --git a/src/content/docs/workers/miniflare/core/compatibility.mdx b/src/content/docs/workers/miniflare/core/compatibility.mdx new file mode 100644 index 000000000000000..13a4857383ebcee --- /dev/null +++ b/src/content/docs/workers/miniflare/core/compatibility.mdx @@ -0,0 +1,34 @@ +--- +order: 8 +title: "๐Ÿ“… Compatibility Dates" +--- + +- [Compatibility Dates Reference](https://developers.cloudflare.com/workers/platform/compatibility-dates) + +## Compatibility Dates + +Miniflare uses compatibility dates to opt-into backwards-incompatible changes +from a specific date. If one isn't set, it will default to some time far in the +past. + +import ConfigTabs from "../components/mdx/config-tabs"; + +```js +const mf = new Miniflare({ + compatibilityDate: "2021-11-12", +}); +``` + +## Compatibility Flags + +Miniflare also lets you opt-in/out of specific changes using compatibility +flags: + +```js +const mf = new Miniflare({ + compatibilityFlags: [ + "formdata_parser_supports_files", + "durable_object_fetch_allows_relative_url", + ], +}); +``` diff --git a/src/content/docs/workers/miniflare/core/fetch.md b/src/content/docs/workers/miniflare/core/fetch.md new file mode 100644 index 000000000000000..d2dff7dbd571b60 --- /dev/null +++ b/src/content/docs/workers/miniflare/core/fetch.md @@ -0,0 +1,105 @@ +--- +order: 0 +title: "๐Ÿ“จ Fetch Events" +--- + +- [`FetchEvent` Reference](https://developers.cloudflare.com/workers/runtime-apis/fetch-event) +- [`FetchEvent` Lifecycle](https://developers.cloudflare.com/workers/learning/fetch-event-lifecycle) +- [`addEventListener` Reference](https://developers.cloudflare.com/workers/runtime-apis/add-event-listener) + +## HTTP Requests + +Whenever an HTTP request is made, a `Request` object is dispatched to your worker, then the generated `Response` is returned. The +`Request` object will include a +[`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request#incomingrequestcfproperties). +Miniflare will log the method, path, status, and the time it took to respond. + +If the worker throws an error whilst generating a response, an error page +containing the stack trace is returned instead. You can use +[๐Ÿ—บ Source Maps](/developing/source-maps) to make these point to your source +files. + +## Dispatching Events + +When using the API, the `dispatchFetch` function can be used to dispatch `fetch` +events to your worker. This can be used for testing responses. `dispatchFetch` +has the same API as the regular `fetch` method: it either takes a `Request` +object, or a URL and optional `RequestInit` object: + +```js +import { Miniflare, Request } from "miniflare"; + +const mf = new Miniflare({ + modules: true, + script: ` + export default { + async fetch(request, env, ctx) { + const body = JSON.stringify({ + url: event.request.url, + header: event.request.headers.get("X-Message"), + }); + return new Response(body, { + headers: { "Content-Type": "application/json" }, + }); + }) + } + `, +}); + +let res = await mf.dispatchFetch("http://localhost:8787/"); +console.log(await res.json()); // { url: "http://localhost:8787/", header: null } + +res = await mf.dispatchFetch("http://localhost:8787/1", { + headers: { "X-Message": "1" }, +}); +console.log(await res.json()); // { url: "http://localhost:8787/1", header: "1" } + +res = await mf.dispatchFetch( + new Request("http://localhost:8787/2", { + headers: { "X-Message": "2" }, + }), +); +console.log(await res.json()); // { url: "http://localhost:8787/2", header: "2" } +``` + +When dispatching events, you are responsible for adding +[`CF-*` headers](https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-) +and the +[`cf` object](https://developers.cloudflare.com/workers/runtime-apis/request#incomingrequestcfproperties). +This lets you control their values for testing: + +```js +const res = await mf.dispatchFetch("http://localhost:8787", { + headers: { + "CF-IPCountry": "GB", + }, + cf: { + country: "GB", + }, +}); +``` + +## Upstream + +Miniflare will call each `fetch` listener until a response is returned. If no +response is returned, or an exception is thrown and `passThroughOnException()` +has been called, the response will be fetched from the specified upstream +instead: + +```js +import { Miniflare } from "miniflare"; + +const mf = new Miniflare({ + script: ` + addEventListener("fetch", (event) => { + event.passThroughOnException(); + throw new Error(); + }); + `, + upstream: "https://miniflare.dev", +}); +// If you don't use the same upstream URL when dispatching, Miniflare will +// rewrite it to match the upstream +const res = await mf.dispatchFetch("https://miniflare.dev/core/fetch"); +console.log(await res.text()); // Source code of this page +``` diff --git a/src/content/docs/workers/miniflare/core/index.mdx b/src/content/docs/workers/miniflare/core/index.mdx new file mode 100644 index 000000000000000..15e8983230032bb --- /dev/null +++ b/src/content/docs/workers/miniflare/core/index.mdx @@ -0,0 +1,6 @@ +--- +title: Core +order: 2 +--- + + diff --git a/src/content/docs/workers/miniflare/core/modules.md b/src/content/docs/workers/miniflare/core/modules.md new file mode 100644 index 000000000000000..5256ab88a635405 --- /dev/null +++ b/src/content/docs/workers/miniflare/core/modules.md @@ -0,0 +1,72 @@ +--- +order: 3 +title: "๐Ÿ“š Modules" +--- + +- [Modules Reference](https://developers.cloudflare.com/workers/cli-wrangler/configuration#modules) + +## Enabling Modules + +Miniflare supports both the traditional `service-worker` and newer `modules` +formats for writing workers. To use the `modules` format, enable it with: + +```js +const mf = new Miniflare({ + modules: true, +}); +``` + +You can now use `modules` worker scripts like the following: + +```js +export default { + async fetch(request, env, ctx) { + // - `request` is the incoming `Request` instance + // - `env` contains bindings, KV namespaces, Durable Objects, etc + // - `ctx` contains `waitUntil` and `passThroughOnException` methods + return new Response("Hello Miniflare!"); + }, + async scheduled(controller, env, ctx) { + // - `controller` contains `scheduledTime` and `cron` properties + // - `env` contains bindings, KV namespaces, Durable Objects, etc + // - `ctx` contains the `waitUntil` method + console.log("Doing something scheduled..."); + }, +}; +``` + + + +## Module Rules + +Miniflare supports all module types: `ESModule`, `CommonJS`, `Text`, `Data` and +`CompiledWasm`. You can specify additional module resolution rules as follows: + +```js +const mf = new Miniflare({ + modulesRules: [ + { type: "ESModule", include: ["**/*.js"], fallthrough: true }, + { type: "Text", include: ["**/*.txt"] }, + ], +}); +``` + +### Default Rules + +The following rules are automatically added to the end of your modules rules +list. You can override them by specifying rules matching the same `globs`: + +```toml +[[build.upload.rules]] +type = "ESModule" +globs = ["**/*.mjs"] +[[build.upload.rules]] +type = "CommonJS" +globs = ["**/*.js", "**/*.cjs"] +``` diff --git a/src/content/docs/workers/miniflare/core/multiple-workers.md b/src/content/docs/workers/miniflare/core/multiple-workers.md new file mode 100644 index 000000000000000..d8a2aedc1f71c41 --- /dev/null +++ b/src/content/docs/workers/miniflare/core/multiple-workers.md @@ -0,0 +1,122 @@ +--- +order: 9 +title: "๐Ÿ”Œ Multiple Workers" +--- + +Miniflare allows you to run multiple workers in the same instance. All Workers can be defined at the same level, using the `workers` option. + +Here's an example that uses a service binding to increment a value in a shared KV namespace: + +```js +import { Miniflare, Response } from "miniflare"; + +const message = "The count is "; +const mf = new Miniflare({ + // Options shared between workers such as HTTP and persistence configuration + // should always be defined at the top level. + host: "0.0.0.0", + port: 8787, + kvPersist: true, + + workers: [ + { + name: "worker", + kvNamespaces: { COUNTS: "counts" }, + serviceBindings: { + INCREMENTER: "incrementer", + // Service bindings can also be defined as custom functions, with access + // to anything defined outside Miniflare. + async CUSTOM(request) { + // `request` is the incoming `Request` object. + return new Response(message); + }, + }, + modules: true, + script: `export default { + async fetch(request, env, ctx) { + // Get the message defined outside + const response = await env.CUSTOM.fetch("http://host/"); + const message = await response.text(); + + // Increment the count 3 times + await env.INCREMENTER.fetch("http://host/"); + await env.INCREMENTER.fetch("http://host/"); + await env.INCREMENTER.fetch("http://host/"); + const count = await env.COUNTS.get("count"); + + return new Response(message + count); + } + }`, + }, + { + name: "incrementer", + // Note we're using the same `COUNTS` namespace as before, but binding it + // to `NUMBERS` instead. + kvNamespaces: { NUMBERS: "counts" }, + // Worker formats can be mixed-and-matched + script: `addEventListener("fetch", (event) => { + event.respondWith(handleRequest()); + }) + async function handleRequest() { + const count = parseInt((await NUMBERS.get("count")) ?? "0") + 1; + await NUMBERS.put("count", count.toString()); + return new Response(count.toString()); + }`, + }, + ], +}); +const res = await mf.dispatchFetch("http://localhost"); +console.log(await res.text()); // "The count is 3" +await mf.dispose(); +``` + +## Routing + +You can enable routing by specifying `routes` via the API, +using the +[standard route syntax](https://developers.cloudflare.com/workers/platform/routes#matching-behavior). +Note port numbers are ignored: + +```js +const mf = new Miniflare({ + workers: [ + { + scriptPath: "./api/worker.js", + routes: ["http://127.0.0.1/api*", "api.mf/*"], + }, + ], +}); +``` + +When using hostnames that aren't `localhost` or `127.0.0.1`, you +may need to edit your computer's `hosts` file, so those hostnames resolve to +`localhost`. On Linux and macOS, this is usually at `/etc/hosts`. On Windows, +it's at `C:\Windows\System32\drivers\etc\hosts`. For the routes above, we would +need to append the following entries to the file: + +``` +127.0.0.1 miniflare.test +127.0.0.1 api.mf +``` + +Alternatively, you can customise the `Host` header when sending the request: + +```sh +# Dispatches to the "api" worker +$ curl "http://localhost:8787/todos/update/1" -H "Host: api.mf" +``` + +When using the API, Miniflare will use the request's URL to determine which +worker to dispatch to. + +```js +// Dispatches to the "api" worker +const res = await mf.dispatchFetch("http://api.mf/todos/update/1", { ... }); +``` + +## Durable Objects + +Miniflare supports the `script_name` option for accessing Durable Objects +exported by other scripts. See +[๐Ÿ“Œ Durable Objects](/storage/durable-objects#using-a-class-exported-by-another-script) +for more details. diff --git a/src/content/docs/workers/miniflare/core/queues.md b/src/content/docs/workers/miniflare/core/queues.md new file mode 100644 index 000000000000000..1f26b5d5b25f561 --- /dev/null +++ b/src/content/docs/workers/miniflare/core/queues.md @@ -0,0 +1,73 @@ +--- +order: 8 +title: "๐Ÿšฅ Queues" +--- + +- [Queues Reference](https://developers.cloudflare.com/queues/) + +## Producers + +Specify Queue producers to add to your environment as follows: + +```js +const mf = new Miniflare({ + queueProducers: { MY_QUEUE: "my-queue" }, + queueProducers: ["MY_QUEUE"], // If binding and queue names are the same +}); +``` + +## Consumers + +Specify Workers to consume messages from your Queues as follows: + +```js +const mf = new Miniflare({ + queueConsumers: { + "my-queue": { + maxBatchSize: 5, // default: 5 + maxBatchTimeout: 1 /* second(s) */, // default: 1 + maxRetries: 2, // default: 2 + deadLetterQueue: "my-dead-letter-queue", // default: none + }, + }, + queueConsumers: ["my-queue"], // If using default consumer options +}); +``` + +## Manipulating Outside Workers + +For testing, it can be valuable to interact with Queues outside a Worker. You can do this by using the [`workers` option](/core/multiple-workers) to run multiple Workers in the same instance: + +```js +const mf = new Miniflare({ + workers: [ + { + name: "a", + modules: true, + script: ` + export default { + async fetch(request, env, ctx) { + await env.QUEUE.send(await request.text()); + } + } + `, + queueProducers: { QUEUE: "my-queue" }, + }, + { + name: "b", + modules: true, + script: ` + export default { + async queue(batch, env, ctx) { + console.log(batch); + } + } + `, + queueConsumers: { "my-queue": { maxBatchTimeout: 1 } }, + }, + ], +}); + +const queue = await mf.getQueueProducer("QUEUE", "a"); // Get from worker "a" +await queue.send("message"); // Logs "message" 1 second later +``` diff --git a/src/content/docs/workers/miniflare/core/scheduled.md b/src/content/docs/workers/miniflare/core/scheduled.md new file mode 100644 index 000000000000000..64a138d6720040d --- /dev/null +++ b/src/content/docs/workers/miniflare/core/scheduled.md @@ -0,0 +1,73 @@ +--- +order: 1 +title: "โฐ Scheduled Events" +--- + +- [`ScheduledEvent` Reference](https://developers.cloudflare.com/workers/runtime-apis/scheduled-event) +- [`addEventListener` Reference](https://developers.cloudflare.com/workers/runtime-apis/add-event-listener) + +## Cron Triggers + +`scheduled` events are automatically dispatched according to the specified cron +triggers: + +```js +const mf = new Miniflare({ + crons: ["15 * * * *", "45 * * * *"], +}); +``` + +## HTTP Triggers + +Because waiting for cron triggers is annoying, you can also make HTTP requests +to `/cdn-cgi/mf/scheduled` to trigger `scheduled` events: + +```sh +$ curl "http://localhost:8787/cdn-cgi/mf/scheduled" +``` + +To simulate different values of `scheduledTime` and `cron` in the dispatched +event, use the `time` and `cron` query parameters: + +```sh +$ curl "http://localhost:8787/cdn-cgi/mf/scheduled?time=1000" +$ curl "http://localhost:8787/cdn-cgi/mf/scheduled?cron=*+*+*+*+*" +``` + +## Dispatching Events + +When using the API, the `getWorker` function can be used to dispatch +`scheduled` events to your worker. This can be used for testing responses. It +takes optional `scheduledTime` and `cron` parameters, which default to the +current time and the empty string respectively. It will return a promise which +resolves to an array containing data returned by all waited promises: + +```js +import { Miniflare } from "miniflare"; + +const mf = new Miniflare({ + modules: true, + script: ` + export default { + async scheduled(controller, env, ctx) { + const lastScheduledController = controller; + if (controller.cron === "* * * * *") controller.noRetry(); + } + } + `, +}); + +const worker = await mf.getWorker(); + +let scheduledResult = await worker.scheduled({ + cron: "* * * * *", +}); +console.log(scheduledResult); // { outcome: 'ok', noRetry: true } + +scheduledResult = await worker.scheduled({ + scheduledTime: new Date(1000), + cron: "30 * * * *", +}); + +console.log(scheduledResult); // { outcome: 'ok', noRetry: false } +``` diff --git a/src/content/docs/workers/miniflare/core/standards.md b/src/content/docs/workers/miniflare/core/standards.md new file mode 100644 index 000000000000000..8aa7b7814583e80 --- /dev/null +++ b/src/content/docs/workers/miniflare/core/standards.md @@ -0,0 +1,168 @@ +--- +order: 6 +title: "๐Ÿ•ธ Web Standards" +--- + +- [Web Standards Reference](https://developers.cloudflare.com/workers/runtime-apis/web-standards) +- [Encoding Reference](https://developers.cloudflare.com/workers/runtime-apis/encoding) +- [Fetch Reference](https://developers.cloudflare.com/workers/runtime-apis/fetch) +- [Request Reference](https://developers.cloudflare.com/workers/runtime-apis/request) +- [Response Reference](https://developers.cloudflare.com/workers/runtime-apis/response) +- [Streams Reference](https://developers.cloudflare.com/workers/runtime-apis/streams) +- [Using Streams](https://developers.cloudflare.com/workers/learning/using-streams) +- [Web Crypto Reference](https://developers.cloudflare.com/workers/runtime-apis/web-crypto) + +## Mocking Outbound `fetch` Requests + +When using the API, Miniflare allows you to substitute custom `Response`s for +`fetch()` calls using `undici`'s +[`MockAgent` API](https://undici.nodejs.org/#/docs/api/MockAgent?id=mockagentgetorigin). +This is useful for testing workers that make HTTP requests to other services. To +enable `fetch` mocking, create a +[`MockAgent`](https://undici.nodejs.org/#/docs/api/MockAgent?id=mockagentgetorigin) +using the `createFetchMock()` function, then set this using the `fetchMock` +option. If you're using the +[๐Ÿคน Jest Environment](/testing/jest#mocking-outbound-fetch-requests), use the +global `getMiniflareFetchMock()` function to obtain a correctly set-up +[`MockAgent`](https://undici.nodejs.org/#/docs/api/MockAgent?id=mockagentgetorigin). + +```js +import { Miniflare, createFetchMock } from "miniflare"; + +// Create `MockAgent` and connect it to the `Miniflare` instance +const fetchMock = createFetchMock(); +const mf = new Miniflare({ + modules: true, + script: ` + export default { + async fetch(request, env, ctx) { + const res = await fetch("https://example.com/thing"); + const text = await res.text(); + return new Response(\`response:\${text}\`); + } + } + `, + fetchMock, +}); + +// Throw when no matching mocked request is found +// (see https://undici.nodejs.org/#/docs/api/MockAgent?id=mockagentdisablenetconnect) +fetchMock.disableNetConnect(); + +// Mock request to https://example.com/thing +// (see https://undici.nodejs.org/#/docs/api/MockAgent?id=mockagentgetorigin) +const origin = fetchMock.get("https://example.com"); +// (see https://undici.nodejs.org/#/docs/api/MockPool?id=mockpoolinterceptoptions) +origin + .intercept({ method: "GET", path: "/thing" }) + .reply(200, "Mocked response!"); + +const res = await mf.dispatchFetch("http://localhost:8787/"); +console.log(await res.text()); // "response:Mocked response!" +``` + +## Subrequests + +Miniflare does not support limiting the amount of +[subrequests](https://developers.cloudflare.com/workers/platform/limits#account-plan-limits). +Please keep this in mind if you make a large amount of subrequests from your +Worker. + +## Global Functionality Limits + +To match the +[behaviour of the Workers runtime](https://developers.cloudflare.com/workers/runtime-apis/request/#the-request-context), +some functionality, such as asynchronous I/O (`fetch`, Cache API, KV), timeouts +(`setTimeout`, `setInterval`), and generating cryptographically-secure random +values (`crypto.getRandomValues`, `crypto.subtle.generateKey`), can only be +performed while handling a request, not in the global scope. + +KV namespaces and caches returned from `Miniflare#getKVNamespace()` and +`Miniflare#getCaches()` are unaffected by this limit, so they can still be used +in tests without setting any additional options. + +## `instanceof`, `constructor` and `prototype` Checks + +Miniflare overrides `instanceof` checks for primitive classes like `Object` so +they succeed for values created both inside and outside the Miniflare sandbox +(in a different JavaScript realm). This ensures dynamic type checking often +performed by WebAssembly glue code (e.g. `wasm-bindgen`) always succeeds. Note +that values returned by Workers runtime APIs are created outside the Miniflare +sandbox. See +[this file](https://github.com/cloudflare/miniflare/blob/master/packages/runner-vm/src/instanceof.ts) +for more details. + +Primitive classes in this case are defined as JavaScript built-ins that can be +instantiated by something other than their constructor (e.g. literals, +`function`s, runtime errors): + +- `Object` +- `Function` +- `Array` +- `Promise` +- `RegExp` +- `Error`, `EvalError`, `RangeError`, `ReferenceError`, `SyntaxError`, + `TypeError`, `URIError` + +Primitive `constructor` and `prototype` checks cannot be trapped easily and so +will fail for values created outside the Miniflare sandbox. + +```js +import { Miniflare } from "miniflare"; + +const mf = new Miniflare({ + bindings: { + OBJECT: { a: 1 }, + ARRAY: new Uint8Array([1, 2, 3]), + }, + modules: true, + script: ` + export default { + async fetch(request, env, ctx) { + console.log({ a: 1 } instanceof Object); // โœ… true + console.log(new Uint8Array([1, 2, 3]) instanceof Object); // โœ… true + console.log({ a: 1 }.constructor === Object); // โœ… true + console.log(Object.getPrototypeOf({ a: 1 }) === Object.prototype); // โœ… true + + console.log(env.OBJECT instanceof Object); // โœ… true + console.log(env.ARRAY instanceof Object); // โœ… true + console.log(env.OBJECT.constructor === Object); // โŒ false + console.log(Object.getPrototypeOf(env.OBJECT) === Object.prototype); // โŒ false + + throw new Error("oops!"); + } + } + `, +}); + +try { + await mf.dispatchFetch("http://localhost"); +} catch (e) { + console.log(e instanceof Error); // โŒ false +} +``` + +By default, primitive `instanceof` checks outside the Miniflare sandbox will +fail for values created inside the sandbox (e.g. checking types of thrown +exceptions in tests). To fix this, pass the primitive class in from Node.js as a +custom global. Note this will cause primitive `instanceof` checks to fail for +values created without the constructor inside the sandbox. + +```js +const mf = new Miniflare({ + modules: true, + script: ` + export default { + async fetch(request, env, ctx) { + throw new Error("oops!"); + } + } + `, +}); + +try { + await mf.dispatchFetch("http://localhost"); +} catch (e) { + console.log(e instanceof Error); // โœ… true +} +``` diff --git a/src/content/docs/workers/miniflare/core/variables-secrets.md b/src/content/docs/workers/miniflare/core/variables-secrets.md new file mode 100644 index 000000000000000..3470aa32d9ac24e --- /dev/null +++ b/src/content/docs/workers/miniflare/core/variables-secrets.md @@ -0,0 +1,81 @@ +--- +order: 2 +title: "๐Ÿ”‘ Variables and Secrets" +--- + +## Bindings + +Variable and secrets are bound as follows: + +```js +const mf = new Miniflare({ + bindings: { + KEY1: "value1", + KEY2: "value2", + }, +}); +``` + +## `.env` Files + +Variables and secrets are automatically loaded from a `.env` file in the current +directory. This is especially useful for secrets if your `.env` file is +`.gitignore`d. `.env` files look something like this: + +```toml +KEY1=value1 +# Woah, comments! +KEY2=value2 +``` + +You can also specify the path to a custom `.env` file: + +```js +const mf = new Miniflare({ + envPath: ".env.test", +}); +``` + +## Text and Data Blobs + +Text and data blobs can be loaded from files. File contents will be read and +bound as `string`s and `ArrayBuffer`s respectively. + +```js +const mf = new Miniflare({ + textBlobBindings: { TEXT: "text.txt" }, + dataBlobBindings: { DATA: "data.bin" }, +}); +``` + +## Bindings Priority + +Higher priority bindings override lower priority bindings with the same name. +The order (from lowest to highest priority) is: + +1. Variables from `wrangler.toml` `[vars]` +2. Variables from `.env` files +3. WASM module bindings (`--wasm`, `[wasm_modules]`) +4. Text blob bindings (`--text-blob`, `[text_blobs]`) +5. Data blob bindings (`--data-blob`, `[data_blobs]`) +6. Custom bindings (`--binding`, `bindings`) + +## Globals + +Injecting arbitrary globals is not supported by [workerd](https://github.com/cloudflare/workerd). If you're using a service worker, bindings will be injected as globals, but these must be JSON-serialisable. + + diff --git a/src/content/docs/workers/miniflare/core/web-assembly.md b/src/content/docs/workers/miniflare/core/web-assembly.md new file mode 100644 index 000000000000000..e18fa34c47be6ae --- /dev/null +++ b/src/content/docs/workers/miniflare/core/web-assembly.md @@ -0,0 +1,70 @@ +--- +order: 5 +title: "โš™๏ธ WebAssembly" +--- + +## Bindings + +WebAssembly modules are bound as follows. The bound keys will be instances of +[WebAssembly.Module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module): + +```js +const mf = new Miniflare({ + wasmBindings: { + MODULE1: "module1.wasm", + MODULE2: "module2.wasm", + }, +}); +``` + +You can then use the WebAssembly modules in your workers: + +```js +--- +highlight: [1,5] +--- +const instance = new WebAssembly.Instance(MODULE1); + +addEventListener("fetch", (e) => { + // Assuming MODULE1 exports a function `add` summing 2 integer arguments + const value = instance.exports.add(1, 2); + e.respondWith(new Response(value.toString())); +}); +``` + +## Modules + +You can also import WebAssembly modules by adding a `CompiledWasm` module rule. +See [๐Ÿ“š Modules](/core/modules) for more details. For instance, with the +following `wrangler.toml` file and worker script, we can achieve the same result +as the previous example: + +```toml +--- +filename: wrangler.toml +--- +[[build.upload.rules]] +type = "CompiledWasm" +globs = ["**/*.wasm"] +``` + +```js +--- +highlight: [1,2,3,7] +--- +import module1 from "./module1.wasm"; + +const instance = new WebAssembly.Instance(module1); + +export default { + fetch() { + const value = instance.exports.add(1, 2); + return new Response(value.toString()); + }, +}; +``` + +## Rust Wrangler Builds + +When using [Rust Wrangler Builds](/developing/builds#rust), `wasm` is +automatically bound to your compiled WebAssembly module. diff --git a/src/content/docs/workers/miniflare/core/web-sockets.md b/src/content/docs/workers/miniflare/core/web-sockets.md new file mode 100644 index 000000000000000..d013b35d257baba --- /dev/null +++ b/src/content/docs/workers/miniflare/core/web-sockets.md @@ -0,0 +1,100 @@ +--- +order: 4 +title: "โœ‰๏ธ WebSockets" +--- + +- [WebSockets Reference](https://developers.cloudflare.com/workers/runtime-apis/websockets) +- [Using WebSockets](https://developers.cloudflare.com/workers/learning/using-websockets) + +## Server + +Miniflare will always upgrade Web Socket connections. The worker must respond +with a status `101 Switching Protocols` response including a `webSocket`. For +example, the worker below implements an echo WebSocket server: + +```js +export default { + fetch(request) { + const [client, server] = Object.values(new WebSocketPair()); + + server.accept(); + server.addEventListener("message", (event) => { + server.send(event.data); + }); + + return new Response(null, { + status: 101, + webSocket: client, + }); + }, +}; +``` + +When using `dispatchFetch`, you are responsible for handling WebSockets by using +the `webSocket` property on `Response`. As an example, if the above worker +script was stored in `echo.mjs`: + +```js +--- +highlight: [11,12,13,14,15] +--- +import { Miniflare } from "miniflare"; + +const mf = new Miniflare({ + modules: true, + scriptPath: "echo.mjs", +}); + +const res = await mf.dispatchFetch(); + +const webSocket = res.webSocket; +webSocket.accept(); +webSocket.addEventListener("message", (event) => { + console.log(event.data); +}); + +webSocket.send("Hello!"); // Above listener logs "Hello!" +``` + +## Client + +Miniflare also supports using workers as WebSocket clients too via `fetch` or +the +[standard `new WebSocket()` constructor](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket): + +```js +--- +highlight: [3,4,5] +--- +export default { + async fetch(request) { + const res = await fetch("https://echo.websocket.org", { + headers: { Upgrade: "websocket" }, + }); + + const webSocket = res.webSocket; + webSocket.accept(); + webSocket.addEventListener("message", (event) => { + console.log(event.data); + }); + + webSocket.send("Hello!"); // Above listener logs "Hello!" + + return new Response(); + }, +}; +``` + +All WebSockets are automatically closed when the worker is reloaded. + +## Validation + +Like the real Workers runtime, Miniflare will throw errors when: + +- Attempting to use a `WebSocket` in a `Response` that has already been used +- Attempting to use a `WebSocket` in a `Response` after calling `accept()` on it +- Attempting to call `WebSocket#send()` or `WebSocket#close()` without first + calling `accept()` +- Attempting to call `WebSocket#send()` after calling `close()` +- Attempting to call `WebSocket#close()` on an already closed WebSocket +- Attempting to call `WebSocket#close()` with an invalid close code diff --git a/src/content/docs/workers/miniflare/developing/debugger-webstorm-node-add.png b/src/content/docs/workers/miniflare/developing/debugger-webstorm-node-add.png new file mode 100644 index 0000000000000000000000000000000000000000..b66aa985c4fddbf799db46f1da70a8b64d6f6c9b GIT binary patch literal 5675 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%0A|v~dO^Uj}7+L-C!8Y2n`Kb6pq;yppMH4SL;=t{G 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 IN|*%v4{?3YQ~&?~ literal 0 HcmV?d00001 diff --git a/src/content/docs/workers/miniflare/developing/debugger-webstorm-settings.png b/src/content/docs/workers/miniflare/developing/debugger-webstorm-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..f055b817d6c273cfb13d195f45010e2f6faae11c GIT binary patch literal 57702 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%0DD;4g}zIIYl?9J>a^vgZUuAz-1 z-UW^yNgZ~^MJL9S9_z(U#K$0Pzb!1&@ZsTFv`4jC4Sjj!b}5S-fm2Oa#xqd1 zp`V+@*-$pKKQ@u}6_-vaccNSI?TPrTRdgjGT^2hGOC3C?~I3p`ZUTKP1Y7D)lLrnXn~H z!jzPZj!)eTiI*N;A_*-cmRj}lL8U8dPn!opkOgb`K^JEAO&s-m^zl=}^Crri(njrq zt0%#L{ihtEVs+||tt9(DY#zro3gqa#Z|zA%V_3Y0{Y9ufye%zoc&{XOXY-S?g%9=5pb$}{Y{#`LCLq|OCyXgR!P&|T6}&d>Drh3v1E^_@pY|6q-m zKM3HT;K3d$qtN+$$FMtfDs;g+q#vuim2m0zV+(j2$;5Ep&|Sx~Xx~mSBd74{F~&aP zW?6uEPS`Dr?nkICQnEdIAAz8@KwoR%t+SJ-2w7 z1RL!NSpexOX1Cl@MeeiTdmXr~jui~)<}Xr>1m#Uu!MFnp%tR~1x5OGA@OlsQBT4tO zUKeK7E0oIMuf+a&@iK2Z=bez@>|I1xt3^0E+emv-ovvxNSoHKdtdxE}R7{(8(UaT@ z3&+X`aX?$)21Xa9P*3Y{uqbv*9>`V?Na03qkP$-QXrvO5dHogcz2kuNE)IP6n>6wG}2 z92)Kiv~6A&dUvDh)&g>YjtSMs+eDY3;LqDVH{Y69TZM12VrV#!NOM!8D#Z7_x1Cc^d`5lN87tEzi`I3OwtG(#U zUSX=~ugihOT=`q0!eI-cSYozn0JvdJdYy?-k1M)H(7&cLyv%0>(+agfxx3CWV-*nZ z(%7<4njn9Rb?OK<@CfRMd*~jIXKH>NHcLcYJGN!^?~6Y4yzGhF%1RLsC#lmg_{`e{ zleZq8(6S_(_wGf*aQCli59vu8SfvaE6`E=tC%7WiaYB|=)XSc|&##2Ab+l+4YxO5# z#dZOj%p^`$k#5FLexyRj=g~qAki<*uPMpZ<{cm zw2tfY0^MwJfEA|~<|hYc^PE_EUDM7tX_X5F+CFd>A=s=OE1Vd)+uMKp!~)QKnA;Hd zm`Hhkh*7T1qBj-xIO=nIqm#FYg^VzIJJn16_KeLw{m_kCA@7rb$I!I%CluV=dRlaAHKb+Zl%A z1;l=Aw*3ZJ4@p(qGD@|YDVLY^GSI7JHlrQ=us^-0P29DT+x!X2Z(vvIxqh~foYd7X ze-$lk9hP&}Oc|Eby-7=Qc)oVl*{3uNFE~ZUL=)k@=sP`6b7-{q!m9Cd=a)bRktERv z5AyY%4-`BVqF!XWH3rp)aO6cydI4H$7xS*p+gT@z?tHbfNy=o=S%L;4vDdsYW;NlFRhbpvBhqOliDeP$+I}*6F65x)qg<4YfUEp*Vkv zYoan|^@rYaFiqvQDfu`ulyJX;EWU@?6V0H4pXpU&uA5AQ+|QA=&n62_{dRQYO=ds% z-oz1Qj`=RN)-CCDFPqW2k;p<~V?R4%Z zTHc1hvl()J7I2V6IQr33eyIBCb1d%Xi*0BQYLvJ?s%)0nU+CN*HP_on2r`(Ka&Anv z44ydmVl-#AayXdXJGy^)>{%+U9J<3p4*?vP($`147Fg1lcdV!y_DY9XVQs@DqVsQ* zv{}QE*U7d~*fPxKBB)7M|yG|8jd?Jdp9MX4(LYhU0L+X=0Dg=fKf*9;qg^ zQ6^p+u)&e!K< z;O=YLS|o1%J7q(ixknHg6b*0DQ&Q|US^Z_hnWFtMC+2rc#m7-O>FbVl*hd|TqWg%3 zg;|{ZF$v9*zR5eiC&k8eTiO7z2TbnA+KJEGVyWH7HPdOMeGVh$xqCSU$h`D8xMJKl zncmStX%5pm&cjYq1xId=-Dlj{8~uz_Iu{v6{iGl}x3H6+ulleeY|f`EdT$-9M`i=v zCfXdvJf8;qQzy2gU8ct`9%s}!hRx+HmI#X8_}V5_J?3!*svB3}*XhXN)?&e+!>KTD z66|-F5frP2i;t#xQ!%$({=itM5$qs+B;utFPk3V(ot`zjv+HYKyEv4B6f&h^?c+I+3&>}USzxrKK)>cX$;%ct2V4pxmv)J29&RANHyO;00iiMz#;mp08tFTJgZrvLn5cC{))hL$s zh27J;J06S?Z;A|;Yr;={7XX7~5s4b$7Z?D^?M&IA3b_6tn(IerQ)rfQf*qKQ=85zh zmPYKJ6mwC+*K7JVy#Hn)ZR`Qy>uxoy=jQqoLh7@o5*fF%)_(=xz+oM60&wWyKy%g4 zSpUs}0(n6gh#rzbcJSXEGvtaWA^;&K>odbF=HJQmRv`5W+Z|m0cc$|Pq=qlXYl_Cd z3v8ia0|;R&2jkygB!B_I7JsxEs{VaCG=#~5O}Y7>;RApXUrB&`ssc;m{-3Ihe{!}0 zdN6C7Ln+gQYATR}k7U1XtGFby_U!da!N`mJG*Eyz{Bel(7ujMP8RcP6HoRC{TUY|5L-jtNctVqd^AEi z-Ipc7fK=Ah{3sF-#qS&)A@4E~kF?eG+B3vt;^8331J=o( zE)a@Z24iEc8FYSr-l=xP>&(u`sK7J^t9J1W1w#Eq*1qsxR+3W{=>5CL$5F%QEIy^j#l5hVg|1uLjAD6(l;eSFN zE28MwiX8q1Xj2c*!Y+jDjn^bpP-$J|sla)WQs*E;B5G?>9xv zev2MPi(-oD%{G&hQl50w$kjnic=&Lc6TixJ0-!VkWXZvDB?Sf1-xB&e`Wa{X^#i!; zV#9}`g2AWKb$j*w=5{4x$|*w`Y@#I-wcuJz;stB^zqE^6WQhZDdfgLF~xQ( zE16|KzB)a+jNNaO>PEMZW;wKbe(T(8B0c7@JO2r|_KT^hzf@AMvWNZVf6Z|-*UX$_ z7|NGseZ=N+n5s;cP{P(vxWxB^#+%bmSC#&K6mL&KD#>+8J-T66lm2YOl^+#4JV@wG zTOU_aac!;jFQ(5bd9PjpHDxpQ7dFms_3wgv2(k83ns9fb394j8Y~Q+X)r#07kV~ zi#Tf{=5Yy@u)hy@M$QTJ%}Sd~d}7oSq#m1tv!BIm25xJu`pBs02IFWm(&L(Y3PbVj z^WOB|=EN91R4}=of$3k)vdJ~KqqJq<=SOM>Sr^xOMcVQq`P2EuM0>Q{90c$`n95h? z=bLUOmXcebAg6{lQ2D{0fPcf&fU!Ck7uR}caLibNJrjYKO|vvrip2*_K|x=LG!K>Z zAbIONiMhgl+C&yzG=eVj#TkeK;z3%tWRP0;vuI+{>vSV3h#*o1;MWZ#;75o|15TW_ zw?}|gJ^RKt%FqPzZ&-c3sH6@$5`_?pNuoF2XZuHK7h8DX zF|isADGu{9oZa0+F+a5zsmSOno`EN%Srle5$Z@sQS-uxlAczaYz#@_{*z{DOl#e@qUFX?JWRSw5JZ>(5awnOFT#P{ar zOKuHUHofvbqm%RdOOfS#=`|bHHcEc4>@6HTbop3$@p8YhbJ2=)AMK;46{yKRd;8eC zY)tcfz3mGu0r5~dIkx3DI4EKw82{Ei@@FES^zEYKd>pC0?}81))T6$Amtw7!B%ZDJ zY^> z)+z->#ldO(Ks3*YxQG;lQ&T;gNDU3mIDKWUkA@DgQgybcx zmxa$?<=oudCdkO|!rnXL?1(b6S!L^}>=sdDdt=j-T{rZDKs;iAF}k2cQ%|d=`<47t z>$9}GUGrUVgG*X+yXGsOM_bs z%-z95nmkS!@_;i8b$|ch_YdLx1trDG8?|cikGJ}m7v)0Dv9_i2$X!{qRI-ld4*LDY z?gmah)sB6`YCiZW<1U^-lr^KMu_$jhoaD-MkLU5BRaUSnk%CNh(-taC=)2AmNaM$F zadDeedJwHR-x!yMNo1m+Knn@Lz5gZv;A0`JwX=$oo=0gMRttoEDxd6M2AAi7MR67g zju*p>yx+^XqrW5i$<4)P{4pgJ(eO+uE9pB2AVO4}vUvy8zu=USl~t7F_wdg|F=xC2 zJ>|^za&12DZ$vleoeI`4q--ddU|AXuFq2VoYf^Rh))^|}7zbeLgUi?FR2TEMx2r#@ zpCD~8C>0SHltRN5q5$)30wY2Kdz~nM-|x(?XL)5MQlU0$ygU@-KAp0gTx)B+fZ<2^ zoHRUGOhYmi^*FaN$?BVG-gDAn3zV6%wL$O0U-y(hyWu7=!}&Mv>6S>A4T=@LMw0KIq$moP1}WcS>6q5 ztiXmI9og1Mn!R|>Hf+imvaW_){PVl#1nv8UAMb5H3v2E;xU2A4(Y=$8h#+_CZC!bG zFjpTFQU@|7$9`i#3kUrrG=iJ*O-uhpb8+#NshB#I<-EoZkD^a;wG}>4u~R%w3ZGY7 zl3rLLcF2i-?62}`;@JrKqKr@^bia$0H>k{;&cAU<>T>^SFg!H$r<+Y%EB54+i8Xl1 zpo3VRf$b!fBG35eyXnpN&7#Co8QzSXOvWv;tNt_sw?V2gy2WjIL3^>Q&GCRe{CMJ3 z5Za)xxw*^8CTmj=Zv~f2%*b&1g^ERNCaneNy`b$&G)`2=z-VHEhHLfPK;dh6>#CHc zkF+U7Fg0~|6(`5w=ZB;mtMvR%PgL{++K)5TXU?mNac;S2H7@NU`hH)^EV;p(vDGe^yqL;u2!O|;cx7$d56Y1wjNpGai@5>&GksB> z;Su@d&cX5O*T!w(y{il1m6Ru8;Z$Qc4#D@q$83*RiuU2WE6{;YTIj!9+`@OW1YlVyL5|3&xs{M^3O^I>Rbyx{)GWZ0!RPcbVPbB2bL z3Io!SMHo;p#;dR;@bcLjoWd}%(C^;Jf2J?XFud`7IPVi9%r`QAr@_u~tMdwDv;Xvq zi?`4r?>WYgV2ZwJkP@_C9rWY!JI3dN>)lW}UO%_lK*V{2pVgfvJQ$76t) zi0LW%8{h68hftXF;O|GoSqp`N!M%mS^^LP|Zi24eB@bjsa33Ti*6vbDxE zc94%WPfF%(V{_``AfuD5%o8sd&+c)KR8lSsERFhth2xZ$7spv66ra`a$a%*16k$tu zlqmz5c}_b0LVw<{`Mz2WT}r_(ij9_$I2?p`+ezud_|;AZ4tQA}M+@laAX!_i9xuA% z%f}+q)0E7dw<(wThhmtj={sTGN2pm~$-iR{LROYnRYf)l{H!oFN|?cu$tHE%W0KLx zR#`Mn)fYT5JKJ33uEQ?(elg?mf`0PDGX(tiARE%rwL-0FX2Poz82znFrrYx~`iblg ztv9`{495$-f`Ky=FHG09UKD-bZ-2KHp=U8NIQ*__=E4h@meq%fx_2G+9pTQVF56FF z<_HT^wM;_295!qtVGW+w%bZ77SuYIX123K_Ja(_iNg6g#KwYuX``;vwrW+@)vvd|Fc`aedF7;XYPOBe5%YPNcf&yBBWsN_>?6d=} z3vK3gOa&xk* zVOeZhQ+Uu*_NDtgU*GD|UW5I%F$xKcZA^FW+b8HvDu&kAg-j<3yXRk3+c3d=YNnP>RgS>C$e!r8Q!J@^OJ8j|pntAp!)qw@2l)a1^#j_34O=l(qNgUMx%KX>xy z*`F!=WtJW`@xXi)lPHGCmTAHrYhG;Eh*5sf54>@nrOd27sasNan^RkYGS83Nl_nW$ z{&)$*D9F#fqYZ4PWvMot)e!Lcn$uOA9dBXA8L?KUWdFj1BS+nS-&x^&-CVwP`OLP* zF%`RvIiCQpmR|lgdCG*8#h&LLT3i1C*Nc)UdW|k-LjsMG5+C- z6&}j^N+OSD&WwEe|LN;EO>s~e!qIq?^TBQt-P-1$mWN?#k34p>rIuwB-1sqnbBNxd z%X3B6JO+~8`@@+YS(^KI?yS~O)0}#!vYt)wUv)aSff~DTtoe=42kQ58XdFC|{rJu{ zw-;QXXl-!_5S}snv8Y*Ci|ZZEmd{zq6+b>r>uX(Z?Oy9zktL*EEHY2~aNzbw{QkB2 z@^1^;9sWrLHu;7;2>~Swfio;yCN2LHuR8D0$H0$Lnrj}-I$LCCU)%q|Bv5#snuK7eAY#6D59`mxQI9^hJU>fw762Z`)}O)NlvIL69Sp`OuQ|>K4#rdW4Zet%Who08#;IL zZ1JPl`69N&f4TvRHiYd5gd6Rz#IO6iSI=ZhLQI0|j#s^RnzG+$?3o?E?)uax8Z3}D z2vpA+4+gsfpGE3c?OXRt|Jn2JTdv34IM_T@^o>qU(Y$Bn?ST<;_op1N-?XxA=Da!F z2wNODScDm^?a!#ZUO#uuezPEp+RCNNmd#qfQEyMcKlT}u6L_AAgmp6jfv2mV%Q~lo FCIJ7ag=GK$ literal 0 HcmV?d00001 diff --git a/src/content/docs/workers/miniflare/developing/debugger.md b/src/content/docs/workers/miniflare/developing/debugger.md new file mode 100644 index 000000000000000..cef178b6a5a4ea8 --- /dev/null +++ b/src/content/docs/workers/miniflare/developing/debugger.md @@ -0,0 +1,70 @@ +--- +order: 4 +title: "๐Ÿ› Attaching a Debugger" +--- + +# ๐Ÿ› Attaching a Debugger + +You can use regular Node.js tools to debug your workers. Setting breakpoints, +watching values and inspecting the call stack are all examples of things you can +do with a debugger. + +If you're building your worker beforehand (e.g. with esbuild, Webpack, Rollup), +make sure you're outputting +[๐Ÿ—บ Source Maps](/developing/source-maps#outputting-source-maps) before +proceeding. + +## Visual Studio Code + +### Create configuration + +The easiest way to debug a Worker in VSCode is to create a new configuration. + +Open the **Run and Debug** menu in the VSCode activity bar and create a +`.vscode/launch.json` file that contains the following: + +```json +--- +filename: .vscode/launch.json +--- +{ + "configurations": [ + { + "name": "Miniflare", + "type": "node", + "request": "attach", + "port": 9229, + "cwd": "/", + "resolveSourceMapLocations": null, + "attachExistingChildren": false, + "autoAttachChildProcesses": false, + } + ] +} +``` + +From the **Run and Debug** menu in the activity bar, select the `Miniflare` +configuration, and click the green play button to start debugging. + +## WebStorm + +Create a new configuration, by clicking **Add Configuration** in the top right. + +![WebStorm add configuration button](./debugger-webstorm-node-add.png) + +Click the **plus** button in the top left of the popup and create a new +**Node.js/Chrome** configuration. Set the **Host** field to `localhost` and the +**Port** field to `9229`. Then click **OK**. + +![WebStorm Node.js debug configuration](./debugger-webstorm-settings.png) + +With the new configuration selected, click the green debug button to start +debugging. + +![WebStorm configuration debug button](./debugger-webstorm-node-run.png) + +## DevTools + +Breakpoints can also be added via the Workers DevTools. For more information, +[read the guide](https://developers.cloudflare.com/workers/observability/local-development-and-testing/#devtools) +in the Cloudflare Workers docs. diff --git a/src/content/docs/workers/miniflare/developing/index.md b/src/content/docs/workers/miniflare/developing/index.md new file mode 100644 index 000000000000000..989997d02278339 --- /dev/null +++ b/src/content/docs/workers/miniflare/developing/index.md @@ -0,0 +1,6 @@ +--- +order: 4 +title: "Developing" +--- + + diff --git a/src/content/docs/workers/miniflare/developing/live-reload.md b/src/content/docs/workers/miniflare/developing/live-reload.md new file mode 100644 index 000000000000000..9f9927759fbaefb --- /dev/null +++ b/src/content/docs/workers/miniflare/developing/live-reload.md @@ -0,0 +1,35 @@ +--- +order: 2 +title: โšก๏ธ Live Reload +--- + +Miniflare automatically refreshes your browser when your worker script +changes when `liveReload` is set to `true`. + +```js +const mf = new Miniflare({ + liveReload: true, +}); +``` + +Miniflare will only inject the `