@fluidframework/react 0.41.4 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/.mocharc.cjs +15 -0
  3. package/CHANGELOG.md +282 -0
  4. package/README.md +122 -273
  5. package/api-extractor/api-extractor-lint-alpha.cjs.json +5 -0
  6. package/api-extractor/api-extractor-lint-alpha.esm.json +5 -0
  7. package/api-extractor/api-extractor-lint-beta.cjs.json +5 -0
  8. package/api-extractor/api-extractor-lint-beta.esm.json +5 -0
  9. package/api-extractor/api-extractor-lint-bundle.json +5 -0
  10. package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
  11. package/api-extractor/api-extractor-lint-public.esm.json +5 -0
  12. package/api-extractor-lint.json +4 -0
  13. package/api-extractor.json +2 -2
  14. package/api-report/react.alpha.api.md +114 -0
  15. package/api-report/react.beta.api.md +7 -0
  16. package/api-report/react.public.api.md +7 -0
  17. package/biome.jsonc +4 -0
  18. package/dist/alpha.d.ts +45 -0
  19. package/dist/beta.d.ts +15 -0
  20. package/dist/index.d.ts +11 -7
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +19 -17
  23. package/dist/index.js.map +1 -1
  24. package/dist/package.json +4 -0
  25. package/dist/propNode.d.ts +114 -0
  26. package/dist/propNode.d.ts.map +1 -0
  27. package/dist/propNode.js +43 -0
  28. package/dist/propNode.js.map +1 -0
  29. package/dist/public.d.ts +15 -0
  30. package/dist/reactSharedTreeView.d.ts +119 -0
  31. package/dist/reactSharedTreeView.d.ts.map +1 -0
  32. package/dist/reactSharedTreeView.js +206 -0
  33. package/dist/reactSharedTreeView.js.map +1 -0
  34. package/dist/simpleIdentifier.d.ts +19 -0
  35. package/dist/simpleIdentifier.d.ts.map +1 -0
  36. package/dist/simpleIdentifier.js +33 -0
  37. package/dist/simpleIdentifier.js.map +1 -0
  38. package/dist/useObservation.d.ts +83 -0
  39. package/dist/useObservation.d.ts.map +1 -0
  40. package/dist/useObservation.js +295 -0
  41. package/dist/useObservation.js.map +1 -0
  42. package/dist/useTree.d.ts +80 -0
  43. package/dist/useTree.d.ts.map +1 -0
  44. package/dist/useTree.js +137 -0
  45. package/dist/useTree.js.map +1 -0
  46. package/lib/alpha.d.ts +45 -0
  47. package/lib/beta.d.ts +15 -0
  48. package/lib/index.d.ts +16 -0
  49. package/lib/index.d.ts.map +1 -0
  50. package/lib/index.js +4 -7
  51. package/lib/index.js.map +1 -1
  52. package/lib/package.json +4 -0
  53. package/lib/propNode.d.ts +114 -0
  54. package/lib/propNode.d.ts.map +1 -0
  55. package/lib/propNode.js +36 -0
  56. package/lib/propNode.js.map +1 -0
  57. package/lib/public.d.ts +15 -0
  58. package/lib/reactSharedTreeView.d.ts +119 -0
  59. package/lib/reactSharedTreeView.d.ts.map +1 -0
  60. package/lib/reactSharedTreeView.js +176 -0
  61. package/lib/reactSharedTreeView.js.map +1 -0
  62. package/lib/simpleIdentifier.d.ts +19 -0
  63. package/lib/simpleIdentifier.d.ts.map +1 -0
  64. package/lib/simpleIdentifier.js +29 -0
  65. package/lib/simpleIdentifier.js.map +1 -0
  66. package/lib/test/propNode.spec.js +120 -0
  67. package/lib/test/propNode.spec.js.map +1 -0
  68. package/lib/test/reactSharedTreeView.spec.js +71 -0
  69. package/lib/test/reactSharedTreeView.spec.js.map +1 -0
  70. package/lib/test/simpleIdentifier.spec.js +18 -0
  71. package/lib/test/simpleIdentifier.spec.js.map +1 -0
  72. package/lib/test/useObservation.spec.js +162 -0
  73. package/lib/test/useObservation.spec.js.map +1 -0
  74. package/lib/test/useTree.spec.js +165 -0
  75. package/lib/test/useTree.spec.js.map +1 -0
  76. package/lib/tsdoc-metadata.json +11 -0
  77. package/lib/useObservation.d.ts +83 -0
  78. package/lib/useObservation.d.ts.map +1 -0
  79. package/lib/useObservation.js +266 -0
  80. package/lib/useObservation.js.map +1 -0
  81. package/lib/useTree.d.ts +80 -0
  82. package/lib/useTree.d.ts.map +1 -0
  83. package/lib/useTree.js +105 -0
  84. package/lib/useTree.js.map +1 -0
  85. package/package.json +150 -51
  86. package/react.test-files.tar +0 -0
  87. package/src/index.ts +42 -7
  88. package/src/propNode.ts +164 -0
  89. package/src/reactSharedTreeView.tsx +327 -0
  90. package/src/simpleIdentifier.ts +31 -0
  91. package/src/useObservation.ts +376 -0
  92. package/src/useTree.ts +147 -0
  93. package/tsconfig.cjs.json +7 -0
  94. package/tsconfig.json +12 -15
  95. package/tsdoc.json +4 -0
  96. package/.eslintrc.js +0 -11
  97. package/dist/createContextFluid.d.ts +0 -7
  98. package/dist/createContextFluid.d.ts.map +0 -1
  99. package/dist/createContextFluid.js +0 -46
  100. package/dist/createContextFluid.js.map +0 -1
  101. package/dist/helpers/generateFluidObjectSchema.d.ts +0 -16
  102. package/dist/helpers/generateFluidObjectSchema.d.ts.map +0 -1
  103. package/dist/helpers/generateFluidObjectSchema.js +0 -75
  104. package/dist/helpers/generateFluidObjectSchema.js.map +0 -1
  105. package/dist/helpers/getFluidFromView.d.ts +0 -15
  106. package/dist/helpers/getFluidFromView.d.ts.map +0 -1
  107. package/dist/helpers/getFluidFromView.js +0 -30
  108. package/dist/helpers/getFluidFromView.js.map +0 -1
  109. package/dist/helpers/getFluidState.d.ts +0 -15
  110. package/dist/helpers/getFluidState.d.ts.map +0 -1
  111. package/dist/helpers/getFluidState.js +0 -47
  112. package/dist/helpers/getFluidState.js.map +0 -1
  113. package/dist/helpers/getSchema.d.ts +0 -13
  114. package/dist/helpers/getSchema.d.ts.map +0 -1
  115. package/dist/helpers/getSchema.js +0 -15
  116. package/dist/helpers/getSchema.js.map +0 -1
  117. package/dist/helpers/getViewFromFluid.d.ts +0 -18
  118. package/dist/helpers/getViewFromFluid.d.ts.map +0 -1
  119. package/dist/helpers/getViewFromFluid.js +0 -47
  120. package/dist/helpers/getViewFromFluid.js.map +0 -1
  121. package/dist/helpers/index.d.ts +0 -16
  122. package/dist/helpers/index.d.ts.map +0 -1
  123. package/dist/helpers/index.js +0 -28
  124. package/dist/helpers/index.js.map +0 -1
  125. package/dist/helpers/initializeState.d.ts +0 -22
  126. package/dist/helpers/initializeState.d.ts.map +0 -1
  127. package/dist/helpers/initializeState.js +0 -77
  128. package/dist/helpers/initializeState.js.map +0 -1
  129. package/dist/helpers/internalInterface.d.ts +0 -15
  130. package/dist/helpers/internalInterface.d.ts.map +0 -1
  131. package/dist/helpers/internalInterface.js +0 -7
  132. package/dist/helpers/internalInterface.js.map +0 -1
  133. package/dist/helpers/rootCallbackListener.d.ts +0 -24
  134. package/dist/helpers/rootCallbackListener.d.ts.map +0 -1
  135. package/dist/helpers/rootCallbackListener.js +0 -55
  136. package/dist/helpers/rootCallbackListener.js.map +0 -1
  137. package/dist/helpers/setComponentSchema.d.ts +0 -14
  138. package/dist/helpers/setComponentSchema.d.ts.map +0 -1
  139. package/dist/helpers/setComponentSchema.js +0 -18
  140. package/dist/helpers/setComponentSchema.js.map +0 -1
  141. package/dist/helpers/setFluidState.d.ts +0 -20
  142. package/dist/helpers/setFluidState.d.ts.map +0 -1
  143. package/dist/helpers/setFluidState.js +0 -94
  144. package/dist/helpers/setFluidState.js.map +0 -1
  145. package/dist/helpers/syncState.d.ts +0 -25
  146. package/dist/helpers/syncState.d.ts.map +0 -1
  147. package/dist/helpers/syncState.js +0 -98
  148. package/dist/helpers/syncState.js.map +0 -1
  149. package/dist/helpers/updateStateAndFluidObjectMap.d.ts +0 -29
  150. package/dist/helpers/updateStateAndFluidObjectMap.d.ts.map +0 -1
  151. package/dist/helpers/updateStateAndFluidObjectMap.js +0 -30
  152. package/dist/helpers/updateStateAndFluidObjectMap.js.map +0 -1
  153. package/dist/helpers/utils.d.ts +0 -12
  154. package/dist/helpers/utils.d.ts.map +0 -1
  155. package/dist/helpers/utils.js +0 -74
  156. package/dist/helpers/utils.js.map +0 -1
  157. package/dist/interface.d.ts +0 -444
  158. package/dist/interface.d.ts.map +0 -1
  159. package/dist/interface.js +0 -18
  160. package/dist/interface.js.map +0 -1
  161. package/dist/reactView.d.ts +0 -32
  162. package/dist/reactView.d.ts.map +0 -1
  163. package/dist/reactView.js +0 -79
  164. package/dist/reactView.js.map +0 -1
  165. package/dist/syncedDataObject.d.ts +0 -80
  166. package/dist/syncedDataObject.d.ts.map +0 -1
  167. package/dist/syncedDataObject.js +0 -249
  168. package/dist/syncedDataObject.js.map +0 -1
  169. package/dist/syncedObjects/array/fluidSyncedArray.d.ts +0 -11
  170. package/dist/syncedObjects/array/fluidSyncedArray.d.ts.map +0 -1
  171. package/dist/syncedObjects/array/fluidSyncedArray.js +0 -78
  172. package/dist/syncedObjects/array/fluidSyncedArray.js.map +0 -1
  173. package/dist/syncedObjects/array/index.d.ts +0 -7
  174. package/dist/syncedObjects/array/index.d.ts.map +0 -1
  175. package/dist/syncedObjects/array/index.js +0 -19
  176. package/dist/syncedObjects/array/index.js.map +0 -1
  177. package/dist/syncedObjects/array/interface.d.ts +0 -33
  178. package/dist/syncedObjects/array/interface.d.ts.map +0 -1
  179. package/dist/syncedObjects/array/interface.js +0 -3
  180. package/dist/syncedObjects/array/interface.js.map +0 -1
  181. package/dist/syncedObjects/array/syncedArray.d.ts +0 -30
  182. package/dist/syncedObjects/array/syncedArray.d.ts.map +0 -1
  183. package/dist/syncedObjects/array/syncedArray.js +0 -42
  184. package/dist/syncedObjects/array/syncedArray.js.map +0 -1
  185. package/dist/syncedObjects/counter/fluidSyncedCounter.d.ts +0 -11
  186. package/dist/syncedObjects/counter/fluidSyncedCounter.d.ts.map +0 -1
  187. package/dist/syncedObjects/counter/fluidSyncedCounter.js +0 -79
  188. package/dist/syncedObjects/counter/fluidSyncedCounter.js.map +0 -1
  189. package/dist/syncedObjects/counter/index.d.ts +0 -7
  190. package/dist/syncedObjects/counter/index.d.ts.map +0 -1
  191. package/dist/syncedObjects/counter/index.js +0 -19
  192. package/dist/syncedObjects/counter/index.js.map +0 -1
  193. package/dist/syncedObjects/counter/interface.d.ts +0 -32
  194. package/dist/syncedObjects/counter/interface.d.ts.map +0 -1
  195. package/dist/syncedObjects/counter/interface.js +0 -3
  196. package/dist/syncedObjects/counter/interface.js.map +0 -1
  197. package/dist/syncedObjects/counter/syncedCounter.d.ts +0 -29
  198. package/dist/syncedObjects/counter/syncedCounter.d.ts.map +0 -1
  199. package/dist/syncedObjects/counter/syncedCounter.js +0 -36
  200. package/dist/syncedObjects/counter/syncedCounter.js.map +0 -1
  201. package/dist/syncedObjects/index.d.ts +0 -9
  202. package/dist/syncedObjects/index.d.ts.map +0 -1
  203. package/dist/syncedObjects/index.js +0 -21
  204. package/dist/syncedObjects/index.js.map +0 -1
  205. package/dist/syncedObjects/object/index.d.ts +0 -7
  206. package/dist/syncedObjects/object/index.d.ts.map +0 -1
  207. package/dist/syncedObjects/object/index.js +0 -19
  208. package/dist/syncedObjects/object/index.js.map +0 -1
  209. package/dist/syncedObjects/object/interface.d.ts +0 -13
  210. package/dist/syncedObjects/object/interface.d.ts.map +0 -1
  211. package/dist/syncedObjects/object/interface.js +0 -7
  212. package/dist/syncedObjects/object/interface.js.map +0 -1
  213. package/dist/syncedObjects/object/syncedObject.d.ts +0 -22
  214. package/dist/syncedObjects/object/syncedObject.d.ts.map +0 -1
  215. package/dist/syncedObjects/object/syncedObject.js +0 -46
  216. package/dist/syncedObjects/object/syncedObject.js.map +0 -1
  217. package/dist/syncedObjects/string/index.d.ts +0 -7
  218. package/dist/syncedObjects/string/index.d.ts.map +0 -1
  219. package/dist/syncedObjects/string/index.js +0 -19
  220. package/dist/syncedObjects/string/index.js.map +0 -1
  221. package/dist/syncedObjects/string/interface.d.ts +0 -16
  222. package/dist/syncedObjects/string/interface.d.ts.map +0 -1
  223. package/dist/syncedObjects/string/interface.js +0 -7
  224. package/dist/syncedObjects/string/interface.js.map +0 -1
  225. package/dist/syncedObjects/string/syncedString.d.ts +0 -25
  226. package/dist/syncedObjects/string/syncedString.d.ts.map +0 -1
  227. package/dist/syncedObjects/string/syncedString.js +0 -53
  228. package/dist/syncedObjects/string/syncedString.js.map +0 -1
  229. package/dist/useReducerFluid.d.ts +0 -7
  230. package/dist/useReducerFluid.d.ts.map +0 -1
  231. package/dist/useReducerFluid.js +0 -219
  232. package/dist/useReducerFluid.js.map +0 -1
  233. package/dist/useStateFluid.d.ts +0 -10
  234. package/dist/useStateFluid.d.ts.map +0 -1
  235. package/dist/useStateFluid.js +0 -67
  236. package/dist/useStateFluid.js.map +0 -1
  237. package/lib/createContextFluid.js +0 -23
  238. package/lib/createContextFluid.js.map +0 -1
  239. package/lib/helpers/generateFluidObjectSchema.js +0 -71
  240. package/lib/helpers/generateFluidObjectSchema.js.map +0 -1
  241. package/lib/helpers/getFluidFromView.js +0 -26
  242. package/lib/helpers/getFluidFromView.js.map +0 -1
  243. package/lib/helpers/getFluidState.js +0 -43
  244. package/lib/helpers/getFluidState.js.map +0 -1
  245. package/lib/helpers/getSchema.js +0 -11
  246. package/lib/helpers/getSchema.js.map +0 -1
  247. package/lib/helpers/getViewFromFluid.js +0 -43
  248. package/lib/helpers/getViewFromFluid.js.map +0 -1
  249. package/lib/helpers/index.js +0 -16
  250. package/lib/helpers/index.js.map +0 -1
  251. package/lib/helpers/initializeState.js +0 -73
  252. package/lib/helpers/initializeState.js.map +0 -1
  253. package/lib/helpers/internalInterface.js +0 -6
  254. package/lib/helpers/internalInterface.js.map +0 -1
  255. package/lib/helpers/rootCallbackListener.js +0 -51
  256. package/lib/helpers/rootCallbackListener.js.map +0 -1
  257. package/lib/helpers/setComponentSchema.js +0 -14
  258. package/lib/helpers/setComponentSchema.js.map +0 -1
  259. package/lib/helpers/setFluidState.js +0 -90
  260. package/lib/helpers/setFluidState.js.map +0 -1
  261. package/lib/helpers/syncState.js +0 -94
  262. package/lib/helpers/syncState.js.map +0 -1
  263. package/lib/helpers/updateStateAndFluidObjectMap.js +0 -26
  264. package/lib/helpers/updateStateAndFluidObjectMap.js.map +0 -1
  265. package/lib/helpers/utils.js +0 -67
  266. package/lib/helpers/utils.js.map +0 -1
  267. package/lib/interface.js +0 -8
  268. package/lib/interface.js.map +0 -1
  269. package/lib/reactView.js +0 -56
  270. package/lib/reactView.js.map +0 -1
  271. package/lib/syncedDataObject.js +0 -245
  272. package/lib/syncedDataObject.js.map +0 -1
  273. package/lib/syncedObjects/array/fluidSyncedArray.js +0 -72
  274. package/lib/syncedObjects/array/fluidSyncedArray.js.map +0 -1
  275. package/lib/syncedObjects/array/index.js +0 -7
  276. package/lib/syncedObjects/array/index.js.map +0 -1
  277. package/lib/syncedObjects/array/interface.js +0 -2
  278. package/lib/syncedObjects/array/interface.js.map +0 -1
  279. package/lib/syncedObjects/array/syncedArray.js +0 -37
  280. package/lib/syncedObjects/array/syncedArray.js.map +0 -1
  281. package/lib/syncedObjects/counter/fluidSyncedCounter.js +0 -73
  282. package/lib/syncedObjects/counter/fluidSyncedCounter.js.map +0 -1
  283. package/lib/syncedObjects/counter/index.js +0 -7
  284. package/lib/syncedObjects/counter/index.js.map +0 -1
  285. package/lib/syncedObjects/counter/interface.js +0 -2
  286. package/lib/syncedObjects/counter/interface.js.map +0 -1
  287. package/lib/syncedObjects/counter/syncedCounter.js +0 -31
  288. package/lib/syncedObjects/counter/syncedCounter.js.map +0 -1
  289. package/lib/syncedObjects/index.js +0 -9
  290. package/lib/syncedObjects/index.js.map +0 -1
  291. package/lib/syncedObjects/object/index.js +0 -7
  292. package/lib/syncedObjects/object/index.js.map +0 -1
  293. package/lib/syncedObjects/object/interface.js +0 -6
  294. package/lib/syncedObjects/object/interface.js.map +0 -1
  295. package/lib/syncedObjects/object/syncedObject.js +0 -41
  296. package/lib/syncedObjects/object/syncedObject.js.map +0 -1
  297. package/lib/syncedObjects/string/index.js +0 -7
  298. package/lib/syncedObjects/string/index.js.map +0 -1
  299. package/lib/syncedObjects/string/interface.js +0 -6
  300. package/lib/syncedObjects/string/interface.js.map +0 -1
  301. package/lib/syncedObjects/string/syncedString.js +0 -48
  302. package/lib/syncedObjects/string/syncedString.js.map +0 -1
  303. package/lib/useReducerFluid.js +0 -196
  304. package/lib/useReducerFluid.js.map +0 -1
  305. package/lib/useStateFluid.js +0 -44
  306. package/lib/useStateFluid.js.map +0 -1
  307. package/src/createContextFluid.tsx +0 -33
  308. package/src/helpers/generateFluidObjectSchema.ts +0 -95
  309. package/src/helpers/getFluidFromView.ts +0 -38
  310. package/src/helpers/getFluidState.ts +0 -67
  311. package/src/helpers/getSchema.ts +0 -18
  312. package/src/helpers/getViewFromFluid.ts +0 -68
  313. package/src/helpers/index.tsx +0 -16
  314. package/src/helpers/initializeState.ts +0 -162
  315. package/src/helpers/internalInterface.ts +0 -16
  316. package/src/helpers/rootCallbackListener.ts +0 -104
  317. package/src/helpers/setComponentSchema.ts +0 -21
  318. package/src/helpers/setFluidState.ts +0 -116
  319. package/src/helpers/syncState.ts +0 -159
  320. package/src/helpers/updateStateAndFluidObjectMap.ts +0 -85
  321. package/src/helpers/utils.tsx +0 -109
  322. package/src/interface.ts +0 -617
  323. package/src/reactView.tsx +0 -108
  324. package/src/syncedDataObject.ts +0 -337
  325. package/src/syncedObjects/array/fluidSyncedArray.ts +0 -126
  326. package/src/syncedObjects/array/index.ts +0 -7
  327. package/src/syncedObjects/array/interface.ts +0 -45
  328. package/src/syncedObjects/array/syncedArray.ts +0 -65
  329. package/src/syncedObjects/counter/fluidSyncedCounter.ts +0 -122
  330. package/src/syncedObjects/counter/index.ts +0 -7
  331. package/src/syncedObjects/counter/interface.ts +0 -44
  332. package/src/syncedObjects/counter/syncedCounter.ts +0 -64
  333. package/src/syncedObjects/index.ts +0 -9
  334. package/src/syncedObjects/object/index.ts +0 -7
  335. package/src/syncedObjects/object/interface.ts +0 -14
  336. package/src/syncedObjects/object/syncedObject.ts +0 -55
  337. package/src/syncedObjects/string/index.ts +0 -7
  338. package/src/syncedObjects/string/interface.ts +0 -17
  339. package/src/syncedObjects/string/syncedString.ts +0 -61
  340. package/src/useReducerFluid.tsx +0 -436
  341. package/src/useStateFluid.tsx +0 -84
  342. package/tsconfig.esnext.json +0 -7
@@ -1,104 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { ISharedMap, IValueChanged } from "@fluidframework/map";
7
- import { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
8
- import {
9
- FluidObjectMap,
10
- ViewToFluidMap,
11
- FluidToViewMap,
12
- IViewState,
13
- IFluidState,
14
- } from "../interface";
15
- import { ISyncedState } from "..";
16
- import { syncState } from "./syncState";
17
- import { getByFluidKey } from "./utils";
18
- import { getViewFromFluid } from "./getViewFromFluid";
19
- import { getFluidState } from ".";
20
-
21
- /**
22
- * The callback that is added to the "valueChanged" event on the Fluid object this
23
- * is passed in to. This will trigger state updates when the synced state value is updated
24
- * @param fluidObjectMap - A map of Fluid handle paths to their Fluid objects
25
- * @param syncedStateId - Unique ID for this synced Fluid object's state
26
- * @param syncedState - The shared map this Fluid object's synced state is stored on
27
- * @param runtime - The data store runtime
28
- * @param state - The current view state
29
- * @param setState - Callback to update the react view state
30
- * @param fluidToView - A map of the Fluid state values that need conversion to their view state counterparts and the
31
- * respective converters
32
- * @param viewToFluid - A map of the view state values that need conversion to their Fluid state counterparts and the
33
- * respective converters
34
- */
35
- export const syncedStateCallbackListener = <
36
- SV extends IViewState,
37
- SF extends IFluidState
38
- >(
39
- fluidObjectMap: FluidObjectMap,
40
- storedHandleMap: ISharedMap,
41
- syncedStateId,
42
- syncedState: ISyncedState,
43
- runtime: IFluidDataStoreRuntime,
44
- state: SV,
45
- setState: (
46
- newState: SV,
47
- fromRootUpdate?: boolean,
48
- isLocal?: boolean
49
- ) => void,
50
- fluidToView: FluidToViewMap<SV, SF>,
51
- viewToFluid?: ViewToFluidMap<SV, SF>,
52
- ) => (change: IValueChanged, local: boolean) => {
53
- const currentFluidState = getFluidState(
54
- syncedStateId,
55
- syncedState,
56
- fluidObjectMap,
57
- fluidToView,
58
- );
59
- if (currentFluidState === undefined) {
60
- throw Error("Synced state update triggered before Fluid state was initialized");
61
- }
62
- const viewToFluidKeys: string[] = viewToFluid !== undefined
63
- ? Array.from(viewToFluid.values()).map((item) => item.fluidKey as string)
64
- : [];
65
- if (!local && change.key === `syncedState-${syncedStateId}`) {
66
- // If the update is to the synced Fluid state, update both the Fluid and view states
67
- syncState(
68
- true,
69
- syncedStateId,
70
- syncedState,
71
- runtime,
72
- state,
73
- setState,
74
- fluidObjectMap,
75
- fluidToView,
76
- viewToFluid,
77
- );
78
- } else if (
79
- viewToFluid !== undefined &&
80
- viewToFluidKeys.includes(change.key)
81
- ) {
82
- // If the update is to a child Fluid object, trigger only a view update as the child itself will
83
- // update its Fluid update
84
- const stateKey = getByFluidKey(change.key, viewToFluid);
85
- if (stateKey !== undefined) {
86
- const newPartialState = getViewFromFluid(
87
- syncedStateId,
88
- syncedState,
89
- change.key as keyof SF,
90
- fluidObjectMap,
91
- fluidToView,
92
- state,
93
- currentFluidState,
94
- );
95
- state[stateKey as string] = newPartialState[stateKey];
96
- state.fluidObjectMap = fluidObjectMap;
97
- setState(state, true, local);
98
- } else {
99
- throw Error(
100
- `Unable to extract view state from synced state change key: ${change.key}`,
101
- );
102
- }
103
- }
104
- };
@@ -1,21 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { ISyncedState } from "..";
7
- import { IFluidSchemaHandles } from "./internalInterface";
8
-
9
- /**
10
- * Store the schema on to the shared synced state
11
- * @param syncedStateId - Unique ID to use for storing the synced state in the shared map
12
- * @param syncedState - The shared map that will be used to store the synced state
13
- * @param schemaHandles - Handles for the schema SharedMaps
14
- */
15
- export function setSchema(
16
- syncedStateId: string,
17
- syncedState: ISyncedState,
18
- schemaHandles: IFluidSchemaHandles,
19
- ): void {
20
- syncedState.set(`schema-${syncedStateId}`, schemaHandles);
21
- }
@@ -1,116 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { ISharedMap, SharedMap } from "@fluidframework/map";
7
- import { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
8
- import { IFluidHandle } from "@fluidframework/core-interfaces";
9
- import {
10
- FluidObjectMap,
11
- IViewConverter,
12
- IFluidConverter,
13
- ISyncedState,
14
- } from "../interface";
15
-
16
- /**
17
- * Store the Fluid state onto the shared synced state
18
- * @param syncedStateId - Unique ID to use for storing the Fluid object's synced state in the map
19
- * @param syncedState - The shared map that will be used to store the synced state
20
- * @param runtime - The data store runtime
21
- * @param fluidObjectMap - A map of Fluid handle paths to their Fluid objects
22
- * @param fluidToView - A map of the Fluid state values that need conversion to their view state counterparts and the
23
- * respective converters
24
- * @param newFluidState - The Fluid state to store on to the syncedState,
25
- * after converting Fluid objects to their handles
26
- */
27
- export function setFluidState<SV, SF>(
28
- syncedStateId: string,
29
- syncedState: ISyncedState,
30
- runtime: IFluidDataStoreRuntime,
31
- fluidObjectMap: FluidObjectMap,
32
- fluidToView: Map<keyof SF, IViewConverter<SV, SF>>,
33
- newViewState: SV,
34
- newFluidState?: SF,
35
- viewToFluid?: Map<keyof SV, IFluidConverter<SV, SF>>,
36
- ): IFluidHandle {
37
- const storedStateHandle = syncedState.get<IFluidHandle>(
38
- `syncedState-${syncedStateId}`,
39
- );
40
- let storedState: ISharedMap | undefined;
41
- if (storedStateHandle) {
42
- storedState = fluidObjectMap.get(storedStateHandle.absolutePath)
43
- ?.fluidObject as ISharedMap;
44
- }
45
- if (storedStateHandle === undefined || storedState === undefined) {
46
- const newState = SharedMap.create(runtime);
47
- fluidObjectMap.set(newState.handle.absolutePath, {
48
- fluidObject: newState,
49
- isRuntimeMap: true,
50
- });
51
- storedState = newState;
52
- }
53
- if (storedState === undefined) {
54
- throw Error("Failed to fetch synced state from root");
55
- }
56
- for (const key of fluidToView.keys()) {
57
- const fluidKey = key as string;
58
- const syncedStateKey = fluidToView?.get(fluidKey as keyof SF)?.rootKey;
59
- const createCallback = fluidToView?.get(fluidKey as keyof SF)
60
- ?.sharedObjectCreate;
61
- if (createCallback !== undefined) {
62
- if (storedState.get(fluidKey) === undefined) {
63
- const sharedObject = createCallback(runtime);
64
- fluidObjectMap.set(sharedObject.handle.absolutePath, {
65
- fluidObject: sharedObject,
66
- listenedEvents: fluidToView?.get(fluidKey as keyof SF)
67
- ?.listenedEvents ?? ["valueChanged"],
68
- });
69
- storedState.set(fluidKey, sharedObject.handle);
70
- if (syncedStateKey !== undefined) {
71
- syncedState.set(syncedStateKey, sharedObject.handle);
72
- }
73
- } else {
74
- storedState.set(fluidKey, storedState.get(fluidKey));
75
- if (syncedStateKey !== undefined) {
76
- syncedState.set(
77
- syncedStateKey,
78
- syncedState.get(syncedStateKey),
79
- );
80
- }
81
- }
82
- } else if (syncedStateKey !== undefined) {
83
- const value = newFluidState !== undefined
84
- ? newFluidState[fluidKey]
85
- : syncedState.get(syncedStateKey);
86
- syncedState.set(syncedStateKey, value);
87
- storedState.set(fluidKey, value);
88
- } else {
89
- const value = newFluidState !== undefined
90
- ? newFluidState[fluidKey]
91
- : storedState.get(fluidKey);
92
- storedState.set(fluidKey, value);
93
- }
94
- }
95
- if (viewToFluid !== undefined && newFluidState !== undefined) {
96
- for (const key of viewToFluid.keys()) {
97
- const viewKey = key as string;
98
- const fluidConverter = viewToFluid?.get(viewKey as keyof SV)
99
- ?.fluidConverter;
100
- const fluidKey = viewToFluid?.get(viewKey as keyof SV)
101
- ?.fluidKey;
102
- if (fluidConverter !== undefined && fluidKey !== undefined) {
103
- const value = fluidConverter(newViewState, newFluidState);
104
- // Write this value to the stored state if it doesn't match the name of a view value
105
- if (
106
- fluidToView.get(fluidKey)?.sharedObjectCreate ===
107
- undefined
108
- ) {
109
- storedState.set(viewKey, value);
110
- }
111
- }
112
- }
113
- }
114
- syncedState.set(`syncedState-${syncedStateId}`, storedState.handle);
115
- return storedState.handle;
116
- }
@@ -1,159 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
7
- import { ISharedMap } from "@fluidframework/map";
8
- import {
9
- FluidObjectMap,
10
- IFluidState,
11
- IViewState,
12
- ViewToFluidMap,
13
- FluidToViewMap,
14
- ISyncedState,
15
- } from "../interface";
16
- import { getFluidFromView } from "./getFluidFromView";
17
- import { getViewFromFluid } from "./getViewFromFluid";
18
- import { getFluidState } from "./getFluidState";
19
- import { setFluidState } from "./setFluidState";
20
- import { getSchema } from "./getSchema";
21
-
22
- /**
23
- * Function to combine both the view and Fluid states so that they are in sync. If the update
24
- * is from a local update, the new Fluid state created from converting the new local view state
25
- * is used to update the synced Fluid state, which in turn will update the local state on other clients.
26
- * If it is an update triggered from a remote change on the synced state, the new Fluid state from the synced state
27
- * is used to overwrite the local synced state and the new local view is created accordingly.
28
- * @param isSyncedStateUpdate - Is the update from a local state update or from one triggered by the synced state
29
- * @param syncedStateId - Unique ID for this synced Fluid object's state
30
- * @param syncedState - The shared map this Fluid object synced state is stored on
31
- * @param viewState - The current view state
32
- * @param setState - Callback to update the react view state
33
- * @param fluidObjectMap - A map of Fluid handle paths to their Fluid objects
34
- * @param viewToFluid - A map of the view state values that need conversion to their Fluid state counterparts and the
35
- * respective converters
36
- * @param fluidToView - A map of the Fluid state values that need conversion to their view state counterparts and the
37
- * respective converters
38
- */
39
- export function syncState<
40
- SV extends IViewState,
41
- SF extends IFluidState
42
- >(
43
- isSyncedStateUpdate: boolean,
44
- syncedStateId: string,
45
- syncedState: ISyncedState,
46
- runtime: IFluidDataStoreRuntime,
47
- viewState: SV,
48
- setState: (
49
- newState: SV,
50
- isSyncedStateUpdate?: boolean,
51
- isLocal?: boolean
52
- ) => void,
53
- fluidObjectMap: FluidObjectMap,
54
- fluidToView: FluidToViewMap<SV, SF>,
55
- viewToFluid?: ViewToFluidMap<SV, SF>,
56
- ) {
57
- // Use the provided Fluid state if it is available, or use the one fetched from the synced state
58
- const currentFluidState = getFluidState(
59
- syncedStateId,
60
- syncedState,
61
- fluidObjectMap,
62
- fluidToView,
63
- );
64
- if (currentFluidState === undefined) {
65
- throw Error(
66
- "Attempted to sync view and Fluid states before Fluid state was initialized",
67
- );
68
- }
69
- // Fetch the schema
70
- const schemaHandles = getSchema(
71
- syncedStateId,
72
- syncedState,
73
- );
74
- if (schemaHandles === undefined) {
75
- throw Error("No schema found stored on the root");
76
- }
77
- const {
78
- viewMatchingMapHandle,
79
- fluidMatchingMapHandle,
80
- } = schemaHandles;
81
-
82
- const viewMatchingMap = fluidObjectMap.get(viewMatchingMapHandle.absolutePath)
83
- ?.fluidObject as ISharedMap;
84
- const fluidMatchingMap = fluidObjectMap.get(fluidMatchingMapHandle.absolutePath)
85
- ?.fluidObject as ISharedMap;
86
-
87
- if (viewMatchingMap === undefined || fluidMatchingMap === undefined) {
88
- throw Error("Failed to fetch shared map DDSes from the schema handles");
89
- }
90
-
91
- // Create the combined root state by combining the current root state and the new
92
- // view state after it has been converted
93
- let combinedFluidState = { ...currentFluidState };
94
- Object.entries(viewState).forEach(([viewKey, viewValue]) => {
95
- const needsConverter = viewMatchingMap.get(viewKey);
96
- let partialRootState = {};
97
- if (needsConverter !== undefined) {
98
- partialRootState = getFluidFromView(
99
- viewState,
100
- viewKey as keyof SV,
101
- currentFluidState,
102
- viewToFluid,
103
- );
104
- } else {
105
- partialRootState[viewKey] = viewState[viewKey];
106
- }
107
- // If it is from a synced state update, the values fetched from the synced state at the beginning
108
- // overwrite those created here. Otherwise, the new values overwrite those in the synced state
109
- if (isSyncedStateUpdate) {
110
- combinedFluidState = { ...partialRootState, ...combinedFluidState };
111
- } else {
112
- combinedFluidState = { ...combinedFluidState, ...partialRootState };
113
- }
114
- });
115
-
116
- // Create the combined view state by combining the current view with the new Fluid state
117
- // after it has been converted
118
- let combinedViewState = { ...viewState, ...{ fluidObjectMap } };
119
- Object.entries(currentFluidState).forEach(([fluidKey, fluidValue]) => {
120
- const needsConverter = fluidMatchingMap.get(fluidKey);
121
- let partialViewState = {};
122
- if (needsConverter !== undefined) {
123
- partialViewState = getViewFromFluid(
124
- syncedStateId,
125
- syncedState,
126
- fluidKey as keyof SF,
127
- fluidObjectMap,
128
- fluidToView,
129
- combinedViewState,
130
- combinedFluidState,
131
- );
132
- } else {
133
- partialViewState[fluidKey] = currentFluidState[fluidKey];
134
- }
135
- // If it is from a synced state update, the values converted from the synced state overwrite those
136
- // created here. Otherwise, the new view values overwrite those from the synced state.
137
- if (isSyncedStateUpdate) {
138
- combinedViewState = { ...combinedViewState, ...partialViewState };
139
- } else {
140
- combinedViewState = { ...partialViewState, ...combinedViewState };
141
- }
142
- });
143
-
144
- // If it is a local update, broadcast it by setting it on the root and updating locally
145
- // Otherwise, only update locally as the root update has already been broadcasted
146
- if (!isSyncedStateUpdate) {
147
- setFluidState(
148
- syncedStateId,
149
- syncedState,
150
- runtime,
151
- fluidObjectMap,
152
- fluidToView,
153
- combinedViewState,
154
- combinedFluidState,
155
- viewToFluid,
156
- );
157
- }
158
- setState(combinedViewState, isSyncedStateUpdate, true);
159
- }
@@ -1,85 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { IDirectoryValueChanged, SharedMap } from "@fluidframework/map";
7
- import { IFluidHandle } from "@fluidframework/core-interfaces";
8
- import { IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
9
- import {
10
- FluidObjectMap,
11
- IFluidState,
12
- IViewState,
13
- ViewToFluidMap,
14
- FluidToViewMap,
15
- } from "../interface";
16
- import { ISyncedState } from "..";
17
- import { addFluidObject, asyncForEach } from "./utils";
18
- import { syncState } from "./syncState";
19
-
20
- /**
21
- * Add listeners too all the new handles passed in, store their respective Fluid objects
22
- * on the fluidObjectMap, and then update both the local and synced state
23
- * @param newHandleList - List of IFluidHandles for new Fluid objects that need to be added to the map
24
- * @param fluidObjectMap - A map of Fluid handle paths to their Fluid objects
25
- * @param isSyncedStateUpdate - Is the update from a local state update or from one triggered by the synced state
26
- * @param syncedStateId - Unique ID for this synced Fluid object's state
27
- * @param syncedState - The shared map this Fluid object's synced state is stored on
28
- * @param runtime - The data store runtime
29
- * @param viewState - The current view state
30
- * @param setState - Callback to update the react view state
31
- * @param syncedStateCallback - The callback that will be triggered when the synced state value for the Fluid objects
32
- * passed in changes
33
- * @param fluidToView - A map of the Fluid state values that need conversion to their view state counterparts and the
34
- * respective converters
35
- * @param viewToFluid - A map of the view state values that need conversion to their Fluid state counterparts and the
36
- * respective converters
37
- */
38
- export const updateStateAndFluidObjectMap = async <
39
- SV extends IViewState,
40
- SF extends IFluidState
41
- >(
42
- newHandleList: IFluidHandle[],
43
- fluidObjectMap: FluidObjectMap,
44
- storedHandleMap: SharedMap,
45
- isSyncedStateUpdate: boolean,
46
- syncedStateId: string,
47
- syncedState: ISyncedState,
48
- runtime: IFluidDataStoreRuntime,
49
- viewState: SV,
50
- setState: (newState: SV, isSyncedStateUpdate?: boolean) => void,
51
- syncedStateCallback: (change: IDirectoryValueChanged, local: boolean) => void,
52
- fluidToView: FluidToViewMap<SV, SF>,
53
- viewToFluid?: ViewToFluidMap<SV, SF>,
54
- ) =>
55
- asyncForEach(
56
- newHandleList,
57
- addFluidObject,
58
- fluidObjectMap,
59
- syncedStateCallback,
60
- () =>
61
- syncState(
62
- true,
63
- syncedStateId,
64
- syncedState,
65
- runtime,
66
- viewState,
67
- setState,
68
- fluidObjectMap,
69
- fluidToView,
70
- viewToFluid,
71
- ),
72
- storedHandleMap,
73
- ).then(() =>
74
- syncState(
75
- isSyncedStateUpdate,
76
- syncedStateId,
77
- syncedState,
78
- runtime,
79
- viewState,
80
- setState,
81
- fluidObjectMap,
82
- fluidToView,
83
- viewToFluid,
84
- ),
85
- );
@@ -1,109 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { IFluidHandle } from "@fluidframework/core-interfaces";
7
- import { IDirectoryValueChanged, SharedMap } from "@fluidframework/map";
8
- import { SharedObject } from "@fluidframework/shared-object-base";
9
- import {
10
- FluidObjectMap,
11
- IFluidState,
12
- IViewState,
13
- IFluidConverter,
14
- } from "../interface";
15
- import { IFluidObjectMapItem } from "..";
16
-
17
- export function getByFluidKey<
18
- SV extends IViewState,
19
- SF extends IFluidState
20
- >(searchValue: string, map: Map<keyof SV, IFluidConverter<SV, SF>>) {
21
- for (const [key, value] of map.entries()) {
22
- if (value.fluidKey === searchValue) {
23
- return key;
24
- }
25
- }
26
- }
27
-
28
- export async function asyncForEach(
29
- array: IFluidHandle[],
30
- callback: (
31
- handle: IFluidHandle,
32
- fluidObjectMap: FluidObjectMap,
33
- syncedStateCallback: (change: IDirectoryValueChanged, local: boolean) => void,
34
- refreshView: () => void,
35
- storedHandleMap: SharedMap,
36
- ) => Promise<void>,
37
- fluidObjectMap: FluidObjectMap,
38
- syncedStateCallback: (change: IDirectoryValueChanged, local: boolean) => void,
39
- refreshView: () => void,
40
- storedHandleMap: SharedMap,
41
- ): Promise<void> {
42
- const promises: Promise<void>[] = [];
43
- for (const value of array) {
44
- promises.push(
45
- callback(value, fluidObjectMap, syncedStateCallback, refreshView, storedHandleMap),
46
- );
47
- }
48
- await Promise.all(promises);
49
- }
50
-
51
- export const addFluidObject = async <
52
- SV extends IViewState,
53
- SF extends IFluidState
54
- >(
55
- handle: IFluidHandle,
56
- fluidObjectMap: FluidObjectMap,
57
- syncedStateCallback: (change: IDirectoryValueChanged, local: boolean) => void,
58
- refreshView: () => void,
59
- storedHandleMap: SharedMap,
60
- ): Promise<void> => {
61
- const maybeValue: IFluidObjectMapItem | undefined = fluidObjectMap.get(handle.absolutePath);
62
- let value: IFluidObjectMapItem = {
63
- isListened: false,
64
- isRuntimeMap: false,
65
- };
66
- if (maybeValue === undefined) {
67
- fluidObjectMap.set(
68
- handle.absolutePath,
69
- value,
70
- );
71
- } else {
72
- value = maybeValue;
73
- }
74
- value.isListened = false;
75
- fluidObjectMap.set(handle.absolutePath, value);
76
- if (!storedHandleMap.has(handle.absolutePath)) {
77
- storedHandleMap.set(handle.absolutePath, handle);
78
- }
79
- return handle.get().then((fluidObject) => {
80
- // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
81
- if (value.isRuntimeMap) {
82
- (fluidObject as SharedMap).on("valueChanged", syncedStateCallback);
83
- } else if (value.listenedEvents !== undefined) {
84
- for (const event of value.listenedEvents) {
85
- (fluidObject as SharedObject).on(event, refreshView);
86
- }
87
- }
88
- value.fluidObject = fluidObject;
89
- value.isListened = true;
90
- fluidObjectMap.set(handle.absolutePath, value);
91
- });
92
- };
93
-
94
- export function isEquivalent(a, b) {
95
- if (a === undefined || b === undefined) {
96
- return a === b;
97
- }
98
- const aKeys = Object.getOwnPropertyNames(a);
99
- const bKeys = Object.getOwnPropertyNames(b);
100
- if (aKeys.length !== bKeys.length) {
101
- return false;
102
- }
103
- for (const i of aKeys) {
104
- if (a[i] !== b[i]) {
105
- return false;
106
- }
107
- }
108
- return true;
109
- }