Feature Flags
Turn features on and off, and change their settings, without redeploying your Worker. The Flagship binding returns each flag's current value, or the default that your code passes with the call.
- Libraries
Runtime.WorkersRuntime.Flagship - Binding
FlagshipinRuntime.Workers - npm
@cloudflare/workers-types5.20260906.1,@cloudflare/flagship0.5.0
Dark Mode
The site's script requests this JSON and applies the dark theme when darkMode is true. getBooleanValue takes the flag key and a default. The binding returns that default when the flag is missing or evaluation fails, and also for a flag of another type.
open Fable.Core
module Workers = FSharp.CloudEdge.Runtime.Workers
type Env =
abstract FLAGS: Workers.Flagship
[<ExportDefault>]
let worker: Workers.ExportedHandler<Env, obj, obj, obj> =
Workers.ExportedHandler.Create(
fetch = fun _ env _ ->
async {
let! darkMode = env.FLAGS.getBooleanValue("dark-mode", false) |> Async.AwaitPromise
return Workers.Exports.Response.json {| darkMode = darkMode |}
}
|> Async.StartAsPromise
|> U2.Case1
)
Needs a flagship binding named FLAGS, with your Flagship app's ID as app_id. Worker Upload shows how to declare bindings.
Emitted JavaScript
import { awaitPromise, startAsPromise } from "./fable_modules/fable-library-js.5.13.0/Async.js";
import { singleton } from "./fable_modules/fable-library-js.5.13.0/AsyncBuilder.js";
export const worker = {
fetch: (_arg, env, _arg_1) => startAsPromise(singleton.Delay(() => singleton.Bind(awaitPromise(env.FLAGS.getBooleanValue("dark-mode", false)), (_arg_2) => singleton.Return(globalThis.Response.json({
darkMode: _arg_2,
}))))),
};
export default worker;
Storefront Settings
Each flag type has its own method. The promises from getStringValue and getNumberValue resolve to an F# string and a float. The result of getObjectValue has the F# type of its default, so the flag's JSON value should have the fields of standardPrices.
open Fable.Core
module Workers = FSharp.CloudEdge.Runtime.Workers
type Env =
abstract FLAGS: Workers.Flagship
let standardPrices = {| monthly = 12.; yearly = 120. |}
[<ExportDefault>]
let worker: Workers.ExportedHandler<Env, obj, obj, obj> =
Workers.ExportedHandler.Create(
fetch = fun _ env _ ->
async {
let! banner = env.FLAGS.getStringValue("banner-text", "Welcome back!") |> Async.AwaitPromise
let! trialDays = env.FLAGS.getNumberValue("trial-days", 14.) |> Async.AwaitPromise
let! prices = env.FLAGS.getObjectValue("prices", standardPrices) |> Async.AwaitPromise
let settings = {| banner = banner; trialDays = trialDays; prices = prices |}
return Workers.Exports.Response.json settings
}
|> Async.StartAsPromise
|> U2.Case1
)
Flag Inspector
An admin endpoint shows why new-checkout has its current value. getBooleanDetails reports the value with its variant and reason. Both are F# options, and Option.defaultValue supplies "none" for the JSON.
open Fable.Core
module Workers = FSharp.CloudEdge.Runtime.Workers
type Env =
abstract FLAGS: Workers.Flagship
[<ExportDefault>]
let worker: Workers.ExportedHandler<Env, obj, obj, obj> =
Workers.ExportedHandler.Create(
fetch = fun _ env _ ->
async {
let! details = env.FLAGS.getBooleanDetails("new-checkout", false) |> Async.AwaitPromise
return
Workers.Exports.Response.json
{| newCheckout = details.value
variant = Option.defaultValue "none" details.variant
reason = Option.defaultValue "none" details.reason |}
}
|> Async.StartAsPromise
|> U2.Case1
)
Library Table
Runtime.Flagship binds Flagship's own SDK. Its FlagshipClient evaluates flags over HTTP, and its FlagshipServerProvider is an OpenFeature provider for server code. From .NET, Management.Compute creates Flagship apps and flags with FlagshipCreateApp and FlagshipCreateFlag.
| Library | npm package | What it covers |
|---|---|---|
Runtime.Workers |
@cloudflare/workers-types 5.20260906.1 |
Flagship binding |
Runtime.Flagship |
@cloudflare/flagship 0.5.0 |
HTTP client, OpenFeature provider |
Related Pages
NuGet packages
Management.Compute 0.1.0, Runtime.Flagship 0.1.0, Runtime.Workers 0.1.0.