@fluidframework/runtime-utils 0.59.2000-63294 → 0.59.3000-66610

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 (40) hide show
  1. package/dist/dataStoreHelpers.d.ts.map +1 -1
  2. package/dist/dataStoreHelpers.js +5 -5
  3. package/dist/dataStoreHelpers.js.map +1 -1
  4. package/dist/objectstoragepartition.js +1 -1
  5. package/dist/objectstoragepartition.js.map +1 -1
  6. package/dist/packageVersion.d.ts +1 -1
  7. package/dist/packageVersion.js +1 -1
  8. package/dist/packageVersion.js.map +1 -1
  9. package/dist/requestParser.js.map +1 -1
  10. package/dist/summarizerNode/summarizerNode.d.ts.map +1 -1
  11. package/dist/summarizerNode/summarizerNode.js +27 -27
  12. package/dist/summarizerNode/summarizerNode.js.map +1 -1
  13. package/dist/summarizerNode/summarizerNodeUtils.js +3 -3
  14. package/dist/summarizerNode/summarizerNodeUtils.js.map +1 -1
  15. package/dist/summarizerNode/summarizerNodeWithGc.js +9 -9
  16. package/dist/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  17. package/dist/summaryUtils.d.ts.map +1 -1
  18. package/dist/summaryUtils.js +4 -4
  19. package/dist/summaryUtils.js.map +1 -1
  20. package/lib/dataStoreHelpers.d.ts.map +1 -1
  21. package/lib/dataStoreHelpers.js.map +1 -1
  22. package/lib/packageVersion.d.ts +1 -1
  23. package/lib/packageVersion.js +1 -1
  24. package/lib/packageVersion.js.map +1 -1
  25. package/lib/requestParser.js.map +1 -1
  26. package/lib/summarizerNode/summarizerNode.d.ts.map +1 -1
  27. package/lib/summarizerNode/summarizerNode.js.map +1 -1
  28. package/lib/summarizerNode/summarizerNodeUtils.js +1 -1
  29. package/lib/summarizerNode/summarizerNodeUtils.js.map +1 -1
  30. package/lib/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  31. package/lib/summaryUtils.d.ts.map +1 -1
  32. package/lib/summaryUtils.js.map +1 -1
  33. package/package.json +13 -12
  34. package/src/dataStoreHelpers.ts +1 -2
  35. package/src/packageVersion.ts +1 -1
  36. package/src/requestParser.ts +1 -1
  37. package/src/summarizerNode/summarizerNode.ts +2 -2
  38. package/src/summarizerNode/summarizerNodeUtils.ts +13 -13
  39. package/src/summarizerNode/summarizerNodeWithGc.ts +4 -4
  40. package/src/summaryUtils.ts +2 -3
@@ -1 +1 @@
1
- {"version":3,"file":"dataStoreHelpers.d.ts","sourceRoot":"","sources":["../src/dataStoreHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EACjC,MAAM,qCAAqC,CAAC;AAU7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAqBvD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,CAYjF;AAED,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,WAAW,EACpD,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAU5D;AAED,eAAO,MAAM,iBAAiB,YAAa,QAAQ,cAAmD,CAAC;AAEvG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,CAc/F;AAED,oBAAY,OAAO,GAAG,sBAAsB,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AAEvF,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAChC,sBAAsB,GAAG,uBAAuB,CAStD"}
1
+ {"version":3,"file":"dataStoreHelpers.d.ts","sourceRoot":"","sources":["../src/dataStoreHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EACjC,MAAM,qCAAqC,CAAC;AAU7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,CAqBvD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,CAYjF;AAED,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,WAAW,EACpD,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAU5D;AAED,eAAO,MAAM,iBAAiB,YAAa,QAAQ,cAAmD,CAAC;AAEvG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,CAc/F;AAED,oBAAY,OAAO,GAAG,sBAAsB,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;AAEvF,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAChC,sBAAsB,GAAG,uBAAuB,CAQtD"}
@@ -19,7 +19,7 @@ function exceptionToResponse(err) {
19
19
  };
20
20
  }
21
21
  // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it
22
- const errWithStack = telemetry_utils_1.generateErrorWithStack();
22
+ const errWithStack = (0, telemetry_utils_1.generateErrorWithStack)();
23
23
  return {
24
24
  mimeType: "text/plain",
25
25
  status,
@@ -30,7 +30,7 @@ function exceptionToResponse(err) {
30
30
  exports.exceptionToResponse = exceptionToResponse;
31
31
  function responseToException(response, request) {
32
32
  const message = response.value;
33
- const errWithStack = telemetry_utils_1.generateErrorWithStack();
33
+ const errWithStack = (0, telemetry_utils_1.generateErrorWithStack)();
34
34
  const responseErr = {
35
35
  errorFromRequestFluidObject: true,
36
36
  message,
@@ -47,7 +47,7 @@ async function requestFluidObject(router, url) {
47
47
  if (response.status !== 200 || response.mimeType !== "fluid/object") {
48
48
  throw responseToException(response, request);
49
49
  }
50
- common_utils_1.assert(response.value, 0x19a /* "Invalid response value for Fluid object request" */);
50
+ (0, common_utils_1.assert)(response.value, 0x19a /* "Invalid response value for Fluid object request" */);
51
51
  return response.value;
52
52
  }
53
53
  exports.requestFluidObject = requestFluidObject;
@@ -55,11 +55,11 @@ const create404Response = (request) => createResponseError(404, "not found", req
55
55
  exports.create404Response = create404Response;
56
56
  function createResponseError(status, value, request) {
57
57
  var _a;
58
- common_utils_1.assert(status !== 200, 0x19b /* "Cannot not create response error on 200 status" */);
58
+ (0, common_utils_1.assert)(status !== 200, 0x19b /* "Cannot not create response error on 200 status" */);
59
59
  // Omit query string which could contain personal data (aka "PII")
60
60
  const urlNoQuery = (_a = request.url) === null || _a === void 0 ? void 0 : _a.split("?")[0];
61
61
  // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it
62
- const errWithStack = telemetry_utils_1.generateErrorWithStack();
62
+ const errWithStack = (0, telemetry_utils_1.generateErrorWithStack)();
63
63
  return {
64
64
  mimeType: "text/plain",
65
65
  status,
@@ -1 +1 @@
1
- {"version":3,"file":"dataStoreHelpers.js","sourceRoot":"","sources":["../src/dataStoreHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n FluidObject,\n IFluidRouter,\n IRequest,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IFluidDataStoreFactory,\n IFluidDataStoreRegistry,\n IProvideFluidDataStoreRegistry,\n} from \"@fluidframework/runtime-definitions\";\nimport { generateErrorWithStack } from \"@fluidframework/telemetry-utils\";\n\ninterface IResponseException extends Error {\n errorFromRequestFluidObject: true;\n message: string;\n code: number;\n stack?: string;\n}\n\nexport function exceptionToResponse(err: any): IResponse {\n const status = 500;\n if (err !== null && typeof err === \"object\" && err.errorFromRequestFluidObject === true) {\n const responseErr: IResponseException = err;\n return {\n mimeType: \"text/plain\",\n status: responseErr.code,\n value: responseErr.message,\n get stack() { return responseErr.stack; },\n };\n }\n\n // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it\n const errWithStack = generateErrorWithStack();\n\n return {\n mimeType: \"text/plain\",\n status,\n value: `${err}`,\n get stack() { return ((err?.stack) as (string | undefined)) ?? errWithStack.stack; },\n };\n}\n\nexport function responseToException(response: IResponse, request: IRequest): Error {\n const message = response.value;\n const errWithStack = generateErrorWithStack();\n const responseErr: Error & IResponseException = {\n errorFromRequestFluidObject: true,\n message,\n name: \"Error\",\n code: response.status,\n get stack() { return response.stack ?? errWithStack.stack; },\n };\n\n return responseErr;\n}\n\nexport async function requestFluidObject<T = FluidObject>(\n router: IFluidRouter, url: string | IRequest): Promise<T> {\n const request = typeof url === \"string\" ? { url } : url;\n const response = await router.request(request);\n\n if (response.status !== 200 || response.mimeType !== \"fluid/object\") {\n throw responseToException(response, request);\n }\n\n assert(response.value, 0x19a /* \"Invalid response value for Fluid object request\" */);\n return response.value as T;\n}\n\nexport const create404Response = (request: IRequest) => createResponseError(404, \"not found\", request);\n\nexport function createResponseError(status: number, value: string, request: IRequest): IResponse {\n assert(status !== 200, 0x19b /* \"Cannot not create response error on 200 status\" */);\n // Omit query string which could contain personal data (aka \"PII\")\n const urlNoQuery = request.url?.split(\"?\")[0];\n\n // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it\n const errWithStack = generateErrorWithStack();\n\n return {\n mimeType: \"text/plain\",\n status,\n value: urlNoQuery === undefined ? value : `${value}: ${urlNoQuery}`,\n get stack() { return errWithStack.stack; },\n };\n}\n\nexport type Factory = IFluidDataStoreFactory & Partial<IProvideFluidDataStoreRegistry>;\n\nexport function createDataStoreFactory(\n type: string,\n factory: Factory | Promise<Factory>,\n ): IFluidDataStoreFactory & IFluidDataStoreRegistry\n{\n return {\n type,\n get IFluidDataStoreFactory() { return this; },\n get IFluidDataStoreRegistry() { return this; },\n instantiateDataStore: async (context, existing) => (await factory).instantiateDataStore(context, existing),\n get: async (name: string) => (await factory).IFluidDataStoreRegistry?.get(name),\n };\n}\n"]}
1
+ {"version":3,"file":"dataStoreHelpers.js","sourceRoot":"","sources":["../src/dataStoreHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n FluidObject,\n IFluidRouter,\n IRequest,\n IResponse,\n} from \"@fluidframework/core-interfaces\";\nimport {\n IFluidDataStoreFactory,\n IFluidDataStoreRegistry,\n IProvideFluidDataStoreRegistry,\n} from \"@fluidframework/runtime-definitions\";\nimport { generateErrorWithStack } from \"@fluidframework/telemetry-utils\";\n\ninterface IResponseException extends Error {\n errorFromRequestFluidObject: true;\n message: string;\n code: number;\n stack?: string;\n}\n\nexport function exceptionToResponse(err: any): IResponse {\n const status = 500;\n if (err !== null && typeof err === \"object\" && err.errorFromRequestFluidObject === true) {\n const responseErr: IResponseException = err;\n return {\n mimeType: \"text/plain\",\n status: responseErr.code,\n value: responseErr.message,\n get stack() { return responseErr.stack; },\n };\n }\n\n // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it\n const errWithStack = generateErrorWithStack();\n\n return {\n mimeType: \"text/plain\",\n status,\n value: `${err}`,\n get stack() { return ((err?.stack) as (string | undefined)) ?? errWithStack.stack; },\n };\n}\n\nexport function responseToException(response: IResponse, request: IRequest): Error {\n const message = response.value;\n const errWithStack = generateErrorWithStack();\n const responseErr: Error & IResponseException = {\n errorFromRequestFluidObject: true,\n message,\n name: \"Error\",\n code: response.status,\n get stack() { return response.stack ?? errWithStack.stack; },\n };\n\n return responseErr;\n}\n\nexport async function requestFluidObject<T = FluidObject>(\n router: IFluidRouter, url: string | IRequest): Promise<T> {\n const request = typeof url === \"string\" ? { url } : url;\n const response = await router.request(request);\n\n if (response.status !== 200 || response.mimeType !== \"fluid/object\") {\n throw responseToException(response, request);\n }\n\n assert(response.value, 0x19a /* \"Invalid response value for Fluid object request\" */);\n return response.value as T;\n}\n\nexport const create404Response = (request: IRequest) => createResponseError(404, \"not found\", request);\n\nexport function createResponseError(status: number, value: string, request: IRequest): IResponse {\n assert(status !== 200, 0x19b /* \"Cannot not create response error on 200 status\" */);\n // Omit query string which could contain personal data (aka \"PII\")\n const urlNoQuery = request.url?.split(\"?\")[0];\n\n // Capture error objects, not stack itself, as stack retrieval is very expensive operation, so we delay it\n const errWithStack = generateErrorWithStack();\n\n return {\n mimeType: \"text/plain\",\n status,\n value: urlNoQuery === undefined ? value : `${value}: ${urlNoQuery}`,\n get stack() { return errWithStack.stack; },\n };\n}\n\nexport type Factory = IFluidDataStoreFactory & Partial<IProvideFluidDataStoreRegistry>;\n\nexport function createDataStoreFactory(\n type: string,\n factory: Factory | Promise<Factory>,\n ): IFluidDataStoreFactory & IFluidDataStoreRegistry {\n return {\n type,\n get IFluidDataStoreFactory() { return this; },\n get IFluidDataStoreRegistry() { return this; },\n instantiateDataStore: async (context, existing) => (await factory).instantiateDataStore(context, existing),\n get: async (name: string) => (await factory).IFluidDataStoreRegistry?.get(name),\n };\n}\n"]}
@@ -14,7 +14,7 @@ class ObjectStoragePartition {
14
14
  this.storage = storage;
15
15
  this.path = path;
16
16
  // `path` must not include the trailing separator.
17
- common_utils_1.assert(!path.endsWith("/"), 0x19c /* "storage service path has trailing separator" */);
17
+ (0, common_utils_1.assert)(!path.endsWith("/"), 0x19c /* "storage service path has trailing separator" */);
18
18
  }
19
19
  async readBlob(path) {
20
20
  return this.storage.readBlob(`${this.path}/${path}`);
@@ -1 +1 @@
1
- {"version":3,"file":"objectstoragepartition.js","sourceRoot":"","sources":["../src/objectstoragepartition.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAsD;AAGtD;;GAEG;AACH,MAAa,sBAAsB;IAC/B,YAA6B,OAA+B,EAAmB,IAAY;QAA9D,YAAO,GAAP,OAAO,CAAwB;QAAmB,SAAI,GAAJ,IAAI,CAAQ;QACvF,kDAAkD;QAClD,qBAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC3F,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;CACJ;AAjBD,wDAiBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\n\n/**\n * Returns a new IChannelStorageService that resolves the given `path` as root.\n */\nexport class ObjectStoragePartition implements IChannelStorageService {\n constructor(private readonly storage: IChannelStorageService, private readonly path: string) {\n // `path` must not include the trailing separator.\n assert(!path.endsWith(\"/\"), 0x19c /* \"storage service path has trailing separator\" */);\n }\n\n public async readBlob(path: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(`${this.path}/${path}`);\n }\n\n public async contains(path: string): Promise<boolean> {\n return this.storage.contains(`${this.path}/${path}`);\n }\n\n public async list(path: string): Promise<string[]> {\n return this.storage.list(`${this.path}/${path}`);\n }\n}\n"]}
1
+ {"version":3,"file":"objectstoragepartition.js","sourceRoot":"","sources":["../src/objectstoragepartition.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAsD;AAGtD;;GAEG;AACH,MAAa,sBAAsB;IAC/B,YAA6B,OAA+B,EAAmB,IAAY;QAA9D,YAAO,GAAP,OAAO,CAAwB;QAAmB,SAAI,GAAJ,IAAI,CAAQ;QACvF,kDAAkD;QAClD,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC3F,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;CACJ;AAjBD,wDAiBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IChannelStorageService } from \"@fluidframework/datastore-definitions\";\n\n/**\n * Returns a new IChannelStorageService that resolves the given `path` as root.\n */\nexport class ObjectStoragePartition implements IChannelStorageService {\n constructor(private readonly storage: IChannelStorageService, private readonly path: string) {\n // `path` must not include the trailing separator.\n assert(!path.endsWith(\"/\"), 0x19c /* \"storage service path has trailing separator\" */);\n }\n\n public async readBlob(path: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(`${this.path}/${path}`);\n }\n\n public async contains(path: string): Promise<boolean> {\n return this.storage.contains(`${this.path}/${path}`);\n }\n\n public async list(path: string): Promise<string[]> {\n return this.storage.list(`${this.path}/${path}`);\n }\n}\n"]}
@@ -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/runtime-utils";
8
- export declare const pkgVersion = "0.59.2000-63294";
8
+ export declare const pkgVersion = "0.59.3000-66610";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -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/runtime-utils";
11
- exports.pkgVersion = "0.59.2000-63294";
11
+ exports.pkgVersion = "0.59.3000-66610";
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,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,iBAAiB,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/runtime-utils\";\nexport const pkgVersion = \"0.59.2000-63294\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,iBAAiB,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/runtime-utils\";\nexport const pkgVersion = \"0.59.3000-66610\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"requestParser.js","sourceRoot":"","sources":["../src/requestParser.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, IRequestHeader } from \"@fluidframework/core-interfaces\";\n\n/**\n * The Request Parser takes an IRequest provides parsing and sub request creation\n */\nexport class RequestParser implements IRequest {\n /**\n * Splits the path of the url and decodes each path part\n * @param url - the url to get path parts of\n */\n public static getPathParts(url: string): readonly string[] {\n const queryStartIndex = url.indexOf(\"?\");\n return url\n .substring(0, queryStartIndex < 0 ? url.length : queryStartIndex)\n .split(\"/\")\n .reduce<string[]>(\n (pv, cv) => {\n if (cv !== undefined && cv.length > 0) {\n pv.push(decodeURIComponent(cv));\n }\n return pv;\n },\n []);\n }\n\n private requestPathParts: readonly string[] | undefined;\n public readonly query: string;\n\n public static create(request: Readonly<IRequest>) {\n // Perf optimizations.\n if (request instanceof RequestParser) {\n return request;\n }\n return new RequestParser(request);\n }\n\n protected constructor(private readonly request: Readonly<IRequest>) {\n const queryStartIndex = this.request.url.indexOf(\"?\");\n if (queryStartIndex >= 0) {\n this.query = this.request.url.substring(queryStartIndex);\n } else {\n this.query = \"\";\n }\n }\n\n public get url(): string {\n return this.request.url;\n }\n\n public get headers(): IRequestHeader | undefined {\n return this.request.headers;\n }\n\n /**\n * Returns the decoded path parts of the request's url\n */\n public get pathParts(): readonly string[] {\n if (this.requestPathParts === undefined) {\n this.requestPathParts = RequestParser.getPathParts(this.url);\n }\n return this.requestPathParts;\n }\n\n /**\n * Returns true if it's a terminating path, i.e. no more elements after `elements` entries and empty query.\n * @param elements - number of elements in path\n */\n public isLeaf(elements: number) {\n return this.query === \"\" && this.pathParts.length === elements;\n }\n\n /**\n * Creates a sub request starting at a specific path part of this request's url\n * The sub request url always has a leading slash, and always include query params if original url has any\n * e.g. original url is /a/b/?queryParams, createSubRequest(0) is /a/b/?queryParams\n * createSubRequest(1) is /b/?queryParams\n * createSubRequest(2) is /?queryParams\n * createSubRequest(n) where n is bigger than parts length, e.g. 2, or n is less than 0 will throw an exception\n *\n * note: query params are not counted towards path parts.\n *\n * @param startingPathIndex - The index of the first path part of the sub request\n */\n public createSubRequest(startingPathIndex: number): IRequest {\n const pathLen = this.pathParts.length;\n if (startingPathIndex < 0 || startingPathIndex > pathLen) {\n throw new Error(\"incorrect sub-request\");\n }\n if (startingPathIndex === pathLen && this.url.includes(\"?\")) {\n return {\n url:`/${this.query}`,\n headers: this.headers,\n };\n }\n const path = `/${this.pathParts.slice(startingPathIndex).join(\"/\")}`;\n return {\n url: this.query === \"\" ? path : `${path}/${this.query}`,\n headers: this.headers,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"requestParser.js","sourceRoot":"","sources":["../src/requestParser.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACH,MAAa,aAAa;IA+BtB,YAAuC,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,eAAe,IAAI,CAAC,EAAE;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;SAC5D;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;SACnB;IACL,CAAC;IArCD;;;OAGG;IACI,MAAM,CAAC,YAAY,CAAC,GAAW;QAClC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,GAAG;aACL,SAAS,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;aAChE,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CACH,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;YACP,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;aACnC;YACD,OAAO,EAAE,CAAC;QACd,CAAC,EACD,EAAE,CAAC,CAAC;IAChB,CAAC;IAKM,MAAM,CAAC,MAAM,CAAC,OAA2B;QAC5C,sBAAsB;QACtB,IAAI,OAAO,YAAY,aAAa,EAAE;YAClC,OAAO,OAAO,CAAC;SAClB;QACD,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAWD,IAAW,GAAG;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5B,CAAC;IAED,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAW,SAAS;QAChB,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAChE;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC;IACnE,CAAC;IAED;;;;;;;;;;;OAWG;IACI,gBAAgB,CAAC,iBAAyB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACtC,IAAI,iBAAiB,GAAG,CAAC,IAAI,iBAAiB,GAAG,OAAO,EAAE;YACtD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC5C;QACD,IAAI,iBAAiB,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACzD,OAAO;gBACH,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC;SACL;QACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,OAAO;YACH,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YACvD,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC;IACN,CAAC;CACJ;AA/FD,sCA+FC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { IRequest, IRequestHeader } from \"@fluidframework/core-interfaces\";\n\n/**\n * The Request Parser takes an IRequest provides parsing and sub request creation\n */\nexport class RequestParser implements IRequest {\n /**\n * Splits the path of the url and decodes each path part\n * @param url - the url to get path parts of\n */\n public static getPathParts(url: string): readonly string[] {\n const queryStartIndex = url.indexOf(\"?\");\n return url\n .substring(0, queryStartIndex < 0 ? url.length : queryStartIndex)\n .split(\"/\")\n .reduce<string[]>(\n (pv, cv) => {\n if (cv !== undefined && cv.length > 0) {\n pv.push(decodeURIComponent(cv));\n }\n return pv;\n },\n []);\n }\n\n private requestPathParts: readonly string[] | undefined;\n public readonly query: string;\n\n public static create(request: Readonly<IRequest>) {\n // Perf optimizations.\n if (request instanceof RequestParser) {\n return request;\n }\n return new RequestParser(request);\n }\n\n protected constructor(private readonly request: Readonly<IRequest>) {\n const queryStartIndex = this.request.url.indexOf(\"?\");\n if (queryStartIndex >= 0) {\n this.query = this.request.url.substring(queryStartIndex);\n } else {\n this.query = \"\";\n }\n }\n\n public get url(): string {\n return this.request.url;\n }\n\n public get headers(): IRequestHeader | undefined {\n return this.request.headers;\n }\n\n /**\n * Returns the decoded path parts of the request's url\n */\n public get pathParts(): readonly string[] {\n if (this.requestPathParts === undefined) {\n this.requestPathParts = RequestParser.getPathParts(this.url);\n }\n return this.requestPathParts;\n }\n\n /**\n * Returns true if it's a terminating path, i.e. no more elements after `elements` entries and empty query.\n * @param elements - number of elements in path\n */\n public isLeaf(elements: number) {\n return this.query === \"\" && this.pathParts.length === elements;\n }\n\n /**\n * Creates a sub request starting at a specific path part of this request's url\n * The sub request url always has a leading slash, and always include query params if original url has any\n * e.g. original url is /a/b/?queryParams, createSubRequest(0) is /a/b/?queryParams\n * createSubRequest(1) is /b/?queryParams\n * createSubRequest(2) is /?queryParams\n * createSubRequest(n) where n is bigger than parts length, e.g. 2, or n is less than 0 will throw an exception\n *\n * note: query params are not counted towards path parts.\n *\n * @param startingPathIndex - The index of the first path part of the sub request\n */\n public createSubRequest(startingPathIndex: number): IRequest {\n const pathLen = this.pathParts.length;\n if (startingPathIndex < 0 || startingPathIndex > pathLen) {\n throw new Error(\"incorrect sub-request\");\n }\n if (startingPathIndex === pathLen && this.url.includes(\"?\")) {\n return {\n url: `/${this.query}`,\n headers: this.headers,\n };\n }\n const path = `/${this.pathParts.slice(startingPathIndex).join(\"/\")}`;\n return {\n url: this.query === \"\" ? path : `${path}/${this.query}`,\n headers: this.headers,\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerNode.d.ts","sourceRoot":"","sources":["../../src/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAEhB,8BAA8B,EAEjC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,yBAAyB,EAEzB,aAAa,EAEhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAIH,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,2BAA2B,EAG3B,oBAAoB,EACpB,WAAW,EACd,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,mBAAoB,SAAQ,eAAe,EAAE,2BAA2B;CAAG;AAE5F;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IAkalD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,gBAAgB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,OAAO,CAAC,qBAAqB;IAC7B,8CAA8C;IAC9C,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAChC,SAAS,CAAC,gBAAgB,CAAC;IAxa/B;;;OAGG;IACH,IAAW,uBAAuB,WAEjC;IAED,SAAS,CAAC,QAAQ,CAAC,QAAQ,8BAAqC;IAChE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,2BAAkC;IACrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,0BAA0B,CAAqB;IACvD,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAAS;IAE1B,YAAY,CAAC,uBAAuB,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB;IAavE,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2EpE;;OAEG;IACI,eAAe,CAAC,cAAc,EAAE,MAAM;IAI7C;;OAEG;IACH,SAAS,CAAC,mBAAmB,CACzB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,mBAAmB,EAAE,OAAO;IA4DzB,YAAY;IAUnB;;;;;;;;;;OAUG;IACU,oBAAoB,CAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,EACzC,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,gBAAgB,GAC1C,OAAO,CAAC,oBAAoB,CAAC;IA2BhC,SAAS,CAAC,+BAA+B,CACrC,cAAc,EAAE,MAAM,EACtB,uBAAuB,EAAE,MAAM,GAChC,IAAI;cA8BS,gCAAgC,CAC5C,uBAAuB,EAAE,MAAM,EAC/B,YAAY,EAAE,aAAa,EAC3B,QAAQ,EAAE,WAAW,GAAG,SAAS,EACjC,SAAS,EAAE,WAAW,EACtB,uBAAuB,EAAE,gBAAgB,EACzC,gBAAgB,EAAE,gBAAgB,GACnC,OAAO,CAAC,IAAI,CAAC;IA4ChB,OAAO,CAAC,wBAAwB;IAgBzB,kCAAkC,CAAC,QAAQ,EAAE,aAAa;IASpD,eAAe,CACxB,QAAQ,EAAE,aAAa,EACvB,gBAAgB,EAAE,gBAAgB,GACnC,OAAO,CAAC;QAAE,WAAW,EAAE,aAAa,CAAC;QAAC,cAAc,EAAE,yBAAyB,EAAE,CAAA;KAAE,CAAC;IA6BhF,YAAY,CAAC,EAAE,EAAE,yBAAyB,GAAG,IAAI;IAajD,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAM/C;;;;OAIG;IACH,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B,IAAW,aAAa,IAAI,QAAQ,CAAC,WAAW,CAAC,GAAG,SAAS,CAE5D;IAED,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC;;;;OAIG;IACH,OAAO,CAAC,sBAAsB,CAAS;IAEvC;;;OAGG;gBAEoB,aAAa,EAAE,gBAAgB,EACjC,mBAAmB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,wBAAwB,CAAC,EAC9F,MAAM,EAAE,qBAAqB,EACrB,qBAAqB,EAAE,MAAM;IACrC,8CAA8C;IACtC,cAAc,CAAC,yBAAa,EACnB,cAAc,CAAC,6BAAiB,EACvC,gBAAgB,CAAC,8BAAkB;IAU1C,WAAW;IACd,yBAAyB;IACzB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,wBAAwB,CAAC;IAC7E,2CAA2C;IAC3C,EAAE,EAAE,MAAM;IACV;;;;OAIG;IACH,WAAW,EAAE,8BAA8B,EAC3C,MAAM,GAAE,qBAA0B,GACnC,eAAe;IAsBX,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIxD;;;;;OAKG;IACH,SAAS,CAAC,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,8BAA8B,GAAG,mBAAmB;IAmFhH;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc;IAQrD;;OAEG;IACH,SAAS,CAAC,oBAAoB,IAAI,OAAO;CAG5C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,WACzB,gBAAgB,kCACQ,OAAO,KAAK,QAAQ,wBAAwB,CAAC,wBACvD,MAAM,2BACH,MAAM,GAAG,SAAS,WACnC,qBAAqB,KAC9B,mBAME,CAAC"}
1
+ {"version":3,"file":"summarizerNode.d.ts","sourceRoot":"","sources":["../../src/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"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"}
@@ -58,8 +58,8 @@ class SummarizerNode {
58
58
  return (_b = (_a = this._latestSummary) === null || _a === void 0 ? void 0 : _a.referenceSequenceNumber) !== null && _b !== void 0 ? _b : 0;
59
59
  }
60
60
  startSummary(referenceSequenceNumber, summaryLogger) {
61
- common_utils_1.assert(this.wipSummaryLogger === undefined, 0x19f /* "wipSummaryLogger should not be set yet in startSummary" */);
62
- common_utils_1.assert(this.wipReferenceSequenceNumber === undefined, 0x1a0 /* "Already tracking a summary" */);
61
+ (0, common_utils_1.assert)(this.wipSummaryLogger === undefined, 0x19f /* "wipSummaryLogger should not be set yet in startSummary" */);
62
+ (0, common_utils_1.assert)(this.wipReferenceSequenceNumber === undefined, 0x1a0 /* "Already tracking a summary" */);
63
63
  this.wipSummaryLogger = summaryLogger;
64
64
  for (const child of this.children.values()) {
65
65
  child.startSummary(referenceSequenceNumber, this.wipSummaryLogger);
@@ -67,8 +67,8 @@ class SummarizerNode {
67
67
  this.wipReferenceSequenceNumber = referenceSequenceNumber;
68
68
  }
69
69
  async summarize(fullTree) {
70
- common_utils_1.assert(this.isTrackingInProgress(), 0x1a1 /* "summarize should not be called when not tracking the summary" */);
71
- common_utils_1.assert(this.wipSummaryLogger !== undefined, 0x1a2 /* "wipSummaryLogger should have been set in startSummary or ctor" */);
70
+ (0, common_utils_1.assert)(this.isTrackingInProgress(), 0x1a1 /* "summarize should not be called when not tracking the summary" */);
71
+ (0, common_utils_1.assert)(this.wipSummaryLogger !== undefined, 0x1a2 /* "wipSummaryLogger should have been set in startSummary or ctor" */);
72
72
  // Try to reuse the tree if unchanged
73
73
  if (this.canReuseHandle && !fullTree && !this.hasChanged()) {
74
74
  const latestSummary = this._latestSummary;
@@ -78,7 +78,7 @@ class SummarizerNode {
78
78
  additionalPath: latestSummary.additionalPath,
79
79
  };
80
80
  this.wipSkipRecursion = true;
81
- const stats = summaryUtils_1.mergeStats();
81
+ const stats = (0, summaryUtils_1.mergeStats)();
82
82
  stats.handleNodeCount++;
83
83
  return {
84
84
  summary: {
@@ -129,7 +129,7 @@ class SummarizerNode {
129
129
  this.wipSummaryLogger.sendErrorEvent({
130
130
  eventName: "SummarizingWithBasePlusOps",
131
131
  }, error);
132
- const summary = summarizerNodeUtils_1.encodeSummary(encodeParam, this.outstandingOps);
132
+ const summary = (0, summarizerNodeUtils_1.encodeSummary)(encodeParam, this.outstandingOps);
133
133
  this.wipLocalPaths = {
134
134
  localPath,
135
135
  additionalPath: summary.additionalPath,
@@ -148,8 +148,8 @@ class SummarizerNode {
148
148
  * Recursive implementation for completeSummary, with additional internal-only parameters
149
149
  */
150
150
  completeSummaryCore(proposalHandle, parentPath, parentSkipRecursion) {
151
- common_utils_1.assert(this.wipSummaryLogger !== undefined, 0x1a3 /* "wipSummaryLogger should have been set in startSummary or ctor" */);
152
- common_utils_1.assert(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* "Not tracking a summary" */);
151
+ (0, common_utils_1.assert)(this.wipSummaryLogger !== undefined, 0x1a3 /* "wipSummaryLogger should have been set in startSummary or ctor" */);
152
+ (0, common_utils_1.assert)(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* "Not tracking a summary" */);
153
153
  let localPathsToUse = this.wipLocalPaths;
154
154
  if (parentSkipRecursion) {
155
155
  const latestSummary = this._latestSummary;
@@ -179,7 +179,7 @@ class SummarizerNode {
179
179
  // This should come from wipLocalPaths in normal cases, or from the latestSummary
180
180
  // if parentIsFailure or parentIsReused is true.
181
181
  // If there is no latestSummary, clearSummary and return before reaching this code.
182
- common_utils_1.assert(!!localPathsToUse, 0x1a5 /* "Tracked summary local paths not set" */);
182
+ (0, common_utils_1.assert)(!!localPathsToUse, 0x1a5 /* "Tracked summary local paths not set" */);
183
183
  const summary = new summarizerNodeUtils_1.SummaryNode(Object.assign(Object.assign({}, localPathsToUse), { referenceSequenceNumber: this.wipReferenceSequenceNumber, basePath: parentPath }));
184
184
  const fullPathForChildren = summary.fullPathForChildren;
185
185
  for (const child of this.children.values()) {
@@ -234,11 +234,11 @@ class SummarizerNode {
234
234
  const summaryNode = this.pendingSummaries.get(proposalHandle);
235
235
  if (summaryNode === undefined) {
236
236
  // This should only happen if parent skipped recursion AND no prior summary existed.
237
- common_utils_1.assert(this._latestSummary === undefined, 0x1a6 /* "Not found pending summary, but this node has previously completed a summary" */);
237
+ (0, common_utils_1.assert)(this._latestSummary === undefined, 0x1a6 /* "Not found pending summary, but this node has previously completed a summary" */);
238
238
  return;
239
239
  }
240
240
  else {
241
- common_utils_1.assert(referenceSequenceNumber === summaryNode.referenceSequenceNumber,
241
+ (0, common_utils_1.assert)(referenceSequenceNumber === summaryNode.referenceSequenceNumber,
242
242
  // eslint-disable-next-line max-len
243
243
  0x1a7 /* `Pending summary reference sequence number should be consistent: ${summaryNode.referenceSequenceNumber} != ${referenceSequenceNumber}` */);
244
244
  // Clear earlier pending summaries
@@ -257,13 +257,13 @@ class SummarizerNode {
257
257
  return;
258
258
  }
259
259
  this.refreshLatestSummaryCore(referenceSequenceNumber);
260
- const { baseSummary, pathParts } = summarizerNodeUtils_1.decodeSummary(snapshotTree, correlatedSummaryLogger);
260
+ const { baseSummary, pathParts } = (0, summarizerNodeUtils_1.decodeSummary)(snapshotTree, correlatedSummaryLogger);
261
261
  this._latestSummary = new summarizerNodeUtils_1.SummaryNode({
262
262
  referenceSequenceNumber,
263
263
  basePath,
264
264
  localPath,
265
265
  });
266
- const { childrenTree, childrenPathPart } = summarizerNodeUtils_1.parseSummaryForSubtrees(baseSummary);
266
+ const { childrenTree, childrenPathPart } = (0, summarizerNodeUtils_1.parseSummaryForSubtrees)(baseSummary);
267
267
  if (childrenPathPart !== undefined) {
268
268
  pathParts.push(childrenPathPart);
269
269
  }
@@ -296,15 +296,15 @@ class SummarizerNode {
296
296
  loadBaseSummaryWithoutDifferential(snapshot) {
297
297
  // Check base summary to see if it has any additional path parts
298
298
  // separating child SummarizerNodes. Checks for .channels subtrees.
299
- const { childrenPathPart } = summarizerNodeUtils_1.parseSummaryForSubtrees(snapshot);
299
+ const { childrenPathPart } = (0, summarizerNodeUtils_1.parseSummaryForSubtrees)(snapshot);
300
300
  if (childrenPathPart !== undefined && this._latestSummary !== undefined) {
301
301
  this._latestSummary.additionalPath = summarizerNodeUtils_1.EscapedPath.create(childrenPathPart);
302
302
  }
303
303
  }
304
304
  async loadBaseSummary(snapshot, readAndParseBlob) {
305
- const decodedSummary = summarizerNodeUtils_1.decodeSummary(snapshot, this.defaultLogger);
305
+ const decodedSummary = (0, summarizerNodeUtils_1.decodeSummary)(snapshot, this.defaultLogger);
306
306
  const outstandingOps = await decodedSummary.getOutstandingOps(readAndParseBlob);
307
- const { childrenPathPart } = summarizerNodeUtils_1.parseSummaryForSubtrees(decodedSummary.baseSummary);
307
+ const { childrenPathPart } = (0, summarizerNodeUtils_1.parseSummaryForSubtrees)(decodedSummary.baseSummary);
308
308
  if (childrenPathPart !== undefined) {
309
309
  decodedSummary.pathParts.push(childrenPathPart);
310
310
  }
@@ -315,7 +315,7 @@ class SummarizerNode {
315
315
  // This is probably a little excessive; can remove when stable.
316
316
  if (outstandingOps.length > 0) {
317
317
  const newOpsLatestSeq = outstandingOps[outstandingOps.length - 1].sequenceNumber;
318
- common_utils_1.assert(newOpsLatestSeq <= this.trackingSequenceNumber, 0x1a9 /* "When loading base summary, expected outstanding ops <= tracking sequence number" */);
318
+ (0, common_utils_1.assert)(newOpsLatestSeq <= this.trackingSequenceNumber, 0x1a9 /* "When loading base summary, expected outstanding ops <= tracking sequence number" */);
319
319
  }
320
320
  return {
321
321
  baseSummary: decodedSummary.baseSummary,
@@ -325,7 +325,7 @@ class SummarizerNode {
325
325
  recordChange(op) {
326
326
  const lastOp = this.outstandingOps[this.outstandingOps.length - 1];
327
327
  if (lastOp !== undefined) {
328
- common_utils_1.assert(lastOp.sequenceNumber < op.sequenceNumber, 0x1aa /* `Out of order change recorded: ${lastOp.sequenceNumber} > ${op.sequenceNumber}` */);
328
+ (0, common_utils_1.assert)(lastOp.sequenceNumber < op.sequenceNumber, 0x1aa /* `Out of order change recorded: ${lastOp.sequenceNumber} > ${op.sequenceNumber}` */);
329
329
  }
330
330
  this.invalidate(op.sequenceNumber);
331
331
  this.trackingSequenceNumber = op.sequenceNumber;
@@ -358,7 +358,7 @@ class SummarizerNode {
358
358
  * Attach information if it is created from an attach op.
359
359
  */
360
360
  createParam, config = {}) {
361
- common_utils_1.assert(!this.children.has(id), 0x1ab /* "Create SummarizerNode child already exists" */);
361
+ (0, common_utils_1.assert)(!this.children.has(id), 0x1ab /* "Create SummarizerNode child already exists" */);
362
362
  const createDetails = this.getCreateDetailsForChild(id, createParam);
363
363
  const child = new SummarizerNode(this.defaultLogger, summarizeInternalFn, config, createDetails.changeSequenceNumber, createDetails.latestSummary, createDetails.initialSummary, this.wipSummaryLogger);
364
364
  // There may be additional state that has to be updated in this child. For example, if a summary is being
@@ -390,7 +390,7 @@ class SummarizerNode {
390
390
  latestSummary = parentLatestSummary.createForChild(id);
391
391
  }
392
392
  else {
393
- const summary = summaryUtils_1.convertToSummaryTree(createParam.snapshot);
393
+ const summary = (0, summaryUtils_1.convertToSummaryTree)(createParam.snapshot);
394
394
  initialSummary = {
395
395
  sequenceNumber: createParam.sequenceNumber,
396
396
  id,
@@ -402,7 +402,7 @@ class SummarizerNode {
402
402
  }
403
403
  case runtime_definitions_1.CreateSummarizerNodeSource.FromSummary: {
404
404
  if (this.initialSummary === undefined) {
405
- common_utils_1.assert(!!parentLatestSummary, 0x1ac /* "Cannot create child from summary if parent does not have latest summary" */);
405
+ (0, common_utils_1.assert)(!!parentLatestSummary, 0x1ac /* "Cannot create child from summary if parent does not have latest summary" */);
406
406
  }
407
407
  // fallthrough to local
408
408
  }
@@ -411,20 +411,20 @@ class SummarizerNode {
411
411
  if (parentInitialSummary !== undefined) {
412
412
  let childSummary;
413
413
  if (parentInitialSummary.summary !== undefined) {
414
- const { childrenTree } = summarizerNodeUtils_1.parseSummaryTreeForSubtrees(parentInitialSummary.summary.summary);
415
- common_utils_1.assert(childrenTree.type === protocol_definitions_1.SummaryType.Tree, 0x1d6 /* "Parent summary object is not a tree" */);
414
+ const { childrenTree } = (0, summarizerNodeUtils_1.parseSummaryTreeForSubtrees)(parentInitialSummary.summary.summary);
415
+ (0, common_utils_1.assert)(childrenTree.type === protocol_definitions_1.SummaryType.Tree, 0x1d6 /* "Parent summary object is not a tree" */);
416
416
  childSummary = childrenTree.tree[id];
417
417
  }
418
418
  if (createParam.type === runtime_definitions_1.CreateSummarizerNodeSource.FromSummary) {
419
419
  // Locally created would not have differential subtree.
420
- common_utils_1.assert(!!childSummary, 0x1ad /* "Missing child summary tree" */);
420
+ (0, common_utils_1.assert)(!!childSummary, 0x1ad /* "Missing child summary tree" */);
421
421
  }
422
422
  let childSummaryWithStats;
423
423
  if (childSummary !== undefined) {
424
- common_utils_1.assert(childSummary.type === protocol_definitions_1.SummaryType.Tree, 0x1ae /* "Child summary object is not a tree" */);
424
+ (0, common_utils_1.assert)(childSummary.type === protocol_definitions_1.SummaryType.Tree, 0x1ae /* "Child summary object is not a tree" */);
425
425
  childSummaryWithStats = {
426
426
  summary: childSummary,
427
- stats: summaryUtils_1.calculateStats(childSummary),
427
+ stats: (0, summaryUtils_1.calculateStats)(childSummary),
428
428
  };
429
429
  }
430
430
  initialSummary = {
@@ -439,7 +439,7 @@ class SummarizerNode {
439
439
  }
440
440
  default: {
441
441
  const type = createParam.type;
442
- common_utils_1.unreachableCase(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);
442
+ (0, common_utils_1.unreachableCase)(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);
443
443
  }
444
444
  }
445
445
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"summarizerNode.js","sourceRoot":"","sources":["../../src/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n ISummarizerNode,\n ISummarizerNodeConfig,\n ISummarizeInternalResult,\n ISummarizeResult,\n ISummaryTreeWithStats,\n CreateChildSummarizerNodeParam,\n CreateSummarizerNodeSource,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n ISequencedDocumentMessage,\n SummaryType,\n ISnapshotTree,\n SummaryObject,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport { mergeStats, convertToSummaryTree, calculateStats } from \"../summaryUtils\";\nimport { ReadAndParseBlob } from \"../utils\";\nimport {\n decodeSummary,\n encodeSummary,\n EncodeSummaryParam,\n EscapedPath,\n ICreateChildDetails,\n IInitialSummary,\n ISummarizerNodeRootContract,\n parseSummaryForSubtrees,\n parseSummaryTreeForSubtrees,\n RefreshSummaryResult,\n SummaryNode,\n} from \"./summarizerNodeUtils\";\n\nexport interface IRootSummarizerNode extends ISummarizerNode, ISummarizerNodeRootContract {}\n\n/**\n * Encapsulates the summarizing work and state of an individual tree node in the\n * summary tree. It tracks changes and allows for optimizations when unchanged, or\n * can allow for fallback summaries to be generated when an error is encountered.\n * Usage is for the root node to call startSummary first to begin tracking a WIP\n * (work in progress) summary. Then all nodes will call summarize to summaries their\n * individual parts. Once completed and uploaded to storage, the root node will call\n * completeSummary or clearSummary to clear the WIP summary tracking state if something\n * went wrong. The SummarizerNodes will track all pending summaries that have been\n * recorded by the completeSummary call. When one of them is acked, the root node should\n * call refreshLatestSummary to inform the tree of SummarizerNodes of the new baseline\n * latest successful summary.\n */\nexport class SummarizerNode implements IRootSummarizerNode {\n /**\n * The reference sequence number of the most recent acked summary.\n * Returns 0 if there is not yet an acked summary.\n */\n public get referenceSequenceNumber() {\n return this._latestSummary?.referenceSequenceNumber ?? 0;\n }\n\n protected readonly children = new Map<string, SummarizerNode>();\n protected readonly pendingSummaries = new Map<string, SummaryNode>();\n private readonly outstandingOps: ISequencedDocumentMessage[] = [];\n private wipReferenceSequenceNumber: number | undefined;\n private wipLocalPaths: { localPath: EscapedPath, additionalPath?: EscapedPath } | undefined;\n private wipSkipRecursion = false;\n\n public startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLogger) {\n assert(this.wipSummaryLogger === undefined,\n 0x19f /* \"wipSummaryLogger should not be set yet in startSummary\" */);\n assert(this.wipReferenceSequenceNumber === undefined, 0x1a0 /* \"Already tracking a summary\" */);\n\n this.wipSummaryLogger = summaryLogger;\n\n for (const child of this.children.values()) {\n child.startSummary(referenceSequenceNumber, this.wipSummaryLogger);\n }\n this.wipReferenceSequenceNumber = referenceSequenceNumber;\n }\n\n public async summarize(fullTree: boolean): Promise<ISummarizeResult> {\n assert(this.isTrackingInProgress(), 0x1a1 /* \"summarize should not be called when not tracking the summary\" */);\n assert(this.wipSummaryLogger !== undefined,\n 0x1a2 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */);\n\n // Try to reuse the tree if unchanged\n if (this.canReuseHandle && !fullTree && !this.hasChanged()) {\n const latestSummary = this._latestSummary;\n if (latestSummary !== undefined) {\n this.wipLocalPaths = {\n localPath: latestSummary.localPath,\n additionalPath: latestSummary.additionalPath,\n };\n this.wipSkipRecursion = true;\n const stats = mergeStats();\n stats.handleNodeCount++;\n return {\n summary: {\n type: SummaryType.Handle,\n handle: latestSummary.fullPath.path,\n handleType: SummaryType.Tree,\n },\n stats,\n };\n }\n }\n\n try {\n const result = await this.summarizeInternalFn(fullTree);\n this.wipLocalPaths = { localPath: EscapedPath.create(result.id) };\n if (result.pathPartsForChildren !== undefined) {\n this.wipLocalPaths.additionalPath = EscapedPath.createAndConcat(result.pathPartsForChildren);\n }\n return { summary: result.summary, stats: result.stats };\n } catch (error) {\n if (this.throwOnError || this.trackingSequenceNumber < this._changeSequenceNumber) {\n throw error;\n }\n const latestSummary = this._latestSummary;\n const initialSummary = this.initialSummary;\n\n let encodeParam: EncodeSummaryParam;\n let localPath: EscapedPath;\n if (latestSummary !== undefined) {\n // Create using handle of latest acked summary\n encodeParam = {\n fromSummary: true,\n summaryNode: latestSummary,\n };\n localPath = latestSummary.localPath;\n } else if (initialSummary?.summary !== undefined) {\n // Create using initial summary from attach op\n encodeParam = {\n fromSummary: false,\n initialSummary: initialSummary.summary,\n };\n localPath = EscapedPath.create(initialSummary.id);\n } else {\n // No base summary to reference\n throw error;\n }\n this.wipSummaryLogger.sendErrorEvent({\n eventName: \"SummarizingWithBasePlusOps\",\n },\n error);\n const summary = encodeSummary(encodeParam, this.outstandingOps);\n this.wipLocalPaths = {\n localPath,\n additionalPath: summary.additionalPath,\n };\n this.wipSkipRecursion = true;\n return { summary: summary.summary, stats: summary.stats };\n }\n }\n\n /**\n * Complete the WIP summary for the given proposalHandle\n */\n public completeSummary(proposalHandle: string) {\n this.completeSummaryCore(proposalHandle, undefined, false);\n }\n\n /**\n * Recursive implementation for completeSummary, with additional internal-only parameters\n */\n protected completeSummaryCore(\n proposalHandle: string,\n parentPath: EscapedPath | undefined,\n parentSkipRecursion: boolean,\n ) {\n assert(this.wipSummaryLogger !== undefined,\n 0x1a3 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */);\n assert(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* \"Not tracking a summary\" */);\n let localPathsToUse = this.wipLocalPaths;\n\n if (parentSkipRecursion) {\n const latestSummary = this._latestSummary;\n if (latestSummary !== undefined) {\n // This case the parent node created a failure summary or was reused.\n // This node and all children should only try to reference their path\n // by its last known good state in the actual summary tree.\n // If parent fails or is reused, the child summarize is not called so\n // it did not get a chance to change its paths.\n // In this case, essentially only propagate the new summary ref seq num.\n localPathsToUse = {\n localPath: latestSummary.localPath,\n additionalPath: latestSummary.additionalPath,\n };\n } else {\n // This case the child is added after the latest non-failure summary.\n // This node and all children should consider themselves as still not\n // having a successful summary yet.\n // We cannot \"reuse\" this node if unchanged since that summary, because\n // handles will be unable to point to that node. It never made it to the\n // tree itself, and only exists as an attach op in the _outstandingOps.\n this.clearSummary();\n return;\n }\n }\n\n // This should come from wipLocalPaths in normal cases, or from the latestSummary\n // if parentIsFailure or parentIsReused is true.\n // If there is no latestSummary, clearSummary and return before reaching this code.\n assert(!!localPathsToUse, 0x1a5 /* \"Tracked summary local paths not set\" */);\n\n const summary = new SummaryNode({\n ...localPathsToUse,\n referenceSequenceNumber: this.wipReferenceSequenceNumber,\n basePath: parentPath,\n });\n const fullPathForChildren = summary.fullPathForChildren;\n for (const child of this.children.values()) {\n child.completeSummaryCore(\n proposalHandle,\n fullPathForChildren,\n this.wipSkipRecursion || parentSkipRecursion,\n );\n }\n // Note that this overwrites existing pending summary with\n // the same proposalHandle. If proposalHandle is something like\n // a hash or unique identifier, this should be fine. If storage\n // can return the same proposalHandle for a different summary,\n // this should still be okay, because we should be proposing the\n // newer one later which would have to overwrite the previous one.\n this.pendingSummaries.set(proposalHandle, summary);\n this.clearSummary();\n }\n\n public clearSummary() {\n this.wipReferenceSequenceNumber = undefined;\n this.wipLocalPaths = undefined;\n this.wipSkipRecursion = false;\n this.wipSummaryLogger = undefined;\n for (const child of this.children.values()) {\n child.clearSummary();\n }\n }\n\n /**\n * Refreshes the latest summary tracked by this node. If we have a pending summary for the given proposal handle,\n * it becomes the latest summary. If the current summary is already ahead (e.g., loaded from a service summary),\n * we skip the update. Otherwise, we get the snapshot by calling `getSnapshot` and update latest\n * summary based off of that.\n * @returns A RefreshSummaryResult type which returns information based on the following three scenarios:\n * 1. The latest summary was not udpated.\n * 2. The latest summary was updated and the summary corresponding to the params was being tracked.\n * 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this\n * case, the latest summary is updated based on the downloaded snapshot which is also returned.\n */\n public async refreshLatestSummary(\n proposalHandle: string | undefined,\n summaryRefSeq: number,\n getSnapshot: () => Promise<ISnapshotTree>,\n readAndParseBlob: ReadAndParseBlob,\n correlatedSummaryLogger: ITelemetryLogger,\n ): Promise<RefreshSummaryResult> {\n if (proposalHandle !== undefined) {\n const maybeSummaryNode = this.pendingSummaries.get(proposalHandle);\n\n if (maybeSummaryNode !== undefined) {\n this.refreshLatestSummaryFromPending(proposalHandle, maybeSummaryNode.referenceSequenceNumber);\n return { latestSummaryUpdated: true, wasSummaryTracked: true };\n }\n }\n\n // If we have seen a summary same or later as the current one, ignore it.\n if (this.referenceSequenceNumber >= summaryRefSeq) {\n return { latestSummaryUpdated: false };\n }\n\n const snapshotTree = await getSnapshot();\n await this.refreshLatestSummaryFromSnapshot(\n summaryRefSeq,\n snapshotTree,\n undefined,\n EscapedPath.create(\"\"),\n correlatedSummaryLogger,\n readAndParseBlob,\n );\n return { latestSummaryUpdated: true, wasSummaryTracked: false, snapshot: snapshotTree };\n }\n\n protected refreshLatestSummaryFromPending(\n proposalHandle: string,\n referenceSequenceNumber: number,\n ): void {\n const summaryNode = this.pendingSummaries.get(proposalHandle);\n if (summaryNode === undefined) {\n // This should only happen if parent skipped recursion AND no prior summary existed.\n assert(\n this._latestSummary === undefined,\n 0x1a6 /* \"Not found pending summary, but this node has previously completed a summary\" */,\n );\n return;\n } else {\n assert(\n referenceSequenceNumber === summaryNode.referenceSequenceNumber,\n // eslint-disable-next-line max-len\n 0x1a7 /* `Pending summary reference sequence number should be consistent: ${summaryNode.referenceSequenceNumber} != ${referenceSequenceNumber}` */,\n );\n\n // Clear earlier pending summaries\n this.pendingSummaries.delete(proposalHandle);\n }\n\n this.refreshLatestSummaryCore(referenceSequenceNumber);\n\n this._latestSummary = summaryNode;\n\n // Propagate update to all child nodes\n for (const child of this.children.values()) {\n child.refreshLatestSummaryFromPending(proposalHandle, referenceSequenceNumber);\n }\n }\n\n protected async refreshLatestSummaryFromSnapshot(\n referenceSequenceNumber: number,\n snapshotTree: ISnapshotTree,\n basePath: EscapedPath | undefined,\n localPath: EscapedPath,\n correlatedSummaryLogger: ITelemetryLogger,\n readAndParseBlob: ReadAndParseBlob,\n ): Promise<void> {\n // Possible re-entrancy. If we have already seen a summary later than this one, ignore it.\n if (this.referenceSequenceNumber >= referenceSequenceNumber) {\n return;\n }\n\n this.refreshLatestSummaryCore(referenceSequenceNumber);\n\n const { baseSummary, pathParts } = decodeSummary(snapshotTree, correlatedSummaryLogger);\n\n this._latestSummary = new SummaryNode({\n referenceSequenceNumber,\n basePath,\n localPath,\n });\n\n const { childrenTree, childrenPathPart } = parseSummaryForSubtrees(baseSummary);\n if (childrenPathPart !== undefined) {\n pathParts.push(childrenPathPart);\n }\n\n if (pathParts.length > 0) {\n this._latestSummary.additionalPath = EscapedPath.createAndConcat(pathParts);\n }\n\n // Propagate update to all child nodes\n const pathForChildren = this._latestSummary.fullPathForChildren;\n await Promise.all(Array.from(this.children)\n .filter(([id]) => {\n // Assuming subtrees missing from snapshot are newer than the snapshot,\n // but might be nice to assert this using earliest seq for node.\n return childrenTree.trees[id] !== undefined;\n }).map(async ([id, child]) => {\n return child.refreshLatestSummaryFromSnapshot(\n referenceSequenceNumber,\n childrenTree.trees[id],\n pathForChildren,\n EscapedPath.create(id),\n correlatedSummaryLogger,\n readAndParseBlob,\n );\n }));\n }\n\n private refreshLatestSummaryCore(referenceSequenceNumber: number): void {\n for (const [key, value] of this.pendingSummaries) {\n if (value.referenceSequenceNumber < referenceSequenceNumber) {\n this.pendingSummaries.delete(key);\n }\n }\n\n // Clear earlier outstanding ops\n while (\n this.outstandingOps.length > 0\n && this.outstandingOps[0].sequenceNumber <= referenceSequenceNumber\n ) {\n this.outstandingOps.shift();\n }\n }\n\n public loadBaseSummaryWithoutDifferential(snapshot: ISnapshotTree) {\n // Check base summary to see if it has any additional path parts\n // separating child SummarizerNodes. Checks for .channels subtrees.\n const { childrenPathPart } = parseSummaryForSubtrees(snapshot);\n if (childrenPathPart !== undefined && this._latestSummary !== undefined) {\n this._latestSummary.additionalPath = EscapedPath.create(childrenPathPart);\n }\n }\n\n public async loadBaseSummary(\n snapshot: ISnapshotTree,\n readAndParseBlob: ReadAndParseBlob,\n ): Promise<{ baseSummary: ISnapshotTree, outstandingOps: ISequencedDocumentMessage[] }> {\n const decodedSummary = decodeSummary(snapshot, this.defaultLogger);\n const outstandingOps = await decodedSummary.getOutstandingOps(readAndParseBlob);\n\n const { childrenPathPart } = parseSummaryForSubtrees(decodedSummary.baseSummary);\n if (childrenPathPart !== undefined) {\n decodedSummary.pathParts.push(childrenPathPart);\n }\n\n if (decodedSummary.pathParts.length > 0 && this._latestSummary !== undefined) {\n this._latestSummary.additionalPath = EscapedPath.createAndConcat(decodedSummary.pathParts);\n }\n\n // Defensive assertion: tracking number should already exceed this number.\n // This is probably a little excessive; can remove when stable.\n if (outstandingOps.length > 0) {\n const newOpsLatestSeq = outstandingOps[outstandingOps.length - 1].sequenceNumber;\n assert(\n newOpsLatestSeq <= this.trackingSequenceNumber,\n 0x1a9 /* \"When loading base summary, expected outstanding ops <= tracking sequence number\" */,\n );\n }\n\n return {\n baseSummary: decodedSummary.baseSummary,\n outstandingOps,\n };\n }\n\n public recordChange(op: ISequencedDocumentMessage): void {\n const lastOp = this.outstandingOps[this.outstandingOps.length - 1];\n if (lastOp !== undefined) {\n assert(\n lastOp.sequenceNumber < op.sequenceNumber,\n 0x1aa /* `Out of order change recorded: ${lastOp.sequenceNumber} > ${op.sequenceNumber}` */,\n );\n }\n this.invalidate(op.sequenceNumber);\n this.trackingSequenceNumber = op.sequenceNumber;\n this.outstandingOps.push(op);\n }\n\n public invalidate(sequenceNumber: number): void {\n if (sequenceNumber > this._changeSequenceNumber) {\n this._changeSequenceNumber = sequenceNumber;\n }\n }\n\n /**\n * True if a change has been recorded with sequence number exceeding\n * the latest successfully acked summary reference sequence number.\n * False implies that the previous summary can be reused.\n */\n protected hasChanged(): boolean {\n return this._changeSequenceNumber > this.referenceSequenceNumber;\n }\n\n public get latestSummary(): Readonly<SummaryNode> | undefined {\n return this._latestSummary;\n }\n\n private readonly canReuseHandle: boolean;\n private readonly throwOnError: boolean;\n /**\n * Sequence number of latest tracked op. This updates during recordChange,\n * but not for invalidate since we don't have the op. If this drifts from\n * changeSequenceNumber and we try to create a differential summary we assert.\n */\n private trackingSequenceNumber: number;\n\n /**\n * Do not call constructor directly.\n * Use createRootSummarizerNode to create root node, or createChild to create child nodes.\n */\n public constructor(\n protected readonly defaultLogger: ITelemetryLogger,\n private readonly summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n config: ISummarizerNodeConfig,\n private _changeSequenceNumber: number,\n /** Undefined means created without summary */\n private _latestSummary?: SummaryNode,\n private readonly initialSummary?: IInitialSummary,\n protected wipSummaryLogger?: ITelemetryLogger,\n ) {\n this.canReuseHandle = config.canReuseHandle ?? true;\n // BUGBUG: Seeing issues with differential summaries.\n // this will disable them, and throw instead\n // while we continue to investigate\n this.throwOnError = true; // config.throwOnFailure ?? false;\n this.trackingSequenceNumber = this._changeSequenceNumber;\n }\n\n public createChild(\n /** Summarize function */\n summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n /** Initial id or path part of this node */\n id: string,\n /**\n * Information needed to create the node.\n * If it is from a base summary, it will assert that a summary has been seen.\n * Attach information if it is created from an attach op.\n */\n createParam: CreateChildSummarizerNodeParam,\n config: ISummarizerNodeConfig = {},\n ): ISummarizerNode {\n assert(!this.children.has(id), 0x1ab /* \"Create SummarizerNode child already exists\" */);\n\n const createDetails: ICreateChildDetails = this.getCreateDetailsForChild(id, createParam);\n const child = new SummarizerNode(\n this.defaultLogger,\n summarizeInternalFn,\n config,\n createDetails.changeSequenceNumber,\n createDetails.latestSummary,\n createDetails.initialSummary,\n this.wipSummaryLogger,\n );\n\n // There may be additional state that has to be updated in this child. For example, if a summary is being\n // tracked, the child's summary tracking state needs to be updated too.\n this.maybeUpdateChildState(child);\n\n this.children.set(id, child);\n return child;\n }\n\n public getChild(id: string): ISummarizerNode | undefined {\n return this.children.get(id);\n }\n\n /**\n * Returns the details needed to create a child node.\n * @param id - Initial id or path part of the child node.\n * @param createParam - Information needed to create the node.\n * @returns the details needed to create the child node.\n */\n protected getCreateDetailsForChild(id: string, createParam: CreateChildSummarizerNodeParam): ICreateChildDetails {\n let initialSummary: IInitialSummary | undefined;\n let latestSummary: SummaryNode | undefined;\n let changeSequenceNumber: number;\n\n const parentLatestSummary = this._latestSummary;\n switch (createParam.type) {\n case CreateSummarizerNodeSource.FromAttach: {\n if (\n parentLatestSummary !== undefined\n && createParam.sequenceNumber <= parentLatestSummary.referenceSequenceNumber\n ) {\n // Prioritize latest summary if it was after this node was attached.\n latestSummary = parentLatestSummary.createForChild(id);\n } else {\n const summary = convertToSummaryTree(createParam.snapshot) as ISummaryTreeWithStats;\n initialSummary = {\n sequenceNumber: createParam.sequenceNumber,\n id,\n summary,\n };\n }\n changeSequenceNumber = createParam.sequenceNumber;\n break;\n }\n case CreateSummarizerNodeSource.FromSummary: {\n if (this.initialSummary === undefined) {\n assert(\n !!parentLatestSummary,\n 0x1ac /* \"Cannot create child from summary if parent does not have latest summary\" */);\n }\n // fallthrough to local\n }\n case CreateSummarizerNodeSource.Local: {\n const parentInitialSummary = this.initialSummary;\n if (parentInitialSummary !== undefined) {\n let childSummary: SummaryObject | undefined;\n if (parentInitialSummary.summary !== undefined) {\n const { childrenTree } = parseSummaryTreeForSubtrees(parentInitialSummary.summary.summary);\n assert(\n childrenTree.type === SummaryType.Tree,\n 0x1d6 /* \"Parent summary object is not a tree\" */,\n );\n childSummary = childrenTree.tree[id];\n }\n if (createParam.type === CreateSummarizerNodeSource.FromSummary) {\n // Locally created would not have differential subtree.\n assert(!!childSummary, 0x1ad /* \"Missing child summary tree\" */);\n }\n let childSummaryWithStats: ISummaryTreeWithStats | undefined;\n if (childSummary !== undefined) {\n assert(\n childSummary.type === SummaryType.Tree,\n 0x1ae /* \"Child summary object is not a tree\" */,\n );\n childSummaryWithStats = {\n summary: childSummary,\n stats: calculateStats(childSummary),\n };\n }\n initialSummary = {\n sequenceNumber: parentInitialSummary.sequenceNumber,\n id,\n summary: childSummaryWithStats,\n };\n }\n latestSummary = parentLatestSummary?.createForChild(id);\n changeSequenceNumber = parentLatestSummary?.referenceSequenceNumber ?? -1;\n break;\n }\n default: {\n const type = (createParam as unknown as CreateChildSummarizerNodeParam).type;\n unreachableCase(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);\n }\n }\n\n return {\n initialSummary,\n latestSummary,\n changeSequenceNumber,\n };\n }\n\n /**\n * Updates the state of the child if required. For example, if a summary is currently being tracked, the child's\n * summary tracking state needs to be updated too.\n * @param child - The child node whose state is to be updated.\n */\n protected maybeUpdateChildState(child: SummarizerNode) {\n // If we are tracking a summary, this child was created after the tracking started. So, we need to update the\n // child's tracking state as well.\n if (this.isTrackingInProgress()) {\n child.wipReferenceSequenceNumber = this.wipReferenceSequenceNumber;\n }\n }\n\n /**\n * Tells whether summary tracking is in progress. True if \"startSummary\" API is called before summarize.\n */\n protected isTrackingInProgress(): boolean {\n return this.wipReferenceSequenceNumber !== undefined;\n }\n}\n\n/**\n * Creates a root summarizer node.\n * @param logger - Logger to use within SummarizerNode\n * @param summarizeInternalFn - Function to generate summary\n * @param changeSequenceNumber - Sequence number of latest change to new node/subtree\n * @param referenceSequenceNumber - Reference sequence number of last acked summary,\n * or undefined if not loaded from summary\n * @param config - Configure behavior of summarizer node\n */\nexport const createRootSummarizerNode = (\n logger: ITelemetryLogger,\n summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n changeSequenceNumber: number,\n referenceSequenceNumber: number | undefined,\n config: ISummarizerNodeConfig = {},\n): IRootSummarizerNode => new SummarizerNode(\n logger,\n summarizeInternalFn,\n config,\n changeSequenceNumber,\n referenceSequenceNumber === undefined ? undefined : SummaryNode.createForRoot(referenceSequenceNumber),\n );\n"]}
1
+ {"version":3,"file":"summarizerNode.js","sourceRoot":"","sources":["../../src/summarizerNode/summarizerNode.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n ISummarizerNode,\n ISummarizerNodeConfig,\n ISummarizeInternalResult,\n ISummarizeResult,\n ISummaryTreeWithStats,\n CreateChildSummarizerNodeParam,\n CreateSummarizerNodeSource,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n ISequencedDocumentMessage,\n SummaryType,\n ISnapshotTree,\n SummaryObject,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, unreachableCase } from \"@fluidframework/common-utils\";\nimport { mergeStats, convertToSummaryTree, calculateStats } from \"../summaryUtils\";\nimport { ReadAndParseBlob } from \"../utils\";\nimport {\n decodeSummary,\n encodeSummary,\n EncodeSummaryParam,\n EscapedPath,\n ICreateChildDetails,\n IInitialSummary,\n ISummarizerNodeRootContract,\n parseSummaryForSubtrees,\n parseSummaryTreeForSubtrees,\n RefreshSummaryResult,\n SummaryNode,\n} from \"./summarizerNodeUtils\";\n\nexport interface IRootSummarizerNode extends ISummarizerNode, ISummarizerNodeRootContract {}\n\n/**\n * Encapsulates the summarizing work and state of an individual tree node in the\n * summary tree. It tracks changes and allows for optimizations when unchanged, or\n * can allow for fallback summaries to be generated when an error is encountered.\n * Usage is for the root node to call startSummary first to begin tracking a WIP\n * (work in progress) summary. Then all nodes will call summarize to summaries their\n * individual parts. Once completed and uploaded to storage, the root node will call\n * completeSummary or clearSummary to clear the WIP summary tracking state if something\n * went wrong. The SummarizerNodes will track all pending summaries that have been\n * recorded by the completeSummary call. When one of them is acked, the root node should\n * call refreshLatestSummary to inform the tree of SummarizerNodes of the new baseline\n * latest successful summary.\n */\nexport class SummarizerNode implements IRootSummarizerNode {\n /**\n * The reference sequence number of the most recent acked summary.\n * Returns 0 if there is not yet an acked summary.\n */\n public get referenceSequenceNumber() {\n return this._latestSummary?.referenceSequenceNumber ?? 0;\n }\n\n protected readonly children = new Map<string, SummarizerNode>();\n protected readonly pendingSummaries = new Map<string, SummaryNode>();\n private readonly outstandingOps: ISequencedDocumentMessage[] = [];\n private wipReferenceSequenceNumber: number | undefined;\n private wipLocalPaths: { localPath: EscapedPath; additionalPath?: EscapedPath; } | undefined;\n private wipSkipRecursion = false;\n\n public startSummary(referenceSequenceNumber: number, summaryLogger: ITelemetryLogger) {\n assert(this.wipSummaryLogger === undefined,\n 0x19f /* \"wipSummaryLogger should not be set yet in startSummary\" */);\n assert(this.wipReferenceSequenceNumber === undefined, 0x1a0 /* \"Already tracking a summary\" */);\n\n this.wipSummaryLogger = summaryLogger;\n\n for (const child of this.children.values()) {\n child.startSummary(referenceSequenceNumber, this.wipSummaryLogger);\n }\n this.wipReferenceSequenceNumber = referenceSequenceNumber;\n }\n\n public async summarize(fullTree: boolean): Promise<ISummarizeResult> {\n assert(this.isTrackingInProgress(), 0x1a1 /* \"summarize should not be called when not tracking the summary\" */);\n assert(this.wipSummaryLogger !== undefined,\n 0x1a2 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */);\n\n // Try to reuse the tree if unchanged\n if (this.canReuseHandle && !fullTree && !this.hasChanged()) {\n const latestSummary = this._latestSummary;\n if (latestSummary !== undefined) {\n this.wipLocalPaths = {\n localPath: latestSummary.localPath,\n additionalPath: latestSummary.additionalPath,\n };\n this.wipSkipRecursion = true;\n const stats = mergeStats();\n stats.handleNodeCount++;\n return {\n summary: {\n type: SummaryType.Handle,\n handle: latestSummary.fullPath.path,\n handleType: SummaryType.Tree,\n },\n stats,\n };\n }\n }\n\n try {\n const result = await this.summarizeInternalFn(fullTree);\n this.wipLocalPaths = { localPath: EscapedPath.create(result.id) };\n if (result.pathPartsForChildren !== undefined) {\n this.wipLocalPaths.additionalPath = EscapedPath.createAndConcat(result.pathPartsForChildren);\n }\n return { summary: result.summary, stats: result.stats };\n } catch (error) {\n if (this.throwOnError || this.trackingSequenceNumber < this._changeSequenceNumber) {\n throw error;\n }\n const latestSummary = this._latestSummary;\n const initialSummary = this.initialSummary;\n\n let encodeParam: EncodeSummaryParam;\n let localPath: EscapedPath;\n if (latestSummary !== undefined) {\n // Create using handle of latest acked summary\n encodeParam = {\n fromSummary: true,\n summaryNode: latestSummary,\n };\n localPath = latestSummary.localPath;\n } else if (initialSummary?.summary !== undefined) {\n // Create using initial summary from attach op\n encodeParam = {\n fromSummary: false,\n initialSummary: initialSummary.summary,\n };\n localPath = EscapedPath.create(initialSummary.id);\n } else {\n // No base summary to reference\n throw error;\n }\n this.wipSummaryLogger.sendErrorEvent({\n eventName: \"SummarizingWithBasePlusOps\",\n },\n error);\n const summary = encodeSummary(encodeParam, this.outstandingOps);\n this.wipLocalPaths = {\n localPath,\n additionalPath: summary.additionalPath,\n };\n this.wipSkipRecursion = true;\n return { summary: summary.summary, stats: summary.stats };\n }\n }\n\n /**\n * Complete the WIP summary for the given proposalHandle\n */\n public completeSummary(proposalHandle: string) {\n this.completeSummaryCore(proposalHandle, undefined, false);\n }\n\n /**\n * Recursive implementation for completeSummary, with additional internal-only parameters\n */\n protected completeSummaryCore(\n proposalHandle: string,\n parentPath: EscapedPath | undefined,\n parentSkipRecursion: boolean,\n ) {\n assert(this.wipSummaryLogger !== undefined,\n 0x1a3 /* \"wipSummaryLogger should have been set in startSummary or ctor\" */);\n assert(this.wipReferenceSequenceNumber !== undefined, 0x1a4 /* \"Not tracking a summary\" */);\n let localPathsToUse = this.wipLocalPaths;\n\n if (parentSkipRecursion) {\n const latestSummary = this._latestSummary;\n if (latestSummary !== undefined) {\n // This case the parent node created a failure summary or was reused.\n // This node and all children should only try to reference their path\n // by its last known good state in the actual summary tree.\n // If parent fails or is reused, the child summarize is not called so\n // it did not get a chance to change its paths.\n // In this case, essentially only propagate the new summary ref seq num.\n localPathsToUse = {\n localPath: latestSummary.localPath,\n additionalPath: latestSummary.additionalPath,\n };\n } else {\n // This case the child is added after the latest non-failure summary.\n // This node and all children should consider themselves as still not\n // having a successful summary yet.\n // We cannot \"reuse\" this node if unchanged since that summary, because\n // handles will be unable to point to that node. It never made it to the\n // tree itself, and only exists as an attach op in the _outstandingOps.\n this.clearSummary();\n return;\n }\n }\n\n // This should come from wipLocalPaths in normal cases, or from the latestSummary\n // if parentIsFailure or parentIsReused is true.\n // If there is no latestSummary, clearSummary and return before reaching this code.\n assert(!!localPathsToUse, 0x1a5 /* \"Tracked summary local paths not set\" */);\n\n const summary = new SummaryNode({\n ...localPathsToUse,\n referenceSequenceNumber: this.wipReferenceSequenceNumber,\n basePath: parentPath,\n });\n const fullPathForChildren = summary.fullPathForChildren;\n for (const child of this.children.values()) {\n child.completeSummaryCore(\n proposalHandle,\n fullPathForChildren,\n this.wipSkipRecursion || parentSkipRecursion,\n );\n }\n // Note that this overwrites existing pending summary with\n // the same proposalHandle. If proposalHandle is something like\n // a hash or unique identifier, this should be fine. If storage\n // can return the same proposalHandle for a different summary,\n // this should still be okay, because we should be proposing the\n // newer one later which would have to overwrite the previous one.\n this.pendingSummaries.set(proposalHandle, summary);\n this.clearSummary();\n }\n\n public clearSummary() {\n this.wipReferenceSequenceNumber = undefined;\n this.wipLocalPaths = undefined;\n this.wipSkipRecursion = false;\n this.wipSummaryLogger = undefined;\n for (const child of this.children.values()) {\n child.clearSummary();\n }\n }\n\n /**\n * Refreshes the latest summary tracked by this node. If we have a pending summary for the given proposal handle,\n * it becomes the latest summary. If the current summary is already ahead (e.g., loaded from a service summary),\n * we skip the update. Otherwise, we get the snapshot by calling `getSnapshot` and update latest\n * summary based off of that.\n * @returns A RefreshSummaryResult type which returns information based on the following three scenarios:\n * 1. The latest summary was not udpated.\n * 2. The latest summary was updated and the summary corresponding to the params was being tracked.\n * 3. The latest summary was updated but the summary corresponding to the params was not tracked. In this\n * case, the latest summary is updated based on the downloaded snapshot which is also returned.\n */\n public async refreshLatestSummary(\n proposalHandle: string | undefined,\n summaryRefSeq: number,\n getSnapshot: () => Promise<ISnapshotTree>,\n readAndParseBlob: ReadAndParseBlob,\n correlatedSummaryLogger: ITelemetryLogger,\n ): Promise<RefreshSummaryResult> {\n if (proposalHandle !== undefined) {\n const maybeSummaryNode = this.pendingSummaries.get(proposalHandle);\n\n if (maybeSummaryNode !== undefined) {\n this.refreshLatestSummaryFromPending(proposalHandle, maybeSummaryNode.referenceSequenceNumber);\n return { latestSummaryUpdated: true, wasSummaryTracked: true };\n }\n }\n\n // If we have seen a summary same or later as the current one, ignore it.\n if (this.referenceSequenceNumber >= summaryRefSeq) {\n return { latestSummaryUpdated: false };\n }\n\n const snapshotTree = await getSnapshot();\n await this.refreshLatestSummaryFromSnapshot(\n summaryRefSeq,\n snapshotTree,\n undefined,\n EscapedPath.create(\"\"),\n correlatedSummaryLogger,\n readAndParseBlob,\n );\n return { latestSummaryUpdated: true, wasSummaryTracked: false, snapshot: snapshotTree };\n }\n\n protected refreshLatestSummaryFromPending(\n proposalHandle: string,\n referenceSequenceNumber: number,\n ): void {\n const summaryNode = this.pendingSummaries.get(proposalHandle);\n if (summaryNode === undefined) {\n // This should only happen if parent skipped recursion AND no prior summary existed.\n assert(\n this._latestSummary === undefined,\n 0x1a6 /* \"Not found pending summary, but this node has previously completed a summary\" */,\n );\n return;\n } else {\n assert(\n referenceSequenceNumber === summaryNode.referenceSequenceNumber,\n // eslint-disable-next-line max-len\n 0x1a7 /* `Pending summary reference sequence number should be consistent: ${summaryNode.referenceSequenceNumber} != ${referenceSequenceNumber}` */,\n );\n\n // Clear earlier pending summaries\n this.pendingSummaries.delete(proposalHandle);\n }\n\n this.refreshLatestSummaryCore(referenceSequenceNumber);\n\n this._latestSummary = summaryNode;\n\n // Propagate update to all child nodes\n for (const child of this.children.values()) {\n child.refreshLatestSummaryFromPending(proposalHandle, referenceSequenceNumber);\n }\n }\n\n protected async refreshLatestSummaryFromSnapshot(\n referenceSequenceNumber: number,\n snapshotTree: ISnapshotTree,\n basePath: EscapedPath | undefined,\n localPath: EscapedPath,\n correlatedSummaryLogger: ITelemetryLogger,\n readAndParseBlob: ReadAndParseBlob,\n ): Promise<void> {\n // Possible re-entrancy. If we have already seen a summary later than this one, ignore it.\n if (this.referenceSequenceNumber >= referenceSequenceNumber) {\n return;\n }\n\n this.refreshLatestSummaryCore(referenceSequenceNumber);\n\n const { baseSummary, pathParts } = decodeSummary(snapshotTree, correlatedSummaryLogger);\n\n this._latestSummary = new SummaryNode({\n referenceSequenceNumber,\n basePath,\n localPath,\n });\n\n const { childrenTree, childrenPathPart } = parseSummaryForSubtrees(baseSummary);\n if (childrenPathPart !== undefined) {\n pathParts.push(childrenPathPart);\n }\n\n if (pathParts.length > 0) {\n this._latestSummary.additionalPath = EscapedPath.createAndConcat(pathParts);\n }\n\n // Propagate update to all child nodes\n const pathForChildren = this._latestSummary.fullPathForChildren;\n await Promise.all(Array.from(this.children)\n .filter(([id]) => {\n // Assuming subtrees missing from snapshot are newer than the snapshot,\n // but might be nice to assert this using earliest seq for node.\n return childrenTree.trees[id] !== undefined;\n }).map(async ([id, child]) => {\n return child.refreshLatestSummaryFromSnapshot(\n referenceSequenceNumber,\n childrenTree.trees[id],\n pathForChildren,\n EscapedPath.create(id),\n correlatedSummaryLogger,\n readAndParseBlob,\n );\n }));\n }\n\n private refreshLatestSummaryCore(referenceSequenceNumber: number): void {\n for (const [key, value] of this.pendingSummaries) {\n if (value.referenceSequenceNumber < referenceSequenceNumber) {\n this.pendingSummaries.delete(key);\n }\n }\n\n // Clear earlier outstanding ops\n while (\n this.outstandingOps.length > 0\n && this.outstandingOps[0].sequenceNumber <= referenceSequenceNumber\n ) {\n this.outstandingOps.shift();\n }\n }\n\n public loadBaseSummaryWithoutDifferential(snapshot: ISnapshotTree) {\n // Check base summary to see if it has any additional path parts\n // separating child SummarizerNodes. Checks for .channels subtrees.\n const { childrenPathPart } = parseSummaryForSubtrees(snapshot);\n if (childrenPathPart !== undefined && this._latestSummary !== undefined) {\n this._latestSummary.additionalPath = EscapedPath.create(childrenPathPart);\n }\n }\n\n public async loadBaseSummary(\n snapshot: ISnapshotTree,\n readAndParseBlob: ReadAndParseBlob,\n ): Promise<{ baseSummary: ISnapshotTree; outstandingOps: ISequencedDocumentMessage[]; }> {\n const decodedSummary = decodeSummary(snapshot, this.defaultLogger);\n const outstandingOps = await decodedSummary.getOutstandingOps(readAndParseBlob);\n\n const { childrenPathPart } = parseSummaryForSubtrees(decodedSummary.baseSummary);\n if (childrenPathPart !== undefined) {\n decodedSummary.pathParts.push(childrenPathPart);\n }\n\n if (decodedSummary.pathParts.length > 0 && this._latestSummary !== undefined) {\n this._latestSummary.additionalPath = EscapedPath.createAndConcat(decodedSummary.pathParts);\n }\n\n // Defensive assertion: tracking number should already exceed this number.\n // This is probably a little excessive; can remove when stable.\n if (outstandingOps.length > 0) {\n const newOpsLatestSeq = outstandingOps[outstandingOps.length - 1].sequenceNumber;\n assert(\n newOpsLatestSeq <= this.trackingSequenceNumber,\n 0x1a9 /* \"When loading base summary, expected outstanding ops <= tracking sequence number\" */,\n );\n }\n\n return {\n baseSummary: decodedSummary.baseSummary,\n outstandingOps,\n };\n }\n\n public recordChange(op: ISequencedDocumentMessage): void {\n const lastOp = this.outstandingOps[this.outstandingOps.length - 1];\n if (lastOp !== undefined) {\n assert(\n lastOp.sequenceNumber < op.sequenceNumber,\n 0x1aa /* `Out of order change recorded: ${lastOp.sequenceNumber} > ${op.sequenceNumber}` */,\n );\n }\n this.invalidate(op.sequenceNumber);\n this.trackingSequenceNumber = op.sequenceNumber;\n this.outstandingOps.push(op);\n }\n\n public invalidate(sequenceNumber: number): void {\n if (sequenceNumber > this._changeSequenceNumber) {\n this._changeSequenceNumber = sequenceNumber;\n }\n }\n\n /**\n * True if a change has been recorded with sequence number exceeding\n * the latest successfully acked summary reference sequence number.\n * False implies that the previous summary can be reused.\n */\n protected hasChanged(): boolean {\n return this._changeSequenceNumber > this.referenceSequenceNumber;\n }\n\n public get latestSummary(): Readonly<SummaryNode> | undefined {\n return this._latestSummary;\n }\n\n private readonly canReuseHandle: boolean;\n private readonly throwOnError: boolean;\n /**\n * Sequence number of latest tracked op. This updates during recordChange,\n * but not for invalidate since we don't have the op. If this drifts from\n * changeSequenceNumber and we try to create a differential summary we assert.\n */\n private trackingSequenceNumber: number;\n\n /**\n * Do not call constructor directly.\n * Use createRootSummarizerNode to create root node, or createChild to create child nodes.\n */\n public constructor(\n protected readonly defaultLogger: ITelemetryLogger,\n private readonly summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n config: ISummarizerNodeConfig,\n private _changeSequenceNumber: number,\n /** Undefined means created without summary */\n private _latestSummary?: SummaryNode,\n private readonly initialSummary?: IInitialSummary,\n protected wipSummaryLogger?: ITelemetryLogger,\n ) {\n this.canReuseHandle = config.canReuseHandle ?? true;\n // BUGBUG: Seeing issues with differential summaries.\n // this will disable them, and throw instead\n // while we continue to investigate\n this.throwOnError = true; // config.throwOnFailure ?? false;\n this.trackingSequenceNumber = this._changeSequenceNumber;\n }\n\n public createChild(\n /** Summarize function */\n summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n /** Initial id or path part of this node */\n id: string,\n /**\n * Information needed to create the node.\n * If it is from a base summary, it will assert that a summary has been seen.\n * Attach information if it is created from an attach op.\n */\n createParam: CreateChildSummarizerNodeParam,\n config: ISummarizerNodeConfig = {},\n ): ISummarizerNode {\n assert(!this.children.has(id), 0x1ab /* \"Create SummarizerNode child already exists\" */);\n\n const createDetails: ICreateChildDetails = this.getCreateDetailsForChild(id, createParam);\n const child = new SummarizerNode(\n this.defaultLogger,\n summarizeInternalFn,\n config,\n createDetails.changeSequenceNumber,\n createDetails.latestSummary,\n createDetails.initialSummary,\n this.wipSummaryLogger,\n );\n\n // There may be additional state that has to be updated in this child. For example, if a summary is being\n // tracked, the child's summary tracking state needs to be updated too.\n this.maybeUpdateChildState(child);\n\n this.children.set(id, child);\n return child;\n }\n\n public getChild(id: string): ISummarizerNode | undefined {\n return this.children.get(id);\n }\n\n /**\n * Returns the details needed to create a child node.\n * @param id - Initial id or path part of the child node.\n * @param createParam - Information needed to create the node.\n * @returns the details needed to create the child node.\n */\n protected getCreateDetailsForChild(id: string, createParam: CreateChildSummarizerNodeParam): ICreateChildDetails {\n let initialSummary: IInitialSummary | undefined;\n let latestSummary: SummaryNode | undefined;\n let changeSequenceNumber: number;\n\n const parentLatestSummary = this._latestSummary;\n switch (createParam.type) {\n case CreateSummarizerNodeSource.FromAttach: {\n if (\n parentLatestSummary !== undefined\n && createParam.sequenceNumber <= parentLatestSummary.referenceSequenceNumber\n ) {\n // Prioritize latest summary if it was after this node was attached.\n latestSummary = parentLatestSummary.createForChild(id);\n } else {\n const summary = convertToSummaryTree(createParam.snapshot) as ISummaryTreeWithStats;\n initialSummary = {\n sequenceNumber: createParam.sequenceNumber,\n id,\n summary,\n };\n }\n changeSequenceNumber = createParam.sequenceNumber;\n break;\n }\n case CreateSummarizerNodeSource.FromSummary: {\n if (this.initialSummary === undefined) {\n assert(\n !!parentLatestSummary,\n 0x1ac /* \"Cannot create child from summary if parent does not have latest summary\" */);\n }\n // fallthrough to local\n }\n case CreateSummarizerNodeSource.Local: {\n const parentInitialSummary = this.initialSummary;\n if (parentInitialSummary !== undefined) {\n let childSummary: SummaryObject | undefined;\n if (parentInitialSummary.summary !== undefined) {\n const { childrenTree } = parseSummaryTreeForSubtrees(parentInitialSummary.summary.summary);\n assert(\n childrenTree.type === SummaryType.Tree,\n 0x1d6 /* \"Parent summary object is not a tree\" */,\n );\n childSummary = childrenTree.tree[id];\n }\n if (createParam.type === CreateSummarizerNodeSource.FromSummary) {\n // Locally created would not have differential subtree.\n assert(!!childSummary, 0x1ad /* \"Missing child summary tree\" */);\n }\n let childSummaryWithStats: ISummaryTreeWithStats | undefined;\n if (childSummary !== undefined) {\n assert(\n childSummary.type === SummaryType.Tree,\n 0x1ae /* \"Child summary object is not a tree\" */,\n );\n childSummaryWithStats = {\n summary: childSummary,\n stats: calculateStats(childSummary),\n };\n }\n initialSummary = {\n sequenceNumber: parentInitialSummary.sequenceNumber,\n id,\n summary: childSummaryWithStats,\n };\n }\n latestSummary = parentLatestSummary?.createForChild(id);\n changeSequenceNumber = parentLatestSummary?.referenceSequenceNumber ?? -1;\n break;\n }\n default: {\n const type = (createParam as unknown as CreateChildSummarizerNodeParam).type;\n unreachableCase(createParam, `Unexpected CreateSummarizerNodeSource: ${type}`);\n }\n }\n\n return {\n initialSummary,\n latestSummary,\n changeSequenceNumber,\n };\n }\n\n /**\n * Updates the state of the child if required. For example, if a summary is currently being tracked, the child's\n * summary tracking state needs to be updated too.\n * @param child - The child node whose state is to be updated.\n */\n protected maybeUpdateChildState(child: SummarizerNode) {\n // If we are tracking a summary, this child was created after the tracking started. So, we need to update the\n // child's tracking state as well.\n if (this.isTrackingInProgress()) {\n child.wipReferenceSequenceNumber = this.wipReferenceSequenceNumber;\n }\n }\n\n /**\n * Tells whether summary tracking is in progress. True if \"startSummary\" API is called before summarize.\n */\n protected isTrackingInProgress(): boolean {\n return this.wipReferenceSequenceNumber !== undefined;\n }\n}\n\n/**\n * Creates a root summarizer node.\n * @param logger - Logger to use within SummarizerNode\n * @param summarizeInternalFn - Function to generate summary\n * @param changeSequenceNumber - Sequence number of latest change to new node/subtree\n * @param referenceSequenceNumber - Reference sequence number of last acked summary,\n * or undefined if not loaded from summary\n * @param config - Configure behavior of summarizer node\n */\nexport const createRootSummarizerNode = (\n logger: ITelemetryLogger,\n summarizeInternalFn: (fullTree: boolean) => Promise<ISummarizeInternalResult>,\n changeSequenceNumber: number,\n referenceSequenceNumber: number | undefined,\n config: ISummarizerNodeConfig = {},\n): IRootSummarizerNode => new SummarizerNode(\n logger,\n summarizeInternalFn,\n config,\n changeSequenceNumber,\n referenceSequenceNumber === undefined ? undefined : SummaryNode.createForRoot(referenceSequenceNumber),\n );\n"]}
@@ -46,7 +46,7 @@ class SummaryNode {
46
46
  return new SummaryNode({
47
47
  referenceSequenceNumber,
48
48
  basePath: undefined,
49
- localPath: EscapedPath.create(""),
49
+ localPath: EscapedPath.create(""), // root hard-coded to ""
50
50
  });
51
51
  }
52
52
  /** Summary reference sequence number, i.e. last sequence number seen when it was created */
@@ -146,8 +146,8 @@ function decodeSummary(snapshot, logger) {
146
146
  },
147
147
  };
148
148
  }
149
- common_utils_1.assert(!!outstandingOpsBlob, 0x1af /* "Outstanding ops blob missing, but base summary tree exists" */);
150
- common_utils_1.assert(newBaseSummary !== undefined, 0x1b0 /* "Base summary tree missing, but outstanding ops blob exists" */);
149
+ (0, common_utils_1.assert)(!!outstandingOpsBlob, 0x1af /* "Outstanding ops blob missing, but base summary tree exists" */);
150
+ (0, common_utils_1.assert)(newBaseSummary !== undefined, 0x1b0 /* "Base summary tree missing, but outstanding ops blob exists" */);
151
151
  baseSummary = newBaseSummary;
152
152
  pathParts.push(baseSummaryTreeKey);
153
153
  opsBlobs.unshift(outstandingOpsBlob);