///
///
import {
handleApiRequest,
handleExtractBookmarkMetadataRequest,
handleUserAssetGet,
handleUserAssetUpload,
notFound,
type R2BucketLike,
} from '@tldraw/worker-shared'
import { WorkerEntrypoint } from 'cloudflare:workers'
import { Router, cors } from 'itty-router'
import { Environment } from './types'
export { BemoDO } from './BemoDO'
const { preflight, corsify } = cors({ origin: '*' })
export default class Worker extends WorkerEntrypoint {
private readonly router = Router()
.all('*', preflight)
.get('/uploads/:objectName', (request) => {
const bucket = this.env.BEMO_BUCKET as R2BucketLike
return handleUserAssetGet({
request,
bucket,
objectName: `asset-uploads/${request.params.objectName}`,
context: this.ctx,
})
})
.post('/uploads/:objectName', async (request) => {
const bucket = this.env.BEMO_BUCKET as R2BucketLike
return handleUserAssetUpload({
headers: request.headers,
body: request.body,
bucket,
objectName: `asset-uploads/${request.params.objectName}`,
})
})
.get('/bookmarks/unfurl', (request) => {
// legacy route: extract metadata without saving image
return handleExtractBookmarkMetadataRequest({ request })
})
.post('/bookmarks/unfurl', (request) => {
const bucket = this.env.BEMO_BUCKET as R2BucketLike
return handleExtractBookmarkMetadataRequest({
request,
uploadImage: async (headers, body, objectName) => {
const response = await handleUserAssetUpload({
body,
headers,
bucket,
objectName: `bookmark-assets/${objectName}`,
})
if (!response.ok) throw new Error('Failed to upload image')
const requestUrl = new URL(request.url)
return `${requestUrl.origin}/bookmarks/assets/${objectName}`
},
})
})
.get('/bookmarks/assets/:objectName', (request) => {
const bucket = this.env.BEMO_BUCKET as R2BucketLike
return handleUserAssetGet({
request,
bucket,
objectName: `bookmark-assets/${request.params.objectName}`,
context: this.ctx,
})
})
.get('/connect/:slug', (request) => {
const slug = request.params.slug
if (!slug) return new Response('Not found', { status: 404 })
// Set up the durable object for this room
const id = this.env.BEMO_DO.idFromName(slug)
return this.env.BEMO_DO.get(id).fetch(request)
})
.all('*', notFound)
override async fetch(request: Request): Promise {
return handleApiRequest({
router: this.router,
request,
env: this.env,
ctx: this.ctx,
after: corsify,
})
}
}