@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +155 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +169 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +96 -106
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +107 -52
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +180 -165
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +195 -93
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,29 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- /**
6
- * Creates a test config provider with the ability to set configs values and clear all config values.
7
- * @internal
8
- */
9
- export const createTestConfigProvider = () => {
10
- const settings = {};
11
- return {
12
- getRawConfig: (name) => settings[name],
13
- set: (key, value) => {
14
- settings[key] = value;
15
- },
16
- clear: () => {
17
- Object.keys(settings).forEach((key) => {
18
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
19
- delete settings[key];
20
- });
21
- },
22
- };
23
- };
24
- export const parseNothing = async () => {
25
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
26
- const x = {};
27
- return x;
28
- };
29
- //# sourceMappingURL=gcUnitTestHelpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcUnitTestHelpers.js","sourceRoot":"","sources":["../../../src/test/gc/gcUnitTestHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAC5C,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,OAAO;QACN,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC3D,GAAG,EAAE,CAAC,GAAW,EAAE,KAAkB,EAAE,EAAE;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACX,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,gEAAgE;gBAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,IAAO,EAAE;IAC3D,yEAAyE;IACzE,MAAM,CAAC,GAAM,EAAO,CAAC;IACrB,OAAO,CAAC,CAAC;AACV,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ConfigTypes } from \"@fluidframework/core-interfaces\";\nimport { ReadAndParseBlob } from \"@fluidframework/runtime-utils\";\n\n/**\n * Creates a test config provider with the ability to set configs values and clear all config values.\n * @internal\n */\nexport const createTestConfigProvider = () => {\n\tconst settings: Record<string, ConfigTypes> = {};\n\treturn {\n\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t\tset: (key: string, value: ConfigTypes) => {\n\t\t\tsettings[key] = value;\n\t\t},\n\t\tclear: () => {\n\t\t\tObject.keys(settings).forEach((key) => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete settings[key];\n\t\t\t});\n\t\t},\n\t};\n};\n\nexport const parseNothing: ReadAndParseBlob = async <T>() => {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst x: T = {} as T;\n\treturn x;\n};\n"]}
@@ -1,192 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { useFakeTimers, spy } from "sinon";
7
- import { UnreferencedState, UnreferencedStateTracker } from "../../gc/index.js";
8
- describe("Garbage Collection Tests", () => {
9
- let clock;
10
- before(() => {
11
- clock = useFakeTimers();
12
- });
13
- afterEach(() => {
14
- clock.reset();
15
- });
16
- after(() => {
17
- clock.restore();
18
- });
19
- describe("UnreferencedStateTracker", () => {
20
- let tracker;
21
- afterEach(() => {
22
- tracker.stopTracking();
23
- });
24
- /**
25
- * During the lifetime of an unreferenced object, its state is tracked and updated in two ways.
26
- * Timers are set to trigger transitioning to the next state, and updateTracking is also called
27
- * whenever GC runs.
28
- * These tests specify how to advance the clock (to hit the timers) and also when to call updateTracking,
29
- * checking that the expected state transitions occur as specified
30
- */
31
- function runTestCase(allSteps) {
32
- const [start, ...steps] = allSteps;
33
- clock.tick(start.time);
34
- tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, start.time /* currentReferenceTimestampMs */, 20 /* tombstoneTimeoutMs */, start.sweepGracePeriodMs ?? 10 /* sweepGracePeriodMs */);
35
- assert.equal(tracker.state, start.state, `Wrong starting state`);
36
- steps.forEach(({ time: advanceClockTo, updateWith, state: expectedState }, index) => {
37
- assert(advanceClockTo > clock.now, "INVALID TEST CASE: steps must move forward in time, following start");
38
- clock.tick(advanceClockTo - clock.now);
39
- if (updateWith !== undefined) {
40
- tracker.updateTracking(updateWith);
41
- }
42
- assert.equal(tracker.state, expectedState, `Wrong state at step ${index + 1}`); // 0-indexed including start
43
- });
44
- }
45
- /**
46
- * Test cases to run through above function runTestCase
47
- *
48
- * In all cases:
49
- * - unreferencedTimestampMs = 0
50
- * - inactiveTimeoutMs = 10
51
- * - tombstoneTimeoutMs = 20
52
- * - sweepGracePeriodMs defaults to 10 (so sweep at 30)
53
- */
54
- const testCases = [
55
- {
56
- name: "No calls to updateTracking",
57
- steps: [
58
- { time: 0, state: "Active" },
59
- { time: 3, state: "Active" },
60
- { time: 5, state: "Active" },
61
- { time: 12, state: "Inactive" },
62
- { time: 15, state: "Inactive" },
63
- { time: 25, state: "TombstoneReady" },
64
- { time: 35, state: "SweepReady" },
65
- ],
66
- },
67
- {
68
- name: "No calls to updateTracking - sweepGracePeriodMs 0 (no Tombstone phase)",
69
- steps: [
70
- { time: 0, state: "Active", sweepGracePeriodMs: 0 },
71
- { time: 3, state: "Active" },
72
- { time: 5, state: "Active" },
73
- { time: 12, state: "Inactive" },
74
- { time: 19, state: "Inactive" },
75
- { time: 20, state: "SweepReady" },
76
- { time: 21, state: "SweepReady" },
77
- ],
78
- },
79
- {
80
- name: "Skip to SweepReady",
81
- steps: [
82
- { time: 0, state: "Active" },
83
- { time: 5, state: "Active" },
84
- { time: 35, state: "SweepReady" },
85
- ],
86
- },
87
- {
88
- name: "Skip to SweepReady - sweepGracePeriodMs 0 (no Tombstone phase)",
89
- steps: [
90
- { time: 0, state: "Active", sweepGracePeriodMs: 0 },
91
- { time: 5, state: "Active" },
92
- { time: 20, state: "SweepReady" },
93
- ],
94
- },
95
- {
96
- name: "Skip to SweepReady (via updateTracking) - sweepGracePeriodMs 0 (no Tombstone phase)",
97
- steps: [
98
- { time: 0, state: "Active", sweepGracePeriodMs: 0 },
99
- { time: 5, state: "Active" },
100
- { time: 20, updateWith: 20, state: "SweepReady" },
101
- ],
102
- },
103
- {
104
- name: "Call update, but triggered via timers",
105
- steps: [
106
- { time: 0, state: "Active" },
107
- { time: 3, updateWith: 2, state: "Active" },
108
- { time: 5, updateWith: 5, state: "Active" },
109
- { time: 12, updateWith: 9, state: "Inactive" },
110
- { time: 17, updateWith: 15, state: "Inactive" }, // No-op, timer already fired
111
- ],
112
- },
113
- {
114
- name: "currentReferenceTimestampMs jumps ahead",
115
- steps: [
116
- { time: 0, state: "Active" },
117
- { time: 5, state: "Active" },
118
- { time: 10, state: "Inactive" },
119
- { time: 11, updateWith: 20, state: "TombstoneReady" }, // Shouldn't be physically possible, but supported in API
120
- ],
121
- },
122
- {
123
- name: "Start Inactive",
124
- steps: [
125
- { time: 12, state: "Inactive" },
126
- { time: 15, state: "Inactive" },
127
- { time: 20, state: "TombstoneReady" },
128
- { time: 35, state: "SweepReady" },
129
- ],
130
- },
131
- {
132
- name: "Start TombstoneReady",
133
- steps: [
134
- { time: 22, state: "TombstoneReady" },
135
- { time: 25, state: "TombstoneReady" },
136
- { time: 35, state: "SweepReady" },
137
- ],
138
- },
139
- {
140
- name: "Start SweepReady",
141
- steps: [{ time: 32, state: "SweepReady" }],
142
- },
143
- ];
144
- testCases.forEach((testCase) => {
145
- it(testCase.name, () => {
146
- runTestCase(testCase.steps);
147
- });
148
- });
149
- it("Non-zero unreferencedTimestampMs properly offsets", () => {
150
- tracker = new UnreferencedStateTracker(10 /* unreferencedTimestampMs */, 3 /* inactiveTimeoutMs */, 11 /* currentReferenceTimestampMs */, 7 /* tombstoneTimeoutMs */, 15 /* sweepGracePeriodMs */);
151
- assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
152
- clock.tick(2);
153
- assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive 2ms later (at 13)");
154
- tracker.updateTracking(17);
155
- assert.equal(tracker.state, UnreferencedState.TombstoneReady, "Should be TombstoneReady after currentReferenceTimestampMs=17");
156
- clock.tick(15);
157
- assert.equal(tracker.state, UnreferencedState.SweepReady, "Should be SweepReady 15ms later");
158
- });
159
- it("Timers can't be crossed", () => {
160
- tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, 0 /* currentReferenceTimestampMs */, 12 /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
161
- assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
162
- tracker.updateTracking(10);
163
- // Would be 10ms left on Inactive timer, but it was just cleared. 2ms left on Sweep timer
164
- assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive after currentReferenceTimestampMs=10");
165
- clock.tick(2);
166
- assert.equal(tracker.state, UnreferencedState.SweepReady, "Should be SweepReady 2ms later");
167
- });
168
- it("Timers can tighten up over time", () => {
169
- clock.tick(10);
170
- tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 20 /* inactiveTimeoutMs */, 5 /* currentReferenceTimestampMs */, undefined /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
171
- assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
172
- const timerClearSpy = spy(tracker.inactiveTimer, "clear");
173
- // At T10 we had 15 to go based on server timestamps, so Timer is set to 25
174
- clock.tick(6); // at T16 (9 to go)
175
- tracker.updateTracking(15); // Simulate processing a more-recent Summary (reference time 15 at T16). Pulls in timer to 21 (5 to go)
176
- assert(timerClearSpy.callCount > 0, "Expected underlying Timer to clear and reset to support shorter timeout");
177
- clock.tick(5);
178
- assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive at T21");
179
- });
180
- it("Timers can loosen up over time", () => {
181
- tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, 0 /* currentReferenceTimestampMs */, undefined /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
182
- assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
183
- clock.tick(5); // at T5, 5 to go
184
- tracker.updateTracking(1); // Simulate processing an older Summary (reference time 1 at T5). Pushes out timer to 14 (9 to go)
185
- clock.tick(5);
186
- assert.equal(tracker.state, UnreferencedState.Active, "Should still be Active since timer was pushed out");
187
- clock.tick(4);
188
- assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive finally at T14");
189
- });
190
- });
191
- });
192
- //# sourceMappingURL=gcUnreferencedStateTracker.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcUnreferencedStateTracker.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcUnreferencedStateTracker.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SinonFakeTimers, SinonSpy, useFakeTimers, spy } from \"sinon\";\nimport { UnreferencedState, UnreferencedStateTracker } from \"../../gc/index.js\";\n\n/** Schema for steps taken to test unreferenced state progression / tracking */\ntype Steps = [\n\t{\n\t\t/** Start time (used as both local time and currentReferenceTimestampMs) */\n\t\ttime: number;\n\t\t/** Expected initial state */\n\t\tstate: UnreferencedState;\n\t\t/** Configured sweepGracePeriodMs - defaults to 10ms for these tests */\n\t\tsweepGracePeriodMs?: number;\n\t},\n\t...{\n\t\t/** Local time of the next step */\n\t\ttime: number;\n\t\t/** If defined, call updateTracking with this as currentReferenceTimestampMs */\n\t\tupdateWith?: number;\n\t\t/** Expected new state (after calling updateTracking if applicable) */\n\t\tstate: UnreferencedState;\n\t}[],\n];\n\ndescribe(\"Garbage Collection Tests\", () => {\n\tlet clock: SinonFakeTimers;\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tdescribe(\"UnreferencedStateTracker\", () => {\n\t\tlet tracker: UnreferencedStateTracker;\n\n\t\tafterEach(() => {\n\t\t\ttracker.stopTracking();\n\t\t});\n\n\t\t/**\n\t\t * During the lifetime of an unreferenced object, its state is tracked and updated in two ways.\n\t\t * Timers are set to trigger transitioning to the next state, and updateTracking is also called\n\t\t * whenever GC runs.\n\t\t * These tests specify how to advance the clock (to hit the timers) and also when to call updateTracking,\n\t\t * checking that the expected state transitions occur as specified\n\t\t */\n\t\tfunction runTestCase(allSteps: Steps) {\n\t\t\tconst [start, ...steps] = allSteps;\n\t\t\tclock.tick(start.time);\n\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\tstart.time /* currentReferenceTimestampMs */,\n\t\t\t\t20 /* tombstoneTimeoutMs */,\n\t\t\t\tstart.sweepGracePeriodMs ?? 10 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, start.state, `Wrong starting state`);\n\t\t\tsteps.forEach(({ time: advanceClockTo, updateWith, state: expectedState }, index) => {\n\t\t\t\tassert(\n\t\t\t\t\tadvanceClockTo > clock.now,\n\t\t\t\t\t\"INVALID TEST CASE: steps must move forward in time, following start\",\n\t\t\t\t);\n\t\t\t\tclock.tick(advanceClockTo - clock.now);\n\n\t\t\t\tif (updateWith !== undefined) {\n\t\t\t\t\ttracker.updateTracking(updateWith);\n\t\t\t\t}\n\n\t\t\t\tassert.equal(tracker.state, expectedState, `Wrong state at step ${index + 1}`); // 0-indexed including start\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Test cases to run through above function runTestCase\n\t\t *\n\t\t * In all cases:\n\t\t * - unreferencedTimestampMs = 0\n\t\t * - inactiveTimeoutMs = 10\n\t\t * - tombstoneTimeoutMs = 20\n\t\t * - sweepGracePeriodMs defaults to 10 (so sweep at 30)\n\t\t */\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tsteps: Steps;\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"No calls to updateTracking\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 3, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 15, state: \"Inactive\" },\n\t\t\t\t\t{ time: 25, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"No calls to updateTracking - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 3, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 19, state: \"Inactive\" },\n\t\t\t\t\t{ time: 20, state: \"SweepReady\" },\n\t\t\t\t\t{ time: 21, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 20, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady (via updateTracking) - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 20, updateWith: 20, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Call update, but triggered via timers\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 3, updateWith: 2, state: \"Active\" },\n\t\t\t\t\t{ time: 5, updateWith: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, updateWith: 9, state: \"Inactive\" }, // Timer will have fired even though server time hasn't passed threshold\n\t\t\t\t\t{ time: 17, updateWith: 15, state: \"Inactive\" }, // No-op, timer already fired\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"currentReferenceTimestampMs jumps ahead\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 10, state: \"Inactive\" },\n\t\t\t\t\t{ time: 11, updateWith: 20, state: \"TombstoneReady\" }, // Shouldn't be physically possible, but supported in API\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start Inactive\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 15, state: \"Inactive\" },\n\t\t\t\t\t{ time: 20, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start TombstoneReady\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 22, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 25, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start SweepReady\",\n\t\t\t\tsteps: [{ time: 32, state: \"SweepReady\" }],\n\t\t\t},\n\t\t];\n\n\t\ttestCases.forEach((testCase) => {\n\t\t\tit(testCase.name, () => {\n\t\t\t\trunTestCase(testCase.steps);\n\t\t\t});\n\t\t});\n\n\t\tit(\"Non-zero unreferencedTimestampMs properly offsets\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t10 /* unreferencedTimestampMs */,\n\t\t\t\t3 /* inactiveTimeoutMs */,\n\t\t\t\t11 /* currentReferenceTimestampMs */,\n\t\t\t\t7 /* tombstoneTimeoutMs */,\n\t\t\t\t15 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tclock.tick(2);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive 2ms later (at 13)\",\n\t\t\t);\n\t\t\ttracker.updateTracking(17);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.TombstoneReady,\n\t\t\t\t\"Should be TombstoneReady after currentReferenceTimestampMs=17\",\n\t\t\t);\n\t\t\tclock.tick(15);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.SweepReady,\n\t\t\t\t\"Should be SweepReady 15ms later\",\n\t\t\t);\n\t\t});\n\t\tit(\"Timers can't be crossed\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\t0 /* currentReferenceTimestampMs */,\n\t\t\t\t12 /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\ttracker.updateTracking(10);\n\t\t\t// Would be 10ms left on Inactive timer, but it was just cleared. 2ms left on Sweep timer\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive after currentReferenceTimestampMs=10\",\n\t\t\t);\n\t\t\tclock.tick(2);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.SweepReady,\n\t\t\t\t\"Should be SweepReady 2ms later\",\n\t\t\t);\n\t\t});\n\t\tit(\"Timers can tighten up over time\", () => {\n\t\t\tclock.tick(10);\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t20 /* inactiveTimeoutMs */,\n\t\t\t\t5 /* currentReferenceTimestampMs */,\n\t\t\t\tundefined /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tconst timerClearSpy: SinonSpy = spy((tracker as any).inactiveTimer, \"clear\");\n\t\t\t// At T10 we had 15 to go based on server timestamps, so Timer is set to 25\n\t\t\tclock.tick(6); // at T16 (9 to go)\n\t\t\ttracker.updateTracking(15); // Simulate processing a more-recent Summary (reference time 15 at T16). Pulls in timer to 21 (5 to go)\n\t\t\tassert(\n\t\t\t\ttimerClearSpy.callCount > 0,\n\t\t\t\t\"Expected underlying Timer to clear and reset to support shorter timeout\",\n\t\t\t);\n\t\t\tclock.tick(5);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Inactive, \"Should be Inactive at T21\");\n\t\t});\n\t\tit(\"Timers can loosen up over time\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\t0 /* currentReferenceTimestampMs */,\n\t\t\t\tundefined /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tclock.tick(5); // at T5, 5 to go\n\t\t\ttracker.updateTracking(1); // Simulate processing an older Summary (reference time 1 at T5). Pushes out timer to 14 (9 to go)\n\t\t\tclock.tick(5);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Active,\n\t\t\t\t\"Should still be Active since timer was pushed out\",\n\t\t\t);\n\t\t\tclock.tick(4);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive finally at T14\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
@@ -1,193 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { createChildLogger, mixinMonitoringContext, } from "@fluidframework/telemetry-utils";
7
- import { IsoBuffer } from "@fluid-internal/client-utils";
8
- import { MockRuntime, validateSummary } from "./blobManager.spec.js";
9
- describe("getPendingLocalState", () => {
10
- let runtime;
11
- let mc;
12
- beforeEach(() => {
13
- mc = mixinMonitoringContext(createChildLogger(), undefined);
14
- runtime = new MockRuntime(mc);
15
- });
16
- it("get blobs while uploading", async () => {
17
- await runtime.attach();
18
- await runtime.connect();
19
- const blob = IsoBuffer.from("blob", "utf8");
20
- const handleP = runtime.createBlob(blob);
21
- const pendingStateP = runtime.getPendingLocalState();
22
- await runtime.processHandles();
23
- await assert.doesNotReject(handleP);
24
- const pendingState = await pendingStateP;
25
- const pendingBlobs = pendingState[1] ?? {};
26
- assert.strictEqual(Object.keys(pendingBlobs).length, 1);
27
- assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
28
- assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
29
- assert.strictEqual(Object.values(pendingBlobs)[0].uploadTime, undefined);
30
- const summaryData = validateSummary(runtime);
31
- assert.strictEqual(summaryData.ids.length, 0);
32
- assert.strictEqual(summaryData.redirectTable, undefined);
33
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
34
- await runtime2.attach();
35
- await runtime2.connect();
36
- await runtime2.processAll();
37
- const summaryData2 = validateSummary(runtime2);
38
- assert.strictEqual(summaryData2.ids.length, 1);
39
- assert.strictEqual(summaryData2.redirectTable.size, 1);
40
- });
41
- it("get blobs and wait for blob attach while waiting for op", async () => {
42
- await runtime.attach();
43
- await runtime.connect();
44
- const blob = IsoBuffer.from("blob", "utf8");
45
- const handleP = runtime.createBlob(blob);
46
- await runtime.processBlobs(true);
47
- const pendingStateP = runtime.getPendingLocalState();
48
- await runtime.processHandles();
49
- await assert.doesNotReject(handleP);
50
- const pendingState = await pendingStateP;
51
- const pendingBlobs = pendingState[1] ?? {};
52
- assert.strictEqual(Object.keys(pendingBlobs).length, 1);
53
- assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
54
- assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
55
- assert.ok(Object.values(pendingBlobs)[0].uploadTime);
56
- const summaryData = validateSummary(runtime);
57
- assert.strictEqual(summaryData.ids.length, 0);
58
- assert.strictEqual(summaryData.redirectTable, undefined);
59
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
60
- await runtime2.attach();
61
- await runtime2.connect();
62
- await runtime2.processAll();
63
- const summaryData2 = validateSummary(runtime2);
64
- assert.strictEqual(summaryData2.ids.length, 1);
65
- assert.strictEqual(summaryData2.redirectTable.size, 1);
66
- });
67
- it("shutdown multiple blobs", async () => {
68
- await runtime.attach();
69
- await runtime.connect();
70
- const blob = IsoBuffer.from("blob", "utf8");
71
- const handleP = runtime.createBlob(blob);
72
- await runtime.processBlobs(true);
73
- const blob2 = IsoBuffer.from("blob2", "utf8");
74
- const handleP2 = runtime.createBlob(blob2);
75
- const pendingStateP = runtime.getPendingLocalState();
76
- await runtime.processHandles();
77
- await assert.doesNotReject(handleP);
78
- await assert.doesNotReject(handleP2);
79
- const pendingState = await pendingStateP;
80
- const pendingBlobs = pendingState[1] ?? {};
81
- assert.strictEqual(Object.keys(pendingBlobs).length, 2);
82
- const summaryData = validateSummary(runtime);
83
- assert.strictEqual(summaryData.ids.length, 0);
84
- assert.strictEqual(summaryData.redirectTable, undefined);
85
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
86
- await runtime2.attach();
87
- await runtime2.connect();
88
- await runtime2.processAll();
89
- const summaryData2 = validateSummary(runtime2);
90
- assert.strictEqual(summaryData2.ids.length, 2);
91
- assert.strictEqual(summaryData2.redirectTable.size, 2);
92
- });
93
- it("upload blob while getting pending state", async () => {
94
- await runtime.attach();
95
- await runtime.connect();
96
- const blob = IsoBuffer.from("blob", "utf8");
97
- const handleP = runtime.createBlob(blob);
98
- await runtime.processBlobs(true);
99
- const blob2 = IsoBuffer.from("blob2", "utf8");
100
- const handleP2 = runtime.createBlob(blob2);
101
- const pendingStateP = runtime.getPendingLocalState();
102
- await runtime.processHandles();
103
- const handleP3 = runtime.createBlob(IsoBuffer.from("blob3", "utf8"));
104
- await runtime.processBlobs(true);
105
- await runtime.processHandles();
106
- await assert.doesNotReject(handleP);
107
- await assert.doesNotReject(handleP2);
108
- await assert.doesNotReject(handleP3);
109
- const pendingState = await pendingStateP;
110
- const pendingBlobs = pendingState[1] ?? {};
111
- assert.strictEqual(Object.keys(pendingBlobs).length, 3);
112
- const summaryData = validateSummary(runtime);
113
- assert.strictEqual(summaryData.ids.length, 0);
114
- assert.strictEqual(summaryData.redirectTable, undefined);
115
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
116
- await runtime2.attach();
117
- await runtime2.connect();
118
- await runtime2.processAll();
119
- const summaryData2 = validateSummary(runtime2);
120
- assert.strictEqual(summaryData2.ids.length, 3);
121
- assert.strictEqual(summaryData2.redirectTable.size, 3);
122
- });
123
- it("retries blob after being rejected if it was stashed", async () => {
124
- await runtime.attach();
125
- await runtime.connect();
126
- const blob = IsoBuffer.from("blob", "utf8");
127
- const handleP = runtime.createBlob(blob);
128
- const pendingStateP = runtime.getPendingLocalState();
129
- await runtime.processHandles();
130
- await assert.doesNotReject(handleP);
131
- const pendingState = await pendingStateP;
132
- const pendingBlobs = pendingState[1] ?? {};
133
- assert.strictEqual(Object.keys(pendingBlobs).length, 1);
134
- assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
135
- assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
136
- assert.strictEqual(Object.values(pendingBlobs)[0].uploadTime, undefined);
137
- const summaryData = validateSummary(runtime);
138
- assert.strictEqual(summaryData.ids.length, 0);
139
- assert.strictEqual(summaryData.redirectTable, undefined);
140
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
141
- await runtime2.attach();
142
- await runtime2.connect(0, true);
143
- await runtime2.processAll();
144
- const summaryData2 = validateSummary(runtime2);
145
- assert.strictEqual(summaryData2.ids.length, 1);
146
- assert.strictEqual(summaryData2.redirectTable.size, 1);
147
- });
148
- it("does not restart upload after applying stashed ops if not expired", async () => {
149
- await runtime.attach();
150
- await runtime.connect();
151
- const blob = IsoBuffer.from("blob", "utf8");
152
- const handleP = runtime.createBlob(blob);
153
- await runtime.processBlobs(true);
154
- const pendingStateP = runtime.getPendingLocalState();
155
- await runtime.processHandles();
156
- await assert.doesNotReject(handleP);
157
- const pendingState = await pendingStateP;
158
- const pendingBlobs = pendingState[1] ?? {};
159
- assert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);
160
- const summaryData = validateSummary(runtime);
161
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
162
- await runtime2.attach();
163
- assert.strictEqual(runtime2.unprocessedBlobs.size, 0);
164
- await runtime2.connect();
165
- await runtime2.processAll();
166
- const summaryData2 = validateSummary(runtime2);
167
- assert.strictEqual(summaryData2.ids.length, 1);
168
- assert.strictEqual(summaryData2.redirectTable.size, 1);
169
- });
170
- it("does restart upload after applying stashed ops if expired", async () => {
171
- await runtime.attach();
172
- await runtime.connect();
173
- runtime.attachedStorage.minTTL = 0.001;
174
- const blob = IsoBuffer.from("blob", "utf8");
175
- const handleP = runtime.createBlob(blob);
176
- await runtime.processBlobs(true);
177
- const pendingStateP = runtime.getPendingLocalState();
178
- await runtime.processHandles();
179
- await assert.doesNotReject(handleP);
180
- const pendingState = await pendingStateP;
181
- const pendingBlobs = pendingState[1] ?? {};
182
- assert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);
183
- const summaryData = validateSummary(runtime);
184
- const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
185
- await runtime2.attach();
186
- await runtime2.connect();
187
- await runtime2.processAll();
188
- const summaryData2 = validateSummary(runtime2);
189
- assert.strictEqual(summaryData2.ids.length, 1);
190
- assert.strictEqual(summaryData2.redirectTable.size, 1);
191
- });
192
- });
193
- //# sourceMappingURL=getPendingBlobs.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getPendingBlobs.spec.js","sourceRoot":"","sources":["../../src/test/getPendingBlobs.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport {\n\tMonitoringContext,\n\tcreateChildLogger,\n\tmixinMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { IsoBuffer } from \"@fluid-internal/client-utils\";\nimport { MockRuntime, validateSummary } from \"./blobManager.spec.js\";\n\ndescribe(\"getPendingLocalState\", () => {\n\tlet runtime: MockRuntime;\n\tlet mc: MonitoringContext;\n\n\tbeforeEach(() => {\n\t\tmc = mixinMonitoringContext(createChildLogger(), undefined);\n\t\truntime = new MockRuntime(mc);\n\t});\n\n\tit(\"get blobs while uploading\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].uploadTime, undefined);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"get blobs and wait for blob attach while waiting for op\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.ok(Object.values<any>(pendingBlobs)[0].uploadTime);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"shutdown multiple blobs\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst blob2 = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\tconst handleP2 = runtime.createBlob(blob2);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tawait assert.doesNotReject(handleP2);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 2);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 2);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 2);\n\t});\n\n\tit(\"upload blob while getting pending state\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst blob2 = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\tconst handleP2 = runtime.createBlob(blob2);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tconst handleP3 = runtime.createBlob(IsoBuffer.from(\"blob3\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tawait assert.doesNotReject(handleP2);\n\t\tawait assert.doesNotReject(handleP3);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 3);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 3);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 3);\n\t});\n\n\tit(\"retries blob after being rejected if it was stashed\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].uploadTime, undefined);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect(0, true);\n\t\tawait runtime2.processAll();\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"does not restart upload after applying stashed ops if not expired\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);\n\t\tconst summaryData = validateSummary(runtime);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tassert.strictEqual(runtime2.unprocessedBlobs.size, 0);\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"does restart upload after applying stashed ops if expired\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\truntime.attachedStorage.minTTL = 0.001;\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);\n\t\tconst summaryData = validateSummary(runtime);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n});\n"]}
@@ -1,93 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import assert from "assert";
6
- import { MockDeltaManager, MockQuorumClients } from "@fluidframework/test-runtime-utils";
7
- import { MockLogger } from "@fluidframework/telemetry-utils";
8
- import { ContainerRuntime, getDeviceSpec } from "../containerRuntime.js";
9
- function setNavigator(navigator) {
10
- global.navigator = navigator;
11
- }
12
- describe("Hardware Stats", () => {
13
- let mockLogger = new MockLogger();
14
- let mockContext = {
15
- deltaManager: new MockDeltaManager(),
16
- quorum: new MockQuorumClients(),
17
- taggedLogger: mockLogger,
18
- clientDetails: { capabilities: { interactive: true } },
19
- updateDirtyContainerState: (dirty) => { },
20
- getLoadedFromVersion: () => undefined,
21
- };
22
- const getDeviceSpecEvents = () => mockLogger.events.filter((event) => event.eventName === "DeviceSpec");
23
- const loadContainer = async () => ContainerRuntime.loadRuntime({
24
- context: mockContext,
25
- registryEntries: [],
26
- runtimeOptions: {
27
- summaryOptions: {
28
- summaryConfigOverrides: { state: "disabled" },
29
- },
30
- },
31
- provideEntryPoint: async () => ({
32
- myProp: "myValue",
33
- }),
34
- existing: false,
35
- });
36
- beforeEach(async () => {
37
- mockLogger = new MockLogger();
38
- mockContext = {
39
- deltaManager: new MockDeltaManager(),
40
- quorum: new MockQuorumClients(),
41
- taggedLogger: mockLogger,
42
- clientDetails: { capabilities: { interactive: true } },
43
- updateDirtyContainerState: (dirty) => { },
44
- getLoadedFromVersion: () => undefined,
45
- };
46
- });
47
- it("should generate correct hardware stats with regular navigator", async () => {
48
- const navigator = {
49
- deviceMemory: 10,
50
- hardwareConcurrency: 8,
51
- };
52
- setNavigator(navigator);
53
- // testing function
54
- const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
55
- assert.strictEqual(deviceMemory, 10, "incorrect deviceMemory value");
56
- assert.strictEqual(hardwareConcurrency, 8, "incorrect hardwareConcurrency value");
57
- await loadContainer();
58
- // checking telemetry
59
- const events = getDeviceSpecEvents();
60
- assert(events !== undefined, "No deviceSpec event found");
61
- assert.strictEqual(events[0].deviceMemory, 10, "incorrect deviceMemory logged");
62
- assert.strictEqual(events[0].hardwareConcurrency, 8, "incorrect hardwareConcurrency logged");
63
- });
64
- it("should generate correct hardware stats with null navigator", async () => {
65
- const navigator = null;
66
- setNavigator(navigator);
67
- // testing function
68
- const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
69
- assert.strictEqual(deviceMemory, undefined, "incorrect deviceMemory value");
70
- assert.strictEqual(hardwareConcurrency, undefined, "incorrect hardwareConcurrency value");
71
- await loadContainer();
72
- // checking telemetry
73
- const events = getDeviceSpecEvents();
74
- assert(events !== undefined, "No deviceSpec event found");
75
- assert.strictEqual(events[0].deviceMemory, undefined, "incorrect deviceMemory logged");
76
- assert.strictEqual(events[0].hardwareConcurrency, undefined, "incorrect hardwareConcurrency logged");
77
- });
78
- it("should generate correct hardware stats with undefined navigator", async () => {
79
- const navigator = undefined;
80
- setNavigator(navigator);
81
- // testing function
82
- const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
83
- assert.strictEqual(deviceMemory, undefined, "incorrect deviceMemory value");
84
- assert.strictEqual(hardwareConcurrency, undefined, "incorrect hardwareConcurrency value");
85
- await loadContainer();
86
- // checking telemetry
87
- const events = getDeviceSpecEvents();
88
- assert(events !== undefined, "No deviceSpec event found");
89
- assert.strictEqual(events[0].deviceMemory, undefined, "incorrect deviceMemory logged");
90
- assert.strictEqual(events[0].hardwareConcurrency, undefined, "incorrect hardwareConcurrency logged");
91
- });
92
- });
93
- //# sourceMappingURL=hardwareStats.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hardwareStats.spec.js","sourceRoot":"","sources":["../../src/test/hardwareStats.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport assert from \"assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { IContainerContext } from \"@fluidframework/container-definitions\";\nimport { MockDeltaManager, MockQuorumClients } from \"@fluidframework/test-runtime-utils\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ContainerRuntime, getDeviceSpec } from \"../containerRuntime.js\";\n\nfunction setNavigator(\n\tnavigator: Partial<Navigator & { deviceMemory?: number }> | undefined | null,\n) {\n\tglobal.navigator = navigator as Navigator;\n}\n\ndescribe(\"Hardware Stats\", () => {\n\tlet mockLogger = new MockLogger();\n\tlet mockContext: Partial<IContainerContext> = {\n\t\tdeltaManager: new MockDeltaManager(),\n\t\tquorum: new MockQuorumClients(),\n\t\ttaggedLogger: mockLogger,\n\t\tclientDetails: { capabilities: { interactive: true } },\n\t\tupdateDirtyContainerState: (dirty: boolean) => {},\n\t\tgetLoadedFromVersion: () => undefined,\n\t};\n\n\tconst getDeviceSpecEvents = (): ITelemetryBaseEvent[] =>\n\t\tmockLogger.events.filter((event) => event.eventName === \"DeviceSpec\");\n\n\tconst loadContainer = async () =>\n\t\tContainerRuntime.loadRuntime({\n\t\t\tcontext: mockContext as IContainerContext,\n\t\t\tregistryEntries: [],\n\t\t\truntimeOptions: {\n\t\t\t\tsummaryOptions: {\n\t\t\t\t\tsummaryConfigOverrides: { state: \"disabled\" },\n\t\t\t\t},\n\t\t\t},\n\t\t\tprovideEntryPoint: async () => ({\n\t\t\t\tmyProp: \"myValue\",\n\t\t\t}),\n\t\t\texisting: false,\n\t\t});\n\n\tbeforeEach(async () => {\n\t\tmockLogger = new MockLogger();\n\t\tmockContext = {\n\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\tquorum: new MockQuorumClients(),\n\t\t\ttaggedLogger: mockLogger,\n\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\tupdateDirtyContainerState: (dirty: boolean) => {},\n\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t};\n\t});\n\n\tit(\"should generate correct hardware stats with regular navigator\", async () => {\n\t\tconst navigator = {\n\t\t\tdeviceMemory: 10,\n\t\t\thardwareConcurrency: 8,\n\t\t};\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, 10, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, 8, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, 10, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\t8,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n\n\tit(\"should generate correct hardware stats with null navigator\", async () => {\n\t\tconst navigator = null;\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, undefined, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, undefined, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, undefined, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\tundefined,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n\n\tit(\"should generate correct hardware stats with undefined navigator\", async () => {\n\t\tconst navigator = undefined;\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, undefined, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, undefined, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, undefined, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\tundefined,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n});\n"]}
package/lib/test/index.js DELETED
@@ -1,6 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- export {};
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IPendingRuntimeState } from \"../containerRuntime.js\";\nexport { IPendingBlobs } from \"../blobManager.js\";\n"]}