Yusuke Wada
Workers Tech Talks in Osaka #3
::right::

::right::

import { Hono } from 'hono'
const app = new Hono<{ Bindings: Env }>()
app.get('/markdown', (c) => {
const url = c.req.query('url') ?? 'https://example.com'
return c.env.BROWSER.quickAction('markdown', { url })
})
export default app
demos
browser-runcrond1durable-objects::right::

https://cf-demos.yusuke.run/::right::

// cloudflare-demos/demos/browser-run/src/index.ts
import { Hono } from 'hono'
const app = new Hono<{ Bindings: Env }>()
app.get('/markdown', (c) => {
const url = c.req.query('url') ?? 'https://example.com'
return c.env.BROWSER.quickAction('markdown', { url })
})
export default app
::right::

// src/index.ts
export default {
async fetch(request, env): {
const worker = env.LOADER.load({
compatibilityDate: '2026-06-01',
mainModule: 'src/index.js',
modules: {
'src/index.js': `
export default {
fetch(request) {
return new Response("Hello from a dynamic Worker");
},
};
`
}
})
const entrypoint = worker.getEntrypoint()
return entrypoint.fetch(request)
}
}
詳しくは2026年6月3日「Workers Tech Talks in Hokkaido #2」でやった「Dynamic Workersについて」を参考に
// demos/kv/src/index.ts
import { Hono } from 'hono'
const app = new Hono<{ Bindings: Env }>()
app.get('/keys/:key', async (c) => {
const value = await c.env.KV.get(c.req.param('key'))
return c.text(value)
})
export default app
WebのUI

::right::
親Workerへのリクエスト
// GET /run/kv/keys/greeting
fetch('/run/kv/keys/greeting')
app.all('/run/:name/*', ...)が実行される/run/kv/keys/greeting => 「kv」のデモコードを取得/keys/greetingに書き換えて、デモWorkerにリクエストを送るapp.get('/keys/:key', ...)が動く
env.KV はそのまま渡せないglobalOutbound: null等)デモのコードは本物のWorkerと同じまま、実行環境だけ多人数共有のサンドボックスにする
WorkerEntrypointで定義import { WorkerEntrypoint } from 'cloudflare:workers'
export class KVFacade extends WorkerEntrypoint<Env, Props> {
#key(key: string) {
// prefix => `sessions:${sid}:kv`
return `${this.ctx.props.prefix}:${key}`
}
get(key: string) {
return this.env.SITE_KV.get(this.#key(key))
}
}
exportsからカスタムBindingsを取得KVの名前で参照可能にconst worker = c.env.LOADER.get(`kv@${sid}`, async () => ({
mainModule: 'index.js',
modules: { 'index.js': bundle },
env: {
KV: c.executionCtx.exports.KVFacade({ props: { prefix: `sessions:${sid}:kv` } }) }
},
globalOutbound: null
}))

RUN_LIMITER(30回/分・IPごと)- 通常デモAI_LIMITER(5回/分・IPごと)— Workers AI / Browser Runなど高いサービスDEMO_LIMITER(5回/分)— Rate Limitingのデモ用