@microsoft/live-share-react 1.4.0-preview.0 → 2.0.0-internal.10

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 (383) hide show
  1. package/LICENSE +64 -61
  2. package/README.md +173 -168
  3. package/bin/cjs/index.d.ts +7 -0
  4. package/bin/cjs/index.d.ts.map +1 -0
  5. package/bin/cjs/index.js +23 -0
  6. package/bin/cjs/index.js.map +1 -0
  7. package/bin/cjs/interfaces/LiveInterfaceExtensions.d.ts.map +1 -0
  8. package/bin/cjs/interfaces/LiveInterfaceExtensions.js +7 -0
  9. package/bin/cjs/interfaces/LiveInterfaceExtensions.js.map +1 -0
  10. package/bin/cjs/interfaces/index.d.ts +2 -0
  11. package/bin/cjs/interfaces/index.d.ts.map +1 -0
  12. package/bin/cjs/interfaces/index.js +18 -0
  13. package/bin/cjs/interfaces/index.js.map +1 -0
  14. package/bin/{internal → cjs/internal}/errors.d.ts +15 -0
  15. package/bin/cjs/internal/errors.d.ts.map +1 -0
  16. package/bin/cjs/internal/errors.js +48 -0
  17. package/bin/cjs/internal/errors.js.map +1 -0
  18. package/bin/cjs/internal/index.d.ts +3 -0
  19. package/bin/cjs/internal/index.d.ts.map +1 -0
  20. package/bin/cjs/internal/index.js +19 -0
  21. package/bin/cjs/internal/index.js.map +1 -0
  22. package/bin/{internal → cjs/internal}/type-guards.d.ts +5 -0
  23. package/bin/cjs/internal/type-guards.d.ts.map +1 -0
  24. package/bin/cjs/internal/type-guards.js +24 -0
  25. package/bin/cjs/internal/type-guards.js.map +1 -0
  26. package/bin/cjs/live-hooks/index.d.ts +8 -0
  27. package/bin/cjs/live-hooks/index.d.ts.map +1 -0
  28. package/bin/cjs/live-hooks/index.js +24 -0
  29. package/bin/cjs/live-hooks/index.js.map +1 -0
  30. package/bin/cjs/live-hooks/useLiveCanvas.d.ts +80 -0
  31. package/bin/cjs/live-hooks/useLiveCanvas.d.ts.map +1 -0
  32. package/bin/cjs/live-hooks/useLiveCanvas.js +244 -0
  33. package/bin/cjs/live-hooks/useLiveCanvas.js.map +1 -0
  34. package/bin/{live-hooks → cjs/live-hooks}/useLiveEvent.d.ts +37 -1
  35. package/bin/cjs/live-hooks/useLiveEvent.d.ts.map +1 -0
  36. package/bin/cjs/live-hooks/useLiveEvent.js +150 -0
  37. package/bin/cjs/live-hooks/useLiveEvent.js.map +1 -0
  38. package/bin/cjs/live-hooks/useLiveFollowMode.d.ts +163 -0
  39. package/bin/cjs/live-hooks/useLiveFollowMode.d.ts.map +1 -0
  40. package/bin/cjs/live-hooks/useLiveFollowMode.js +360 -0
  41. package/bin/cjs/live-hooks/useLiveFollowMode.js.map +1 -0
  42. package/bin/cjs/live-hooks/useLivePresence.d.ts +76 -0
  43. package/bin/cjs/live-hooks/useLivePresence.d.ts.map +1 -0
  44. package/bin/cjs/live-hooks/useLivePresence.js +170 -0
  45. package/bin/cjs/live-hooks/useLivePresence.js.map +1 -0
  46. package/bin/{live-hooks → cjs/live-hooks}/useLiveState.d.ts +46 -1
  47. package/bin/cjs/live-hooks/useLiveState.d.ts.map +1 -0
  48. package/bin/cjs/live-hooks/useLiveState.js +134 -0
  49. package/bin/cjs/live-hooks/useLiveState.js.map +1 -0
  50. package/bin/{live-hooks → cjs/live-hooks}/useLiveTimer.d.ts +56 -1
  51. package/bin/cjs/live-hooks/useLiveTimer.d.ts.map +1 -0
  52. package/bin/cjs/live-hooks/useLiveTimer.js +233 -0
  53. package/bin/cjs/live-hooks/useLiveTimer.js.map +1 -0
  54. package/bin/cjs/live-hooks/useMediaSynchronizer.d.ts +86 -0
  55. package/bin/cjs/live-hooks/useMediaSynchronizer.d.ts.map +1 -0
  56. package/bin/cjs/live-hooks/useMediaSynchronizer.js +301 -0
  57. package/bin/cjs/live-hooks/useMediaSynchronizer.js.map +1 -0
  58. package/bin/cjs/package.json +1 -0
  59. package/bin/{providers → cjs/providers}/AzureProvider.d.ts +9 -9
  60. package/bin/cjs/providers/AzureProvider.d.ts.map +1 -0
  61. package/bin/cjs/providers/AzureProvider.js +127 -0
  62. package/bin/cjs/providers/AzureProvider.js.map +1 -0
  63. package/bin/{providers → cjs/providers}/LiveShareProvider.d.ts +106 -4
  64. package/bin/cjs/providers/LiveShareProvider.d.ts.map +1 -0
  65. package/bin/cjs/providers/LiveShareProvider.js +205 -0
  66. package/bin/cjs/providers/LiveShareProvider.js.map +1 -0
  67. package/bin/cjs/providers/index.d.ts +3 -0
  68. package/bin/cjs/providers/index.d.ts.map +1 -0
  69. package/bin/cjs/providers/index.js +19 -0
  70. package/bin/cjs/providers/index.js.map +1 -0
  71. package/bin/cjs/shared-hooks/index.d.ts +7 -0
  72. package/bin/cjs/shared-hooks/index.d.ts.map +1 -0
  73. package/bin/cjs/shared-hooks/index.js +23 -0
  74. package/bin/cjs/shared-hooks/index.js.map +1 -0
  75. package/bin/cjs/shared-hooks/internals/tree-node-constants.d.ts +3 -0
  76. package/bin/cjs/shared-hooks/internals/tree-node-constants.d.ts.map +1 -0
  77. package/bin/cjs/shared-hooks/internals/tree-node-constants.js +6 -0
  78. package/bin/cjs/shared-hooks/internals/tree-node-constants.js.map +1 -0
  79. package/bin/cjs/shared-hooks/internals/tree-node-types.d.ts +10 -0
  80. package/bin/cjs/shared-hooks/internals/tree-node-types.d.ts.map +1 -0
  81. package/bin/cjs/shared-hooks/internals/tree-node-types.js +23 -0
  82. package/bin/cjs/shared-hooks/internals/tree-node-types.js.map +1 -0
  83. package/bin/cjs/shared-hooks/internals/tree-node-utils.d.ts +33 -0
  84. package/bin/cjs/shared-hooks/internals/tree-node-utils.d.ts.map +1 -0
  85. package/bin/cjs/shared-hooks/internals/tree-node-utils.js +193 -0
  86. package/bin/cjs/shared-hooks/internals/tree-node-utils.js.map +1 -0
  87. package/bin/{shared-hooks → cjs/shared-hooks}/useDynamicDDS.d.ts +4 -4
  88. package/bin/cjs/shared-hooks/useDynamicDDS.d.ts.map +1 -0
  89. package/bin/cjs/shared-hooks/useDynamicDDS.js +87 -0
  90. package/bin/cjs/shared-hooks/useDynamicDDS.js.map +1 -0
  91. package/bin/{shared-hooks → cjs/shared-hooks}/useSharedMap.d.ts +4 -2
  92. package/bin/cjs/shared-hooks/useSharedMap.d.ts.map +1 -0
  93. package/bin/cjs/shared-hooks/useSharedMap.js +134 -0
  94. package/bin/cjs/shared-hooks/useSharedMap.js.map +1 -0
  95. package/bin/{shared-hooks → cjs/shared-hooks}/useSharedState.d.ts +1 -1
  96. package/bin/cjs/shared-hooks/useSharedState.d.ts.map +1 -0
  97. package/bin/cjs/shared-hooks/useSharedState.js +80 -0
  98. package/bin/cjs/shared-hooks/useSharedState.js.map +1 -0
  99. package/bin/{shared-hooks → cjs/shared-hooks}/useSharedStateRegistry.d.ts +1 -1
  100. package/bin/cjs/shared-hooks/useSharedStateRegistry.d.ts.map +1 -0
  101. package/bin/cjs/shared-hooks/useSharedStateRegistry.js +120 -0
  102. package/bin/cjs/shared-hooks/useSharedStateRegistry.js.map +1 -0
  103. package/bin/cjs/shared-hooks/useSharedTree.d.ts +57 -0
  104. package/bin/cjs/shared-hooks/useSharedTree.d.ts.map +1 -0
  105. package/bin/cjs/shared-hooks/useSharedTree.js +123 -0
  106. package/bin/cjs/shared-hooks/useSharedTree.js.map +1 -0
  107. package/bin/cjs/shared-hooks/useTreeNode.d.ts +96 -0
  108. package/bin/cjs/shared-hooks/useTreeNode.d.ts.map +1 -0
  109. package/bin/cjs/shared-hooks/useTreeNode.js +135 -0
  110. package/bin/cjs/shared-hooks/useTreeNode.js.map +1 -0
  111. package/bin/{types → cjs/types}/ActionTypes.d.ts +7 -7
  112. package/bin/cjs/types/ActionTypes.d.ts.map +1 -0
  113. package/bin/cjs/types/ActionTypes.js +7 -0
  114. package/bin/cjs/types/ActionTypes.js.map +1 -0
  115. package/bin/cjs/types/PropTypes.d.ts +56 -0
  116. package/bin/cjs/types/PropTypes.d.ts.map +1 -0
  117. package/bin/cjs/types/PropTypes.js +7 -0
  118. package/bin/cjs/types/PropTypes.js.map +1 -0
  119. package/bin/{types → cjs/types}/ResultTypes.d.ts +50 -18
  120. package/bin/cjs/types/ResultTypes.d.ts.map +1 -0
  121. package/bin/cjs/types/ResultTypes.js +7 -0
  122. package/bin/cjs/types/ResultTypes.js.map +1 -0
  123. package/bin/cjs/types/index.d.ts +4 -0
  124. package/bin/cjs/types/index.d.ts.map +1 -0
  125. package/bin/cjs/types/index.js +20 -0
  126. package/bin/cjs/types/index.js.map +1 -0
  127. package/bin/cjs/utils/index.d.ts +2 -0
  128. package/bin/cjs/utils/index.d.ts.map +1 -0
  129. package/bin/cjs/utils/index.js +18 -0
  130. package/bin/cjs/utils/index.js.map +1 -0
  131. package/bin/cjs/utils/type-check.d.ts.map +1 -0
  132. package/bin/cjs/utils/type-check.js +62 -0
  133. package/bin/cjs/utils/type-check.js.map +1 -0
  134. package/bin/esm/index.d.ts +7 -0
  135. package/bin/esm/index.d.ts.map +1 -0
  136. package/bin/esm/index.js +7 -0
  137. package/bin/esm/index.js.map +1 -0
  138. package/bin/esm/interfaces/LiveInterfaceExtensions.d.ts +26 -0
  139. package/bin/esm/interfaces/LiveInterfaceExtensions.d.ts.map +1 -0
  140. package/bin/esm/interfaces/LiveInterfaceExtensions.js.map +1 -0
  141. package/bin/esm/interfaces/index.d.ts +2 -0
  142. package/bin/esm/interfaces/index.d.ts.map +1 -0
  143. package/bin/esm/interfaces/index.js +2 -0
  144. package/bin/esm/interfaces/index.js.map +1 -0
  145. package/bin/esm/internal/errors.d.ts +41 -0
  146. package/bin/esm/internal/errors.d.ts.map +1 -0
  147. package/bin/esm/internal/errors.js.map +1 -0
  148. package/bin/esm/internal/index.d.ts +3 -0
  149. package/bin/esm/internal/index.d.ts.map +1 -0
  150. package/bin/esm/internal/index.js +3 -0
  151. package/bin/esm/internal/index.js.map +1 -0
  152. package/bin/esm/internal/type-guards.d.ts +11 -0
  153. package/bin/esm/internal/type-guards.d.ts.map +1 -0
  154. package/bin/esm/internal/type-guards.js +20 -0
  155. package/bin/esm/internal/type-guards.js.map +1 -0
  156. package/bin/esm/live-hooks/index.d.ts +8 -0
  157. package/bin/esm/live-hooks/index.d.ts.map +1 -0
  158. package/bin/esm/live-hooks/index.js +8 -0
  159. package/bin/esm/live-hooks/index.js.map +1 -0
  160. package/bin/esm/live-hooks/useLiveCanvas.d.ts +80 -0
  161. package/bin/esm/live-hooks/useLiveCanvas.d.ts.map +1 -0
  162. package/bin/esm/live-hooks/useLiveCanvas.js +238 -0
  163. package/bin/esm/live-hooks/useLiveCanvas.js.map +1 -0
  164. package/bin/esm/live-hooks/useLiveEvent.d.ts +59 -0
  165. package/bin/esm/live-hooks/useLiveEvent.d.ts.map +1 -0
  166. package/bin/{live-hooks → esm/live-hooks}/useLiveEvent.js +41 -5
  167. package/bin/esm/live-hooks/useLiveEvent.js.map +1 -0
  168. package/bin/esm/live-hooks/useLiveFollowMode.d.ts +163 -0
  169. package/bin/esm/live-hooks/useLiveFollowMode.d.ts.map +1 -0
  170. package/bin/{live-hooks → esm/live-hooks}/useLiveFollowMode.js +148 -5
  171. package/bin/esm/live-hooks/useLiveFollowMode.js.map +1 -0
  172. package/bin/esm/live-hooks/useLivePresence.d.ts +76 -0
  173. package/bin/esm/live-hooks/useLivePresence.d.ts.map +1 -0
  174. package/bin/{live-hooks → esm/live-hooks}/useLivePresence.js +71 -13
  175. package/bin/esm/live-hooks/useLivePresence.js.map +1 -0
  176. package/bin/esm/live-hooks/useLiveState.d.ts +66 -0
  177. package/bin/esm/live-hooks/useLiveState.d.ts.map +1 -0
  178. package/bin/{live-hooks → esm/live-hooks}/useLiveState.js +54 -5
  179. package/bin/esm/live-hooks/useLiveState.js.map +1 -0
  180. package/bin/esm/live-hooks/useLiveTimer.d.ts +80 -0
  181. package/bin/esm/live-hooks/useLiveTimer.d.ts.map +1 -0
  182. package/bin/{live-hooks → esm/live-hooks}/useLiveTimer.js +58 -3
  183. package/bin/esm/live-hooks/useLiveTimer.js.map +1 -0
  184. package/bin/esm/live-hooks/useMediaSynchronizer.d.ts +86 -0
  185. package/bin/esm/live-hooks/useMediaSynchronizer.d.ts.map +1 -0
  186. package/bin/{live-hooks → esm/live-hooks}/useMediaSynchronizer.js +65 -4
  187. package/bin/esm/live-hooks/useMediaSynchronizer.js.map +1 -0
  188. package/bin/esm/providers/AzureProvider.d.ts +113 -0
  189. package/bin/esm/providers/AzureProvider.d.ts.map +1 -0
  190. package/bin/{providers → esm/providers}/AzureProvider.js +12 -12
  191. package/bin/esm/providers/AzureProvider.js.map +1 -0
  192. package/bin/esm/providers/LiveShareProvider.d.ts +193 -0
  193. package/bin/esm/providers/LiveShareProvider.d.ts.map +1 -0
  194. package/bin/esm/providers/LiveShareProvider.js +197 -0
  195. package/bin/esm/providers/LiveShareProvider.js.map +1 -0
  196. package/bin/esm/providers/index.d.ts +3 -0
  197. package/bin/esm/providers/index.d.ts.map +1 -0
  198. package/bin/esm/providers/index.js +3 -0
  199. package/bin/esm/providers/index.js.map +1 -0
  200. package/bin/esm/shared-hooks/index.d.ts +7 -0
  201. package/bin/esm/shared-hooks/index.d.ts.map +1 -0
  202. package/bin/esm/shared-hooks/index.js +7 -0
  203. package/bin/esm/shared-hooks/index.js.map +1 -0
  204. package/bin/esm/shared-hooks/internals/tree-node-constants.d.ts +3 -0
  205. package/bin/esm/shared-hooks/internals/tree-node-constants.d.ts.map +1 -0
  206. package/bin/esm/shared-hooks/internals/tree-node-constants.js +3 -0
  207. package/bin/esm/shared-hooks/internals/tree-node-constants.js.map +1 -0
  208. package/bin/esm/shared-hooks/internals/tree-node-types.d.ts +10 -0
  209. package/bin/esm/shared-hooks/internals/tree-node-types.d.ts.map +1 -0
  210. package/bin/esm/shared-hooks/internals/tree-node-types.js +18 -0
  211. package/bin/esm/shared-hooks/internals/tree-node-types.js.map +1 -0
  212. package/bin/esm/shared-hooks/internals/tree-node-utils.d.ts +33 -0
  213. package/bin/esm/shared-hooks/internals/tree-node-utils.d.ts.map +1 -0
  214. package/bin/esm/shared-hooks/internals/tree-node-utils.js +188 -0
  215. package/bin/esm/shared-hooks/internals/tree-node-utils.js.map +1 -0
  216. package/bin/esm/shared-hooks/useDynamicDDS.d.ts +23 -0
  217. package/bin/esm/shared-hooks/useDynamicDDS.d.ts.map +1 -0
  218. package/bin/{shared-hooks → esm/shared-hooks}/useDynamicDDS.js +20 -11
  219. package/bin/esm/shared-hooks/useDynamicDDS.js.map +1 -0
  220. package/bin/esm/shared-hooks/useSharedMap.d.ts +25 -0
  221. package/bin/esm/shared-hooks/useSharedMap.d.ts.map +1 -0
  222. package/bin/{shared-hooks → esm/shared-hooks}/useSharedMap.js +27 -13
  223. package/bin/esm/shared-hooks/useSharedMap.js.map +1 -0
  224. package/bin/esm/shared-hooks/useSharedState.d.ts +22 -0
  225. package/bin/esm/shared-hooks/useSharedState.d.ts.map +1 -0
  226. package/bin/{shared-hooks → esm/shared-hooks}/useSharedState.js +2 -2
  227. package/bin/esm/shared-hooks/useSharedState.js.map +1 -0
  228. package/bin/esm/shared-hooks/useSharedStateRegistry.d.ts +37 -0
  229. package/bin/esm/shared-hooks/useSharedStateRegistry.d.ts.map +1 -0
  230. package/bin/{shared-hooks → esm/shared-hooks}/useSharedStateRegistry.js +27 -19
  231. package/bin/esm/shared-hooks/useSharedStateRegistry.js.map +1 -0
  232. package/bin/esm/shared-hooks/useSharedTree.d.ts +57 -0
  233. package/bin/esm/shared-hooks/useSharedTree.d.ts.map +1 -0
  234. package/bin/esm/shared-hooks/useSharedTree.js +117 -0
  235. package/bin/esm/shared-hooks/useSharedTree.js.map +1 -0
  236. package/bin/esm/shared-hooks/useTreeNode.d.ts +96 -0
  237. package/bin/esm/shared-hooks/useTreeNode.d.ts.map +1 -0
  238. package/bin/esm/shared-hooks/useTreeNode.js +132 -0
  239. package/bin/esm/shared-hooks/useTreeNode.js.map +1 -0
  240. package/bin/esm/types/ActionTypes.d.ts +112 -0
  241. package/bin/esm/types/ActionTypes.d.ts.map +1 -0
  242. package/bin/esm/types/ActionTypes.js.map +1 -0
  243. package/bin/esm/types/PropTypes.d.ts +56 -0
  244. package/bin/esm/types/PropTypes.d.ts.map +1 -0
  245. package/bin/esm/types/PropTypes.js.map +1 -0
  246. package/bin/esm/types/ResultTypes.d.ts +334 -0
  247. package/bin/esm/types/ResultTypes.d.ts.map +1 -0
  248. package/bin/esm/types/ResultTypes.js.map +1 -0
  249. package/bin/esm/types/index.d.ts +4 -0
  250. package/bin/esm/types/index.d.ts.map +1 -0
  251. package/bin/esm/types/index.js +4 -0
  252. package/bin/esm/types/index.js.map +1 -0
  253. package/bin/esm/utils/index.d.ts +2 -0
  254. package/bin/esm/utils/index.d.ts.map +1 -0
  255. package/bin/esm/utils/index.js +2 -0
  256. package/bin/esm/utils/index.js.map +1 -0
  257. package/bin/esm/utils/type-check.d.ts +15 -0
  258. package/bin/esm/utils/type-check.d.ts.map +1 -0
  259. package/bin/esm/utils/type-check.js.map +1 -0
  260. package/package.json +61 -50
  261. package/src/index.ts +6 -6
  262. package/src/interfaces/index.ts +1 -1
  263. package/src/internal/errors.ts +16 -0
  264. package/src/internal/index.ts +2 -2
  265. package/src/internal/type-guards.ts +12 -0
  266. package/src/live-hooks/index.ts +7 -7
  267. package/src/live-hooks/useLiveCanvas.ts +154 -82
  268. package/src/live-hooks/useLiveEvent.ts +43 -7
  269. package/src/live-hooks/useLiveFollowMode.ts +149 -6
  270. package/src/live-hooks/useLivePresence.ts +80 -17
  271. package/src/live-hooks/useLiveState.ts +54 -6
  272. package/src/live-hooks/useLiveTimer.ts +59 -4
  273. package/src/live-hooks/useMediaSynchronizer.ts +70 -5
  274. package/src/providers/AzureProvider.tsx +21 -21
  275. package/src/providers/LiveShareProvider.tsx +126 -12
  276. package/src/providers/index.ts +2 -2
  277. package/src/shared-hooks/index.ts +6 -4
  278. package/src/shared-hooks/internals/tree-node-constants.ts +2 -0
  279. package/src/shared-hooks/internals/tree-node-types.ts +26 -0
  280. package/src/shared-hooks/internals/tree-node-utils.ts +269 -0
  281. package/src/shared-hooks/useDynamicDDS.ts +28 -17
  282. package/src/shared-hooks/useSharedMap.ts +42 -17
  283. package/src/shared-hooks/useSharedState.ts +6 -3
  284. package/src/shared-hooks/useSharedStateRegistry.ts +44 -22
  285. package/src/shared-hooks/useSharedTree.ts +144 -0
  286. package/src/shared-hooks/useTreeNode.ts +147 -0
  287. package/src/types/ActionTypes.ts +13 -9
  288. package/src/types/PropTypes.ts +57 -0
  289. package/src/types/ResultTypes.ts +71 -17
  290. package/src/types/index.ts +3 -3
  291. package/src/utils/index.ts +1 -1
  292. package/tsconfig.cjs.json +14 -0
  293. package/tsconfig.json +65 -70
  294. package/.nycrc.json +0 -10
  295. package/bin/index.d.ts +0 -7
  296. package/bin/index.d.ts.map +0 -1
  297. package/bin/index.js +0 -7
  298. package/bin/index.js.map +0 -1
  299. package/bin/interfaces/LiveInterfaceExtensions.d.ts.map +0 -1
  300. package/bin/interfaces/LiveInterfaceExtensions.js.map +0 -1
  301. package/bin/interfaces/index.d.ts +0 -2
  302. package/bin/interfaces/index.d.ts.map +0 -1
  303. package/bin/interfaces/index.js +0 -2
  304. package/bin/interfaces/index.js.map +0 -1
  305. package/bin/internal/errors.d.ts.map +0 -1
  306. package/bin/internal/errors.js.map +0 -1
  307. package/bin/internal/index.d.ts +0 -3
  308. package/bin/internal/index.d.ts.map +0 -1
  309. package/bin/internal/index.js +0 -3
  310. package/bin/internal/index.js.map +0 -1
  311. package/bin/internal/type-guards.d.ts.map +0 -1
  312. package/bin/internal/type-guards.js +0 -8
  313. package/bin/internal/type-guards.js.map +0 -1
  314. package/bin/live-hooks/index.d.ts +0 -8
  315. package/bin/live-hooks/index.d.ts.map +0 -1
  316. package/bin/live-hooks/index.js +0 -8
  317. package/bin/live-hooks/index.js.map +0 -1
  318. package/bin/live-hooks/useLiveCanvas.d.ts +0 -29
  319. package/bin/live-hooks/useLiveCanvas.d.ts.map +0 -1
  320. package/bin/live-hooks/useLiveCanvas.js +0 -160
  321. package/bin/live-hooks/useLiveCanvas.js.map +0 -1
  322. package/bin/live-hooks/useLiveEvent.d.ts.map +0 -1
  323. package/bin/live-hooks/useLiveEvent.js.map +0 -1
  324. package/bin/live-hooks/useLiveFollowMode.d.ts +0 -24
  325. package/bin/live-hooks/useLiveFollowMode.d.ts.map +0 -1
  326. package/bin/live-hooks/useLiveFollowMode.js.map +0 -1
  327. package/bin/live-hooks/useLivePresence.d.ts +0 -26
  328. package/bin/live-hooks/useLivePresence.d.ts.map +0 -1
  329. package/bin/live-hooks/useLivePresence.js.map +0 -1
  330. package/bin/live-hooks/useLiveState.d.ts.map +0 -1
  331. package/bin/live-hooks/useLiveState.js.map +0 -1
  332. package/bin/live-hooks/useLiveTimer.d.ts.map +0 -1
  333. package/bin/live-hooks/useLiveTimer.js.map +0 -1
  334. package/bin/live-hooks/useMediaSynchronizer.d.ts +0 -25
  335. package/bin/live-hooks/useMediaSynchronizer.d.ts.map +0 -1
  336. package/bin/live-hooks/useMediaSynchronizer.js.map +0 -1
  337. package/bin/providers/AzureProvider.d.ts.map +0 -1
  338. package/bin/providers/AzureProvider.js.map +0 -1
  339. package/bin/providers/LiveShareProvider.d.ts.map +0 -1
  340. package/bin/providers/LiveShareProvider.js +0 -87
  341. package/bin/providers/LiveShareProvider.js.map +0 -1
  342. package/bin/providers/index.d.ts +0 -3
  343. package/bin/providers/index.d.ts.map +0 -1
  344. package/bin/providers/index.js +0 -3
  345. package/bin/providers/index.js.map +0 -1
  346. package/bin/shared-hooks/index.d.ts +0 -5
  347. package/bin/shared-hooks/index.d.ts.map +0 -1
  348. package/bin/shared-hooks/index.js +0 -5
  349. package/bin/shared-hooks/index.js.map +0 -1
  350. package/bin/shared-hooks/useDynamicDDS.d.ts.map +0 -1
  351. package/bin/shared-hooks/useDynamicDDS.js.map +0 -1
  352. package/bin/shared-hooks/useSharedMap.d.ts.map +0 -1
  353. package/bin/shared-hooks/useSharedMap.js.map +0 -1
  354. package/bin/shared-hooks/useSharedState.d.ts.map +0 -1
  355. package/bin/shared-hooks/useSharedState.js.map +0 -1
  356. package/bin/shared-hooks/useSharedStateRegistry.d.ts.map +0 -1
  357. package/bin/shared-hooks/useSharedStateRegistry.js.map +0 -1
  358. package/bin/types/ActionTypes.d.ts.map +0 -1
  359. package/bin/types/ActionTypes.js.map +0 -1
  360. package/bin/types/PropTypes.d.ts +0 -8
  361. package/bin/types/PropTypes.d.ts.map +0 -1
  362. package/bin/types/PropTypes.js.map +0 -1
  363. package/bin/types/ResultTypes.d.ts.map +0 -1
  364. package/bin/types/ResultTypes.js.map +0 -1
  365. package/bin/types/index.d.ts +0 -4
  366. package/bin/types/index.d.ts.map +0 -1
  367. package/bin/types/index.js +0 -4
  368. package/bin/types/index.js.map +0 -1
  369. package/bin/utils/index.d.ts +0 -2
  370. package/bin/utils/index.d.ts.map +0 -1
  371. package/bin/utils/index.js +0 -2
  372. package/bin/utils/index.js.map +0 -1
  373. package/bin/utils/type-check.d.ts.map +0 -1
  374. package/bin/utils/type-check.js.map +0 -1
  375. package/tsconfig.build.json +0 -6
  376. /package/bin/{interfaces → cjs/interfaces}/LiveInterfaceExtensions.d.ts +0 -0
  377. /package/bin/{utils → cjs/utils}/type-check.d.ts +0 -0
  378. /package/bin/{interfaces → esm/interfaces}/LiveInterfaceExtensions.js +0 -0
  379. /package/bin/{internal → esm/internal}/errors.js +0 -0
  380. /package/bin/{types → esm/types}/ActionTypes.js +0 -0
  381. /package/bin/{types → esm/types}/PropTypes.js +0 -0
  382. /package/bin/{types → esm/types}/ResultTypes.js +0 -0
  383. /package/bin/{utils → esm/utils}/type-check.js +0 -0
@@ -3,17 +3,18 @@
3
3
  * Licensed under the Microsoft Live Share SDK License.
4
4
  */
5
5
 
6
- import { IFluidContainer, LoadableObjectClassRecord } from "fluid-framework";
6
+ import { ContainerSchema, IFluidContainer } from "fluid-framework";
7
7
  import React from "react";
8
- import { useSharedStateRegistry } from "../shared-hooks";
8
+ import { useSharedStateRegistry } from "../shared-hooks/index.js";
9
9
  import {
10
10
  ILiveShareClientOptions,
11
11
  ILiveShareHost,
12
12
  ILiveShareJoinResults,
13
13
  ITimestampProvider,
14
+ LiveShareClient,
14
15
  } from "@microsoft/live-share";
15
- import { FluidContext, useFluidObjectsContext } from "./AzureProvider";
16
- import { LiveShareTurboClient } from "@microsoft/live-share-turbo";
16
+ import { FluidContext, useFluidObjectsContext } from "./AzureProvider.js";
17
+ import { isITeamsJsSdkError } from "../internal/index.js";
17
18
 
18
19
  /**
19
20
  * React Context provider values for `<LiveShareProvider>`.
@@ -51,7 +52,7 @@ export interface ILiveShareContext {
51
52
  * @returns Promise with `ILiveShareJoinResults`, which includes the Fluid container
52
53
  */
53
54
  join: (
54
- initialObjects?: LoadableObjectClassRecord,
55
+ fluidContainerSchema?: ContainerSchema,
55
56
  onInitializeContainer?: (container: IFluidContainer) => void
56
57
  ) => Promise<ILiveShareJoinResults>;
57
58
  }
@@ -71,6 +72,57 @@ export const LiveShareContext = React.createContext<ILiveShareContext>(
71
72
  * See `useFluidObjectsContext` for other information related to the Live Share session, such as the `container`.
72
73
  *
73
74
  * @returns current state of `LiveShareContext`
75
+ *
76
+ * @example
77
+ ```jsx
78
+ // LiveShareApp.jsx
79
+ import { LiveShareProvider } from "@microsoft/live-share-react";
80
+ import { LiveShareHost } from "@microsoft/teams-js";
81
+
82
+ const host = LiveShareHost.create();
83
+
84
+ export function LiveShareApp() {
85
+ // Call app.initialize() from teams-js before rendering LiveShareProvider
86
+
87
+ return (
88
+ <LiveShareProvider
89
+ joinOnLoad={true}
90
+ host={host}
91
+ >
92
+ <LiveShareLoader>
93
+ <LiveCheckbox />
94
+ </LiveShareLoader>
95
+ </LiveShareProvider>
96
+ );
97
+ }
98
+
99
+ // LiveShareLoader.jsx
100
+ import { useLiveShareContext } from "@microsoft/live-share-react";
101
+
102
+ export function LiveShareLoader({ children }) {
103
+ const { joined, joinError } = useLiveShareContext();
104
+
105
+ if (joinError) return <>{joinError.message}</>;
106
+ if (!joined) return <>Joining Live Share session...</>;
107
+ return <>{children}</>
108
+ }
109
+
110
+ // LiveCheckbox.jsx
111
+ import { useLiveState } from "@microsoft/live-share-react";
112
+
113
+ export function LiveCheckbox() {
114
+ const [checked, setChecked] = useLiveState("MY-UNIQUE-ID", false);
115
+ return (
116
+ <input
117
+ type="checkbox"
118
+ checked={checked}
119
+ onChange={() => {
120
+ setChecked(!checked);
121
+ }}
122
+ />
123
+ );
124
+ }
125
+ ```
74
126
  */
75
127
  export const useLiveShareContext = (): ILiveShareContext => {
76
128
  const context = React.useContext(LiveShareContext);
@@ -102,9 +154,9 @@ export interface ILiveShareProviderProps {
102
154
  */
103
155
  host: ILiveShareHost;
104
156
  /**
105
- * The initial object schema to use when {@link joinOnLoad} is true.
157
+ * The schema to use when {@link joinOnLoad} is true.
106
158
  */
107
- initialObjects?: LoadableObjectClassRecord;
159
+ fluidContainerSchema?: ContainerSchema;
108
160
  /**
109
161
  * Optional. Flag to determine whether to join Fluid container on load.
110
162
  */
@@ -113,11 +165,62 @@ export interface ILiveShareProviderProps {
113
165
 
114
166
  /**
115
167
  * React Context provider component for using Live Share data objects & joining a Live Share session using `LiveShareClient`.
168
+ *
169
+ * @example
170
+ ```jsx
171
+ // LiveShareApp.jsx
172
+ import { LiveShareProvider } from "@microsoft/live-share-react";
173
+ import { LiveShareHost } from "@microsoft/teams-js";
174
+
175
+ const host = LiveShareHost.create();
176
+
177
+ export function LiveShareApp() {
178
+ // Call app.initialize() from teams-js before rendering LiveShareProvider
179
+
180
+ return (
181
+ <LiveShareProvider
182
+ joinOnLoad={true}
183
+ host={host}
184
+ >
185
+ <LiveShareLoader>
186
+ <LiveCheckbox />
187
+ </LiveShareLoader>
188
+ </LiveShareProvider>
189
+ );
190
+ }
191
+
192
+ // LiveShareLoader.jsx
193
+ import { useLiveShareContext } from "@microsoft/live-share-react";
194
+
195
+ export function LiveShareLoader({ children }) {
196
+ const { joined, joinError } = useLiveShareContext();
197
+
198
+ if (joinError) return <>{joinError.message}</>;
199
+ if (!joined) return <>Joining Live Share session...</>;
200
+ return <>{children}</>
201
+ }
202
+
203
+ // LiveCheckbox.jsx
204
+ import { useLiveState } from "@microsoft/live-share-react";
205
+
206
+ export function LiveCheckbox() {
207
+ const [checked, setChecked] = useLiveState("MY-UNIQUE-ID", false);
208
+ return (
209
+ <input
210
+ type="checkbox"
211
+ checked={checked}
212
+ onChange={() => {
213
+ setChecked(!checked);
214
+ }}
215
+ />
216
+ );
217
+ }
218
+ ```
116
219
  */
117
220
  export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
118
221
  const startedRef = React.useRef(false);
119
222
  const clientRef = React.useRef(
120
- new LiveShareTurboClient(props.host, props.clientOptions)
223
+ new LiveShareClient(props.host, props.clientOptions)
121
224
  );
122
225
  const [results, setResults] = React.useState<
123
226
  ILiveShareJoinResults | undefined
@@ -131,12 +234,12 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
131
234
  */
132
235
  const join = React.useCallback(
133
236
  async (
134
- initialObjects?: LoadableObjectClassRecord,
237
+ fluidContainerSchema?: ContainerSchema,
135
238
  onInitializeContainer?: (container: IFluidContainer) => void
136
239
  ): Promise<ILiveShareJoinResults> => {
137
240
  startedRef.current = true;
138
241
  const results = await clientRef.current.join(
139
- initialObjects,
242
+ fluidContainerSchema,
140
243
  onInitializeContainer
141
244
  );
142
245
  setResults(results);
@@ -154,10 +257,21 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
154
257
  // We are not doing this here for backwards compatibility. View the README for more information.
155
258
  if (results !== undefined || startedRef.current || !props.joinOnLoad)
156
259
  return;
157
- join(props.initialObjects).catch((error) => {
260
+ join(props.fluidContainerSchema).catch((error) => {
158
261
  console.error(error);
159
262
  if (error instanceof Error) {
160
263
  setJoinError(error);
264
+ } else if (isITeamsJsSdkError(error)) {
265
+ setJoinError(
266
+ new Error(
267
+ `[${error.errorCode}] ${
268
+ error.message ??
269
+ "An unknown error occurred while joining container."
270
+ }`
271
+ )
272
+ );
273
+ } else if (typeof error == "string") {
274
+ setJoinError(new Error(error));
161
275
  } else {
162
276
  setJoinError(
163
277
  new Error(
@@ -166,7 +280,7 @@ export const LiveShareProvider: React.FC<ILiveShareProviderProps> = (props) => {
166
280
  );
167
281
  }
168
282
  });
169
- }, [results, props.joinOnLoad, props.initialObjects, join]);
283
+ }, [results, props.joinOnLoad, props.fluidContainerSchema, join]);
170
284
 
171
285
  return (
172
286
  <LiveShareContext.Provider
@@ -1,2 +1,2 @@
1
- export * from "./AzureProvider";
2
- export * from "./LiveShareProvider";
1
+ export * from "./AzureProvider.js";
2
+ export * from "./LiveShareProvider.js";
@@ -1,4 +1,6 @@
1
- export * from "./useSharedState";
2
- export * from "./useSharedMap";
3
- export * from "./useDynamicDDS";
4
- export * from "./useSharedStateRegistry";
1
+ export * from "./useSharedState.js";
2
+ export * from "./useSharedMap.js";
3
+ export * from "./useDynamicDDS.js";
4
+ export * from "./useSharedStateRegistry.js";
5
+ export * from "./useSharedTree.js";
6
+ export * from "./useTreeNode.js";
@@ -0,0 +1,2 @@
1
+ export const rawTNodeKey = "[[FluidTreeNode]]";
2
+ export const proxiedChildrenKey = "[[FluidChildNodes]]";
@@ -0,0 +1,26 @@
1
+ import { TreeNode, Tree } from "fluid-framework";
2
+ import { proxiedChildrenKey, rawTNodeKey } from "./tree-node-constants.js";
3
+
4
+ export interface ICustomProxyHandler<TNode extends TreeNode = TreeNode> {
5
+ [rawTNodeKey]: TNode;
6
+ [proxiedChildrenKey]: Record<string, TreeNode>;
7
+ }
8
+
9
+ export function isProxy(value: any): value is typeof Proxy {
10
+ return value && value["[[Handler]]"];
11
+ }
12
+
13
+ export function isCustomProxyHandler<TNode extends TreeNode = TreeNode>(
14
+ value: any
15
+ ): value is ICustomProxyHandler<TNode> {
16
+ return value?.[rawTNodeKey] !== undefined;
17
+ }
18
+
19
+ export function isTreeNode(value: any): value is TreeNode {
20
+ try {
21
+ Tree.schema(value);
22
+ return true;
23
+ } catch (_) {
24
+ return false;
25
+ }
26
+ }
@@ -0,0 +1,269 @@
1
+ import { proxiedChildrenKey, rawTNodeKey } from "./tree-node-constants.js";
2
+ import {
3
+ ICustomProxyHandler,
4
+ isCustomProxyHandler,
5
+ isTreeNode,
6
+ isProxy,
7
+ } from "./tree-node-types.js";
8
+ import { TreeNode, Tree } from "fluid-framework";
9
+ import { Dispatch, SetStateAction } from "react";
10
+
11
+ // Exported utils
12
+
13
+ /**
14
+ * @internal
15
+ * Build a proxied version of a node and set its value to the treeMap provided
16
+ *
17
+ * @param rawNode the raw proxy node exposed by Fluid
18
+ * @param treeMap a map where Fluid's proxy node is mapped to our proxied node
19
+ * @returns TNode instance
20
+ */
21
+ export function buildProxy<TNode extends TreeNode = TreeNode>(
22
+ rawNode: TNode,
23
+ treeMap: WeakMap<TreeNode, TreeNode>
24
+ ): TNode {
25
+ const previousProxy = treeMap.get(rawNode);
26
+ const previousProxyHandler = previousProxy
27
+ ? getCustomProxyHandler(previousProxy)
28
+ : undefined;
29
+ const proxyHandler: ProxyHandler<TreeNode> & ICustomProxyHandler<TNode> = {
30
+ // Add some extra stuff into the handler so we can store the original Fluid TreeNode and access it later
31
+ // Without overriding the rest of the getters in the object.
32
+ [rawTNodeKey]: rawNode,
33
+ [proxiedChildrenKey]: previousProxyHandler?.[proxiedChildrenKey] ?? {},
34
+ get: (target, prop, _) => {
35
+ if (prop === "[[Handler]]") {
36
+ return proxyHandler;
37
+ }
38
+ if (
39
+ typeof prop === "string" &&
40
+ proxyHandler[proxiedChildrenKey][prop]
41
+ ) {
42
+ return proxyHandler[proxiedChildrenKey][prop];
43
+ }
44
+ // pass in the rawNode so Fluid doesn't get confused by our proxy object and can find the flex node
45
+ const value = Reflect.get(target, prop, rawNode);
46
+ return typeof value === "function" &&
47
+ typeof prop === "string" &&
48
+ // TODO: need a better way of identifying which types of functions need to be proxied
49
+ // This is because if a developer uses an array prototype function, we need to return proxied
50
+ // objects so React can detect changes to those nodes...
51
+ !["map", "flatMap", "filter", "find", "indexOf"].includes(prop)
52
+ ? value.bind(rawNode)
53
+ : value;
54
+ },
55
+ set(target, p, newValue, _) {
56
+ return Reflect.set(target, p, newValue, rawNode);
57
+ },
58
+ };
59
+ const proxy = new Proxy(rawNode, proxyHandler);
60
+ // Track the proxy for the rawNode
61
+ treeMap.set(rawNode, proxy);
62
+ // Set raw node getter so we can access it before things like Tree.on
63
+ return proxy as TNode;
64
+ }
65
+
66
+ /**
67
+ * @internal
68
+ * Set up listeners for a given TreeNode.
69
+ * Will recursively call this function for all children nodes of each children until there are no more child nodes.
70
+ *
71
+ * @param parentRawNode raw parent node
72
+ * @param rootNodeForListener root node being listened to in useTreeNode
73
+ * @param treeMap a map where Fluid's proxy node is mapped to our proxied node
74
+ * @param unsubscribeListeners list of unsubscribe listeners, where we set the unsubscribe callbacks
75
+ * @param setProxyNode setter to set the root proxy node listened to in useTreeNode
76
+ */
77
+ export function setUpListenersForNodeChildren<
78
+ TNode extends TreeNode = TreeNode,
79
+ >(
80
+ parentRawNode: TreeNode,
81
+ rootNodeForListener: TreeNode,
82
+ treeMap: WeakMap<TreeNode, TreeNode>,
83
+ unsubscribeListeners: (() => void)[],
84
+ setProxyNode: Dispatch<SetStateAction<TNode>>
85
+ ) {
86
+ let entries = Object.entries(parentRawNode);
87
+ for (let i = 0; i < entries.length; i++) {
88
+ const [key, entry] = entries[i];
89
+ if (
90
+ !entry ||
91
+ ["string", "boolean", "number", "function"].includes(
92
+ typeof entry
93
+ ) ||
94
+ !isTreeNode(entry)
95
+ ) {
96
+ continue;
97
+ }
98
+ const rawEntry = getRawNode(entry);
99
+ const onNodeChanged = () => {
100
+ onTreeNodeChanged(
101
+ key,
102
+ rawEntry,
103
+ rootNodeForListener,
104
+ treeMap,
105
+ setProxyNode
106
+ );
107
+ };
108
+ const unsubscribe = Tree.on(rawEntry, "nodeChanged", onNodeChanged);
109
+ unsubscribeListeners.push(unsubscribe);
110
+ // Recursively listen to children nodes of this node
111
+ setUpListenersForNodeChildren(
112
+ rawEntry,
113
+ rootNodeForListener,
114
+ treeMap,
115
+ unsubscribeListeners,
116
+ setProxyNode
117
+ );
118
+ }
119
+ }
120
+
121
+ /**
122
+ * @internal
123
+ * Fluid only knows how to work with their proxied version of a TreeNode.
124
+ * We store a reference to that node in our proxied instances so we can easily use it when working with Fluid APIs.
125
+ *
126
+ * @param node get the raw node from the proxy
127
+ * @returns the raw proxied node that Fluid expects
128
+ */
129
+ export function getRawNode<TNode extends TreeNode | undefined = TreeNode>(
130
+ node: TNode
131
+ ): TNode {
132
+ if (isProxy(node)) {
133
+ return getRawNodeFromProxy(node) as TNode;
134
+ }
135
+ return node;
136
+ }
137
+
138
+ // Non public utils
139
+
140
+ /**
141
+ * Callback for when a tree node changed
142
+ *
143
+ * @param key key where the object is stored in the parent
144
+ * @param rawNode the raw node that changed
145
+ * @param rootNodeForListener the root node that is being listened to in useTreeNode
146
+ * @param treeMap a map where Fluid's proxy node is mapped to our proxied node
147
+ * @param setProxyNode setter to set the root proxy node listened to in useTreeNode
148
+ */
149
+ function onTreeNodeChanged<TNode extends TreeNode = TreeNode>(
150
+ key: string,
151
+ rawNode: TreeNode,
152
+ rootNodeForListener: TreeNode,
153
+ treeMap: WeakMap<TreeNode, TreeNode>,
154
+ setProxyNode: Dispatch<SetStateAction<TNode>>
155
+ ) {
156
+ const proxyNode = buildProxy(rawNode, treeMap);
157
+ const parent = Tree.parent(rawNode);
158
+ if (!parent) {
159
+ throw new Error(
160
+ "useTreeNode onTreeNodeChanged: no parent found for rawParentNode"
161
+ );
162
+ }
163
+
164
+ proxyParentForNode(
165
+ key,
166
+ parent,
167
+ proxyNode,
168
+ rootNodeForListener,
169
+ treeMap,
170
+ setProxyNode
171
+ );
172
+ }
173
+
174
+ /**
175
+ * Proxies the parent and sets reference to the child node that changed.
176
+ *
177
+ * @param key key where the object is referenced in its parent node
178
+ * @param rawParentNode raw parent tree node
179
+ * @param proxyNode proxied instance of the node that changed
180
+ * @param rootNodeForListener root node listened to in useTreeNode
181
+ * @param treeMap a map where Fluid's proxy node is mapped to our proxied node
182
+ * @param setProxyNode setter to set the root proxy node listened to in useTreeNode
183
+ */
184
+ function proxyParentForNode<TNode extends TreeNode = TreeNode>(
185
+ key: string,
186
+ rawParentNode: TreeNode,
187
+ proxyNode: TreeNode,
188
+ rootNodeForListener: TreeNode,
189
+ treeMap: WeakMap<TreeNode, TreeNode>,
190
+ setProxyNode: Dispatch<SetStateAction<TNode>>
191
+ ) {
192
+ const parentProxy = buildProxy(rawParentNode, treeMap);
193
+ let parentProxyHandler = getCustomProxyHandler(parentProxy);
194
+ if (!parentProxyHandler) {
195
+ throw new Error(
196
+ "useTreeNode proxyParentForNode: unexpected error, should always find valid proxy handler"
197
+ );
198
+ }
199
+ parentProxyHandler[proxiedChildrenKey][key] = proxyNode;
200
+ if (rawParentNode === rootNodeForListener) {
201
+ setProxyNode(parentProxy as TNode);
202
+ } else {
203
+ const parentOfParent = Tree.parent(rawParentNode);
204
+ if (!parentOfParent) {
205
+ throw new Error(
206
+ "useTreeNode proxyParentForNode: no parent found for rawParentNode"
207
+ );
208
+ }
209
+ const parentKey = findKeyOfNode(rawParentNode, parentOfParent);
210
+ proxyParentForNode(
211
+ parentKey,
212
+ parentOfParent,
213
+ parentProxy,
214
+ rootNodeForListener,
215
+ treeMap,
216
+ setProxyNode
217
+ );
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Returns key where parent[key] == nodeToCheck
223
+ *
224
+ * @param nodeToCheck tree node to check
225
+ * @param parent parent node where nodeToCheck is a child of
226
+ * @returns the key for node
227
+ */
228
+ function findKeyOfNode(nodeToCheck: TreeNode, parent: TreeNode): string {
229
+ let entries = Object.entries(parent);
230
+ for (let i = 0; i < entries.length; i++) {
231
+ const [key, entry] = entries[i];
232
+ if (
233
+ !entry ||
234
+ ["string", "boolean", "number", "function"].includes(
235
+ typeof entry
236
+ ) ||
237
+ !isTreeNode(entry)
238
+ ) {
239
+ continue;
240
+ }
241
+ if (entry === nodeToCheck) return key;
242
+ }
243
+ throw new Error("Did not find node as a child of parent");
244
+ }
245
+
246
+ // Type utils
247
+
248
+ /**
249
+ * Gets the proxy handler for a given TreeNode, assuming `isCustomProxyHandler` returns true.
250
+ * @param proxy the proxied TreeNode to get the handler for.
251
+ * @returns the handler if valid, otherwise undefined
252
+ */
253
+ function getCustomProxyHandler(proxy: TreeNode) {
254
+ const handler = (proxy as any)["[[Handler]]"];
255
+ if (isCustomProxyHandler(handler)) {
256
+ return handler;
257
+ }
258
+ return undefined;
259
+ }
260
+
261
+ /**
262
+ * Gets the raw node for a given proxied tree node
263
+ *
264
+ * @param proxy the proxied TreeNode to get the raw node for
265
+ * @returns the raw node if valid, otherwise undefined
266
+ */
267
+ function getRawNodeFromProxy(proxy: TreeNode) {
268
+ return getCustomProxyHandler(proxy)?.[rawTNodeKey];
269
+ }
@@ -5,8 +5,8 @@
5
5
 
6
6
  import React from "react";
7
7
  import { FluidObject, IFluidLoadable } from "@fluidframework/core-interfaces";
8
- import { useFluidObjectsContext } from "../providers";
9
- import { LoadableObjectClass } from "fluid-framework";
8
+ import { useFluidObjectsContext } from "../providers/AzureProvider.js";
9
+ import { SharedObjectKind } from "fluid-framework";
10
10
 
11
11
  /**
12
12
  * Hook to gets or creates a DDS that corresponds to a given uniqueKey string.
@@ -14,17 +14,17 @@ import { LoadableObjectClass } from "fluid-framework";
14
14
  * @remarks
15
15
  * This hook can only be used in a child component of `<LiveShareProvider>` or `<AzureProvider>`.
16
16
  *
17
- * @template T Type of Fluid LoadableObjectClass type to load. Must conform to IFluidLoadable interface.
17
+ * @template T Type of Fluid SharedObjectKind type to load. Must conform to IFluidLoadable interface.
18
18
  * @param uniqueKey uniqueKey value for the data object
19
- * @param loadableObjectClass Fluid LoadableObjectClass<T> to create/load.
19
+ * @param objectKind Fluid SharedObjectKind<T> to create/load.
20
20
  * @param onFirstInitialize Optional. Callback function for when the DDS is first loaded
21
21
  * @returns the DDS object, which is of type T when loaded and undefined while loading
22
22
  */
23
23
  export function useDynamicDDS<
24
- T extends IFluidLoadable = FluidObject<any> & IFluidLoadable
24
+ T extends IFluidLoadable = FluidObject<any> & IFluidLoadable,
25
25
  >(
26
26
  uniqueKey: string,
27
- loadableObjectClass: LoadableObjectClass<T>,
27
+ objectClass: SharedObjectKind<T>,
28
28
  onFirstInitialize?: (dds: T) => void
29
29
  ): {
30
30
  dds: T | undefined;
@@ -37,24 +37,38 @@ export function useDynamicDDS<
37
37
  */
38
38
  const { container, clientRef } = useFluidObjectsContext();
39
39
 
40
+ const mountedRef = React.useRef(false);
41
+ React.useEffect(() => {
42
+ mountedRef.current = true;
43
+ return () => {
44
+ mountedRef.current = false;
45
+ };
46
+ }, []);
47
+
48
+ const getDDSPromisesRef = React.useRef<Map<string, Promise<T>>>(new Map());
49
+
40
50
  /**
41
51
  * Once container is available, this effect will register the setter method so that the DDS loaded
42
52
  * from `dynamicObjects` that matches `uniqueKey` can be passed back to this hook. If one does not yet exist,
43
53
  * a new DDS is automatically created. If multiple users try to create a DDS at the same time when this component first
44
- * mounts, `live-share-turbo` ensures it will ultimately self correct using last-writer wins.
54
+ * mounts, `live-share` ensures it will ultimately self correct using last-writer wins.
45
55
  */
46
56
  React.useEffect(() => {
47
57
  if (container === undefined) return;
48
- let mounted = true;
49
58
  // Callback method to set the `initialData` into the map when the DDS is first created.
50
59
  const onGetDDS = async () => {
51
60
  try {
52
- const dds = await clientRef.current.getDDS<T>(
53
- uniqueKey,
54
- loadableObjectClass,
55
- onFirstInitialize
56
- );
57
- if (mounted) {
61
+ let getPromise = getDDSPromisesRef.current.get(uniqueKey);
62
+ if (!getPromise) {
63
+ getPromise = clientRef.current.getDDS<T>(
64
+ uniqueKey,
65
+ objectClass,
66
+ onFirstInitialize
67
+ );
68
+ getDDSPromisesRef.current.set(uniqueKey, getPromise);
69
+ }
70
+ const dds = await getPromise;
71
+ if (mountedRef.current) {
58
72
  setDDS(dds);
59
73
  }
60
74
  } catch (error: unknown) {
@@ -70,9 +84,6 @@ export function useDynamicDDS<
70
84
  }
71
85
  };
72
86
  onGetDDS();
73
- return () => {
74
- mounted = false;
75
- };
76
87
  }, [container, uniqueKey, onFirstInitialize]);
77
88
 
78
89
  return {