INTEGRITY Dokumentace

Outbound Workers

Outbound Workers se nacházejí mezi Workery vašeho zákazníka a veřejným internetem. Díky nim máte přehled o veškerém odchozím fetch() požadavky od uživatelských Workerů.

Informace k diagramu Outbound Workers

Obecné případy použití

Outbound Workers lze použít k těmto účelům:

Použijte Outbound Workers

Chcete-li používat Outbound Workers:

  1. Vytvořte Worker, který bude sloužit jako váš Outbound Worker.
  2. Outbound Worker lze zadat jako volitelný parametr v dispatch namespaces binding v projektu Konfigurační soubor Wrangler. Pokud chcete volitelně předat data ze svého dynamic dispatch Workeru do Outbound Workeru, můžete názvy proměnných zadat v parametry.

Ujistěte se, že máte [email protected] nebo novější nainstalováno.

{
	"dispatch_namespaces": [
		{
			"binding": "dispatcher",
			"namespace": "<NAMESPACE_NAME>",
			"outbound": {
				"service": "<SERVICE_NAME>",
				"parameters": [
					"params_object"
				]
			}
		}
	]
}
[[dispatch_namespaces]]
binding = "dispatcher"
namespace = "<NAMESPACE_NAME>"

  [dispatch_namespaces.outbound]
  service = "<SERVICE_NAME>"
  parameters = [ "params_object" ]
  1. Upravte svůj dynamický dispatch Worker tak, aby volal Outbound Worker, a deklarujte proměnné, které se mají předat dispatcher.get().
export default {
	async fetch(request, env) {
		try {
			// parse the URL, read the subdomain
			let workerName = new URL(request.url).host.split(".")[0];

			let context_from_dispatcher = {
				customer_name: workerName,
				url: request.url,
			};

			let userWorker = env.dispatcher.get(
				workerName,
				{},
				{
					// outbound arguments. object name must match parameters in the binding
					outbound: {
						params_object: context_from_dispatcher,
					},
				},
			);
			return await userWorker.fetch(request);
		} catch (e) {
			if (e.message.startsWith("Worker not found")) {
				// we tried to get a worker that doesn't exist in our dispatch namespace
				return new Response("", { status: 404 });
			}
			return new Response(e.message, { status: 500 });
		}
	},
};
  1. Outbound Worker se nyní vyvolá pro každý fetch() požadavky od uživatelského Workeru. Uživatelský Worker vyvolá FetchEvent na Outbound Workeru. Proměnné deklarované v bindingu jsou v Outbound Workeru dostupné prostřednictvím env.<VAR_NAME>.

Následující příklad ukazuje Outbound Worker, který zaznamenává požadavek fetch z uživatelského Workeru a vytvoří JWT, pokud požadavek fetch odpovídá api.example.com.

export default {
	// this event is fired when the dispatched Workers make a subrequest
	async fetch(request, env, ctx) {
		// env contains the values we set in `dispatcher.get()`
		const customer_name = env.customer_name;
		const original_url = env.url;

		// log the request
		ctx.waitUntil(
			fetch("https://logs.example.com", {
				method: "POST",
				body: JSON.stringify({
					customer_name,
					original_url,
				}),
			}),
		);

		const url = new URL(original_url);
		if (url.host === "api.example.com") {
			// pre-auth requests to our API
			const jwt = make_jwt_for_customer(customer_name);

			let headers = new Headers(request.headers);
			headers.set("Authorization", `Bearer ${jwt}`);

			// clone the request to set new headers using existing body
			let new_request = new Request(request, { headers });

			return fetch(new_request);
		}

		return fetch(request);
	},
};