From ca38c7cb5b2a5dd52adbba441166f6069be5dcc2 Mon Sep 17 00:00:00 2001 From: Zach Newton Date: Mon, 3 Nov 2025 14:43:39 -0800 Subject: [PATCH] feat(odsp-client): Expose container.uploadBlob --- .../odsp-client/api-report/odsp-client.alpha.api.md | 1 + .../odsp-client/api-report/odsp-client.beta.api.md | 1 + packages/service-clients/odsp-client/src/interfaces.ts | 7 +++++++ packages/service-clients/odsp-client/src/odspClient.ts | 7 +++++++ 4 files changed, 16 insertions(+) diff --git a/packages/service-clients/odsp-client/api-report/odsp-client.alpha.api.md b/packages/service-clients/odsp-client/api-report/odsp-client.alpha.api.md index 8a0462d5c31d..5972f0bb8e70 100644 --- a/packages/service-clients/odsp-client/api-report/odsp-client.alpha.api.md +++ b/packages/service-clients/odsp-client/api-report/odsp-client.alpha.api.md @@ -10,6 +10,7 @@ export type IOdspAudience = IServiceAudience; // @beta export interface IOdspFluidContainer extends IFluidContainer { attach(props?: ContainerAttachProps): Promise; + uploadBlob(blob: ArrayBufferLike): Promise>; } // @beta diff --git a/packages/service-clients/odsp-client/api-report/odsp-client.beta.api.md b/packages/service-clients/odsp-client/api-report/odsp-client.beta.api.md index fc893e97c251..5f34a2b56f97 100644 --- a/packages/service-clients/odsp-client/api-report/odsp-client.beta.api.md +++ b/packages/service-clients/odsp-client/api-report/odsp-client.beta.api.md @@ -10,6 +10,7 @@ export type IOdspAudience = IServiceAudience; // @beta export interface IOdspFluidContainer extends IFluidContainer { attach(props?: ContainerAttachProps): Promise; + uploadBlob(blob: ArrayBufferLike): Promise>; } // @beta diff --git a/packages/service-clients/odsp-client/src/interfaces.ts b/packages/service-clients/odsp-client/src/interfaces.ts index 2096dd4333d7..620a33bd445c 100644 --- a/packages/service-clients/odsp-client/src/interfaces.ts +++ b/packages/service-clients/odsp-client/src/interfaces.ts @@ -5,6 +5,7 @@ import type { IConfigProviderBase, + IFluidHandle, ITelemetryBaseLogger, } from "@fluidframework/core-interfaces"; import type { @@ -97,6 +98,12 @@ export interface IOdspFluidContainer< * @returns A promise which resolves when the attach is complete, with the string identifier of the container. */ attach(props?: ContainerAttachProps): Promise; + + /** + * Upload a blob of data. + * @param blob - The blob to upload to the ODSP service. + */ + uploadBlob(blob: ArrayBufferLike): Promise>; } /** diff --git a/packages/service-clients/odsp-client/src/odspClient.ts b/packages/service-clients/odsp-client/src/odspClient.ts index 44459bd74d50..db8690c54095 100644 --- a/packages/service-clients/odsp-client/src/odspClient.ts +++ b/packages/service-clients/odsp-client/src/odspClient.ts @@ -24,6 +24,7 @@ import type { ContainerAttachProps, ContainerSchema } from "@fluidframework/flui import { createDOProviderContainerRuntimeFactory, createFluidContainer, + isInternalFluidContainer, } from "@fluidframework/fluid-static/internal"; import { OdspDocumentServiceFactory, @@ -155,6 +156,9 @@ export class OdspClient { const fluidContainer = await createFluidContainer({ container, }); + if (!isInternalFluidContainer(fluidContainer)) { + throw new Error("Fluid container is not internal"); + } const services = await this.getContainerServices(container); return { container: fluidContainer, services }; } @@ -227,6 +231,9 @@ export class OdspClient { return resolvedUrl.itemId; }; const fluidContainer = await createFluidContainer({ container }); + if (!isInternalFluidContainer(fluidContainer)) { + throw new Error("Fluid container is not internal"); + } fluidContainer.attach = attach; return fluidContainer; }