@fluidframework/aqueduct 2.0.0-internal.3.0.2 → 2.0.0-internal.3.2.0

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.
Files changed (62) hide show
  1. package/README.md +29 -29
  2. package/dist/container-runtime-factories/baseContainerRuntimeFactory.d.ts.map +1 -1
  3. package/dist/container-runtime-factories/baseContainerRuntimeFactory.js +3 -1
  4. package/dist/container-runtime-factories/baseContainerRuntimeFactory.js.map +1 -1
  5. package/dist/container-runtime-factories/containerRuntimeFactoryWithDefaultDataStore.d.ts.map +1 -1
  6. package/dist/container-runtime-factories/containerRuntimeFactoryWithDefaultDataStore.js +1 -4
  7. package/dist/container-runtime-factories/containerRuntimeFactoryWithDefaultDataStore.js.map +1 -1
  8. package/dist/container-services/containerServices.d.ts.map +1 -1
  9. package/dist/container-services/containerServices.js +3 -1
  10. package/dist/container-services/containerServices.js.map +1 -1
  11. package/dist/data-object-factories/dataObjectFactory.d.ts.map +1 -1
  12. package/dist/data-object-factories/dataObjectFactory.js.map +1 -1
  13. package/dist/data-object-factories/pureDataObjectFactory.d.ts.map +1 -1
  14. package/dist/data-object-factories/pureDataObjectFactory.js +4 -2
  15. package/dist/data-object-factories/pureDataObjectFactory.js.map +1 -1
  16. package/dist/data-objects/dataObject.d.ts.map +1 -1
  17. package/dist/data-objects/dataObject.js +1 -1
  18. package/dist/data-objects/dataObject.js.map +1 -1
  19. package/dist/data-objects/pureDataObject.d.ts.map +1 -1
  20. package/dist/data-objects/pureDataObject.js +15 -5
  21. package/dist/data-objects/pureDataObject.js.map +1 -1
  22. package/dist/data-objects/types.d.ts.map +1 -1
  23. package/dist/data-objects/types.js.map +1 -1
  24. package/dist/index.d.ts +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/request-handlers/requestHandlers.d.ts +1 -1
  28. package/dist/request-handlers/requestHandlers.d.ts.map +1 -1
  29. package/dist/request-handlers/requestHandlers.js +4 -2
  30. package/dist/request-handlers/requestHandlers.js.map +1 -1
  31. package/dist/test/containerServices.spec.js +15 -4
  32. package/dist/test/containerServices.spec.js.map +1 -1
  33. package/dist/test/defaultRoute.spec.js +3 -1
  34. package/dist/test/defaultRoute.spec.js.map +1 -1
  35. package/dist/test/tsconfig.tsbuildinfo +1 -1
  36. package/dist/utils/attachUtils.js +3 -1
  37. package/dist/utils/attachUtils.js.map +1 -1
  38. package/dist/utils/containerInteractions.d.ts.map +1 -1
  39. package/dist/utils/containerInteractions.js.map +1 -1
  40. package/lib/container-runtime-factories/baseContainerRuntimeFactory.js +5 -3
  41. package/lib/container-runtime-factories/baseContainerRuntimeFactory.js.map +1 -1
  42. package/lib/container-runtime-factories/containerRuntimeFactoryWithDefaultDataStore.js +1 -4
  43. package/lib/container-runtime-factories/containerRuntimeFactoryWithDefaultDataStore.js.map +1 -1
  44. package/lib/container-services/containerServices.js +3 -1
  45. package/lib/container-services/containerServices.js.map +1 -1
  46. package/lib/data-object-factories/dataObjectFactory.js +1 -1
  47. package/lib/data-object-factories/dataObjectFactory.js.map +1 -1
  48. package/lib/data-object-factories/pureDataObjectFactory.js +4 -2
  49. package/lib/data-object-factories/pureDataObjectFactory.js.map +1 -1
  50. package/lib/data-objects/dataObject.js +1 -1
  51. package/lib/data-objects/dataObject.js.map +1 -1
  52. package/lib/data-objects/pureDataObject.js +15 -5
  53. package/lib/data-objects/pureDataObject.js.map +1 -1
  54. package/lib/data-objects/types.js.map +1 -1
  55. package/lib/index.js +1 -1
  56. package/lib/index.js.map +1 -1
  57. package/lib/request-handlers/requestHandlers.js +4 -2
  58. package/lib/request-handlers/requestHandlers.js.map +1 -1
  59. package/lib/utils/attachUtils.js +3 -1
  60. package/lib/utils/attachUtils.js.map +1 -1
  61. package/lib/utils/containerInteractions.js.map +1 -1
  62. package/package.json +50 -49
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/data-objects/types.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 {\n FluidObject,\n} from \"@fluidframework/core-interfaces\";\nimport { AsyncFluidObjectProvider } from \"@fluidframework/synthesize\";\nimport { IFluidDataStoreContext } from \"@fluidframework/runtime-definitions\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions\";\nimport { IEvent } from \"@fluidframework/common-definitions\";\n\n/**\n * This type is used as the base generic input to DataObject and PureDataObject.\n */\nexport interface DataObjectTypes {\n /**\n * represents a type that will define optional providers that will be injected\n */\n OptionalProviders?: FluidObject;\n /**\n * the initial state type that the produced data object may take during creation\n */\n InitialState?: any;\n /**\n * represents events that will be available in the EventForwarder\n */\n Events?: IEvent;\n}\n\nexport interface IDataObjectProps<I extends DataObjectTypes = DataObjectTypes> {\n readonly runtime: IFluidDataStoreRuntime;\n readonly context: IFluidDataStoreContext;\n readonly providers: AsyncFluidObjectProvider<I[\"OptionalProviders\"]>;\n readonly initProps?: I[\"InitialState\"];\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/data-objects/types.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 { FluidObject } from \"@fluidframework/core-interfaces\";\nimport { AsyncFluidObjectProvider } from \"@fluidframework/synthesize\";\nimport { IFluidDataStoreContext } from \"@fluidframework/runtime-definitions\";\nimport { IFluidDataStoreRuntime } from \"@fluidframework/datastore-definitions\";\nimport { IEvent } from \"@fluidframework/common-definitions\";\n\n/**\n * This type is used as the base generic input to DataObject and PureDataObject.\n */\nexport interface DataObjectTypes {\n\t/**\n\t * represents a type that will define optional providers that will be injected\n\t */\n\tOptionalProviders?: FluidObject;\n\t/**\n\t * the initial state type that the produced data object may take during creation\n\t */\n\tInitialState?: any;\n\t/**\n\t * represents events that will be available in the EventForwarder\n\t */\n\tEvents?: IEvent;\n}\n\nexport interface IDataObjectProps<I extends DataObjectTypes = DataObjectTypes> {\n\treadonly runtime: IFluidDataStoreRuntime;\n\treadonly context: IFluidDataStoreContext;\n\treadonly providers: AsyncFluidObjectProvider<I[\"OptionalProviders\"]>;\n\treadonly initProps?: I[\"InitialState\"];\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  *
17
17
  * @packageDocumentation
18
18
  */
19
- export { DataObjectFactory, IRootDataObjectFactory, PureDataObjectFactory } from "./data-object-factories";
19
+ export { DataObjectFactory, IRootDataObjectFactory, PureDataObjectFactory, } from "./data-object-factories";
20
20
  export { DataObject, DataObjectTypes, IDataObjectProps, PureDataObject } from "./data-objects";
21
21
  export { BaseContainerRuntimeFactory, ContainerRuntimeFactoryWithDefaultDataStore, } from "./container-runtime-factories";
22
22
  export { BaseContainerService, ContainerServiceRegistryEntries, generateContainerServicesRequestHandler, serviceRoutePathRoot, } from "./container-services";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EACN,2BAA2B,EAC3B,2CAA2C,GAC3C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,oBAAoB,EACpB,+BAA+B,EAC/B,uCAAuC,EACvC,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,4BAA4B,EAC5B,aAAa,GACb,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AAEH,OAAO,EACN,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EACN,2BAA2B,EAC3B,2CAA2C,GAC3C,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,oBAAoB,EACpB,+BAA+B,EAC/B,uCAAuC,EACvC,oBAAoB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,gCAAgC,EAChC,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,6BAA6B,EAC7B,sBAAsB,EACtB,4BAA4B,EAC5B,aAAa,GACb,MAAM,SAAS,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;;;;;;;;;;GAaG;AAEH,iEAA2G;AAAlG,0HAAA,iBAAiB,OAAA;AAA0B,8HAAA,qBAAqB,OAAA;AACzE,+CAA+F;AAAtF,0GAAA,UAAU,OAAA;AAAqC,8GAAA,cAAc,OAAA;AACtE,6EAGuC;AAFtC,0IAAA,2BAA2B,OAAA;AAC3B,0JAAA,2CAA2C,OAAA;AAE5C,2DAK8B;AAJ7B,0HAAA,oBAAoB,OAAA;AAEpB,6IAAA,uCAAuC,OAAA;AACvC,0HAAA,oBAAoB,OAAA;AAErB,uDAI4B;AAH3B,oIAAA,gCAAgC,OAAA;AAChC,8HAAA,0BAA0B,OAAA;AAC1B,+HAAA,2BAA2B,OAAA;AAE5B,iCAKiB;AAJhB,sHAAA,6BAA6B,OAAA;AAC7B,+GAAA,sBAAsB,OAAA;AACtB,qHAAA,4BAA4B,OAAA;AAC5B,sGAAA,aAAa,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * The `aqueduct` package is a library for building Fluid objects and Fluid\n * containers within the Fluid Framework. Its goal is to provide a thin base\n * layer over the existing Fluid Framework interfaces that allows developers to\n * get started quickly.\n *\n * @remarks\n * About the library name: An \"aqueduct\" is a way to transport water from a source\n * to another location. The library name was chosen because its purpose is to\n * facilitate using lower level constructs and therefore handle 'fluid' items\n * same as an aqueduct.\n *\n * @packageDocumentation\n */\n\nexport { DataObjectFactory, IRootDataObjectFactory, PureDataObjectFactory } from \"./data-object-factories\";\nexport { DataObject, DataObjectTypes, IDataObjectProps, PureDataObject } from \"./data-objects\";\nexport {\n\tBaseContainerRuntimeFactory,\n\tContainerRuntimeFactoryWithDefaultDataStore,\n} from \"./container-runtime-factories\";\nexport {\n\tBaseContainerService,\n\tContainerServiceRegistryEntries,\n\tgenerateContainerServicesRequestHandler,\n\tserviceRoutePathRoot,\n} from \"./container-services\";\nexport {\n\tdefaultFluidObjectRequestHandler,\n\tdefaultRouteRequestHandler,\n\tmountableViewRequestHandler,\n} from \"./request-handlers\";\nexport {\n\tgetDefaultObjectFromContainer,\n\tgetObjectFromContainer,\n\tgetObjectWithIdFromContainer,\n\twaitForAttach,\n} from \"./utils\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH;;;;;;;;;;;;;GAaG;AAEH,iEAIiC;AAHhC,0HAAA,iBAAiB,OAAA;AAEjB,8HAAA,qBAAqB,OAAA;AAEtB,+CAA+F;AAAtF,0GAAA,UAAU,OAAA;AAAqC,8GAAA,cAAc,OAAA;AACtE,6EAGuC;AAFtC,0IAAA,2BAA2B,OAAA;AAC3B,0JAAA,2CAA2C,OAAA;AAE5C,2DAK8B;AAJ7B,0HAAA,oBAAoB,OAAA;AAEpB,6IAAA,uCAAuC,OAAA;AACvC,0HAAA,oBAAoB,OAAA;AAErB,uDAI4B;AAH3B,oIAAA,gCAAgC,OAAA;AAChC,8HAAA,0BAA0B,OAAA;AAC1B,+HAAA,2BAA2B,OAAA;AAE5B,iCAKiB;AAJhB,sHAAA,6BAA6B,OAAA;AAC7B,+GAAA,sBAAsB,OAAA;AACtB,qHAAA,4BAA4B,OAAA;AAC5B,sGAAA,aAAa,OAAA","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/**\n * The `aqueduct` package is a library for building Fluid objects and Fluid\n * containers within the Fluid Framework. Its goal is to provide a thin base\n * layer over the existing Fluid Framework interfaces that allows developers to\n * get started quickly.\n *\n * @remarks\n * About the library name: An \"aqueduct\" is a way to transport water from a source\n * to another location. The library name was chosen because its purpose is to\n * facilitate using lower level constructs and therefore handle 'fluid' items\n * same as an aqueduct.\n *\n * @packageDocumentation\n */\n\nexport {\n\tDataObjectFactory,\n\tIRootDataObjectFactory,\n\tPureDataObjectFactory,\n} from \"./data-object-factories\";\nexport { DataObject, DataObjectTypes, IDataObjectProps, PureDataObject } from \"./data-objects\";\nexport {\n\tBaseContainerRuntimeFactory,\n\tContainerRuntimeFactoryWithDefaultDataStore,\n} from \"./container-runtime-factories\";\nexport {\n\tBaseContainerService,\n\tContainerServiceRegistryEntries,\n\tgenerateContainerServicesRequestHandler,\n\tserviceRoutePathRoot,\n} from \"./container-services\";\nexport {\n\tdefaultFluidObjectRequestHandler,\n\tdefaultRouteRequestHandler,\n\tmountableViewRequestHandler,\n} from \"./request-handlers\";\nexport {\n\tgetDefaultObjectFromContainer,\n\tgetObjectFromContainer,\n\tgetObjectWithIdFromContainer,\n\twaitForAttach,\n} from \"./utils\";\n"]}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { FluidObject, IRequest, IResponse } from "@fluidframework/core-interfaces";
6
6
  import { IContainerRuntime } from "@fluidframework/container-runtime-definitions";
7
- import { IFluidMountableViewClass } from "@fluidframework/view-interfaces";
7
+ import type { IFluidMountableViewClass } from "@fluidframework/view-interfaces";
8
8
  import { RuntimeRequestHandler } from "@fluidframework/request-handler";
9
9
  import { RequestParser } from "@fluidframework/runtime-utils";
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandlers.d.ts","sourceRoot":"","sources":["../../src/request-handlers/requestHandlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAkB,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAA8B,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,aAAa,EAAqB,MAAM,+BAA+B,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,uBACf,wBAAwB,YAAY,qBAAqB,EAAE,eAErD,aAAa,WAAW,iBAAiB,uBAwBnE,CAAC;AAEN;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,kBAAmB,MAAM,eACrC,QAAQ,WAAW,iBAAiB,mCAS9D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,CAIvG"}
1
+ {"version":3,"file":"requestHandlers.d.ts","sourceRoot":"","sources":["../../src/request-handlers/requestHandlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAkB,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAA8B,MAAM,iCAAiC,CAAC;AACpG,OAAO,EAAE,aAAa,EAAqB,MAAM,+BAA+B,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,2BAA2B,uBACnB,wBAAwB,YAClC,qBAAqB,EAAE,eAGV,aAAa,WAAW,iBAAiB,uBA4BhE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,kBAAmB,MAAM,eACxC,QAAQ,WAAW,iBAAiB,mCAU3D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC/C,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,QAAQ,GACf,SAAS,CAIX"}
@@ -35,7 +35,9 @@ const mountableViewRequestHandler = (MountableViewClass, handlers) => {
35
35
  };
36
36
  }
37
37
  const response = await nestedHandler(newRequest, runtime);
38
- if (mountableView && response.status === 200 && MountableViewClass.canMount(response.value)) {
38
+ if (mountableView &&
39
+ response.status === 200 &&
40
+ MountableViewClass.canMount(response.value)) {
39
41
  return {
40
42
  status: 200,
41
43
  mimeType: "fluid/object",
@@ -57,7 +59,7 @@ const defaultRouteRequestHandler = (defaultRootId) => {
57
59
  if (parser.pathParts.length === 0) {
58
60
  return runtime.IFluidHandleContext.resolveHandle({
59
61
  url: `/${defaultRootId}${parser.query}`,
60
- headers: request.headers
62
+ headers: request.headers,
61
63
  });
62
64
  }
63
65
  return undefined; // continue search
@@ -1 +1 @@
1
- {"version":3,"file":"requestHandlers.js","sourceRoot":"","sources":["../../src/request-handlers/requestHandlers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,qEAAoG;AACpG,iEAAiF;AAEjF;;;;;;;;;;GAUG;AACI,MAAM,2BAA2B,GACpC,CAAC,kBAA4C,EAAE,QAAiC,EAAE,EAAE;IAChF,MAAM,aAAa,GAAG,IAAA,4CAA0B,EAAC,GAAG,QAAQ,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,OAAsB,EAAE,OAA0B,EAAE,EAAE;;QAChE,MAAM,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,aAAa,MAAK,IAAI,CAAC;QAC9D,IAAI,UAAU,GAAa,OAAO,CAAC;QACnC,IAAI,aAAa,EAAE;YACf,wDAAwD;YACxD,mDAAmD;YACnD,MAAM,OAAO,qBAAwB,OAAO,CAAC,OAAO,CAAE,CAAC;YACvD,OAAQ,OAAe,CAAC,aAAa,CAAC;YACtC,UAAU,GAAG;gBACT,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO;aACV,CAAC;SACL;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE1D,IAAI,aAAa,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACzF,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,cAAc;gBACxB,KAAK,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;aAChD,CAAC;SACL;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC;AACN,CAAC,CAAC;AA3BO,QAAA,2BAA2B,+BA2BlC;AAEN;;;;GAIG;AACI,MAAM,0BAA0B,GAAG,CAAC,aAAqB,EAAE,EAAE;IAChE,OAAO,KAAK,EAAE,OAAiB,EAAE,OAA0B,EAAE,EAAE;QAC3D,MAAM,MAAM,GAAG,6BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,OAAO,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC;gBAC7C,GAAG,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE;gBACvC,OAAO,EAAE,OAAO,CAAC,OAAO;aAAE,CAAC,CAAC;SACnC;QACD,OAAO,SAAS,CAAC,CAAC,kBAAkB;IACxC,CAAC,CAAC;AACN,CAAC,CAAC;AAVW,QAAA,0BAA0B,8BAUrC;AAEF;;;;;;;;;;GAUG;AACH,SAAgB,gCAAgC,CAAC,WAAwB,EAAE,OAAiB;IACxF,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5E,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE;QAC/D,CAAC,CAAC,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAJD,4EAIC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { FluidObject, IRequest, IRequestHeader, IResponse } from \"@fluidframework/core-interfaces\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidMountableViewClass } from \"@fluidframework/view-interfaces\";\nimport { RuntimeRequestHandler, buildRuntimeRequestHandler } from \"@fluidframework/request-handler\";\nimport { RequestParser, create404Response } from \"@fluidframework/runtime-utils\";\n\n/**\n * A mountable view is only required if the view needs to be mounted across a bundle boundary. Mounting across\n * bundle boundaries breaks some frameworks, so the mountable view is used to ensure the mounting is done within\n * the same bundle as the view. For example, React hooks don't work if mounted across bundles since there will\n * be two React instances, breaking the Rules of Hooks. When cross-bundle mounting isn't required, the mountable\n * view isn't necessary.\n *\n * When a request is received with a mountableView: true header, this request handler will reissue the request\n * without the header, and respond with a mountable view of the given class using the response.\n * @param MountableViewClass - The type of mountable view to use when responding\n */\nexport const mountableViewRequestHandler =\n (MountableViewClass: IFluidMountableViewClass, handlers: RuntimeRequestHandler[]) => {\n const nestedHandler = buildRuntimeRequestHandler(...handlers);\n return async (request: RequestParser, runtime: IContainerRuntime) => {\n const mountableView = request.headers?.mountableView === true;\n let newRequest: IRequest = request;\n if (mountableView) {\n // Reissue the request without the mountableView header.\n // We'll repack whatever the response is if we can.\n const headers: IRequestHeader = { ...request.headers };\n delete (headers as any).mountableView;\n newRequest = {\n url: request.url,\n headers,\n };\n }\n const response = await nestedHandler(newRequest, runtime);\n\n if (mountableView && response.status === 200 && MountableViewClass.canMount(response.value)) {\n return {\n status: 200,\n mimeType: \"fluid/object\",\n value: new MountableViewClass(response.value),\n };\n }\n return response;\n };\n };\n\n/**\n * Pipe through container request into internal request.\n * If request is empty and default url is provided, redirect request to such default url.\n * @param defaultRootId - optional default root data store ID to pass request in case request is empty.\n */\nexport const defaultRouteRequestHandler = (defaultRootId: string) => {\n return async (request: IRequest, runtime: IContainerRuntime) => {\n const parser = RequestParser.create(request);\n if (parser.pathParts.length === 0) {\n return runtime.IFluidHandleContext.resolveHandle({\n url: `/${defaultRootId}${parser.query}`,\n headers: request.headers });\n }\n return undefined; // continue search\n };\n};\n\n/**\n * Default request handler for a Fluid object that returns the object itself if:\n *\n * 1. the request url is empty\n *\n * 2. the request url is \"/\"\n *\n * 3. the request url starts with \"/\" and is followed by a query param, such as /?key=value\n *\n * Returns a 404 error for any other url.\n */\nexport function defaultFluidObjectRequestHandler(fluidObject: FluidObject, request: IRequest): IResponse {\n return request.url === \"\" || request.url === \"/\" || request.url.startsWith(\"/?\")\n ? { mimeType: \"fluid/object\", status: 200, value: fluidObject }\n : create404Response(request);\n}\n"]}
1
+ {"version":3,"file":"requestHandlers.js","sourceRoot":"","sources":["../../src/request-handlers/requestHandlers.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,qEAAoG;AACpG,iEAAiF;AAEjF;;;;;;;;;;GAUG;AACI,MAAM,2BAA2B,GAAG,CAC1C,kBAA4C,EAC5C,QAAiC,EAChC,EAAE;IACH,MAAM,aAAa,GAAG,IAAA,4CAA0B,EAAC,GAAG,QAAQ,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,OAAsB,EAAE,OAA0B,EAAE,EAAE;;QACnE,MAAM,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,aAAa,MAAK,IAAI,CAAC;QAC9D,IAAI,UAAU,GAAa,OAAO,CAAC;QACnC,IAAI,aAAa,EAAE;YAClB,wDAAwD;YACxD,mDAAmD;YACnD,MAAM,OAAO,qBAAwB,OAAO,CAAC,OAAO,CAAE,CAAC;YACvD,OAAQ,OAAe,CAAC,aAAa,CAAC;YACtC,UAAU,GAAG;gBACZ,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO;aACP,CAAC;SACF;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE1D,IACC,aAAa;YACb,QAAQ,CAAC,MAAM,KAAK,GAAG;YACvB,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC1C;YACD,OAAO;gBACN,MAAM,EAAE,GAAG;gBACX,QAAQ,EAAE,cAAc;gBACxB,KAAK,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;aAC7C,CAAC;SACF;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC,CAAC;AACH,CAAC,CAAC;AAjCW,QAAA,2BAA2B,+BAiCtC;AAEF;;;;GAIG;AACI,MAAM,0BAA0B,GAAG,CAAC,aAAqB,EAAE,EAAE;IACnE,OAAO,KAAK,EAAE,OAAiB,EAAE,OAA0B,EAAE,EAAE;QAC9D,MAAM,MAAM,GAAG,6BAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YAClC,OAAO,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC;gBAChD,GAAG,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,KAAK,EAAE;gBACvC,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAC;SACH;QACD,OAAO,SAAS,CAAC,CAAC,kBAAkB;IACrC,CAAC,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,0BAA0B,8BAWrC;AAEF;;;;;;;;;;GAUG;AACH,SAAgB,gCAAgC,CAC/C,WAAwB,EACxB,OAAiB;IAEjB,OAAO,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE;QAC/D,CAAC,CAAC,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAPD,4EAOC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { FluidObject, IRequest, IRequestHeader, IResponse } from \"@fluidframework/core-interfaces\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport type { IFluidMountableViewClass } from \"@fluidframework/view-interfaces\";\nimport { RuntimeRequestHandler, buildRuntimeRequestHandler } from \"@fluidframework/request-handler\";\nimport { RequestParser, create404Response } from \"@fluidframework/runtime-utils\";\n\n/**\n * A mountable view is only required if the view needs to be mounted across a bundle boundary. Mounting across\n * bundle boundaries breaks some frameworks, so the mountable view is used to ensure the mounting is done within\n * the same bundle as the view. For example, React hooks don't work if mounted across bundles since there will\n * be two React instances, breaking the Rules of Hooks. When cross-bundle mounting isn't required, the mountable\n * view isn't necessary.\n *\n * When a request is received with a mountableView: true header, this request handler will reissue the request\n * without the header, and respond with a mountable view of the given class using the response.\n * @param MountableViewClass - The type of mountable view to use when responding\n */\nexport const mountableViewRequestHandler = (\n\tMountableViewClass: IFluidMountableViewClass,\n\thandlers: RuntimeRequestHandler[],\n) => {\n\tconst nestedHandler = buildRuntimeRequestHandler(...handlers);\n\treturn async (request: RequestParser, runtime: IContainerRuntime) => {\n\t\tconst mountableView = request.headers?.mountableView === true;\n\t\tlet newRequest: IRequest = request;\n\t\tif (mountableView) {\n\t\t\t// Reissue the request without the mountableView header.\n\t\t\t// We'll repack whatever the response is if we can.\n\t\t\tconst headers: IRequestHeader = { ...request.headers };\n\t\t\tdelete (headers as any).mountableView;\n\t\t\tnewRequest = {\n\t\t\t\turl: request.url,\n\t\t\t\theaders,\n\t\t\t};\n\t\t}\n\t\tconst response = await nestedHandler(newRequest, runtime);\n\n\t\tif (\n\t\t\tmountableView &&\n\t\t\tresponse.status === 200 &&\n\t\t\tMountableViewClass.canMount(response.value)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tstatus: 200,\n\t\t\t\tmimeType: \"fluid/object\",\n\t\t\t\tvalue: new MountableViewClass(response.value),\n\t\t\t};\n\t\t}\n\t\treturn response;\n\t};\n};\n\n/**\n * Pipe through container request into internal request.\n * If request is empty and default url is provided, redirect request to such default url.\n * @param defaultRootId - optional default root data store ID to pass request in case request is empty.\n */\nexport const defaultRouteRequestHandler = (defaultRootId: string) => {\n\treturn async (request: IRequest, runtime: IContainerRuntime) => {\n\t\tconst parser = RequestParser.create(request);\n\t\tif (parser.pathParts.length === 0) {\n\t\t\treturn runtime.IFluidHandleContext.resolveHandle({\n\t\t\t\turl: `/${defaultRootId}${parser.query}`,\n\t\t\t\theaders: request.headers,\n\t\t\t});\n\t\t}\n\t\treturn undefined; // continue search\n\t};\n};\n\n/**\n * Default request handler for a Fluid object that returns the object itself if:\n *\n * 1. the request url is empty\n *\n * 2. the request url is \"/\"\n *\n * 3. the request url starts with \"/\" and is followed by a query param, such as /?key=value\n *\n * Returns a 404 error for any other url.\n */\nexport function defaultFluidObjectRequestHandler(\n\tfluidObject: FluidObject,\n\trequest: IRequest,\n): IResponse {\n\treturn request.url === \"\" || request.url === \"/\" || request.url.startsWith(\"/?\")\n\t\t? { mimeType: \"fluid/object\", status: 200, value: fluidObject }\n\t\t: create404Response(request);\n}\n"]}
@@ -50,9 +50,16 @@ describe("Routerlicious", () => {
50
50
  });
51
51
  it("Request to non-routeable service with sub-route should fail", async () => {
52
52
  const requestHandler = (0, container_services_1.generateContainerServicesRequestHandler)([
53
- ["id1", async (r) => { return {}; }],
53
+ [
54
+ "id1",
55
+ async (r) => {
56
+ return {};
57
+ },
58
+ ],
54
59
  ]);
55
- const requestParser = runtime_utils_1.RequestParser.create({ url: `/${container_services_1.serviceRoutePathRoot}/id1/subroute` });
60
+ const requestParser = runtime_utils_1.RequestParser.create({
61
+ url: `/${container_services_1.serviceRoutePathRoot}/id1/subroute`,
62
+ });
56
63
  const response = await requestHandler(requestParser, {});
57
64
  (0, assert_1.strict)(response, "Response returned");
58
65
  (0, assert_1.strict)((response === null || response === void 0 ? void 0 : response.status) === 400, "Returned 400 Status Code");
@@ -107,8 +114,12 @@ describe("Routerlicious", () => {
107
114
  });
108
115
  it("Sub-route should be persisted through", async () => {
109
116
  const service1 = new ContainerServiceMock({});
110
- const requestHandler = (0, container_services_1.generateContainerServicesRequestHandler)([["id1", async (r) => service1]]);
111
- const requestParser = runtime_utils_1.RequestParser.create({ url: `/${container_services_1.serviceRoutePathRoot}/id1/sub1` });
117
+ const requestHandler = (0, container_services_1.generateContainerServicesRequestHandler)([
118
+ ["id1", async (r) => service1],
119
+ ]);
120
+ const requestParser = runtime_utils_1.RequestParser.create({
121
+ url: `/${container_services_1.serviceRoutePathRoot}/id1/sub1`,
122
+ });
112
123
  const response = await requestHandler(requestParser, {});
113
124
  (0, assert_1.strict)(response, "Response returned");
114
125
  (0, assert_1.strict)((response === null || response === void 0 ? void 0 : response.status) === 200, "Returned 200 Status Code");
@@ -1 +1 @@
1
- {"version":3,"file":"containerServices.spec.js","sourceRoot":"","sources":["../../src/test/containerServices.spec.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\nimport { strict as assert } from \"assert\";\nimport { IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { RequestParser } from \"@fluidframework/runtime-utils\";\nimport {\n BaseContainerService,\n generateContainerServicesRequestHandler,\n serviceRoutePathRoot,\n} from \"../container-services\";\n\nclass ContainerServiceMock extends BaseContainerService {\n public route: string = \"\";\n\n public async request(request: IRequest): Promise<IResponse> {\n this.route = request.url;\n return {\n status: 200,\n mimeType: \"fluid/object\",\n value: this,\n };\n }\n}\n\ndescribe(\"Routerlicious\", () => {\n describe(\"Aqueduct\", () => {\n describe(\"generateContainerServicesRequestHandler\", () => {\n it(`Request to ${serviceRoutePathRoot} and no id should fail`, async () => {\n const requestHandler = generateContainerServicesRequestHandler([]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 400, \"Returned 400 Status Code\");\n });\n\n it(\"Unknown service should return 404 with no services\", async () => {\n const requestHandler = generateContainerServicesRequestHandler([]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 404, \"Returned 404 Status Code\");\n });\n\n it(\"Unknown service should return 404 with services\", async () => {\n const requestHandler = generateContainerServicesRequestHandler([\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n ]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id2` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 404, \"Returned 404 Status Code\");\n });\n\n it(\"Request to non-routeable service with sub-route should fail\", async () => {\n const requestHandler = generateContainerServicesRequestHandler([\n [\"id1\", async (r) => { return {}; }],\n ]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1/subroute` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 400, \"Returned 400 Status Code\");\n });\n\n it(\"Correct service should be returned with single service\", async () => {\n const service1 = new ContainerServiceMock({} as IContainerRuntime);\n const serviceMap = new Map();\n serviceMap.set(\"id1\", async (r) => service1);\n const requestHandler = generateContainerServicesRequestHandler(serviceMap);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 200, \"Returned 200 Status Code\");\n assert(response?.value === service1, \"Returned expected service\");\n });\n\n it(\"Same service should be returned twice with two calls\", async () => {\n const requestHandler = generateContainerServicesRequestHandler([\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n ]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n const response1 = await requestHandler(requestParser, {} as IContainerRuntime);\n const response2 = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response1?.value === response2?.value, \"Returned same service twice\");\n });\n\n it(\"Correct service should be returned with multiple services\", async () => {\n const service2 = new ContainerServiceMock({} as IContainerRuntime);\n const requestHandler = generateContainerServicesRequestHandler([\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id2\", async (r) => service2],\n ]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id2` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 200, \"Returned 200 Status Code\");\n assert(response?.value === service2, \"Returned expected service\");\n });\n\n it(\"Last registered service should be returned with multiple services of the same name\", async () => {\n const service1 = new ContainerServiceMock({} as IContainerRuntime);\n const requestHandler = generateContainerServicesRequestHandler([\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id1\", async (r) => new ContainerServiceMock(r)],\n [\"id1\", async (r) => service1],\n ]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 200, \"Returned 200 Status Code\");\n assert(response?.value === service1, \"Returned expected service\");\n });\n\n it(\"Sub-route should be persisted through\", async () => {\n const service1 = new ContainerServiceMock({} as IContainerRuntime);\n const requestHandler = generateContainerServicesRequestHandler([[\"id1\", async (r) => service1]]);\n const requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1/sub1` });\n\n const response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n assert(response, \"Response returned\");\n assert(response?.status === 200, \"Returned 200 Status Code\");\n assert(response?.value === service1, \"Returned expected service\");\n assert((response?.value as ContainerServiceMock).route === \"/sub1\", \"sub-route persisted\");\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"containerServices.spec.js","sourceRoot":"","sources":["../../src/test/containerServices.spec.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\nimport { strict as assert } from \"assert\";\nimport { IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { RequestParser } from \"@fluidframework/runtime-utils\";\nimport {\n\tBaseContainerService,\n\tgenerateContainerServicesRequestHandler,\n\tserviceRoutePathRoot,\n} from \"../container-services\";\n\nclass ContainerServiceMock extends BaseContainerService {\n\tpublic route: string = \"\";\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\tthis.route = request.url;\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tmimeType: \"fluid/object\",\n\t\t\tvalue: this,\n\t\t};\n\t}\n}\n\ndescribe(\"Routerlicious\", () => {\n\tdescribe(\"Aqueduct\", () => {\n\t\tdescribe(\"generateContainerServicesRequestHandler\", () => {\n\t\t\tit(`Request to ${serviceRoutePathRoot} and no id should fail`, async () => {\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 400, \"Returned 400 Status Code\");\n\t\t\t});\n\n\t\t\tit(\"Unknown service should return 404 with no services\", async () => {\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 404, \"Returned 404 Status Code\");\n\t\t\t});\n\n\t\t\tit(\"Unknown service should return 404 with services\", async () => {\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id2` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 404, \"Returned 404 Status Code\");\n\t\t\t});\n\n\t\t\tit(\"Request to non-routeable service with sub-route should fail\", async () => {\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\n\t\t\t\t\t\t\"id1\",\n\t\t\t\t\t\tasync (r) => {\n\t\t\t\t\t\t\treturn {};\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({\n\t\t\t\t\turl: `/${serviceRoutePathRoot}/id1/subroute`,\n\t\t\t\t});\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 400, \"Returned 400 Status Code\");\n\t\t\t});\n\n\t\t\tit(\"Correct service should be returned with single service\", async () => {\n\t\t\t\tconst service1 = new ContainerServiceMock({} as IContainerRuntime);\n\t\t\t\tconst serviceMap = new Map();\n\t\t\t\tserviceMap.set(\"id1\", async (r) => service1);\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler(serviceMap);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 200, \"Returned 200 Status Code\");\n\t\t\t\tassert(response?.value === service1, \"Returned expected service\");\n\t\t\t});\n\n\t\t\tit(\"Same service should be returned twice with two calls\", async () => {\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n\t\t\t\tconst response1 = await requestHandler(requestParser, {} as IContainerRuntime);\n\t\t\t\tconst response2 = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response1?.value === response2?.value, \"Returned same service twice\");\n\t\t\t});\n\n\t\t\tit(\"Correct service should be returned with multiple services\", async () => {\n\t\t\t\tconst service2 = new ContainerServiceMock({} as IContainerRuntime);\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id2\", async (r) => service2],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id2` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 200, \"Returned 200 Status Code\");\n\t\t\t\tassert(response?.value === service2, \"Returned expected service\");\n\t\t\t});\n\n\t\t\tit(\"Last registered service should be returned with multiple services of the same name\", async () => {\n\t\t\t\tconst service1 = new ContainerServiceMock({} as IContainerRuntime);\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id1\", async (r) => new ContainerServiceMock(r)],\n\t\t\t\t\t[\"id1\", async (r) => service1],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({ url: `/${serviceRoutePathRoot}/id1` });\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 200, \"Returned 200 Status Code\");\n\t\t\t\tassert(response?.value === service1, \"Returned expected service\");\n\t\t\t});\n\n\t\t\tit(\"Sub-route should be persisted through\", async () => {\n\t\t\t\tconst service1 = new ContainerServiceMock({} as IContainerRuntime);\n\t\t\t\tconst requestHandler = generateContainerServicesRequestHandler([\n\t\t\t\t\t[\"id1\", async (r) => service1],\n\t\t\t\t]);\n\t\t\t\tconst requestParser = RequestParser.create({\n\t\t\t\t\turl: `/${serviceRoutePathRoot}/id1/sub1`,\n\t\t\t\t});\n\n\t\t\t\tconst response = await requestHandler(requestParser, {} as IContainerRuntime);\n\n\t\t\t\tassert(response, \"Response returned\");\n\t\t\t\tassert(response?.status === 200, \"Returned 200 Status Code\");\n\t\t\t\tassert(response?.value === service1, \"Returned expected service\");\n\t\t\t\tassert(\n\t\t\t\t\t(response?.value as ContainerServiceMock).route === \"/sub1\",\n\t\t\t\t\t\"sub-route persisted\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -10,7 +10,9 @@ const runtime_utils_1 = require("@fluidframework/runtime-utils");
10
10
  const request_handler_1 = require("@fluidframework/request-handler");
11
11
  const request_handlers_1 = require("../request-handlers");
12
12
  class MockRuntime {
13
- get IFluidHandleContext() { return this; }
13
+ get IFluidHandleContext() {
14
+ return this;
15
+ }
14
16
  async getRootDataStore(id, wait) {
15
17
  if (id === "objectId") {
16
18
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"defaultRoute.spec.js","sourceRoot":"","sources":["../../src/test/defaultRoute.spec.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\nimport { strict as assert } from \"assert\";\nimport { RequestParser, create404Response } from \"@fluidframework/runtime-utils\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidDataStoreChannel } from \"@fluidframework/runtime-definitions\";\nimport {\n IRequest,\n IResponse,\n IFluidRouter,\n} from \"@fluidframework/core-interfaces\";\nimport { createFluidObjectResponse } from \"@fluidframework/request-handler\";\nimport { defaultRouteRequestHandler } from \"../request-handlers\";\n\nclass MockRuntime {\n public get IFluidHandleContext() { return this; }\n\n public async getRootDataStore(id, wait): Promise<IFluidRouter> {\n if (id === \"objectId\") {\n return {\n request: async (r) => {\n if (r.url === \"/\" || r.url === \"/route\") {\n return createFluidObjectResponse({ route: r.url });\n }\n return create404Response(r);\n },\n } as IFluidDataStoreChannel;\n }\n\n assert(wait !== true);\n throw new Error(\"No data store\");\n }\n\n protected async resolveHandle(request: IRequest) {\n const requestParser = RequestParser.create(request);\n\n if (requestParser.pathParts.length > 0) {\n const wait =\n typeof request.headers?.wait === \"boolean\" ? request.headers.wait : undefined;\n\n const dataStore = await this.getRootDataStore(requestParser.pathParts[0], wait);\n const subRequest = requestParser.createSubRequest(1);\n return dataStore.request(subRequest);\n }\n return create404Response(request);\n }\n}\n\nasync function assertRejected(p: Promise<IResponse | undefined>) {\n try {\n const res = await p;\n assert(res === undefined || res.status === 404, \"not rejected\");\n } catch (err) { }\n}\n\ndescribe(\"defaultRouteRequestHandler\", () => {\n const runtime = new MockRuntime() as any as IContainerRuntime;\n\n it(\"Data store request with default ID\", async () => {\n const handler = defaultRouteRequestHandler(\"objectId\");\n\n const requestParser = RequestParser.create({ url: \"\", headers: {} });\n const response = await handler(requestParser, runtime);\n assert(response);\n assert.equal(response.status, 200);\n assert.equal(response.value.route, \"/\");\n\n const requestParser2 = RequestParser.create({ url: \"/\", headers: {} });\n const response2 = await handler(requestParser2, runtime);\n assert(response2);\n assert.equal(response2.status, 200);\n assert.equal(response.value.route, \"/\");\n });\n\n it(\"Data store request with non-existing default ID\", async () => {\n const handler = defaultRouteRequestHandler(\"foobar\");\n\n const requestParser = RequestParser.create({ url: \"\", headers: { wait: true } });\n const responseP = handler(requestParser, runtime);\n await assertRejected(responseP);\n\n const requestParser2 = RequestParser.create({ url: \"/\", headers: { wait: true } });\n const responseP2 = handler(requestParser2, runtime);\n await assertRejected(responseP2);\n });\n});\n"]}
1
+ {"version":3,"file":"defaultRoute.spec.js","sourceRoot":"","sources":["../../src/test/defaultRoute.spec.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/* eslint-disable @typescript-eslint/consistent-type-assertions */\n\nimport { strict as assert } from \"assert\";\nimport { RequestParser, create404Response } from \"@fluidframework/runtime-utils\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { IFluidDataStoreChannel } from \"@fluidframework/runtime-definitions\";\nimport { IRequest, IResponse, IFluidRouter } from \"@fluidframework/core-interfaces\";\nimport { createFluidObjectResponse } from \"@fluidframework/request-handler\";\nimport { defaultRouteRequestHandler } from \"../request-handlers\";\n\nclass MockRuntime {\n\tpublic get IFluidHandleContext() {\n\t\treturn this;\n\t}\n\n\tpublic async getRootDataStore(id, wait): Promise<IFluidRouter> {\n\t\tif (id === \"objectId\") {\n\t\t\treturn {\n\t\t\t\trequest: async (r) => {\n\t\t\t\t\tif (r.url === \"/\" || r.url === \"/route\") {\n\t\t\t\t\t\treturn createFluidObjectResponse({ route: r.url });\n\t\t\t\t\t}\n\t\t\t\t\treturn create404Response(r);\n\t\t\t\t},\n\t\t\t} as IFluidDataStoreChannel;\n\t\t}\n\n\t\tassert(wait !== true);\n\t\tthrow new Error(\"No data store\");\n\t}\n\n\tprotected async resolveHandle(request: IRequest) {\n\t\tconst requestParser = RequestParser.create(request);\n\n\t\tif (requestParser.pathParts.length > 0) {\n\t\t\tconst wait =\n\t\t\t\ttypeof request.headers?.wait === \"boolean\" ? request.headers.wait : undefined;\n\n\t\t\tconst dataStore = await this.getRootDataStore(requestParser.pathParts[0], wait);\n\t\t\tconst subRequest = requestParser.createSubRequest(1);\n\t\t\treturn dataStore.request(subRequest);\n\t\t}\n\t\treturn create404Response(request);\n\t}\n}\n\nasync function assertRejected(p: Promise<IResponse | undefined>) {\n\ttry {\n\t\tconst res = await p;\n\t\tassert(res === undefined || res.status === 404, \"not rejected\");\n\t} catch (err) {}\n}\n\ndescribe(\"defaultRouteRequestHandler\", () => {\n\tconst runtime = new MockRuntime() as any as IContainerRuntime;\n\n\tit(\"Data store request with default ID\", async () => {\n\t\tconst handler = defaultRouteRequestHandler(\"objectId\");\n\n\t\tconst requestParser = RequestParser.create({ url: \"\", headers: {} });\n\t\tconst response = await handler(requestParser, runtime);\n\t\tassert(response);\n\t\tassert.equal(response.status, 200);\n\t\tassert.equal(response.value.route, \"/\");\n\n\t\tconst requestParser2 = RequestParser.create({ url: \"/\", headers: {} });\n\t\tconst response2 = await handler(requestParser2, runtime);\n\t\tassert(response2);\n\t\tassert.equal(response2.status, 200);\n\t\tassert.equal(response.value.route, \"/\");\n\t});\n\n\tit(\"Data store request with non-existing default ID\", async () => {\n\t\tconst handler = defaultRouteRequestHandler(\"foobar\");\n\n\t\tconst requestParser = RequestParser.create({ url: \"\", headers: { wait: true } });\n\t\tconst responseP = handler(requestParser, runtime);\n\t\tawait assertRejected(responseP);\n\n\t\tconst requestParser2 = RequestParser.create({ url: \"/\", headers: { wait: true } });\n\t\tconst responseP2 = handler(requestParser2, runtime);\n\t\tawait assertRejected(responseP2);\n\t});\n});\n"]}