Releases: cloudflare/workers-sdk
Release list
[email protected]
Minor Changes
-
#14995
59872c4Thanks @ThomasRubini! - Addconnecttrigger for raw socketsYou can now configure a Worker to receive raw socket connections during
wrangler dev, delivered directly to the Worker'sconnect(socket, env, ctx)handler:Each entry opens a listening socket on
127.0.0.1(or the givenaddress) that forwards incoming connections straight to the Worker, bypassing the local dev HTTP entry point. This requires theexperimentalcompatibility flag. Only"tcp"is supported at the moment.@cloudflare/configalso supports declaring this trigger viatriggers.connect(...), which lowers to theconnectfield above:import { defineWorker, triggers } from "@cloudflare/config"; export default defineWorker({ triggers: [ triggers.connect({ protocol: "tcp", port: 5432, address: "127.0.0.1" }), ], });
-
#15172
c68f9cbThanks @WillTaylorDev! - Add container support to worker previewsWorker previews now support containers through a new
previews.containersconfiguration block. Container configuration doesn't inherit, so declare containers explicitly in thepreviewsblock to enable them for previews. This mirrors howpreviews.durable_objectsworks today. Wrangler names each preview container application{worker_name}_{preview_slug}_{class_name}, normalising and shortening the result to what the API accepts. Either change appends a short digest of the composed name, so two names that would otherwise land on one stay distinct. An entry cannot set its ownname, because application names are unique to an account and a fixed name would collide between two previews of the same Worker. A Durable Object class is backed by at most one container application, so the validator rejects two entries that share aclass_name. Wrangler skips container applications bound to Durable Object classes that another Worker implements throughscript_name, because the implementing Worker owns its own container application. A binding is not required: a Durable Object declared throughmigrationsorexportsand reached only overctx.exportscan still back a container. Every entry must setclass_name. Apreviews.containersentry whoseclass_namematches no Durable Object class at all is rejected before the preview deployment is created, so a typo fails loudly instead of producing a preview with no container.Wrangler creates the container applications on
wrangler preview. Deleting a preview tears them down server side, sowrangler preview deletedoesn't remove them.Container build and deploy progress prints to stdout.
wrangler preview --jsonsuppresses wrangler's own output so it doesn't interleave with the payload, and warnings and errors still go to stderr. Docker's build output and the progress spinner write to stdout directly and bypass that suppression, so parse--jsonfrom a non interactive shell, where the spinner is skipped, and prefer a prebuiltimageover a Dockerfile. -
#15174
649f667Thanks @WillTaylorDev! - [private beta]: Create the parent Worker automatically whenwrangler previewtargets one that doesn't exist yetPreviews hang off a parent Worker, so running
wrangler previewbefore the Worker had ever been deployed failed with a raw API error naming the Preview endpoint. Wrangler now offers to create an empty parent Worker and then carries on creating the Preview. The parent uses the same workers.dev and Preview URL settings thatwrangler deploywould resolve, without applying routes or cron triggers. In non-interactive environments, Wrangler creates the Worker without asking. -
#14735
30c2d47Thanks @vaishnav-mk! - Add individual and batch Workflow instance deletion to the runtime and SDK.WorkflowInstance.delete()deletes one instance. Self-deletion stops the current execution.env.MY_WORKFLOW.deleteBatch(instanceIds)deletes up to 100 instances and returns{ deleted, errors }per input position.wrangler workflows instances delete <name> [id..]deletes instances remotely or with--local; IDs can also come from a JSON array passed with--filename, with a combined limit of 100.
Patch Changes
-
#15260
5ae9d5bThanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To @cloudflare/workers-types ^5.20260815.1 ^5.20260816.1 workerd 1.20260815.1 1.20260816.1 -
#15264
4b52975Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To @cloudflare/workers-types ^5.20260816.1 ^5.20260819.1 workerd 1.20260816.1 1.20260819.1 -
#15277
ce9b151Thanks @dependabot! - Update dependencies of "miniflare", "wrangler"The following dependency versions have been updated:
Dependency From To @cloudflare/workers-types ^5.20260819.1 ^5.20260820.1 workerd 1.20260819.1 1.20260820.1 -
#15192
ef73a28Thanks @ondraulehla! - Fixeskv bulk putcorrupting binary values written to local KVValues marked
base64: truewere stored incorrectly whenever they contained bytes that do not form valid UTF-8, which covers images, compressed data and most other binary payloads. A Worker reading such a key back underwrangler devgot a different, longer value than the one that was written: a 12 byte PNG header came back as 20 bytes.kv bulk putwrites to local KV by default, so the plain command was the affected one. Remote writes were never affected, and neither were entries withoutbase64or values written withkv key put. -
#15284
39dcea6Thanks @emily-shen! - Move deploy output writing into shared deploy helpers -
#15130
99a1f49Thanks @emily-shen! - Remove unsupportedremoteconfiguration from Workflow bindingsWorkflow bindings no longer accept
remotein configuration, as remote Workflow bindings have never actually been supported. -
#15278
f2437e6Thanks @Sosokker! - Fix the--temporaryerror on commands that authenticate more than one timewrangler d1 migrations apply --remote --temporaryfailed with this error:You're already authenticated with Cloudflare, so --temporary can't be used. The failure occurred with no login and with noCLOUDFLARE_API_TOKEN. This command authenticates one time for each statement that it runs. The first authentication makes a temporary preview account. The second authentication read the token of this new account as an earlier login.Wrangler now uses again the temporary account from the same command run. Commands that authenticate more than one time now work as
wrangler deploy --temporaryworks. If real credentials are available,--temporaryis still an error. -
Updated dependencies [
59872c4,99a1f49,5ae9d5b,4b52975,ce9b151,99a1f49, [99a1f49](https://github.com/clo...
[email protected]
Patch Changes
-
#15263
29b8138Thanks @dependabot! - Update dependencies of "create-cloudflare"The following dependency versions have been updated:
Dependency From To create-vike 0.0.675 0.0.677 -
#15265
0854f04Thanks @dependabot! - Update dependencies of "create-cloudflare"The following dependency versions have been updated:
Dependency From To create-solid 0.10.0 0.11.0 -
#15264
4b52975Thanks @dependabot! - Update Hello World templates to use@cloudflare/vitest-pool-workers0.22
@cloudflare/[email protected]
Minor Changes
-
#14995
59872c4Thanks @ThomasRubini! - Addconnecttrigger for raw socketsYou can now configure a Worker to receive raw socket connections during
wrangler dev, delivered directly to the Worker'sconnect(socket, env, ctx)handler:{ "connect": [{ "protocol": "tcp", "port": 5432 }] }Each entry opens a listening socket on
127.0.0.1(or the givenaddress) that forwards incoming connections straight to the Worker, bypassing the local dev HTTP entry point. This requires theexperimentalcompatibility flag. Only"tcp"is supported at the moment.@cloudflare/configalso supports declaring this trigger viatriggers.connect(...), which lowers to theconnectfield above:import { defineWorker, triggers } from "@cloudflare/config"; export default defineWorker({ triggers: [ triggers.connect({ protocol: "tcp", port: 5432, address: "127.0.0.1" }), ], });
-
#15172
c68f9cbThanks @WillTaylorDev! - Add container support to worker previewsWorker previews now support containers through a new
previews.containersconfiguration block. Container configuration doesn't inherit, so declare containers explicitly in thepreviewsblock to enable them for previews. This mirrors howpreviews.durable_objectsworks today. Wrangler names each preview container application{worker_name}_{preview_slug}_{class_name}, normalising and shortening the result to what the API accepts. Either change appends a short digest of the composed name, so two names that would otherwise land on one stay distinct. An entry cannot set its ownname, because application names are unique to an account and a fixed name would collide between two previews of the same Worker. A Durable Object class is backed by at most one container application, so the validator rejects two entries that share aclass_name. Wrangler skips container applications bound to Durable Object classes that another Worker implements throughscript_name, because the implementing Worker owns its own container application. A binding is not required: a Durable Object declared throughmigrationsorexportsand reached only overctx.exportscan still back a container. Every entry must setclass_name. Apreviews.containersentry whoseclass_namematches no Durable Object class at all is rejected before the preview deployment is created, so a typo fails loudly instead of producing a preview with no container.Wrangler creates the container applications on
wrangler preview. Deleting a preview tears them down server side, sowrangler preview deletedoesn't remove them.Container build and deploy progress prints to stdout.
wrangler preview --jsonsuppresses wrangler's own output so it doesn't interleave with the payload, and warnings and errors still go to stderr. Docker's build output and the progress spinner write to stdout directly and bypass that suppression, so parse--jsonfrom a non interactive shell, where the spinner is skipped, and prefer a prebuiltimageover a Dockerfile.
Patch Changes
-
#15251
5c10e39Thanks @dario-piotrowicz! - Fix ESM-only packages missing from deploy metadataESM-only package dependencies (such as
@cloudflare/think) were silently omitted from the package dependency metadata reported duringwrangler deployandwrangler versions upload. These packages are now correctly detected and included. -
#15284
39dcea6Thanks @emily-shen! - Move deploy output writing into shared deploy helpers
@cloudflare/[email protected]
Patch Changes
-
#15223
8a04946Thanks @petebacondarwin! - Recover from a partially installed keyring backend on WindowsChoosing to keep your credentials in the OS keyring on Windows installs a native backend the first time you opt in. An install interrupted part-way through — by a dropped connection, a full disk, or an npm told to skip optional packages — could leave a broken backend behind that was nonetheless treated as working. Every login, token refresh, and credential read from then on failed with an internal error, and because the broken state was never re-examined, no amount of retrying would clear it.
A broken backend is now spotted and reinstalled automatically. If the reinstall still cannot produce a working one, you get a single explanation of how to install it by hand and fall back to the plaintext credentials file for the rest of the session, rather than sitting through a fresh install attempt on every credential access.
-
#15278
f2437e6Thanks @Sosokker! - Fix the--temporaryerror on commands that authenticate more than one timewrangler d1 migrations apply --remote --temporaryfailed with this error:You're already authenticated with Cloudflare, so --temporary can't be used. The failure occurred with no login and with noCLOUDFLARE_API_TOKEN. This command authenticates one time for each statement that it runs. The first authentication makes a temporary preview account. The second authentication read the token of this new account as an earlier login.Wrangler now uses again the temporary account from the same command run. Commands that authenticate more than one time now work as
wrangler deploy --temporaryworks. If real credentials are available,--temporaryis still an error. -
Updated dependencies [
59872c4,c68f9cb,5c10e39,39dcea6]:- @cloudflare/[email protected]
@cloudflare/[email protected]
Major Changes
-
#15074
bfcc442Thanks @penalosa! - Rename@cloudflare/vitest-pool-workersto@cloudflare/vitest-pluginfor the v1 releaseThe package has been renamed from
@cloudflare/vitest-pool-workersto@cloudflare/vitest-pluginto be clearer about it's usage.To migrate, run the codemod from the root of your project:
npx @cloudflare/codemods vitest:pool-workers-to-vitest-plugin
This handles the whole rename for you:
- Replaces the dependency in your
package.json, moving plain version ranges to^1.0.0while preservingworkspace:/catalog:/link:/file:protocol references, along with anyoverrides,resolutionsandpnpm.overridesentries. - Rewrites imports such as
import { cloudflareTest } from "@cloudflare/vitest-pool-workers"toimport { cloudflareTest } from "@cloudflare/vitest-plugin", preserving any subpaths. - Updates the
typesentry in your testtsconfig.jsonfrom@cloudflare/vitest-pool-workers/typesto@cloudflare/vitest-plugin/types.
Pass
--dry-runto preview the changes first, or--files <glob>to restrict which files are considered.If you would rather migrate by hand, the only changes needed are the dependency name in
package.json, the package specifier in anyimport/requireof the plugin, and thetypesentry in your testtsconfig.json. - Replaces the dependency in your
Minor Changes
-
#14690
d81fae7Thanks @penalosa! - Add a central CLI for Cloudflare codemodsRun a codemod by name, e.g.
npx @cloudflare/codemods vitest:v3-to-v4. The initial migrations cover Vitest v3 to v4 configuration (vitest:v3-to-v4) and the@cloudflare/vitest-pool-workersto@cloudflare/vitest-pluginv1 rename (vitest:pool-workers-to-vitest-plugin). The existing Vitest transform now lives in this dedicated package.
Patch Changes
@cloudflare/[email protected]
@cloudflare/[email protected]
@cloudflare/[email protected]
Patch Changes
- Updated dependencies [
59872c4,c68f9cb,630048b,99a1f49,5ae9d5b,4b52975,ce9b151,5c10e39,8a04946,649f667,39dcea6,99a1f49,99a1f49,f2437e6,30c2d47]:- [email protected]
- @cloudflare/[email protected]
- @cloudflare/[email protected]
- @cloudflare/[email protected]
- @cloudflare/[email protected]
{ "connect": [{ "protocol": "tcp", "port": 5432 }] }