@fluidframework/odsp-driver 1.4.0-121020 → 2.0.0-dev-rc.1.0.0.224419

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 (661) hide show
  1. package/.eslintrc.js +12 -12
  2. package/.mocharc.js +12 -0
  3. package/CHANGELOG.md +162 -0
  4. package/README.md +56 -0
  5. package/api-extractor-lint.json +4 -0
  6. package/api-extractor.json +2 -2
  7. package/api-report/odsp-driver.api.md +310 -0
  8. package/dist/{ReadBufferUtils.js → ReadBufferUtils.cjs} +16 -9
  9. package/dist/ReadBufferUtils.cjs.map +1 -0
  10. package/dist/ReadBufferUtils.d.ts.map +1 -1
  11. package/dist/{WriteBufferUtils.js → WriteBufferUtils.cjs} +73 -69
  12. package/dist/WriteBufferUtils.cjs.map +1 -0
  13. package/dist/WriteBufferUtils.d.ts +3 -5
  14. package/dist/WriteBufferUtils.d.ts.map +1 -1
  15. package/dist/{checkUrl.js → checkUrl.cjs} +7 -6
  16. package/dist/checkUrl.cjs.map +1 -0
  17. package/dist/checkUrl.d.ts +1 -0
  18. package/dist/checkUrl.d.ts.map +1 -1
  19. package/dist/compactSnapshotParser.cjs +207 -0
  20. package/dist/compactSnapshotParser.cjs.map +1 -0
  21. package/dist/compactSnapshotParser.d.ts +12 -3
  22. package/dist/compactSnapshotParser.d.ts.map +1 -1
  23. package/dist/{compactSnapshotWriter.js → compactSnapshotWriter.cjs} +43 -33
  24. package/dist/compactSnapshotWriter.cjs.map +1 -0
  25. package/dist/compactSnapshotWriter.d.ts +2 -3
  26. package/dist/compactSnapshotWriter.d.ts.map +1 -1
  27. package/dist/{constants.js → constants.cjs} +7 -1
  28. package/dist/constants.cjs.map +1 -0
  29. package/dist/constants.d.ts +6 -0
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/{contracts.js → contracts.cjs} +1 -1
  32. package/dist/contracts.cjs.map +1 -0
  33. package/dist/contracts.d.ts +16 -53
  34. package/dist/contracts.d.ts.map +1 -1
  35. package/dist/{contractsPublic.js → contractsPublic.cjs} +9 -3
  36. package/dist/contractsPublic.cjs.map +1 -0
  37. package/dist/contractsPublic.d.ts +15 -0
  38. package/dist/contractsPublic.d.ts.map +1 -1
  39. package/dist/createFile.cjs +177 -0
  40. package/dist/createFile.cjs.map +1 -0
  41. package/dist/createFile.d.ts +6 -10
  42. package/dist/createFile.d.ts.map +1 -1
  43. package/dist/createNewContainerOnExistingFile.cjs +60 -0
  44. package/dist/createNewContainerOnExistingFile.cjs.map +1 -0
  45. package/dist/createNewContainerOnExistingFile.d.ts +22 -0
  46. package/dist/createNewContainerOnExistingFile.d.ts.map +1 -0
  47. package/dist/createNewModule.cjs +12 -0
  48. package/dist/createNewModule.cjs.map +1 -0
  49. package/dist/createNewModule.d.ts +7 -0
  50. package/dist/createNewModule.d.ts.map +1 -0
  51. package/dist/createNewUtils.cjs +203 -0
  52. package/dist/createNewUtils.cjs.map +1 -0
  53. package/dist/createNewUtils.d.ts +16 -0
  54. package/dist/createNewUtils.d.ts.map +1 -1
  55. package/dist/{createOdspCreateContainerRequest.js → createOdspCreateContainerRequest.cjs} +8 -4
  56. package/dist/createOdspCreateContainerRequest.cjs.map +1 -0
  57. package/dist/createOdspCreateContainerRequest.d.ts +5 -3
  58. package/dist/createOdspCreateContainerRequest.d.ts.map +1 -1
  59. package/dist/{createOdspUrl.js → createOdspUrl.cjs} +2 -1
  60. package/dist/createOdspUrl.cjs.map +1 -0
  61. package/dist/createOdspUrl.d.ts +1 -0
  62. package/dist/createOdspUrl.d.ts.map +1 -1
  63. package/dist/{epochTracker.js → epochTracker.cjs} +102 -48
  64. package/dist/epochTracker.cjs.map +1 -0
  65. package/dist/epochTracker.d.ts +32 -8
  66. package/dist/epochTracker.d.ts.map +1 -1
  67. package/dist/{fetch.js → fetch.cjs} +1 -1
  68. package/dist/fetch.cjs.map +1 -0
  69. package/dist/fetch.d.ts +1 -1
  70. package/dist/fetch.d.ts.map +1 -1
  71. package/dist/{fetchSnapshot.js → fetchSnapshot.cjs} +192 -176
  72. package/dist/fetchSnapshot.cjs.map +1 -0
  73. package/dist/fetchSnapshot.d.ts +10 -5
  74. package/dist/fetchSnapshot.d.ts.map +1 -1
  75. package/dist/{getFileLink.js → getFileLink.cjs} +52 -41
  76. package/dist/getFileLink.cjs.map +1 -0
  77. package/dist/getFileLink.d.ts +4 -7
  78. package/dist/getFileLink.d.ts.map +1 -1
  79. package/dist/{getQueryString.js → getQueryString.cjs} +1 -1
  80. package/dist/getQueryString.cjs.map +1 -0
  81. package/dist/getQueryString.d.ts.map +1 -1
  82. package/dist/{getUrlAndHeadersWithAuth.js → getUrlAndHeadersWithAuth.cjs} +4 -2
  83. package/dist/getUrlAndHeadersWithAuth.cjs.map +1 -0
  84. package/dist/getUrlAndHeadersWithAuth.d.ts.map +1 -1
  85. package/dist/index.cjs +59 -0
  86. package/dist/index.cjs.map +1 -0
  87. package/dist/index.d.ts +19 -16
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/localOdspDriver/localOdspDeltaStorageService.cjs +35 -0
  90. package/dist/localOdspDriver/localOdspDeltaStorageService.cjs.map +1 -0
  91. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts +17 -0
  92. package/dist/localOdspDriver/localOdspDeltaStorageService.d.ts.map +1 -0
  93. package/dist/localOdspDriver/{localOdspDocumentService.js → localOdspDocumentService.cjs} +7 -5
  94. package/dist/localOdspDriver/localOdspDocumentService.cjs.map +1 -0
  95. package/dist/localOdspDriver/localOdspDocumentService.d.ts +3 -2
  96. package/dist/localOdspDriver/localOdspDocumentService.d.ts.map +1 -1
  97. package/dist/localOdspDriver/{localOdspDocumentServiceFactory.js → localOdspDocumentServiceFactory.cjs} +9 -10
  98. package/dist/localOdspDriver/localOdspDocumentServiceFactory.cjs.map +1 -0
  99. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts +2 -3
  100. package/dist/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +1 -1
  101. package/dist/localOdspDriver/{localOdspDocumentStorageManager.js → localOdspDocumentStorageManager.cjs} +13 -11
  102. package/dist/localOdspDriver/localOdspDocumentStorageManager.cjs.map +1 -0
  103. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts +2 -2
  104. package/dist/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +1 -1
  105. package/dist/odsp-driver-alpha.d.ts +497 -0
  106. package/dist/odsp-driver-beta.d.ts +159 -0
  107. package/dist/odsp-driver-public.d.ts +159 -0
  108. package/dist/odsp-driver-untrimmed.d.ts +566 -0
  109. package/dist/{odspCache.js → odspCache.cjs} +9 -10
  110. package/dist/odspCache.cjs.map +1 -0
  111. package/dist/odspCache.d.ts +19 -4
  112. package/dist/odspCache.d.ts.map +1 -1
  113. package/dist/odspDelayLoadedDeltaStream.cjs +291 -0
  114. package/dist/odspDelayLoadedDeltaStream.cjs.map +1 -0
  115. package/dist/odspDelayLoadedDeltaStream.d.ts +75 -0
  116. package/dist/odspDelayLoadedDeltaStream.d.ts.map +1 -0
  117. package/dist/{odspDeltaStorageService.js → odspDeltaStorageService.cjs} +70 -71
  118. package/dist/odspDeltaStorageService.cjs.map +1 -0
  119. package/dist/odspDeltaStorageService.d.ts +8 -6
  120. package/dist/odspDeltaStorageService.d.ts.map +1 -1
  121. package/dist/{odspDocumentDeltaConnection.js → odspDocumentDeltaConnection.cjs} +224 -113
  122. package/dist/odspDocumentDeltaConnection.cjs.map +1 -0
  123. package/dist/odspDocumentDeltaConnection.d.ts +32 -12
  124. package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
  125. package/dist/odspDocumentService.cjs +225 -0
  126. package/dist/odspDocumentService.cjs.map +1 -0
  127. package/dist/odspDocumentService.d.ts +11 -25
  128. package/dist/odspDocumentService.d.ts.map +1 -1
  129. package/dist/{odspDocumentServiceFactory.js → odspDocumentServiceFactory.cjs} +8 -5
  130. package/dist/odspDocumentServiceFactory.cjs.map +1 -0
  131. package/dist/odspDocumentServiceFactory.d.ts +4 -0
  132. package/dist/odspDocumentServiceFactory.d.ts.map +1 -1
  133. package/dist/odspDocumentServiceFactoryCore.cjs +196 -0
  134. package/dist/odspDocumentServiceFactoryCore.cjs.map +1 -0
  135. package/dist/odspDocumentServiceFactoryCore.d.ts +16 -11
  136. package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
  137. package/dist/odspDocumentServiceFactoryWithCodeSplit.cjs +20 -0
  138. package/dist/odspDocumentServiceFactoryWithCodeSplit.cjs.map +1 -0
  139. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts +5 -0
  140. package/dist/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +1 -1
  141. package/dist/odspDocumentStorageManager.cjs +490 -0
  142. package/dist/odspDocumentStorageManager.cjs.map +1 -0
  143. package/dist/odspDocumentStorageManager.d.ts +11 -5
  144. package/dist/odspDocumentStorageManager.d.ts.map +1 -1
  145. package/dist/{odspDocumentStorageServiceBase.js → odspDocumentStorageServiceBase.cjs} +32 -34
  146. package/dist/odspDocumentStorageServiceBase.cjs.map +1 -0
  147. package/dist/odspDocumentStorageServiceBase.d.ts +7 -9
  148. package/dist/odspDocumentStorageServiceBase.d.ts.map +1 -1
  149. package/dist/{odspDriverUrlResolver.js → odspDriverUrlResolver.cjs} +50 -36
  150. package/dist/odspDriverUrlResolver.cjs.map +1 -0
  151. package/dist/odspDriverUrlResolver.d.ts +12 -0
  152. package/dist/odspDriverUrlResolver.d.ts.map +1 -1
  153. package/dist/{odspDriverUrlResolverForShareLink.js → odspDriverUrlResolverForShareLink.cjs} +37 -26
  154. package/dist/odspDriverUrlResolverForShareLink.cjs.map +1 -0
  155. package/dist/odspDriverUrlResolverForShareLink.d.ts +5 -3
  156. package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
  157. package/dist/{odspError.js → odspError.cjs} +7 -3
  158. package/dist/odspError.cjs.map +1 -0
  159. package/dist/odspError.d.ts.map +1 -1
  160. package/dist/{odspFluidFileLink.js → odspFluidFileLink.cjs} +25 -18
  161. package/dist/odspFluidFileLink.cjs.map +1 -0
  162. package/dist/odspFluidFileLink.d.ts +10 -1
  163. package/dist/odspFluidFileLink.d.ts.map +1 -1
  164. package/dist/odspLocationRedirection.cjs +24 -0
  165. package/dist/odspLocationRedirection.cjs.map +1 -0
  166. package/dist/odspLocationRedirection.d.ts +14 -0
  167. package/dist/odspLocationRedirection.d.ts.map +1 -0
  168. package/dist/{odspPublicUtils.js → odspPublicUtils.cjs} +7 -4
  169. package/dist/odspPublicUtils.cjs.map +1 -0
  170. package/dist/odspPublicUtils.d.ts +6 -0
  171. package/dist/odspPublicUtils.d.ts.map +1 -1
  172. package/dist/{odspSnapshotParser.js → odspSnapshotParser.cjs} +11 -12
  173. package/dist/odspSnapshotParser.cjs.map +1 -0
  174. package/dist/odspSnapshotParser.d.ts.map +1 -1
  175. package/dist/{odspSummaryUploadManager.js → odspSummaryUploadManager.cjs} +47 -34
  176. package/dist/odspSummaryUploadManager.cjs.map +1 -0
  177. package/dist/odspSummaryUploadManager.d.ts +7 -4
  178. package/dist/odspSummaryUploadManager.d.ts.map +1 -1
  179. package/dist/{odspUrlHelper.js → odspUrlHelper.cjs} +9 -3
  180. package/dist/odspUrlHelper.cjs.map +1 -0
  181. package/dist/odspUrlHelper.d.ts +5 -0
  182. package/dist/odspUrlHelper.d.ts.map +1 -1
  183. package/dist/{odspUtils.js → odspUtils.cjs} +118 -30
  184. package/dist/odspUtils.cjs.map +1 -0
  185. package/dist/odspUtils.d.ts +35 -6
  186. package/dist/odspUtils.d.ts.map +1 -1
  187. package/dist/{opsCaching.js → opsCaching.cjs} +25 -9
  188. package/dist/opsCaching.cjs.map +1 -0
  189. package/dist/opsCaching.d.ts +3 -3
  190. package/dist/opsCaching.d.ts.map +1 -1
  191. package/dist/{packageVersion.js → packageVersion.cjs} +2 -2
  192. package/dist/packageVersion.cjs.map +1 -0
  193. package/dist/packageVersion.d.ts +1 -1
  194. package/dist/packageVersion.d.ts.map +1 -1
  195. package/dist/prefetchLatestSnapshot.cjs +100 -0
  196. package/dist/prefetchLatestSnapshot.cjs.map +1 -0
  197. package/dist/prefetchLatestSnapshot.d.ts +12 -7
  198. package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
  199. package/dist/{retryErrorsStorageAdapter.js → retryErrorsStorageAdapter.cjs} +13 -6
  200. package/dist/retryErrorsStorageAdapter.cjs.map +1 -0
  201. package/dist/retryErrorsStorageAdapter.d.ts +5 -4
  202. package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
  203. package/dist/{retryUtils.js → retryUtils.cjs} +30 -14
  204. package/dist/retryUtils.cjs.map +1 -0
  205. package/dist/retryUtils.d.ts +2 -2
  206. package/dist/retryUtils.d.ts.map +1 -1
  207. package/dist/socketModule.cjs +10 -0
  208. package/dist/socketModule.cjs.map +1 -0
  209. package/dist/socketModule.d.ts +7 -0
  210. package/dist/socketModule.d.ts.map +1 -0
  211. package/dist/tsdoc-metadata.json +11 -0
  212. package/dist/{vroom.js → vroom.cjs} +24 -9
  213. package/dist/vroom.cjs.map +1 -0
  214. package/dist/vroom.d.ts +4 -4
  215. package/dist/vroom.d.ts.map +1 -1
  216. package/dist/{zipItDataRepresentationUtils.js → zipItDataRepresentationUtils.cjs} +227 -118
  217. package/dist/zipItDataRepresentationUtils.cjs.map +1 -0
  218. package/dist/zipItDataRepresentationUtils.d.ts +47 -20
  219. package/dist/zipItDataRepresentationUtils.d.ts.map +1 -1
  220. package/lib/ReadBufferUtils.d.mts.map +1 -0
  221. package/lib/{ReadBufferUtils.js → ReadBufferUtils.mjs} +14 -7
  222. package/lib/ReadBufferUtils.mjs.map +1 -0
  223. package/lib/{WriteBufferUtils.d.ts → WriteBufferUtils.d.mts} +3 -5
  224. package/lib/WriteBufferUtils.d.mts.map +1 -0
  225. package/lib/{WriteBufferUtils.js → WriteBufferUtils.mjs} +68 -64
  226. package/lib/WriteBufferUtils.mjs.map +1 -0
  227. package/lib/{checkUrl.d.ts → checkUrl.d.mts} +1 -0
  228. package/lib/checkUrl.d.mts.map +1 -0
  229. package/lib/{checkUrl.js → checkUrl.mjs} +7 -6
  230. package/lib/checkUrl.mjs.map +1 -0
  231. package/lib/compactSnapshotParser.d.mts +24 -0
  232. package/lib/compactSnapshotParser.d.mts.map +1 -0
  233. package/lib/compactSnapshotParser.mjs +203 -0
  234. package/lib/compactSnapshotParser.mjs.map +1 -0
  235. package/lib/{compactSnapshotWriter.d.ts → compactSnapshotWriter.d.mts} +3 -4
  236. package/lib/compactSnapshotWriter.d.mts.map +1 -0
  237. package/lib/{compactSnapshotWriter.js → compactSnapshotWriter.mjs} +41 -31
  238. package/lib/compactSnapshotWriter.mjs.map +1 -0
  239. package/lib/{constants.d.ts → constants.d.mts} +6 -0
  240. package/lib/constants.d.mts.map +1 -0
  241. package/lib/{constants.js → constants.mjs} +7 -1
  242. package/lib/constants.mjs.map +1 -0
  243. package/lib/{contracts.d.ts → contracts.d.mts} +17 -54
  244. package/lib/contracts.d.mts.map +1 -0
  245. package/lib/{contracts.js → contracts.mjs} +1 -1
  246. package/lib/contracts.mjs.map +1 -0
  247. package/lib/{contractsPublic.d.ts → contractsPublic.d.mts} +15 -0
  248. package/lib/contractsPublic.d.mts.map +1 -0
  249. package/lib/{contractsPublic.js → contractsPublic.mjs} +7 -1
  250. package/lib/contractsPublic.mjs.map +1 -0
  251. package/lib/createFile.d.mts +18 -0
  252. package/lib/createFile.d.mts.map +1 -0
  253. package/lib/createFile.mjs +171 -0
  254. package/lib/createFile.mjs.map +1 -0
  255. package/lib/createNewContainerOnExistingFile.d.mts +22 -0
  256. package/lib/createNewContainerOnExistingFile.d.mts.map +1 -0
  257. package/lib/createNewContainerOnExistingFile.mjs +56 -0
  258. package/lib/createNewContainerOnExistingFile.mjs.map +1 -0
  259. package/lib/createNewModule.d.mts +7 -0
  260. package/lib/createNewModule.d.mts.map +1 -0
  261. package/lib/createNewModule.mjs +7 -0
  262. package/lib/createNewModule.mjs.map +1 -0
  263. package/lib/createNewUtils.d.mts +27 -0
  264. package/lib/createNewUtils.d.mts.map +1 -0
  265. package/lib/createNewUtils.mjs +197 -0
  266. package/lib/createNewUtils.mjs.map +1 -0
  267. package/lib/{createOdspCreateContainerRequest.d.ts → createOdspCreateContainerRequest.d.mts} +5 -7
  268. package/lib/createOdspCreateContainerRequest.d.mts.map +1 -0
  269. package/lib/{createOdspCreateContainerRequest.js → createOdspCreateContainerRequest.mjs} +8 -4
  270. package/lib/createOdspCreateContainerRequest.mjs.map +1 -0
  271. package/lib/{createOdspUrl.d.ts → createOdspUrl.d.mts} +2 -1
  272. package/lib/{createOdspUrl.d.ts.map → createOdspUrl.d.mts.map} +1 -1
  273. package/lib/{createOdspUrl.js → createOdspUrl.mjs} +2 -1
  274. package/lib/createOdspUrl.mjs.map +1 -0
  275. package/lib/{epochTracker.d.ts → epochTracker.d.mts} +34 -10
  276. package/lib/epochTracker.d.mts.map +1 -0
  277. package/lib/{epochTracker.js → epochTracker.mjs} +97 -43
  278. package/lib/epochTracker.mjs.map +1 -0
  279. package/lib/{fetch.d.ts → fetch.d.mts} +1 -1
  280. package/lib/{fetch.d.ts.map → fetch.d.mts.map} +1 -1
  281. package/lib/{fetch.js → fetch.mjs} +1 -1
  282. package/lib/fetch.mjs.map +1 -0
  283. package/lib/{fetchSnapshot.d.ts → fetchSnapshot.d.mts} +14 -9
  284. package/lib/fetchSnapshot.d.mts.map +1 -0
  285. package/lib/{fetchSnapshot.js → fetchSnapshot.mjs} +185 -167
  286. package/lib/fetchSnapshot.mjs.map +1 -0
  287. package/lib/{getFileLink.d.ts → getFileLink.d.mts} +4 -7
  288. package/lib/getFileLink.d.mts.map +1 -0
  289. package/lib/{getFileLink.js → getFileLink.mjs} +49 -38
  290. package/lib/getFileLink.mjs.map +1 -0
  291. package/lib/{getQueryString.d.ts → getQueryString.d.mts} +0 -4
  292. package/lib/getQueryString.d.mts.map +1 -0
  293. package/lib/{getQueryString.js → getQueryString.mjs} +1 -1
  294. package/lib/getQueryString.mjs.map +1 -0
  295. package/lib/{getUrlAndHeadersWithAuth.d.ts.map → getUrlAndHeadersWithAuth.d.mts.map} +1 -1
  296. package/lib/{getUrlAndHeadersWithAuth.js → getUrlAndHeadersWithAuth.mjs} +4 -2
  297. package/lib/getUrlAndHeadersWithAuth.mjs.map +1 -0
  298. package/lib/index.d.mts +24 -0
  299. package/lib/index.d.mts.map +1 -0
  300. package/lib/index.mjs +22 -0
  301. package/lib/index.mjs.map +1 -0
  302. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts +17 -0
  303. package/lib/localOdspDriver/localOdspDeltaStorageService.d.mts.map +1 -0
  304. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs +31 -0
  305. package/lib/localOdspDriver/localOdspDeltaStorageService.mjs.map +1 -0
  306. package/lib/localOdspDriver/{localOdspDocumentService.d.ts → localOdspDocumentService.d.mts} +3 -2
  307. package/lib/localOdspDriver/localOdspDocumentService.d.mts.map +1 -0
  308. package/lib/localOdspDriver/{localOdspDocumentService.js → localOdspDocumentService.mjs} +8 -6
  309. package/lib/localOdspDriver/localOdspDocumentService.mjs.map +1 -0
  310. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.d.ts → localOdspDocumentServiceFactory.d.mts} +4 -5
  311. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.mts.map +1 -0
  312. package/lib/localOdspDriver/{localOdspDocumentServiceFactory.js → localOdspDocumentServiceFactory.mjs} +9 -10
  313. package/lib/localOdspDriver/localOdspDocumentServiceFactory.mjs.map +1 -0
  314. package/lib/localOdspDriver/{localOdspDocumentStorageManager.d.ts → localOdspDocumentStorageManager.d.mts} +3 -3
  315. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.mts.map +1 -0
  316. package/lib/localOdspDriver/{localOdspDocumentStorageManager.js → localOdspDocumentStorageManager.mjs} +11 -9
  317. package/lib/localOdspDriver/localOdspDocumentStorageManager.mjs.map +1 -0
  318. package/lib/odsp-driver-alpha.d.mts +497 -0
  319. package/lib/odsp-driver-beta.d.mts +159 -0
  320. package/lib/odsp-driver-public.d.mts +159 -0
  321. package/lib/odsp-driver-untrimmed.d.mts +566 -0
  322. package/lib/{odspCache.d.ts → odspCache.d.mts} +19 -8
  323. package/lib/odspCache.d.mts.map +1 -0
  324. package/lib/{odspCache.js → odspCache.mjs} +6 -11
  325. package/lib/odspCache.mjs.map +1 -0
  326. package/lib/odspDelayLoadedDeltaStream.d.mts +75 -0
  327. package/lib/odspDelayLoadedDeltaStream.d.mts.map +1 -0
  328. package/lib/odspDelayLoadedDeltaStream.mjs +287 -0
  329. package/lib/odspDelayLoadedDeltaStream.mjs.map +1 -0
  330. package/lib/{odspDeltaStorageService.d.ts → odspDeltaStorageService.d.mts} +9 -7
  331. package/lib/odspDeltaStorageService.d.mts.map +1 -0
  332. package/lib/{odspDeltaStorageService.js → odspDeltaStorageService.mjs} +70 -68
  333. package/lib/odspDeltaStorageService.mjs.map +1 -0
  334. package/lib/{odspDocumentDeltaConnection.d.ts → odspDocumentDeltaConnection.d.mts} +33 -13
  335. package/lib/odspDocumentDeltaConnection.d.mts.map +1 -0
  336. package/lib/{odspDocumentDeltaConnection.js → odspDocumentDeltaConnection.mjs} +214 -103
  337. package/lib/odspDocumentDeltaConnection.mjs.map +1 -0
  338. package/lib/{odspDocumentService.d.ts → odspDocumentService.d.mts} +14 -28
  339. package/lib/odspDocumentService.d.mts.map +1 -0
  340. package/lib/odspDocumentService.mjs +221 -0
  341. package/lib/odspDocumentService.mjs.map +1 -0
  342. package/lib/{odspDocumentServiceFactory.d.ts → odspDocumentServiceFactory.d.mts} +5 -1
  343. package/lib/odspDocumentServiceFactory.d.mts.map +1 -0
  344. package/lib/{odspDocumentServiceFactory.js → odspDocumentServiceFactory.mjs} +8 -6
  345. package/lib/odspDocumentServiceFactory.mjs.map +1 -0
  346. package/lib/{odspDocumentServiceFactoryCore.d.ts → odspDocumentServiceFactoryCore.d.mts} +17 -12
  347. package/lib/odspDocumentServiceFactoryCore.d.mts.map +1 -0
  348. package/lib/odspDocumentServiceFactoryCore.mjs +192 -0
  349. package/lib/odspDocumentServiceFactoryCore.mjs.map +1 -0
  350. package/lib/{odspDocumentServiceFactoryWithCodeSplit.d.ts → odspDocumentServiceFactoryWithCodeSplit.d.mts} +6 -1
  351. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.mts.map +1 -0
  352. package/lib/{odspDocumentServiceFactoryWithCodeSplit.js → odspDocumentServiceFactoryWithCodeSplit.mjs} +8 -3
  353. package/lib/odspDocumentServiceFactoryWithCodeSplit.mjs.map +1 -0
  354. package/lib/{odspDocumentStorageManager.d.ts → odspDocumentStorageManager.d.mts} +17 -11
  355. package/lib/odspDocumentStorageManager.d.mts.map +1 -0
  356. package/lib/odspDocumentStorageManager.mjs +486 -0
  357. package/lib/odspDocumentStorageManager.mjs.map +1 -0
  358. package/lib/{odspDocumentStorageServiceBase.d.ts → odspDocumentStorageServiceBase.d.mts} +8 -10
  359. package/lib/odspDocumentStorageServiceBase.d.mts.map +1 -0
  360. package/lib/{odspDocumentStorageServiceBase.js → odspDocumentStorageServiceBase.mjs} +31 -33
  361. package/lib/odspDocumentStorageServiceBase.mjs.map +1 -0
  362. package/lib/{odspDriverUrlResolver.d.ts → odspDriverUrlResolver.d.mts} +12 -0
  363. package/lib/odspDriverUrlResolver.d.mts.map +1 -0
  364. package/lib/{odspDriverUrlResolver.js → odspDriverUrlResolver.mjs} +50 -40
  365. package/lib/odspDriverUrlResolver.mjs.map +1 -0
  366. package/lib/{odspDriverUrlResolverForShareLink.d.ts → odspDriverUrlResolverForShareLink.d.mts} +6 -4
  367. package/lib/odspDriverUrlResolverForShareLink.d.mts.map +1 -0
  368. package/lib/{odspDriverUrlResolverForShareLink.js → odspDriverUrlResolverForShareLink.mjs} +36 -29
  369. package/lib/odspDriverUrlResolverForShareLink.mjs.map +1 -0
  370. package/lib/{odspError.d.ts → odspError.d.mts} +1 -1
  371. package/lib/odspError.d.mts.map +1 -0
  372. package/lib/{odspError.js → odspError.mjs} +7 -3
  373. package/lib/odspError.mjs.map +1 -0
  374. package/lib/{odspFluidFileLink.d.ts → odspFluidFileLink.d.mts} +11 -2
  375. package/lib/odspFluidFileLink.d.mts.map +1 -0
  376. package/lib/{odspFluidFileLink.js → odspFluidFileLink.mjs} +23 -16
  377. package/lib/odspFluidFileLink.mjs.map +1 -0
  378. package/lib/odspLocationRedirection.d.mts +14 -0
  379. package/lib/odspLocationRedirection.d.mts.map +1 -0
  380. package/lib/odspLocationRedirection.mjs +20 -0
  381. package/lib/odspLocationRedirection.mjs.map +1 -0
  382. package/lib/{odspPublicUtils.d.ts → odspPublicUtils.d.mts} +6 -0
  383. package/lib/odspPublicUtils.d.mts.map +1 -0
  384. package/lib/{odspPublicUtils.js → odspPublicUtils.mjs} +5 -2
  385. package/lib/odspPublicUtils.mjs.map +1 -0
  386. package/lib/{odspSnapshotParser.d.ts → odspSnapshotParser.d.mts} +2 -2
  387. package/lib/odspSnapshotParser.d.mts.map +1 -0
  388. package/lib/{odspSnapshotParser.js → odspSnapshotParser.mjs} +10 -11
  389. package/lib/odspSnapshotParser.mjs.map +1 -0
  390. package/lib/{odspSummaryUploadManager.d.ts → odspSummaryUploadManager.d.mts} +8 -5
  391. package/lib/odspSummaryUploadManager.d.mts.map +1 -0
  392. package/lib/{odspSummaryUploadManager.js → odspSummaryUploadManager.mjs} +41 -32
  393. package/lib/odspSummaryUploadManager.mjs.map +1 -0
  394. package/lib/{odspUrlHelper.d.ts → odspUrlHelper.d.mts} +5 -0
  395. package/lib/odspUrlHelper.d.mts.map +1 -0
  396. package/lib/{odspUrlHelper.js → odspUrlHelper.mjs} +9 -3
  397. package/lib/odspUrlHelper.mjs.map +1 -0
  398. package/lib/{odspUtils.d.ts → odspUtils.d.mts} +36 -7
  399. package/lib/odspUtils.d.mts.map +1 -0
  400. package/lib/{odspUtils.js → odspUtils.mjs} +109 -27
  401. package/lib/odspUtils.mjs.map +1 -0
  402. package/lib/{opsCaching.d.ts → opsCaching.d.mts} +3 -3
  403. package/lib/opsCaching.d.mts.map +1 -0
  404. package/lib/{opsCaching.js → opsCaching.mjs} +23 -7
  405. package/lib/opsCaching.mjs.map +1 -0
  406. package/lib/{packageVersion.d.ts → packageVersion.d.mts} +1 -1
  407. package/lib/{packageVersion.d.ts.map → packageVersion.d.mts.map} +1 -1
  408. package/lib/{packageVersion.js → packageVersion.mjs} +2 -2
  409. package/lib/packageVersion.mjs.map +1 -0
  410. package/lib/{prefetchLatestSnapshot.d.ts → prefetchLatestSnapshot.d.mts} +13 -8
  411. package/lib/prefetchLatestSnapshot.d.mts.map +1 -0
  412. package/lib/prefetchLatestSnapshot.mjs +96 -0
  413. package/lib/prefetchLatestSnapshot.mjs.map +1 -0
  414. package/lib/{retryErrorsStorageAdapter.d.ts → retryErrorsStorageAdapter.d.mts} +5 -4
  415. package/lib/retryErrorsStorageAdapter.d.mts.map +1 -0
  416. package/lib/{retryErrorsStorageAdapter.js → retryErrorsStorageAdapter.mjs} +13 -6
  417. package/lib/retryErrorsStorageAdapter.mjs.map +1 -0
  418. package/lib/{retryUtils.d.ts → retryUtils.d.mts} +2 -2
  419. package/lib/retryUtils.d.mts.map +1 -0
  420. package/lib/{retryUtils.js → retryUtils.mjs} +27 -11
  421. package/lib/retryUtils.mjs.map +1 -0
  422. package/lib/socketModule.d.mts +7 -0
  423. package/lib/socketModule.d.mts.map +1 -0
  424. package/lib/socketModule.mjs +7 -0
  425. package/lib/socketModule.mjs.map +1 -0
  426. package/lib/{vroom.d.ts → vroom.d.mts} +6 -6
  427. package/lib/vroom.d.mts.map +1 -0
  428. package/lib/{vroom.js → vroom.mjs} +24 -9
  429. package/lib/vroom.mjs.map +1 -0
  430. package/lib/{zipItDataRepresentationUtils.d.ts → zipItDataRepresentationUtils.d.mts} +48 -21
  431. package/lib/zipItDataRepresentationUtils.d.mts.map +1 -0
  432. package/lib/{zipItDataRepresentationUtils.js → zipItDataRepresentationUtils.mjs} +213 -111
  433. package/lib/zipItDataRepresentationUtils.mjs.map +1 -0
  434. package/package.json +89 -69
  435. package/prettier.config.cjs +8 -0
  436. package/src/ReadBufferUtils.ts +51 -44
  437. package/src/WriteBufferUtils.ts +203 -181
  438. package/src/checkUrl.ts +16 -15
  439. package/src/compactSnapshotParser.ts +219 -103
  440. package/src/compactSnapshotWriter.ts +118 -97
  441. package/src/constants.ts +7 -0
  442. package/src/contracts.ts +96 -136
  443. package/src/contractsPublic.ts +31 -16
  444. package/src/createFile.ts +243 -305
  445. package/src/createNewContainerOnExistingFile.ts +93 -0
  446. package/src/createNewModule.ts +7 -0
  447. package/src/createNewUtils.ts +266 -56
  448. package/src/createOdspCreateContainerRequest.ts +22 -18
  449. package/src/createOdspUrl.ts +12 -13
  450. package/src/epochTracker.ts +596 -457
  451. package/src/fetch.ts +4 -4
  452. package/src/fetchSnapshot.ts +583 -508
  453. package/src/getFileLink.ts +194 -155
  454. package/src/getQueryString.ts +11 -9
  455. package/src/getUrlAndHeadersWithAuth.ts +34 -33
  456. package/src/index.ts +42 -18
  457. package/src/localOdspDriver/localOdspDeltaStorageService.ts +49 -0
  458. package/src/localOdspDriver/localOdspDocumentService.ts +40 -38
  459. package/src/localOdspDriver/localOdspDocumentServiceFactory.ts +46 -43
  460. package/src/localOdspDriver/localOdspDocumentStorageManager.ts +55 -50
  461. package/src/odspCache.ts +112 -90
  462. package/src/odspDelayLoadedDeltaStream.ts +459 -0
  463. package/src/odspDeltaStorageService.ts +232 -221
  464. package/src/odspDocumentDeltaConnection.ts +751 -563
  465. package/src/odspDocumentService.ts +324 -523
  466. package/src/odspDocumentServiceFactory.ts +20 -21
  467. package/src/odspDocumentServiceFactoryCore.ts +325 -202
  468. package/src/odspDocumentServiceFactoryWithCodeSplit.ts +20 -20
  469. package/src/odspDocumentStorageManager.ts +730 -534
  470. package/src/odspDocumentStorageServiceBase.ts +279 -254
  471. package/src/odspDriverUrlResolver.ts +230 -188
  472. package/src/odspDriverUrlResolverForShareLink.ts +223 -203
  473. package/src/odspError.ts +27 -19
  474. package/src/odspFluidFileLink.ts +106 -87
  475. package/src/odspLocationRedirection.ts +26 -0
  476. package/src/odspPublicUtils.ts +20 -14
  477. package/src/odspSnapshotParser.ts +53 -46
  478. package/src/odspSummaryUploadManager.ts +243 -218
  479. package/src/odspUrlHelper.ts +81 -71
  480. package/src/odspUtils.ts +401 -259
  481. package/src/opsCaching.ts +214 -193
  482. package/src/packageVersion.ts +1 -1
  483. package/src/prefetchLatestSnapshot.ts +142 -80
  484. package/src/retryErrorsStorageAdapter.ts +92 -77
  485. package/src/retryUtils.ts +80 -57
  486. package/src/socketModule.ts +8 -0
  487. package/src/vroom.ts +92 -83
  488. package/src/zipItDataRepresentationUtils.ts +534 -394
  489. package/tsc-multi.test.json +4 -0
  490. package/tsconfig.json +11 -13
  491. package/.editorconfig +0 -7
  492. package/dist/ReadBufferUtils.js.map +0 -1
  493. package/dist/WriteBufferUtils.js.map +0 -1
  494. package/dist/checkUrl.js.map +0 -1
  495. package/dist/compactSnapshotParser.js +0 -115
  496. package/dist/compactSnapshotParser.js.map +0 -1
  497. package/dist/compactSnapshotWriter.js.map +0 -1
  498. package/dist/constants.js.map +0 -1
  499. package/dist/contracts.js.map +0 -1
  500. package/dist/contractsPublic.js.map +0 -1
  501. package/dist/createFile.js +0 -242
  502. package/dist/createFile.js.map +0 -1
  503. package/dist/createNewUtils.js +0 -67
  504. package/dist/createNewUtils.js.map +0 -1
  505. package/dist/createOdspCreateContainerRequest.js.map +0 -1
  506. package/dist/createOdspUrl.js.map +0 -1
  507. package/dist/epochTracker.js.map +0 -1
  508. package/dist/fetch.js.map +0 -1
  509. package/dist/fetchSnapshot.js.map +0 -1
  510. package/dist/getFileLink.js.map +0 -1
  511. package/dist/getQueryString.js.map +0 -1
  512. package/dist/getSocketIo.d.ts +0 -11
  513. package/dist/getSocketIo.d.ts.map +0 -1
  514. package/dist/getSocketIo.js +0 -20
  515. package/dist/getSocketIo.js.map +0 -1
  516. package/dist/getUrlAndHeadersWithAuth.js.map +0 -1
  517. package/dist/index.js +0 -41
  518. package/dist/index.js.map +0 -1
  519. package/dist/localOdspDriver/localOdspDocumentService.js.map +0 -1
  520. package/dist/localOdspDriver/localOdspDocumentServiceFactory.js.map +0 -1
  521. package/dist/localOdspDriver/localOdspDocumentStorageManager.js.map +0 -1
  522. package/dist/odspCache.js.map +0 -1
  523. package/dist/odspDeltaStorageService.js.map +0 -1
  524. package/dist/odspDocumentDeltaConnection.js.map +0 -1
  525. package/dist/odspDocumentService.js +0 -364
  526. package/dist/odspDocumentService.js.map +0 -1
  527. package/dist/odspDocumentServiceFactory.js.map +0 -1
  528. package/dist/odspDocumentServiceFactoryCore.js +0 -118
  529. package/dist/odspDocumentServiceFactoryCore.js.map +0 -1
  530. package/dist/odspDocumentServiceFactoryWithCodeSplit.js +0 -34
  531. package/dist/odspDocumentServiceFactoryWithCodeSplit.js.map +0 -1
  532. package/dist/odspDocumentStorageManager.js +0 -356
  533. package/dist/odspDocumentStorageManager.js.map +0 -1
  534. package/dist/odspDocumentStorageServiceBase.js.map +0 -1
  535. package/dist/odspDriverUrlResolver.js.map +0 -1
  536. package/dist/odspDriverUrlResolverForShareLink.js.map +0 -1
  537. package/dist/odspError.js.map +0 -1
  538. package/dist/odspFluidFileLink.js.map +0 -1
  539. package/dist/odspPublicUtils.js.map +0 -1
  540. package/dist/odspSnapshotParser.js.map +0 -1
  541. package/dist/odspSummaryUploadManager.js.map +0 -1
  542. package/dist/odspUrlHelper.js.map +0 -1
  543. package/dist/odspUtils.js.map +0 -1
  544. package/dist/opsCaching.js.map +0 -1
  545. package/dist/packageVersion.js.map +0 -1
  546. package/dist/prefetchLatestSnapshot.js +0 -57
  547. package/dist/prefetchLatestSnapshot.js.map +0 -1
  548. package/dist/retryErrorsStorageAdapter.js.map +0 -1
  549. package/dist/retryUtils.js.map +0 -1
  550. package/dist/vroom.js.map +0 -1
  551. package/dist/zipItDataRepresentationUtils.js.map +0 -1
  552. package/lib/ReadBufferUtils.d.ts.map +0 -1
  553. package/lib/ReadBufferUtils.js.map +0 -1
  554. package/lib/WriteBufferUtils.d.ts.map +0 -1
  555. package/lib/WriteBufferUtils.js.map +0 -1
  556. package/lib/checkUrl.d.ts.map +0 -1
  557. package/lib/checkUrl.js.map +0 -1
  558. package/lib/compactSnapshotParser.d.ts +0 -15
  559. package/lib/compactSnapshotParser.d.ts.map +0 -1
  560. package/lib/compactSnapshotParser.js +0 -111
  561. package/lib/compactSnapshotParser.js.map +0 -1
  562. package/lib/compactSnapshotWriter.d.ts.map +0 -1
  563. package/lib/compactSnapshotWriter.js.map +0 -1
  564. package/lib/constants.d.ts.map +0 -1
  565. package/lib/constants.js.map +0 -1
  566. package/lib/contracts.d.ts.map +0 -1
  567. package/lib/contracts.js.map +0 -1
  568. package/lib/contractsPublic.d.ts.map +0 -1
  569. package/lib/contractsPublic.js.map +0 -1
  570. package/lib/createFile.d.ts +0 -22
  571. package/lib/createFile.d.ts.map +0 -1
  572. package/lib/createFile.js +0 -235
  573. package/lib/createFile.js.map +0 -1
  574. package/lib/createNewUtils.d.ts +0 -11
  575. package/lib/createNewUtils.d.ts.map +0 -1
  576. package/lib/createNewUtils.js +0 -63
  577. package/lib/createNewUtils.js.map +0 -1
  578. package/lib/createOdspCreateContainerRequest.d.ts.map +0 -1
  579. package/lib/createOdspCreateContainerRequest.js.map +0 -1
  580. package/lib/createOdspUrl.js.map +0 -1
  581. package/lib/epochTracker.d.ts.map +0 -1
  582. package/lib/epochTracker.js.map +0 -1
  583. package/lib/fetch.js.map +0 -1
  584. package/lib/fetchSnapshot.d.ts.map +0 -1
  585. package/lib/fetchSnapshot.js.map +0 -1
  586. package/lib/getFileLink.d.ts.map +0 -1
  587. package/lib/getFileLink.js.map +0 -1
  588. package/lib/getQueryString.d.ts.map +0 -1
  589. package/lib/getQueryString.js.map +0 -1
  590. package/lib/getSocketIo.d.ts +0 -11
  591. package/lib/getSocketIo.d.ts.map +0 -1
  592. package/lib/getSocketIo.js +0 -13
  593. package/lib/getSocketIo.js.map +0 -1
  594. package/lib/getUrlAndHeadersWithAuth.js.map +0 -1
  595. package/lib/index.d.ts +0 -21
  596. package/lib/index.d.ts.map +0 -1
  597. package/lib/index.js +0 -29
  598. package/lib/index.js.map +0 -1
  599. package/lib/localOdspDriver/localOdspDocumentService.d.ts.map +0 -1
  600. package/lib/localOdspDriver/localOdspDocumentService.js.map +0 -1
  601. package/lib/localOdspDriver/localOdspDocumentServiceFactory.d.ts.map +0 -1
  602. package/lib/localOdspDriver/localOdspDocumentServiceFactory.js.map +0 -1
  603. package/lib/localOdspDriver/localOdspDocumentStorageManager.d.ts.map +0 -1
  604. package/lib/localOdspDriver/localOdspDocumentStorageManager.js.map +0 -1
  605. package/lib/odspCache.d.ts.map +0 -1
  606. package/lib/odspCache.js.map +0 -1
  607. package/lib/odspDeltaStorageService.d.ts.map +0 -1
  608. package/lib/odspDeltaStorageService.js.map +0 -1
  609. package/lib/odspDocumentDeltaConnection.d.ts.map +0 -1
  610. package/lib/odspDocumentDeltaConnection.js.map +0 -1
  611. package/lib/odspDocumentService.d.ts.map +0 -1
  612. package/lib/odspDocumentService.js +0 -360
  613. package/lib/odspDocumentService.js.map +0 -1
  614. package/lib/odspDocumentServiceFactory.d.ts.map +0 -1
  615. package/lib/odspDocumentServiceFactory.js.map +0 -1
  616. package/lib/odspDocumentServiceFactoryCore.d.ts.map +0 -1
  617. package/lib/odspDocumentServiceFactoryCore.js +0 -114
  618. package/lib/odspDocumentServiceFactoryCore.js.map +0 -1
  619. package/lib/odspDocumentServiceFactoryWithCodeSplit.d.ts.map +0 -1
  620. package/lib/odspDocumentServiceFactoryWithCodeSplit.js.map +0 -1
  621. package/lib/odspDocumentStorageManager.d.ts.map +0 -1
  622. package/lib/odspDocumentStorageManager.js +0 -352
  623. package/lib/odspDocumentStorageManager.js.map +0 -1
  624. package/lib/odspDocumentStorageServiceBase.d.ts.map +0 -1
  625. package/lib/odspDocumentStorageServiceBase.js.map +0 -1
  626. package/lib/odspDriverUrlResolver.d.ts.map +0 -1
  627. package/lib/odspDriverUrlResolver.js.map +0 -1
  628. package/lib/odspDriverUrlResolverForShareLink.d.ts.map +0 -1
  629. package/lib/odspDriverUrlResolverForShareLink.js.map +0 -1
  630. package/lib/odspError.d.ts.map +0 -1
  631. package/lib/odspError.js.map +0 -1
  632. package/lib/odspFluidFileLink.d.ts.map +0 -1
  633. package/lib/odspFluidFileLink.js.map +0 -1
  634. package/lib/odspPublicUtils.d.ts.map +0 -1
  635. package/lib/odspPublicUtils.js.map +0 -1
  636. package/lib/odspSnapshotParser.d.ts.map +0 -1
  637. package/lib/odspSnapshotParser.js.map +0 -1
  638. package/lib/odspSummaryUploadManager.d.ts.map +0 -1
  639. package/lib/odspSummaryUploadManager.js.map +0 -1
  640. package/lib/odspUrlHelper.d.ts.map +0 -1
  641. package/lib/odspUrlHelper.js.map +0 -1
  642. package/lib/odspUtils.d.ts.map +0 -1
  643. package/lib/odspUtils.js.map +0 -1
  644. package/lib/opsCaching.d.ts.map +0 -1
  645. package/lib/opsCaching.js.map +0 -1
  646. package/lib/packageVersion.js.map +0 -1
  647. package/lib/prefetchLatestSnapshot.d.ts.map +0 -1
  648. package/lib/prefetchLatestSnapshot.js +0 -53
  649. package/lib/prefetchLatestSnapshot.js.map +0 -1
  650. package/lib/retryErrorsStorageAdapter.d.ts.map +0 -1
  651. package/lib/retryErrorsStorageAdapter.js.map +0 -1
  652. package/lib/retryUtils.d.ts.map +0 -1
  653. package/lib/retryUtils.js.map +0 -1
  654. package/lib/vroom.d.ts.map +0 -1
  655. package/lib/vroom.js.map +0 -1
  656. package/lib/zipItDataRepresentationUtils.d.ts.map +0 -1
  657. package/lib/zipItDataRepresentationUtils.js.map +0 -1
  658. package/src/getSocketIo.ts +0 -14
  659. package/tsconfig.esnext.json +0 -7
  660. /package/lib/{ReadBufferUtils.d.ts → ReadBufferUtils.d.mts} +0 -0
  661. /package/lib/{getUrlAndHeadersWithAuth.d.ts → getUrlAndHeadersWithAuth.d.mts} +0 -0
@@ -2,51 +2,27 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { assert, performance, Deferred, TypedEventEmitter } from "@fluidframework/common-utils";
5
+ import { loggerToMonitoringContext, } from "@fluidframework/telemetry-utils";
6
+ import { performance, TypedEventEmitter } from "@fluid-internal/client-utils";
7
+ import { assert, Deferred } from "@fluidframework/core-utils";
6
8
  import { DocumentDeltaConnection } from "@fluidframework/driver-base";
7
- import { loggerToMonitoringContext } from "@fluidframework/telemetry-utils";
8
9
  import { v4 as uuid } from "uuid";
9
- import { errorObjectFromSocketError } from "./odspError";
10
- import { pkgVersion } from "./packageVersion";
10
+ import { createGenericNetworkError } from "@fluidframework/driver-utils";
11
+ import { errorObjectFromSocketError } from "./odspError.mjs";
12
+ import { SocketIOClientStatic } from "./socketModule.mjs";
13
+ import { pkgVersion } from "./packageVersion.mjs";
11
14
  const protocolVersions = ["^0.4.0", "^0.3.0", "^0.2.0", "^0.1.0"];
12
15
  const feature_get_ops = "api_get_ops";
13
16
  const feature_flush_ops = "api_flush_ops";
17
+ const feature_submit_signals_v2 = "submit_signals_v2";
14
18
  // How long to wait before disconnecting the socket after the last reference is removed
15
19
  // This allows reconnection after receiving a nack to be smooth
16
20
  const socketReferenceBufferTime = 2000;
17
21
  class SocketReference extends TypedEventEmitter {
18
- constructor(key, socket) {
19
- super();
20
- this.key = key;
21
- this.references = 1;
22
- // When making decisions about socket reuse, we do not reuse disconnected socket.
23
- // But we want to differentiate the following case from disconnected case:
24
- // Socket that never connected and never failed, it's in "attempting to connect" mode
25
- // such sockets should be reused, despite socket.disconnected === true
26
- this.isPendingInitialConnection = true;
27
- this._socket = socket;
28
- assert(!SocketReference.socketIoSockets.has(key), 0x220 /* "socket key collision" */);
29
- SocketReference.socketIoSockets.set(key, this);
30
- // The server always closes the socket after sending this message
31
- // fully remove the socket reference now
32
- socket.on("server_disconnect", (socketError) => {
33
- // Treat all errors as recoverable, and rely on joinSession / reconnection flow to
34
- // filter out retryable vs. non-retryable cases.
35
- const error = errorObjectFromSocketError(socketError, "server_disconnect");
36
- error.canRetry = true;
37
- // see comment in disconnected() getter
38
- // Setting it here to ensure socket reuse does not happen if new request to connect
39
- // comes in from "disconnect" listener below, before we close socket.
40
- this.isPendingInitialConnection = false;
41
- // Explicitly cast error to the specified event args type to ensure type compatibility
42
- this.emit("server_disconnect", error);
43
- this.closeSocket();
44
- });
45
- }
46
22
  static find(key, logger) {
47
23
  const socketReference = SocketReference.socketIoSockets.get(key);
48
24
  // Verify the socket is healthy before reusing it
49
- if (socketReference === null || socketReference === void 0 ? void 0 : socketReference.disconnected) {
25
+ if (socketReference?.disconnected) {
50
26
  // The socket is in a bad state. fully remove the reference
51
27
  socketReference.closeSocket();
52
28
  return undefined;
@@ -61,15 +37,13 @@ class SocketReference extends TypedEventEmitter {
61
37
  /**
62
38
  * Removes a reference for the given key
63
39
  * Once the ref count hits 0, the socket is disconnected and removed
64
- * @param key - socket reference key
65
- * @param isFatalError - true if the socket reference should be removed immediately due to a fatal error
66
40
  */
67
- removeSocketIoReference(isFatalError) {
41
+ removeSocketIoReference() {
68
42
  assert(this.references > 0, 0x09f /* "No more socketIO refs to remove!" */);
69
43
  this.references--;
70
44
  // see comment in disconnected() getter
71
45
  this.isPendingInitialConnection = false;
72
- if (isFatalError || this.disconnected) {
46
+ if (this.disconnected) {
73
47
  this.closeSocket();
74
48
  return;
75
49
  }
@@ -87,27 +61,68 @@ class SocketReference extends TypedEventEmitter {
87
61
  }
88
62
  return this._socket;
89
63
  }
64
+ constructor(key, socket) {
65
+ super();
66
+ this.key = key;
67
+ this.references = 1;
68
+ // When making decisions about socket reuse, we do not reuse disconnected socket.
69
+ // But we want to differentiate the following case from disconnected case:
70
+ // Socket that never connected and never failed, it's in "attempting to connect" mode
71
+ // such sockets should be reused, despite socket.disconnected === true
72
+ this.isPendingInitialConnection = true;
73
+ this.serverDisconnectEventHandler = (socketError, clientId) => {
74
+ // Treat all errors as recoverable, and rely on joinSession / reconnection flow to
75
+ // filter out retryable vs. non-retryable cases.
76
+ const error = errorObjectFromSocketError(socketError, "server_disconnect");
77
+ error.addTelemetryProperties({ disconnectClientId: clientId });
78
+ error.canRetry = true;
79
+ // see comment in disconnected() getter
80
+ // Setting it here to ensure socket reuse does not happen if new request to connect
81
+ // comes in from "disconnect" listener below, before we close socket.
82
+ this.isPendingInitialConnection = false;
83
+ if (clientId === undefined) {
84
+ // We could first raise "disconnect" event, but that may result in socket reuse due to
85
+ // new connection comming in. So, it's better to have more explicit flow to make it impossible.
86
+ this.closeSocket(error);
87
+ }
88
+ else {
89
+ this.emit("disconnect", error, clientId);
90
+ }
91
+ };
92
+ this._socket = socket;
93
+ assert(!SocketReference.socketIoSockets.has(key), 0x220 /* "socket key collision" */);
94
+ SocketReference.socketIoSockets.set(key, this);
95
+ // Server sends this event when it wants to disconnect a particular client in which case the client id would
96
+ // be present or if it wants to disconnect all the clients. The server always closes the socket in case all
97
+ // clients needs to be disconnected. So fully remove the socket reference in this case.
98
+ socket.on("server_disconnect", this.serverDisconnectEventHandler);
99
+ }
90
100
  clearTimer() {
91
101
  if (this.delayDeleteTimeout !== undefined) {
92
102
  clearTimeout(this.delayDeleteTimeout);
93
103
  this.delayDeleteTimeout = undefined;
94
104
  }
95
105
  }
96
- closeSocket() {
106
+ closeSocket(error) {
97
107
  if (!this._socket) {
98
108
  return;
99
109
  }
110
+ this._socket.off("server_disconnect", this.serverDisconnectEventHandler);
100
111
  this.clearTimer();
101
112
  assert(SocketReference.socketIoSockets.get(this.key) === this, 0x0a1 /* "Socket reference set unexpectedly does not point to this socket!" */);
113
+ // First, remove socket to ensure no socket reuse is possible.
102
114
  SocketReference.socketIoSockets.delete(this.key);
115
+ // Block access to socket. From now on, calls like flush() or requestOps()
116
+ // Disconnect flow should be synchronous and result in system fully forgetting about this connection / socket.
103
117
  const socket = this._socket;
104
118
  this._socket = undefined;
105
- // Delay closing socket, to make sure all users of socket observe the same event that causes
106
- // this instance to close, and thus properly record reason for closure.
107
- // All event raising is synchronous, so clients will have a chance to react before socket is
108
- // closed without any extra data on why it was closed.
109
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
110
- Promise.resolve().then(() => { socket.disconnect(); });
119
+ // Let all connections know they need to go through disconnect flow.
120
+ this.emit("disconnect", error ??
121
+ createGenericNetworkError("Socket closed without error", { canRetry: true }, { driverVersion: pkgVersion }), undefined /* clientId */);
122
+ // We should not have any users now, assuming synchronous disconnect flow in response to
123
+ // "disconnect" event
124
+ assert(this.references === 0, 0x412 /* Nobody should be connected to this socket at this point! */);
125
+ socket.disconnect();
111
126
  }
112
127
  get disconnected() {
113
128
  if (this._socket === undefined) {
@@ -132,25 +147,6 @@ SocketReference.socketIoSockets = new Map();
132
147
  * Represents a connection to a stream of delta updates
133
148
  */
134
149
  export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
135
- /**
136
- * @param socket - websocket to be used
137
- * @param documentId - ID of the document
138
- * @param details - details of the websocket connection
139
- * @param socketReferenceKey - socket reference key
140
- * @param enableMultiplexing - If the websocket is multiplexing multiple documents
141
- */
142
- constructor(socket, documentId, socketReference, logger, enableMultiplexing) {
143
- super(socket, documentId, logger);
144
- this.enableMultiplexing = enableMultiplexing;
145
- this.pushCallCounter = 0;
146
- this.getOpsMap = new Map();
147
- this.serverDisconnectHandler = (error) => {
148
- this.logger.sendTelemetryEvent({ eventName: "ServerDisconnect", clientId: this.clientId }, error);
149
- this.disposeCore(true, error);
150
- };
151
- this.socketReference = socketReference;
152
- this.requestOpsNoncePrefix = `${uuid()}-`;
153
- }
154
150
  /**
155
151
  * Create a OdspDocumentDeltaConnection
156
152
  * If url #1 fails to connect, will try url #2 if applicable.
@@ -158,7 +154,6 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
158
154
  * @param tenantId - the ID of the tenant
159
155
  * @param documentId - document ID
160
156
  * @param token - authorization token for storage service
161
- * @param io - websocket library
162
157
  * @param client - information about the client
163
158
  * @param mode - mode of the client
164
159
  * @param url - websocket URL
@@ -167,7 +162,9 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
167
162
  * @param epochTracker - track epoch changes
168
163
  * @param socketReferenceKeyPrefix - (optional) prefix to isolate socket reuse cache
169
164
  */
170
- static async create(tenantId, documentId, token, io, client, url, telemetryLogger, timeoutMs, epochTracker, socketReferenceKeyPrefix) {
165
+ static async create(tenantId, documentId,
166
+ // eslint-disable-next-line @rushstack/no-new-null
167
+ token, client, url, telemetryLogger, timeoutMs, epochTracker, socketReferenceKeyPrefix) {
171
168
  const mc = loggerToMonitoringContext(telemetryLogger);
172
169
  // enable multiplexing when the websocket url does not include the tenant/document id
173
170
  const parsedUrl = new URL(url);
@@ -176,8 +173,9 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
176
173
  // this will allow multiple documents to share the same websocket connection
177
174
  const key = socketReferenceKeyPrefix ? `${socketReferenceKeyPrefix},${url}` : url;
178
175
  const socketReferenceKey = enableMultiplexing ? key : `${key},${tenantId},${documentId}`;
179
- const socketReference = OdspDocumentDeltaConnection.getOrCreateSocketIoReference(io, timeoutMs, socketReferenceKey, url, enableMultiplexing, tenantId, documentId, telemetryLogger);
176
+ const socketReference = OdspDocumentDeltaConnection.getOrCreateSocketIoReference(timeoutMs, socketReferenceKey, url, enableMultiplexing, tenantId, documentId, telemetryLogger);
180
177
  const socket = socketReference.socket;
178
+ const connectionId = uuid();
181
179
  const connectMessage = {
182
180
  client,
183
181
  id: documentId,
@@ -185,19 +183,22 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
185
183
  tenantId,
186
184
  token,
187
185
  versions: protocolVersions,
188
- nonce: uuid(),
186
+ driverVersion: pkgVersion,
187
+ nonce: connectionId,
189
188
  epoch: epochTracker.fluidEpoch,
190
189
  relayUserAgent: [client.details.environment, ` driverVersion:${pkgVersion}`].join(";"),
191
190
  };
191
+ connectMessage.supportedFeatures = {
192
+ [feature_submit_signals_v2]: true,
193
+ };
192
194
  // Reference to this client supporting get_ops flow.
193
- connectMessage.supportedFeatures = {};
194
195
  if (mc.config.getBoolean("Fluid.Driver.Odsp.GetOpsEnabled") !== false) {
195
196
  connectMessage.supportedFeatures[feature_get_ops] = true;
196
197
  }
197
- const deltaConnection = new OdspDocumentDeltaConnection(socket, documentId, socketReference, telemetryLogger, enableMultiplexing);
198
+ const deltaConnection = new OdspDocumentDeltaConnection(socket, documentId, socketReference, telemetryLogger, enableMultiplexing, connectionId);
198
199
  try {
199
200
  await deltaConnection.initialize(connectMessage, timeoutMs);
200
- await epochTracker.validateEpochFromPush(deltaConnection.details);
201
+ await epochTracker.validateEpoch(deltaConnection.details.epoch, "push");
201
202
  }
202
203
  catch (errorObject) {
203
204
  if (errorObject !== null && typeof errorObject === "object") {
@@ -229,23 +230,20 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
229
230
  // Note: we suspect the incoming error object is either:
230
231
  // - a socketError: add it to the OdspError object for driver to be able to parse it and reason over it.
231
232
  // - anything else: let base class handle it
232
- if (canRetry && Number.isInteger(error === null || error === void 0 ? void 0 : error.code) && typeof (error === null || error === void 0 ? void 0 : error.message) === "string") {
233
- return errorObjectFromSocketError(error, handler);
234
- }
235
- else {
236
- return super.createErrorObject(handler, error, canRetry);
237
- }
233
+ return canRetry && Number.isInteger(error?.code) && typeof error?.message === "string"
234
+ ? errorObjectFromSocketError(error, handler)
235
+ : super.createErrorObject(handler, error, canRetry);
238
236
  }
239
237
  /**
240
238
  * Gets or create a socket io connection for the given key
241
239
  */
242
- static getOrCreateSocketIoReference(io, timeoutMs, key, url, enableMultiplexing, tenantId, documentId, logger) {
240
+ static getOrCreateSocketIoReference(timeoutMs, key, url, enableMultiplexing, tenantId, documentId, logger) {
243
241
  const existingSocketReference = SocketReference.find(key, logger);
244
242
  if (existingSocketReference) {
245
243
  return existingSocketReference;
246
244
  }
247
245
  const query = enableMultiplexing ? undefined : { documentId, tenantId };
248
- const socket = io(url, {
246
+ const socket = SocketIOClientStatic(url, {
249
247
  multiplex: false,
250
248
  query,
251
249
  reconnection: false,
@@ -254,6 +252,33 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
254
252
  });
255
253
  return new SocketReference(key, socket);
256
254
  }
255
+ /**
256
+ * @param socket - websocket to be used
257
+ * @param documentId - ID of the document
258
+ * @param details - details of the websocket connection
259
+ * @param socketReferenceKey - socket reference key
260
+ * @param enableMultiplexing - If the websocket is multiplexing multiple documents
261
+ */
262
+ constructor(socket, documentId, socketReference, logger, enableMultiplexing, connectionId) {
263
+ super(socket, documentId, logger, false, connectionId);
264
+ this.enableMultiplexing = enableMultiplexing;
265
+ this.pushCallCounter = 0;
266
+ this.getOpsMap = new Map();
267
+ this.disconnectHandler = (error, clientId) => {
268
+ if (clientId === undefined || clientId === this.clientId) {
269
+ this.logger.sendTelemetryEvent({
270
+ eventName: "ServerDisconnect",
271
+ driverVersion: pkgVersion,
272
+ details: JSON.stringify({
273
+ ...this.getConnectionDetailsProps(),
274
+ }),
275
+ }, error);
276
+ this.disconnect(error);
277
+ }
278
+ };
279
+ this.socketReference = socketReference;
280
+ this.requestOpsNoncePrefix = `${uuid()}-`;
281
+ }
257
282
  /**
258
283
  * Retrieves ops from PUSH
259
284
  * @param from - inclusive
@@ -261,12 +286,12 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
261
286
  * @returns ops retrieved
262
287
  */
263
288
  requestOps(from, to) {
264
- var _a;
289
+ assert(!this.socketReference?.disconnected, 0x413 /* non-active socket */);
265
290
  // Given that to is exclusive, we should be asking for at least something!
266
291
  assert(to > from, 0x272 /* "empty request" */);
267
292
  // PUSH may disable this functionality
268
293
  // back-compat: remove cast to any once latest version of IConnected is consumed
269
- if (((_a = this.details.supportedFeatures) === null || _a === void 0 ? void 0 : _a[feature_get_ops]) !== true) {
294
+ if (this.details.supportedFeatures?.[feature_get_ops] !== true) {
270
295
  return;
271
296
  }
272
297
  this.pushCallCounter++;
@@ -311,9 +336,9 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
311
336
  });
312
337
  }
313
338
  async flush() {
314
- var _a;
339
+ assert(!this.socketReference?.disconnected, 0x414 /* non-active socket */);
315
340
  // back-compat: remove cast to any once latest version of IConnected is consumed
316
- if (((_a = this.details.supportedFeatures) === null || _a === void 0 ? void 0 : _a[feature_flush_ops]) !== true) {
341
+ if (this.details.supportedFeatures?.[feature_flush_ops] !== true) {
317
342
  // Once single-commit summary is enabled end-to-end, flush support is a must!
318
343
  // The only alternative is change in design where SPO fetches ops from PUSH OR
319
344
  // summary includes required ops and SPO has some validation mechanism to ensure
@@ -337,6 +362,7 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
337
362
  return this.flushDeferred.promise;
338
363
  }
339
364
  async initialize(connectMessage, timeout) {
365
+ assert(!this.socketReference?.disconnected, 0x415 /* non-active socket */);
340
366
  if (this.enableMultiplexing) {
341
367
  // multiplex compatible early handlers
342
368
  this.earlyOpHandler = (messageDocumentId, msgs) => {
@@ -346,39 +372,52 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
346
372
  };
347
373
  this.earlySignalHandler = (msg, messageDocumentId) => {
348
374
  if (messageDocumentId === undefined || messageDocumentId === this.documentId) {
349
- this.queuedSignals.push(msg);
375
+ if (Array.isArray(msg)) {
376
+ this.queuedSignals.push(...msg);
377
+ }
378
+ else {
379
+ this.queuedSignals.push(msg);
380
+ }
350
381
  }
351
382
  };
352
383
  }
353
- this.socketReference.on("server_disconnect", this.serverDisconnectHandler);
354
- this.socket.on("get_ops_response", (result) => {
384
+ this.socketReference.on("disconnect", this.disconnectHandler);
385
+ this.addTrackedListener("get_ops_response", (result) => {
355
386
  const messages = result.messages;
356
387
  const data = this.getOpsMap.get(result.nonce);
357
388
  // Due to socket multiplexing, this client may not have asked for any data
358
389
  // If so, there it most likely does not need these ops (otherwise it already asked for them)
359
390
  // Also we may have deleted entry in this.getOpsMap due to too many requests and too slow response.
360
391
  // But not processing such result may push us into infinite loop of fast requests and dropping all responses
361
- if (data !== undefined || result.nonce.indexOf(this.requestOpsNoncePrefix) === 0) {
392
+ if (data !== undefined || result.nonce.startsWith(this.requestOpsNoncePrefix)) {
362
393
  this.getOpsMap.delete(result.nonce);
363
394
  const common = {
364
395
  eventName: "GetOps",
365
396
  // We need nonce only to pair with GetOpsTooMany events, i.e. when record was deleted
366
397
  nonce: data === undefined ? result.nonce : undefined,
367
398
  code: result.code,
368
- from: data === null || data === void 0 ? void 0 : data.from,
369
- to: data === null || data === void 0 ? void 0 : data.to,
399
+ from: data?.from,
400
+ to: data?.to,
370
401
  duration: data === undefined ? undefined : performance.now() - data.start,
371
402
  };
372
403
  if (messages !== undefined && messages.length > 0) {
373
- this.logger.sendPerformanceEvent(Object.assign(Object.assign({}, common), { first: messages[0].sequenceNumber, last: messages[messages.length - 1].sequenceNumber, length: messages.length }));
404
+ this.logger.sendPerformanceEvent({
405
+ ...common,
406
+ first: messages[0].sequenceNumber,
407
+ last: messages[messages.length - 1].sequenceNumber,
408
+ length: messages.length,
409
+ });
374
410
  this.emit("op", this.documentId, messages);
375
411
  }
376
412
  else {
377
- this.logger.sendPerformanceEvent(Object.assign(Object.assign({}, common), { length: 0 }));
413
+ this.logger.sendPerformanceEvent({
414
+ ...common,
415
+ length: 0,
416
+ });
378
417
  }
379
418
  }
380
419
  });
381
- this.socket.on("flush_ops_response", (result) => {
420
+ this.addTrackedListener("flush_ops_response", (result) => {
382
421
  if (this.flushOpNonce === result.nonce) {
383
422
  const seq = result.lastPersistedSequenceNumber;
384
423
  let category = "generic";
@@ -406,7 +445,12 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
406
445
  this.flushOpNonce = undefined;
407
446
  }
408
447
  });
409
- await super.initialize(connectMessage, timeout);
448
+ await super.initialize(connectMessage, timeout).finally(() => {
449
+ this.logger.sendTelemetryEvent({
450
+ eventName: "ConnectionAttemptInfo",
451
+ ...this.getConnectionDetailsProps(),
452
+ });
453
+ });
410
454
  }
411
455
  addTrackedListener(event, listener) {
412
456
  // override some event listeners in order to support multiple documents/clients over the same websocket
@@ -422,7 +466,9 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
422
466
  case "signal":
423
467
  // per document signal handling
424
468
  super.addTrackedListener(event, (msg, documentId) => {
425
- if (!this.enableMultiplexing || !documentId || documentId === this.documentId) {
469
+ if (!this.enableMultiplexing ||
470
+ !documentId ||
471
+ documentId === this.documentId) {
426
472
  listener(msg, documentId);
427
473
  }
428
474
  });
@@ -430,11 +476,11 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
430
476
  case "nack":
431
477
  // per client / document nack handling
432
478
  super.addTrackedListener(event, (clientIdOrDocumentId, nacks) => {
433
- var _a, _b;
434
479
  const handle = clientIdOrDocumentId.length === 0 ||
435
480
  clientIdOrDocumentId === this.documentId ||
436
- (clientIdOrDocumentId === this.clientId);
437
- const { code, type, message, retryAfter } = (_b = (_a = nacks[0]) === null || _a === void 0 ? void 0 : _a.content) !== null && _b !== void 0 ? _b : {};
481
+ clientIdOrDocumentId === this.clientId;
482
+ const { code, type, message, retryAfter } = nacks[0]?.content ?? {};
483
+ const { clientSequenceNumber, referenceSequenceNumber } = nacks[0]?.operation ?? {};
438
484
  this.logger.sendTelemetryEvent({
439
485
  eventName: "ServerNack",
440
486
  code,
@@ -443,6 +489,9 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
443
489
  retryAfterSeconds: retryAfter,
444
490
  clientId: this.clientId,
445
491
  handle,
492
+ clientSequenceNumber,
493
+ referenceSequenceNumber,
494
+ opType: nacks[0]?.operation?.type,
446
495
  });
447
496
  if (handle) {
448
497
  this.emit("nack", clientIdOrDocumentId, nacks);
@@ -454,21 +503,83 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
454
503
  break;
455
504
  }
456
505
  }
506
+ get disposed() {
507
+ if (!(this._disposed || this.socket.connected)) {
508
+ // Send error event if this connection is not yet disposed after socket is disconnected for 15s.
509
+ if (this.connectionNotYetDisposedTimeout === undefined) {
510
+ this.connectionNotYetDisposedTimeout = setTimeout(() => {
511
+ if (!this._disposed) {
512
+ this.logger.sendErrorEvent({
513
+ eventName: "ConnectionNotYetDisposed",
514
+ driverVersion: pkgVersion,
515
+ details: JSON.stringify({
516
+ ...this.getConnectionDetailsProps(),
517
+ }),
518
+ });
519
+ }
520
+ }, 15000);
521
+ }
522
+ }
523
+ return this._disposed;
524
+ }
525
+ /**
526
+ * Returns true in case the connection is not yet disposed and the socket is also connected. The expectation is
527
+ * that it will be called only after connection is fully established. i.e. there should no way to submit an op
528
+ * while we are connecting, as connection object is not exposed to Loader layer until connection is established.
529
+ */
530
+ get connected() {
531
+ return !this.disposed && this.socket.connected;
532
+ }
533
+ emitMessages(type, messages) {
534
+ // Only submit the op/signals if we are connected.
535
+ if (this.connected) {
536
+ this.socket.emit(type, this.clientId, messages);
537
+ }
538
+ }
539
+ /**
540
+ * Submits a new delta operation to the server
541
+ * @param message - delta operation to submit
542
+ */
543
+ submit(messages) {
544
+ this.emitMessages("submitOp", [messages]);
545
+ }
546
+ /**
547
+ * Submits a new signal to the server
548
+ *
549
+ * @param content - Content of the signal.
550
+ * @param targetClientId - When specified, the signal is only sent to the provided client id.
551
+ */
552
+ submitSignal(content, targetClientId) {
553
+ const signal = {
554
+ content,
555
+ targetClientId,
556
+ };
557
+ // back-compat: the typing for this method and emitMessages is incorrect, will be fixed in a future PR
558
+ this.emitMessages("submitSignal", [signal]);
559
+ }
560
+ /**
561
+ * Critical path where we need to also close the socket for an error.
562
+ * @param error - Error causing the socket to close.
563
+ */
564
+ closeSocketCore(error) {
565
+ const socket = this.socketReference;
566
+ assert(socket !== undefined, 0x416 /* reentrancy not supported in close socket */);
567
+ socket.closeSocket(error);
568
+ assert(this.socketReference === undefined, 0x417 /* disconnect flow did not work correctly */);
569
+ }
457
570
  /**
458
571
  * Disconnect from the websocket
459
572
  */
460
- disconnect(socketProtocolError, reason) {
461
- var _a;
573
+ disconnectCore() {
462
574
  const socket = this.socketReference;
463
575
  assert(socket !== undefined, 0x0a2 /* "reentrancy not supported!" */);
464
- (_a = this.socketReference) === null || _a === void 0 ? void 0 : _a.off("server_disconnect", this.serverDisconnectHandler);
465
576
  this.socketReference = undefined;
466
- if (!socketProtocolError && this.hasDetails) {
577
+ socket.off("disconnect", this.disconnectHandler);
578
+ if (this.hasDetails) {
467
579
  // tell the server we are disconnecting this client from the document
468
580
  this.socket.emit("disconnect_document", this.clientId, this.documentId);
469
581
  }
470
- socket.removeSocketIoReference(socketProtocolError);
471
- this.emit("disconnect", reason);
582
+ socket.removeSocketIoReference();
472
583
  }
473
584
  }
474
- //# sourceMappingURL=odspDocumentDeltaConnection.js.map
585
+ //# sourceMappingURL=odspDocumentDeltaConnection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"odspDocumentDeltaConnection.mjs","sourceRoot":"","sources":["../src/odspDocumentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;OAGI,EAGN,yBAAyB,GACzB,MAAM,iCAAiC;OACjC,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,8BAA8B;OACtE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B;OACtD,EAAE,uBAAuB,EAAE,MAAM,6BAA6B;OAa9D,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM;OAC1B,EAAE,yBAAyB,EAAE,MAAM,8BAA8B;OAGjE,EAAE,0BAA0B,EAAE;OAC9B,EAAE,oBAAoB,EAAE;OACxB,EAAE,UAAU,EAAE;AAErB,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAOtD,uFAAuF;AACvF,+DAA+D;AAC/D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AASvC,MAAM,eAAgB,SAAQ,iBAAgC;IActD,MAAM,CAAC,IAAI,CAAC,GAAW,EAAE,MAA2B;QAC1D,MAAM,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjE,iDAAiD;QACjD,IAAI,eAAe,EAAE,YAAY,EAAE;YAClC,2DAA2D;YAC3D,eAAe,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;SACjB;QAED,IAAI,eAAe,EAAE;YACpB,6CAA6C;YAC7C,eAAe,CAAC,UAAU,EAAE,CAAC;YAC7B,eAAe,CAAC,UAAU,EAAE,CAAC;SAC7B;QAED,OAAO,eAAe,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,uBAAuB;QAC7B,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,uCAAuC;QACvC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QAExC,IAAI,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;SACP;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;YACnE,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzC,4CAA4C;gBAC5C,MAAM,CACL,IAAI,CAAC,UAAU,KAAK,CAAC,EACrB,KAAK,CAAC,iDAAiD,CACvD,CAAC;gBACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,CAAC,EAAE,yBAAyB,CAAC,CAAC;SAC9B;IACF,CAAC;IAED,IAAW,MAAM;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SACvD;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,YACiB,GAAW,EAC3B,MAAc;QAEd,KAAK,EAAE,CAAC;QAHQ,QAAG,GAAH,GAAG,CAAQ;QApEpB,eAAU,GAAW,CAAC,CAAC;QAI/B,iFAAiF;QACjF,0EAA0E;QAC1E,qFAAqF;QACrF,sEAAsE;QAC9D,+BAA0B,GAAG,IAAI,CAAC;QA2EzB,iCAA4B,GAAG,CAC/C,WAA6B,EAC7B,QAAiB,EAChB,EAAE;YACH,kFAAkF;YAClF,gDAAgD;YAChD,MAAM,KAAK,GAAG,0BAA0B,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;YAC3E,KAAK,CAAC,sBAAsB,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/D,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YAEtB,uCAAuC;YACvC,mFAAmF;YACnF,qEAAqE;YACrE,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YAExC,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC3B,sFAAsF;gBACtF,+FAA+F;gBAC/F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;aACxB;iBAAM;gBACN,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aACzC;QACF,CAAC,CAAC;QAhCD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,MAAM,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACtF,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE/C,4GAA4G;QAC5G,2GAA2G;QAC3G,uFAAuF;QACvF,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACnE,CAAC;IA0BO,UAAU;QACjB,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;YAC1C,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;SACpC;IACF,CAAC;IAEM,WAAW,CAAC,KAAuB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,CACL,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EACtD,KAAK,CAAC,wEAAwE,CAC9E,CAAC;QAEF,8DAA8D;QAC9D,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjD,0EAA0E;QAC1E,8GAA8G;QAC9G,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAEzB,oEAAoE;QACpE,IAAI,CAAC,IAAI,CACR,YAAY,EACZ,KAAK;YACJ,yBAAyB,CACxB,6BAA6B,EAC7B,EAAE,QAAQ,EAAE,IAAI,EAAE,EAClB,EAAE,aAAa,EAAE,UAAU,EAAE,CAC7B,EACF,SAAS,CAAC,cAAc,CACxB,CAAC;QAEF,wFAAwF;QACxF,qBAAqB;QACrB,MAAM,CACL,IAAI,CAAC,UAAU,KAAK,CAAC,EACrB,KAAK,CAAC,8DAA8D,CACpE,CAAC;QAEF,MAAM,CAAC,UAAU,EAAE,CAAC;IACrB,CAAC;IAED,IAAW,YAAY;QACtB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC/B,OAAO,IAAI,CAAC;SACZ;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAC1B,OAAO,KAAK,CAAC;SACb;QAED,0DAA0D;QAC1D,qFAAqF;QACrF,iDAAiD;QACjD,uFAAuF;QACvF,sGAAsG;QACtG,2GAA2G;QAC3G,+GAA+G;QAC/G,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;;AAnKD,+EAA+E;AACvD,+BAAe,GAAiC,IAAI,GAAG,EAAE,AAA1C,CAA2C;AAqKnF;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,uBAAuB;IACvE;;;;;;;;;;;;;;OAcG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACzB,QAAgB,EAChB,UAAkB;IAClB,kDAAkD;IAClD,KAAoB,EACpB,MAAe,EACf,GAAW,EACX,eAAoC,EACpC,SAAiB,EACjB,YAA0B,EAC1B,wBAA4C;QAE5C,MAAM,EAAE,GAAG,yBAAyB,CAAC,eAAe,CAAC,CAAC;QAEtD,qFAAqF;QACrF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,kBAAkB,GACvB,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEtF,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,GAAG,GAAG,wBAAwB,CAAC,CAAC,CAAC,GAAG,wBAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAClF,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;QAEzF,MAAM,eAAe,GAAG,2BAA2B,CAAC,4BAA4B,CAC/E,SAAS,EACT,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,eAAe,CACf,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAa;YAChC,MAAM;YACN,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ;YACR,KAAK;YACL,QAAQ,EAAE,gBAAgB;YAC1B,aAAa,EAAE,UAAU;YACzB,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,YAAY,CAAC,UAAU;YAC9B,cAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACtF,CAAC;QAEF,cAAc,CAAC,iBAAiB,GAAG;YAClC,CAAC,yBAAyB,CAAC,EAAE,IAAI;SACjC,CAAC;QAEF,oDAAoD;QACpD,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC,KAAK,KAAK,EAAE;YACtE,cAAc,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;SACzD;QAED,MAAM,eAAe,GAAG,IAAI,2BAA2B,CACtD,MAAM,EACN,UAAU,EACV,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,YAAY,CACZ,CAAC;QAEF,IAAI;YACH,MAAM,eAAe,CAAC,UAAU,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAC5D,MAAM,YAAY,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACxE;QAAC,OAAO,WAAgB,EAAE;YAC1B,IAAI,WAAW,KAAK,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBAC5D,2EAA2E;gBAC3E,mGAAmG;gBACnG,4FAA4F;gBAC5F,6CAA6C;gBAC7C,yEAAyE;gBACzE,sCAAsC;gBACtC,uFAAuF;gBACvF,6FAA6F;gBAC7F,2BAA2B;gBAC3B,8BAA8B;gBAC9B,mGAAmG;gBACnG,oCAAoC;gBACpC,qFAAqF;gBACrF,IAAI,WAAW,CAAC,UAAU,KAAK,GAAG,IAAI,WAAW,CAAC,UAAU,KAAK,GAAG,EAAE;oBACrE,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;iBAC5B;aACD;YACD,MAAM,WAAW,CAAC;SAClB;QAED,OAAO,eAAe,CAAC;IACxB,CAAC;IAYD;;OAEG;IACO,iBAAiB,CAAC,OAAe,EAAE,KAAW,EAAE,QAAQ,GAAG,IAAI;QACxE,wDAAwD;QACxD,wGAAwG;QACxG,4CAA4C;QAC5C,OAAO,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ;YACrF,CAAC,CAAC,0BAA0B,CAAC,KAAyB,EAAE,OAAO,CAAC;YAChE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,4BAA4B,CAC1C,SAAiB,EACjB,GAAW,EACX,GAAW,EACX,kBAA2B,EAC3B,QAAgB,EAChB,UAAkB,EAClB,MAA2B;QAE3B,MAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,uBAAuB,EAAE;YAC5B,OAAO,uBAAuB,CAAC;SAC/B;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAExE,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE;YACxC,SAAS,EAAE,KAAK;YAChB,KAAK;YACL,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,OAAO,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,OAAO,IAAI,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,YACC,MAAc,EACd,UAAkB,EAClB,eAAgC,EAChC,MAA2B,EACV,kBAA4B,EAC7C,YAAqB;QAErB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAHtC,uBAAkB,GAAlB,kBAAkB,CAAU;QA7DtC,oBAAe,GAAG,CAAC,CAAC;QACX,cAAS,GACzB,IAAI,GAAG,EAAE,CAAC;QAkKD,sBAAiB,GAAG,CAAC,KAAkC,EAAE,QAAiB,EAAE,EAAE;YACvF,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE;gBACzD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAC7B;oBACC,SAAS,EAAE,kBAAkB;oBAC7B,aAAa,EAAE,UAAU;oBACzB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACvB,GAAG,IAAI,CAAC,yBAAyB,EAAE;qBACnC,CAAC;iBACF,EACD,KAAK,CACL,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aACvB;QACF,CAAC,CAAC;QAjHD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,qBAAqB,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,IAAY,EAAE,EAAU;QACzC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE3E,0EAA0E;QAC1E,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAE/C,sCAAsC;QACtC,gFAAgF;QAChF,IAAK,IAAI,CAAC,OAAe,CAAC,iBAAiB,EAAE,CAAC,eAAe,CAAC,KAAK,IAAI,EAAE;YACxE,OAAO;SACP;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEhC,qFAAqF;QACrF,qFAAqF;QACrF,uEAAuE;QACvE,yFAAyF;QACzF,sDAAsD;QACtD,uFAAuF;QACvF,gCAAgC;QAChC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,EAAE;YAC7B,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,IAAI,GAAuB,CAAC;YAC5B,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;gBAC7D,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE;oBAC7C,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;oBACnB,GAAG,GAAG,YAAY,CAAC;iBACnB;aACD;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAI,CAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC1B,SAAS,EAAE,eAAe;gBAC1B,KAAK;gBACL,IAAI,EAAE,eAAe,CAAC,IAAI;gBAC1B,EAAE,EAAE,eAAe,CAAC,EAAE;gBACtB,MAAM,EAAE,eAAe,CAAC,EAAE,GAAG,eAAe,CAAC,IAAI;gBACjD,QAAQ,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC,KAAK;aACnD,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAI,CAAC,CAAC;SAC5B;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;YACzB,KAAK;YACL,IAAI;YACJ,EAAE;SACF,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;YAC1C,KAAK;YACL,IAAI;YACJ,EAAE,EAAE,EAAE,GAAG,CAAC;SACV,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,KAAK;QACjB,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE3E,gFAAgF;QAChF,IAAK,IAAI,CAAC,OAAe,CAAC,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YAC1E,6EAA6E;YAC7E,8EAA8E;YAC9E,gFAAgF;YAChF,iCAAiC;YACjC,uFAAuF;YACvF,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC;YAClE,MAAM,IAAI,KAAK,CACd,4EAA4E,CAC5E,CAAC;SACF;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrE,sFAAsF;QACtF,qFAAqF;QACrF,uDAAuD;QACvD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,aAAa,CAAC,MAAM,CACxB,oEAAoE,CACpE,CAAC;SACF;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,QAAQ,EAAe,CAAC;QACjD,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IACnC,CAAC;IAkBS,KAAK,CAAC,UAAU,CAAC,cAAwB,EAAE,OAAe;QACnE,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC5B,sCAAsC;YACtC,IAAI,CAAC,cAAc,GAAG,CACrB,iBAAyB,EACzB,IAAiC,EAChC,EAAE;gBACH,IAAI,IAAI,CAAC,UAAU,KAAK,iBAAiB,EAAE;oBAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;iBAClC;YACF,CAAC,CAAC;YAEF,IAAI,CAAC,kBAAkB,GAAG,CACzB,GAAsC,EACtC,iBAA0B,EACzB,EAAE;gBACH,IAAI,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,KAAK,IAAI,CAAC,UAAU,EAAE;oBAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;wBACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;qBAChC;yBAAM;wBACN,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAC7B;iBACD;YACF,CAAC,CAAC;SACF;QAED,IAAI,CAAC,eAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE/D,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,CAAC,MAAuB,EAAE,EAAE;YACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,0EAA0E;YAC1E,4FAA4F;YAC5F,mGAAmG;YACnG,4GAA4G;YAC5G,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE;gBAC9E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG;oBACd,SAAS,EAAE,QAAQ;oBACnB,qFAAqF;oBACrF,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;oBACpD,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,IAAI,EAAE,IAAI;oBAChB,EAAE,EAAE,IAAI,EAAE,EAAE;oBACZ,QAAQ,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;iBACzE,CAAC;gBACF,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAClD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;wBAChC,GAAG,MAAM;wBACT,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc;wBACjC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc;wBAClD,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACvB,CAAC,CAAC;oBACH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;iBAC3C;qBAAM;oBACN,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;wBAChC,GAAG,MAAM;wBACT,MAAM,EAAE,CAAC;qBACT,CAAC,CAAC;iBACH;aACD;QACF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC,MAAyB,EAAE,EAAE;YAC3E,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC,KAAK,EAAE;gBACvC,MAAM,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;gBAC/C,IAAI,QAAQ,GAAwB,SAAS,CAAC;gBAC9C,IAAI,MAAM,CAAC,2BAA2B,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE;oBAC5E,QAAQ,MAAM,CAAC,IAAI,EAAE;wBACpB,KAAK,GAAG,CAAC;wBACT,KAAK,GAAG;4BACP,QAAQ,GAAG,OAAO,CAAC;4BACnB,MAAM;wBACP,KAAK,GAAG;4BACP,MAAM;wBACP;4BACC,QAAQ,GAAG,OAAO,CAAC;4BACnB,MAAM;qBACP;iBACD;gBACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;oBAC9B,SAAS,EAAE,aAAa;oBACxB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,cAAc,EAAE,GAAG;oBACnB,QAAQ;iBACR,CAAC,CAAC;gBACH,IAAI,CAAC,aAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;aAC9B;QACF,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5D,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;gBAC9B,SAAS,EAAE,uBAAuB;gBAClC,GAAG,IAAI,CAAC,yBAAyB,EAAE;aACnC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAES,kBAAkB,CAAC,KAAa,EAAE,QAAkC;QAC7E,uGAAuG;QACvG,QAAQ,KAAK,EAAE;YACd,KAAK,IAAI;gBACR,2BAA2B;gBAC3B,KAAK,CAAC,kBAAkB,CACvB,KAAK,EACL,CAAC,UAAkB,EAAE,IAAiC,EAAE,EAAE;oBACzD,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,EAAE;wBAC/D,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;qBAC3B;gBACF,CAAC,CACD,CAAC;gBACF,MAAM;YAEP,KAAK,QAAQ;gBACZ,+BAA+B;gBAC/B,KAAK,CAAC,kBAAkB,CACvB,KAAK,EACL,CAAC,GAAsC,EAAE,UAAmB,EAAE,EAAE;oBAC/D,IACC,CAAC,IAAI,CAAC,kBAAkB;wBACxB,CAAC,UAAU;wBACX,UAAU,KAAK,IAAI,CAAC,UAAU,EAC7B;wBACD,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;qBAC1B;gBACF,CAAC,CACD,CAAC;gBACF,MAAM;YAEP,KAAK,MAAM;gBACV,sCAAsC;gBACtC,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,oBAA4B,EAAE,KAAc,EAAE,EAAE;oBAChF,MAAM,MAAM,GACX,oBAAoB,CAAC,MAAM,KAAK,CAAC;wBACjC,oBAAoB,KAAK,IAAI,CAAC,UAAU;wBACxC,oBAAoB,KAAK,IAAI,CAAC,QAAQ,CAAC;oBACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;oBACpE,MAAM,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,GACtD,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;wBAC9B,SAAS,EAAE,YAAY;wBACvB,IAAI;wBACJ,IAAI;wBACJ,OAAO;wBACP,iBAAiB,EAAE,UAAU;wBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,MAAM;wBACN,oBAAoB;wBACpB,uBAAuB;wBACvB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI;qBACjC,CAAC,CAAC;oBACH,IAAI,MAAM,EAAE;wBACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,CAAC,CAAC;qBAC/C;gBACF,CAAC,CAAC,CAAC;gBACH,MAAM;YAEP;gBACC,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC1C,MAAM;SACP;IACF,CAAC;IAED,IAAW,QAAQ;QAClB,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;YAC/C,gGAAgG;YAChG,IAAI,IAAI,CAAC,+BAA+B,KAAK,SAAS,EAAE;gBACvD,IAAI,CAAC,+BAA+B,GAAG,UAAU,CAAC,GAAG,EAAE;oBACtD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;wBACpB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;4BAC1B,SAAS,EAAE,0BAA0B;4BACrC,aAAa,EAAE,UAAU;4BACzB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;gCACvB,GAAG,IAAI,CAAC,yBAAyB,EAAE;6BACnC,CAAC;yBACF,CAAC,CAAC;qBACH;gBACF,CAAC,EAAE,KAAK,CAAC,CAAC;aACV;SACD;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,IAAY,SAAS;QACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAChD,CAAC;IAES,YAAY,CAAC,IAAY,EAAE,QAA8B;QAClE,kDAAkD;QAClD,IAAI,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAChD;IACF,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,QAA4B;QACzC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,YAAY,CAAC,OAAyB,EAAE,cAAuB;QACrE,MAAM,MAAM,GAAuB;YAClC,OAAO;YACP,cAAc;SACd,CAAC;QAEF,sGAAsG;QACtG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,MAAM,CAAQ,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACO,eAAe,CAAC,KAAsB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACnF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,CACL,IAAI,CAAC,eAAe,KAAK,SAAS,EAClC,KAAK,CAAC,4CAA4C,CAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACO,cAAc;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,qEAAqE;YACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;SACxE;QAED,MAAM,CAAC,uBAAuB,EAAE,CAAC;IAClC,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IEvent } from \"@fluidframework/core-interfaces\";\nimport {\n\tITelemetryLoggerExt,\n\tIFluidErrorBase,\n\tloggerToMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { performance, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { assert, Deferred } from \"@fluidframework/core-utils\";\nimport { DocumentDeltaConnection } from \"@fluidframework/driver-base\";\nimport { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport { OdspError } from \"@fluidframework/odsp-driver-definitions\";\nimport {\n\tIClient,\n\tIConnect,\n\tIDocumentMessage,\n\tINack,\n\tISentSignalMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { Socket } from \"socket.io-client\";\nimport { v4 as uuid } from \"uuid\";\nimport { createGenericNetworkError } from \"@fluidframework/driver-utils\";\nimport { IOdspSocketError, IGetOpsResponse, IFlushOpsResponse } from \"./contracts\";\nimport { EpochTracker } from \"./epochTracker\";\nimport { errorObjectFromSocketError } from \"./odspError\";\nimport { SocketIOClientStatic } from \"./socketModule\";\nimport { pkgVersion } from \"./packageVersion\";\n\nconst protocolVersions = [\"^0.4.0\", \"^0.3.0\", \"^0.2.0\", \"^0.1.0\"];\nconst feature_get_ops = \"api_get_ops\";\nconst feature_flush_ops = \"api_flush_ops\";\nconst feature_submit_signals_v2 = \"submit_signals_v2\";\n\nexport interface FlushResult {\n\tlastPersistedSequenceNumber?: number;\n\tretryAfter?: number;\n}\n\n// How long to wait before disconnecting the socket after the last reference is removed\n// This allows reconnection after receiving a nack to be smooth\nconst socketReferenceBufferTime = 2000;\n\ninterface ISocketEvents extends IEvent {\n\t(\n\t\tevent: \"disconnect\",\n\t\tlistener: (error: IFluidErrorBase & OdspError, clientId?: string) => void,\n\t);\n}\n\nclass SocketReference extends TypedEventEmitter<ISocketEvents> {\n\tprivate references: number = 1;\n\tprivate delayDeleteTimeout: ReturnType<typeof setTimeout> | undefined;\n\tprivate _socket: Socket | undefined;\n\n\t// When making decisions about socket reuse, we do not reuse disconnected socket.\n\t// But we want to differentiate the following case from disconnected case:\n\t// Socket that never connected and never failed, it's in \"attempting to connect\" mode\n\t// such sockets should be reused, despite socket.disconnected === true\n\tprivate isPendingInitialConnection = true;\n\n\t// Map of all existing socket io sockets. [url, tenantId, documentId] -> socket\n\tprivate static readonly socketIoSockets: Map<string, SocketReference> = new Map();\n\n\tpublic static find(key: string, logger: ITelemetryLoggerExt) {\n\t\tconst socketReference = SocketReference.socketIoSockets.get(key);\n\n\t\t// Verify the socket is healthy before reusing it\n\t\tif (socketReference?.disconnected) {\n\t\t\t// The socket is in a bad state. fully remove the reference\n\t\t\tsocketReference.closeSocket();\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (socketReference) {\n\t\t\t// Clear the pending deletion if there is one\n\t\t\tsocketReference.clearTimer();\n\t\t\tsocketReference.references++;\n\t\t}\n\n\t\treturn socketReference;\n\t}\n\n\t/**\n\t * Removes a reference for the given key\n\t * Once the ref count hits 0, the socket is disconnected and removed\n\t */\n\tpublic removeSocketIoReference() {\n\t\tassert(this.references > 0, 0x09f /* \"No more socketIO refs to remove!\" */);\n\t\tthis.references--;\n\n\t\t// see comment in disconnected() getter\n\t\tthis.isPendingInitialConnection = false;\n\n\t\tif (this.disconnected) {\n\t\t\tthis.closeSocket();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.references === 0 && this.delayDeleteTimeout === undefined) {\n\t\t\tthis.delayDeleteTimeout = setTimeout(() => {\n\t\t\t\t// We should not get here with active users.\n\t\t\t\tassert(\n\t\t\t\t\tthis.references === 0,\n\t\t\t\t\t0x0a0 /* \"Unexpected socketIO references on timeout\" */,\n\t\t\t\t);\n\t\t\t\tthis.closeSocket();\n\t\t\t}, socketReferenceBufferTime);\n\t\t}\n\t}\n\n\tpublic get socket() {\n\t\tif (!this._socket) {\n\t\t\tthrow new Error(`Invalid socket for key \"${this.key}`);\n\t\t}\n\t\treturn this._socket;\n\t}\n\n\tpublic constructor(\n\t\tpublic readonly key: string,\n\t\tsocket: Socket,\n\t) {\n\t\tsuper();\n\n\t\tthis._socket = socket;\n\t\tassert(!SocketReference.socketIoSockets.has(key), 0x220 /* \"socket key collision\" */);\n\t\tSocketReference.socketIoSockets.set(key, this);\n\n\t\t// Server sends this event when it wants to disconnect a particular client in which case the client id would\n\t\t// be present or if it wants to disconnect all the clients. The server always closes the socket in case all\n\t\t// clients needs to be disconnected. So fully remove the socket reference in this case.\n\t\tsocket.on(\"server_disconnect\", this.serverDisconnectEventHandler);\n\t}\n\n\tprivate readonly serverDisconnectEventHandler = (\n\t\tsocketError: IOdspSocketError,\n\t\tclientId?: string,\n\t) => {\n\t\t// Treat all errors as recoverable, and rely on joinSession / reconnection flow to\n\t\t// filter out retryable vs. non-retryable cases.\n\t\tconst error = errorObjectFromSocketError(socketError, \"server_disconnect\");\n\t\terror.addTelemetryProperties({ disconnectClientId: clientId });\n\t\terror.canRetry = true;\n\n\t\t// see comment in disconnected() getter\n\t\t// Setting it here to ensure socket reuse does not happen if new request to connect\n\t\t// comes in from \"disconnect\" listener below, before we close socket.\n\t\tthis.isPendingInitialConnection = false;\n\n\t\tif (clientId === undefined) {\n\t\t\t// We could first raise \"disconnect\" event, but that may result in socket reuse due to\n\t\t\t// new connection comming in. So, it's better to have more explicit flow to make it impossible.\n\t\t\tthis.closeSocket(error);\n\t\t} else {\n\t\t\tthis.emit(\"disconnect\", error, clientId);\n\t\t}\n\t};\n\n\tprivate clearTimer() {\n\t\tif (this.delayDeleteTimeout !== undefined) {\n\t\t\tclearTimeout(this.delayDeleteTimeout);\n\t\t\tthis.delayDeleteTimeout = undefined;\n\t\t}\n\t}\n\n\tpublic closeSocket(error?: IAnyDriverError) {\n\t\tif (!this._socket) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._socket.off(\"server_disconnect\", this.serverDisconnectEventHandler);\n\t\tthis.clearTimer();\n\n\t\tassert(\n\t\t\tSocketReference.socketIoSockets.get(this.key) === this,\n\t\t\t0x0a1 /* \"Socket reference set unexpectedly does not point to this socket!\" */,\n\t\t);\n\n\t\t// First, remove socket to ensure no socket reuse is possible.\n\t\tSocketReference.socketIoSockets.delete(this.key);\n\n\t\t// Block access to socket. From now on, calls like flush() or requestOps()\n\t\t// Disconnect flow should be synchronous and result in system fully forgetting about this connection / socket.\n\t\tconst socket = this._socket;\n\t\tthis._socket = undefined;\n\n\t\t// Let all connections know they need to go through disconnect flow.\n\t\tthis.emit(\n\t\t\t\"disconnect\",\n\t\t\terror ??\n\t\t\t\tcreateGenericNetworkError(\n\t\t\t\t\t\"Socket closed without error\",\n\t\t\t\t\t{ canRetry: true },\n\t\t\t\t\t{ driverVersion: pkgVersion },\n\t\t\t\t),\n\t\t\tundefined /* clientId */,\n\t\t);\n\n\t\t// We should not have any users now, assuming synchronous disconnect flow in response to\n\t\t// \"disconnect\" event\n\t\tassert(\n\t\t\tthis.references === 0,\n\t\t\t0x412 /* Nobody should be connected to this socket at this point! */,\n\t\t);\n\n\t\tsocket.disconnect();\n\t}\n\n\tpublic get disconnected() {\n\t\tif (this._socket === undefined) {\n\t\t\treturn true;\n\t\t}\n\t\tif (this.socket.connected) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We have a socket that is not connected. Possible cases:\n\t\t// 1) It was connected some time ago and lost connection. We do not want to reuse it.\n\t\t// 2) It failed to connect (was never connected).\n\t\t// 3) It was just created and never had a chance to connect - connection is in process.\n\t\t// We have to differentiate 1 from 2-3 (specifically 1 & 3) in order to be able to reuse socket in #3.\n\t\t// We will use the fact that socket had some activity. I.e. if socket disconnected, or client stopped using\n\t\t// socket, then removeSocketIoReference() will be called for it, and it will be the indiction that it's not #3.\n\t\treturn !this.isPendingInitialConnection;\n\t}\n}\n\n/**\n * Represents a connection to a stream of delta updates\n */\nexport class OdspDocumentDeltaConnection extends DocumentDeltaConnection {\n\t/**\n\t * Create a OdspDocumentDeltaConnection\n\t * If url #1 fails to connect, will try url #2 if applicable.\n\t *\n\t * @param tenantId - the ID of the tenant\n\t * @param documentId - document ID\n\t * @param token - authorization token for storage service\n\t * @param client - information about the client\n\t * @param mode - mode of the client\n\t * @param url - websocket URL\n\t * @param telemetryLogger - optional telemetry logger\n\t * @param timeoutMs - time limit on making the connection\n\t * @param epochTracker - track epoch changes\n\t * @param socketReferenceKeyPrefix - (optional) prefix to isolate socket reuse cache\n\t */\n\tpublic static async create(\n\t\ttenantId: string,\n\t\tdocumentId: string,\n\t\t// eslint-disable-next-line @rushstack/no-new-null\n\t\ttoken: string | null,\n\t\tclient: IClient,\n\t\turl: string,\n\t\ttelemetryLogger: ITelemetryLoggerExt,\n\t\ttimeoutMs: number,\n\t\tepochTracker: EpochTracker,\n\t\tsocketReferenceKeyPrefix: string | undefined,\n\t): Promise<OdspDocumentDeltaConnection> {\n\t\tconst mc = loggerToMonitoringContext(telemetryLogger);\n\n\t\t// enable multiplexing when the websocket url does not include the tenant/document id\n\t\tconst parsedUrl = new URL(url);\n\t\tconst enableMultiplexing =\n\t\t\t!parsedUrl.searchParams.has(\"documentId\") && !parsedUrl.searchParams.has(\"tenantId\");\n\n\t\t// do not include the specific tenant/doc id in the ref key when multiplexing\n\t\t// this will allow multiple documents to share the same websocket connection\n\t\tconst key = socketReferenceKeyPrefix ? `${socketReferenceKeyPrefix},${url}` : url;\n\t\tconst socketReferenceKey = enableMultiplexing ? key : `${key},${tenantId},${documentId}`;\n\n\t\tconst socketReference = OdspDocumentDeltaConnection.getOrCreateSocketIoReference(\n\t\t\ttimeoutMs,\n\t\t\tsocketReferenceKey,\n\t\t\turl,\n\t\t\tenableMultiplexing,\n\t\t\ttenantId,\n\t\t\tdocumentId,\n\t\t\ttelemetryLogger,\n\t\t);\n\n\t\tconst socket = socketReference.socket;\n\t\tconst connectionId = uuid();\n\t\tconst connectMessage: IConnect = {\n\t\t\tclient,\n\t\t\tid: documentId,\n\t\t\tmode: client.mode,\n\t\t\ttenantId,\n\t\t\ttoken, // Token is going to indicate tenant level information, etc...\n\t\t\tversions: protocolVersions,\n\t\t\tdriverVersion: pkgVersion,\n\t\t\tnonce: connectionId,\n\t\t\tepoch: epochTracker.fluidEpoch,\n\t\t\trelayUserAgent: [client.details.environment, ` driverVersion:${pkgVersion}`].join(\";\"),\n\t\t};\n\n\t\tconnectMessage.supportedFeatures = {\n\t\t\t[feature_submit_signals_v2]: true,\n\t\t};\n\n\t\t// Reference to this client supporting get_ops flow.\n\t\tif (mc.config.getBoolean(\"Fluid.Driver.Odsp.GetOpsEnabled\") !== false) {\n\t\t\tconnectMessage.supportedFeatures[feature_get_ops] = true;\n\t\t}\n\n\t\tconst deltaConnection = new OdspDocumentDeltaConnection(\n\t\t\tsocket,\n\t\t\tdocumentId,\n\t\t\tsocketReference,\n\t\t\ttelemetryLogger,\n\t\t\tenableMultiplexing,\n\t\t\tconnectionId,\n\t\t);\n\n\t\ttry {\n\t\t\tawait deltaConnection.initialize(connectMessage, timeoutMs);\n\t\t\tawait epochTracker.validateEpoch(deltaConnection.details.epoch, \"push\");\n\t\t} catch (errorObject: any) {\n\t\t\tif (errorObject !== null && typeof errorObject === \"object\") {\n\t\t\t\t// We have to special-case error types here in terms of what is re-triable.\n\t\t\t\t// These errors have to re-retried, we just need new joinSession result to connect to right server:\n\t\t\t\t// 400: Invalid tenant or document id. The WebSocket is connected to a different document\n\t\t\t\t// Document is full (with retryAfter)\n\t\t\t\t// 404: Invalid document. The document \\\"local/w1-...\\\" does not exist\n\t\t\t\t// But this has to stay not-retriable:\n\t\t\t\t// 406: Unsupported client protocol. This path is the only gatekeeper, have to fail!\n\t\t\t\t// 409: Epoch Version Mismatch. Client epoch and server epoch does not match, so app needs\n\t\t\t\t// to be refreshed.\n\t\t\t\t// This one is fine either way\n\t\t\t\t// 401/403: Code will retry once with new token either way, then it becomes fatal - on this path\n\t\t\t\t// and on join Session path.\n\t\t\t\t// 501: (Fluid not enabled): this is fine either way, as joinSession is gatekeeper\n\t\t\t\tif (errorObject.statusCode === 400 || errorObject.statusCode === 404) {\n\t\t\t\t\terrorObject.canRetry = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow errorObject;\n\t\t}\n\n\t\treturn deltaConnection;\n\t}\n\n\tprivate socketReference: SocketReference | undefined;\n\n\tprivate readonly requestOpsNoncePrefix: string;\n\tprivate pushCallCounter = 0;\n\tprivate readonly getOpsMap: Map<string, { start: number; from: number; to: number }> =\n\t\tnew Map();\n\tprivate flushOpNonce: string | undefined;\n\tprivate flushDeferred: Deferred<FlushResult> | undefined;\n\tprivate connectionNotYetDisposedTimeout: ReturnType<typeof setTimeout> | undefined;\n\n\t/**\n\t * Error raising for socket.io issues\n\t */\n\tprotected createErrorObject(handler: string, error?: any, canRetry = true): IAnyDriverError {\n\t\t// Note: we suspect the incoming error object is either:\n\t\t// - a socketError: add it to the OdspError object for driver to be able to parse it and reason over it.\n\t\t// - anything else: let base class handle it\n\t\treturn canRetry && Number.isInteger(error?.code) && typeof error?.message === \"string\"\n\t\t\t? errorObjectFromSocketError(error as IOdspSocketError, handler)\n\t\t\t: super.createErrorObject(handler, error, canRetry);\n\t}\n\n\t/**\n\t * Gets or create a socket io connection for the given key\n\t */\n\tprivate static getOrCreateSocketIoReference(\n\t\ttimeoutMs: number,\n\t\tkey: string,\n\t\turl: string,\n\t\tenableMultiplexing: boolean,\n\t\ttenantId: string,\n\t\tdocumentId: string,\n\t\tlogger: ITelemetryLoggerExt,\n\t): SocketReference {\n\t\tconst existingSocketReference = SocketReference.find(key, logger);\n\t\tif (existingSocketReference) {\n\t\t\treturn existingSocketReference;\n\t\t}\n\n\t\tconst query = enableMultiplexing ? undefined : { documentId, tenantId };\n\n\t\tconst socket = SocketIOClientStatic(url, {\n\t\t\tmultiplex: false, // Don't rely on socket.io built-in multiplexing\n\t\t\tquery,\n\t\t\treconnection: false,\n\t\t\ttransports: [\"websocket\"],\n\t\t\ttimeout: timeoutMs,\n\t\t});\n\n\t\treturn new SocketReference(key, socket);\n\t}\n\n\t/**\n\t * @param socket - websocket to be used\n\t * @param documentId - ID of the document\n\t * @param details - details of the websocket connection\n\t * @param socketReferenceKey - socket reference key\n\t * @param enableMultiplexing - If the websocket is multiplexing multiple documents\n\t */\n\tprivate constructor(\n\t\tsocket: Socket,\n\t\tdocumentId: string,\n\t\tsocketReference: SocketReference,\n\t\tlogger: ITelemetryLoggerExt,\n\t\tprivate readonly enableMultiplexing?: boolean,\n\t\tconnectionId?: string,\n\t) {\n\t\tsuper(socket, documentId, logger, false, connectionId);\n\t\tthis.socketReference = socketReference;\n\t\tthis.requestOpsNoncePrefix = `${uuid()}-`;\n\t}\n\n\t/**\n\t * Retrieves ops from PUSH\n\t * @param from - inclusive\n\t * @param to - exclusive\n\t * @returns ops retrieved\n\t */\n\tpublic requestOps(from: number, to: number) {\n\t\tassert(!this.socketReference?.disconnected, 0x413 /* non-active socket */);\n\n\t\t// Given that to is exclusive, we should be asking for at least something!\n\t\tassert(to > from, 0x272 /* \"empty request\" */);\n\n\t\t// PUSH may disable this functionality\n\t\t// back-compat: remove cast to any once latest version of IConnected is consumed\n\t\tif ((this.details as any).supportedFeatures?.[feature_get_ops] !== true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pushCallCounter++;\n\t\tconst nonce = `${this.requestOpsNoncePrefix}${this.pushCallCounter}`;\n\t\tconst start = performance.now();\n\n\t\t// We may keep keep accumulating memory for nothing, if we are not getting responses.\n\t\t// Note that we should not have overlapping requests, as DeltaManager allows only one\n\t\t// outstanding request to storage, and that's the only way to get here.\n\t\t// But requests could be cancelled, and thus overlapping requests might be in the picture\n\t\t// If it happens, we do not care about stale requests.\n\t\t// So track some number of requests, but log if we get too many in flight - that likely\n\t\t// indicates an error somewhere.\n\t\tif (this.getOpsMap.size >= 5) {\n\t\t\tlet time = start;\n\t\t\tlet key: string | undefined;\n\t\t\tfor (const [keyCandidate, value] of this.getOpsMap.entries()) {\n\t\t\t\tif (value.start <= time || key === undefined) {\n\t\t\t\t\ttime = value.start;\n\t\t\t\t\tkey = keyCandidate;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst payloadToDelete = this.getOpsMap.get(key!)!;\n\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\teventName: \"GetOpsTooMany\",\n\t\t\t\tnonce,\n\t\t\t\tfrom: payloadToDelete.from,\n\t\t\t\tto: payloadToDelete.to,\n\t\t\t\tlength: payloadToDelete.to - payloadToDelete.from,\n\t\t\t\tduration: performance.now() - payloadToDelete.start,\n\t\t\t});\n\t\t\tthis.getOpsMap.delete(key!);\n\t\t}\n\t\tthis.getOpsMap.set(nonce, {\n\t\t\tstart,\n\t\t\tfrom,\n\t\t\tto,\n\t\t});\n\t\tthis.socket.emit(\"get_ops\", this.clientId, {\n\t\t\tnonce,\n\t\t\tfrom,\n\t\t\tto: to - 1,\n\t\t});\n\t}\n\n\tpublic async flush(): Promise<FlushResult> {\n\t\tassert(!this.socketReference?.disconnected, 0x414 /* non-active socket */);\n\n\t\t// back-compat: remove cast to any once latest version of IConnected is consumed\n\t\tif ((this.details as any).supportedFeatures?.[feature_flush_ops] !== true) {\n\t\t\t// Once single-commit summary is enabled end-to-end, flush support is a must!\n\t\t\t// The only alternative is change in design where SPO fetches ops from PUSH OR\n\t\t\t// summary includes required ops and SPO has some validation mechanism to ensure\n\t\t\t// they are not forged by client.\n\t\t\t// If design changes, we can reconsider it, but right now it's non-recoverable failure.\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"FlushOpsNotSupported\" });\n\t\t\tthrow new Error(\n\t\t\t\t\"flush() API is not supported by PUSH, required for single-commit summaries\",\n\t\t\t);\n\t\t}\n\n\t\tthis.pushCallCounter++;\n\t\tconst nonce = `${this.requestOpsNoncePrefix}${this.pushCallCounter}`;\n\t\t// There should be only one flush ops in flight, kicked out by upload summary workflow\n\t\t// That said, it could timeout and request could be repeated, so theoretically we can\n\t\t// get overlapping requests, but it should be very rare\n\t\tif (this.flushDeferred !== undefined) {\n\t\t\tthis.logger.sendErrorEvent({ eventName: \"FlushOpsTooMany\" });\n\t\t\tthis.flushDeferred.reject(\n\t\t\t\t\"process involving flush() was cancelled OR unsupported concurrency\",\n\t\t\t);\n\t\t}\n\t\tthis.socket.emit(\"flush_ops\", this.clientId, { nonce });\n\n\t\tthis.flushOpNonce = nonce;\n\t\tthis.flushDeferred = new Deferred<FlushResult>();\n\t\treturn this.flushDeferred.promise;\n\t}\n\n\tprotected disconnectHandler = (error: IFluidErrorBase & OdspError, clientId?: string) => {\n\t\tif (clientId === undefined || clientId === this.clientId) {\n\t\t\tthis.logger.sendTelemetryEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: \"ServerDisconnect\",\n\t\t\t\t\tdriverVersion: pkgVersion,\n\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t...this.getConnectionDetailsProps(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t);\n\t\t\tthis.disconnect(error);\n\t\t}\n\t};\n\n\tprotected async initialize(connectMessage: IConnect, timeout: number) {\n\t\tassert(!this.socketReference?.disconnected, 0x415 /* non-active socket */);\n\n\t\tif (this.enableMultiplexing) {\n\t\t\t// multiplex compatible early handlers\n\t\t\tthis.earlyOpHandler = (\n\t\t\t\tmessageDocumentId: string,\n\t\t\t\tmsgs: ISequencedDocumentMessage[],\n\t\t\t) => {\n\t\t\t\tif (this.documentId === messageDocumentId) {\n\t\t\t\t\tthis.queuedMessages.push(...msgs);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.earlySignalHandler = (\n\t\t\t\tmsg: ISignalMessage | ISignalMessage[],\n\t\t\t\tmessageDocumentId?: string,\n\t\t\t) => {\n\t\t\t\tif (messageDocumentId === undefined || messageDocumentId === this.documentId) {\n\t\t\t\t\tif (Array.isArray(msg)) {\n\t\t\t\t\t\tthis.queuedSignals.push(...msg);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.queuedSignals.push(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tthis.socketReference!.on(\"disconnect\", this.disconnectHandler);\n\n\t\tthis.addTrackedListener(\"get_ops_response\", (result: IGetOpsResponse) => {\n\t\t\tconst messages = result.messages;\n\t\t\tconst data = this.getOpsMap.get(result.nonce);\n\t\t\t// Due to socket multiplexing, this client may not have asked for any data\n\t\t\t// If so, there it most likely does not need these ops (otherwise it already asked for them)\n\t\t\t// Also we may have deleted entry in this.getOpsMap due to too many requests and too slow response.\n\t\t\t// But not processing such result may push us into infinite loop of fast requests and dropping all responses\n\t\t\tif (data !== undefined || result.nonce.startsWith(this.requestOpsNoncePrefix)) {\n\t\t\t\tthis.getOpsMap.delete(result.nonce);\n\t\t\t\tconst common = {\n\t\t\t\t\teventName: \"GetOps\",\n\t\t\t\t\t// We need nonce only to pair with GetOpsTooMany events, i.e. when record was deleted\n\t\t\t\t\tnonce: data === undefined ? result.nonce : undefined,\n\t\t\t\t\tcode: result.code,\n\t\t\t\t\tfrom: data?.from,\n\t\t\t\t\tto: data?.to,\n\t\t\t\t\tduration: data === undefined ? undefined : performance.now() - data.start,\n\t\t\t\t};\n\t\t\t\tif (messages !== undefined && messages.length > 0) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\t...common,\n\t\t\t\t\t\tfirst: messages[0].sequenceNumber,\n\t\t\t\t\t\tlast: messages[messages.length - 1].sequenceNumber,\n\t\t\t\t\t\tlength: messages.length,\n\t\t\t\t\t});\n\t\t\t\t\tthis.emit(\"op\", this.documentId, messages);\n\t\t\t\t} else {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\t...common,\n\t\t\t\t\t\tlength: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.addTrackedListener(\"flush_ops_response\", (result: IFlushOpsResponse) => {\n\t\t\tif (this.flushOpNonce === result.nonce) {\n\t\t\t\tconst seq = result.lastPersistedSequenceNumber;\n\t\t\t\tlet category: \"generic\" | \"error\" = \"generic\";\n\t\t\t\tif (result.lastPersistedSequenceNumber === undefined || result.code !== 200) {\n\t\t\t\t\tswitch (result.code) {\n\t\t\t\t\t\tcase 409:\n\t\t\t\t\t\tcase 429:\n\t\t\t\t\t\t\tcategory = \"error\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 204:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tcategory = \"error\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"FlushResult\",\n\t\t\t\t\tcode: result.code,\n\t\t\t\t\tsequenceNumber: seq,\n\t\t\t\t\tcategory,\n\t\t\t\t});\n\t\t\t\tthis.flushDeferred!.resolve(result);\n\t\t\t\tthis.flushDeferred = undefined;\n\t\t\t\tthis.flushOpNonce = undefined;\n\t\t\t}\n\t\t});\n\n\t\tawait super.initialize(connectMessage, timeout).finally(() => {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"ConnectionAttemptInfo\",\n\t\t\t\t...this.getConnectionDetailsProps(),\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected addTrackedListener(event: string, listener: (...args: any[]) => void) {\n\t\t// override some event listeners in order to support multiple documents/clients over the same websocket\n\t\tswitch (event) {\n\t\t\tcase \"op\":\n\t\t\t\t// per document op handling\n\t\t\t\tsuper.addTrackedListener(\n\t\t\t\t\tevent,\n\t\t\t\t\t(documentId: string, msgs: ISequencedDocumentMessage[]) => {\n\t\t\t\t\t\tif (!this.enableMultiplexing || this.documentId === documentId) {\n\t\t\t\t\t\t\tlistener(documentId, msgs);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase \"signal\":\n\t\t\t\t// per document signal handling\n\t\t\t\tsuper.addTrackedListener(\n\t\t\t\t\tevent,\n\t\t\t\t\t(msg: ISignalMessage | ISignalMessage[], documentId?: string) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!this.enableMultiplexing ||\n\t\t\t\t\t\t\t!documentId ||\n\t\t\t\t\t\t\tdocumentId === this.documentId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlistener(msg, documentId);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase \"nack\":\n\t\t\t\t// per client / document nack handling\n\t\t\t\tsuper.addTrackedListener(event, (clientIdOrDocumentId: string, nacks: INack[]) => {\n\t\t\t\t\tconst handle =\n\t\t\t\t\t\tclientIdOrDocumentId.length === 0 ||\n\t\t\t\t\t\tclientIdOrDocumentId === this.documentId ||\n\t\t\t\t\t\tclientIdOrDocumentId === this.clientId;\n\t\t\t\t\tconst { code, type, message, retryAfter } = nacks[0]?.content ?? {};\n\t\t\t\t\tconst { clientSequenceNumber, referenceSequenceNumber } =\n\t\t\t\t\t\tnacks[0]?.operation ?? {};\n\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\teventName: \"ServerNack\",\n\t\t\t\t\t\tcode,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tretryAfterSeconds: retryAfter,\n\t\t\t\t\t\tclientId: this.clientId,\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\tclientSequenceNumber,\n\t\t\t\t\t\treferenceSequenceNumber,\n\t\t\t\t\t\topType: nacks[0]?.operation?.type,\n\t\t\t\t\t});\n\t\t\t\t\tif (handle) {\n\t\t\t\t\t\tthis.emit(\"nack\", clientIdOrDocumentId, nacks);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tsuper.addTrackedListener(event, listener);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic get disposed() {\n\t\tif (!(this._disposed || this.socket.connected)) {\n\t\t\t// Send error event if this connection is not yet disposed after socket is disconnected for 15s.\n\t\t\tif (this.connectionNotYetDisposedTimeout === undefined) {\n\t\t\t\tthis.connectionNotYetDisposedTimeout = setTimeout(() => {\n\t\t\t\t\tif (!this._disposed) {\n\t\t\t\t\t\tthis.logger.sendErrorEvent({\n\t\t\t\t\t\t\teventName: \"ConnectionNotYetDisposed\",\n\t\t\t\t\t\t\tdriverVersion: pkgVersion,\n\t\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\t\t...this.getConnectionDetailsProps(),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 15000);\n\t\t\t}\n\t\t}\n\t\treturn this._disposed;\n\t}\n\n\t/**\n\t * Returns true in case the connection is not yet disposed and the socket is also connected. The expectation is\n\t * that it will be called only after connection is fully established. i.e. there should no way to submit an op\n\t * while we are connecting, as connection object is not exposed to Loader layer until connection is established.\n\t */\n\tprivate get connected(): boolean {\n\t\treturn !this.disposed && this.socket.connected;\n\t}\n\n\tprotected emitMessages(type: string, messages: IDocumentMessage[][]) {\n\t\t// Only submit the op/signals if we are connected.\n\t\tif (this.connected) {\n\t\t\tthis.socket.emit(type, this.clientId, messages);\n\t\t}\n\t}\n\n\t/**\n\t * Submits a new delta operation to the server\n\t * @param message - delta operation to submit\n\t */\n\tpublic submit(messages: IDocumentMessage[]): void {\n\t\tthis.emitMessages(\"submitOp\", [messages]);\n\t}\n\n\t/**\n\t * Submits a new signal to the server\n\t *\n\t * @param content - Content of the signal.\n\t * @param targetClientId - When specified, the signal is only sent to the provided client id.\n\t */\n\tpublic submitSignal(content: IDocumentMessage, targetClientId?: string): void {\n\t\tconst signal: ISentSignalMessage = {\n\t\t\tcontent,\n\t\t\ttargetClientId,\n\t\t};\n\n\t\t// back-compat: the typing for this method and emitMessages is incorrect, will be fixed in a future PR\n\t\tthis.emitMessages(\"submitSignal\", [signal] as any);\n\t}\n\n\t/**\n\t * Critical path where we need to also close the socket for an error.\n\t * @param error - Error causing the socket to close.\n\t */\n\tprotected closeSocketCore(error: IAnyDriverError) {\n\t\tconst socket = this.socketReference;\n\t\tassert(socket !== undefined, 0x416 /* reentrancy not supported in close socket */);\n\t\tsocket.closeSocket(error);\n\t\tassert(\n\t\t\tthis.socketReference === undefined,\n\t\t\t0x417 /* disconnect flow did not work correctly */,\n\t\t);\n\t}\n\n\t/**\n\t * Disconnect from the websocket\n\t */\n\tprotected disconnectCore() {\n\t\tconst socket = this.socketReference;\n\t\tassert(socket !== undefined, 0x0a2 /* \"reentrancy not supported!\" */);\n\t\tthis.socketReference = undefined;\n\n\t\tsocket.off(\"disconnect\", this.disconnectHandler);\n\t\tif (this.hasDetails) {\n\t\t\t// tell the server we are disconnecting this client from the document\n\t\t\tthis.socket.emit(\"disconnect_document\", this.clientId, this.documentId);\n\t\t}\n\n\t\tsocket.removeSocketIoReference();\n\t}\n}\n"]}