@fluidframework/azure-client 1.1.0-74609 → 1.2.0-106934
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/.eslintrc.js +37 -7
- package/CHANGELOG.md +1 -2
- package/README.md +12 -10
- package/api-extractor.json +1 -1
- package/dist/AzureAudience.d.ts +12 -5
- package/dist/AzureAudience.d.ts.map +1 -1
- package/dist/AzureAudience.js +18 -4
- package/dist/AzureAudience.js.map +1 -1
- package/dist/AzureClient.d.ts.map +1 -1
- package/dist/AzureClient.js +35 -17
- package/dist/AzureClient.js.map +1 -1
- package/dist/AzureFunctionTokenProvider.d.ts +0 -4
- package/dist/AzureFunctionTokenProvider.d.ts.map +1 -1
- package/dist/AzureFunctionTokenProvider.js +4 -4
- package/dist/AzureFunctionTokenProvider.js.map +1 -1
- package/dist/AzureUrlResolver.d.ts +7 -0
- package/dist/AzureUrlResolver.d.ts.map +1 -1
- package/dist/AzureUrlResolver.js +11 -13
- package/dist/AzureUrlResolver.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -15
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +34 -4
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js +0 -4
- package/dist/interfaces.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js.map +1 -1
- package/lib/AzureAudience.d.ts +12 -5
- package/lib/AzureAudience.d.ts.map +1 -1
- package/lib/AzureAudience.js +16 -2
- package/lib/AzureAudience.js.map +1 -1
- package/lib/AzureClient.d.ts.map +1 -1
- package/lib/AzureClient.js +37 -19
- package/lib/AzureClient.js.map +1 -1
- package/lib/AzureFunctionTokenProvider.d.ts +0 -4
- package/lib/AzureFunctionTokenProvider.d.ts.map +1 -1
- package/lib/AzureFunctionTokenProvider.js.map +1 -1
- package/lib/AzureUrlResolver.d.ts +7 -0
- package/lib/AzureUrlResolver.d.ts.map +1 -1
- package/lib/AzureUrlResolver.js +11 -13
- package/lib/AzureUrlResolver.js.map +1 -1
- package/lib/index.d.ts +5 -5
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -4
- package/lib/index.js.map +1 -1
- package/lib/interfaces.d.ts +34 -4
- package/lib/interfaces.d.ts.map +1 -1
- package/lib/interfaces.js +0 -4
- package/lib/interfaces.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/utils.d.ts +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js.map +1 -1
- package/package.json +40 -28
- package/src/AzureAudience.ts +28 -13
- package/src/AzureClient.ts +57 -72
- package/src/AzureFunctionTokenProvider.ts +4 -3
- package/src/AzureUrlResolver.ts +15 -24
- package/src/index.ts +19 -5
- package/src/interfaces.ts +42 -12
- package/src/packageVersion.ts +1 -1
- package/src/utils.ts +9 -3
- package/tsconfig.esnext.json +5 -5
- package/tsconfig.json +9 -15
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;GAIG;AAEH,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,2EAA0E;AAAjE,wIAAA,0BAA0B,OAAA;AAkBnC,6EAAsF;AAAxD,iHAAA,SAAS,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * A simple and powerful way to consume collaborative Fluid data with the Azure Fluid Relay.\n *\n * @packageDocumentation\n */\n\nexport { AzureAudience } from \"./AzureAudience\";\nexport { AzureClient } from \"./AzureClient\";\nexport { AzureFunctionTokenProvider } from \"./AzureFunctionTokenProvider\";\nexport {\n AzureClientProps,\n AzureConnectionConfig,\n AzureConnectionConfigType,\n AzureContainerServices,\n AzureContainerVersion,\n AzureGetVersionsOptions,\n AzureLocalConnectionConfig,\n AzureMember,\n AzureRemoteConnectionConfig,\n AzureUser,\n IAzureAudience,\n ITelemetryBaseEvent,\n ITelemetryBaseLogger,\n} from \"./interfaces\";\n\nexport { ITokenProvider, ITokenResponse } from \"@fluidframework/routerlicious-driver\";\nexport { ITokenClaims, IUser, ScopeType } from \"@fluidframework/protocol-definitions\";\n"]}
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
6
6
|
import { IMember, IServiceAudience } from "@fluidframework/fluid-static";
|
|
7
|
+
import { IUser } from "@fluidframework/protocol-definitions";
|
|
7
8
|
import { ITokenProvider } from "@fluidframework/routerlicious-driver";
|
|
8
|
-
export { ITelemetryBaseEvent, ITelemetryBaseLogger
|
|
9
|
+
export { ITelemetryBaseEvent, ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
9
10
|
/**
|
|
10
11
|
* Props for initializing a new AzureClient instance
|
|
11
12
|
*/
|
|
@@ -13,7 +14,7 @@ export interface AzureClientProps {
|
|
|
13
14
|
/**
|
|
14
15
|
* Configuration for establishing a connection with the Azure Fluid Relay.
|
|
15
16
|
*/
|
|
16
|
-
readonly connection:
|
|
17
|
+
readonly connection: AzureRemoteConnectionConfig | AzureLocalConnectionConfig;
|
|
17
18
|
/**
|
|
18
19
|
* Optional. A logger instance to receive diagnostic messages.
|
|
19
20
|
*/
|
|
@@ -102,11 +103,40 @@ export interface AzureContainerServices {
|
|
|
102
103
|
audience: IAzureAudience;
|
|
103
104
|
}
|
|
104
105
|
/**
|
|
105
|
-
* Since Azure provides user names for all of its members, we extend the
|
|
106
|
-
* this service-specific value.
|
|
106
|
+
* Since Azure provides user names for all of its members, we extend the
|
|
107
|
+
* {@link @fluidframework/protocol-definitions#IUser} interface to include this service-specific value. *
|
|
108
|
+
*
|
|
109
|
+
* @typeParam T - See {@link AzureUser.additionalDetails}.
|
|
110
|
+
* Note: must be JSON-serializable.
|
|
111
|
+
* Passing a non-serializable object (e.g. a `class`) will result in undefined behavior.
|
|
112
|
+
*/
|
|
113
|
+
export interface AzureUser<T = any> extends IUser {
|
|
114
|
+
/**
|
|
115
|
+
* The user's name
|
|
116
|
+
*/
|
|
117
|
+
name: string;
|
|
118
|
+
/**
|
|
119
|
+
* Custom, app-specific user information
|
|
120
|
+
*/
|
|
121
|
+
additionalDetails?: T;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Since Azure provides user names for all of its members, we extend the
|
|
125
|
+
* {@link @fluidframework/protocol-definitions#IMember} interface to include this service-specific value.
|
|
126
|
+
* It will be returned for all audience members connected to Azure.
|
|
127
|
+
*
|
|
128
|
+
* @typeParam T - See {@link AzureMember.additionalDetails}.
|
|
129
|
+
* Note: must be JSON-serializable.
|
|
130
|
+
* Passing a non-serializable object (e.g. a `class`) will result in undefined behavior.
|
|
107
131
|
*/
|
|
108
132
|
export interface AzureMember<T = any> extends IMember {
|
|
133
|
+
/**
|
|
134
|
+
* {@inheritDoc AzureUser.name}
|
|
135
|
+
*/
|
|
109
136
|
userName: string;
|
|
137
|
+
/**
|
|
138
|
+
* {@inheritDoc AzureUser.additionalDetails}
|
|
139
|
+
*/
|
|
110
140
|
additionalDetails?: T;
|
|
111
141
|
}
|
|
112
142
|
/**
|
package/dist/interfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE/F;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,2BAA2B,GAAG,0BAA0B,CAAC;IAC9E;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACpC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,oBAAY,yBAAyB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,IAAI,EAAE,yBAAyB,CAAC;IAChC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,aAAa,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACtE;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACrE;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,QAAQ,EAAE,cAAc,CAAC;CAC5B;AAED;;;;;;;GAOG;AAGH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,KAAK;IAC7C;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,CAAC;CACzB;AAED;;;;;;;;GAQG;AAGH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,OAAO;IACjD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,CAAC;CACzB;AAED;;GAEG;AACH,oBAAY,cAAc,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC"}
|
package/dist/interfaces.js
CHANGED
package/dist/interfaces.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { IMember, IServiceAudience } from \"@fluidframework/fluid-static\";\nimport { IUser } from \"@fluidframework/protocol-definitions\";\nimport { ITokenProvider } from \"@fluidframework/routerlicious-driver\";\n\n// Re-export so developers can build loggers without pulling in common-definitions\nexport { ITelemetryBaseEvent, ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\n\n/**\n * Props for initializing a new AzureClient instance\n */\nexport interface AzureClientProps {\n /**\n * Configuration for establishing a connection with the Azure Fluid Relay.\n */\n readonly connection: AzureRemoteConnectionConfig | AzureLocalConnectionConfig;\n /**\n * Optional. A logger instance to receive diagnostic messages.\n */\n readonly logger?: ITelemetryBaseLogger;\n}\n\n/**\n * Container version metadata.\n */\nexport interface AzureContainerVersion {\n /**\n * Version ID\n */\n id: string;\n\n /**\n * Time when version was generated.\n * ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ\n */\n date?: string;\n}\n\n/**\n * Options for \"Get Container Versions\" API.\n */\nexport interface AzureGetVersionsOptions {\n /**\n * Max number of versions\n */\n maxCount: number;\n}\n\n/**\n * The type of connection.\n * - \"local\" for local connections to a Fluid relay instance running on the localhost\n * - \"remote\" for client connections to the Azure Fluid Relay service\n */\nexport type AzureConnectionConfigType = \"local\" | \"remote\";\n\n/**\n * Parameters for establishing a connection with the Azure Fluid Relay.\n */\nexport interface AzureConnectionConfig {\n /**\n * The type of connection. Whether we're connecting to a remote Fluid relay server or a local instance.\n */\n type: AzureConnectionConfigType;\n /**\n * URI to the Azure Fluid Relay service discovery endpoint.\n */\n endpoint: string;\n /**\n * Instance that provides Azure Fluid Relay endpoint tokens.\n */\n tokenProvider: ITokenProvider;\n}\n\n/**\n * Parameters for establishing a remote connection with the Azure Fluid Relay.\n */\nexport interface AzureRemoteConnectionConfig extends AzureConnectionConfig {\n /**\n * The type of connection. Set to a remote connection.\n */\n type: \"remote\";\n /**\n * Unique tenant identifier.\n */\n tenantId: string;\n}\n\n/**\n * Parameters for establishing a local connection with a local instance of the Azure Fluid Relay.\n */\nexport interface AzureLocalConnectionConfig extends AzureConnectionConfig {\n /**\n * The type of connection. Set to a remote connection.\n */\n type: \"local\";\n}\n\n/**\n * AzureContainerServices is returned by the AzureClient alongside a FluidContainer.\n * It holds the functionality specifically tied to the Azure Fluid Relay, and how the data stored in\n * the 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 use,\n * will not be included here but rather on the FluidContainer class itself.\n */\nexport interface AzureContainerServices {\n /**\n * Provides an object that can be used to get the users that are present in this Fluid session and\n * listeners for when the roster has any changes from users joining/leaving the session\n */\n audience: IAzureAudience;\n}\n\n/**\n * Since Azure provides user names for all of its members, we extend the\n * {@link @fluidframework/protocol-definitions#IUser} interface to include this service-specific value. *\n *\n * @typeParam T - See {@link AzureUser.additionalDetails}.\n * Note: must be JSON-serializable.\n * Passing a non-serializable object (e.g. a `class`) will result in undefined behavior.\n */\n// TODO: this should be updated to use something other than `any` (unknown)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AzureUser<T = any> extends IUser {\n /**\n * The user's name\n */\n name: string;\n\n /**\n * Custom, app-specific user information\n */\n additionalDetails?: T;\n}\n\n/**\n * Since Azure provides user names for all of its members, we extend the\n * {@link @fluidframework/protocol-definitions#IMember} interface to include this service-specific value.\n * It will be returned for all audience members connected to Azure.\n *\n * @typeParam T - See {@link AzureMember.additionalDetails}.\n * Note: must be JSON-serializable.\n * Passing a non-serializable object (e.g. a `class`) will result in undefined behavior.\n */\n// TODO: this should be updated to use something other than `any` (unknown)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface AzureMember<T = any> extends IMember {\n /**\n * {@inheritDoc AzureUser.name}\n */\n userName: string;\n\n /**\n * {@inheritDoc AzureUser.additionalDetails}\n */\n additionalDetails?: T;\n}\n\n/**\n * Audience object for Azure Fluid Relay containers\n */\nexport type IAzureAudience = IServiceAudience<AzureMember>;\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/azure-client";
|
|
8
|
-
export declare const pkgVersion = "1.
|
|
8
|
+
export declare const pkgVersion = "1.2.0-106934";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,iCAAiC,CAAC;AACtD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,iCAAiC,CAAC;AACtD,eAAO,MAAM,UAAU,iBAAiB,CAAC"}
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/azure-client";
|
|
11
|
-
exports.pkgVersion = "1.
|
|
11
|
+
exports.pkgVersion = "1.2.0-106934";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,8BAA8B,CAAC;AACzC,QAAA,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,8BAA8B,CAAC;AACzC,QAAA,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/azure-client\";\nexport const pkgVersion = \"1.2.0-106934\";\n"]}
|
package/dist/utils.d.ts
CHANGED
|
@@ -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 {
|
|
5
|
+
import { AzureConnectionConfig, AzureLocalConnectionConfig, AzureRemoteConnectionConfig } from "./interfaces";
|
|
6
6
|
/**
|
|
7
7
|
* Type guard for validating a given AzureConnectionConfig is a remote connection type (AzureRemoteConnectionConfig)
|
|
8
8
|
*/
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC9B,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,wBAAgB,6BAA6B,CACzC,gBAAgB,EAAE,qBAAqB,GACxC,gBAAgB,IAAI,2BAA2B,CAEjD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,gBAAgB,EAAE,qBAAqB,GACxC,gBAAgB,IAAI,0BAA0B,CAEhD"}
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAUA;;GAEG;AACH,SAAgB,6BAA6B,CACzC,gBAAuC;IAEvC,OAAO,gBAAgB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9C,CAAC;AAJD,sEAIC;AAED;;GAEG;AACH,SAAgB,4BAA4B,CACxC,gBAAuC;IAEvC,OAAO,gBAAgB,CAAC,IAAI,KAAK,OAAO,CAAC;AAC7C,CAAC;AAJD,oEAIC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport {\n AzureConnectionConfig,\n AzureLocalConnectionConfig,\n AzureRemoteConnectionConfig,\n} from \"./interfaces\";\n\n/**\n * Type guard for validating a given AzureConnectionConfig is a remote connection type (AzureRemoteConnectionConfig)\n */\nexport function isAzureRemoteConnectionConfig(\n connectionConfig: AzureConnectionConfig,\n): connectionConfig is AzureRemoteConnectionConfig {\n return connectionConfig.type === \"remote\";\n}\n\n/**\n * Type guard for validating a given AzureConnectionConfig is a local connection type (AzureLocalConnectionConfig)\n */\nexport function isAzureLocalConnectionConfig(\n connectionConfig: AzureConnectionConfig,\n): connectionConfig is AzureLocalConnectionConfig {\n return connectionConfig.type === \"local\";\n}\n"]}
|
package/lib/AzureAudience.d.ts
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
1
|
import { ServiceAudience } from "@fluidframework/fluid-static";
|
|
6
2
|
import { IClient } from "@fluidframework/protocol-definitions";
|
|
7
|
-
import {
|
|
3
|
+
import { AzureMember, IAzureAudience } from "./interfaces";
|
|
4
|
+
/**
|
|
5
|
+
* Azure-specific {@link @fluidframework/fluid-static#ServiceAudience} implementation.
|
|
6
|
+
*
|
|
7
|
+
* @remarks Operates in terms of {@link AzureMember}s.
|
|
8
|
+
*/
|
|
8
9
|
export declare class AzureAudience extends ServiceAudience<AzureMember> implements IAzureAudience {
|
|
9
10
|
/**
|
|
11
|
+
* Creates a {@link @fluidframework/fluid-static#ServiceAudience} from the provided
|
|
12
|
+
* {@link @fluidframework/protocol-definitions#IClient | audience member}.
|
|
13
|
+
*
|
|
14
|
+
* @param audienceMember - Audience member for which the `ServiceAudience` will be generated.
|
|
15
|
+
* Note: its {@link @fluidframework/protocol-definitions#IClient.user} is required to be an {@link AzureUser}.
|
|
16
|
+
*
|
|
10
17
|
* @internal
|
|
11
18
|
*/
|
|
12
19
|
protected createServiceMember(audienceMember: IClient): AzureMember;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureAudience.d.ts","sourceRoot":"","sources":["../src/AzureAudience.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AzureAudience.d.ts","sourceRoot":"","sources":["../src/AzureAudience.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAa,cAAc,EAAE,MAAM,cAAc,CAAC;AAEtE;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,eAAe,CAAC,WAAW,CAAE,YAAW,cAAc;IACrF;;;;;;;;OAQG;IACH,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,OAAO,GAAG,WAAW;CAWtE"}
|
package/lib/AzureAudience.js
CHANGED
|
@@ -2,17 +2,31 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
+
import { assert } from "@fluidframework/common-utils";
|
|
5
6
|
import { ServiceAudience } from "@fluidframework/fluid-static";
|
|
7
|
+
/**
|
|
8
|
+
* Azure-specific {@link @fluidframework/fluid-static#ServiceAudience} implementation.
|
|
9
|
+
*
|
|
10
|
+
* @remarks Operates in terms of {@link AzureMember}s.
|
|
11
|
+
*/
|
|
6
12
|
export class AzureAudience extends ServiceAudience {
|
|
7
13
|
/**
|
|
14
|
+
* Creates a {@link @fluidframework/fluid-static#ServiceAudience} from the provided
|
|
15
|
+
* {@link @fluidframework/protocol-definitions#IClient | audience member}.
|
|
16
|
+
*
|
|
17
|
+
* @param audienceMember - Audience member for which the `ServiceAudience` will be generated.
|
|
18
|
+
* Note: its {@link @fluidframework/protocol-definitions#IClient.user} is required to be an {@link AzureUser}.
|
|
19
|
+
*
|
|
8
20
|
* @internal
|
|
9
21
|
*/
|
|
10
22
|
createServiceMember(audienceMember) {
|
|
23
|
+
const azureUser = audienceMember.user;
|
|
24
|
+
assert((azureUser === null || azureUser === void 0 ? void 0 : azureUser.name) !== undefined, 'Provided user was not an "AzureUser".');
|
|
11
25
|
return {
|
|
12
26
|
userId: audienceMember.user.id,
|
|
13
|
-
userName:
|
|
27
|
+
userName: azureUser.name,
|
|
14
28
|
connections: [],
|
|
15
|
-
additionalDetails:
|
|
29
|
+
additionalDetails: azureUser.additionalDetails,
|
|
16
30
|
};
|
|
17
31
|
}
|
|
18
32
|
}
|
package/lib/AzureAudience.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureAudience.js","sourceRoot":"","sources":["../src/AzureAudience.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"AzureAudience.js","sourceRoot":"","sources":["../src/AzureAudience.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAK/D;;;;GAIG;AACH,MAAM,OAAO,aAAc,SAAQ,eAA4B;IAC3D;;;;;;;;OAQG;IACO,mBAAmB,CAAC,cAAuB;QACjD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAiB,CAAC;QACnD,MAAM,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,MAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAE/E,OAAO;YACH,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE;YAC9B,QAAQ,EAAE,SAAS,CAAC,IAAI;YACxB,WAAW,EAAE,EAAE;YACf,iBAAiB,EAAE,SAAS,CAAC,iBAA4B;SAC5D,CAAC;IACN,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { assert } from \"@fluidframework/common-utils\";\nimport { ServiceAudience } from \"@fluidframework/fluid-static\";\nimport { IClient } from \"@fluidframework/protocol-definitions\";\n\nimport { AzureMember, AzureUser, IAzureAudience } from \"./interfaces\";\n\n/**\n * Azure-specific {@link @fluidframework/fluid-static#ServiceAudience} implementation.\n *\n * @remarks Operates in terms of {@link AzureMember}s.\n */\nexport class AzureAudience extends ServiceAudience<AzureMember> implements IAzureAudience {\n /**\n * Creates a {@link @fluidframework/fluid-static#ServiceAudience} from the provided\n * {@link @fluidframework/protocol-definitions#IClient | audience member}.\n *\n * @param audienceMember - Audience member for which the `ServiceAudience` will be generated.\n * Note: its {@link @fluidframework/protocol-definitions#IClient.user} is required to be an {@link AzureUser}.\n *\n * @internal\n */\n protected createServiceMember(audienceMember: IClient): AzureMember {\n const azureUser = audienceMember.user as AzureUser;\n assert(azureUser?.name !== undefined, 'Provided user was not an \"AzureUser\".');\n\n return {\n userId: audienceMember.user.id,\n userName: azureUser.name,\n connections: [],\n additionalDetails: azureUser.additionalDetails as unknown,\n };\n }\n}\n"]}
|
package/lib/AzureClient.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureClient.d.ts","sourceRoot":"","sources":["../src/AzureClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AzureClient.d.ts","sourceRoot":"","sources":["../src/AzureClient.ts"],"names":[],"mappings":"AAYA,OAAO,EACH,eAAe,EAGf,eAAe,EAElB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,EACH,gBAAgB,EAEhB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EAC1B,MAAM,cAAc,CAAC;AAetB;;;GAGG;AACH,qBAAa,WAAW;IAQR,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPlC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAE3C;;;OAGG;gBAC0B,KAAK,EAAE,gBAAgB;IAapD;;;;OAIG;IACU,eAAe,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC;QACpE,SAAS,EAAE,eAAe,CAAC;QAC3B,QAAQ,EAAE,sBAAsB,CAAC;KACpC,CAAC;IAaF;;;;;;;OAOG;IACU,aAAa,CACtB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,eAAe,EAChC,OAAO,CAAC,EAAE,qBAAqB,GAChC,OAAO,CAAC;QACP,SAAS,EAAE,eAAe,CAAC;QAC3B,QAAQ,EAAE,sBAAsB,CAAC;KACpC,CAAC;IA8BF;;;;;OAKG;IACU,YAAY,CACrB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,eAAe,GACjC,OAAO,CAAC;QACP,SAAS,EAAE,eAAe,CAAC;QAC3B,QAAQ,EAAE,sBAAsB,CAAC;KACpC,CAAC;IAaF;;;;;;OAMG;IACU,oBAAoB,CAC7B,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,uBAAuB,GAClC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAwBnC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,YAAY;YA6BN,oBAAoB;CA4BrC"}
|
package/lib/AzureClient.js
CHANGED
|
@@ -2,22 +2,24 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { Loader } from "@fluidframework/container-loader";
|
|
6
5
|
import { AttachState, } from "@fluidframework/container-definitions";
|
|
7
|
-
import {
|
|
8
|
-
import { requestFluidObject } from "@fluidframework/runtime-utils";
|
|
6
|
+
import { Loader } from "@fluidframework/container-loader";
|
|
9
7
|
import { ensureFluidResolvedUrl } from "@fluidframework/driver-utils";
|
|
10
8
|
import { DOProviderContainerRuntimeFactory, FluidContainer, } from "@fluidframework/fluid-static";
|
|
11
|
-
import { SummaryType
|
|
12
|
-
import {
|
|
9
|
+
import { SummaryType } from "@fluidframework/protocol-definitions";
|
|
10
|
+
import { RouterliciousDocumentServiceFactory } from "@fluidframework/routerlicious-driver";
|
|
11
|
+
import { requestFluidObject } from "@fluidframework/runtime-utils";
|
|
13
12
|
import { AzureAudience } from "./AzureAudience";
|
|
14
|
-
import { AzureUrlResolver, createAzureCreateNewRequest
|
|
13
|
+
import { AzureUrlResolver, createAzureCreateNewRequest } from "./AzureUrlResolver";
|
|
14
|
+
import { isAzureRemoteConnectionConfig } from "./utils";
|
|
15
15
|
/**
|
|
16
16
|
* Strongly typed id for connecting to a local Azure Fluid Relay.
|
|
17
17
|
*/
|
|
18
18
|
const LOCAL_MODE_TENANT_ID = "local";
|
|
19
19
|
const getTenantId = (connectionProps) => {
|
|
20
|
-
return isAzureRemoteConnectionConfig(connectionProps)
|
|
20
|
+
return isAzureRemoteConnectionConfig(connectionProps)
|
|
21
|
+
? connectionProps.tenantId
|
|
22
|
+
: LOCAL_MODE_TENANT_ID;
|
|
21
23
|
};
|
|
22
24
|
const MAX_VERSION_COUNT = 5;
|
|
23
25
|
/**
|
|
@@ -36,8 +38,8 @@ export class AzureClient {
|
|
|
36
38
|
this.urlResolver = new AzureUrlResolver();
|
|
37
39
|
// The local service implementation differs from the Azure Fluid Relay in blob
|
|
38
40
|
// storage format. Azure Fluid Relay supports whole summary upload. Local currently does not.
|
|
39
|
-
const
|
|
40
|
-
this.documentServiceFactory = new RouterliciousDocumentServiceFactory(this.props.connection.tokenProvider, { enableWholeSummaryUpload, enableDiscovery:
|
|
41
|
+
const isRemoteConnection = isAzureRemoteConnectionConfig(this.props.connection);
|
|
42
|
+
this.documentServiceFactory = new RouterliciousDocumentServiceFactory(this.props.connection.tokenProvider, { enableWholeSummaryUpload: isRemoteConnection, enableDiscovery: isRemoteConnection });
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
45
|
* Creates a new detached container instance in the Azure Fluid Relay.
|
|
@@ -123,6 +125,8 @@ export class AzureClient {
|
|
|
123
125
|
}
|
|
124
126
|
const documentService = await this.documentServiceFactory.createDocumentService(resolvedUrl);
|
|
125
127
|
const storage = await documentService.connectToStorage();
|
|
128
|
+
// External API uses null
|
|
129
|
+
// eslint-disable-next-line unicorn/no-null
|
|
126
130
|
const versions = await storage.getVersions(null, (_a = options === null || options === void 0 ? void 0 : options.maxCount) !== null && _a !== void 0 ? _a : MAX_VERSION_COUNT);
|
|
127
131
|
return versions.map((item) => {
|
|
128
132
|
return { id: item.id, date: item.date };
|
|
@@ -142,27 +146,41 @@ export class AzureClient {
|
|
|
142
146
|
};
|
|
143
147
|
};
|
|
144
148
|
const codeLoader = { load };
|
|
149
|
+
const client = {
|
|
150
|
+
details: {
|
|
151
|
+
capabilities: { interactive: true },
|
|
152
|
+
},
|
|
153
|
+
permission: [],
|
|
154
|
+
scopes: [],
|
|
155
|
+
user: { id: "" },
|
|
156
|
+
mode: "write",
|
|
157
|
+
};
|
|
145
158
|
return new Loader({
|
|
146
159
|
urlResolver: this.urlResolver,
|
|
147
160
|
documentServiceFactory: this.documentServiceFactory,
|
|
148
161
|
codeLoader,
|
|
149
162
|
logger: this.props.logger,
|
|
163
|
+
options: { client },
|
|
150
164
|
});
|
|
151
165
|
}
|
|
152
166
|
async createFluidContainer(container, connection) {
|
|
153
167
|
const createNewRequest = createAzureCreateNewRequest(connection.endpoint, getTenantId(connection));
|
|
154
168
|
const rootDataObject = await requestFluidObject(container, "/");
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const resolved = container.resolvedUrl;
|
|
162
|
-
ensureFluidResolvedUrl(resolved);
|
|
163
|
-
return resolved.id;
|
|
169
|
+
/**
|
|
170
|
+
* See {@link FluidContainer.attach}
|
|
171
|
+
*/
|
|
172
|
+
const attach = async () => {
|
|
173
|
+
if (container.attachState !== AttachState.Detached) {
|
|
174
|
+
throw new Error("Cannot attach container. Container is not in detached state");
|
|
164
175
|
}
|
|
165
|
-
|
|
176
|
+
await container.attach(createNewRequest);
|
|
177
|
+
const resolved = container.resolvedUrl;
|
|
178
|
+
ensureFluidResolvedUrl(resolved);
|
|
179
|
+
return resolved.id;
|
|
180
|
+
};
|
|
181
|
+
const fluidContainer = new FluidContainer(container, rootDataObject);
|
|
182
|
+
fluidContainer.attach = attach;
|
|
183
|
+
return fluidContainer;
|
|
166
184
|
}
|
|
167
185
|
}
|
|
168
186
|
//# sourceMappingURL=AzureClient.js.map
|
package/lib/AzureClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureClient.js","sourceRoot":"","sources":["../src/AzureClient.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 */\nimport { Loader } from \"@fluidframework/container-loader\";\nimport {\n IDocumentServiceFactory,\n IUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport {\n AttachState,\n IContainer,\n IFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions\";\nimport { RouterliciousDocumentServiceFactory } from \"@fluidframework/routerlicious-driver\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\nimport { ensureFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n ContainerSchema,\n DOProviderContainerRuntimeFactory,\n FluidContainer,\n IFluidContainer,\n RootDataObject,\n} from \"@fluidframework/fluid-static\";\n\nimport {\n SummaryType,\n} from \"@fluidframework/protocol-definitions\";\n\nimport {\n AzureClientProps,\n AzureConnectionConfig,\n AzureContainerServices,\n AzureContainerVersion,\n AzureGetVersionsOptions,\n} from \"./interfaces\";\nimport { isAzureRemoteConnectionConfig } from \"./utils\";\nimport { AzureAudience } from \"./AzureAudience\";\nimport {\n AzureUrlResolver,\n createAzureCreateNewRequest,\n} from \"./AzureUrlResolver\";\n\n/**\n * Strongly typed id for connecting to a local Azure Fluid Relay.\n */\nconst LOCAL_MODE_TENANT_ID = \"local\";\nconst getTenantId = (connectionProps: AzureConnectionConfig): string => {\n return isAzureRemoteConnectionConfig(connectionProps) ? connectionProps.tenantId : LOCAL_MODE_TENANT_ID;\n};\n\nconst MAX_VERSION_COUNT = 5;\n\n/**\n * AzureClient provides the ability to have a Fluid object backed by the Azure Fluid Relay or,\n * when running with local tenantId, have it be backed by a local Azure Fluid Relay instance.\n */\nexport class AzureClient {\n private readonly documentServiceFactory: IDocumentServiceFactory;\n private readonly urlResolver: IUrlResolver;\n\n /**\n * Creates a new client instance using configuration parameters.\n * @param props - Properties for initializing a new AzureClient instance\n */\n constructor(private readonly props: AzureClientProps) {\n // remove trailing slash from URL if any\n props.connection.endpoint = props.connection.endpoint.replace(/\\/$/, \"\");\n this.urlResolver = new AzureUrlResolver();\n // The local service implementation differs from the Azure Fluid Relay in blob\n // storage format. Azure Fluid Relay supports whole summary upload. Local currently does not.\n const enableWholeSummaryUpload = isAzureRemoteConnectionConfig(this.props.connection);\n this.documentServiceFactory = new RouterliciousDocumentServiceFactory(\n this.props.connection.tokenProvider,\n { enableWholeSummaryUpload, enableDiscovery: true },\n );\n }\n\n /**\n * Creates a new detached container instance in the Azure Fluid Relay.\n * @param containerSchema - Container schema for the new container.\n * @returns New detached container instance along with associated services.\n */\n public async createContainer(\n containerSchema: ContainerSchema,\n ): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n\n const container = await loader.createDetachedContainer({\n package: \"no-dynamic-package\",\n config: {},\n });\n\n const fluidContainer = await this.createFluidContainer(\n container,\n this.props.connection,\n );\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Creates new detached container out of specific version of another container.\n * @param id - Unique ID of the source container in Azure Fluid Relay.\n * @param containerSchema - Container schema used to access data objects in the container.\n * @param version - Unique version of the source container in Azure Fluid Relay.\n * It defaults to latest version if parameter not provided.\n * @returns New detached container instance along with associated services.\n */\n public async copyContainer(\n id: string,\n containerSchema: ContainerSchema,\n version?: AzureContainerVersion,\n ): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\"storage\", encodeURIComponent(this.props.connection.endpoint));\n url.searchParams.append(\"tenantId\", encodeURIComponent(getTenantId(this.props.connection)));\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n const sourceContainer = await loader.resolve({ url: url.href });\n\n if (sourceContainer.resolvedUrl === undefined) {\n throw new Error(\n \"Source container cannot resolve URL.\",\n );\n }\n\n const documentService = await this.documentServiceFactory.createDocumentService(sourceContainer.resolvedUrl);\n const storage = await documentService.connectToStorage();\n const handle = {\n type: SummaryType.Handle,\n handleType: SummaryType.Tree,\n handle: version?.id ?? \"latest\",\n };\n const tree = await storage.downloadSummary(handle);\n\n const container = await loader.rehydrateDetachedContainerFromSnapshot(\n JSON.stringify(tree),\n );\n\n const fluidContainer = await this.createFluidContainer(\n container,\n this.props.connection,\n );\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Accesses the existing container given its unique ID in the Azure Fluid Relay.\n * @param id - Unique ID of the container in Azure Fluid Relay.\n * @param containerSchema - Container schema used to access data objects in the container.\n * @returns Existing container instance along with associated services.\n */\n public async getContainer(\n id: string,\n containerSchema: ContainerSchema,\n ): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\"storage\", encodeURIComponent(this.props.connection.endpoint));\n url.searchParams.append(\"tenantId\", encodeURIComponent(getTenantId(this.props.connection)));\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n const container = await loader.resolve({ url: url.href });\n const rootDataObject = await requestFluidObject<RootDataObject>(\n container,\n \"/\",\n );\n const fluidContainer = new FluidContainer(container, rootDataObject);\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Get the list of versions for specific container.\n * @param id - Unique ID of the source container in Azure Fluid Relay.\n * @param options - \"Get\" options. If options are not provided, API\n * will assume maxCount of versions to retreive to be 5.\n * @returns Array of available container versions.\n */\n public async getContainerVersions(\n id: string,\n options?: AzureGetVersionsOptions,\n ): Promise<AzureContainerVersion[]> {\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\n \"storage\",\n encodeURIComponent(this.props.connection.endpoint),\n );\n url.searchParams.append(\n \"tenantId\",\n encodeURIComponent(getTenantId(this.props.connection)),\n );\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n\n const resolvedUrl = await this.urlResolver.resolve({ url: url.href });\n if (!resolvedUrl) {\n throw new Error(\"Unable to resolved URL\");\n }\n const documentService =\n await this.documentServiceFactory.createDocumentService(\n resolvedUrl,\n );\n const storage = await documentService.connectToStorage();\n const versions = await storage.getVersions(null, options?.maxCount ?? MAX_VERSION_COUNT);\n\n return versions.map((item) => {\n return { id: item.id, date: item.date };\n });\n }\n\n private getContainerServices(container: IContainer): AzureContainerServices {\n return {\n audience: new AzureAudience(container),\n };\n }\n\n private createLoader(containerSchema: ContainerSchema): Loader {\n const runtimeFactory = new DOProviderContainerRuntimeFactory(\n containerSchema,\n );\n const load = async (): Promise<IFluidModuleWithDetails> => {\n return {\n module: { fluidExport: runtimeFactory },\n details: { package: \"no-dynamic-package\", config: {} },\n };\n };\n\n const codeLoader = { load };\n return new Loader({\n urlResolver: this.urlResolver,\n documentServiceFactory: this.documentServiceFactory,\n codeLoader,\n logger: this.props.logger,\n });\n }\n\n private async createFluidContainer(\n container: IContainer,\n connection: AzureConnectionConfig,\n ): Promise<FluidContainer> {\n const createNewRequest = createAzureCreateNewRequest(\n connection.endpoint,\n getTenantId(connection),\n );\n\n const rootDataObject = await requestFluidObject<RootDataObject>(\n container,\n \"/\",\n );\n return new (class extends FluidContainer {\n async attach() {\n if (this.attachState !== AttachState.Detached) {\n throw new Error(\n \"Cannot attach container. Container is not in detached state\",\n );\n }\n await container.attach(createNewRequest);\n const resolved = container.resolvedUrl;\n ensureFluidResolvedUrl(resolved);\n return resolved.id;\n }\n })(container, rootDataObject);\n }\n // #endregion\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AzureClient.js","sourceRoot":"","sources":["../src/AzureClient.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 */\nimport {\n AttachState,\n IContainer,\n IFluidModuleWithDetails,\n} from \"@fluidframework/container-definitions\";\nimport { Loader } from \"@fluidframework/container-loader\";\nimport { IDocumentServiceFactory, IUrlResolver } from \"@fluidframework/driver-definitions\";\nimport { ensureFluidResolvedUrl } from \"@fluidframework/driver-utils\";\nimport {\n ContainerSchema,\n DOProviderContainerRuntimeFactory,\n FluidContainer,\n IFluidContainer,\n RootDataObject,\n} from \"@fluidframework/fluid-static\";\nimport { IClient, SummaryType } from \"@fluidframework/protocol-definitions\";\nimport { RouterliciousDocumentServiceFactory } from \"@fluidframework/routerlicious-driver\";\nimport { requestFluidObject } from \"@fluidframework/runtime-utils\";\n\nimport { AzureAudience } from \"./AzureAudience\";\nimport { AzureUrlResolver, createAzureCreateNewRequest } from \"./AzureUrlResolver\";\nimport {\n AzureClientProps,\n AzureConnectionConfig,\n AzureContainerServices,\n AzureContainerVersion,\n AzureGetVersionsOptions,\n} from \"./interfaces\";\nimport { isAzureRemoteConnectionConfig } from \"./utils\";\n\n/**\n * Strongly typed id for connecting to a local Azure Fluid Relay.\n */\nconst LOCAL_MODE_TENANT_ID = \"local\";\nconst getTenantId = (connectionProps: AzureConnectionConfig): string => {\n return isAzureRemoteConnectionConfig(connectionProps)\n ? connectionProps.tenantId\n : LOCAL_MODE_TENANT_ID;\n};\n\nconst MAX_VERSION_COUNT = 5;\n\n/**\n * AzureClient provides the ability to have a Fluid object backed by the Azure Fluid Relay or,\n * when running with local tenantId, have it be backed by a local Azure Fluid Relay instance.\n */\nexport class AzureClient {\n private readonly documentServiceFactory: IDocumentServiceFactory;\n private readonly urlResolver: IUrlResolver;\n\n /**\n * Creates a new client instance using configuration parameters.\n * @param props - Properties for initializing a new AzureClient instance\n */\n constructor(private readonly props: AzureClientProps) {\n // remove trailing slash from URL if any\n props.connection.endpoint = props.connection.endpoint.replace(/\\/$/, \"\");\n this.urlResolver = new AzureUrlResolver();\n // The local service implementation differs from the Azure Fluid Relay in blob\n // storage format. Azure Fluid Relay supports whole summary upload. Local currently does not.\n const isRemoteConnection = isAzureRemoteConnectionConfig(this.props.connection);\n this.documentServiceFactory = new RouterliciousDocumentServiceFactory(\n this.props.connection.tokenProvider,\n { enableWholeSummaryUpload: isRemoteConnection, enableDiscovery: isRemoteConnection },\n );\n }\n\n /**\n * Creates a new detached container instance in the Azure Fluid Relay.\n * @param containerSchema - Container schema for the new container.\n * @returns New detached container instance along with associated services.\n */\n public async createContainer(containerSchema: ContainerSchema): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n\n const container = await loader.createDetachedContainer({\n package: \"no-dynamic-package\",\n config: {},\n });\n\n const fluidContainer = await this.createFluidContainer(container, this.props.connection);\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Creates new detached container out of specific version of another container.\n * @param id - Unique ID of the source container in Azure Fluid Relay.\n * @param containerSchema - Container schema used to access data objects in the container.\n * @param version - Unique version of the source container in Azure Fluid Relay.\n * It defaults to latest version if parameter not provided.\n * @returns New detached container instance along with associated services.\n */\n public async copyContainer(\n id: string,\n containerSchema: ContainerSchema,\n version?: AzureContainerVersion,\n ): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\"storage\", encodeURIComponent(this.props.connection.endpoint));\n url.searchParams.append(\"tenantId\", encodeURIComponent(getTenantId(this.props.connection)));\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n const sourceContainer = await loader.resolve({ url: url.href });\n\n if (sourceContainer.resolvedUrl === undefined) {\n throw new Error(\"Source container cannot resolve URL.\");\n }\n\n const documentService = await this.documentServiceFactory.createDocumentService(\n sourceContainer.resolvedUrl,\n );\n const storage = await documentService.connectToStorage();\n const handle = {\n type: SummaryType.Handle,\n handleType: SummaryType.Tree,\n handle: version?.id ?? \"latest\",\n };\n const tree = await storage.downloadSummary(handle);\n\n const container = await loader.rehydrateDetachedContainerFromSnapshot(JSON.stringify(tree));\n\n const fluidContainer = await this.createFluidContainer(container, this.props.connection);\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Accesses the existing container given its unique ID in the Azure Fluid Relay.\n * @param id - Unique ID of the container in Azure Fluid Relay.\n * @param containerSchema - Container schema used to access data objects in the container.\n * @returns Existing container instance along with associated services.\n */\n public async getContainer(\n id: string,\n containerSchema: ContainerSchema,\n ): Promise<{\n container: IFluidContainer;\n services: AzureContainerServices;\n }> {\n const loader = this.createLoader(containerSchema);\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\"storage\", encodeURIComponent(this.props.connection.endpoint));\n url.searchParams.append(\"tenantId\", encodeURIComponent(getTenantId(this.props.connection)));\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n const container = await loader.resolve({ url: url.href });\n const rootDataObject = await requestFluidObject<RootDataObject>(container, \"/\");\n const fluidContainer = new FluidContainer(container, rootDataObject);\n const services = this.getContainerServices(container);\n return { container: fluidContainer, services };\n }\n\n /**\n * Get the list of versions for specific container.\n * @param id - Unique ID of the source container in Azure Fluid Relay.\n * @param options - \"Get\" options. If options are not provided, API\n * will assume maxCount of versions to retreive to be 5.\n * @returns Array of available container versions.\n */\n public async getContainerVersions(\n id: string,\n options?: AzureGetVersionsOptions,\n ): Promise<AzureContainerVersion[]> {\n const url = new URL(this.props.connection.endpoint);\n url.searchParams.append(\"storage\", encodeURIComponent(this.props.connection.endpoint));\n url.searchParams.append(\"tenantId\", encodeURIComponent(getTenantId(this.props.connection)));\n url.searchParams.append(\"containerId\", encodeURIComponent(id));\n\n const resolvedUrl = await this.urlResolver.resolve({ url: url.href });\n if (!resolvedUrl) {\n throw new Error(\"Unable to resolved URL\");\n }\n const documentService = await this.documentServiceFactory.createDocumentService(\n resolvedUrl,\n );\n const storage = await documentService.connectToStorage();\n\n // External API uses null\n // eslint-disable-next-line unicorn/no-null\n const versions = await storage.getVersions(null, options?.maxCount ?? MAX_VERSION_COUNT);\n\n return versions.map((item) => {\n return { id: item.id, date: item.date };\n });\n }\n\n private getContainerServices(container: IContainer): AzureContainerServices {\n return {\n audience: new AzureAudience(container),\n };\n }\n\n private createLoader(containerSchema: ContainerSchema): Loader {\n const runtimeFactory = new DOProviderContainerRuntimeFactory(containerSchema);\n const load = async (): Promise<IFluidModuleWithDetails> => {\n return {\n module: { fluidExport: runtimeFactory },\n details: { package: \"no-dynamic-package\", config: {} },\n };\n };\n\n const codeLoader = { load };\n const client: IClient = {\n details: {\n capabilities: { interactive: true },\n },\n permission: [],\n scopes: [],\n user: { id: \"\" },\n mode: \"write\",\n };\n\n return new Loader({\n urlResolver: this.urlResolver,\n documentServiceFactory: this.documentServiceFactory,\n codeLoader,\n logger: this.props.logger,\n options: { client },\n });\n }\n\n private async createFluidContainer(\n container: IContainer,\n connection: AzureConnectionConfig,\n ): Promise<FluidContainer> {\n const createNewRequest = createAzureCreateNewRequest(\n connection.endpoint,\n getTenantId(connection),\n );\n\n const rootDataObject = await requestFluidObject<RootDataObject>(container, \"/\");\n\n /**\n * See {@link FluidContainer.attach}\n */\n const attach = async (): Promise<string> => {\n if (container.attachState !== AttachState.Detached) {\n throw new Error(\"Cannot attach container. Container is not in detached state\");\n }\n await container.attach(createNewRequest);\n const resolved = container.resolvedUrl;\n ensureFluidResolvedUrl(resolved);\n return resolved.id;\n };\n const fluidContainer = new FluidContainer(container, rootDataObject);\n fluidContainer.attach = attach;\n return fluidContainer;\n }\n // #endregion\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureFunctionTokenProvider.d.ts","sourceRoot":"","sources":["../src/AzureFunctionTokenProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AzureFunctionTokenProvider.d.ts","sourceRoot":"","sources":["../src/AzureFunctionTokenProvider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,cAAc;IAOzD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IAP1B;;;;OAIG;gBAEkB,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,iFAAgE;IAG7E,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMjF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YAM/E,QAAQ;CAYzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureFunctionTokenProvider.js","sourceRoot":"","sources":["../src/AzureFunctionTokenProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"AzureFunctionTokenProvider.js","sourceRoot":"","sources":["../src/AzureFunctionTokenProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACnC;;;;OAIG;IACH,YACqB,aAAqB,EACrB,IAAqE;QADrE,kBAAa,GAAb,aAAa,CAAQ;QACrB,SAAI,GAAJ,IAAI,CAAiE;IACvF,CAAC;IAEG,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,UAAmB;QAChE,OAAO;YACH,GAAG,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;SACjD,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,UAAkB;QAC/D,OAAO;YACH,GAAG,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;SACjD,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,UAAmB;;QACxD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE;YACjD,MAAM,EAAE;gBACJ,QAAQ;gBACR,UAAU;gBACV,MAAM,EAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM;gBACzB,QAAQ,EAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,QAAQ;gBAC7B,iBAAiB,EAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,iBAA4B;aAC7D;SACJ,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAc,CAAC;IACnC,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport axios from \"axios\";\n\nimport { ITokenProvider, ITokenResponse } from \"@fluidframework/routerlicious-driver\";\n\nimport { AzureMember } from \"./interfaces\";\n\n/**\n * Token Provider implementation for connecting to an Azure Function endpoint for\n * Azure Fluid Relay token resolution.\n */\nexport class AzureFunctionTokenProvider implements ITokenProvider {\n /**\n * Creates a new instance using configuration parameters.\n * @param azFunctionUrl - URL to Azure Function endpoint\n * @param user - User object\n */\n constructor(\n private readonly azFunctionUrl: string,\n private readonly user?: Pick<AzureMember, \"userId\" | \"userName\" | \"additionalDetails\">,\n ) {}\n\n public async fetchOrdererToken(tenantId: string, documentId?: string): Promise<ITokenResponse> {\n return {\n jwt: await this.getToken(tenantId, documentId),\n };\n }\n\n public async fetchStorageToken(tenantId: string, documentId: string): Promise<ITokenResponse> {\n return {\n jwt: await this.getToken(tenantId, documentId),\n };\n }\n\n private async getToken(tenantId: string, documentId?: string): Promise<string> {\n const response = await axios.get(this.azFunctionUrl, {\n params: {\n tenantId,\n documentId,\n userId: this.user?.userId,\n userName: this.user?.userName,\n additionalDetails: this.user?.additionalDetails as unknown,\n },\n });\n return response.data as string;\n }\n}\n"]}
|
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { IRequest } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { IFluidResolvedUrl, IResolvedUrl, IUrlResolver } from "@fluidframework/driver-definitions";
|
|
7
|
+
/**
|
|
8
|
+
* Implementation of {@link @fluidframework/driver-definitions#IUrlResolver} to resolve documents stored using the
|
|
9
|
+
* Azure Fluid Relay based off of the orderer and storage URLs provide.
|
|
10
|
+
*
|
|
11
|
+
* @remarks The token provider here can be an `InsecureTokenProvider` for basic scenarios or more robust, secure
|
|
12
|
+
* providers that fulfill the {@link @fluidframework/routerlicious-driver#ITokenProvider} interface.
|
|
13
|
+
*/
|
|
7
14
|
export declare class AzureUrlResolver implements IUrlResolver {
|
|
8
15
|
constructor();
|
|
9
16
|
resolve(request: IRequest): Promise<IFluidResolvedUrl>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureUrlResolver.d.ts","sourceRoot":"","sources":["../src/AzureUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"AzureUrlResolver.d.ts","sourceRoot":"","sources":["../src/AzureUrlResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAEH,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACf,MAAM,oCAAoC,CAAC;AAE5C;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,YAAY;;IAGpC,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoCtD,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAM/F;AA+BD,eAAO,MAAM,2BAA2B,gBAAiB,MAAM,YAAY,MAAM,KAAG,QAUnF,CAAC"}
|
package/lib/AzureUrlResolver.js
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
1
|
import { DriverHeader, } from "@fluidframework/driver-definitions";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Implementation of {@link @fluidframework/driver-definitions#IUrlResolver} to resolve documents stored using the
|
|
4
|
+
* Azure Fluid Relay based off of the orderer and storage URLs provide.
|
|
5
|
+
*
|
|
6
|
+
* @remarks The token provider here can be an `InsecureTokenProvider` for basic scenarios or more robust, secure
|
|
7
|
+
* providers that fulfill the {@link @fluidframework/routerlicious-driver#ITokenProvider} interface.
|
|
8
|
+
*/
|
|
10
9
|
export class AzureUrlResolver {
|
|
11
10
|
constructor() { }
|
|
12
11
|
async resolve(request) {
|
|
13
12
|
const { ordererUrl, storageUrl, tenantId, containerId } = decodeAzureUrl(request.url);
|
|
14
13
|
// determine whether the request is for creating of a new container.
|
|
15
14
|
// such request has the `createNew` header set to true and doesn't have a container ID.
|
|
16
|
-
if (request.headers &&
|
|
17
|
-
request.headers[DriverHeader.createNew] === true) {
|
|
15
|
+
if (request.headers && request.headers[DriverHeader.createNew] === true) {
|
|
18
16
|
return {
|
|
19
17
|
endpoints: {
|
|
20
18
|
deltaStorageUrl: `${ordererUrl}/deltas/${tenantId}/new`,
|
|
@@ -33,7 +31,7 @@ export class AzureUrlResolver {
|
|
|
33
31
|
throw new Error("Azure URL did not contain containerId");
|
|
34
32
|
}
|
|
35
33
|
const documentUrl = `${ordererUrl}/${tenantId}/${containerId}`;
|
|
36
|
-
return
|
|
34
|
+
return {
|
|
37
35
|
endpoints: {
|
|
38
36
|
deltaStorageUrl: `${ordererUrl}/deltas/${tenantId}/${containerId}`,
|
|
39
37
|
ordererUrl,
|
|
@@ -43,11 +41,11 @@ export class AzureUrlResolver {
|
|
|
43
41
|
tokens: {},
|
|
44
42
|
type: "fluid",
|
|
45
43
|
url: documentUrl,
|
|
46
|
-
}
|
|
44
|
+
};
|
|
47
45
|
}
|
|
48
46
|
async getAbsoluteUrl(resolvedUrl, relativeUrl) {
|
|
49
47
|
if (resolvedUrl.type !== "fluid") {
|
|
50
|
-
throw Error("Invalid Resolved Url");
|
|
48
|
+
throw new Error("Invalid Resolved Url");
|
|
51
49
|
}
|
|
52
50
|
return `${resolvedUrl.url}/${relativeUrl}`;
|
|
53
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureUrlResolver.js","sourceRoot":"","sources":["../src/AzureUrlResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AzureUrlResolver.js","sourceRoot":"","sources":["../src/AzureUrlResolver.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 */\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n DriverHeader,\n IFluidResolvedUrl,\n IResolvedUrl,\n IUrlResolver,\n} from \"@fluidframework/driver-definitions\";\n\n/**\n * Implementation of {@link @fluidframework/driver-definitions#IUrlResolver} to resolve documents stored using the\n * Azure Fluid Relay based off of the orderer and storage URLs provide.\n *\n * @remarks The token provider here can be an `InsecureTokenProvider` for basic scenarios or more robust, secure\n * providers that fulfill the {@link @fluidframework/routerlicious-driver#ITokenProvider} interface.\n */\nexport class AzureUrlResolver implements IUrlResolver {\n constructor() {}\n\n public async resolve(request: IRequest): Promise<IFluidResolvedUrl> {\n const { ordererUrl, storageUrl, tenantId, containerId } = decodeAzureUrl(request.url);\n // determine whether the request is for creating of a new container.\n // such request has the `createNew` header set to true and doesn't have a container ID.\n if (request.headers && request.headers[DriverHeader.createNew] === true) {\n return {\n endpoints: {\n deltaStorageUrl: `${ordererUrl}/deltas/${tenantId}/new`,\n ordererUrl,\n storageUrl: `${storageUrl}/repos/${tenantId}`,\n },\n // id is a mandatory attribute, but it's ignored by the driver for new container requests.\n id: \"\",\n // tokens attribute is redundant as all tokens are generated via ITokenProvider\n tokens: {},\n type: \"fluid\",\n url: `${ordererUrl}/${tenantId}/new`,\n };\n }\n if (containerId === undefined) {\n throw new Error(\"Azure URL did not contain containerId\");\n }\n const documentUrl = `${ordererUrl}/${tenantId}/${containerId}`;\n return {\n endpoints: {\n deltaStorageUrl: `${ordererUrl}/deltas/${tenantId}/${containerId}`,\n ordererUrl,\n storageUrl: `${storageUrl}/repos/${tenantId}`,\n },\n id: containerId,\n tokens: {},\n type: \"fluid\",\n url: documentUrl,\n };\n }\n\n public async getAbsoluteUrl(resolvedUrl: IResolvedUrl, relativeUrl: string): Promise<string> {\n if (resolvedUrl.type !== \"fluid\") {\n throw new Error(\"Invalid Resolved Url\");\n }\n return `${resolvedUrl.url}/${relativeUrl}`;\n }\n}\n\nfunction decodeAzureUrl(urlString: string): {\n ordererUrl: string;\n storageUrl: string;\n tenantId: string;\n containerId?: string;\n} {\n const url = new URL(urlString);\n const ordererUrl = url.origin;\n const searchParams = url.searchParams;\n const storageUrl = searchParams.get(\"storage\");\n if (storageUrl === null) {\n throw new Error(\"Azure URL did not contain a storage URL\");\n }\n const tenantId = searchParams.get(\"tenantId\");\n if (tenantId === null) {\n throw new Error(\"Azure URL did not contain a tenant ID\");\n }\n const storageUrlDecoded = decodeURIComponent(storageUrl);\n const tenantIdDecoded = decodeURIComponent(tenantId);\n const containerId = searchParams.get(\"containerId\");\n const containerIdDecoded = containerId !== null ? decodeURIComponent(containerId) : undefined;\n return {\n ordererUrl,\n storageUrl: storageUrlDecoded,\n tenantId: tenantIdDecoded,\n containerId: containerIdDecoded,\n };\n}\n\nexport const createAzureCreateNewRequest = (endpointUrl: string, tenantId: string): IRequest => {\n const url = new URL(endpointUrl);\n url.searchParams.append(\"storage\", encodeURIComponent(endpointUrl));\n url.searchParams.append(\"tenantId\", encodeURIComponent(tenantId));\n return {\n url: url.href,\n headers: {\n [DriverHeader.createNew]: true,\n },\n };\n};\n"]}
|