openvibe-sdk/media

Generated at from openvibe-contracts v0.33.0 and openvibe-sdk v0.5.0.

From types/media.d.ts (both). Declarations are shown verbatim.

interface MediaFile

export interface MediaFile {
    key: string;
    /** The tenant: the app id, a project id (prj_…) or its sandbox tenant (prj_…-sandbox). */
    app_id: string;
    user_id: string | number | null;
    original_name: string;
    size: number;
    mime: string;
    sha256: string;
    /** Media-relative, e.g. /f/<key>; for a sandbox file an absolute signed, expiring URL. */
    url: string;
    /** Absolute public URL, added by the SDK; null for sandbox files (never served publicly). */
    public_url: string | null;
    /** Sandbox files only (Media): the tenant is a developer project's sandbox. */
    sandbox?: true;
    /** Sandbox files only (Media): when `url` stops working. */
    url_expires_at?: string;
    /** Sandbox files only, added by the SDK: the signed `url`. */
    signed_url?: string;
    created_at: string;
    deduplicated?: boolean;
}

type UploadBody

export type UploadBody = Blob | ArrayBuffer | ArrayBufferView | string;

interface MediaUrls

export interface MediaUrls {
    origin: string;
    file(key: string): string;
    vod(id: string | number): string;
    clip(id: string | number): string;
    thumbnail(name: string): string;
    paste(slug: string): string;
    pasteRaw(slug: string): string;
    pasteScreenshot(slug: string): string;
    vodTranscript(id: string | number): string;
    liveTranscript(sel: string | number, opts?: { limit?: number; app?: string }): string;
    liveFrame(sel: string | number, opts?: { width?: number; app?: string; format?: 'json' }): string;
    absolute(path: string): string;
}

function mediaUrls

export declare function mediaUrls(origin?: string): MediaUrls;

interface MediaClient

export interface MediaClient {
    app: string;
    urls: MediaUrls;
    files: {
        upload(file: UploadBody, opts?: { filename?: string; contentType?: string; userId?: string | number; actingUserId?: string | number | null; signal?: AbortSignal }): Promise<MediaFile>;
        list(opts?: { limit?: number; offset?: number }): Promise<{ files: MediaFile[]; used_bytes: number; quota_bytes: number; limit: number; offset: number }>;
        iterate(opts?: { pageSize?: number }): AsyncGenerator<MediaFile, void, unknown>;
        get(key: string): Promise<MediaFile | null>;
        delete(key: string, opts?: { actingUserId?: string | number | null }): Promise<boolean>;
    };
    upload: MediaClient['files']['upload'];
}

function createMediaClient

apiKey: the app's Media API key (server only). Without it the client's token is used: a service token, or a developer app token with `app` = its project id (media.object.upload to upload and delete, media.object.read to list and get).

export declare function createMediaClient(client: OpenVibeClient, opts: { app: string; apiKey?: string; actingUserId?: string | number; baseUrl?: string; publicOrigin?: string }): MediaClient;

const DEFAULT_PUBLIC_ORIGIN

export declare const DEFAULT_PUBLIC_ORIGIN: string;

interface MediaObject

A Media object (object API v2, `/api/v2/:app/objects`): Media's public shape.

export interface MediaObject {
    id: string;
    media_ref?: { media_id: string };
    legacy_ref?: string | null;
    app_id: string;
    namespace?: string;
    kind: 'vod' | 'clip' | 'file' | 'thumbnail' | 'screenshot' | 'avatar' | 'asset' | string;
    owner?: { subject: string | null; app: string | null; user_id: number | null };
    visibility: 'public' | 'unlisted' | 'private';
    lifecycle_status: 'uploading' | 'ready' | 'failed' | 'archived' | 'deleted' | string;
    mime_type: string | null;
    size_bytes: number;
    content_hash: string | null;
    metadata?: Record<string, unknown>;
    held?: boolean;
    /** Public/unlisted and ready: the public URL; null otherwise (private, sandbox). */
    public_url?: string | null;
    sandbox?: true;
    locations?: Array<{ provider: 'local' | 'b2' | 'r2'; storage_class: string | null; state: string; size_bytes: number | null; verified_at: string | null; canonical: boolean }>;
    created_at?: string;
    updated_at?: string;
    deleted_at?: string | null;
    [key: string]: unknown;
}

interface MediaJob

A Media job (`/api/v2/:app/jobs`).

export interface MediaJob {
    id: string;
    app_id: string;
    object_id: string | null;
    type: 'thumbnail.regenerate' | 'invariant.scan' | 'object.split' | 'object.remux' | string;
    status: 'proposed' | 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';
    params: Record<string, unknown>;
    result: unknown;
    error: string | null;
    error_code: string | null;
    attempts: number;
    max_attempts: number;
    cancel_requested: boolean;
    idempotency_key: string | null;
    created_at: string;
    finished_at: string | null;
    [key: string]: unknown;
}

interface ObjectUploadOptions

export interface ObjectUploadOptions {
    kind?: MediaObject['kind'];
    visibility?: MediaObject['visibility'];
    mimeType?: string;
    contentType?: string;
    filename?: string;
    metadata?: Record<string, unknown>;
    /** Expected sha256 (hex) for Media to verify; computed when omitted and the data is at most hashMaxBytes; false: none. */
    contentHash?: string | false;
    userId?: number;
    subject?: string | null;
    actingUserId?: string | number | null;
    /** 'auto' (default): multipart above multipartThreshold, or when Media refuses one part. */
    multipart?: 'auto' | boolean;
    partSize?: number;
    uploadTtl?: number;
    signal?: AbortSignal;
    onProgress?(p: { uploadedBytes: number; totalBytes: number; part?: number }): void;
}

interface ObjectUploadRef

err.resume of an sdk.upload_incomplete error.

export interface ObjectUploadRef { objectId: string; uploadId: string; missing?: number[] }

interface ObjectsClient

export interface ObjectsClient {
    app: string;
    /** Media's origin: the baseUrl option, or the platform descriptor's live origin for `media`. */
    baseUrl(): Promise<string>;
    upload(data: UploadBody, opts?: ObjectUploadOptions): Promise<MediaObject>;
    resume(ref: ObjectUploadRef, data: UploadBody, opts?: { signal?: AbortSignal; onProgress?: ObjectUploadOptions['onProgress']; contentHash?: string | false }): Promise<MediaObject>;
    get(id: string): Promise<MediaObject | null>;
    signedUrl(id: string, opts?: { ttl?: number }): Promise<{ url: string; expires_at: string | null; public: boolean }>;
    delete(id: string): Promise<boolean>;
    list(opts?: { kind?: string; visibility?: string; status?: string; owner?: string; userId?: number; limit?: number; cursor?: string; includeDeleted?: boolean }): Promise<{ objects: MediaObject[]; next_cursor: string | null; limit: number }>;
    iterate(opts?: { kind?: string; visibility?: string; status?: string; owner?: string; userId?: number; limit?: number; includeDeleted?: boolean }): AsyncGenerator<MediaObject, void, unknown>;
    jobs: {
        create(opts: { type: MediaJob['type']; objectId?: string; params?: Record<string, unknown>; idempotencyKey?: string; maxAttempts?: number }): Promise<MediaJob>;
        get(id: string): Promise<MediaJob | null>;
        list(opts?: { status?: MediaJob['status']; type?: string; objectId?: string; limit?: number; cursor?: string }): Promise<{ jobs: MediaJob[]; next_cursor: string | null; limit: number }>;
        approve(id: string): Promise<MediaJob>;
        cancel(id: string): Promise<MediaJob>;
        wait(id: string, opts?: { intervalMs?: number; timeoutMs?: number; signal?: AbortSignal }): Promise<MediaJob | null>;
    };
    client: OpenVibeClient;
}

function createObjectsClient

Media's object API v2. Credentials: tokenClient (createServiceTokenClient; media.object.upload and media.object.read for namespace `app`), apiKey, or a client carrying its own. Without baseUrl the Media origin comes from the platform descriptor (live services only; otherwise sdk.service_unavailable).

export declare function createObjectsClient(opts: {
    app: string;
    baseUrl?: string;
    tokenClient?: { getToken(ctx?: { audience?: string; scope?: string | string[] }): Promise<string>; invalidate?(ctx?: { audience?: string }): void };
    apiKey?: string;
    client?: OpenVibeClient;
    network?: string;
    discoveryUrl?: string;
    fetch?: typeof fetch;
    actingUserId?: string | number;
    subject?: string;
    /** Default 64 MiB. */
    multipartThreshold?: number;
    /** Default 16 MiB (Media accepts 5-256 MB by default). */
    partSize?: number;
    /** Parts in flight at once; default 4. */
    concurrency?: number;
    /** Whole-object sha256 is computed up to this size; default 256 MiB. */
    hashMaxBytes?: number;
    /** Extra rounds for parts that failed; default 3. */
    resumeRounds?: number;
    timeoutMs?: number;
    partTimeoutMs?: number;
}): ObjectsClient;