{
  "version": 3,
  "sources": ["../../../../src/workers/stream/binding.worker.ts", "../../../../src/workers/stream/errors.ts", "../../../../src/workers/stream/schemas.ts"],
  "sourcesContent": ["import { RpcTarget, WorkerEntrypoint } from \"cloudflare:workers\";\nimport { getPublicUrl } from \"miniflare:shared\";\nimport { BadRequestError, InvalidURLError } from \"./errors\";\nimport {\n\trowToStreamCaption,\n\trowToStreamDownload,\n\trowToStreamVideo,\n\trowToStreamWatermark,\n} from \"./schemas\";\nimport type { StreamObject } from \"./object.worker\";\n\ninterface Env {\n\tstore: DurableObjectNamespace<StreamObject>;\n\tMINIFLARE_LOOPBACK: Fetcher;\n}\n\nfunction getStub(env: Env): DurableObjectStub<StreamObject> {\n\tconst id = env.store.idFromName(\"stream-data\");\n\treturn env.store.get(id);\n}\n\nfunction rowsToDownloadResponse(\n\trows: { type: StreamDownloadType; download: StreamDownload }[]\n): StreamDownloadGetResponse {\n\tconst result: StreamDownloadGetResponse = {};\n\tfor (const { type, download } of rows) {\n\t\tresult[type] = download;\n\t}\n\treturn result;\n}\n\nexport class StreamBinding extends WorkerEntrypoint<Env> {\n\tasync fetch(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\t\tconst match = url.pathname.match(/^\\/cdn-cgi\\/mf\\/stream\\/([^/]+)\\/watch$/);\n\t\tif (!match) {\n\t\t\treturn new Response(\"Not found\", { status: 404 });\n\t\t}\n\n\t\tconst videoId = match[1];\n\t\tconst stub = getStub(this.env);\n\n\t\t// Get video blob from Durable Object\n\t\tconst result = await stub.getVideoBlob(videoId);\n\t\tif (result === null) {\n\t\t\treturn new Response(\"Video not found\", { status: 404 });\n\t\t}\n\n\t\treturn new Response(result.stream, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"video/mp4\",\n\t\t\t\t\"Content-Length\": result.size.toString(),\n\t\t\t},\n\t\t});\n\t}\n\n\tasync upload(\n\t\turlOrBody: string | ReadableStream<Uint8Array>,\n\t\tparams?: StreamUrlUploadParams\n\t): Promise<StreamVideo> {\n\t\tlet body: ReadableStream<Uint8Array>;\n\t\tif (typeof urlOrBody === \"string\") {\n\t\t\tconst response = await fetch(urlOrBody);\n\t\t\tif (!response.ok || response.body === null) {\n\t\t\t\tthrow new InvalidURLError(\n\t\t\t\t\t`Failed to fetch video from URL: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tbody = response.body;\n\t\t} else {\n\t\t\tbody = urlOrBody;\n\t\t}\n\t\tconst stub = getStub(this.env);\n\t\tconst row = await stub.createVideo(body, params ?? {});\n\t\tconst entryUrl = await getPublicUrl(this.env.MINIFLARE_LOOPBACK);\n\t\treturn rowToStreamVideo(row, entryUrl);\n\t}\n\n\t// Not supported in local mode yet\n\tasync createDirectUpload(\n\t\t_params: StreamDirectUploadCreateParams\n\t): Promise<StreamDirectUpload> {\n\t\tthrow new BadRequestError(\n\t\t\t\"createDirectUpload is not supported in local mode\"\n\t\t);\n\t}\n\n\tvideo(id: string): StreamVideoHandle {\n\t\treturn new StreamVideoHandleImpl(this.env, id);\n\t}\n\n\tget videos(): StreamVideos {\n\t\treturn new StreamVideosImpl(this.env);\n\t}\n\n\tget watermarks(): StreamWatermarks {\n\t\treturn new StreamWatermarksImpl(this.env);\n\t}\n}\n\nclass StreamScopedCaptionsImpl\n\textends RpcTarget\n\timplements StreamScopedCaptions\n{\n\treadonly #env: Env;\n\treadonly #videoId: string;\n\n\tconstructor(env: Env, videoId: string) {\n\t\tsuper();\n\t\tthis.#env = env;\n\t\tthis.#videoId = videoId;\n\t}\n\n\tasync upload(\n\t\tlanguage: string,\n\t\tinput: ReadableStream\n\t): Promise<StreamCaption> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst row = await stub.uploadCaption(this.#videoId, language, input);\n\t\treturn rowToStreamCaption(row);\n\t}\n\n\tasync generate(language: string): Promise<StreamCaption> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst row = await stub.generateCaption(this.#videoId, language);\n\t\treturn rowToStreamCaption(row);\n\t}\n\n\tasync list(language?: string): Promise<StreamCaption[]> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst rows = await stub.listCaptions(this.#videoId, language);\n\t\treturn rows.map(rowToStreamCaption);\n\t}\n\n\tasync delete(language: string): Promise<void> {\n\t\tconst stub = getStub(this.#env);\n\t\tawait stub.deleteCaption(this.#videoId, language);\n\t}\n}\n\nclass StreamScopedDownloadsImpl\n\textends RpcTarget\n\timplements StreamScopedDownloads\n{\n\treadonly #env: Env;\n\treadonly #videoId: string;\n\n\tconstructor(env: Env, videoId: string) {\n\t\tsuper();\n\t\tthis.#env = env;\n\t\tthis.#videoId = videoId;\n\t}\n\n\tasync generate(\n\t\tdownloadType: StreamDownloadType = \"default\"\n\t): Promise<StreamDownloadGetResponse> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst rows = await stub.generateDownload(this.#videoId, downloadType);\n\t\treturn rowsToDownloadResponse(rows.map(rowToStreamDownload));\n\t}\n\n\tasync get(): Promise<StreamDownloadGetResponse> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst rows = await stub.listDownloads(this.#videoId);\n\t\treturn rowsToDownloadResponse(rows.map(rowToStreamDownload));\n\t}\n\n\tasync delete(downloadType: StreamDownloadType = \"default\"): Promise<void> {\n\t\tconst stub = getStub(this.#env);\n\t\tawait stub.deleteDownload(this.#videoId, downloadType);\n\t}\n}\n\nclass StreamVideoHandleImpl extends RpcTarget implements StreamVideoHandle {\n\treadonly id: string;\n\treadonly #env: Env;\n\n\tconstructor(env: Env, id: string) {\n\t\tsuper();\n\t\tthis.#env = env;\n\t\tthis.id = id;\n\t}\n\n\tasync details(): Promise<StreamVideo> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst row = await stub.getVideo(this.id);\n\t\tconst entryUrl = await getPublicUrl(this.#env.MINIFLARE_LOOPBACK);\n\t\treturn rowToStreamVideo(row, entryUrl);\n\t}\n\n\tasync update(params: StreamUpdateVideoParams): Promise<StreamVideo> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst row = await stub.updateVideo(this.id, params);\n\t\tconst entryUrl = await getPublicUrl(this.#env.MINIFLARE_LOOPBACK);\n\t\treturn rowToStreamVideo(row, entryUrl);\n\t}\n\n\tasync delete(): Promise<void> {\n\t\tconst stub = getStub(this.#env);\n\t\tawait stub.deleteVideo(this.id);\n\t}\n\n\tasync generateToken(): Promise<string> {\n\t\tconst stub = getStub(this.#env);\n\t\treturn stub.generateToken(this.id);\n\t}\n\n\tget downloads(): StreamScopedDownloads {\n\t\treturn new StreamScopedDownloadsImpl(this.#env, this.id);\n\t}\n\n\tget captions(): StreamScopedCaptions {\n\t\treturn new StreamScopedCaptionsImpl(this.#env, this.id);\n\t}\n}\n\nclass StreamVideosImpl extends RpcTarget implements StreamVideos {\n\treadonly #env: Env;\n\n\tconstructor(env: Env) {\n\t\tsuper();\n\t\tthis.#env = env;\n\t}\n\n\tasync list(params?: StreamVideosListParams): Promise<StreamVideo[]> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst rows = await stub.listVideos(params);\n\t\tconst entryUrl = await getPublicUrl(this.#env.MINIFLARE_LOOPBACK);\n\t\treturn rows.map((row) => rowToStreamVideo(row, entryUrl));\n\t}\n}\n\nclass StreamWatermarksImpl extends RpcTarget implements StreamWatermarks {\n\treadonly #env: Env;\n\n\tconstructor(env: Env) {\n\t\tsuper();\n\t\tthis.#env = env;\n\t}\n\n\tasync generate(\n\t\tstreamOrUrl: ReadableStream | string,\n\t\tparams: StreamWatermarkCreateParams\n\t): Promise<StreamWatermark> {\n\t\tif (\n\t\t\tparams.opacity !== undefined &&\n\t\t\t(params.opacity < 0 || params.opacity > 1)\n\t\t) {\n\t\t\tthrow new BadRequestError(\"opacity must be between 0.0 and 1.0\");\n\t\t}\n\t\tif (\n\t\t\tparams.padding !== undefined &&\n\t\t\t(params.padding < 0 || params.padding > 1)\n\t\t) {\n\t\t\tthrow new BadRequestError(\"padding must be between 0.0 and 1.0\");\n\t\t}\n\t\tif (params.scale !== undefined && (params.scale < 0 || params.scale > 1)) {\n\t\t\tthrow new BadRequestError(\"scale must be between 0.0 and 1.0\");\n\t\t}\n\t\tconst stub = getStub(this.#env);\n\t\tif (typeof streamOrUrl === \"string\") {\n\t\t\tconst row = await stub.createWatermarkFromUrl(streamOrUrl, params);\n\t\t\treturn rowToStreamWatermark(row);\n\t\t}\n\t\t// ReadableStream \u2014 pre-fetched data passed directly\n\t\tconst buffer = await new Response(streamOrUrl).arrayBuffer();\n\t\tconst row = await stub.createWatermarkFromBody(buffer, null, params);\n\t\treturn rowToStreamWatermark(row);\n\t}\n\n\tasync list(): Promise<StreamWatermark[]> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst rows = await stub.listWatermarks();\n\t\treturn rows.map(rowToStreamWatermark);\n\t}\n\n\tasync get(watermarkId: string): Promise<StreamWatermark> {\n\t\tconst stub = getStub(this.#env);\n\t\tconst row = await stub.getWatermark(watermarkId);\n\t\treturn rowToStreamWatermark(row);\n\t}\n\n\tasync delete(watermarkId: string): Promise<void> {\n\t\tconst stub = getStub(this.#env);\n\t\tawait stub.deleteWatermark(watermarkId);\n\t}\n}\n", "export class StreamBindingError extends Error implements StreamError {\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly code: number,\n\t\treadonly statusCode: number\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"StreamBindingError\";\n\t}\n}\n\nexport class BadRequestError extends StreamBindingError {\n\tconstructor(message = \"Bad Request\") {\n\t\tsuper(message, 10005, 400);\n\t\tthis.name = \"BadRequestError\";\n\t}\n}\n\nexport class NotFoundError extends StreamBindingError {\n\tconstructor(message = \"Not Found\") {\n\t\tsuper(message, 10003, 404);\n\t\tthis.name = \"NotFoundError\";\n\t}\n}\n\nexport class InvalidURLError extends StreamBindingError {\n\tconstructor(message = \"Invalid URL\") {\n\t\tsuper(message, 10010, 400);\n\t\tthis.name = \"InvalidURLError\";\n\t}\n}\n", "export const SQL_SCHEMA = `\nCREATE TABLE IF NOT EXISTS _mf_stream_videos (\n  id                      TEXT PRIMARY KEY,\n  creator                 TEXT,\n  thumbnail               TEXT NOT NULL DEFAULT '',\n  thumbnail_timestamp_pct REAL NOT NULL DEFAULT 0.0,\n  ready_to_stream         INTEGER NOT NULL DEFAULT 1,\n  ready_to_stream_at      TEXT,\n  status_state            TEXT NOT NULL DEFAULT 'ready',\n  status_pct_complete     TEXT,\n  status_error_reason_code TEXT NOT NULL DEFAULT '',\n  status_error_reason_text TEXT NOT NULL DEFAULT '',\n  meta                    TEXT NOT NULL DEFAULT '{}',\n  created                 TEXT NOT NULL,\n  modified                TEXT NOT NULL,\n  scheduled_deletion      TEXT,\n  size                    INTEGER NOT NULL DEFAULT 0,\n  allowed_origins         TEXT NOT NULL DEFAULT '[]',\n  require_signed_urls     INTEGER,\n  uploaded                TEXT,\n  upload_expiry           TEXT,\n  max_size_bytes          INTEGER,\n  max_duration_seconds    INTEGER,\n  duration                REAL NOT NULL DEFAULT -1.0,\n  input_width             INTEGER NOT NULL DEFAULT 0,\n  input_height            INTEGER NOT NULL DEFAULT 0,\n  live_input_id           TEXT,\n  clipped_from_id         TEXT,\n  blob_id                 TEXT\n);\n\nCREATE TABLE IF NOT EXISTS _mf_stream_captions (\n  video_id   TEXT NOT NULL,\n  language   TEXT NOT NULL,\n  generated  INTEGER NOT NULL DEFAULT 0,\n  label      TEXT NOT NULL DEFAULT '',\n  status     TEXT,\n  blob_id    TEXT,\n  PRIMARY KEY (video_id, language),\n  FOREIGN KEY (video_id) REFERENCES _mf_stream_videos(id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS _mf_stream_watermarks (\n  id              TEXT PRIMARY KEY,\n  name            TEXT NOT NULL DEFAULT '',\n  size            INTEGER NOT NULL DEFAULT 0,\n  height          INTEGER NOT NULL DEFAULT 0,\n  width           INTEGER NOT NULL DEFAULT 0,\n  created         TEXT NOT NULL,\n  downloaded_from TEXT,\n  opacity         REAL NOT NULL DEFAULT 1.0,\n  padding         REAL NOT NULL DEFAULT 0.05,\n  scale           REAL NOT NULL DEFAULT 0.15,\n  position        TEXT NOT NULL DEFAULT 'upperRight',\n  blob_id         TEXT\n);\n\nCREATE TABLE IF NOT EXISTS _mf_stream_downloads (\n  video_id         TEXT NOT NULL,\n  download_type    TEXT NOT NULL DEFAULT 'default',\n  status           TEXT NOT NULL DEFAULT 'ready',\n  percent_complete REAL NOT NULL DEFAULT 100.0,\n  url              TEXT,\n  PRIMARY KEY (video_id, download_type),\n  FOREIGN KEY (video_id) REFERENCES _mf_stream_videos(id) ON DELETE CASCADE\n);\n`;\n\nexport type VideoRow = {\n\tid: string;\n\tcreator: string | null;\n\tthumbnail: string;\n\tthumbnail_timestamp_pct: number;\n\tready_to_stream: number;\n\tready_to_stream_at: string | null;\n\tstatus_state: string;\n\tstatus_pct_complete: string | null;\n\tstatus_error_reason_code: string;\n\tstatus_error_reason_text: string;\n\tmeta: string;\n\tcreated: string;\n\tmodified: string;\n\tscheduled_deletion: string | null;\n\tsize: number;\n\tallowed_origins: string;\n\trequire_signed_urls: number | null;\n\tuploaded: string | null;\n\tupload_expiry: string | null;\n\tmax_size_bytes: number | null;\n\tmax_duration_seconds: number | null;\n\tduration: number;\n\tinput_width: number;\n\tinput_height: number;\n\tlive_input_id: string | null;\n\tclipped_from_id: string | null;\n\tblob_id: string | null;\n};\n\nexport type CaptionRow = {\n\tvideo_id: string;\n\tlanguage: string;\n\tgenerated: number;\n\tlabel: string;\n\tstatus: string | null;\n\tblob_id: string | null;\n};\n\nexport type WatermarkRow = {\n\tid: string;\n\tname: string;\n\tsize: number;\n\theight: number;\n\twidth: number;\n\tcreated: string;\n\tdownloaded_from: string | null;\n\topacity: number;\n\tpadding: number;\n\tscale: number;\n\tposition: string;\n\tblob_id: string | null;\n};\n\nexport type DownloadRow = {\n\tvideo_id: string;\n\tdownload_type: StreamDownloadType;\n\tstatus: string;\n\tpercent_complete: number;\n\turl: string | null;\n};\n\nexport function rowToStreamVideo(row: VideoRow, entryUrl: URL): StreamVideo {\n\tconst placeholderUrl = `https://customer-placeholder.cloudflarestream.com/${row.id}`;\n\tconst videoUrl = `${entryUrl.origin}/cdn-cgi/mf/stream/${row.id}/watch`;\n\treturn {\n\t\tid: row.id,\n\t\tcreator: row.creator,\n\t\tthumbnail: row.thumbnail || `${placeholderUrl}/thumbnails/thumbnail.jpg`,\n\t\tthumbnailTimestampPct: row.thumbnail_timestamp_pct,\n\t\treadyToStream: row.ready_to_stream === 1,\n\t\treadyToStreamAt: row.ready_to_stream_at,\n\t\tstatus: {\n\t\t\tstate: row.status_state,\n\t\t\tpctComplete: row.status_pct_complete ?? undefined,\n\t\t\terrorReasonCode: row.status_error_reason_code,\n\t\t\terrorReasonText: row.status_error_reason_text,\n\t\t},\n\t\tmeta: JSON.parse(row.meta) as Record<string, string>,\n\t\tcreated: row.created,\n\t\tmodified: row.modified,\n\t\tscheduledDeletion: row.scheduled_deletion,\n\t\tsize: row.size,\n\t\tpreview: videoUrl,\n\t\tallowedOrigins: JSON.parse(row.allowed_origins) as string[],\n\t\trequireSignedURLs:\n\t\t\trow.require_signed_urls === null ? null : row.require_signed_urls === 1,\n\t\tuploaded: row.uploaded,\n\t\tuploadExpiry: row.upload_expiry,\n\t\tmaxSizeBytes: row.max_size_bytes,\n\t\tmaxDurationSeconds: row.max_duration_seconds,\n\t\tduration: row.duration,\n\t\tinput: { width: row.input_width, height: row.input_height },\n\t\thlsPlaybackUrl: `${placeholderUrl}/manifest/video.m3u8`,\n\t\tdashPlaybackUrl: `${placeholderUrl}/manifest/video.mpd`,\n\t\twatermark: null,\n\t\tliveInputId: row.live_input_id,\n\t\tclippedFromId: row.clipped_from_id,\n\t\tpublicDetails: null,\n\t};\n}\n\nexport function rowToStreamCaption(row: CaptionRow): StreamCaption {\n\treturn {\n\t\tlanguage: row.language,\n\t\tlabel: row.label || row.language,\n\t\tgenerated: row.generated === 1,\n\t\tstatus: row.status as StreamCaption[\"status\"],\n\t};\n}\n\nexport function rowToStreamWatermark(row: WatermarkRow): StreamWatermark {\n\treturn {\n\t\tid: row.id,\n\t\tname: row.name,\n\t\tsize: row.size,\n\t\theight: row.height,\n\t\twidth: row.width,\n\t\tcreated: row.created,\n\t\tdownloadedFrom: row.downloaded_from,\n\t\topacity: row.opacity,\n\t\tpadding: row.padding,\n\t\tscale: row.scale,\n\t\tposition: row.position as StreamWatermarkPosition,\n\t};\n}\n\nexport function rowToStreamDownload(row: DownloadRow): {\n\ttype: StreamDownloadType;\n\tdownload: StreamDownload;\n} {\n\treturn {\n\t\ttype: row.download_type,\n\t\tdownload: {\n\t\t\tpercentComplete: row.percent_complete,\n\t\t\tstatus: row.status as StreamDownloadStatus,\n\t\t\turl: row.url ?? undefined,\n\t\t},\n\t};\n}\n"],
  "mappings": "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",
  "names": ["row"]
}
