UNPKG

durable-utils

Version:

Utilities for Cloudflare Durable Objects and Workers, including SQL migrations, sharding and retry utilities, and more.

71 lines (70 loc) 2.57 kB
// src/experimental/region-placer.ts import { DurableObject, WorkerEntrypoint, RpcTarget } from "cloudflare:workers"; var RegionPlacerDO = class extends DurableObject { async createExecutorStub(bindingName, locationHint) { if (!this.env[bindingName]?.createRegionPlacedWorkerEntrypoint) { throw new Error("RegionPlacerDO: invalid bindingName given"); } return this.env[bindingName].createRegionPlacedWorkerEntrypoint(locationHint); } }; var RegionPlacer = class extends WorkerEntrypoint { async place(locationHint, bindingName) { return await createDOStub(this.env, locationHint).createExecutorStub(bindingName, locationHint); } }; var RegionPlaceableWorkerEntrypoint = class extends WorkerEntrypoint { async createRegionPlacedWorkerEntrypoint(locationHint) { return new RegionPlaceableTarget(this, locationHint); } async regionPlace(locationHint) { const thisClassName = Object.getPrototypeOf(this)?.constructor?.name; if (!thisClassName) { throw new Error("could not infer the class name of the WorkerEntrypoint attempting to regionPlane()"); } let bindingName = ""; Object.getOwnPropertyNames(this.env).forEach((value) => { if (value.toLowerCase() === thisClassName.toLowerCase()) { bindingName = value; } }); if (!bindingName) { throw new Error( `could not find the right Binding to invoke on this.env. Inferred binding name not found is '${thisClassName}'` ); } return createDOStub(this.env, locationHint).createExecutorStub(bindingName, locationHint); } }; var RegionPlaceableTarget = class extends RpcTarget { #locationHint; constructor(we, locationHint) { super(); this.#locationHint = locationHint; const targetPrototype = Object.getPrototypeOf(we); const thisPrototype = Object.getPrototypeOf(this); Object.getOwnPropertyNames(targetPrototype).forEach((value) => { if (value === "constructor" || value === "regionPlace" || typeof targetPrototype[value] !== "function") { return; } thisPrototype[value] = targetPrototype[value]; }); } async targetLocationHint() { return this.#locationHint; } }; function createDOStub(env, locationHint) { const shard = Math.ceil(Math.random() * 100); const doId = env.RegionPlacerDO.idFromName(`region-placer-${locationHint}-${shard}`); const doStub = env.RegionPlacerDO.get(doId, { locationHint }); return doStub; } export { RegionPlaceableTarget, RegionPlaceableWorkerEntrypoint, RegionPlacer, RegionPlacerDO };