import type { BlipClient } from '../client.ts' import { uri } from '../utils/uri.ts' import { type ConsumeOptions, Namespace, type SendCommandOptions } from './namespace.ts' export class MediaNamespace extends Namespace { constructor(blipClient: BlipClient, defaultOptions?: SendCommandOptions) { super(blipClient, 'media', defaultOptions) } public async getMediaUploadUrl(opts?: ConsumeOptions): Promise { return await this.sendCommand( { method: 'get', uri: uri`/upload-media-uri`, }, opts, ) } public async uploadMedia( mimetype: string, media: BufferSource | Blob | string | ReadableStream, opts?: ConsumeOptions, ): Promise { const url = await this.getMediaUploadUrl(opts) const uploadResponse = await fetch(url, { method: 'POST', headers: { 'Content-Type': mimetype, }, body: media, }) if (!uploadResponse.ok) { throw new Error(`Failed to upload media: ${uploadResponse.statusText}`) } const { mediaUri } = await uploadResponse.json() return mediaUri } public async refreshMedia(url: string, opts?: ConsumeOptions): Promise { return await this.sendCommand( { method: 'set', uri: uri`/refresh-media-uri`, type: 'text/plain', resource: url, }, opts, ) } }