@fluidframework/odsp-client 2.74.0 → 2.81.0-374083

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluid-experimental/odsp-client
2
2
 
3
+ ## 2.80.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.74.0
4
8
 
5
9
  Dependency updates only.
@@ -16,6 +16,7 @@ export interface IOdspContainerServicesEvents {
16
16
  // @beta
17
17
  export interface IOdspFluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema> extends IFluidContainer<TContainerSchema> {
18
18
  attach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;
19
+ uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
19
20
  }
20
21
 
21
22
  // @beta
@@ -16,6 +16,7 @@ export interface IOdspContainerServicesEvents {
16
16
  // @beta
17
17
  export interface IOdspFluidContainer<TContainerSchema extends ContainerSchema = ContainerSchema> extends IFluidContainer<TContainerSchema> {
18
18
  attach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;
19
+ uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
19
20
  }
20
21
 
21
22
  // @beta
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import type { IConfigProviderBase, IDisposable, ITelemetryBaseLogger, Listenable } from "@fluidframework/core-interfaces";
5
+ import type { IConfigProviderBase, IFluidHandle, IDisposable, ITelemetryBaseLogger, Listenable } from "@fluidframework/core-interfaces";
6
6
  import type { ContainerAttachProps, ContainerSchema, IFluidContainer, IMember, IServiceAudience } from "@fluidframework/fluid-static";
7
7
  import type { IOdspTokenProvider } from "./token.js";
8
8
  /**
@@ -93,6 +93,11 @@ export interface IOdspFluidContainer<TContainerSchema extends ContainerSchema =
93
93
  * @returns A promise which resolves when the attach is complete, with the string identifier of the container.
94
94
  */
95
95
  attach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;
96
+ /**
97
+ * Upload a blob of data.
98
+ * @param blob - The blob to upload to the ODSP service.
99
+ */
100
+ uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
96
101
  }
97
102
  /**
98
103
  * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,aAAa,EAAE,kBAAkB,CAAC;IAElC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB;AACD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;OAGG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CACnC,gBAAgB,SAAS,eAAe,GAAG,eAAe,CACzD,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAC1C;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,MAAM,EAAE,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAW,SAAQ,OAAO;IAC1C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,aAAa,EAAE,kBAAkB,CAAC;IAElC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB;AACD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;OAGG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CACnC,gBAAgB,SAAS,eAAe,GAAG,eAAe,CACzD,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAC1C;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhF;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;CAC1E;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,MAAM,EAAE,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAW,SAAQ,OAAO;IAC1C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIConfigProviderBase,\n\tIDisposable,\n\tITelemetryBaseLogger,\n\tListenable,\n} from \"@fluidframework/core-interfaces\";\nimport type {\n\tContainerAttachProps,\n\tContainerSchema,\n\tIFluidContainer,\n\tIMember,\n\tIServiceAudience,\n} from \"@fluidframework/fluid-static\";\n\nimport type { IOdspTokenProvider } from \"./token.js\";\n\n/**\n * Defines the necessary properties that will be applied to all containers\n * created by an OdspClient instance. This includes callbacks for the authentication tokens\n * required for ODSP.\n * @beta\n */\nexport interface OdspConnectionConfig {\n\t/**\n\t * Instance that provides AAD endpoint tokens for Push and SharePoint\n\t */\n\ttokenProvider: IOdspTokenProvider;\n\n\t/**\n\t * Site url representing ODSP resource location. It points to the specific SharePoint site where you can store and access the containers you create.\n\t */\n\tsiteUrl: string;\n\n\t/**\n\t * SharePoint Embedded Container Id of the tenant where Fluid containers are created\n\t */\n\tdriveId: string;\n\n\t/**\n\t * Specifies the file path where Fluid files are created. If passed an empty string, the Fluid files will be created at the root level.\n\t */\n\tfilePath: string;\n}\n/**\n * @beta\n */\nexport interface OdspClientProps {\n\t/**\n\t * Configuration for establishing a connection with the ODSP Fluid Service (Push).\n\t */\n\treadonly connection: OdspConnectionConfig;\n\n\t/**\n\t * Optional. A logger instance to receive diagnostic messages.\n\t */\n\treadonly logger?: ITelemetryBaseLogger;\n\n\t/**\n\t * Base interface for providing configurations to control experimental features. If unsure, leave this undefined.\n\t */\n\treadonly configProvider?: IConfigProviderBase;\n}\n\n/**\n * @beta\n */\nexport interface OdspContainerAttachProps {\n\t/**\n\t * The file path where Fluid containers are created. If undefined, the file is created at the root.\n\t */\n\tfilePath: string | undefined;\n\n\t/**\n\t * The file name of the Fluid file. If undefined, the file is named with a GUID.\n\t */\n\tfileName: string | undefined;\n}\n\n/**\n * Events emitted by the ODSP container service to notify consumers of select\n * container changes.\n * @beta\n * @sealed\n */\nexport interface IOdspContainerServicesEvents {\n\t/**\n\t * Emitted when the read-only state of the container changes.\n\t * Consumers can call `OdspContainerServices.getReadOnlyState()` to get the updated value.\n\t */\n\treadOnlyStateChanged: () => void;\n\t/**\n\t * Emitted when the sensitivity label of the container changes.\n\t * Consumers can call `OdspContainerServices.getSensitivityLabelsInfo()` to get the updated value.\n\t */\n\tsensitivityLabelsInfoChanged: () => void;\n}\n\n/**\n * ODSP version of the IFluidContainer interface.\n * @beta\n */\nexport interface IOdspFluidContainer<\n\tTContainerSchema extends ContainerSchema = ContainerSchema,\n> extends IFluidContainer<TContainerSchema> {\n\t/**\n\t * A newly created container starts detached from the collaborative service.\n\t * Calling `attach()` uploads the new container to the service and connects to the collaborative service.\n\t *\n\t * This function is the same as the IFluidContainer.attach function, but has ODSP specific function signatures.\n\t *\n\t * @param props - Optional properties to pass to the attach function.\n\t *\n\t * @returns A promise which resolves when the attach is complete, with the string identifier of the container.\n\t */\n\tattach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;\n}\n\n/**\n * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the\n * functionality specifically tied to the ODSP service, and how the data stored in the\n * FluidContainer is persisted in the backend and consumed by users. Any functionality regarding\n * how the data is handled within the FluidContainer itself, i.e. which data objects or DDSes to\n * use, will not be included here but rather on the FluidContainer class itself.\n * @beta\n * @sealed\n */\nexport interface OdspContainerServices extends IDisposable {\n\tevents: Listenable<IOdspContainerServicesEvents>;\n\t/**\n\t * Provides an object that facilitates obtaining information about users present in the Fluid session, as well as listeners for roster changes triggered by users joining or leaving the session.\n\t */\n\taudience: IOdspAudience;\n\n\t/**\n\t * Gets the read-only state of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state.\n\t * @remarks\n\t * In the case that the read-only state cannot be determined, wait for the \"readOnlyStateChanged\" event to be emitted.\n\t * @returns The read-only state (true when readonly, false when editable), or undefined if not available.\n\t */\n\tgetReadOnlyState(): boolean | undefined;\n\t/**\n\t * Gets the sensitivity labels info of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state, and will only be available\n\t * if sensitivity labels have been applied to the container.\n\t * @remarks\n\t * In the case that the sensitivity labels info are expected but cannot be determined, wait for the \"sensitivityLabelChanged\" event to be emitted.\n\t * @returns The sensitivity labels info string, or undefined if not available.\n\t */\n\tgetSensitivityLabelsInfo(): string | undefined;\n}\n\n/**\n * Since ODSP provides user names and email for all of its members, we extend the\n * {@link @fluidframework/fluid-static#IMember} interface to include this service-specific value.\n * It will be returned for all audience members connected.\n * @beta\n */\nexport interface OdspMember extends IMember {\n\t/**\n\t * The object ID (oid) for the user, unique among each individual user connecting to the session.\n\t */\n\tid: string;\n\t/**\n\t * The user's name\n\t */\n\tname: string;\n\t/**\n\t * The user's email\n\t */\n\temail: string;\n}\n\n/**\n * Audience object for ODSP containers\n * @beta\n */\nexport type IOdspAudience = IServiceAudience<OdspMember>;\n\n/**\n * Represents token response\n * @beta\n */\nexport interface TokenResponse {\n\t/**\n\t * Token value\n\t */\n\ttoken: string;\n\n\t/**\n\t * Whether or not the token was obtained from local cache.\n\t * @remarks `undefined` indicates that it could not be determined whether or not the token was obtained this way.\n\t */\n\tfromCache?: boolean;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIConfigProviderBase,\n\tIFluidHandle,\n\tIDisposable,\n\tITelemetryBaseLogger,\n\tListenable,\n} from \"@fluidframework/core-interfaces\";\nimport type {\n\tContainerAttachProps,\n\tContainerSchema,\n\tIFluidContainer,\n\tIMember,\n\tIServiceAudience,\n} from \"@fluidframework/fluid-static\";\n\nimport type { IOdspTokenProvider } from \"./token.js\";\n\n/**\n * Defines the necessary properties that will be applied to all containers\n * created by an OdspClient instance. This includes callbacks for the authentication tokens\n * required for ODSP.\n * @beta\n */\nexport interface OdspConnectionConfig {\n\t/**\n\t * Instance that provides AAD endpoint tokens for Push and SharePoint\n\t */\n\ttokenProvider: IOdspTokenProvider;\n\n\t/**\n\t * Site url representing ODSP resource location. It points to the specific SharePoint site where you can store and access the containers you create.\n\t */\n\tsiteUrl: string;\n\n\t/**\n\t * SharePoint Embedded Container Id of the tenant where Fluid containers are created\n\t */\n\tdriveId: string;\n\n\t/**\n\t * Specifies the file path where Fluid files are created. If passed an empty string, the Fluid files will be created at the root level.\n\t */\n\tfilePath: string;\n}\n/**\n * @beta\n */\nexport interface OdspClientProps {\n\t/**\n\t * Configuration for establishing a connection with the ODSP Fluid Service (Push).\n\t */\n\treadonly connection: OdspConnectionConfig;\n\n\t/**\n\t * Optional. A logger instance to receive diagnostic messages.\n\t */\n\treadonly logger?: ITelemetryBaseLogger;\n\n\t/**\n\t * Base interface for providing configurations to control experimental features. If unsure, leave this undefined.\n\t */\n\treadonly configProvider?: IConfigProviderBase;\n}\n\n/**\n * @beta\n */\nexport interface OdspContainerAttachProps {\n\t/**\n\t * The file path where Fluid containers are created. If undefined, the file is created at the root.\n\t */\n\tfilePath: string | undefined;\n\n\t/**\n\t * The file name of the Fluid file. If undefined, the file is named with a GUID.\n\t */\n\tfileName: string | undefined;\n}\n\n/**\n * Events emitted by the ODSP container service to notify consumers of select\n * container changes.\n * @beta\n * @sealed\n */\nexport interface IOdspContainerServicesEvents {\n\t/**\n\t * Emitted when the read-only state of the container changes.\n\t * Consumers can call `OdspContainerServices.getReadOnlyState()` to get the updated value.\n\t */\n\treadOnlyStateChanged: () => void;\n\t/**\n\t * Emitted when the sensitivity label of the container changes.\n\t * Consumers can call `OdspContainerServices.getSensitivityLabelsInfo()` to get the updated value.\n\t */\n\tsensitivityLabelsInfoChanged: () => void;\n}\n\n/**\n * ODSP version of the IFluidContainer interface.\n * @beta\n */\nexport interface IOdspFluidContainer<\n\tTContainerSchema extends ContainerSchema = ContainerSchema,\n> extends IFluidContainer<TContainerSchema> {\n\t/**\n\t * A newly created container starts detached from the collaborative service.\n\t * Calling `attach()` uploads the new container to the service and connects to the collaborative service.\n\t *\n\t * This function is the same as the IFluidContainer.attach function, but has ODSP specific function signatures.\n\t *\n\t * @param props - Optional properties to pass to the attach function.\n\t *\n\t * @returns A promise which resolves when the attach is complete, with the string identifier of the container.\n\t */\n\tattach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;\n\n\t/**\n\t * Upload a blob of data.\n\t * @param blob - The blob to upload to the ODSP service.\n\t */\n\tuploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;\n}\n\n/**\n * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the\n * functionality specifically tied to the ODSP service, and how the data stored in the\n * FluidContainer is persisted in the backend and consumed by users. Any functionality regarding\n * how the data is handled within the FluidContainer itself, i.e. which data objects or DDSes to\n * use, will not be included here but rather on the FluidContainer class itself.\n * @beta\n * @sealed\n */\nexport interface OdspContainerServices extends IDisposable {\n\tevents: Listenable<IOdspContainerServicesEvents>;\n\t/**\n\t * Provides an object that facilitates obtaining information about users present in the Fluid session, as well as listeners for roster changes triggered by users joining or leaving the session.\n\t */\n\taudience: IOdspAudience;\n\n\t/**\n\t * Gets the read-only state of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state.\n\t * @remarks\n\t * In the case that the read-only state cannot be determined, wait for the \"readOnlyStateChanged\" event to be emitted.\n\t * @returns The read-only state (true when readonly, false when editable), or undefined if not available.\n\t */\n\tgetReadOnlyState(): boolean | undefined;\n\t/**\n\t * Gets the sensitivity labels info of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state, and will only be available\n\t * if sensitivity labels have been applied to the container.\n\t * @remarks\n\t * In the case that the sensitivity labels info are expected but cannot be determined, wait for the \"sensitivityLabelChanged\" event to be emitted.\n\t * @returns The sensitivity labels info string, or undefined if not available.\n\t */\n\tgetSensitivityLabelsInfo(): string | undefined;\n}\n\n/**\n * Since ODSP provides user names and email for all of its members, we extend the\n * {@link @fluidframework/fluid-static#IMember} interface to include this service-specific value.\n * It will be returned for all audience members connected.\n * @beta\n */\nexport interface OdspMember extends IMember {\n\t/**\n\t * The object ID (oid) for the user, unique among each individual user connecting to the session.\n\t */\n\tid: string;\n\t/**\n\t * The user's name\n\t */\n\tname: string;\n\t/**\n\t * The user's email\n\t */\n\temail: string;\n}\n\n/**\n * Audience object for ODSP containers\n * @beta\n */\nexport type IOdspAudience = IServiceAudience<OdspMember>;\n\n/**\n * Represents token response\n * @beta\n */\nexport interface TokenResponse {\n\t/**\n\t * Token value\n\t */\n\ttoken: string;\n\n\t/**\n\t * Whether or not the token was obtained from local cache.\n\t * @remarks `undefined` indicates that it could not be determined whether or not the token was obtained this way.\n\t */\n\tfromCache?: boolean;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"odspClient.d.ts","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAgB1F,OAAO,KAAK,EAEX,eAAe,EAGf,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,EACnB,MAAM,iBAAiB,CAAC;AA2CzB;;;;GAIG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAEvC,UAAU,EAAE,eAAe;IAYjC,eAAe,CAAC,CAAC,SAAS,eAAe,EACrD,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAqBW,YAAY,CAAC,CAAC,SAAS,eAAe,EAClD,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAiBF,OAAO,CAAC,cAAc;YAiCR,oBAAoB;YAuCpB,oBAAoB;CAGlC"}
1
+ {"version":3,"file":"odspClient.d.ts","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAiB1F,OAAO,KAAK,EAEX,eAAe,EAGf,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,EACnB,MAAM,iBAAiB,CAAC;AA2CzB;;;;GAIG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAEvC,UAAU,EAAE,eAAe;IAYjC,eAAe,CAAC,CAAC,SAAS,eAAe,EACrD,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAqBW,YAAY,CAAC,CAAC,SAAS,eAAe,EAClD,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAoBF,OAAO,CAAC,cAAc;YAiCR,oBAAoB;YA0CpB,oBAAoB;CAGlC"}
@@ -73,6 +73,9 @@ class OdspClient {
73
73
  const fluidContainer = await (0, internal_2.createFluidContainer)({
74
74
  container,
75
75
  });
76
+ if (!(0, internal_2.isInternalFluidContainer)(fluidContainer)) {
77
+ throw new Error("Fluid container is not internal");
78
+ }
76
79
  const services = await this.getContainerServices(container);
77
80
  return { container: fluidContainer, services };
78
81
  }
@@ -128,6 +131,9 @@ class OdspClient {
128
131
  return resolvedUrl.itemId;
129
132
  };
130
133
  const fluidContainer = await (0, internal_2.createFluidContainer)({ container });
134
+ if (!(0, internal_2.isInternalFluidContainer)(fluidContainer)) {
135
+ throw new Error("Fluid container is not internal");
136
+ }
131
137
  fluidContainer.attach = attach;
132
138
  return fluidContainer;
133
139
  }
@@ -1 +1 @@
1
- {"version":3,"file":"odspClient.js","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport type {\n\tIContainer,\n\tIFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tcreateDetachedContainer,\n\tloadExistingContainer,\n\ttype ILoaderProps,\n} from \"@fluidframework/container-loader/internal\";\nimport type {\n\tIConfigProviderBase,\n\tIRequest,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport type { IClient } from \"@fluidframework/driver-definitions\";\nimport type { IDocumentServiceFactory } from \"@fluidframework/driver-definitions/internal\";\nimport type { ContainerAttachProps, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\tcreateDOProviderContainerRuntimeFactory,\n\tcreateFluidContainer,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\tOdspDocumentServiceFactory,\n\tOdspDriverUrlResolver,\n\tcreateOdspCreateContainerRequest,\n\tcreateOdspUrl,\n\tisOdspResolvedUrl,\n} from \"@fluidframework/odsp-driver/internal\";\nimport type { OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { wrapConfigProviderWithDefaults } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tTokenResponse,\n\tOdspClientProps,\n\tOdspConnectionConfig,\n\tOdspContainerAttachProps,\n\tOdspContainerServices as IOdspContainerServices,\n\tIOdspFluidContainer,\n} from \"./interfaces.js\";\nimport { OdspContainerServices } from \"./odspContainerServices.js\";\nimport type { IOdspTokenProvider } from \"./token.js\";\n\nasync function getStorageToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchStorageToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\nasync function getWebsocketToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchWebsocketToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\n/**\n * Default feature gates.\n * These values will only be used if the feature gate is not already set by the supplied config provider.\n */\nconst odspClientFeatureGates = {\n\t// None yet\n};\n\n/**\n * Wrap the config provider to fall back on the appropriate defaults for ODSP Client.\n * @param baseConfigProvider - The base config provider to wrap\n * @returns A new config provider with the appropriate defaults applied underneath the given provider\n */\nfunction wrapConfigProvider(baseConfigProvider?: IConfigProviderBase): IConfigProviderBase {\n\treturn wrapConfigProviderWithDefaults(baseConfigProvider, odspClientFeatureGates);\n}\n\n/**\n * OdspClient provides the ability to have a Fluid object backed by the ODSP service within the context of Microsoft 365 (M365) tenants.\n * @sealed\n * @beta\n */\nexport class OdspClient {\n\tprivate readonly documentServiceFactory: IDocumentServiceFactory;\n\tprivate readonly urlResolver: OdspDriverUrlResolver;\n\tprivate readonly configProvider: IConfigProviderBase | undefined;\n\tprivate readonly connectionConfig: OdspConnectionConfig;\n\tprivate readonly logger: ITelemetryBaseLogger | undefined;\n\n\tpublic constructor(properties: OdspClientProps) {\n\t\tthis.connectionConfig = properties.connection;\n\t\tthis.logger = properties.logger;\n\t\tthis.documentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (options) => getStorageToken(options, this.connectionConfig.tokenProvider),\n\t\t\tasync (options) => getWebsocketToken(options, this.connectionConfig.tokenProvider),\n\t\t);\n\n\t\tthis.urlResolver = new OdspDriverUrlResolver();\n\t\tthis.configProvider = wrapConfigProvider(properties.configProvider);\n\t}\n\n\tpublic async createContainer<T extends ContainerSchema>(\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\n\t\tconst container = await createDetachedContainer({\n\t\t\t...loaderProps,\n\t\t\tcodeDetails: {\n\t\t\t\tpackage: \"no-dynamic-package\",\n\t\t\t\tconfig: {},\n\t\t\t},\n\t\t});\n\n\t\tconst fluidContainer = await this.createFluidContainer<T>(\n\t\t\tcontainer,\n\t\t\tthis.connectionConfig,\n\t\t);\n\n\t\tconst services = await this.getContainerServices(container);\n\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tpublic async getContainer<T extends ContainerSchema>(\n\t\tid: string,\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\t\tconst url = createOdspUrl({\n\t\t\tsiteUrl: this.connectionConfig.siteUrl,\n\t\t\tdriveId: this.connectionConfig.driveId,\n\t\t\titemId: id,\n\t\t\tdataStorePath: \"\",\n\t\t});\n\t\tconst container = await loadExistingContainer({ ...loaderProps, request: { url } });\n\n\t\tconst fluidContainer = await createFluidContainer<T>({\n\t\t\tcontainer,\n\t\t});\n\t\tconst services = await this.getContainerServices(container);\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tprivate getLoaderProps(schema: ContainerSchema): ILoaderProps {\n\t\tconst runtimeFactory = createDOProviderContainerRuntimeFactory({\n\t\t\tschema,\n\t\t\tcompatibilityMode: \"2\",\n\t\t});\n\t\tconst load = async (): Promise<IFluidModuleWithDetails> => {\n\t\t\treturn {\n\t\t\t\tmodule: { fluidExport: runtimeFactory },\n\t\t\t\tdetails: { package: \"no-dynamic-package\", config: {} },\n\t\t\t};\n\t\t};\n\n\t\tconst codeLoader = { load };\n\t\tconst client: IClient = {\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tpermission: [],\n\t\t\tscopes: [],\n\t\t\tuser: { id: \"\" },\n\t\t\tmode: \"write\",\n\t\t};\n\n\t\treturn {\n\t\t\turlResolver: this.urlResolver,\n\t\t\tdocumentServiceFactory: this.documentServiceFactory,\n\t\t\tcodeLoader,\n\t\t\tlogger: this.logger,\n\t\t\toptions: { client },\n\t\t\tconfigProvider: this.configProvider,\n\t\t};\n\t}\n\n\tprivate async createFluidContainer<T extends ContainerSchema>(\n\t\tcontainer: IContainer,\n\t\tconnection: OdspConnectionConfig,\n\t): Promise<IOdspFluidContainer<T>> {\n\t\t/**\n\t\t * See {@link FluidContainer.attach}\n\t\t */\n\t\tconst attach = async (\n\t\t\todspProps?: ContainerAttachProps<OdspContainerAttachProps>,\n\t\t): Promise<string> => {\n\t\t\tconst createNewRequest: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tconnection.siteUrl,\n\t\t\t\tconnection.driveId,\n\t\t\t\todspProps?.filePath ?? \"\",\n\t\t\t\todspProps?.fileName ?? uuid(),\n\t\t\t);\n\t\t\tif (container.attachState !== AttachState.Detached) {\n\t\t\t\tthrow new Error(\"Cannot attach container. Container is not in detached state\");\n\t\t\t}\n\t\t\tawait container.attach(createNewRequest);\n\n\t\t\tconst resolvedUrl = container.resolvedUrl;\n\n\t\t\tif (resolvedUrl === undefined || !isOdspResolvedUrl(resolvedUrl)) {\n\t\t\t\tthrow new Error(\"Resolved Url not available on attached container\");\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * A unique identifier for the file within the provided SharePoint Embedded container ID. When you attach a container,\n\t\t\t * a new `itemId` is created in the user's drive, which developers can use for various operations\n\t\t\t * like updating, renaming, moving the Fluid file, changing permissions, and more. `itemId` is used to load the container.\n\t\t\t */\n\t\t\treturn resolvedUrl.itemId;\n\t\t};\n\t\tconst fluidContainer = await createFluidContainer<T>({ container });\n\t\tfluidContainer.attach = attach;\n\t\treturn fluidContainer;\n\t}\n\n\tprivate async getContainerServices(container: IContainer): Promise<IOdspContainerServices> {\n\t\treturn new OdspContainerServices(container);\n\t}\n}\n"]}
1
+ {"version":3,"file":"odspClient.js","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport type {\n\tIContainer,\n\tIFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tcreateDetachedContainer,\n\tloadExistingContainer,\n\ttype ILoaderProps,\n} from \"@fluidframework/container-loader/internal\";\nimport type {\n\tIConfigProviderBase,\n\tIRequest,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport type { IClient } from \"@fluidframework/driver-definitions\";\nimport type { IDocumentServiceFactory } from \"@fluidframework/driver-definitions/internal\";\nimport type { ContainerAttachProps, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\tcreateDOProviderContainerRuntimeFactory,\n\tcreateFluidContainer,\n\tisInternalFluidContainer,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\tOdspDocumentServiceFactory,\n\tOdspDriverUrlResolver,\n\tcreateOdspCreateContainerRequest,\n\tcreateOdspUrl,\n\tisOdspResolvedUrl,\n} from \"@fluidframework/odsp-driver/internal\";\nimport type { OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { wrapConfigProviderWithDefaults } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tTokenResponse,\n\tOdspClientProps,\n\tOdspConnectionConfig,\n\tOdspContainerAttachProps,\n\tOdspContainerServices as IOdspContainerServices,\n\tIOdspFluidContainer,\n} from \"./interfaces.js\";\nimport { OdspContainerServices } from \"./odspContainerServices.js\";\nimport type { IOdspTokenProvider } from \"./token.js\";\n\nasync function getStorageToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchStorageToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\nasync function getWebsocketToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchWebsocketToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\n/**\n * Default feature gates.\n * These values will only be used if the feature gate is not already set by the supplied config provider.\n */\nconst odspClientFeatureGates = {\n\t// None yet\n};\n\n/**\n * Wrap the config provider to fall back on the appropriate defaults for ODSP Client.\n * @param baseConfigProvider - The base config provider to wrap\n * @returns A new config provider with the appropriate defaults applied underneath the given provider\n */\nfunction wrapConfigProvider(baseConfigProvider?: IConfigProviderBase): IConfigProviderBase {\n\treturn wrapConfigProviderWithDefaults(baseConfigProvider, odspClientFeatureGates);\n}\n\n/**\n * OdspClient provides the ability to have a Fluid object backed by the ODSP service within the context of Microsoft 365 (M365) tenants.\n * @sealed\n * @beta\n */\nexport class OdspClient {\n\tprivate readonly documentServiceFactory: IDocumentServiceFactory;\n\tprivate readonly urlResolver: OdspDriverUrlResolver;\n\tprivate readonly configProvider: IConfigProviderBase | undefined;\n\tprivate readonly connectionConfig: OdspConnectionConfig;\n\tprivate readonly logger: ITelemetryBaseLogger | undefined;\n\n\tpublic constructor(properties: OdspClientProps) {\n\t\tthis.connectionConfig = properties.connection;\n\t\tthis.logger = properties.logger;\n\t\tthis.documentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (options) => getStorageToken(options, this.connectionConfig.tokenProvider),\n\t\t\tasync (options) => getWebsocketToken(options, this.connectionConfig.tokenProvider),\n\t\t);\n\n\t\tthis.urlResolver = new OdspDriverUrlResolver();\n\t\tthis.configProvider = wrapConfigProvider(properties.configProvider);\n\t}\n\n\tpublic async createContainer<T extends ContainerSchema>(\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\n\t\tconst container = await createDetachedContainer({\n\t\t\t...loaderProps,\n\t\t\tcodeDetails: {\n\t\t\t\tpackage: \"no-dynamic-package\",\n\t\t\t\tconfig: {},\n\t\t\t},\n\t\t});\n\n\t\tconst fluidContainer = await this.createFluidContainer<T>(\n\t\t\tcontainer,\n\t\t\tthis.connectionConfig,\n\t\t);\n\n\t\tconst services = await this.getContainerServices(container);\n\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tpublic async getContainer<T extends ContainerSchema>(\n\t\tid: string,\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\t\tconst url = createOdspUrl({\n\t\t\tsiteUrl: this.connectionConfig.siteUrl,\n\t\t\tdriveId: this.connectionConfig.driveId,\n\t\t\titemId: id,\n\t\t\tdataStorePath: \"\",\n\t\t});\n\t\tconst container = await loadExistingContainer({ ...loaderProps, request: { url } });\n\n\t\tconst fluidContainer = await createFluidContainer<T>({\n\t\t\tcontainer,\n\t\t});\n\t\tif (!isInternalFluidContainer(fluidContainer)) {\n\t\t\tthrow new Error(\"Fluid container is not internal\");\n\t\t}\n\t\tconst services = await this.getContainerServices(container);\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tprivate getLoaderProps(schema: ContainerSchema): ILoaderProps {\n\t\tconst runtimeFactory = createDOProviderContainerRuntimeFactory({\n\t\t\tschema,\n\t\t\tcompatibilityMode: \"2\",\n\t\t});\n\t\tconst load = async (): Promise<IFluidModuleWithDetails> => {\n\t\t\treturn {\n\t\t\t\tmodule: { fluidExport: runtimeFactory },\n\t\t\t\tdetails: { package: \"no-dynamic-package\", config: {} },\n\t\t\t};\n\t\t};\n\n\t\tconst codeLoader = { load };\n\t\tconst client: IClient = {\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tpermission: [],\n\t\t\tscopes: [],\n\t\t\tuser: { id: \"\" },\n\t\t\tmode: \"write\",\n\t\t};\n\n\t\treturn {\n\t\t\turlResolver: this.urlResolver,\n\t\t\tdocumentServiceFactory: this.documentServiceFactory,\n\t\t\tcodeLoader,\n\t\t\tlogger: this.logger,\n\t\t\toptions: { client },\n\t\t\tconfigProvider: this.configProvider,\n\t\t};\n\t}\n\n\tprivate async createFluidContainer<T extends ContainerSchema>(\n\t\tcontainer: IContainer,\n\t\tconnection: OdspConnectionConfig,\n\t): Promise<IOdspFluidContainer<T>> {\n\t\t/**\n\t\t * See {@link FluidContainer.attach}\n\t\t */\n\t\tconst attach = async (\n\t\t\todspProps?: ContainerAttachProps<OdspContainerAttachProps>,\n\t\t): Promise<string> => {\n\t\t\tconst createNewRequest: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tconnection.siteUrl,\n\t\t\t\tconnection.driveId,\n\t\t\t\todspProps?.filePath ?? \"\",\n\t\t\t\todspProps?.fileName ?? uuid(),\n\t\t\t);\n\t\t\tif (container.attachState !== AttachState.Detached) {\n\t\t\t\tthrow new Error(\"Cannot attach container. Container is not in detached state\");\n\t\t\t}\n\t\t\tawait container.attach(createNewRequest);\n\n\t\t\tconst resolvedUrl = container.resolvedUrl;\n\n\t\t\tif (resolvedUrl === undefined || !isOdspResolvedUrl(resolvedUrl)) {\n\t\t\t\tthrow new Error(\"Resolved Url not available on attached container\");\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * A unique identifier for the file within the provided SharePoint Embedded container ID. When you attach a container,\n\t\t\t * a new `itemId` is created in the user's drive, which developers can use for various operations\n\t\t\t * like updating, renaming, moving the Fluid file, changing permissions, and more. `itemId` is used to load the container.\n\t\t\t */\n\t\t\treturn resolvedUrl.itemId;\n\t\t};\n\t\tconst fluidContainer = await createFluidContainer<T>({ container });\n\t\tif (!isInternalFluidContainer(fluidContainer)) {\n\t\t\tthrow new Error(\"Fluid container is not internal\");\n\t\t}\n\t\tfluidContainer.attach = attach;\n\t\treturn fluidContainer;\n\t}\n\n\tprivate async getContainerServices(container: IContainer): Promise<IOdspContainerServices> {\n\t\treturn new OdspContainerServices(container);\n\t}\n}\n"]}
package/eslint.config.mts CHANGED
@@ -1,8 +1,8 @@
1
- /* eslint-disable */
2
- /**
3
- * GENERATED FILE - DO NOT EDIT DIRECTLY.
4
- * To regenerate: pnpm tsx scripts/generate-flat-eslint-configs.ts --typescript
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
5
4
  */
5
+
6
6
  import type { Linter } from "eslint";
7
7
  import { strict } from "../../../common/build/eslint-config-fluid/flat.mts";
8
8
 
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import type { IConfigProviderBase, IDisposable, ITelemetryBaseLogger, Listenable } from "@fluidframework/core-interfaces";
5
+ import type { IConfigProviderBase, IFluidHandle, IDisposable, ITelemetryBaseLogger, Listenable } from "@fluidframework/core-interfaces";
6
6
  import type { ContainerAttachProps, ContainerSchema, IFluidContainer, IMember, IServiceAudience } from "@fluidframework/fluid-static";
7
7
  import type { IOdspTokenProvider } from "./token.js";
8
8
  /**
@@ -93,6 +93,11 @@ export interface IOdspFluidContainer<TContainerSchema extends ContainerSchema =
93
93
  * @returns A promise which resolves when the attach is complete, with the string identifier of the container.
94
94
  */
95
95
  attach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;
96
+ /**
97
+ * Upload a blob of data.
98
+ * @param blob - The blob to upload to the ODSP service.
99
+ */
100
+ uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
96
101
  }
97
102
  /**
98
103
  * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,aAAa,EAAE,kBAAkB,CAAC;IAElC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB;AACD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;OAGG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CACnC,gBAAgB,SAAS,eAAe,GAAG,eAAe,CACzD,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAC1C;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,MAAM,EAAE,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAW,SAAQ,OAAO;IAC1C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EACX,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,aAAa,EAAE,kBAAkB,CAAC;IAElC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB;AACD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC5C;;;OAGG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC;;;OAGG;IACH,4BAA4B,EAAE,MAAM,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CACnC,gBAAgB,SAAS,eAAe,GAAG,eAAe,CACzD,SAAQ,eAAe,CAAC,gBAAgB,CAAC;IAC1C;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhF;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;CAC1E;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,MAAM,EAAE,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACjD;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;;;;;OAMG;IACH,gBAAgB,IAAI,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;;;OAOG;IACH,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAW,SAAQ,OAAO;IAC1C;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIConfigProviderBase,\n\tIDisposable,\n\tITelemetryBaseLogger,\n\tListenable,\n} from \"@fluidframework/core-interfaces\";\nimport type {\n\tContainerAttachProps,\n\tContainerSchema,\n\tIFluidContainer,\n\tIMember,\n\tIServiceAudience,\n} from \"@fluidframework/fluid-static\";\n\nimport type { IOdspTokenProvider } from \"./token.js\";\n\n/**\n * Defines the necessary properties that will be applied to all containers\n * created by an OdspClient instance. This includes callbacks for the authentication tokens\n * required for ODSP.\n * @beta\n */\nexport interface OdspConnectionConfig {\n\t/**\n\t * Instance that provides AAD endpoint tokens for Push and SharePoint\n\t */\n\ttokenProvider: IOdspTokenProvider;\n\n\t/**\n\t * Site url representing ODSP resource location. It points to the specific SharePoint site where you can store and access the containers you create.\n\t */\n\tsiteUrl: string;\n\n\t/**\n\t * SharePoint Embedded Container Id of the tenant where Fluid containers are created\n\t */\n\tdriveId: string;\n\n\t/**\n\t * Specifies the file path where Fluid files are created. If passed an empty string, the Fluid files will be created at the root level.\n\t */\n\tfilePath: string;\n}\n/**\n * @beta\n */\nexport interface OdspClientProps {\n\t/**\n\t * Configuration for establishing a connection with the ODSP Fluid Service (Push).\n\t */\n\treadonly connection: OdspConnectionConfig;\n\n\t/**\n\t * Optional. A logger instance to receive diagnostic messages.\n\t */\n\treadonly logger?: ITelemetryBaseLogger;\n\n\t/**\n\t * Base interface for providing configurations to control experimental features. If unsure, leave this undefined.\n\t */\n\treadonly configProvider?: IConfigProviderBase;\n}\n\n/**\n * @beta\n */\nexport interface OdspContainerAttachProps {\n\t/**\n\t * The file path where Fluid containers are created. If undefined, the file is created at the root.\n\t */\n\tfilePath: string | undefined;\n\n\t/**\n\t * The file name of the Fluid file. If undefined, the file is named with a GUID.\n\t */\n\tfileName: string | undefined;\n}\n\n/**\n * Events emitted by the ODSP container service to notify consumers of select\n * container changes.\n * @beta\n * @sealed\n */\nexport interface IOdspContainerServicesEvents {\n\t/**\n\t * Emitted when the read-only state of the container changes.\n\t * Consumers can call `OdspContainerServices.getReadOnlyState()` to get the updated value.\n\t */\n\treadOnlyStateChanged: () => void;\n\t/**\n\t * Emitted when the sensitivity label of the container changes.\n\t * Consumers can call `OdspContainerServices.getSensitivityLabelsInfo()` to get the updated value.\n\t */\n\tsensitivityLabelsInfoChanged: () => void;\n}\n\n/**\n * ODSP version of the IFluidContainer interface.\n * @beta\n */\nexport interface IOdspFluidContainer<\n\tTContainerSchema extends ContainerSchema = ContainerSchema,\n> extends IFluidContainer<TContainerSchema> {\n\t/**\n\t * A newly created container starts detached from the collaborative service.\n\t * Calling `attach()` uploads the new container to the service and connects to the collaborative service.\n\t *\n\t * This function is the same as the IFluidContainer.attach function, but has ODSP specific function signatures.\n\t *\n\t * @param props - Optional properties to pass to the attach function.\n\t *\n\t * @returns A promise which resolves when the attach is complete, with the string identifier of the container.\n\t */\n\tattach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;\n}\n\n/**\n * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the\n * functionality specifically tied to the ODSP service, and how the data stored in the\n * FluidContainer is persisted in the backend and consumed by users. Any functionality regarding\n * how the data is handled within the FluidContainer itself, i.e. which data objects or DDSes to\n * use, will not be included here but rather on the FluidContainer class itself.\n * @beta\n * @sealed\n */\nexport interface OdspContainerServices extends IDisposable {\n\tevents: Listenable<IOdspContainerServicesEvents>;\n\t/**\n\t * Provides an object that facilitates obtaining information about users present in the Fluid session, as well as listeners for roster changes triggered by users joining or leaving the session.\n\t */\n\taudience: IOdspAudience;\n\n\t/**\n\t * Gets the read-only state of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state.\n\t * @remarks\n\t * In the case that the read-only state cannot be determined, wait for the \"readOnlyStateChanged\" event to be emitted.\n\t * @returns The read-only state (true when readonly, false when editable), or undefined if not available.\n\t */\n\tgetReadOnlyState(): boolean | undefined;\n\t/**\n\t * Gets the sensitivity labels info of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state, and will only be available\n\t * if sensitivity labels have been applied to the container.\n\t * @remarks\n\t * In the case that the sensitivity labels info are expected but cannot be determined, wait for the \"sensitivityLabelChanged\" event to be emitted.\n\t * @returns The sensitivity labels info string, or undefined if not available.\n\t */\n\tgetSensitivityLabelsInfo(): string | undefined;\n}\n\n/**\n * Since ODSP provides user names and email for all of its members, we extend the\n * {@link @fluidframework/fluid-static#IMember} interface to include this service-specific value.\n * It will be returned for all audience members connected.\n * @beta\n */\nexport interface OdspMember extends IMember {\n\t/**\n\t * The object ID (oid) for the user, unique among each individual user connecting to the session.\n\t */\n\tid: string;\n\t/**\n\t * The user's name\n\t */\n\tname: string;\n\t/**\n\t * The user's email\n\t */\n\temail: string;\n}\n\n/**\n * Audience object for ODSP containers\n * @beta\n */\nexport type IOdspAudience = IServiceAudience<OdspMember>;\n\n/**\n * Represents token response\n * @beta\n */\nexport interface TokenResponse {\n\t/**\n\t * Token value\n\t */\n\ttoken: string;\n\n\t/**\n\t * Whether or not the token was obtained from local cache.\n\t * @remarks `undefined` indicates that it could not be determined whether or not the token was obtained this way.\n\t */\n\tfromCache?: boolean;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIConfigProviderBase,\n\tIFluidHandle,\n\tIDisposable,\n\tITelemetryBaseLogger,\n\tListenable,\n} from \"@fluidframework/core-interfaces\";\nimport type {\n\tContainerAttachProps,\n\tContainerSchema,\n\tIFluidContainer,\n\tIMember,\n\tIServiceAudience,\n} from \"@fluidframework/fluid-static\";\n\nimport type { IOdspTokenProvider } from \"./token.js\";\n\n/**\n * Defines the necessary properties that will be applied to all containers\n * created by an OdspClient instance. This includes callbacks for the authentication tokens\n * required for ODSP.\n * @beta\n */\nexport interface OdspConnectionConfig {\n\t/**\n\t * Instance that provides AAD endpoint tokens for Push and SharePoint\n\t */\n\ttokenProvider: IOdspTokenProvider;\n\n\t/**\n\t * Site url representing ODSP resource location. It points to the specific SharePoint site where you can store and access the containers you create.\n\t */\n\tsiteUrl: string;\n\n\t/**\n\t * SharePoint Embedded Container Id of the tenant where Fluid containers are created\n\t */\n\tdriveId: string;\n\n\t/**\n\t * Specifies the file path where Fluid files are created. If passed an empty string, the Fluid files will be created at the root level.\n\t */\n\tfilePath: string;\n}\n/**\n * @beta\n */\nexport interface OdspClientProps {\n\t/**\n\t * Configuration for establishing a connection with the ODSP Fluid Service (Push).\n\t */\n\treadonly connection: OdspConnectionConfig;\n\n\t/**\n\t * Optional. A logger instance to receive diagnostic messages.\n\t */\n\treadonly logger?: ITelemetryBaseLogger;\n\n\t/**\n\t * Base interface for providing configurations to control experimental features. If unsure, leave this undefined.\n\t */\n\treadonly configProvider?: IConfigProviderBase;\n}\n\n/**\n * @beta\n */\nexport interface OdspContainerAttachProps {\n\t/**\n\t * The file path where Fluid containers are created. If undefined, the file is created at the root.\n\t */\n\tfilePath: string | undefined;\n\n\t/**\n\t * The file name of the Fluid file. If undefined, the file is named with a GUID.\n\t */\n\tfileName: string | undefined;\n}\n\n/**\n * Events emitted by the ODSP container service to notify consumers of select\n * container changes.\n * @beta\n * @sealed\n */\nexport interface IOdspContainerServicesEvents {\n\t/**\n\t * Emitted when the read-only state of the container changes.\n\t * Consumers can call `OdspContainerServices.getReadOnlyState()` to get the updated value.\n\t */\n\treadOnlyStateChanged: () => void;\n\t/**\n\t * Emitted when the sensitivity label of the container changes.\n\t * Consumers can call `OdspContainerServices.getSensitivityLabelsInfo()` to get the updated value.\n\t */\n\tsensitivityLabelsInfoChanged: () => void;\n}\n\n/**\n * ODSP version of the IFluidContainer interface.\n * @beta\n */\nexport interface IOdspFluidContainer<\n\tTContainerSchema extends ContainerSchema = ContainerSchema,\n> extends IFluidContainer<TContainerSchema> {\n\t/**\n\t * A newly created container starts detached from the collaborative service.\n\t * Calling `attach()` uploads the new container to the service and connects to the collaborative service.\n\t *\n\t * This function is the same as the IFluidContainer.attach function, but has ODSP specific function signatures.\n\t *\n\t * @param props - Optional properties to pass to the attach function.\n\t *\n\t * @returns A promise which resolves when the attach is complete, with the string identifier of the container.\n\t */\n\tattach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;\n\n\t/**\n\t * Upload a blob of data.\n\t * @param blob - The blob to upload to the ODSP service.\n\t */\n\tuploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;\n}\n\n/**\n * OdspContainerServices is returned by the OdspClient alongside a FluidContainer. It holds the\n * functionality specifically tied to the ODSP service, and how the data stored in the\n * FluidContainer is persisted in the backend and consumed by users. Any functionality regarding\n * how the data is handled within the FluidContainer itself, i.e. which data objects or DDSes to\n * use, will not be included here but rather on the FluidContainer class itself.\n * @beta\n * @sealed\n */\nexport interface OdspContainerServices extends IDisposable {\n\tevents: Listenable<IOdspContainerServicesEvents>;\n\t/**\n\t * Provides an object that facilitates obtaining information about users present in the Fluid session, as well as listeners for roster changes triggered by users joining or leaving the session.\n\t */\n\taudience: IOdspAudience;\n\n\t/**\n\t * Gets the read-only state of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state.\n\t * @remarks\n\t * In the case that the read-only state cannot be determined, wait for the \"readOnlyStateChanged\" event to be emitted.\n\t * @returns The read-only state (true when readonly, false when editable), or undefined if not available.\n\t */\n\tgetReadOnlyState(): boolean | undefined;\n\t/**\n\t * Gets the sensitivity labels info of the container, if available.\n\t * This is not available until the container is in the \"Connected\" state, and will only be available\n\t * if sensitivity labels have been applied to the container.\n\t * @remarks\n\t * In the case that the sensitivity labels info are expected but cannot be determined, wait for the \"sensitivityLabelChanged\" event to be emitted.\n\t * @returns The sensitivity labels info string, or undefined if not available.\n\t */\n\tgetSensitivityLabelsInfo(): string | undefined;\n}\n\n/**\n * Since ODSP provides user names and email for all of its members, we extend the\n * {@link @fluidframework/fluid-static#IMember} interface to include this service-specific value.\n * It will be returned for all audience members connected.\n * @beta\n */\nexport interface OdspMember extends IMember {\n\t/**\n\t * The object ID (oid) for the user, unique among each individual user connecting to the session.\n\t */\n\tid: string;\n\t/**\n\t * The user's name\n\t */\n\tname: string;\n\t/**\n\t * The user's email\n\t */\n\temail: string;\n}\n\n/**\n * Audience object for ODSP containers\n * @beta\n */\nexport type IOdspAudience = IServiceAudience<OdspMember>;\n\n/**\n * Represents token response\n * @beta\n */\nexport interface TokenResponse {\n\t/**\n\t * Token value\n\t */\n\ttoken: string;\n\n\t/**\n\t * Whether or not the token was obtained from local cache.\n\t * @remarks `undefined` indicates that it could not be determined whether or not the token was obtained this way.\n\t */\n\tfromCache?: boolean;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"odspClient.d.ts","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAgB1F,OAAO,KAAK,EAEX,eAAe,EAGf,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,EACnB,MAAM,iBAAiB,CAAC;AA2CzB;;;;GAIG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAEvC,UAAU,EAAE,eAAe;IAYjC,eAAe,CAAC,CAAC,SAAS,eAAe,EACrD,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAqBW,YAAY,CAAC,CAAC,SAAS,eAAe,EAClD,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAiBF,OAAO,CAAC,cAAc;YAiCR,oBAAoB;YAuCpB,oBAAoB;CAGlC"}
1
+ {"version":3,"file":"odspClient.d.ts","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAiB1F,OAAO,KAAK,EAEX,eAAe,EAGf,qBAAqB,IAAI,sBAAsB,EAC/C,mBAAmB,EACnB,MAAM,iBAAiB,CAAC;AA2CzB;;;;GAIG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAEvC,UAAU,EAAE,eAAe;IAYjC,eAAe,CAAC,CAAC,SAAS,eAAe,EACrD,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAqBW,YAAY,CAAC,CAAC,SAAS,eAAe,EAClD,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,CAAC,GAChB,OAAO,CAAC;QACV,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,EAAE,sBAAsB,CAAC;KACjC,CAAC;IAoBF,OAAO,CAAC,cAAc;YAiCR,oBAAoB;YA0CpB,oBAAoB;CAGlC"}
package/lib/odspClient.js CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { AttachState } from "@fluidframework/container-definitions";
6
6
  import { createDetachedContainer, loadExistingContainer, } from "@fluidframework/container-loader/internal";
7
- import { createDOProviderContainerRuntimeFactory, createFluidContainer, } from "@fluidframework/fluid-static/internal";
7
+ import { createDOProviderContainerRuntimeFactory, createFluidContainer, isInternalFluidContainer, } from "@fluidframework/fluid-static/internal";
8
8
  import { OdspDocumentServiceFactory, OdspDriverUrlResolver, createOdspCreateContainerRequest, createOdspUrl, isOdspResolvedUrl, } from "@fluidframework/odsp-driver/internal";
9
9
  import { wrapConfigProviderWithDefaults } from "@fluidframework/telemetry-utils/internal";
10
10
  import { v4 as uuid } from "uuid";
@@ -70,6 +70,9 @@ export class OdspClient {
70
70
  const fluidContainer = await createFluidContainer({
71
71
  container,
72
72
  });
73
+ if (!isInternalFluidContainer(fluidContainer)) {
74
+ throw new Error("Fluid container is not internal");
75
+ }
73
76
  const services = await this.getContainerServices(container);
74
77
  return { container: fluidContainer, services };
75
78
  }
@@ -125,6 +128,9 @@ export class OdspClient {
125
128
  return resolvedUrl.itemId;
126
129
  };
127
130
  const fluidContainer = await createFluidContainer({ container });
131
+ if (!isInternalFluidContainer(fluidContainer)) {
132
+ throw new Error("Fluid container is not internal");
133
+ }
128
134
  fluidContainer.attach = attach;
129
135
  return fluidContainer;
130
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"odspClient.js","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport type {\n\tIContainer,\n\tIFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tcreateDetachedContainer,\n\tloadExistingContainer,\n\ttype ILoaderProps,\n} from \"@fluidframework/container-loader/internal\";\nimport type {\n\tIConfigProviderBase,\n\tIRequest,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport type { IClient } from \"@fluidframework/driver-definitions\";\nimport type { IDocumentServiceFactory } from \"@fluidframework/driver-definitions/internal\";\nimport type { ContainerAttachProps, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\tcreateDOProviderContainerRuntimeFactory,\n\tcreateFluidContainer,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\tOdspDocumentServiceFactory,\n\tOdspDriverUrlResolver,\n\tcreateOdspCreateContainerRequest,\n\tcreateOdspUrl,\n\tisOdspResolvedUrl,\n} from \"@fluidframework/odsp-driver/internal\";\nimport type { OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { wrapConfigProviderWithDefaults } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tTokenResponse,\n\tOdspClientProps,\n\tOdspConnectionConfig,\n\tOdspContainerAttachProps,\n\tOdspContainerServices as IOdspContainerServices,\n\tIOdspFluidContainer,\n} from \"./interfaces.js\";\nimport { OdspContainerServices } from \"./odspContainerServices.js\";\nimport type { IOdspTokenProvider } from \"./token.js\";\n\nasync function getStorageToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchStorageToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\nasync function getWebsocketToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchWebsocketToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\n/**\n * Default feature gates.\n * These values will only be used if the feature gate is not already set by the supplied config provider.\n */\nconst odspClientFeatureGates = {\n\t// None yet\n};\n\n/**\n * Wrap the config provider to fall back on the appropriate defaults for ODSP Client.\n * @param baseConfigProvider - The base config provider to wrap\n * @returns A new config provider with the appropriate defaults applied underneath the given provider\n */\nfunction wrapConfigProvider(baseConfigProvider?: IConfigProviderBase): IConfigProviderBase {\n\treturn wrapConfigProviderWithDefaults(baseConfigProvider, odspClientFeatureGates);\n}\n\n/**\n * OdspClient provides the ability to have a Fluid object backed by the ODSP service within the context of Microsoft 365 (M365) tenants.\n * @sealed\n * @beta\n */\nexport class OdspClient {\n\tprivate readonly documentServiceFactory: IDocumentServiceFactory;\n\tprivate readonly urlResolver: OdspDriverUrlResolver;\n\tprivate readonly configProvider: IConfigProviderBase | undefined;\n\tprivate readonly connectionConfig: OdspConnectionConfig;\n\tprivate readonly logger: ITelemetryBaseLogger | undefined;\n\n\tpublic constructor(properties: OdspClientProps) {\n\t\tthis.connectionConfig = properties.connection;\n\t\tthis.logger = properties.logger;\n\t\tthis.documentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (options) => getStorageToken(options, this.connectionConfig.tokenProvider),\n\t\t\tasync (options) => getWebsocketToken(options, this.connectionConfig.tokenProvider),\n\t\t);\n\n\t\tthis.urlResolver = new OdspDriverUrlResolver();\n\t\tthis.configProvider = wrapConfigProvider(properties.configProvider);\n\t}\n\n\tpublic async createContainer<T extends ContainerSchema>(\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\n\t\tconst container = await createDetachedContainer({\n\t\t\t...loaderProps,\n\t\t\tcodeDetails: {\n\t\t\t\tpackage: \"no-dynamic-package\",\n\t\t\t\tconfig: {},\n\t\t\t},\n\t\t});\n\n\t\tconst fluidContainer = await this.createFluidContainer<T>(\n\t\t\tcontainer,\n\t\t\tthis.connectionConfig,\n\t\t);\n\n\t\tconst services = await this.getContainerServices(container);\n\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tpublic async getContainer<T extends ContainerSchema>(\n\t\tid: string,\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\t\tconst url = createOdspUrl({\n\t\t\tsiteUrl: this.connectionConfig.siteUrl,\n\t\t\tdriveId: this.connectionConfig.driveId,\n\t\t\titemId: id,\n\t\t\tdataStorePath: \"\",\n\t\t});\n\t\tconst container = await loadExistingContainer({ ...loaderProps, request: { url } });\n\n\t\tconst fluidContainer = await createFluidContainer<T>({\n\t\t\tcontainer,\n\t\t});\n\t\tconst services = await this.getContainerServices(container);\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tprivate getLoaderProps(schema: ContainerSchema): ILoaderProps {\n\t\tconst runtimeFactory = createDOProviderContainerRuntimeFactory({\n\t\t\tschema,\n\t\t\tcompatibilityMode: \"2\",\n\t\t});\n\t\tconst load = async (): Promise<IFluidModuleWithDetails> => {\n\t\t\treturn {\n\t\t\t\tmodule: { fluidExport: runtimeFactory },\n\t\t\t\tdetails: { package: \"no-dynamic-package\", config: {} },\n\t\t\t};\n\t\t};\n\n\t\tconst codeLoader = { load };\n\t\tconst client: IClient = {\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tpermission: [],\n\t\t\tscopes: [],\n\t\t\tuser: { id: \"\" },\n\t\t\tmode: \"write\",\n\t\t};\n\n\t\treturn {\n\t\t\turlResolver: this.urlResolver,\n\t\t\tdocumentServiceFactory: this.documentServiceFactory,\n\t\t\tcodeLoader,\n\t\t\tlogger: this.logger,\n\t\t\toptions: { client },\n\t\t\tconfigProvider: this.configProvider,\n\t\t};\n\t}\n\n\tprivate async createFluidContainer<T extends ContainerSchema>(\n\t\tcontainer: IContainer,\n\t\tconnection: OdspConnectionConfig,\n\t): Promise<IOdspFluidContainer<T>> {\n\t\t/**\n\t\t * See {@link FluidContainer.attach}\n\t\t */\n\t\tconst attach = async (\n\t\t\todspProps?: ContainerAttachProps<OdspContainerAttachProps>,\n\t\t): Promise<string> => {\n\t\t\tconst createNewRequest: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tconnection.siteUrl,\n\t\t\t\tconnection.driveId,\n\t\t\t\todspProps?.filePath ?? \"\",\n\t\t\t\todspProps?.fileName ?? uuid(),\n\t\t\t);\n\t\t\tif (container.attachState !== AttachState.Detached) {\n\t\t\t\tthrow new Error(\"Cannot attach container. Container is not in detached state\");\n\t\t\t}\n\t\t\tawait container.attach(createNewRequest);\n\n\t\t\tconst resolvedUrl = container.resolvedUrl;\n\n\t\t\tif (resolvedUrl === undefined || !isOdspResolvedUrl(resolvedUrl)) {\n\t\t\t\tthrow new Error(\"Resolved Url not available on attached container\");\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * A unique identifier for the file within the provided SharePoint Embedded container ID. When you attach a container,\n\t\t\t * a new `itemId` is created in the user's drive, which developers can use for various operations\n\t\t\t * like updating, renaming, moving the Fluid file, changing permissions, and more. `itemId` is used to load the container.\n\t\t\t */\n\t\t\treturn resolvedUrl.itemId;\n\t\t};\n\t\tconst fluidContainer = await createFluidContainer<T>({ container });\n\t\tfluidContainer.attach = attach;\n\t\treturn fluidContainer;\n\t}\n\n\tprivate async getContainerServices(container: IContainer): Promise<IOdspContainerServices> {\n\t\treturn new OdspContainerServices(container);\n\t}\n}\n"]}
1
+ {"version":3,"file":"odspClient.js","sourceRoot":"","sources":["../src/odspClient.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport type {\n\tIContainer,\n\tIFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tcreateDetachedContainer,\n\tloadExistingContainer,\n\ttype ILoaderProps,\n} from \"@fluidframework/container-loader/internal\";\nimport type {\n\tIConfigProviderBase,\n\tIRequest,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport type { IClient } from \"@fluidframework/driver-definitions\";\nimport type { IDocumentServiceFactory } from \"@fluidframework/driver-definitions/internal\";\nimport type { ContainerAttachProps, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\tcreateDOProviderContainerRuntimeFactory,\n\tcreateFluidContainer,\n\tisInternalFluidContainer,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\tOdspDocumentServiceFactory,\n\tOdspDriverUrlResolver,\n\tcreateOdspCreateContainerRequest,\n\tcreateOdspUrl,\n\tisOdspResolvedUrl,\n} from \"@fluidframework/odsp-driver/internal\";\nimport type { OdspResourceTokenFetchOptions } from \"@fluidframework/odsp-driver-definitions/internal\";\nimport { wrapConfigProviderWithDefaults } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport type {\n\tTokenResponse,\n\tOdspClientProps,\n\tOdspConnectionConfig,\n\tOdspContainerAttachProps,\n\tOdspContainerServices as IOdspContainerServices,\n\tIOdspFluidContainer,\n} from \"./interfaces.js\";\nimport { OdspContainerServices } from \"./odspContainerServices.js\";\nimport type { IOdspTokenProvider } from \"./token.js\";\n\nasync function getStorageToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchStorageToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\nasync function getWebsocketToken(\n\toptions: OdspResourceTokenFetchOptions,\n\ttokenProvider: IOdspTokenProvider,\n): Promise<TokenResponse> {\n\tconst tokenResponse: TokenResponse = await tokenProvider.fetchWebsocketToken(\n\t\toptions.siteUrl,\n\t\toptions.refresh,\n\t);\n\treturn tokenResponse;\n}\n\n/**\n * Default feature gates.\n * These values will only be used if the feature gate is not already set by the supplied config provider.\n */\nconst odspClientFeatureGates = {\n\t// None yet\n};\n\n/**\n * Wrap the config provider to fall back on the appropriate defaults for ODSP Client.\n * @param baseConfigProvider - The base config provider to wrap\n * @returns A new config provider with the appropriate defaults applied underneath the given provider\n */\nfunction wrapConfigProvider(baseConfigProvider?: IConfigProviderBase): IConfigProviderBase {\n\treturn wrapConfigProviderWithDefaults(baseConfigProvider, odspClientFeatureGates);\n}\n\n/**\n * OdspClient provides the ability to have a Fluid object backed by the ODSP service within the context of Microsoft 365 (M365) tenants.\n * @sealed\n * @beta\n */\nexport class OdspClient {\n\tprivate readonly documentServiceFactory: IDocumentServiceFactory;\n\tprivate readonly urlResolver: OdspDriverUrlResolver;\n\tprivate readonly configProvider: IConfigProviderBase | undefined;\n\tprivate readonly connectionConfig: OdspConnectionConfig;\n\tprivate readonly logger: ITelemetryBaseLogger | undefined;\n\n\tpublic constructor(properties: OdspClientProps) {\n\t\tthis.connectionConfig = properties.connection;\n\t\tthis.logger = properties.logger;\n\t\tthis.documentServiceFactory = new OdspDocumentServiceFactory(\n\t\t\tasync (options) => getStorageToken(options, this.connectionConfig.tokenProvider),\n\t\t\tasync (options) => getWebsocketToken(options, this.connectionConfig.tokenProvider),\n\t\t);\n\n\t\tthis.urlResolver = new OdspDriverUrlResolver();\n\t\tthis.configProvider = wrapConfigProvider(properties.configProvider);\n\t}\n\n\tpublic async createContainer<T extends ContainerSchema>(\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\n\t\tconst container = await createDetachedContainer({\n\t\t\t...loaderProps,\n\t\t\tcodeDetails: {\n\t\t\t\tpackage: \"no-dynamic-package\",\n\t\t\t\tconfig: {},\n\t\t\t},\n\t\t});\n\n\t\tconst fluidContainer = await this.createFluidContainer<T>(\n\t\t\tcontainer,\n\t\t\tthis.connectionConfig,\n\t\t);\n\n\t\tconst services = await this.getContainerServices(container);\n\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tpublic async getContainer<T extends ContainerSchema>(\n\t\tid: string,\n\t\tcontainerSchema: T,\n\t): Promise<{\n\t\tcontainer: IOdspFluidContainer<T>;\n\t\tservices: IOdspContainerServices;\n\t}> {\n\t\tconst loaderProps = this.getLoaderProps(containerSchema);\n\t\tconst url = createOdspUrl({\n\t\t\tsiteUrl: this.connectionConfig.siteUrl,\n\t\t\tdriveId: this.connectionConfig.driveId,\n\t\t\titemId: id,\n\t\t\tdataStorePath: \"\",\n\t\t});\n\t\tconst container = await loadExistingContainer({ ...loaderProps, request: { url } });\n\n\t\tconst fluidContainer = await createFluidContainer<T>({\n\t\t\tcontainer,\n\t\t});\n\t\tif (!isInternalFluidContainer(fluidContainer)) {\n\t\t\tthrow new Error(\"Fluid container is not internal\");\n\t\t}\n\t\tconst services = await this.getContainerServices(container);\n\t\treturn { container: fluidContainer, services };\n\t}\n\n\tprivate getLoaderProps(schema: ContainerSchema): ILoaderProps {\n\t\tconst runtimeFactory = createDOProviderContainerRuntimeFactory({\n\t\t\tschema,\n\t\t\tcompatibilityMode: \"2\",\n\t\t});\n\t\tconst load = async (): Promise<IFluidModuleWithDetails> => {\n\t\t\treturn {\n\t\t\t\tmodule: { fluidExport: runtimeFactory },\n\t\t\t\tdetails: { package: \"no-dynamic-package\", config: {} },\n\t\t\t};\n\t\t};\n\n\t\tconst codeLoader = { load };\n\t\tconst client: IClient = {\n\t\t\tdetails: {\n\t\t\t\tcapabilities: { interactive: true },\n\t\t\t},\n\t\t\tpermission: [],\n\t\t\tscopes: [],\n\t\t\tuser: { id: \"\" },\n\t\t\tmode: \"write\",\n\t\t};\n\n\t\treturn {\n\t\t\turlResolver: this.urlResolver,\n\t\t\tdocumentServiceFactory: this.documentServiceFactory,\n\t\t\tcodeLoader,\n\t\t\tlogger: this.logger,\n\t\t\toptions: { client },\n\t\t\tconfigProvider: this.configProvider,\n\t\t};\n\t}\n\n\tprivate async createFluidContainer<T extends ContainerSchema>(\n\t\tcontainer: IContainer,\n\t\tconnection: OdspConnectionConfig,\n\t): Promise<IOdspFluidContainer<T>> {\n\t\t/**\n\t\t * See {@link FluidContainer.attach}\n\t\t */\n\t\tconst attach = async (\n\t\t\todspProps?: ContainerAttachProps<OdspContainerAttachProps>,\n\t\t): Promise<string> => {\n\t\t\tconst createNewRequest: IRequest = createOdspCreateContainerRequest(\n\t\t\t\tconnection.siteUrl,\n\t\t\t\tconnection.driveId,\n\t\t\t\todspProps?.filePath ?? \"\",\n\t\t\t\todspProps?.fileName ?? uuid(),\n\t\t\t);\n\t\t\tif (container.attachState !== AttachState.Detached) {\n\t\t\t\tthrow new Error(\"Cannot attach container. Container is not in detached state\");\n\t\t\t}\n\t\t\tawait container.attach(createNewRequest);\n\n\t\t\tconst resolvedUrl = container.resolvedUrl;\n\n\t\t\tif (resolvedUrl === undefined || !isOdspResolvedUrl(resolvedUrl)) {\n\t\t\t\tthrow new Error(\"Resolved Url not available on attached container\");\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * A unique identifier for the file within the provided SharePoint Embedded container ID. When you attach a container,\n\t\t\t * a new `itemId` is created in the user's drive, which developers can use for various operations\n\t\t\t * like updating, renaming, moving the Fluid file, changing permissions, and more. `itemId` is used to load the container.\n\t\t\t */\n\t\t\treturn resolvedUrl.itemId;\n\t\t};\n\t\tconst fluidContainer = await createFluidContainer<T>({ container });\n\t\tif (!isInternalFluidContainer(fluidContainer)) {\n\t\t\tthrow new Error(\"Fluid container is not internal\");\n\t\t}\n\t\tfluidContainer.attach = attach;\n\t\treturn fluidContainer;\n\t}\n\n\tprivate async getContainerServices(container: IContainer): Promise<IOdspContainerServices> {\n\t\treturn new OdspContainerServices(container);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/odsp-client",
3
- "version": "2.74.0",
3
+ "version": "2.81.0-374083",
4
4
  "description": "A tool to enable creation and loading of Fluid containers using the ODSP service",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -69,40 +69,40 @@
69
69
  "temp-directory": "nyc/.nyc_output"
70
70
  },
71
71
  "dependencies": {
72
- "@fluid-internal/client-utils": "~2.74.0",
73
- "@fluidframework/container-definitions": "~2.74.0",
74
- "@fluidframework/container-loader": "~2.74.0",
75
- "@fluidframework/core-interfaces": "~2.74.0",
76
- "@fluidframework/core-utils": "~2.74.0",
77
- "@fluidframework/driver-definitions": "~2.74.0",
78
- "@fluidframework/fluid-static": "~2.74.0",
79
- "@fluidframework/map": "~2.74.0",
80
- "@fluidframework/odsp-doclib-utils": "~2.74.0",
81
- "@fluidframework/odsp-driver": "~2.74.0",
82
- "@fluidframework/odsp-driver-definitions": "~2.74.0",
83
- "@fluidframework/telemetry-utils": "~2.74.0",
72
+ "@fluid-internal/client-utils": "2.81.0-374083",
73
+ "@fluidframework/container-definitions": "2.81.0-374083",
74
+ "@fluidframework/container-loader": "2.81.0-374083",
75
+ "@fluidframework/core-interfaces": "2.81.0-374083",
76
+ "@fluidframework/core-utils": "2.81.0-374083",
77
+ "@fluidframework/driver-definitions": "2.81.0-374083",
78
+ "@fluidframework/fluid-static": "2.81.0-374083",
79
+ "@fluidframework/map": "2.81.0-374083",
80
+ "@fluidframework/odsp-doclib-utils": "2.81.0-374083",
81
+ "@fluidframework/odsp-driver": "2.81.0-374083",
82
+ "@fluidframework/odsp-driver-definitions": "2.81.0-374083",
83
+ "@fluidframework/telemetry-utils": "2.81.0-374083",
84
84
  "uuid": "^11.1.0"
85
85
  },
86
86
  "devDependencies": {
87
- "@arethetypeswrong/cli": "^0.17.1",
87
+ "@arethetypeswrong/cli": "^0.18.2",
88
88
  "@biomejs/biome": "~1.9.3",
89
- "@fluid-internal/mocha-test-setup": "~2.74.0",
90
- "@fluid-tools/build-cli": "^0.61.0",
89
+ "@fluid-internal/mocha-test-setup": "2.81.0-374083",
90
+ "@fluid-tools/build-cli": "^0.63.0",
91
91
  "@fluidframework/build-common": "^2.0.3",
92
- "@fluidframework/build-tools": "^0.61.0",
93
- "@fluidframework/eslint-config-fluid": "~2.74.0",
94
- "@fluidframework/test-utils": "~2.74.0",
92
+ "@fluidframework/build-tools": "^0.63.0",
93
+ "@fluidframework/eslint-config-fluid": "2.81.0-374083",
94
+ "@fluidframework/test-utils": "2.81.0-374083",
95
95
  "@microsoft/api-extractor": "7.52.11",
96
96
  "@types/mocha": "^10.0.10",
97
97
  "@types/node": "^18.19.0",
98
98
  "c8": "^10.1.3",
99
- "concurrently": "^8.2.1",
99
+ "concurrently": "^9.2.1",
100
100
  "copyfiles": "^2.4.1",
101
- "cross-env": "^7.0.3",
102
- "eslint": "~8.57.1",
101
+ "cross-env": "^10.1.0",
102
+ "eslint": "~9.39.1",
103
103
  "jiti": "^2.6.1",
104
104
  "mocha": "^10.8.2",
105
- "rimraf": "^4.4.0",
105
+ "rimraf": "^6.1.2",
106
106
  "typescript": "~5.4.5"
107
107
  },
108
108
  "typeValidation": {
package/src/interfaces.ts CHANGED
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type {
7
7
  IConfigProviderBase,
8
+ IFluidHandle,
8
9
  IDisposable,
9
10
  ITelemetryBaseLogger,
10
11
  Listenable,
@@ -118,6 +119,12 @@ export interface IOdspFluidContainer<
118
119
  * @returns A promise which resolves when the attach is complete, with the string identifier of the container.
119
120
  */
120
121
  attach(props?: ContainerAttachProps<OdspContainerAttachProps>): Promise<string>;
122
+
123
+ /**
124
+ * Upload a blob of data.
125
+ * @param blob - The blob to upload to the ODSP service.
126
+ */
127
+ uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
121
128
  }
122
129
 
123
130
  /**
package/src/odspClient.ts CHANGED
@@ -24,6 +24,7 @@ import type { ContainerAttachProps, ContainerSchema } from "@fluidframework/flui
24
24
  import {
25
25
  createDOProviderContainerRuntimeFactory,
26
26
  createFluidContainer,
27
+ isInternalFluidContainer,
27
28
  } from "@fluidframework/fluid-static/internal";
28
29
  import {
29
30
  OdspDocumentServiceFactory,
@@ -155,6 +156,9 @@ export class OdspClient {
155
156
  const fluidContainer = await createFluidContainer<T>({
156
157
  container,
157
158
  });
159
+ if (!isInternalFluidContainer(fluidContainer)) {
160
+ throw new Error("Fluid container is not internal");
161
+ }
158
162
  const services = await this.getContainerServices(container);
159
163
  return { container: fluidContainer, services };
160
164
  }
@@ -227,6 +231,9 @@ export class OdspClient {
227
231
  return resolvedUrl.itemId;
228
232
  };
229
233
  const fluidContainer = await createFluidContainer<T>({ container });
234
+ if (!isInternalFluidContainer(fluidContainer)) {
235
+ throw new Error("Fluid container is not internal");
236
+ }
230
237
  fluidContainer.attach = attach;
231
238
  return fluidContainer;
232
239
  }
package/.eslintrc.cjs DELETED
@@ -1,11 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- module.exports = {
7
- extends: [require.resolve("@fluidframework/eslint-config-fluid/strict"), "prettier"],
8
- parserOptions: {
9
- project: ["./tsconfig.json", "./src/test/tsconfig.json"],
10
- },
11
- };