Skip to content

Latest commit

 

History

History
691 lines (453 loc) · 38.9 KB

CHANGELOG.md

File metadata and controls

691 lines (453 loc) · 38.9 KB

miniflare

3.20240512.0

Patch Changes

  • #5827 0725f6f Thanks @petebacondarwin! - chore: update dependencies of "miniflare" package

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20240419.0 1.20240512.0
    @cloudflare/workers-types ^4.20240419.0 ^4.20240512.0
  • #5798 89b6d7f Thanks @RamIdeas! - fix: update miniflare's response compression to act more like Cloudflare platform

3.20240419.1

Minor Changes

  • #5570 66bdad0 Thanks @sesteves! - feature: support delayed delivery in the miniflare's queue simulator.

    This change updates the miniflare's queue broker to support delayed delivery of messages, both when sending the message from a producer and when retrying the message from a consumer.

Patch Changes

  • #5670 9b4af8a Thanks @dario-piotrowicz! - fix: Allow the magic proxy to proxy objects containing functions

    This was previously prevented but this change removes that restriction.

3.20240419.0

Patch Changes

  • #5682 3a0d735 Thanks @dependabot! - chore: update dependencies of "miniflare" package

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20240405.0 1.20240419.0
    @cloudflare/workers-types ^4.20240405.0 ^4.20240419.0
  • #5482 1b7739e Thanks @DaniFoldi! - docs: show new Discord url everywhere for consistency. The old URL still works, but https://discord.cloudflare.com is preferred.

3.20240405.2

Patch Changes

  • #5599 c9f081a Thanks @penalosa! - fix: add support for wrapped bindings in magic proxy

    currently Miniflare#getBindings() does not return proxies to provided wrappedBindings, make sure that appropriate proxies are instead returned

    Example:

    import { Miniflare } from "miniflare";
    
    const mf = new Miniflare({
    	workers: [
    		{
    			wrappedBindings: {
    				Greeter: {
    					scriptName: "impl",
    				},
    			},
    			modules: true,
    			script: `export default { fetch(){ return new Response(''); } }`,
    		},
    		{
    			modules: true,
    			name: "impl",
    			script: `
    				class Greeter {
    					sayHello(name) {
    						return "Hello " + name;
    					}
    				}
    
    				export default function (env) {
    					return new Greeter();
    				}
    			`,
    		},
    	],
    });
    
    const { Greeter } = await mf.getBindings();
    
    console.log(Greeter.sayHello("world")); // <--- prints 'Hello world'
    
    await mf.dispose();
  • #5599 c9f081a Thanks @penalosa! - fix: add support for RPC in magic proxy

    currently Miniflare#getBindings() does not return valid proxies to provided serviceBindings using RPC, make sure that appropriate proxies are instead returned

    Example:

    import { Miniflare } from "miniflare";
    
    const mf = new Miniflare({
    	workers: [
    		{
    			modules: true,
    			script: `export default { fetch() { return new Response(''); } }`,
    			serviceBindings: {
    				SUM: {
    					name: "sum-worker",
    					entrypoint: "SumEntrypoint",
    				},
    			},
    		},
    		{
    			modules: true,
    			name: "sum-worker",
    			script: `
    				import { WorkerEntrypoint } from 'cloudflare:workers';
    
    				export default { fetch() { return new Response(''); } }
    
    				export class SumEntrypoint extends WorkerEntrypoint {
    					sum(args) {
    						return args.reduce((a, b) => a + b);
    					}
    				}
    			`,
    		},
    	],
    });
    
    const { SUM } = await mf.getBindings();
    
    const numbers = [1, 2, 3];
    
    console.log(`The sum of ${numbers.join(", ")} is ${await SUM.sum(numbers)}`); // <--- prints 'The sum of 1, 2, 3 is 6'
    
    await mf.dispose();

3.20240405.1

Minor Changes

  • #5409 08b4908 Thanks @mrbbot! - feature: respect incoming Accept-Encoding header and ensure Accept-Encoding/request.cf.clientAcceptEncoding set correctly

    Previously, Miniflare would pass through the incoming Accept-Encoding header to your Worker code. This change ensures this header is always set to Accept-Encoding: br, gzip for incoming requests to your Worker. The original value of Accept-Encoding will be stored in request.cf.clientAcceptEncoding. This matches deployed behaviour.

    Fixes #5246

3.20240405.0

Patch Changes

  • #5554 9575a51 Thanks @dependabot! - chore: update dependencies of "miniflare" package

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20240404.0 1.20240405.0
    @cloudflare/workers-types ^4.20240404.0 ^4.20240405.0

3.20240404.0

Patch Changes

  • #5520 9f15ce1 Thanks @dependabot! - chore: update dependencies of "miniflare" package

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20240403.0 1.20240404.0
    @cloudflare/workers-types ^4.20240329.0 ^4.20240404.0

3.20240403.0

Minor Changes

  • #5215 cd03d1d Thanks @GregBrimble! - feature: customisable unsafe direct sockets entrypoints

    Previously, Miniflare provided experimental unsafeDirectHost and unsafeDirectPort options for starting an HTTP server that pointed directly to a specific Worker. This change replaces these options with a single unsafeDirectSockets option that accepts an array of socket objects of the form { host?: string, port?: number, entrypoint?: string, proxy?: boolean }. host defaults to 127.0.0.1, port defaults to 0, entrypoint defaults to default, and proxy defaults to false. This allows you to start HTTP servers for specific entrypoints of specific Workers. proxy controls the Style of the socket.

    Note these sockets set the capnpConnectHost workerd option to "miniflare-unsafe-internal-capnp-connect". external serviceBindings will set their capnpConnectHost option to the same value allowing RPC over multiple Miniflare instances. Refer to cloudflare/workerd#1757 for more information.

  • #5215 cd03d1d Thanks @GregBrimble! - feature: support named entrypoints for serviceBindings

    This change allows service bindings to bind to a named export of another Worker using designators of the form { name: string | typeof kCurrentWorker, entrypoint?: string }. Previously, you could only bind to the default entrypoint. With this change, you can bind to any exported entrypoint.

    import { kCurrentWorker, Miniflare } from "miniflare";
    
    const mf = new Miniflare({
    	workers: [
    		{
    			name: "a",
    			serviceBindings: {
    				A_RPC_SERVICE: { name: kCurrentWorker, entrypoint: "RpcEntrypoint" },
    				A_NAMED_SERVICE: { name: "a", entrypoint: "namedEntrypoint" },
    				B_NAMED_SERVICE: { name: "b", entrypoint: "anotherNamedEntrypoint" },
    			},
    			compatibilityFlags: ["rpc"],
    			modules: true,
    			script: `
    			import { WorkerEntrypoint } from "cloudflare:workers";
    
    			export class RpcEntrypoint extends WorkerEntrypoint {
    				ping() { return "a:rpc:pong"; }
    			}
    
    			export const namedEntrypoint = {
    				fetch(request, env, ctx) { return new Response("a:named:pong"); }
    			};
    
    			...
    			`,
    		},
    		{
    			name: "b",
    			modules: true,
    			script: `
    			export const anotherNamedEntrypoint = {
    				fetch(request, env, ctx) { return new Response("b:named:pong"); }
    			};
    			`,
    		},
    	],
    });

Patch Changes

  • #5499 6c3be5b Thanks @GregBrimble! - chore: Bump workerd@1.20240403.0

  • #5215 cd03d1d Thanks @GregBrimble! - fix: allow scripts without scriptPaths to import built-in modules

    Previously, if a string script option was specified with modules: true but without a corresponding scriptPath, all imports were forbidden. This change relaxes that restriction to allow imports of built-in node:*, cloudflare:* and workerd:* modules without a scriptPath.

3.20240329.1

Patch Changes

  • #5491 940ad89 Thanks @dario-piotrowicz! - fix: make sure the magic proxy can handle multiple parallel r2 stream reads

    Currently trying to read multiple R2 streams in parallel (via Promise.all for example) leads to deadlock which prevents any of the target streams from being read. This is caused by the underlying implementation only allowing a single HTTP connection to the Workers runtime at a time. This change fixes the issue by allowing multiple parallel HTTP connections.

3.20240329.0

Minor Changes

3.20240320.1

Minor Changes

  • #5258 fbdca7d Thanks @OilyLime! - feature: URL decode components of the Hyperdrive config connection string

3.20240320.0

Patch Changes

  • #5341 248a318 Thanks @dependabot! - chore: update dependencies of "miniflare" package

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20240314.0 1.20240320.1
    @cloudflare/workers-types ^4.20240314.0 ^4.20240320.1

3.20240314.0

Minor Changes

3.20240304.2

Patch Changes

3.20240304.1

Patch Changes

  • #5201 1235d48 Thanks @wydengyre! - fix: ensure miniflare works with Node 21.7.0+

  • #5191 27fb22b Thanks @mrbbot! - fix: ensure redirect responses handled correctly with dispatchFetch()

    Previously, if your Worker returned a redirect response, calling dispatchFetch(url) would send another request to the original url rather than the redirect. This change ensures redirects are followed correctly.

    • If your Worker returns a relative redirect or an absolute redirect with the same origin as the original url, the request will be sent to the Worker.
    • If your Worker instead returns an absolute redirect with a different origin, the request will be sent to the Internet.
    • If a redirected request to a different origin returns an absolute redirect with the same origin as the original url, the request will also be sent to the Worker.

3.20240304.0

Minor Changes

3.20240223.1

Patch Changes

  • #5133 42bcc72 Thanks @mrbbot! - fix: ensure internals can access workerd when starting on non-local host

    Previously, if Miniflare was configured to start on a host that wasn't 127.0.0.1, ::1, *, ::, or 0.0.0.0, calls to Miniflare API methods relying on the magic proxy (e.g. getKVNamespace(), getWorker(), etc.) would fail. This change ensures workerd is always accessible to Miniflare's internals. This also fixes wrangler dev when using local network address such as 192.168.0.10 with the --ip flag.

  • #5133 42bcc72 Thanks @mrbbot! - fix: ensure IPv6 addresses can be used as hosts

    Previously, if Miniflare was configured to start on an IPv6 host, it could crash. This change ensures IPv6 addresses are handled correctly. This also fixes wrangler dev when using IPv6 addresses such as ::1 with the --ip flag.

3.20240223.0

Minor Changes

3.20240208.0

Minor Changes

3.20240129.3

Minor Changes

  • #4795 027f9719 Thanks @mrbbot! - feat: pass Miniflare instance as argument to custom service binding handlers

    This change adds a new Miniflare-typed parameter to function-valued service binding handlers. This provides easy access to the correct bindings when re-using service functions across instances.

    import assert from "node:assert";
    import { Miniflare, Response } from "miniflare";
    
    const mf = new Miniflare({
    	serviceBindings: {
    		SERVICE(request, instance) {
    			assert(instance === mf);
    			return new Response();
    		},
    	},
    });
  • #4795 027f9719 Thanks @mrbbot! - feat: allow URLs to be passed in hyperdrives

    Previously, the hyperdrives option only accepted strings as connection strings. This change allows URL objects to be passed too.

  • #4795 027f9719 Thanks @mrbbot! - feat: add support for custom root paths

    Miniflare has lots of file-path-valued options (e.g. scriptPath, kvPersist, textBlobBindings). Previously, these were always resolved relative to the current working directory before being used. This change adds a new rootPath shared, and per-worker option for customising this behaviour. Instead of resolving relative to the current working directory, Miniflare will now resolve path-valued options relative to the closest rootPath option. Paths are still resolved relative to the current working directory if no rootPaths are defined. Worker-level rootPaths are themselves resolved relative to the shared rootPath if defined.

    import { Miniflare } from "miniflare";
    
    const mf1 = new Miniflare({
    	scriptPath: "index.mjs",
    });
    
    const mf2 = new Miniflare({
    	rootPath: "a/b",
    	scriptPath: "c/index.mjs",
    });
    
    const mf3 = new Miniflare({
    	rootPath: "/a/b",
    	workers: [
    		{
    			name: "1",
    			rootPath: "c",
    			scriptPath: "index.mjs",
    		},
    		{
    			name: "2",
    			scriptPath: "index.mjs",
    		},
    	],
    });
  • #4795 027f9719 Thanks @mrbbot! - feat: allow easy binding to current worker

    Previously, if you wanted to create a service binding to the current Worker, you'd need to know the Worker's name. This is usually possible, but can get tricky when dealing with many Workers. This change adds a new kCurrentWorker symbol that can be used instead of a Worker name in serviceBindings. kCurrentWorker always points to the Worker with the binding.

    import { kCurrentWorker, Miniflare } from "miniflare";
    
    const mf = new Miniflare({
    	serviceBindings: {
    		SELF: kCurrentWorker,
    	},
    	modules: true,
    	script: `export default {
        fetch(request, env, ctx) {
          const { pathname } = new URL(request.url);
          if (pathname === "/recurse") {
            return env.SELF.fetch("http://placeholder");
          }
          return new Response("body");
        }
      }`,
    });
    
    const response = await mf.dispatchFetch("http://placeholder/recurse");
    console.log(await response.text()); // body

Patch Changes

  • #4954 7723ac17 Thanks @mrbbot! - fix: allow relative scriptPath/modulesRoots to break out of current working directory

    Previously, Miniflare would resolve relative scriptPaths against moduleRoot multiple times resulting in incorrect paths and module names. This would lead to can't use ".." to break out of starting directory workerd errors. This change ensures Miniflare uses scriptPath as is, and only resolves it relative to modulesRoot when computing module names. Note this bug didn't affect service workers. This allows you to reference a modules scriptPath outside the working directory with something like:

    const mf = new Miniflare({
    	modules: true,
    	modulesRoot: "..",
    	scriptPath: "../worker.mjs",
    });

    Fixes #4721

  • #4795 027f9719 Thanks @mrbbot! - fix: return non-WebSocket responses for failed WebSocket upgrading fetch()es

    Previously, Miniflare's fetch() would throw an error if the Upgrade: websocket header was set, and a non-WebSocket response was returned from the origin. This change ensures the non-WebSocket response is returned from fetch() instead, with webSocket set to null. This allows the caller to handle the response as they see fit.

  • #4795 027f9719 Thanks @mrbbot! - fix: ensure MiniflareOptions, WorkerOptions, and SharedOptions types are correct

    Miniflare uses Zod for validating options. Previously, Miniflare inferred *Options from the output types of its Zod schemas, rather than the input types. In most cases, these were the same. However, the hyperdrives option has different input/output types, preventing these from being type checked correctly.

3.20240129.2

Patch Changes

  • #4950 05360e43 Thanks @petebacondarwin! - fix: ensure we do not rewrite external Origin headers in wrangler dev

    In #4812 we tried to fix the Origin headers to match the Host header but were overzealous and rewrote Origin headers for external origins (outside of the proxy server's origin).

    This is now fixed, and moreover we rewrite any headers that refer to the proxy server on the request with the configured host and vice versa on the response.

    This should ensure that CORS is not broken in browsers when a different host is being simulated based on routes in the Wrangler configuration.

3.20240129.1

Minor Changes

  • #4905 148feff6 Thanks @dario-piotrowicz! - feature: add a getCf method to Miniflare instances

    add a new getCf method attached to instances of Miniflare, this getCf returns the cf object that the Miniflare instance provides to the actual workers and it depends of the core option of the same name

    Example:

    import { Miniflare } from "miniflare";
    
    const mf = new Miniflare({ ... });
    
    const cf = await mf.getCf();
    
    console.log(`country = ${cf.country} ; colo = ${cf.colo}`); // logs 'country = GB ; colo = LHR'

3.20240129.0

Minor Changes

  • #4873 1e424ff2 Thanks @dom96! - feature: implemented basic Python support

    Here is an example showing how to construct a MiniFlare instance with a Python module:

    const mf = new Miniflare({
    	modules: [
    		{
    			type: "PythonModule",
    			path: "index",
    			contents:
    				"from js import Response;\ndef fetch(request):\n  return Response.new('hello')",
    		},
    	],
    	compatibilityFlags: ["experimental"],
    });

Patch Changes

3.20231218.4

Patch Changes

  • #4812 8166eefc Thanks @petebacondarwin! - fix: ensure that Origin header is rewritten as necessary

    The wrangler dev command puts the Worker under test behind a proxy server. This proxy server should be transparent to the client and the Worker, which means that the Request arriving at the Worker with the correct url property, and Host and Origin headers. Previously we fixed the Host header but missed the Origin header which is only added to a request under certain circumstances, such as cross-origin requests.

    This change fixes the Origin header as well, so that it is rewritten, when it exists, to use the origin of the url property.

    Fixes #4761

3.20231218.3

Patch Changes

3.20231218.2

Minor Changes

  • #4686 4f6999ea Thanks @mrbbot! - feat: expose rows_read and rows_written in D1 result meta

    rows_read/rows_written contain the number of rows read from/written to the database engine when executing a query respectively. These numbers may be greater than the number of rows returned from/inserted by a query. These numbers form billing metrics when your Worker is deployed. See https://developers.cloudflare.com/d1/platform/pricing/#billing-metrics for more details.

Patch Changes

  • #4719 c37d94b5 Thanks @mrbbot! - fix: ensure miniflare and wrangler can source map in the same process

    Previously, if in a wrangler dev session you called console.log() and threw an unhandled error you'd see an error like [ERR_ASSERTION]: The expression evaluated to a falsy value. This change ensures you can do both of these things in the same session.

3.20231218.1

Patch Changes

  • #4630 037de5ec Thanks @petebacondarwin! - fix: ensure User Worker gets the correct Host header in wrangler dev local mode

    Some full-stack frameworks, such as Next.js, check that the Host header for a server side action request matches the host where the application is expected to run.

    In wrangler dev we have a Proxy Worker in between the browser and the actual User Worker. This Proxy Worker is forwarding on the request from the browser, but then the actual User Worker is running on a different host:port combination than that which the browser thinks it should be on. This was causing the framework to think the request is malicious and blocking it.

    Now we update the request's Host header to that passed from the Proxy Worker in a custom MF-Original-Url header, but only do this if the request also contains a shared secret between the Proxy Worker and User Worker, which is passed via the MF-Proxy-Shared-Secret header. This last feature is to prevent a malicious website from faking the Host header in a request directly to the User Worker.

    Fixes cloudflare/next-on-pages#588

3.20231218.0

Minor Changes

3.20231030.4

Patch Changes

  • #4448 eb08e2dc Thanks @mrbbot! - fix: include request url and headers in pretty error page

    This change ensures Miniflare's pretty error page includes the URL and headers of the incoming request, rather than Miniflare's internal request for the page.

3.20231030.3

Patch Changes

  • #4466 71fb0b86 Thanks @mrbbot! - fix: ensure unused KV and Cache blobs cleaned up

    When storing data in KV, Cache and R2, Miniflare uses both an SQL database and separate blob store. When writing a key/value pair, a blob is created for the new value and the old blob for the previous value (if any) is deleted. A few months ago, we introduced a change that prevented old blobs being deleted for KV and Cache. R2 was unaffected. This shouldn't have caused any problems, but could lead to persistence directories growing unnecessarily as they filled up with garbage blobs. This change ensures garbage blobs are deleted.

    Note existing garbage will not be cleaned up. If you'd like to do this, download this Node script (https://gist.github.com/mrbbot/68787e19dcde511bd99aa94997b39076). If you're using the default Wrangler persistence directory, run node gc.mjs kv .wrangler/state/v3/kv <namespace_id_1> <namespace_id_2> ... and node gc.mjs cache .wrangler/state/v3/cache default named:<cache_name_1> named:<cache_name_2> ... with each of your KV namespace IDs (not binding names) and named caches.

  • #4550 63708a94 Thanks @mrbbot! - fix: validate Host and Orgin headers where appropriate

    Host and Origin headers are now checked when connecting to the inspector and Miniflare's magic proxy. If these don't match what's expected, the request will fail.

3.20231030.2

Patch Changes

  • #4505 1b348782 Thanks @mrbbot! - fix: remove __STATIC_CONTENT_MANIFEST from module worker env

    When using Workers Sites with a module worker, the asset manifest must be imported from the __STATIC_CONTENT_MANIFEST virtual module. Miniflare provided this module, but also erroneously added __STATIC_CONTENT_MANIFEST to the env object too. Whilst this didn't break anything locally, it could cause users to develop Workers that ran locally, but not when deployed. This change ensures env doesn't contain __STATIC_CONTENT_MANIFEST.

3.20231030.1

Minor Changes

  • #4348 be2b9cf5 Thanks @mrbbot! - feat: add support for wrapped bindings

    This change adds a new wrappedBindings worker option for configuring workerd's wrapped bindings. These allow custom bindings to be written as JavaScript functions accepting an env parameter of "inner bindings" and returning the value to bind. For more details, refer to the API docs.

  • #4341 d9908743 Thanks @RamIdeas! - Added a handleRuntimeStdio which enables wrangler (or any other direct use of Miniflare) to handle the stdout and stderr streams from the workerd child process. By default, if this option is not provided, the previous behaviour is retained which splits the streams into lines and calls console.log/console.error.

3.20231030.0

Minor Changes

  • #4322 8a25b7fb Thanks @dario-piotrowicz! - add unsafeEvalBinding option

    Add option to leverage the newly introduced UnsafeEval workerd binding API, such API is used to evaluate javascript code at runtime via the provided eval and newFunction methods.

    The API, for security reasons (as per the workers docs), is not to be use in production but it is intended for local purposes only such as local testing.

    To use the binding you need to specify a string value for the unsafeEvalBinding, such will be the name of the UnsafeEval bindings that will be made available in the workerd runtime.

    For example the following code shows how to set the binding with the UNSAFE_EVAL name and evaluate the 1+1 string:

    const mf = new Miniflare({
    	log,
    	modules: true,
    	script: `
          export default {
              fetch(req, env, ctx) {
                  const two = env.UNSAFE_EVAL.eval('1+1');
                  return new Response('two = ' + two); // returns 'two = 2'
              }
          }
      `,
    	unsafeEvalBinding: "UNSAFE_EVAL",
    });

Patch Changes

  • #4397 4f8b3420 Thanks @mrbbot! - fix: reject Miniflare#ready promise if Miniflare#dispose() called while waiting
  • #4428 3637d97a Thanks @mrbbot! - fix: add miniflare bin entry

    Miniflare 3 doesn't include a CLI anymore, but should log a useful error stating this when running npx miniflare. We had a script for this, but it wasn't correctly hooked up. 🤦 This change makes sure the required bin entry exists.

  • #4321 29a59d4e Thanks @mrbbot! - fix: ensure Mutex doesn't report itself as drained if locked

    Previously, Miniflare's Mutex implementation would report itself as drained if there were no waiters, regardless of the locked state. This bug meant that if you called but didn't await Miniflare#setOptions(), future calls to Miniflare#dispatchFetch() (or any other asynchronous Miniflare method) wouldn't wait for the options update to apply and the runtime to restart before sending requests. This change ensures we wait until the mutex is unlocked before reporting it as drained.

  • #4400 76787861 Thanks @mrbbot! - fix: cleanup temporary directory after shutting down workerd

    Previously on exit, Miniflare would attempt to remove its temporary directory before shutting down workerd. This could lead to EBUSY errors on Windows. This change ensures we shutdown workerd before removing the directory. Since we can only clean up on a best effort basis when exiting, it also catches any errors thrown when removing the directory, in case the runtime doesn't shutdown fast enough.

Previous Releases

For previous Miniflare 3 releases, refer to this GitHub releases page: https://github.com/cloudflare/miniflare/releases.

For previous Miniflare 1 and 2 releases, refer to this CHANGELOG: https://github.com/cloudflare/miniflare/blob/master/docs/CHANGELOG.md