@fluidframework/container-loader 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.225277

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 (335) hide show
  1. package/.eslintrc.js +18 -21
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +364 -0
  4. package/README.md +152 -56
  5. package/api-extractor-esm.json +4 -0
  6. package/api-extractor-lint.json +4 -0
  7. package/api-extractor.json +2 -2
  8. package/api-report/container-loader.api.md +143 -0
  9. package/dist/{audience.js → audience.cjs} +15 -13
  10. package/dist/audience.cjs.map +1 -0
  11. package/dist/audience.d.ts +4 -6
  12. package/dist/audience.d.ts.map +1 -1
  13. package/dist/catchUpMonitor.cjs +43 -0
  14. package/dist/catchUpMonitor.cjs.map +1 -0
  15. package/dist/catchUpMonitor.d.ts +29 -0
  16. package/dist/catchUpMonitor.d.ts.map +1 -0
  17. package/dist/{connectionManager.js → connectionManager.cjs} +397 -240
  18. package/dist/connectionManager.cjs.map +1 -0
  19. package/dist/connectionManager.d.ts +23 -33
  20. package/dist/connectionManager.d.ts.map +1 -1
  21. package/dist/{connectionState.js → connectionState.cjs} +5 -7
  22. package/dist/connectionState.cjs.map +1 -0
  23. package/dist/connectionState.d.ts +3 -5
  24. package/dist/connectionState.d.ts.map +1 -1
  25. package/dist/connectionStateHandler.cjs +474 -0
  26. package/dist/connectionStateHandler.cjs.map +1 -0
  27. package/dist/connectionStateHandler.d.ts +127 -29
  28. package/dist/connectionStateHandler.d.ts.map +1 -1
  29. package/dist/container-loader-alpha.d.ts +274 -0
  30. package/dist/container-loader-beta.d.ts +75 -0
  31. package/dist/container-loader-public.d.ts +75 -0
  32. package/dist/container-loader-untrimmed.d.ts +331 -0
  33. package/dist/container.cjs +1585 -0
  34. package/dist/container.cjs.map +1 -0
  35. package/dist/container.d.ts +227 -83
  36. package/dist/container.d.ts.map +1 -1
  37. package/dist/containerContext.cjs +74 -0
  38. package/dist/containerContext.cjs.map +1 -0
  39. package/dist/containerContext.d.ts +33 -59
  40. package/dist/containerContext.d.ts.map +1 -1
  41. package/dist/containerStorageAdapter.cjs +234 -0
  42. package/dist/containerStorageAdapter.cjs.map +1 -0
  43. package/dist/containerStorageAdapter.d.ts +48 -23
  44. package/dist/containerStorageAdapter.d.ts.map +1 -1
  45. package/dist/{contracts.js → contracts.cjs} +5 -5
  46. package/dist/contracts.cjs.map +1 -0
  47. package/dist/contracts.d.ts +45 -17
  48. package/dist/contracts.d.ts.map +1 -1
  49. package/dist/debugLogger.cjs +101 -0
  50. package/dist/debugLogger.cjs.map +1 -0
  51. package/dist/debugLogger.d.ts +30 -0
  52. package/dist/debugLogger.d.ts.map +1 -0
  53. package/dist/{deltaManager.js → deltaManager.cjs} +379 -186
  54. package/dist/deltaManager.cjs.map +1 -0
  55. package/dist/deltaManager.d.ts +54 -18
  56. package/dist/deltaManager.d.ts.map +1 -1
  57. package/dist/{deltaQueue.js → deltaQueue.cjs} +29 -28
  58. package/dist/deltaQueue.cjs.map +1 -0
  59. package/dist/deltaQueue.d.ts +3 -4
  60. package/dist/deltaQueue.d.ts.map +1 -1
  61. package/dist/disposal.cjs +25 -0
  62. package/dist/disposal.cjs.map +1 -0
  63. package/dist/disposal.d.ts +13 -0
  64. package/dist/disposal.d.ts.map +1 -0
  65. package/dist/error.cjs +32 -0
  66. package/dist/error.cjs.map +1 -0
  67. package/dist/error.d.ts +23 -0
  68. package/dist/error.d.ts.map +1 -0
  69. package/dist/index.cjs +19 -0
  70. package/dist/index.cjs.map +1 -0
  71. package/dist/index.d.ts +5 -2
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/loader.cjs +148 -0
  74. package/dist/loader.cjs.map +1 -0
  75. package/dist/loader.d.ts +38 -19
  76. package/dist/loader.d.ts.map +1 -1
  77. package/dist/location-redirection-utilities/index.cjs +11 -0
  78. package/dist/location-redirection-utilities/index.cjs.map +1 -0
  79. package/dist/location-redirection-utilities/index.d.ts +6 -0
  80. package/dist/location-redirection-utilities/index.d.ts.map +1 -0
  81. package/dist/location-redirection-utilities/resolveWithLocationRedirection.cjs +53 -0
  82. package/dist/location-redirection-utilities/resolveWithLocationRedirection.cjs.map +1 -0
  83. package/dist/location-redirection-utilities/resolveWithLocationRedirection.d.ts +24 -0
  84. package/dist/location-redirection-utilities/resolveWithLocationRedirection.d.ts.map +1 -0
  85. package/dist/{collabWindowTracker.js → noopHeuristic.cjs} +37 -39
  86. package/dist/noopHeuristic.cjs.map +1 -0
  87. package/dist/noopHeuristic.d.ts +23 -0
  88. package/dist/noopHeuristic.d.ts.map +1 -0
  89. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  90. package/dist/packageVersion.cjs.map +1 -0
  91. package/dist/packageVersion.d.ts +1 -1
  92. package/dist/packageVersion.d.ts.map +1 -1
  93. package/dist/protocol.cjs +99 -0
  94. package/dist/protocol.cjs.map +1 -0
  95. package/dist/protocol.d.ts +38 -0
  96. package/dist/protocol.d.ts.map +1 -0
  97. package/dist/{protocolTreeDocumentStorageService.js → protocolTreeDocumentStorageService.cjs} +8 -5
  98. package/dist/protocolTreeDocumentStorageService.cjs.map +1 -0
  99. package/dist/protocolTreeDocumentStorageService.d.ts +8 -4
  100. package/dist/protocolTreeDocumentStorageService.d.ts.map +1 -1
  101. package/dist/quorum.cjs +16 -0
  102. package/dist/quorum.cjs.map +1 -0
  103. package/dist/quorum.d.ts +1 -14
  104. package/dist/quorum.d.ts.map +1 -1
  105. package/dist/{retriableDocumentStorageService.js → retriableDocumentStorageService.cjs} +36 -21
  106. package/dist/retriableDocumentStorageService.cjs.map +1 -0
  107. package/dist/retriableDocumentStorageService.d.ts +7 -5
  108. package/dist/retriableDocumentStorageService.d.ts.map +1 -1
  109. package/dist/tsdoc-metadata.json +11 -0
  110. package/dist/{utils.js → utils.cjs} +52 -14
  111. package/dist/utils.cjs.map +1 -0
  112. package/dist/utils.d.ts +34 -1
  113. package/dist/utils.d.ts.map +1 -1
  114. package/lib/{audience.d.ts → audience.d.mts} +5 -11
  115. package/lib/audience.d.mts.map +1 -0
  116. package/lib/{audience.js → audience.mjs} +15 -17
  117. package/lib/audience.mjs.map +1 -0
  118. package/lib/catchUpMonitor.d.mts +29 -0
  119. package/lib/catchUpMonitor.d.mts.map +1 -0
  120. package/lib/catchUpMonitor.mjs +39 -0
  121. package/lib/catchUpMonitor.mjs.map +1 -0
  122. package/lib/{connectionManager.d.ts → connectionManager.d.mts} +24 -34
  123. package/lib/connectionManager.d.mts.map +1 -0
  124. package/lib/{connectionManager.js → connectionManager.mjs} +378 -218
  125. package/lib/connectionManager.mjs.map +1 -0
  126. package/lib/{connectionState.d.ts → connectionState.d.mts} +4 -6
  127. package/lib/connectionState.d.mts.map +1 -0
  128. package/lib/{connectionState.js → connectionState.mjs} +4 -6
  129. package/lib/connectionState.mjs.map +1 -0
  130. package/lib/connectionStateHandler.d.mts +179 -0
  131. package/lib/connectionStateHandler.d.mts.map +1 -0
  132. package/lib/connectionStateHandler.mjs +469 -0
  133. package/lib/connectionStateHandler.mjs.map +1 -0
  134. package/lib/container-loader-alpha.d.mts +274 -0
  135. package/lib/container-loader-beta.d.mts +75 -0
  136. package/lib/container-loader-public.d.mts +75 -0
  137. package/lib/container-loader-untrimmed.d.mts +331 -0
  138. package/lib/container.d.mts +382 -0
  139. package/lib/container.d.mts.map +1 -0
  140. package/lib/container.mjs +1579 -0
  141. package/lib/container.mjs.map +1 -0
  142. package/lib/containerContext.d.mts +58 -0
  143. package/lib/containerContext.d.mts.map +1 -0
  144. package/lib/containerContext.mjs +70 -0
  145. package/lib/containerContext.mjs.map +1 -0
  146. package/lib/containerStorageAdapter.d.mts +73 -0
  147. package/lib/containerStorageAdapter.d.mts.map +1 -0
  148. package/lib/containerStorageAdapter.mjs +228 -0
  149. package/lib/containerStorageAdapter.mjs.map +1 -0
  150. package/lib/{contracts.d.ts → contracts.d.mts} +46 -18
  151. package/lib/contracts.d.mts.map +1 -0
  152. package/lib/{contracts.js → contracts.mjs} +4 -4
  153. package/lib/contracts.mjs.map +1 -0
  154. package/lib/debugLogger.d.mts +30 -0
  155. package/lib/debugLogger.d.mts.map +1 -0
  156. package/lib/debugLogger.mjs +93 -0
  157. package/lib/debugLogger.mjs.map +1 -0
  158. package/lib/{deltaManager.d.ts → deltaManager.d.mts} +55 -19
  159. package/lib/deltaManager.d.mts.map +1 -0
  160. package/lib/{deltaManager.js → deltaManager.mjs} +361 -165
  161. package/lib/deltaManager.mjs.map +1 -0
  162. package/lib/{deltaQueue.d.ts → deltaQueue.d.mts} +4 -5
  163. package/lib/deltaQueue.d.mts.map +1 -0
  164. package/lib/{deltaQueue.js → deltaQueue.mjs} +25 -24
  165. package/lib/deltaQueue.mjs.map +1 -0
  166. package/lib/disposal.d.mts +13 -0
  167. package/lib/disposal.d.mts.map +1 -0
  168. package/lib/disposal.mjs +21 -0
  169. package/lib/disposal.mjs.map +1 -0
  170. package/lib/error.d.mts +23 -0
  171. package/lib/error.d.mts.map +1 -0
  172. package/lib/error.mjs +28 -0
  173. package/lib/error.mjs.map +1 -0
  174. package/lib/index.d.mts +11 -0
  175. package/lib/index.d.mts.map +1 -0
  176. package/lib/index.mjs +10 -0
  177. package/lib/index.mjs.map +1 -0
  178. package/lib/{loader.d.ts → loader.d.mts} +40 -21
  179. package/lib/loader.d.mts.map +1 -0
  180. package/lib/loader.mjs +143 -0
  181. package/lib/loader.mjs.map +1 -0
  182. package/lib/location-redirection-utilities/index.d.mts +6 -0
  183. package/lib/location-redirection-utilities/index.d.mts.map +1 -0
  184. package/lib/location-redirection-utilities/index.mjs +6 -0
  185. package/lib/location-redirection-utilities/index.mjs.map +1 -0
  186. package/lib/location-redirection-utilities/resolveWithLocationRedirection.d.mts +24 -0
  187. package/lib/location-redirection-utilities/resolveWithLocationRedirection.d.mts.map +1 -0
  188. package/lib/location-redirection-utilities/resolveWithLocationRedirection.mjs +48 -0
  189. package/lib/location-redirection-utilities/resolveWithLocationRedirection.mjs.map +1 -0
  190. package/lib/noopHeuristic.d.mts +23 -0
  191. package/lib/noopHeuristic.d.mts.map +1 -0
  192. package/lib/{collabWindowTracker.js → noopHeuristic.mjs} +33 -35
  193. package/lib/noopHeuristic.mjs.map +1 -0
  194. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +2 -2
  195. package/lib/packageVersion.d.mts.map +1 -0
  196. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  197. package/lib/packageVersion.mjs.map +1 -0
  198. package/lib/protocol.d.mts +38 -0
  199. package/lib/protocol.d.mts.map +1 -0
  200. package/lib/protocol.mjs +94 -0
  201. package/lib/protocol.mjs.map +1 -0
  202. package/lib/{protocolTreeDocumentStorageService.d.ts → protocolTreeDocumentStorageService.d.mts} +9 -5
  203. package/lib/protocolTreeDocumentStorageService.d.mts.map +1 -0
  204. package/lib/{protocolTreeDocumentStorageService.js → protocolTreeDocumentStorageService.mjs} +8 -5
  205. package/lib/protocolTreeDocumentStorageService.mjs.map +1 -0
  206. package/lib/quorum.d.mts +4 -0
  207. package/lib/quorum.d.mts.map +1 -0
  208. package/lib/quorum.mjs +12 -0
  209. package/lib/quorum.mjs.map +1 -0
  210. package/lib/{retriableDocumentStorageService.d.ts → retriableDocumentStorageService.d.mts} +8 -6
  211. package/lib/retriableDocumentStorageService.d.mts.map +1 -0
  212. package/lib/{retriableDocumentStorageService.js → retriableDocumentStorageService.mjs} +35 -20
  213. package/lib/retriableDocumentStorageService.mjs.map +1 -0
  214. package/lib/utils.d.mts +67 -0
  215. package/lib/utils.d.mts.map +1 -0
  216. package/lib/{utils.js → utils.mjs} +47 -11
  217. package/lib/utils.mjs.map +1 -0
  218. package/package.json +189 -69
  219. package/prettier.config.cjs +8 -0
  220. package/src/audience.ts +59 -49
  221. package/src/catchUpMonitor.ts +61 -0
  222. package/src/connectionManager.ts +1154 -910
  223. package/src/connectionState.ts +22 -25
  224. package/src/connectionStateHandler.ts +689 -319
  225. package/src/container.ts +2476 -1792
  226. package/src/containerContext.ts +98 -330
  227. package/src/containerStorageAdapter.ts +301 -105
  228. package/src/contracts.ts +184 -146
  229. package/src/debugLogger.ts +123 -0
  230. package/src/deltaManager.ts +1165 -900
  231. package/src/deltaQueue.ts +156 -152
  232. package/src/disposal.ts +25 -0
  233. package/src/error.ts +44 -0
  234. package/src/index.ts +14 -15
  235. package/src/loader.ts +356 -427
  236. package/src/location-redirection-utilities/index.ts +9 -0
  237. package/src/location-redirection-utilities/resolveWithLocationRedirection.ts +61 -0
  238. package/src/noopHeuristic.ts +107 -0
  239. package/src/packageVersion.ts +1 -1
  240. package/src/protocol.ts +150 -0
  241. package/src/protocolTreeDocumentStorageService.ts +35 -35
  242. package/src/quorum.ts +11 -50
  243. package/src/retriableDocumentStorageService.ts +135 -95
  244. package/src/utils.ts +159 -86
  245. package/tsc-multi.test.json +4 -0
  246. package/tsconfig.json +10 -12
  247. package/dist/audience.js.map +0 -1
  248. package/dist/collabWindowTracker.d.ts +0 -19
  249. package/dist/collabWindowTracker.d.ts.map +0 -1
  250. package/dist/collabWindowTracker.js.map +0 -1
  251. package/dist/connectionManager.js.map +0 -1
  252. package/dist/connectionState.js.map +0 -1
  253. package/dist/connectionStateHandler.js +0 -280
  254. package/dist/connectionStateHandler.js.map +0 -1
  255. package/dist/container.js +0 -1284
  256. package/dist/container.js.map +0 -1
  257. package/dist/containerContext.js +0 -217
  258. package/dist/containerContext.js.map +0 -1
  259. package/dist/containerStorageAdapter.js +0 -104
  260. package/dist/containerStorageAdapter.js.map +0 -1
  261. package/dist/contracts.js.map +0 -1
  262. package/dist/deltaManager.js.map +0 -1
  263. package/dist/deltaManagerProxy.d.ts +0 -54
  264. package/dist/deltaManagerProxy.d.ts.map +0 -1
  265. package/dist/deltaManagerProxy.js +0 -115
  266. package/dist/deltaManagerProxy.js.map +0 -1
  267. package/dist/deltaQueue.js.map +0 -1
  268. package/dist/index.js +0 -16
  269. package/dist/index.js.map +0 -1
  270. package/dist/loader.js +0 -241
  271. package/dist/loader.js.map +0 -1
  272. package/dist/packageVersion.js.map +0 -1
  273. package/dist/protocolTreeDocumentStorageService.js.map +0 -1
  274. package/dist/quorum.js +0 -44
  275. package/dist/quorum.js.map +0 -1
  276. package/dist/retriableDocumentStorageService.js.map +0 -1
  277. package/dist/utils.js.map +0 -1
  278. package/lib/audience.d.ts.map +0 -1
  279. package/lib/audience.js.map +0 -1
  280. package/lib/collabWindowTracker.d.ts +0 -19
  281. package/lib/collabWindowTracker.d.ts.map +0 -1
  282. package/lib/collabWindowTracker.js.map +0 -1
  283. package/lib/connectionManager.d.ts.map +0 -1
  284. package/lib/connectionManager.js.map +0 -1
  285. package/lib/connectionState.d.ts.map +0 -1
  286. package/lib/connectionState.js.map +0 -1
  287. package/lib/connectionStateHandler.d.ts +0 -81
  288. package/lib/connectionStateHandler.d.ts.map +0 -1
  289. package/lib/connectionStateHandler.js +0 -276
  290. package/lib/connectionStateHandler.js.map +0 -1
  291. package/lib/container.d.ts +0 -238
  292. package/lib/container.d.ts.map +0 -1
  293. package/lib/container.js +0 -1276
  294. package/lib/container.js.map +0 -1
  295. package/lib/containerContext.d.ts +0 -84
  296. package/lib/containerContext.d.ts.map +0 -1
  297. package/lib/containerContext.js +0 -213
  298. package/lib/containerContext.js.map +0 -1
  299. package/lib/containerStorageAdapter.d.ts +0 -48
  300. package/lib/containerStorageAdapter.d.ts.map +0 -1
  301. package/lib/containerStorageAdapter.js +0 -99
  302. package/lib/containerStorageAdapter.js.map +0 -1
  303. package/lib/contracts.d.ts.map +0 -1
  304. package/lib/contracts.js.map +0 -1
  305. package/lib/deltaManager.d.ts.map +0 -1
  306. package/lib/deltaManager.js.map +0 -1
  307. package/lib/deltaManagerProxy.d.ts +0 -54
  308. package/lib/deltaManagerProxy.d.ts.map +0 -1
  309. package/lib/deltaManagerProxy.js +0 -110
  310. package/lib/deltaManagerProxy.js.map +0 -1
  311. package/lib/deltaQueue.d.ts.map +0 -1
  312. package/lib/deltaQueue.js.map +0 -1
  313. package/lib/index.d.ts +0 -8
  314. package/lib/index.d.ts.map +0 -1
  315. package/lib/index.js +0 -8
  316. package/lib/index.js.map +0 -1
  317. package/lib/loader.d.ts.map +0 -1
  318. package/lib/loader.js +0 -236
  319. package/lib/loader.js.map +0 -1
  320. package/lib/packageVersion.d.ts.map +0 -1
  321. package/lib/packageVersion.js.map +0 -1
  322. package/lib/protocolTreeDocumentStorageService.d.ts.map +0 -1
  323. package/lib/protocolTreeDocumentStorageService.js.map +0 -1
  324. package/lib/quorum.d.ts +0 -21
  325. package/lib/quorum.d.ts.map +0 -1
  326. package/lib/quorum.js +0 -38
  327. package/lib/quorum.js.map +0 -1
  328. package/lib/retriableDocumentStorageService.d.ts.map +0 -1
  329. package/lib/retriableDocumentStorageService.js.map +0 -1
  330. package/lib/utils.d.ts +0 -34
  331. package/lib/utils.d.ts.map +0 -1
  332. package/lib/utils.js.map +0 -1
  333. package/src/collabWindowTracker.ts +0 -102
  334. package/src/deltaManagerProxy.ts +0 -158
  335. package/tsconfig.esnext.json +0 -7
package/src/deltaQueue.ts CHANGED
@@ -4,162 +4,166 @@
4
4
  */
5
5
 
6
6
  import { IDeltaQueue, IDeltaQueueEvents } from "@fluidframework/container-definitions";
7
- import { assert, performance, TypedEventEmitter } from "@fluidframework/common-utils";
7
+ import { assert } from "@fluidframework/core-utils";
8
+ import { performance, TypedEventEmitter } from "@fluid-internal/client-utils";
8
9
  import Deque from "double-ended-queue";
9
10
 
10
11
  export interface IDeltaQueueWriter<T> {
11
- push(task: T): void;
12
- clear(): void;
12
+ push(task: T): void;
13
+ clear(): void;
13
14
  }
14
15
 
15
16
  export class DeltaQueue<T>
16
- extends TypedEventEmitter<IDeltaQueueEvents<T>>
17
- implements IDeltaQueue<T>, IDeltaQueueWriter<T> {
18
- private isDisposed: boolean = false;
19
- private readonly q = new Deque<T>();
20
-
21
- /**
22
- * Tracks the number of pause requests for the queue
23
- * The DeltaQueue is create initially paused.
24
- */
25
- private pauseCount = 1;
26
-
27
- private error: any | undefined;
28
-
29
- /**
30
- * When processing is ongoing, holds a deferred that will resolve once processing stops.
31
- * Undefined when not processing.
32
- */
33
- private processingPromise: Promise<{ count: number; duration: number; }> | undefined;
34
-
35
- public get disposed(): boolean {
36
- return this.isDisposed;
37
- }
38
-
39
- /**
40
- * @returns True if the queue is paused, false if not.
41
- */
42
- public get paused(): boolean {
43
- return this.pauseCount !== 0;
44
- }
45
-
46
- public get length(): number {
47
- return this.q.length;
48
- }
49
-
50
- public get idle(): boolean {
51
- return this.processingPromise === undefined && this.q.length === 0;
52
- }
53
-
54
- public async waitTillProcessingDone() {
55
- return this.processingPromise ?? { count: 0, duration: 0 };
56
- }
57
-
58
- /**
59
- * @param worker - A callback to process a delta.
60
- * @param logger - For logging telemetry.
61
- */
62
- constructor(
63
- private readonly worker: (delta: T) => void,
64
- ) {
65
- super();
66
- }
67
-
68
- public dispose() {
69
- throw new Error("Not implemented.");
70
- this.isDisposed = true;
71
- }
72
-
73
- public clear(): void {
74
- this.q.clear();
75
- }
76
-
77
- public peek(): T | undefined {
78
- return this.q.peekFront();
79
- }
80
-
81
- public toArray(): T[] {
82
- return this.q.toArray();
83
- }
84
-
85
- public push(task: T) {
86
- try {
87
- this.q.push(task);
88
- this.emit("push", task);
89
- this.ensureProcessing();
90
- } catch (error) {
91
- this.emit("error", error);
92
- }
93
- }
94
-
95
- public async pause(): Promise<void> {
96
- this.pauseCount++;
97
- // If called from within the processing loop, we are in the middle of processing an op. Return a promise
98
- // that will resolve when processing has actually stopped.
99
- await this.waitTillProcessingDone();
100
- }
101
-
102
- public resume(): void {
103
- assert(this.pauseCount > 0, 0x0f4 /* "Nonzero pause-count on resume()" */);
104
- this.pauseCount--;
105
- this.ensureProcessing();
106
- }
107
-
108
- /**
109
- * There are several actions that may need to kick off delta processing, so we want to guard against
110
- * accidental reentrancy. ensureProcessing can be called safely to start the processing loop if it is
111
- * not already started.
112
- */
113
- private ensureProcessing() {
114
- if (this.anythingToProcess() && this.processingPromise === undefined) {
115
- // Use a resolved promise to start the processing on a separate stack.
116
- this.processingPromise = Promise.resolve().then(() => {
117
- assert(this.processingPromise !== undefined, "reentrancy?");
118
- const result = this.processDeltas();
119
- assert(this.processingPromise !== undefined, "reentrancy?");
120
- // WARNING: Do not move next line to .finally() clause!
121
- // It runs async and creates a race condition where incoming ensureProcessing() call observes
122
- // from previous run while previous run is over (but finally clause was not scheduled yet)
123
- this.processingPromise = undefined;
124
- return result;
125
- }).catch((error) => {
126
- this.error = error;
127
- this.processingPromise = undefined;
128
- this.emit("error", error);
129
- return { count: 0, duration: 0 };
130
- });
131
- assert(this.processingPromise !== undefined, "processDeltas() should run async");
132
- }
133
- }
134
-
135
- private anythingToProcess() {
136
- return this.q.length !== 0 && !this.paused && this.error === undefined;
137
- }
138
-
139
- /**
140
- * Executes the delta processing loop until a stop condition is reached.
141
- */
142
- private processDeltas() {
143
- const start = performance.now();
144
- let count = 0;
145
-
146
- // For grouping to work we must process all local messages immediately and in the single turn.
147
- // So loop over them until no messages to process, we have become paused, or hit an error.
148
- while (this.anythingToProcess()) {
149
- // Get the next message in the queue
150
- const next = this.q.shift();
151
- count++;
152
- // Process the message.
153
- // We know next is defined since we did a length check just prior to shifting.
154
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
155
- this.worker(next!);
156
- this.emit("op", next);
157
- }
158
-
159
- const duration = performance.now() - start;
160
- if (this.q.length === 0) {
161
- this.emit("idle", count, duration);
162
- }
163
- return { count, duration };
164
- }
17
+ extends TypedEventEmitter<IDeltaQueueEvents<T>>
18
+ implements IDeltaQueue<T>, IDeltaQueueWriter<T>
19
+ {
20
+ private isDisposed: boolean = false;
21
+ private readonly q = new Deque<T>();
22
+
23
+ /**
24
+ * Tracks the number of pause requests for the queue.
25
+ * The DeltaQueue is created initially paused.
26
+ */
27
+ private pauseCount = 1;
28
+
29
+ private error: any | undefined;
30
+
31
+ /**
32
+ * When processing is ongoing, holds a deferred that will resolve once processing stops.
33
+ * Undefined when not processing.
34
+ */
35
+ private processingPromise: Promise<{ count: number; duration: number }> | undefined;
36
+
37
+ public get disposed(): boolean {
38
+ return this.isDisposed;
39
+ }
40
+
41
+ /**
42
+ * @returns True if the queue is paused, false if not.
43
+ */
44
+ public get paused(): boolean {
45
+ return this.pauseCount !== 0;
46
+ }
47
+
48
+ public get length(): number {
49
+ return this.q.length;
50
+ }
51
+
52
+ public get idle(): boolean {
53
+ return this.processingPromise === undefined && this.q.length === 0;
54
+ }
55
+
56
+ public async waitTillProcessingDone() {
57
+ return this.processingPromise ?? { count: 0, duration: 0 };
58
+ }
59
+
60
+ /**
61
+ * @param worker - A callback to process a delta.
62
+ */
63
+ constructor(private readonly worker: (delta: T) => void) {
64
+ super();
65
+ }
66
+
67
+ public dispose() {
68
+ throw new Error("Not implemented.");
69
+ this.isDisposed = true;
70
+ }
71
+
72
+ public clear(): void {
73
+ this.q.clear();
74
+ }
75
+
76
+ public peek(): T | undefined {
77
+ return this.q.peekFront();
78
+ }
79
+
80
+ public toArray(): T[] {
81
+ return this.q.toArray();
82
+ }
83
+
84
+ public push(task: T) {
85
+ try {
86
+ this.q.push(task);
87
+ this.emit("push", task);
88
+ this.ensureProcessing();
89
+ } catch (error) {
90
+ this.emit("error", error);
91
+ }
92
+ }
93
+
94
+ public async pause(): Promise<void> {
95
+ this.pauseCount++;
96
+ // If called from within the processing loop, we are in the middle of processing an op. Return a promise
97
+ // that will resolve when processing has actually stopped.
98
+ await this.waitTillProcessingDone();
99
+ }
100
+
101
+ public resume(): void {
102
+ assert(this.pauseCount > 0, 0x0f4 /* "Nonzero pause-count on resume()" */);
103
+ this.pauseCount--;
104
+ this.ensureProcessing();
105
+ }
106
+
107
+ /**
108
+ * There are several actions that may need to kick off delta processing, so we want to guard against
109
+ * accidental reentrancy. ensureProcessing can be called safely to start the processing loop if it is
110
+ * not already started.
111
+ */
112
+ private ensureProcessing() {
113
+ if (this.anythingToProcess() && this.processingPromise === undefined) {
114
+ // Use a resolved promise to start the processing on a separate stack.
115
+ this.processingPromise = Promise.resolve()
116
+ .then(() => {
117
+ assert(this.processingPromise !== undefined, 0x37f /* reentrancy? */);
118
+ const result = this.processDeltas();
119
+ assert(this.processingPromise !== undefined, 0x380 /* reentrancy? */);
120
+ // WARNING: Do not move next line to .finally() clause!
121
+ // It runs async and creates a race condition where incoming ensureProcessing() call observes
122
+ // from previous run while previous run is over (but finally clause was not scheduled yet)
123
+ this.processingPromise = undefined;
124
+ return result;
125
+ })
126
+ .catch((error) => {
127
+ this.error = error;
128
+ this.processingPromise = undefined;
129
+ this.emit("error", error);
130
+ return { count: 0, duration: 0 };
131
+ });
132
+ assert(
133
+ this.processingPromise !== undefined,
134
+ 0x381 /* processDeltas() should run async */,
135
+ );
136
+ }
137
+ }
138
+
139
+ private anythingToProcess() {
140
+ return this.q.length !== 0 && !this.paused && this.error === undefined;
141
+ }
142
+
143
+ /**
144
+ * Executes the delta processing loop until a stop condition is reached.
145
+ */
146
+ private processDeltas() {
147
+ const start = performance.now();
148
+ let count = 0;
149
+
150
+ // For grouping to work we must process all local messages immediately and in the single turn.
151
+ // So loop over them until no messages to process, we have become paused, or hit an error.
152
+ while (this.anythingToProcess()) {
153
+ // Get the next message in the queue
154
+ const next = this.q.shift();
155
+ count++;
156
+ // Process the message.
157
+ // We know next is defined since we did a length check just prior to shifting.
158
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
159
+ this.worker(next!);
160
+ this.emit("op", next);
161
+ }
162
+
163
+ const duration = performance.now() - start;
164
+ if (this.q.length === 0) {
165
+ this.emit("idle", count, duration);
166
+ }
167
+ return { count, duration };
168
+ }
165
169
  }
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { IDisposable } from "@fluidframework/core-interfaces";
7
+
8
+ /**
9
+ * Returns a wrapper around the provided function, which will only invoke the inner function if the provided
10
+ * {@link @fluidframework/core-interfaces#IDisposable | disposable} object has not yet been disposed.
11
+ *
12
+ * @throws Will throw an error if the item has already been disposed.
13
+ */
14
+ export function doIfNotDisposed<T>(
15
+ disposable: IDisposable,
16
+ f: (...args: any[]) => T,
17
+ ): (...args: any[]) => T {
18
+ return (...args: any[]): T => {
19
+ if (disposable.disposed) {
20
+ throw new Error("Already disposed");
21
+ } else {
22
+ return f(...args);
23
+ }
24
+ };
25
+ }
package/src/error.ts ADDED
@@ -0,0 +1,44 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ITelemetryProperties, IThrottlingWarning } from "@fluidframework/core-interfaces";
7
+ import { ContainerErrorTypes } from "@fluidframework/container-definitions";
8
+ import {
9
+ IFluidErrorBase,
10
+ ITelemetryLoggerExt,
11
+ LoggingError,
12
+ wrapErrorAndLog,
13
+ } from "@fluidframework/telemetry-utils";
14
+
15
+ /**
16
+ * Warning emitted when requests to storage are being throttled.
17
+ */
18
+ export class ThrottlingWarning extends LoggingError implements IThrottlingWarning, IFluidErrorBase {
19
+ /**
20
+ * {@inheritDoc @fluidframework/telemetry-utils#IFluidErrorBase.errorType}
21
+ */
22
+ public readonly errorType = ContainerErrorTypes.throttlingError;
23
+
24
+ private constructor(
25
+ message: string,
26
+ readonly retryAfterSeconds: number,
27
+ props?: ITelemetryProperties,
28
+ ) {
29
+ super(message, props);
30
+ }
31
+
32
+ /**
33
+ * Wrap the given error as a ThrottlingWarning
34
+ * Only preserves the error message, and applies the given retry after to the new warning object
35
+ */
36
+ public static wrap(
37
+ error: unknown,
38
+ retryAfterSeconds: number,
39
+ logger: ITelemetryLoggerExt,
40
+ ): IThrottlingWarning {
41
+ const newErrorFn = (errMsg: string) => new ThrottlingWarning(errMsg, retryAfterSeconds);
42
+ return wrapErrorAndLog(error, newErrorFn, logger);
43
+ }
44
+ }
package/src/index.ts CHANGED
@@ -4,20 +4,19 @@
4
4
  */
5
5
 
6
6
  export { ConnectionState } from "./connectionState";
7
+ export { IContainerExperimental, waitContainerToCatchUp } from "./container";
7
8
  export {
8
- Container,
9
- IContainerLoadOptions,
10
- IContainerConfig,
11
- IPendingContainerState,
12
- waitContainerToCatchUp,
13
- } from "./container";
14
- export {
15
- ICodeDetailsLoader,
16
- IDetachedBlobStorage,
17
- IFluidModuleWithDetails,
18
- ILoaderOptions,
19
- ILoaderProps,
20
- ILoaderServices,
21
- Loader,
22
- RelativeLoader,
9
+ ICodeDetailsLoader,
10
+ IDetachedBlobStorage,
11
+ IFluidModuleWithDetails,
12
+ ILoaderOptions,
13
+ ILoaderProps,
14
+ ILoaderServices,
15
+ Loader,
23
16
  } from "./loader";
17
+ export {
18
+ isLocationRedirectionError,
19
+ resolveWithLocationRedirectionHandling,
20
+ } from "./location-redirection-utilities";
21
+ export { IProtocolHandler, ProtocolHandlerBuilder } from "./protocol";
22
+ export { tryParseCompatibleResolvedUrl, IParsedUrl } from "./utils";