@fluidframework/driver-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 (70) hide show
  1. package/dist/blobAggregationStorage.d.ts.map +1 -1
  2. package/dist/blobAggregationStorage.js +20 -20
  3. package/dist/blobAggregationStorage.js.map +1 -1
  4. package/dist/buildSnapshotTree.js +4 -4
  5. package/dist/buildSnapshotTree.js.map +1 -1
  6. package/dist/documentStorageServiceProxy.js.map +1 -1
  7. package/dist/fluidResolvedUrl.js +1 -1
  8. package/dist/fluidResolvedUrl.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/insecureUrlResolver.js +2 -2
  14. package/dist/insecureUrlResolver.js.map +1 -1
  15. package/dist/multiDocumentServiceFactory.js +4 -4
  16. package/dist/multiDocumentServiceFactory.js.map +1 -1
  17. package/dist/network.d.ts.map +1 -1
  18. package/dist/network.js.map +1 -1
  19. package/dist/networkUtils.js +3 -3
  20. package/dist/networkUtils.js.map +1 -1
  21. package/dist/packageVersion.d.ts +1 -1
  22. package/dist/packageVersion.js +1 -1
  23. package/dist/packageVersion.js.map +1 -1
  24. package/dist/parallelRequests.d.ts.map +1 -1
  25. package/dist/parallelRequests.js +28 -28
  26. package/dist/parallelRequests.js.map +1 -1
  27. package/dist/prefetchDocumentStorageService.js +1 -1
  28. package/dist/prefetchDocumentStorageService.js.map +1 -1
  29. package/dist/rateLimiter.js +1 -1
  30. package/dist/rateLimiter.js.map +1 -1
  31. package/dist/readAndParse.js +1 -1
  32. package/dist/readAndParse.js.map +1 -1
  33. package/dist/runWithRetry.js +3 -3
  34. package/dist/runWithRetry.js.map +1 -1
  35. package/dist/summaryForCreateNew.js.map +1 -1
  36. package/dist/treeConversions.js +2 -2
  37. package/dist/treeConversions.js.map +1 -1
  38. package/dist/treeUtils.d.ts +51 -0
  39. package/dist/treeUtils.d.ts.map +1 -0
  40. package/dist/treeUtils.js +85 -0
  41. package/dist/treeUtils.js.map +1 -0
  42. package/lib/blobAggregationStorage.d.ts.map +1 -1
  43. package/lib/blobAggregationStorage.js.map +1 -1
  44. package/lib/documentStorageServiceProxy.js.map +1 -1
  45. package/lib/index.d.ts +1 -0
  46. package/lib/index.d.ts.map +1 -1
  47. package/lib/index.js +1 -0
  48. package/lib/index.js.map +1 -1
  49. package/lib/insecureUrlResolver.js.map +1 -1
  50. package/lib/network.d.ts.map +1 -1
  51. package/lib/network.js.map +1 -1
  52. package/lib/networkUtils.js.map +1 -1
  53. package/lib/packageVersion.d.ts +1 -1
  54. package/lib/packageVersion.js +1 -1
  55. package/lib/packageVersion.js.map +1 -1
  56. package/lib/parallelRequests.d.ts.map +1 -1
  57. package/lib/parallelRequests.js.map +1 -1
  58. package/lib/runWithRetry.js.map +1 -1
  59. package/lib/summaryForCreateNew.js.map +1 -1
  60. package/lib/treeUtils.d.ts +51 -0
  61. package/lib/treeUtils.d.ts.map +1 -0
  62. package/lib/treeUtils.js +80 -0
  63. package/lib/treeUtils.js.map +1 -0
  64. package/package.json +11 -10
  65. package/src/blobAggregationStorage.ts +5 -7
  66. package/src/index.ts +1 -0
  67. package/src/network.ts +2 -2
  68. package/src/packageVersion.ts +1 -1
  69. package/src/parallelRequests.ts +9 -12
  70. package/src/treeUtils.ts +111 -0
@@ -12,7 +12,7 @@ function logNetworkFailure(logger, event, error) {
12
12
  const errorOnlineProp = error.online;
13
13
  newEvent.online = typeof errorOnlineProp === "string"
14
14
  ? errorOnlineProp
15
- : network_1.OnlineStatus[network_1.isOnline()];
15
+ : network_1.OnlineStatus[(0, network_1.isOnline)()];
16
16
  if (typeof navigator === "object" && navigator !== null) {
17
17
  const nav = navigator;
18
18
  const connection = (_b = (_a = nav.connection) !== null && _a !== void 0 ? _a : nav.mozConnection) !== null && _b !== void 0 ? _b : nav.webkitConnection;
@@ -21,7 +21,7 @@ function logNetworkFailure(logger, event, error) {
21
21
  }
22
22
  }
23
23
  // non-retryable errors are fatal and should be logged as errors
24
- newEvent.category = network_1.canRetryOnError(error) ? "generic" : "error";
24
+ newEvent.category = (0, network_1.canRetryOnError)(error) ? "generic" : "error";
25
25
  logger.sendTelemetryEvent(newEvent, error);
26
26
  }
27
27
  exports.logNetworkFailure = logNetworkFailure;
@@ -42,7 +42,7 @@ function waitForConnectedState(minDelay) {
42
42
  return new Promise((resolve) => {
43
43
  let listener = resolve;
44
44
  let delay = minDelay;
45
- if (network_1.isOnline() === network_1.OnlineStatus.Offline) {
45
+ if ((0, network_1.isOnline)() === network_1.OnlineStatus.Offline) {
46
46
  if ((window === null || window === void 0 ? void 0 : window.addEventListener) !== undefined) {
47
47
  listener = () => {
48
48
  resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"networkUtils.js","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,uCAAoE;AAEpE,SAAgB,iBAAiB,CAAC,MAAwB,EAAE,KAA2B,EAAE,KAAW;;IAChG,MAAM,QAAQ,qBAAQ,KAAK,CAAE,CAAC;IAE9B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,GAAG,OAAO,eAAe,KAAK,QAAQ;QACjD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,sBAAY,CAAC,kBAAQ,EAAE,CAAC,CAAC;IAE/B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,SAAgB,CAAC;QAC7B,MAAM,UAAU,eAAG,GAAG,CAAC,UAAU,mCAAI,GAAG,CAAC,aAAa,mCAAI,GAAG,CAAC,gBAAgB,CAAC;QAC/E,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YACvD,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;SAC7C;KACJ;IAED,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,GAAG,yBAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAnBD,8CAmBC;AAED;;;;;;;;GAQG;AACH,qEAAqE;AACrE,SAAgB,qBAAqB,CAAC,QAAgB;IAClD,gGAAgG;IAChG,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,KAAK,CAAC;IAEnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,QAAQ,GAAe,OAAO,CAAC;QACnC,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,IAAI,kBAAQ,EAAE,KAAK,sBAAY,CAAC,OAAO,EAAE;YACrC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,MAAK,SAAS,EAAE;gBACxC,QAAQ,GAAG,GAAG,EAAE;oBACZ,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACnD,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACnD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;aACpD;SACJ;QACD,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC;AApBD,sDAoBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryErrorEvent, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { isOnline, OnlineStatus, canRetryOnError } from \"./network\";\n\nexport function logNetworkFailure(logger: ITelemetryLogger, event: ITelemetryErrorEvent, error?: any) {\n const newEvent = { ...event };\n\n const errorOnlineProp = error.online;\n newEvent.online = typeof errorOnlineProp === \"string\"\n ? errorOnlineProp\n : OnlineStatus[isOnline()];\n\n if (typeof navigator === \"object\" && navigator !== null) {\n const nav = navigator as any;\n const connection = nav.connection ?? nav.mozConnection ?? nav.webkitConnection;\n if (connection !== null && typeof connection === \"object\") {\n newEvent.connectionType = connection.type;\n }\n }\n\n // non-retryable errors are fatal and should be logged as errors\n newEvent.category = canRetryOnError(error) ? \"generic\" : \"error\";\n logger.sendTelemetryEvent(newEvent, error);\n}\n\n/**\n * Wait for browser to get to connected state.\n * If connected, waits minimum of minDelay anyway (between network retries)\n * If disconnected, polls every 30 seconds anyway, to make sure we are not getting stuck because of wrong signal\n * Note that browsers will have false positives (like having Hyper-V adapter on machine,\n * or machine connected to router that is not connected to internet)\n * But there should be no false negatives.\n * The only exception - Opera returns false when user enters \"Work Offline\" mode, regardless of actual connectivity.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async\nexport function waitForConnectedState(minDelay: number): Promise<void> {\n // Use this frequency to poll even when we are offline and able to setup online/offline listener\n // This is mostly safety net\n const offlinePollFrequency = 30000;\n\n return new Promise((resolve) => {\n let listener: () => void = resolve;\n let delay = minDelay;\n if (isOnline() === OnlineStatus.Offline) {\n if (window?.addEventListener !== undefined) {\n listener = () => {\n resolve();\n window.removeEventListener(\"online\", listener);\n };\n window.addEventListener(\"online\", listener, false);\n delay = Math.max(minDelay, offlinePollFrequency);\n }\n }\n setTimeout(listener, delay);\n });\n}\n"]}
1
+ {"version":3,"file":"networkUtils.js","sourceRoot":"","sources":["../src/networkUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,uCAAoE;AAEpE,SAAgB,iBAAiB,CAAC,MAAwB,EAAE,KAA2B,EAAE,KAAW;;IAChG,MAAM,QAAQ,qBAAQ,KAAK,CAAE,CAAC;IAE9B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,GAAG,OAAO,eAAe,KAAK,QAAQ;QACjD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,sBAAY,CAAC,IAAA,kBAAQ,GAAE,CAAC,CAAC;IAE/B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,SAAgB,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAA,MAAA,GAAG,CAAC,UAAU,mCAAI,GAAG,CAAC,aAAa,mCAAI,GAAG,CAAC,gBAAgB,CAAC;QAC/E,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YACvD,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;SAC7C;KACJ;IAED,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,GAAG,IAAA,yBAAe,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAnBD,8CAmBC;AAED;;;;;;;;GAQG;AACH,qEAAqE;AACrE,SAAgB,qBAAqB,CAAC,QAAgB;IAClD,gGAAgG;IAChG,4BAA4B;IAC5B,MAAM,oBAAoB,GAAG,KAAK,CAAC;IAEnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,QAAQ,GAAe,OAAO,CAAC;QACnC,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,IAAI,IAAA,kBAAQ,GAAE,KAAK,sBAAY,CAAC,OAAO,EAAE;YACrC,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,MAAK,SAAS,EAAE;gBACxC,QAAQ,GAAG,GAAG,EAAE;oBACZ,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACnD,CAAC,CAAC;gBACF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACnD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;aACpD;SACJ;QACD,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC;AApBD,sDAoBC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryErrorEvent, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { isOnline, OnlineStatus, canRetryOnError } from \"./network\";\n\nexport function logNetworkFailure(logger: ITelemetryLogger, event: ITelemetryErrorEvent, error?: any) {\n const newEvent = { ...event };\n\n const errorOnlineProp = error.online;\n newEvent.online = typeof errorOnlineProp === \"string\"\n ? errorOnlineProp\n : OnlineStatus[isOnline()];\n\n if (typeof navigator === \"object\" && navigator !== null) {\n const nav = navigator as any;\n const connection = nav.connection ?? nav.mozConnection ?? nav.webkitConnection;\n if (connection !== null && typeof connection === \"object\") {\n newEvent.connectionType = connection.type;\n }\n }\n\n // non-retryable errors are fatal and should be logged as errors\n newEvent.category = canRetryOnError(error) ? \"generic\" : \"error\";\n logger.sendTelemetryEvent(newEvent, error);\n}\n\n/**\n * Wait for browser to get to connected state.\n * If connected, waits minimum of minDelay anyway (between network retries)\n * If disconnected, polls every 30 seconds anyway, to make sure we are not getting stuck because of wrong signal\n * Note that browsers will have false positives (like having Hyper-V adapter on machine,\n * or machine connected to router that is not connected to internet)\n * But there should be no false negatives.\n * The only exception - Opera returns false when user enters \"Work Offline\" mode, regardless of actual connectivity.\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async\nexport function waitForConnectedState(minDelay: number): Promise<void> {\n // Use this frequency to poll even when we are offline and able to setup online/offline listener\n // This is mostly safety net\n const offlinePollFrequency = 30000;\n\n return new Promise((resolve) => {\n let listener: () => void = resolve;\n let delay = minDelay;\n if (isOnline() === OnlineStatus.Offline) {\n if (window?.addEventListener !== undefined) {\n listener = () => {\n resolve();\n window.removeEventListener(\"online\", listener);\n };\n window.addEventListener(\"online\", listener, false);\n delay = Math.max(minDelay, offlinePollFrequency);\n }\n }\n setTimeout(listener, delay);\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/driver-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/driver-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,8BAA8B,CAAC;AACzC,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/driver-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,8BAA8B,CAAC;AACzC,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/driver-utils\";\nexport const pkgVersion = \"0.59.3000-66610\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parallelRequests.d.ts","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAWhG;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB,CAAC,CAAC;IAevB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAMhC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAvBrC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,OAAO,KAAK,OAAO,GAA8C;IACjE,IAAW,QAAQ,YAA+C;gBAG9D,IAAI,EAAE,MAAM,EACJ,EAAE,EAAE,MAAM,GAAG,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,EAC/E,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI;IAOtD,MAAM;IAOA,GAAG,CAAC,WAAW,EAAE,MAAM;IAapC,OAAO,CAAC,IAAI;IAUZ,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,QAAQ;IA6BhB,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,UAAU;YAQJ,cAAc;CA4I/B;AAED;;;GAGG;AACH,qBAAa,KAAK,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,IAAI,CAAS;IAEd,SAAS,CAAC,KAAK,EAAE,CAAC;IAIlB,SAAS,CAAC,KAAK,EAAE,GAAG;IAKpB,QAAQ;IAKf,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAWtC,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAUjD;AAuGD,wBAAgB,UAAU,CACtB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,oBAAoB,KAAK,OAAO,CAAC,kBAAkB,CAAC,EACpG,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,gBAAgB,EACxB,MAAM,CAAC,EAAE,WAAW,EACpB,WAAW,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAsFtC;AAED,eAAO,MAAM,kBAAkB,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAEnE,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC,yBAAyB,EAAE,CAAC,GAChF,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAavC;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAQ5G"}
1
+ {"version":3,"file":"parallelRequests.d.ts","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":"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"}
@@ -50,8 +50,8 @@ class ParallelRequests {
50
50
  }
51
51
  }
52
52
  async run(concurrency) {
53
- common_utils_1.assert(concurrency > 0, 0x102 /* "invalid level of concurrency" */);
54
- common_utils_1.assert(this.working, 0x103 /* "trying to parallel run while not working" */);
53
+ (0, common_utils_1.assert)(concurrency > 0, 0x102 /* "invalid level of concurrency" */);
54
+ (0, common_utils_1.assert)(this.working, 0x103 /* "trying to parallel run while not working" */);
55
55
  let c = concurrency;
56
56
  while (c > 0) {
57
57
  c--;
@@ -62,8 +62,8 @@ class ParallelRequests {
62
62
  }
63
63
  done() {
64
64
  // We should satisfy request fully.
65
- common_utils_1.assert(this.to !== undefined, 0x104 /* "undefined end point for parallel fetch" */);
66
- common_utils_1.assert(this.nextToDeliver >= this.to, 0x105 /* "unexpected end point for parallel fetch" */);
65
+ (0, common_utils_1.assert)(this.to !== undefined, 0x104 /* "undefined end point for parallel fetch" */);
66
+ (0, common_utils_1.assert)(this.nextToDeliver >= this.to, 0x105 /* "unexpected end point for parallel fetch" */);
67
67
  if (this.working) {
68
68
  this.workingState = "done";
69
69
  this.endEvent.resolve();
@@ -82,7 +82,7 @@ class ParallelRequests {
82
82
  break;
83
83
  }
84
84
  this.results.delete(this.nextToDeliver);
85
- common_utils_1.assert(value.length <= this.payloadSize, 0x1d9 /* "addRequestCore() should break into smaller chunks" */);
85
+ (0, common_utils_1.assert)(value.length <= this.payloadSize, 0x1d9 /* "addRequestCore() should break into smaller chunks" */);
86
86
  this.nextToDeliver += value.length;
87
87
  this.responseCallback(value);
88
88
  }
@@ -91,13 +91,13 @@ class ParallelRequests {
91
91
  if (this.requestsInFlight === 0) {
92
92
  // we should have dispatched everything, no matter whether we knew about the end or not.
93
93
  // see comment in addRequestCore() around throwing away chunk if it's above this.to
94
- common_utils_1.assert(this.results.size === 0, 0x107 /* "ending dispatch with remaining results to be sent" */);
94
+ (0, common_utils_1.assert)(this.results.size === 0, 0x107 /* "ending dispatch with remaining results to be sent" */);
95
95
  this.done();
96
96
  }
97
97
  else if (this.to !== undefined && this.nextToDeliver >= this.to) {
98
98
  // Learned about the end and dispatched all the ops up to it.
99
99
  // Ignore all the in-flight requests above boundary - unblock caller sooner.
100
- common_utils_1.assert(!this.knewTo, 0x108 /* "ending results dispatch but knew in advance about more requests" */);
100
+ (0, common_utils_1.assert)(!this.knewTo, 0x108 /* "ending results dispatch but knew in advance about more requests" */);
101
101
  this.done();
102
102
  }
103
103
  }
@@ -118,7 +118,7 @@ class ParallelRequests {
118
118
  if (this.to !== undefined) {
119
119
  this.latestRequested = Math.min(this.to, this.latestRequested);
120
120
  }
121
- common_utils_1.assert(from < this.latestRequested, 0x109 /* "unexpected next chunk position" */);
121
+ (0, common_utils_1.assert)(from < this.latestRequested, 0x109 /* "unexpected next chunk position" */);
122
122
  return { from, to: this.latestRequested };
123
123
  }
124
124
  addRequest() {
@@ -129,18 +129,18 @@ class ParallelRequests {
129
129
  this.addRequestCore(chunk.from, chunk.to).catch(this.fail.bind(this));
130
130
  }
131
131
  async addRequestCore(fromArg, toArg) {
132
- common_utils_1.assert(this.working, 0x10a /* "cannot add parallel request while not working" */);
132
+ (0, common_utils_1.assert)(this.working, 0x10a /* "cannot add parallel request while not working" */);
133
133
  let from = fromArg;
134
134
  let to = toArg;
135
135
  // to & from are exclusive
136
136
  this.requestsInFlight++;
137
137
  while (this.working) {
138
138
  const requestedLength = to - from;
139
- common_utils_1.assert(requestedLength > 0, 0x10b /* "invalid parallel request range" */);
139
+ (0, common_utils_1.assert)(requestedLength > 0, 0x10b /* "invalid parallel request range" */);
140
140
  // We should not be wasting time asking for something useless.
141
141
  if (this.to !== undefined) {
142
- common_utils_1.assert(from < this.to, 0x10c /* "invalid parallel request start point" */);
143
- common_utils_1.assert(to <= this.to, 0x10d /* "invalid parallel request end point" */);
142
+ (0, common_utils_1.assert)(from < this.to, 0x10c /* "invalid parallel request start point" */);
143
+ (0, common_utils_1.assert)(to <= this.to, 0x10d /* "invalid parallel request end point" */);
144
144
  }
145
145
  this.requests++;
146
146
  const promise = this.requestCallback(this.requests, from, to, this.to !== undefined, {});
@@ -157,7 +157,7 @@ class ParallelRequests {
157
157
  // While it's useful not to throw this result, this is very corner cases and makes logic
158
158
  // (including consistency checks) much harder to write correctly.
159
159
  // So for now, we are throwing this result out the window.
160
- common_utils_1.assert(!this.knewTo, 0x10e /* "should not throw result if we knew about boundary in advance" */);
160
+ (0, common_utils_1.assert)(!this.knewTo, 0x10e /* "should not throw result if we knew about boundary in advance" */);
161
161
  // Learn how often it happens and if it's too wasteful to throw these chunks.
162
162
  // If it pops into our view a lot, we would need to reconsider how we approach it.
163
163
  // Note that this is not visible to user other than potentially not hitting 100% of
@@ -207,8 +207,8 @@ class ParallelRequests {
207
207
  // This is very specific property of storage / ops, so this logic is not here, but given only
208
208
  // one user of this class, we assert that to catch issues earlier.
209
209
  // These invariant can be relaxed if needed.
210
- common_utils_1.assert(!partial, 0x10f /* "empty/partial chunks should not be returned by caching" */);
211
- common_utils_1.assert(!this.knewTo, 0x110 /* "callback should retry until valid fetch before it learns new boundary" */);
210
+ (0, common_utils_1.assert)(!partial, 0x10f /* "empty/partial chunks should not be returned by caching" */);
211
+ (0, common_utils_1.assert)(!this.knewTo, 0x110 /* "callback should retry until valid fetch before it learns new boundary" */);
212
212
  }
213
213
  if (!partial && !fullChunk) {
214
214
  if (!this.knewTo) {
@@ -277,9 +277,9 @@ class Queue {
277
277
  this.done = true;
278
278
  }
279
279
  pushCore(value) {
280
- common_utils_1.assert(!this.done, 0x112 /* "cannot push onto queue if done" */);
280
+ (0, common_utils_1.assert)(!this.done, 0x112 /* "cannot push onto queue if done" */);
281
281
  if (this.deferred) {
282
- common_utils_1.assert(this.queue.length === 0, 0x113 /* "deferred queue should be empty" */);
282
+ (0, common_utils_1.assert)(this.queue.length === 0, 0x113 /* "deferred queue should be empty" */);
283
283
  this.deferred.resolve(value);
284
284
  this.deferred = undefined;
285
285
  }
@@ -288,12 +288,12 @@ class Queue {
288
288
  }
289
289
  }
290
290
  async read() {
291
- common_utils_1.assert(this.deferred === undefined, 0x114 /* "cannot pop if deferred" */);
291
+ (0, common_utils_1.assert)(this.deferred === undefined, 0x114 /* "cannot pop if deferred" */);
292
292
  const value = this.queue.shift();
293
293
  if (value !== undefined) {
294
294
  return value;
295
295
  }
296
- common_utils_1.assert(!this.done, 0x115 /* "queue should not be done during pop" */);
296
+ (0, common_utils_1.assert)(!this.done, 0x115 /* "queue should not be done during pop" */);
297
297
  this.deferred = new common_utils_1.Deferred();
298
298
  return this.deferred.promise;
299
299
  }
@@ -338,18 +338,18 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, fetchReaso
338
338
  // then give up after some time. This likely indicates the issue with ordering service not flushing
339
339
  // ops to storage quick enough, and possibly waiting for summaries, while summarizer can't get
340
340
  // current as it can't get ops.
341
- throw network_1.createGenericNetworkError(
341
+ throw (0, network_1.createGenericNetworkError)(
342
342
  // pre-0.58 error message: failedToRetrieveOpsFromStorage:TooManyRetries
343
343
  "Failed to retrieve ops from storage (Too Many Retries)", { canRetry: false }, Object.assign({ retry,
344
344
  driverVersion: packageVersion_1.pkgVersion }, props));
345
345
  }
346
346
  }
347
347
  catch (error) {
348
- const canRetry = network_1.canRetryOnError(error);
348
+ const canRetry = (0, network_1.canRetryOnError)(error);
349
349
  lastSuccessTime = undefined;
350
- const retryAfter = network_1.getRetryDelayFromError(error);
350
+ const retryAfter = (0, network_1.getRetryDelayFromError)(error);
351
351
  // This will log to error table only if the error is non-retryable
352
- networkUtils_1.logNetworkFailure(logger, Object.assign(Object.assign({ eventName: "GetDeltas_Error" }, props), { retry, duration: common_utils_1.performance.now() - startTime, retryAfter,
352
+ (0, networkUtils_1.logNetworkFailure)(logger, Object.assign(Object.assign({ eventName: "GetDeltas_Error" }, props), { retry, duration: common_utils_1.performance.now() - startTime, retryAfter,
353
353
  fetchReason }), error);
354
354
  if (!canRetry) {
355
355
  // It's game over scenario.
@@ -359,7 +359,7 @@ async function getSingleOpBatch(get, props, strongTo, logger, signal, fetchReaso
359
359
  delay = retryAfter;
360
360
  }
361
361
  }
362
- await networkUtils_1.waitForConnectedState(delay);
362
+ await (0, networkUtils_1.waitForConnectedState)(delay);
363
363
  }
364
364
  return nothing;
365
365
  }
@@ -379,13 +379,13 @@ function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, logger, s
379
379
  }, (deltas) => {
380
380
  // Assert continuing and right start.
381
381
  if (lastFetch === undefined) {
382
- common_utils_1.assert(deltas[0].sequenceNumber === fromTotal, 0x26d /* "wrong start" */);
382
+ (0, common_utils_1.assert)(deltas[0].sequenceNumber === fromTotal, 0x26d /* "wrong start" */);
383
383
  }
384
384
  else {
385
- common_utils_1.assert(deltas[0].sequenceNumber === lastFetch + 1, 0x26e /* "wrong start" */);
385
+ (0, common_utils_1.assert)(deltas[0].sequenceNumber === lastFetch + 1, 0x26e /* "wrong start" */);
386
386
  }
387
387
  lastFetch = deltas[deltas.length - 1].sequenceNumber;
388
- common_utils_1.assert(lastFetch - deltas[0].sequenceNumber + 1 === deltas.length, 0x26f /* "continuous and no duplicates" */);
388
+ (0, common_utils_1.assert)(lastFetch - deltas[0].sequenceNumber + 1 === deltas.length, 0x26f /* "continuous and no duplicates" */);
389
389
  length += deltas.length;
390
390
  queue.pushValue(deltas);
391
391
  });
@@ -412,7 +412,7 @@ function requestOps(get, concurrency, fromTotal, toTotal, payloadSize, logger, s
412
412
  telemetryEvent.cancel(Object.assign(Object.assign({}, props), { error: "ops request cancelled by client" }));
413
413
  }
414
414
  else {
415
- common_utils_1.assert(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1, 0x270 /* "All requested ops fetched" */);
415
+ (0, common_utils_1.assert)(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1, 0x270 /* "All requested ops fetched" */);
416
416
  telemetryEvent.end(props);
417
417
  }
418
418
  queue.pushDone();
@@ -1 +1 @@
1
- {"version":3,"file":"parallelRequests.js","sourceRoot":"","sources":["../src/parallelRequests.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 { assert, Deferred, performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { PerformanceEvent} from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IDeltasFetchResult, IStream, IStreamResult } from \"@fluidframework/driver-definitions\";\nimport { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from \"./network\";\nimport { waitForConnectedState, logNetworkFailure } from \"./networkUtils\";\n// For now, this package is versioned and released in unison with the specific drivers\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\nconst MaxFetchDelayInMs = 10000;\nconst MissingFetchDelayInMs = 100;\n\ntype WorkingState = \"working\" | \"done\" | \"canceled\";\n\n/**\n * Helper class to organize parallel fetching of data\n * It can be used to concurrently do many requests, while consuming\n * data in the right order. Take a look at UT for examples.\n * @param concurrency - level of concurrency\n * @param from - starting point of fetching data (inclusive)\n * @param to - ending point of fetching data. exclusive, or undefined if unknown\n * @param payloadSize - batch size\n * @param logger - logger to use\n * @param requestCallback - callback to request batches\n * @returns - Queue that can be used to retrieve data\n */\nexport class ParallelRequests<T> {\n private latestRequested: number;\n private nextToDeliver: number;\n private readonly results: Map<number, T[]> = new Map();\n private workingState: WorkingState = \"working\";\n private requestsInFlight = 0;\n private readonly endEvent = new Deferred<void>();\n private requests = 0;\n private readonly knewTo: boolean;\n\n private get working() { return this.workingState === \"working\"; }\n public get canceled() { return this.workingState === \"canceled\"; }\n\n constructor(\n from: number,\n private to: number | undefined,\n private readonly payloadSize: number,\n private readonly logger: ITelemetryLogger,\n private readonly requestCallback: (\n request: number,\n from: number,\n to: number,\n strongTo: boolean,\n props: ITelemetryProperties) => Promise<{ partial: boolean, cancel: boolean, payload: T[] }>,\n private readonly responseCallback: (payload: T[]) => void)\n {\n this.latestRequested = from;\n this.nextToDeliver = from;\n this.knewTo = (to !== undefined);\n }\n\n public cancel() {\n if (this.working) {\n this.workingState = \"canceled\";\n this.endEvent.resolve();\n }\n }\n\n public async run(concurrency: number) {\n assert(concurrency > 0, 0x102 /* \"invalid level of concurrency\" */);\n assert(this.working, 0x103 /* \"trying to parallel run while not working\" */);\n\n let c = concurrency;\n while (c > 0) {\n c--;\n this.addRequest();\n }\n this.dispatch();// will recalculate and trigger this.endEvent if needed\n return this.endEvent.promise;\n }\n\n private done() {\n // We should satisfy request fully.\n assert(this.to !== undefined, 0x104 /* \"undefined end point for parallel fetch\" */);\n assert(this.nextToDeliver >= this.to, 0x105 /* \"unexpected end point for parallel fetch\" */);\n if (this.working) {\n this.workingState = \"done\";\n this.endEvent.resolve();\n }\n }\n\n private fail(error) {\n if (this.working) {\n this.workingState = \"done\";\n this.endEvent.reject(error);\n }\n }\n\n private dispatch() {\n while (this.working) {\n const value = this.results.get(this.nextToDeliver);\n if (value === undefined) {\n break;\n }\n this.results.delete(this.nextToDeliver);\n assert(value.length <= this.payloadSize, 0x1d9 /* \"addRequestCore() should break into smaller chunks\" */);\n this.nextToDeliver += value.length;\n this.responseCallback(value);\n }\n\n // Account for cancellation - state might be not in consistent state on cancelling operation\n if (this.working) {\n if (this.requestsInFlight === 0) {\n // we should have dispatched everything, no matter whether we knew about the end or not.\n // see comment in addRequestCore() around throwing away chunk if it's above this.to\n assert(this.results.size === 0,\n 0x107 /* \"ending dispatch with remaining results to be sent\" */);\n this.done();\n } else if (this.to !== undefined && this.nextToDeliver >= this.to) {\n // Learned about the end and dispatched all the ops up to it.\n // Ignore all the in-flight requests above boundary - unblock caller sooner.\n assert(!this.knewTo, 0x108 /* \"ending results dispatch but knew in advance about more requests\" */);\n this.done();\n }\n }\n }\n\n private getNextChunk() {\n if (!this.working) {\n return undefined;\n }\n\n const from = this.latestRequested;\n if (this.to !== undefined) {\n if (this.to <= from) {\n return undefined;\n }\n }\n\n // this.latestRequested\n // inclusive on the right side! Exclusive on the left.\n this.latestRequested += this.payloadSize;\n\n if (this.to !== undefined) {\n this.latestRequested = Math.min(this.to, this.latestRequested);\n }\n\n assert(from < this.latestRequested, 0x109 /* \"unexpected next chunk position\" */);\n\n return { from, to: this.latestRequested};\n }\n\n private addRequest() {\n const chunk = this.getNextChunk();\n if (chunk === undefined) {\n return;\n }\n this.addRequestCore(chunk.from, chunk.to).catch(this.fail.bind(this));\n }\n\n private async addRequestCore(fromArg: number, toArg: number) {\n assert(this.working, 0x10a /* \"cannot add parallel request while not working\" */);\n\n let from = fromArg;\n let to = toArg;\n\n // to & from are exclusive\n this.requestsInFlight++;\n while (this.working) {\n const requestedLength = to - from;\n assert(requestedLength > 0, 0x10b /* \"invalid parallel request range\" */);\n\n // We should not be wasting time asking for something useless.\n if (this.to !== undefined) {\n assert(from < this.to, 0x10c /* \"invalid parallel request start point\" */);\n assert(to <= this.to, 0x10d /* \"invalid parallel request end point\" */);\n }\n\n this.requests++;\n\n const promise = this.requestCallback(this.requests, from, to, this.to !== undefined, {});\n\n // dispatch any prior received data\n this.dispatch();\n\n const { payload, cancel, partial } = await promise;\n\n if (cancel) {\n this.cancel();\n }\n\n if (this.to !== undefined && from >= this.to) {\n // while we were waiting for response, we learned on what is the boundary\n // We can get here (with actual result!) if situation changed while this request was in\n // flight, i.e. the end was extended over what we learn in some other request\n // While it's useful not to throw this result, this is very corner cases and makes logic\n // (including consistency checks) much harder to write correctly.\n // So for now, we are throwing this result out the window.\n assert(!this.knewTo, 0x10e /* \"should not throw result if we knew about boundary in advance\" */);\n // Learn how often it happens and if it's too wasteful to throw these chunks.\n // If it pops into our view a lot, we would need to reconsider how we approach it.\n // Note that this is not visible to user other than potentially not hitting 100% of\n // what we can in perf domain.\n if (payload.length !== 0) {\n this.logger.sendErrorEvent({\n eventName: \"ParallelRequests_GotExtra\",\n from,\n to,\n end: this.to,\n length: payload.length,\n });\n }\n\n break;\n }\n\n if (this.working) {\n const fromOrig = from;\n const length = payload.length;\n let fullChunk = (requestedLength <= length); // we can possible get more than we asked.\n\n if (length !== 0) {\n // We can get more than we asked for!\n // This can screw up logic in dispatch!\n // So push only batch size, and keep the rest for later - if conditions are favorable, we\n // will be able to use it. If not (parallel request overlapping these ops), it's easier to\n // discard them and wait for another (overlapping) request to come in later.\n if (requestedLength < length) {\n // This is error in a sense that it's not expected and likely points bug in other layer.\n // This layer copes with this situation just fine.\n this.logger.sendTelemetryEvent({\n eventName: \"ParallelRequests_Over\",\n from,\n to,\n length,\n });\n }\n const data = payload.splice(0, requestedLength);\n this.results.set(from, data);\n from += data.length;\n } else {\n // 1. empty (partial) chunks should not be returned by various caching / adapter layers -\n // they should fall back to next layer. This might be important invariant to hold to ensure\n // that we are less likely have bugs where such layer would keep returning empty partial\n // result on each call.\n // 2. Current invariant is that callback does retries until it gets something,\n // with the goal of failing if zero data is retrieved in given amount of time.\n // This is very specific property of storage / ops, so this logic is not here, but given only\n // one user of this class, we assert that to catch issues earlier.\n // These invariant can be relaxed if needed.\n assert(!partial, 0x10f /* \"empty/partial chunks should not be returned by caching\" */);\n assert(!this.knewTo,\n 0x110 /* \"callback should retry until valid fetch before it learns new boundary\" */);\n }\n\n if (!partial && !fullChunk) {\n if (!this.knewTo) {\n if (this.to === undefined || this.to > from) {\n // The END\n this.to = from;\n }\n break;\n }\n // We know that there are more items to be retrieved\n // Can we get partial chunk? Ideally storage indicates that's not a full chunk\n // Note that it's possible that not all ops hit storage yet.\n // We will come back to request more, and if we can't get any more ops soon, it's\n // catastrophic failure (see comment above on responsibility of callback to return something)\n // This layer will just keep trying until it gets full set.\n this.logger.sendPerformanceEvent({\n eventName: \"ParallelRequests_Partial\",\n from: fromOrig,\n to,\n length,\n });\n }\n\n if (to === this.latestRequested) {\n // we can go after full chunk at the end if we received partial chunk, or more than asked\n // Also if we got more than we asked to, we can actually use those ops!\n if (payload.length !== 0) {\n this.results.set(from, payload);\n from += payload.length;\n }\n\n this.latestRequested = from;\n fullChunk = true;\n }\n\n if (fullChunk) {\n const chunk = this.getNextChunk();\n if (chunk === undefined) { break; }\n from = chunk.from;\n to = chunk.to;\n }\n }\n }\n this.requestsInFlight--;\n this.dispatch();\n }\n}\n\n/**\n * Helper queue class to allow async push / pull\n * It's essentially a pipe allowing multiple writers, and single reader\n */\nexport class Queue<T> implements IStream<T> {\n private readonly queue: Promise<IStreamResult<T>>[] = [];\n private deferred: Deferred<IStreamResult<T>> | undefined;\n private done = false;\n\n public pushValue(value: T) {\n this.pushCore(Promise.resolve({ done: false, value }));\n }\n\n public pushError(error: any) {\n this.pushCore(Promise.reject(error));\n this.done = true;\n }\n\n public pushDone() {\n this.pushCore(Promise.resolve({ done: true }));\n this.done = true;\n }\n\n protected pushCore(value: Promise<IStreamResult<T>>) {\n assert(!this.done, 0x112 /* \"cannot push onto queue if done\" */);\n if (this.deferred) {\n assert(this.queue.length === 0, 0x113 /* \"deferred queue should be empty\" */);\n this.deferred.resolve(value);\n this.deferred = undefined;\n } else {\n this.queue.push(value);\n }\n }\n\n public async read(): Promise<IStreamResult<T>> {\n assert(this.deferred === undefined, 0x114 /* \"cannot pop if deferred\" */);\n const value = this.queue.shift();\n if (value !== undefined) {\n return value;\n }\n assert(!this.done, 0x115 /* \"queue should not be done during pop\" */);\n this.deferred = new Deferred<IStreamResult<T>>();\n return this.deferred.promise;\n }\n}\n\n/**\n * Retrieve single batch of ops\n * @param request - request index\n * @param from - inclusive boundary\n * @param to - exclusive boundary\n * @param telemetryEvent - telemetry event used to track consecutive batch of requests\n * @param strongTo - tells if ops in range from...to have to be there and have to be retrieved.\n * If false, returning less ops would mean we reached end of file.\n * @returns - an object with resulting ops and cancellation / partial result flags\n */\nasync function getSingleOpBatch(\n get: (telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>,\n props: ITelemetryProperties,\n strongTo: boolean,\n logger: ITelemetryLogger,\n signal?: AbortSignal,\n fetchReason?: string):\n Promise<{ partial: boolean, cancel: boolean, payload: ISequencedDocumentMessage[] }>\n{\n let lastSuccessTime: number | undefined;\n\n let retry: number = 0;\n const deltas: ISequencedDocumentMessage[] = [];\n const nothing = { partial: false, cancel: true, payload: []};\n\n while (signal?.aborted !== true) {\n retry++;\n let delay = Math.min(MaxFetchDelayInMs, MissingFetchDelayInMs * Math.pow(2, retry));\n const startTime = performance.now();\n\n try {\n // Issue async request for deltas - limit the number fetched to MaxBatchDeltas\n const deltasP = get({ ...props, retry } /* telemetry props */);\n\n const { messages, partialResult } = await deltasP;\n deltas.push(...messages);\n\n const deltasRetrievedLast = messages.length;\n\n if (deltasRetrievedLast !== 0 || !strongTo) {\n return { payload: deltas, cancel: false, partial: partialResult};\n }\n\n // Storage does not have ops we need.\n // Attempt to fetch more deltas. If we didn't receive any in the previous call we up our retry\n // count since something prevented us from seeing those deltas\n\n if (lastSuccessTime === undefined) {\n lastSuccessTime = performance.now();\n } else if (performance.now() - lastSuccessTime > 30000) {\n // If we are connected and receiving proper responses from server, but can't get any ops back,\n // then give up after some time. This likely indicates the issue with ordering service not flushing\n // ops to storage quick enough, and possibly waiting for summaries, while summarizer can't get\n // current as it can't get ops.\n throw createGenericNetworkError(\n // pre-0.58 error message: failedToRetrieveOpsFromStorage:TooManyRetries\n \"Failed to retrieve ops from storage (Too Many Retries)\",\n { canRetry: false },\n {\n retry,\n driverVersion,\n ...props,\n },\n );\n }\n } catch (error) {\n const canRetry = canRetryOnError(error);\n\n lastSuccessTime = undefined;\n\n const retryAfter = getRetryDelayFromError(error);\n\n // This will log to error table only if the error is non-retryable\n logNetworkFailure(\n logger,\n {\n eventName: \"GetDeltas_Error\",\n ...props,\n retry,\n duration: performance.now() - startTime,\n retryAfter,\n fetchReason,\n },\n error);\n\n if (!canRetry) {\n // It's game over scenario.\n throw error;\n }\n\n if (retryAfter !== undefined && retryAfter >= 0) {\n delay = retryAfter;\n }\n }\n\n await waitForConnectedState(delay);\n }\n\n return nothing;\n}\n\nexport function requestOps(\n get: (from: number, to: number, telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>,\n concurrency: number,\n fromTotal: number,\n toTotal: number | undefined,\n payloadSize: number,\n logger: ITelemetryLogger,\n signal?: AbortSignal,\n fetchReason?: string,\n): IStream<ISequencedDocumentMessage[]> {\n let requests = 0;\n let lastFetch: number | undefined;\n let length = 0;\n const queue = new Queue<ISequencedDocumentMessage[]>();\n\n const propsTotal: ITelemetryProperties = {\n fromTotal,\n toTotal,\n };\n\n const telemetryEvent = PerformanceEvent.start(logger, {\n eventName: \"GetDeltas\",\n ...propsTotal,\n fetchReason,\n });\n\n const manager = new ParallelRequests<ISequencedDocumentMessage>(\n fromTotal,\n toTotal,\n payloadSize,\n logger,\n async (request: number, from: number, to: number, strongTo: boolean, propsPerRequest: ITelemetryProperties) => {\n requests++;\n return getSingleOpBatch(\n async (propsAll) => get(from, to, propsAll),\n { request, from, to, ...propsTotal, ...propsPerRequest },\n strongTo,\n logger,\n signal,\n fetchReason,\n );\n },\n (deltas: ISequencedDocumentMessage[]) => {\n // Assert continuing and right start.\n if (lastFetch === undefined) {\n assert(deltas[0].sequenceNumber === fromTotal, 0x26d /* \"wrong start\" */);\n } else {\n assert(deltas[0].sequenceNumber === lastFetch + 1, 0x26e /* \"wrong start\" */);\n }\n lastFetch = deltas[deltas.length - 1].sequenceNumber;\n assert(lastFetch - deltas[0].sequenceNumber + 1 === deltas.length,\n 0x26f /* \"continuous and no duplicates\" */);\n length += deltas.length;\n queue.pushValue(deltas);\n });\n\n // Implement faster cancellation. getSingleOpBatch() checks signal, but only in between\n // waits (up to 10 seconds) and fetches (can take infinite amount of time).\n // While every such case should be improved and take into account signal (and thus cancel immediately),\n // it is beneficial to have catch-all\n const listener = (event: Event) => { manager.cancel(); };\n if (signal !== undefined) {\n signal.addEventListener(\"abort\", listener);\n }\n\n manager.run(concurrency)\n .finally(() => {\n if (signal !== undefined) {\n signal.removeEventListener(\"abort\", listener);\n }\n }).then(() => {\n const props = {\n lastFetch,\n length,\n requests,\n };\n if (manager.canceled) {\n telemetryEvent.cancel({ ...props, error: \"ops request cancelled by client\" });\n } else {\n assert(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1,\n 0x270 /* \"All requested ops fetched\" */);\n telemetryEvent.end(props);\n }\n queue.pushDone();\n })\n .catch((error) => {\n telemetryEvent.cancel({\n lastFetch,\n length,\n requests,\n }, error);\n queue.pushError(error);\n });\n\n return queue;\n}\n\nexport const emptyMessageStream: IStream<ISequencedDocumentMessage[]> = {\n read: async () => { return { done: true };},\n};\n\nexport function streamFromMessages(messagesArg: Promise<ISequencedDocumentMessage[]>):\n IStream<ISequencedDocumentMessage[]>\n{\n let messages: Promise<ISequencedDocumentMessage[]> | undefined = messagesArg;\n return {\n read: async () => {\n if (messages === undefined) {\n return { done: true };\n }\n const value = await messages;\n messages = undefined;\n return value.length === 0 ? { done: true } : { done: false, value };\n },\n };\n}\n\nexport function streamObserver<T>(stream: IStream<T>, handler: (value: IStreamResult<T>) => void): IStream<T> {\n return {\n read: async () => {\n const value = await stream.read();\n handler(value);\n return value;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"parallelRequests.js","sourceRoot":"","sources":["../src/parallelRequests.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,+DAA6E;AAE7E,qEAAmE;AAGnE,uCAA+F;AAC/F,iDAA0E;AAC1E,sFAAsF;AACtF,qDAA+D;AAE/D,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAIlC;;;;;;;;;;;GAWG;AACH,MAAa,gBAAgB;IAazB,YACI,IAAY,EACJ,EAAsB,EACb,WAAmB,EACnB,MAAwB,EACxB,eAKgF,EAChF,gBAAwC;QATjD,OAAE,GAAF,EAAE,CAAoB;QACb,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAkB;QACxB,oBAAe,GAAf,eAAe,CAKiE;QAChF,qBAAgB,GAAhB,gBAAgB,CAAwB;QArB5C,YAAO,GAAqB,IAAI,GAAG,EAAE,CAAC;QAC/C,iBAAY,GAAiB,SAAS,CAAC;QACvC,qBAAgB,GAAG,CAAC,CAAC;QACZ,aAAQ,GAAG,IAAI,uBAAQ,EAAQ,CAAC;QACzC,aAAQ,GAAG,CAAC,CAAC;QAkBjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACrC,CAAC;IAlBD,IAAY,OAAO,KAAK,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;IACjE,IAAW,QAAQ,KAAK,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC;IAmB3D,MAAM;QACT,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SAC3B;IACL,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,WAAmB;QAChC,IAAA,qBAAM,EAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpE,IAAA,qBAAM,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAE7E,IAAI,CAAC,GAAG,WAAW,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE;YACV,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,UAAU,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA,uDAAuD;QACvE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjC,CAAC;IAEO,IAAI;QACR,mCAAmC;QACnC,IAAA,qBAAM,EAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpF,IAAA,qBAAM,EAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SAC3B;IACL,CAAC;IAEO,IAAI,CAAC,KAAK;QACd,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC/B;IACL,CAAC;IAEO,QAAQ;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM;aACT;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,IAAA,qBAAM,EAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC1G,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;SAChC;QAED,4FAA4F;QAC5F,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE;gBAC7B,wFAAwF;gBACxF,mFAAmF;gBACnF,IAAA,qBAAM,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EAC1B,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,EAAE,CAAC;aACf;iBAAM,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,EAAE,EAAE;gBAC/D,6DAA6D;gBAC7D,4EAA4E;gBAC5E,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,uEAAuE,CAAC,CAAC;gBACpG,IAAI,CAAC,IAAI,EAAE,CAAC;aACf;SACJ;IACL,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,OAAO,SAAS,CAAC;SACpB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC;QAClC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;YACvB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE;gBACjB,OAAO,SAAS,CAAC;aACpB;SACJ;QAED,uBAAuB;QACvB,sDAAsD;QACtD,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC;QAEzC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;YACvB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SAClE;QAED,IAAA,qBAAM,EAAC,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAElF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;IAC9C,CAAC;IAEO,UAAU;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,OAAO;SACV;QACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,KAAa;QACvD,IAAA,qBAAM,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAElF,IAAI,IAAI,GAAG,OAAO,CAAC;QACnB,IAAI,EAAE,GAAG,KAAK,CAAC;QAEf,0BAA0B;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;YAClC,IAAA,qBAAM,EAAC,eAAe,GAAG,CAAC,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAE1E,8DAA8D;YAC9D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE;gBACvB,IAAA,qBAAM,EAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC3E,IAAA,qBAAM,EAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,0CAA0C,CAAC,CAAC;aAC3E;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,EAAE,CAAC,CAAC;YAEzF,mCAAmC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;YAEnD,IAAI,MAAM,EAAE;gBACR,IAAI,CAAC,MAAM,EAAE,CAAC;aACjB;YAED,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;gBAC1C,yEAAyE;gBACzE,uFAAuF;gBACvF,6EAA6E;gBAC7E,wFAAwF;gBACxF,iEAAiE;gBACjE,0DAA0D;gBAC1D,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBACjG,6EAA6E;gBAC7E,kFAAkF;gBAClF,mFAAmF;gBACnF,8BAA8B;gBAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;oBACtB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;wBACvB,SAAS,EAAE,2BAA2B;wBACtC,IAAI;wBACJ,EAAE;wBACF,GAAG,EAAE,IAAI,CAAC,EAAE;wBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;qBACzB,CAAC,CAAC;iBACN;gBAED,MAAM;aACT;YAED,IAAI,IAAI,CAAC,OAAO,EAAE;gBACd,MAAM,QAAQ,GAAG,IAAI,CAAC;gBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC9B,IAAI,SAAS,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,CAAC,CAAC,0CAA0C;gBAEvF,IAAI,MAAM,KAAK,CAAC,EAAE;oBACd,qCAAqC;oBACrC,uCAAuC;oBACvC,yFAAyF;oBACzF,0FAA0F;oBAC1F,4EAA4E;oBAC5E,IAAI,eAAe,GAAG,MAAM,EAAE;wBAC1B,wFAAwF;wBACxF,kDAAkD;wBAClD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;4BAC3B,SAAS,EAAE,uBAAuB;4BAClC,IAAI;4BACJ,EAAE;4BACF,MAAM;yBACT,CAAC,CAAC;qBACN;oBACD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;oBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC7B,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;iBACvB;qBAAM;oBACH,yFAAyF;oBACzF,8FAA8F;oBAC9F,2FAA2F;oBAC3F,0BAA0B;oBAC1B,8EAA8E;oBAC9E,iFAAiF;oBACjF,gGAAgG;oBAChG,qEAAqE;oBACrE,4CAA4C;oBAC5C,IAAA,qBAAM,EAAC,CAAC,OAAO,EAAE,KAAK,CAAC,8DAA8D,CAAC,CAAC;oBACvF,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,MAAM,EACf,KAAK,CAAC,6EAA6E,CAAC,CAAC;iBAC5F;gBAED,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;oBACxB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;wBACd,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;4BACzC,UAAU;4BACV,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;yBAClB;wBACD,MAAM;qBACT;oBACD,oDAAoD;oBACpD,8EAA8E;oBAC9E,4DAA4D;oBAC5D,iFAAiF;oBACjF,6FAA6F;oBAC7F,2DAA2D;oBAC3D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;wBAC7B,SAAS,EAAE,0BAA0B;wBACrC,IAAI,EAAE,QAAQ;wBACd,EAAE;wBACF,MAAM;qBACT,CAAC,CAAC;iBACN;gBAED,IAAI,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE;oBAC7B,yFAAyF;oBACzF,uEAAuE;oBACvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;wBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBAChC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;qBAC1B;oBAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC5B,SAAS,GAAG,IAAI,CAAC;iBACpB;gBAED,IAAI,SAAS,EAAE;oBACX,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClC,IAAI,KAAK,KAAK,SAAS,EAAE;wBAAE,MAAM;qBAAE;oBACnC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAClB,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;iBACjB;aACJ;SACJ;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;CACJ;AA7QD,4CA6QC;AAED;;;GAGG;AACH,MAAa,KAAK;IAAlB;QACqB,UAAK,GAAgC,EAAE,CAAC;QAEjD,SAAI,GAAG,KAAK,CAAC;IAqCzB,CAAC;IAnCU,SAAS,CAAC,KAAQ;QACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,SAAS,CAAC,KAAU;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAES,QAAQ,CAAC,KAAgC;QAC/C,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,IAAA,qBAAM,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC9E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;SAC7B;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC1B;IACL,CAAC;IAEM,KAAK,CAAC,IAAI;QACb,IAAA,qBAAM,EAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,OAAO,KAAK,CAAC;SAChB;QACD,IAAA,qBAAM,EAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAQ,EAAoB,CAAC;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IACjC,CAAC;CACJ;AAxCD,sBAwCC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,gBAAgB,CAC3B,GAA0E,EAC1E,KAA2B,EAC3B,QAAiB,EACjB,MAAwB,EACxB,MAAoB,EACpB,WAAoB;IAEpB,IAAI,eAAmC,CAAC;IAExC,IAAI,KAAK,GAAW,CAAC,CAAC;IACtB,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE9D,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,MAAK,IAAI,EAAE;QAC7B,KAAK,EAAE,CAAC;QACR,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI;YACA,8EAA8E;YAC9E,MAAM,OAAO,GAAG,GAAG,iCAAM,KAAK,KAAE,KAAK,IAAyB,CAAC;YAE/D,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAEzB,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC;YAE5C,IAAI,mBAAmB,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACxC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;aACrE;YAED,qCAAqC;YACrC,8FAA8F;YAC9F,8DAA8D;YAE9D,IAAI,eAAe,KAAK,SAAS,EAAE;gBAC/B,eAAe,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;aACvC;iBAAM,IAAI,0BAAW,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,KAAK,EAAE;gBACpD,8FAA8F;gBAC9F,mGAAmG;gBACnG,8FAA8F;gBAC9F,+BAA+B;gBAC/B,MAAM,IAAA,mCAAyB;gBAC3B,wEAAwE;gBACxE,wDAAwD,EACxD,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAEf,KAAK;oBACL,aAAa,EAAb,2BAAa,IACV,KAAK,EAEf,CAAC;aACL;SACJ;QAAC,OAAO,KAAK,EAAE;YACZ,MAAM,QAAQ,GAAG,IAAA,yBAAe,EAAC,KAAK,CAAC,CAAC;YAExC,eAAe,GAAG,SAAS,CAAC;YAE5B,MAAM,UAAU,GAAG,IAAA,gCAAsB,EAAC,KAAK,CAAC,CAAC;YAEjD,kEAAkE;YAClE,IAAA,gCAAiB,EACb,MAAM,gCAEF,SAAS,EAAE,iBAAiB,IACzB,KAAK,KACR,KAAK,EACL,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EACvC,UAAU;gBACV,WAAW,KAEf,KAAK,CAAC,CAAC;YAEX,IAAI,CAAC,QAAQ,EAAE;gBACX,2BAA2B;gBAC3B,MAAM,KAAK,CAAC;aACf;YAED,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,IAAI,CAAC,EAAE;gBAC7C,KAAK,GAAG,UAAU,CAAC;aACtB;SACJ;QAED,MAAM,IAAA,oCAAqB,EAAC,KAAK,CAAC,CAAC;KACtC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,SAAgB,UAAU,CACtB,GAAoG,EACpG,WAAmB,EACnB,SAAiB,EACjB,OAA2B,EAC3B,WAAmB,EACnB,MAAwB,EACxB,MAAoB,EACpB,WAAoB;IAEpB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAA6B,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,IAAI,KAAK,EAA+B,CAAC;IAEvD,MAAM,UAAU,GAAyB;QACrC,SAAS;QACT,OAAO;KACV,CAAC;IAEF,MAAM,cAAc,GAAG,kCAAgB,CAAC,KAAK,CAAC,MAAM,gCAChD,SAAS,EAAE,WAAW,IACnB,UAAU,KACb,WAAW,IACb,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAChC,SAAS,EACT,OAAO,EACP,WAAW,EACX,MAAM,EACN,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,EAAU,EAAE,QAAiB,EAAE,eAAqC,EAAE,EAAE;QAC1G,QAAQ,EAAE,CAAC;QACX,OAAO,gBAAgB,CACnB,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,gCACzC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAK,UAAU,GAAK,eAAe,GACtD,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,CACd,CAAC;IACN,CAAC,EACD,CAAC,MAAmC,EAAE,EAAE;QACpC,qCAAqC;QACrC,IAAI,SAAS,KAAK,SAAS,EAAE;YACzB,IAAA,qBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC7E;aAAM;YACH,IAAA,qBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,KAAK,SAAS,GAAG,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACjF;QACD,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;QACrD,IAAA,qBAAM,EAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAC7D,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAChD,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QACxB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEP,uFAAuF;IACvF,2EAA2E;IAC3E,uGAAuG;IACvG,qCAAqC;IACrC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,MAAM,KAAK,SAAS,EAAE;QACtB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KAC9C;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;SACnB,OAAO,CAAC,GAAG,EAAE;QACV,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;SACjD;IACL,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACT,MAAM,KAAK,GAAG;YACV,SAAS;YACT,MAAM;YACN,QAAQ;SACX,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,EAAE;YAClB,cAAc,CAAC,MAAM,iCAAM,KAAK,KAAE,KAAK,EAAE,iCAAiC,IAAG,CAAC;SACjF;aAAM;YACH,IAAA,qBAAM,EAAC,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,OAAO,GAAG,CAAC,EAC/E,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAC7C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC7B;QACD,KAAK,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,cAAc,CAAC,MAAM,CAAC;YAClB,SAAS;YACT,MAAM;YACN,QAAQ;SACX,EAAE,KAAK,CAAC,CAAC;QACV,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEP,OAAO,KAAK,CAAC;AACjB,CAAC;AA/FD,gCA+FC;AAEY,QAAA,kBAAkB,GAAyC;IACpE,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,SAAgB,kBAAkB,CAAC,WAAiD;IAEhF,IAAI,QAAQ,GAAqD,WAAW,CAAC;IAC7E,OAAO;QACH,IAAI,EAAE,KAAK,IAAI,EAAE;YACb,IAAI,QAAQ,KAAK,SAAS,EAAE;gBACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACzB;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC;YAC7B,QAAQ,GAAG,SAAS,CAAC;YACrB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACxE,CAAC;KACJ,CAAC;AACN,CAAC;AAbD,gDAaC;AAED,SAAgB,cAAc,CAAI,MAAkB,EAAE,OAA0C;IAC5F,OAAO;QACH,IAAI,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;KACJ,CAAC;AACN,CAAC;AARD,wCAQC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { assert, Deferred, performance } from \"@fluidframework/common-utils\";\nimport { ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { IDeltasFetchResult, IStream, IStreamResult } from \"@fluidframework/driver-definitions\";\nimport { getRetryDelayFromError, canRetryOnError, createGenericNetworkError } from \"./network\";\nimport { waitForConnectedState, logNetworkFailure } from \"./networkUtils\";\n// For now, this package is versioned and released in unison with the specific drivers\nimport { pkgVersion as driverVersion } from \"./packageVersion\";\n\nconst MaxFetchDelayInMs = 10000;\nconst MissingFetchDelayInMs = 100;\n\ntype WorkingState = \"working\" | \"done\" | \"canceled\";\n\n/**\n * Helper class to organize parallel fetching of data\n * It can be used to concurrently do many requests, while consuming\n * data in the right order. Take a look at UT for examples.\n * @param concurrency - level of concurrency\n * @param from - starting point of fetching data (inclusive)\n * @param to - ending point of fetching data. exclusive, or undefined if unknown\n * @param payloadSize - batch size\n * @param logger - logger to use\n * @param requestCallback - callback to request batches\n * @returns - Queue that can be used to retrieve data\n */\nexport class ParallelRequests<T> {\n private latestRequested: number;\n private nextToDeliver: number;\n private readonly results: Map<number, T[]> = new Map();\n private workingState: WorkingState = \"working\";\n private requestsInFlight = 0;\n private readonly endEvent = new Deferred<void>();\n private requests = 0;\n private readonly knewTo: boolean;\n\n private get working() { return this.workingState === \"working\"; }\n public get canceled() { return this.workingState === \"canceled\"; }\n\n constructor(\n from: number,\n private to: number | undefined,\n private readonly payloadSize: number,\n private readonly logger: ITelemetryLogger,\n private readonly requestCallback: (\n request: number,\n from: number,\n to: number,\n strongTo: boolean,\n props: ITelemetryProperties) => Promise<{ partial: boolean; cancel: boolean; payload: T[]; }>,\n private readonly responseCallback: (payload: T[]) => void) {\n this.latestRequested = from;\n this.nextToDeliver = from;\n this.knewTo = (to !== undefined);\n }\n\n public cancel() {\n if (this.working) {\n this.workingState = \"canceled\";\n this.endEvent.resolve();\n }\n }\n\n public async run(concurrency: number) {\n assert(concurrency > 0, 0x102 /* \"invalid level of concurrency\" */);\n assert(this.working, 0x103 /* \"trying to parallel run while not working\" */);\n\n let c = concurrency;\n while (c > 0) {\n c--;\n this.addRequest();\n }\n this.dispatch();// will recalculate and trigger this.endEvent if needed\n return this.endEvent.promise;\n }\n\n private done() {\n // We should satisfy request fully.\n assert(this.to !== undefined, 0x104 /* \"undefined end point for parallel fetch\" */);\n assert(this.nextToDeliver >= this.to, 0x105 /* \"unexpected end point for parallel fetch\" */);\n if (this.working) {\n this.workingState = \"done\";\n this.endEvent.resolve();\n }\n }\n\n private fail(error) {\n if (this.working) {\n this.workingState = \"done\";\n this.endEvent.reject(error);\n }\n }\n\n private dispatch() {\n while (this.working) {\n const value = this.results.get(this.nextToDeliver);\n if (value === undefined) {\n break;\n }\n this.results.delete(this.nextToDeliver);\n assert(value.length <= this.payloadSize, 0x1d9 /* \"addRequestCore() should break into smaller chunks\" */);\n this.nextToDeliver += value.length;\n this.responseCallback(value);\n }\n\n // Account for cancellation - state might be not in consistent state on cancelling operation\n if (this.working) {\n if (this.requestsInFlight === 0) {\n // we should have dispatched everything, no matter whether we knew about the end or not.\n // see comment in addRequestCore() around throwing away chunk if it's above this.to\n assert(this.results.size === 0,\n 0x107 /* \"ending dispatch with remaining results to be sent\" */);\n this.done();\n } else if (this.to !== undefined && this.nextToDeliver >= this.to) {\n // Learned about the end and dispatched all the ops up to it.\n // Ignore all the in-flight requests above boundary - unblock caller sooner.\n assert(!this.knewTo, 0x108 /* \"ending results dispatch but knew in advance about more requests\" */);\n this.done();\n }\n }\n }\n\n private getNextChunk() {\n if (!this.working) {\n return undefined;\n }\n\n const from = this.latestRequested;\n if (this.to !== undefined) {\n if (this.to <= from) {\n return undefined;\n }\n }\n\n // this.latestRequested\n // inclusive on the right side! Exclusive on the left.\n this.latestRequested += this.payloadSize;\n\n if (this.to !== undefined) {\n this.latestRequested = Math.min(this.to, this.latestRequested);\n }\n\n assert(from < this.latestRequested, 0x109 /* \"unexpected next chunk position\" */);\n\n return { from, to: this.latestRequested };\n }\n\n private addRequest() {\n const chunk = this.getNextChunk();\n if (chunk === undefined) {\n return;\n }\n this.addRequestCore(chunk.from, chunk.to).catch(this.fail.bind(this));\n }\n\n private async addRequestCore(fromArg: number, toArg: number) {\n assert(this.working, 0x10a /* \"cannot add parallel request while not working\" */);\n\n let from = fromArg;\n let to = toArg;\n\n // to & from are exclusive\n this.requestsInFlight++;\n while (this.working) {\n const requestedLength = to - from;\n assert(requestedLength > 0, 0x10b /* \"invalid parallel request range\" */);\n\n // We should not be wasting time asking for something useless.\n if (this.to !== undefined) {\n assert(from < this.to, 0x10c /* \"invalid parallel request start point\" */);\n assert(to <= this.to, 0x10d /* \"invalid parallel request end point\" */);\n }\n\n this.requests++;\n\n const promise = this.requestCallback(this.requests, from, to, this.to !== undefined, {});\n\n // dispatch any prior received data\n this.dispatch();\n\n const { payload, cancel, partial } = await promise;\n\n if (cancel) {\n this.cancel();\n }\n\n if (this.to !== undefined && from >= this.to) {\n // while we were waiting for response, we learned on what is the boundary\n // We can get here (with actual result!) if situation changed while this request was in\n // flight, i.e. the end was extended over what we learn in some other request\n // While it's useful not to throw this result, this is very corner cases and makes logic\n // (including consistency checks) much harder to write correctly.\n // So for now, we are throwing this result out the window.\n assert(!this.knewTo, 0x10e /* \"should not throw result if we knew about boundary in advance\" */);\n // Learn how often it happens and if it's too wasteful to throw these chunks.\n // If it pops into our view a lot, we would need to reconsider how we approach it.\n // Note that this is not visible to user other than potentially not hitting 100% of\n // what we can in perf domain.\n if (payload.length !== 0) {\n this.logger.sendErrorEvent({\n eventName: \"ParallelRequests_GotExtra\",\n from,\n to,\n end: this.to,\n length: payload.length,\n });\n }\n\n break;\n }\n\n if (this.working) {\n const fromOrig = from;\n const length = payload.length;\n let fullChunk = (requestedLength <= length); // we can possible get more than we asked.\n\n if (length !== 0) {\n // We can get more than we asked for!\n // This can screw up logic in dispatch!\n // So push only batch size, and keep the rest for later - if conditions are favorable, we\n // will be able to use it. If not (parallel request overlapping these ops), it's easier to\n // discard them and wait for another (overlapping) request to come in later.\n if (requestedLength < length) {\n // This is error in a sense that it's not expected and likely points bug in other layer.\n // This layer copes with this situation just fine.\n this.logger.sendTelemetryEvent({\n eventName: \"ParallelRequests_Over\",\n from,\n to,\n length,\n });\n }\n const data = payload.splice(0, requestedLength);\n this.results.set(from, data);\n from += data.length;\n } else {\n // 1. empty (partial) chunks should not be returned by various caching / adapter layers -\n // they should fall back to next layer. This might be important invariant to hold to ensure\n // that we are less likely have bugs where such layer would keep returning empty partial\n // result on each call.\n // 2. Current invariant is that callback does retries until it gets something,\n // with the goal of failing if zero data is retrieved in given amount of time.\n // This is very specific property of storage / ops, so this logic is not here, but given only\n // one user of this class, we assert that to catch issues earlier.\n // These invariant can be relaxed if needed.\n assert(!partial, 0x10f /* \"empty/partial chunks should not be returned by caching\" */);\n assert(!this.knewTo,\n 0x110 /* \"callback should retry until valid fetch before it learns new boundary\" */);\n }\n\n if (!partial && !fullChunk) {\n if (!this.knewTo) {\n if (this.to === undefined || this.to > from) {\n // The END\n this.to = from;\n }\n break;\n }\n // We know that there are more items to be retrieved\n // Can we get partial chunk? Ideally storage indicates that's not a full chunk\n // Note that it's possible that not all ops hit storage yet.\n // We will come back to request more, and if we can't get any more ops soon, it's\n // catastrophic failure (see comment above on responsibility of callback to return something)\n // This layer will just keep trying until it gets full set.\n this.logger.sendPerformanceEvent({\n eventName: \"ParallelRequests_Partial\",\n from: fromOrig,\n to,\n length,\n });\n }\n\n if (to === this.latestRequested) {\n // we can go after full chunk at the end if we received partial chunk, or more than asked\n // Also if we got more than we asked to, we can actually use those ops!\n if (payload.length !== 0) {\n this.results.set(from, payload);\n from += payload.length;\n }\n\n this.latestRequested = from;\n fullChunk = true;\n }\n\n if (fullChunk) {\n const chunk = this.getNextChunk();\n if (chunk === undefined) { break; }\n from = chunk.from;\n to = chunk.to;\n }\n }\n }\n this.requestsInFlight--;\n this.dispatch();\n }\n}\n\n/**\n * Helper queue class to allow async push / pull\n * It's essentially a pipe allowing multiple writers, and single reader\n */\nexport class Queue<T> implements IStream<T> {\n private readonly queue: Promise<IStreamResult<T>>[] = [];\n private deferred: Deferred<IStreamResult<T>> | undefined;\n private done = false;\n\n public pushValue(value: T) {\n this.pushCore(Promise.resolve({ done: false, value }));\n }\n\n public pushError(error: any) {\n this.pushCore(Promise.reject(error));\n this.done = true;\n }\n\n public pushDone() {\n this.pushCore(Promise.resolve({ done: true }));\n this.done = true;\n }\n\n protected pushCore(value: Promise<IStreamResult<T>>) {\n assert(!this.done, 0x112 /* \"cannot push onto queue if done\" */);\n if (this.deferred) {\n assert(this.queue.length === 0, 0x113 /* \"deferred queue should be empty\" */);\n this.deferred.resolve(value);\n this.deferred = undefined;\n } else {\n this.queue.push(value);\n }\n }\n\n public async read(): Promise<IStreamResult<T>> {\n assert(this.deferred === undefined, 0x114 /* \"cannot pop if deferred\" */);\n const value = this.queue.shift();\n if (value !== undefined) {\n return value;\n }\n assert(!this.done, 0x115 /* \"queue should not be done during pop\" */);\n this.deferred = new Deferred<IStreamResult<T>>();\n return this.deferred.promise;\n }\n}\n\n/**\n * Retrieve single batch of ops\n * @param request - request index\n * @param from - inclusive boundary\n * @param to - exclusive boundary\n * @param telemetryEvent - telemetry event used to track consecutive batch of requests\n * @param strongTo - tells if ops in range from...to have to be there and have to be retrieved.\n * If false, returning less ops would mean we reached end of file.\n * @returns - an object with resulting ops and cancellation / partial result flags\n */\nasync function getSingleOpBatch(\n get: (telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>,\n props: ITelemetryProperties,\n strongTo: boolean,\n logger: ITelemetryLogger,\n signal?: AbortSignal,\n fetchReason?: string):\n Promise<{ partial: boolean; cancel: boolean; payload: ISequencedDocumentMessage[]; }> {\n let lastSuccessTime: number | undefined;\n\n let retry: number = 0;\n const deltas: ISequencedDocumentMessage[] = [];\n const nothing = { partial: false, cancel: true, payload: [] };\n\n while (signal?.aborted !== true) {\n retry++;\n let delay = Math.min(MaxFetchDelayInMs, MissingFetchDelayInMs * Math.pow(2, retry));\n const startTime = performance.now();\n\n try {\n // Issue async request for deltas - limit the number fetched to MaxBatchDeltas\n const deltasP = get({ ...props, retry } /* telemetry props */);\n\n const { messages, partialResult } = await deltasP;\n deltas.push(...messages);\n\n const deltasRetrievedLast = messages.length;\n\n if (deltasRetrievedLast !== 0 || !strongTo) {\n return { payload: deltas, cancel: false, partial: partialResult };\n }\n\n // Storage does not have ops we need.\n // Attempt to fetch more deltas. If we didn't receive any in the previous call we up our retry\n // count since something prevented us from seeing those deltas\n\n if (lastSuccessTime === undefined) {\n lastSuccessTime = performance.now();\n } else if (performance.now() - lastSuccessTime > 30000) {\n // If we are connected and receiving proper responses from server, but can't get any ops back,\n // then give up after some time. This likely indicates the issue with ordering service not flushing\n // ops to storage quick enough, and possibly waiting for summaries, while summarizer can't get\n // current as it can't get ops.\n throw createGenericNetworkError(\n // pre-0.58 error message: failedToRetrieveOpsFromStorage:TooManyRetries\n \"Failed to retrieve ops from storage (Too Many Retries)\",\n { canRetry: false },\n {\n retry,\n driverVersion,\n ...props,\n },\n );\n }\n } catch (error) {\n const canRetry = canRetryOnError(error);\n\n lastSuccessTime = undefined;\n\n const retryAfter = getRetryDelayFromError(error);\n\n // This will log to error table only if the error is non-retryable\n logNetworkFailure(\n logger,\n {\n eventName: \"GetDeltas_Error\",\n ...props,\n retry,\n duration: performance.now() - startTime,\n retryAfter,\n fetchReason,\n },\n error);\n\n if (!canRetry) {\n // It's game over scenario.\n throw error;\n }\n\n if (retryAfter !== undefined && retryAfter >= 0) {\n delay = retryAfter;\n }\n }\n\n await waitForConnectedState(delay);\n }\n\n return nothing;\n}\n\nexport function requestOps(\n get: (from: number, to: number, telemetryProps: ITelemetryProperties) => Promise<IDeltasFetchResult>,\n concurrency: number,\n fromTotal: number,\n toTotal: number | undefined,\n payloadSize: number,\n logger: ITelemetryLogger,\n signal?: AbortSignal,\n fetchReason?: string,\n): IStream<ISequencedDocumentMessage[]> {\n let requests = 0;\n let lastFetch: number | undefined;\n let length = 0;\n const queue = new Queue<ISequencedDocumentMessage[]>();\n\n const propsTotal: ITelemetryProperties = {\n fromTotal,\n toTotal,\n };\n\n const telemetryEvent = PerformanceEvent.start(logger, {\n eventName: \"GetDeltas\",\n ...propsTotal,\n fetchReason,\n });\n\n const manager = new ParallelRequests<ISequencedDocumentMessage>(\n fromTotal,\n toTotal,\n payloadSize,\n logger,\n async (request: number, from: number, to: number, strongTo: boolean, propsPerRequest: ITelemetryProperties) => {\n requests++;\n return getSingleOpBatch(\n async (propsAll) => get(from, to, propsAll),\n { request, from, to, ...propsTotal, ...propsPerRequest },\n strongTo,\n logger,\n signal,\n fetchReason,\n );\n },\n (deltas: ISequencedDocumentMessage[]) => {\n // Assert continuing and right start.\n if (lastFetch === undefined) {\n assert(deltas[0].sequenceNumber === fromTotal, 0x26d /* \"wrong start\" */);\n } else {\n assert(deltas[0].sequenceNumber === lastFetch + 1, 0x26e /* \"wrong start\" */);\n }\n lastFetch = deltas[deltas.length - 1].sequenceNumber;\n assert(lastFetch - deltas[0].sequenceNumber + 1 === deltas.length,\n 0x26f /* \"continuous and no duplicates\" */);\n length += deltas.length;\n queue.pushValue(deltas);\n });\n\n // Implement faster cancellation. getSingleOpBatch() checks signal, but only in between\n // waits (up to 10 seconds) and fetches (can take infinite amount of time).\n // While every such case should be improved and take into account signal (and thus cancel immediately),\n // it is beneficial to have catch-all\n const listener = (event: Event) => { manager.cancel(); };\n if (signal !== undefined) {\n signal.addEventListener(\"abort\", listener);\n }\n\n manager.run(concurrency)\n .finally(() => {\n if (signal !== undefined) {\n signal.removeEventListener(\"abort\", listener);\n }\n }).then(() => {\n const props = {\n lastFetch,\n length,\n requests,\n };\n if (manager.canceled) {\n telemetryEvent.cancel({ ...props, error: \"ops request cancelled by client\" });\n } else {\n assert(toTotal === undefined || lastFetch !== undefined && lastFetch >= toTotal - 1,\n 0x270 /* \"All requested ops fetched\" */);\n telemetryEvent.end(props);\n }\n queue.pushDone();\n })\n .catch((error) => {\n telemetryEvent.cancel({\n lastFetch,\n length,\n requests,\n }, error);\n queue.pushError(error);\n });\n\n return queue;\n}\n\nexport const emptyMessageStream: IStream<ISequencedDocumentMessage[]> = {\n read: async () => { return { done: true }; },\n};\n\nexport function streamFromMessages(messagesArg: Promise<ISequencedDocumentMessage[]>):\n IStream<ISequencedDocumentMessage[]> {\n let messages: Promise<ISequencedDocumentMessage[]> | undefined = messagesArg;\n return {\n read: async () => {\n if (messages === undefined) {\n return { done: true };\n }\n const value = await messages;\n messages = undefined;\n return value.length === 0 ? { done: true } : { done: false, value };\n },\n };\n}\n\nexport function streamObserver<T>(stream: IStream<T>, handler: (value: IStreamResult<T>) => void): IStream<T> {\n return {\n read: async () => {\n const value = await stream.read();\n handler(value);\n return value;\n },\n };\n}\n"]}
@@ -49,7 +49,7 @@ class PrefetchDocumentStorageService extends documentStorageServiceProxy_1.Docum
49
49
  }
50
50
  const prefetchedBlobPFromStorage = this.internalStorageService.readBlob(blobId);
51
51
  this.prefetchCache.set(blobId, prefetchedBlobPFromStorage.catch((error) => {
52
- if (network_1.canRetryOnError(error)) {
52
+ if ((0, network_1.canRetryOnError)(error)) {
53
53
  this.prefetchCache.delete(blobId);
54
54
  }
55
55
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"prefetchDocumentStorageService.js","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.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 { LoaderCachingPolicy } from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nimport { canRetryOnError } from \"./network\";\n\nexport class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {\n // BlobId -> blob prefetchCache cache\n private readonly prefetchCache = new Map<string, Promise<ArrayBufferLike>>();\n private prefetchEnabled = true;\n\n public get policies() {\n const policies = this.internalStorageService.policies;\n if (policies) {\n return { ...policies, caching: LoaderCachingPolicy.NoCaching };\n }\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n const p = this.internalStorageService.getSnapshotTree(version);\n if (this.prefetchEnabled) {\n // We don't care if the prefetch succeeds\n void p.then((tree: ISnapshotTree | null | undefined) => {\n if (tree === null || tree === undefined) { return; }\n this.prefetchTree(tree);\n });\n }\n return p;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.cachedRead(blobId);\n }\n public stopPrefetch() {\n this.prefetchEnabled = false;\n this.prefetchCache.clear();\n }\n\n private async cachedRead(blobId: string): Promise<ArrayBufferLike> {\n if (this.prefetchEnabled) {\n const prefetchedBlobP = this.prefetchCache.get(blobId);\n if (prefetchedBlobP !== undefined) {\n return prefetchedBlobP;\n }\n const prefetchedBlobPFromStorage = this.internalStorageService.readBlob(blobId);\n this.prefetchCache.set(blobId, prefetchedBlobPFromStorage.catch((error) => {\n if (canRetryOnError(error)) {\n this.prefetchCache.delete(blobId);\n }\n throw error;\n }));\n return prefetchedBlobPFromStorage;\n }\n return this.internalStorageService.readBlob(blobId);\n }\n\n private prefetchTree(tree: ISnapshotTree) {\n const secondary: string[] = [];\n this.prefetchTreeCore(tree, secondary);\n\n for (const blob of secondary) {\n // We don't care if the prefetch succeeds\n void this.cachedRead(blob);\n }\n }\n\n private prefetchTreeCore(tree: ISnapshotTree, secondary: string[]) {\n for (const blobKey of Object.keys(tree.blobs)) {\n const blob = tree.blobs[blobKey];\n if (blobKey.startsWith(\".\") || blobKey === \"header\" || blobKey.startsWith(\"quorum\")) {\n if (blob !== null) {\n // We don't care if the prefetch succeeds\n void this.cachedRead(blob);\n }\n } else if (!blobKey.startsWith(\"deltas\")) {\n if (blob !== null) {\n secondary.push(blob);\n }\n }\n }\n\n for (const subTree of Object.keys(tree.trees)) {\n this.prefetchTreeCore(tree.trees[subTree], secondary);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"prefetchDocumentStorageService.js","sourceRoot":"","sources":["../src/prefetchDocumentStorageService.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 { LoaderCachingPolicy } from \"@fluidframework/driver-definitions\";\nimport {\n ISnapshotTree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { DocumentStorageServiceProxy } from \"./documentStorageServiceProxy\";\nimport { canRetryOnError } from \"./network\";\n\nexport class PrefetchDocumentStorageService extends DocumentStorageServiceProxy {\n // BlobId -> blob prefetchCache cache\n private readonly prefetchCache = new Map<string, Promise<ArrayBufferLike>>();\n private prefetchEnabled = true;\n\n public get policies() {\n const policies = this.internalStorageService.policies;\n if (policies) {\n return { ...policies, caching: LoaderCachingPolicy.NoCaching };\n }\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n const p = this.internalStorageService.getSnapshotTree(version);\n if (this.prefetchEnabled) {\n // We don't care if the prefetch succeeds\n void p.then((tree: ISnapshotTree | null | undefined) => {\n if (tree === null || tree === undefined) { return; }\n this.prefetchTree(tree);\n });\n }\n return p;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.cachedRead(blobId);\n }\n public stopPrefetch() {\n this.prefetchEnabled = false;\n this.prefetchCache.clear();\n }\n\n private async cachedRead(blobId: string): Promise<ArrayBufferLike> {\n if (this.prefetchEnabled) {\n const prefetchedBlobP = this.prefetchCache.get(blobId);\n if (prefetchedBlobP !== undefined) {\n return prefetchedBlobP;\n }\n const prefetchedBlobPFromStorage = this.internalStorageService.readBlob(blobId);\n this.prefetchCache.set(blobId, prefetchedBlobPFromStorage.catch((error) => {\n if (canRetryOnError(error)) {\n this.prefetchCache.delete(blobId);\n }\n throw error;\n }));\n return prefetchedBlobPFromStorage;\n }\n return this.internalStorageService.readBlob(blobId);\n }\n\n private prefetchTree(tree: ISnapshotTree) {\n const secondary: string[] = [];\n this.prefetchTreeCore(tree, secondary);\n\n for (const blob of secondary) {\n // We don't care if the prefetch succeeds\n void this.cachedRead(blob);\n }\n }\n\n private prefetchTreeCore(tree: ISnapshotTree, secondary: string[]) {\n for (const blobKey of Object.keys(tree.blobs)) {\n const blob = tree.blobs[blobKey];\n if (blobKey.startsWith(\".\") || blobKey === \"header\" || blobKey.startsWith(\"quorum\")) {\n if (blob !== null) {\n // We don't care if the prefetch succeeds\n void this.cachedRead(blob);\n }\n } else if (!blobKey.startsWith(\"deltas\")) {\n if (blob !== null) {\n secondary.push(blob);\n }\n }\n }\n\n for (const subTree of Object.keys(tree.trees)) {\n this.prefetchTreeCore(tree.trees[subTree], secondary);\n }\n }\n}\n"]}
@@ -19,7 +19,7 @@ class RateLimiter {
19
19
  }
20
20
  this.maxRequests++;
21
21
  };
22
- common_utils_1.assert(maxRequests > 0, 0x0ae /* "Tried to create rate limiter with 0 max requests!" */);
22
+ (0, common_utils_1.assert)(maxRequests > 0, 0x0ae /* "Tried to create rate limiter with 0 max requests!" */);
23
23
  }
24
24
  get waitQueueLength() {
25
25
  return this.tasks.length;
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAsD;AAEtD,MAAa,WAAW;IAEpB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QADtB,UAAK,GAAmB,EAAE,CAAC;QAS5C,8CAA8C;QAC9C,0EAA0E;QACvD,YAAO,GAAG,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,EAAE;gBACpB,OAAO,IAAI,EAAE,CAAC;aACjB;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC;QAfE,qBAAM,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7F,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAYS,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;SACV;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,IAAsB;QAC3C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACJ;AAnCD,kCAmCC","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\";\n\nexport class RateLimiter {\n private readonly tasks: (() => void)[] = [];\n constructor(private maxRequests: number) {\n assert(maxRequests > 0, 0x0ae /* \"Tried to create rate limiter with 0 max requests!\" */);\n }\n\n public get waitQueueLength(): number {\n return this.tasks.length;\n }\n\n // Run when one of the tasks finished running.\n // Release next task if we have one, or allow more tasks to run in future.\n protected readonly release = () => {\n const task = this.tasks.shift();\n if (task !== undefined) {\n return task();\n }\n this.maxRequests++;\n };\n\n protected async acquire() {\n if (this.maxRequests > 0) {\n this.maxRequests--;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.tasks.push(resolve);\n });\n }\n\n public async schedule<T>(work: () => Promise<T>) {\n await this.acquire();\n return work().finally(this.release);\n }\n}\n"]}
1
+ {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../src/rateLimiter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAAsD;AAEtD,MAAa,WAAW;IAEpB,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QADtB,UAAK,GAAmB,EAAE,CAAC;QAS5C,8CAA8C;QAC9C,0EAA0E;QACvD,YAAO,GAAG,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,KAAK,SAAS,EAAE;gBACpB,OAAO,IAAI,EAAE,CAAC;aACjB;YACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC;QAfE,IAAA,qBAAM,EAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7F,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAYS,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;SACV;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAI,IAAsB;QAC3C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACJ;AAnCD,kCAmCC","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\";\n\nexport class RateLimiter {\n private readonly tasks: (() => void)[] = [];\n constructor(private maxRequests: number) {\n assert(maxRequests > 0, 0x0ae /* \"Tried to create rate limiter with 0 max requests!\" */);\n }\n\n public get waitQueueLength(): number {\n return this.tasks.length;\n }\n\n // Run when one of the tasks finished running.\n // Release next task if we have one, or allow more tasks to run in future.\n protected readonly release = () => {\n const task = this.tasks.shift();\n if (task !== undefined) {\n return task();\n }\n this.maxRequests++;\n };\n\n protected async acquire() {\n if (this.maxRequests > 0) {\n this.maxRequests--;\n return;\n }\n\n return new Promise<void>((resolve) => {\n this.tasks.push(resolve);\n });\n }\n\n public async schedule<T>(work: () => Promise<T>) {\n await this.acquire();\n return work().finally(this.release);\n }\n}\n"]}
@@ -15,7 +15,7 @@ const common_utils_1 = require("@fluidframework/common-utils");
15
15
  */
16
16
  async function readAndParse(storage, id) {
17
17
  const blob = await storage.readBlob(id);
18
- const decoded = common_utils_1.bufferToString(blob, "utf8");
18
+ const decoded = (0, common_utils_1.bufferToString)(blob, "utf8");
19
19
  return JSON.parse(decoded);
20
20
  }
21
21
  exports.readAndParse = readAndParse;
@@ -1 +1 @@
1
- {"version":3,"file":"readAndParse.js","sourceRoot":"","sources":["../src/readAndParse.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAG9D;;;;;;GAMG;AACI,KAAK,UAAU,YAAY,CAAI,OAAkD,EAAE,EAAU;IAChG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,6BAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AACpC,CAAC;AAJD,oCAIC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluidframework/common-utils\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\n\n/**\n * Read a blob from IDocumentStorageService and JSON.parse it into object of type T\n *\n * @param storage - the IDocumentStorageService to read from\n * @param id - the id of the blob to read and parse\n * @returns the object that we decoded and JSON.parse\n */\nexport async function readAndParse<T>(storage: Pick<IDocumentStorageService, \"readBlob\">, id: string): Promise<T> {\n const blob = await storage.readBlob(id);\n const decoded = bufferToString(blob, \"utf8\");\n return JSON.parse(decoded) as T;\n}\n"]}
1
+ {"version":3,"file":"readAndParse.js","sourceRoot":"","sources":["../src/readAndParse.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAG9D;;;;;;GAMG;AACI,KAAK,UAAU,YAAY,CAAI,OAAkD,EAAE,EAAU;IAChG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAA,6BAAc,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AACpC,CAAC;AAJD,oCAIC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString } from \"@fluidframework/common-utils\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\n\n/**\n * Read a blob from IDocumentStorageService and JSON.parse it into object of type T\n *\n * @param storage - the IDocumentStorageService to read from\n * @param id - the id of the blob to read and parse\n * @returns the object that we decoded and JSON.parse\n */\nexport async function readAndParse<T>(storage: Pick<IDocumentStorageService, \"readBlob\">, id: string): Promise<T> {\n const blob = await storage.readBlob(id);\n const decoded = bufferToString(blob, \"utf8\");\n return JSON.parse(decoded) as T;\n}\n"]}
@@ -25,7 +25,7 @@ async function runWithRetry(api, fetchCallName, logger, progress) {
25
25
  }
26
26
  catch (err) {
27
27
  // If it is not retriable, then just throw the error.
28
- if (!network_1.canRetryOnError(err)) {
28
+ if (!(0, network_1.canRetryOnError)(err)) {
29
29
  logger.sendTelemetryEvent({
30
30
  eventName: `${fetchCallName}_cancel`,
31
31
  retry: numRetries,
@@ -47,11 +47,11 @@ async function runWithRetry(api, fetchCallName, logger, progress) {
47
47
  lastError = err;
48
48
  // If the error is throttling error, then wait for the specified time before retrying.
49
49
  // If the waitTime is not specified, then we start with retrying immediately to max of 8s.
50
- retryAfterMs = (_b = network_1.getRetryDelayFromError(err)) !== null && _b !== void 0 ? _b : Math.min(retryAfterMs * 2, 8000);
50
+ retryAfterMs = (_b = (0, network_1.getRetryDelayFromError)(err)) !== null && _b !== void 0 ? _b : Math.min(retryAfterMs * 2, 8000);
51
51
  if (progress.onRetry) {
52
52
  progress.onRetry(retryAfterMs, err);
53
53
  }
54
- await common_utils_1.delay(retryAfterMs);
54
+ await (0, common_utils_1.delay)(retryAfterMs);
55
55
  }
56
56
  } while (!success);
57
57
  if (numRetries > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"runWithRetry.js","sourceRoot":"","sources":["../src/runWithRetry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAAkE;AAClE,2EAAqE;AACrE,uCAAoE;AACpE,qDAA8C;AAC9C,wBAAsC;AA8B/B,KAAK,UAAU,YAAY,CAC9B,GAAyC,EACzC,aAAqB,EACrB,MAAwB,EACxB,QAAmB;;IAEnB,IAAI,MAAqB,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,sBAAsB;IAC/C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,SAAc,CAAC;IACnB,GAAG;QACC,IAAI;YACA,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC;SAClB;QAAC,OAAO,GAAG,EAAE;YACV,qDAAqD;YACrD,IAAI,CAAC,yBAAe,CAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,CAAC,kBAAkB,CAAC;oBACtB,SAAS,EAAE,GAAG,aAAa,SAAS;oBACpC,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;oBACvC,aAAa;iBAChB,EAAE,GAAG,CAAC,CAAC;gBACR,MAAM,GAAG,CAAC;aACb;YAED,IAAI,OAAA,QAAQ,CAAC,MAAM,0CAAE,OAAO,MAAK,IAAI,EAAE;gBACnC,MAAM,CAAC,kBAAkB,CAAC;oBACtB,SAAS,EAAE,GAAG,aAAa,sBAAsB;oBACjD,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;oBACvC,aAAa;iBAChB,EAAE,GAAG,CAAC,CAAC;gBACR,MAAM,IAAI,oBAAiB,CACvB,0BAA0B,EAC1B,oCAAe,CAAC,YAAY,EAC5B,EAAE,aAAa,EAAE,2BAAU,EAAE,aAAa,EAAE,CAC/C,CAAC;aACL;YAED,UAAU,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,sFAAsF;YACtF,0FAA0F;YAC1F,YAAY,SAAG,gCAAsB,CAAC,GAAG,CAAC,mCAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/E,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAClB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;aACvC;YACD,MAAM,oBAAK,CAAC,YAAY,CAAC,CAAC;SAC7B;KACJ,QAAQ,CAAC,OAAO,EAAE;IACnB,IAAI,UAAU,GAAG,CAAC,EAAE;QAChB,MAAM,CAAC,kBAAkB,CAAC;YACtB,SAAS,EAAE,GAAG,aAAa,YAAY;YACvC,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;YACvC,aAAa;SAChB,EACD,SAAS,CAAC,CAAC;KACd;IACD,oEAAoE;IACpE,OAAO,MAAO,CAAC;AACnB,CAAC;AAhED,oCAgEC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { delay, performance } from \"@fluidframework/common-utils\";\nimport { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport { canRetryOnError, getRetryDelayFromError } from \"./network\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { NonRetryableError } from \".\";\n\n/**\n * Interface describing an object passed to various network APIs.\n * It allows caller to control cancellation, as well as learn about any delays.\n */\nexport interface IProgress {\n /**\n * Abort signal used to cancel operation\n * Note that most of the layers do not use this signal yet. We need to change that over time.\n * Please consult with API documentation / implementation.\n * Note that number of layers may not check this signal while holding this request in a queue,\n * so it may take a while it takes effect. This can be improved in the future.\n * Layers in question are:\n * - driver (RateLimiter)\n * - runWithRetry\n */\n cancel?: AbortSignal;\n\n /**\n * Called whenever api returns cancellable error and the call is going to be retried.\n * Any exception thrown from this call back result in cancellation of operation\n * and propagation of thrown exception.\n * @param delayInMs - delay before next retry. This value will depend on internal back-off logic,\n * as well as information provided by service (like 429 error asking to wait for some time before retry)\n * @param error - error object returned from the call.\n */\n onRetry?(delayInMs: number, error: any): void;\n}\n\nexport async function runWithRetry<T>(\n api: (cancel?: AbortSignal) => Promise<T>,\n fetchCallName: string,\n logger: ITelemetryLogger,\n progress: IProgress,\n): Promise<T> {\n let result: T | undefined;\n let success = false;\n let retryAfterMs = 1000; // has to be positive!\n let numRetries = 0;\n const startTime = performance.now();\n let lastError: any;\n do {\n try {\n result = await api(progress.cancel);\n success = true;\n } catch (err) {\n // If it is not retriable, then just throw the error.\n if (!canRetryOnError(err)) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_cancel`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n }, err);\n throw err;\n }\n\n if (progress.cancel?.aborted === true) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_runWithRetryAborted`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n }, err);\n throw new NonRetryableError(\n \"runWithRetry was Aborted\",\n DriverErrorType.genericError,\n { driverVersion: pkgVersion, fetchCallName },\n );\n }\n\n numRetries++;\n lastError = err;\n // If the error is throttling error, then wait for the specified time before retrying.\n // If the waitTime is not specified, then we start with retrying immediately to max of 8s.\n retryAfterMs = getRetryDelayFromError(err) ?? Math.min(retryAfterMs * 2, 8000);\n if (progress.onRetry) {\n progress.onRetry(retryAfterMs, err);\n }\n await delay(retryAfterMs);\n }\n } while (!success);\n if (numRetries > 0) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_lastError`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n },\n lastError);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return result!;\n}\n"]}
1
+ {"version":3,"file":"runWithRetry.js","sourceRoot":"","sources":["../src/runWithRetry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAAkE;AAClE,2EAAqE;AACrE,uCAAoE;AACpE,qDAA8C;AAC9C,wBAAsC;AA8B/B,KAAK,UAAU,YAAY,CAC9B,GAAyC,EACzC,aAAqB,EACrB,MAAwB,EACxB,QAAmB;;IAEnB,IAAI,MAAqB,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,sBAAsB;IAC/C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,SAAc,CAAC;IACnB,GAAG;QACC,IAAI;YACA,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC;SAClB;QAAC,OAAO,GAAG,EAAE;YACV,qDAAqD;YACrD,IAAI,CAAC,IAAA,yBAAe,EAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,CAAC,kBAAkB,CAAC;oBACtB,SAAS,EAAE,GAAG,aAAa,SAAS;oBACpC,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;oBACvC,aAAa;iBAChB,EAAE,GAAG,CAAC,CAAC;gBACR,MAAM,GAAG,CAAC;aACb;YAED,IAAI,CAAA,MAAA,QAAQ,CAAC,MAAM,0CAAE,OAAO,MAAK,IAAI,EAAE;gBACnC,MAAM,CAAC,kBAAkB,CAAC;oBACtB,SAAS,EAAE,GAAG,aAAa,sBAAsB;oBACjD,KAAK,EAAE,UAAU;oBACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;oBACvC,aAAa;iBAChB,EAAE,GAAG,CAAC,CAAC;gBACR,MAAM,IAAI,oBAAiB,CACvB,0BAA0B,EAC1B,oCAAe,CAAC,YAAY,EAC5B,EAAE,aAAa,EAAE,2BAAU,EAAE,aAAa,EAAE,CAC/C,CAAC;aACL;YAED,UAAU,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,sFAAsF;YACtF,0FAA0F;YAC1F,YAAY,GAAG,MAAA,IAAA,gCAAsB,EAAC,GAAG,CAAC,mCAAI,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAC/E,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAClB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;aACvC;YACD,MAAM,IAAA,oBAAK,EAAC,YAAY,CAAC,CAAC;SAC7B;KACJ,QAAQ,CAAC,OAAO,EAAE;IACnB,IAAI,UAAU,GAAG,CAAC,EAAE;QAChB,MAAM,CAAC,kBAAkB,CAAC;YACtB,SAAS,EAAE,GAAG,aAAa,YAAY;YACvC,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,0BAAW,CAAC,GAAG,EAAE,GAAG,SAAS;YACvC,aAAa;SAChB,EACD,SAAS,CAAC,CAAC;KACd;IACD,oEAAoE;IACpE,OAAO,MAAO,CAAC;AACnB,CAAC;AAhED,oCAgEC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { delay, performance } from \"@fluidframework/common-utils\";\nimport { DriverErrorType } from \"@fluidframework/driver-definitions\";\nimport { canRetryOnError, getRetryDelayFromError } from \"./network\";\nimport { pkgVersion } from \"./packageVersion\";\nimport { NonRetryableError } from \".\";\n\n/**\n * Interface describing an object passed to various network APIs.\n * It allows caller to control cancellation, as well as learn about any delays.\n */\nexport interface IProgress {\n /**\n * Abort signal used to cancel operation\n * Note that most of the layers do not use this signal yet. We need to change that over time.\n * Please consult with API documentation / implementation.\n * Note that number of layers may not check this signal while holding this request in a queue,\n * so it may take a while it takes effect. This can be improved in the future.\n * Layers in question are:\n * - driver (RateLimiter)\n * - runWithRetry\n */\n cancel?: AbortSignal;\n\n /**\n * Called whenever api returns cancellable error and the call is going to be retried.\n * Any exception thrown from this call back result in cancellation of operation\n * and propagation of thrown exception.\n * @param delayInMs - delay before next retry. This value will depend on internal back-off logic,\n * as well as information provided by service (like 429 error asking to wait for some time before retry)\n * @param error - error object returned from the call.\n */\n onRetry?(delayInMs: number, error: any): void;\n}\n\nexport async function runWithRetry<T>(\n api: (cancel?: AbortSignal) => Promise<T>,\n fetchCallName: string,\n logger: ITelemetryLogger,\n progress: IProgress,\n): Promise<T> {\n let result: T | undefined;\n let success = false;\n let retryAfterMs = 1000; // has to be positive!\n let numRetries = 0;\n const startTime = performance.now();\n let lastError: any;\n do {\n try {\n result = await api(progress.cancel);\n success = true;\n } catch (err) {\n // If it is not retriable, then just throw the error.\n if (!canRetryOnError(err)) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_cancel`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n }, err);\n throw err;\n }\n\n if (progress.cancel?.aborted === true) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_runWithRetryAborted`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n }, err);\n throw new NonRetryableError(\n \"runWithRetry was Aborted\",\n DriverErrorType.genericError,\n { driverVersion: pkgVersion, fetchCallName },\n );\n }\n\n numRetries++;\n lastError = err;\n // If the error is throttling error, then wait for the specified time before retrying.\n // If the waitTime is not specified, then we start with retrying immediately to max of 8s.\n retryAfterMs = getRetryDelayFromError(err) ?? Math.min(retryAfterMs * 2, 8000);\n if (progress.onRetry) {\n progress.onRetry(retryAfterMs, err);\n }\n await delay(retryAfterMs);\n }\n } while (!success);\n if (numRetries > 0) {\n logger.sendTelemetryEvent({\n eventName: `${fetchCallName}_lastError`,\n retry: numRetries,\n duration: performance.now() - startTime,\n fetchCallName,\n },\n lastError);\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return result!;\n}\n"]}