@q9labsai/chalk-whiteboard 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/README.md +39 -0
  2. package/dist/chunk-4XG2ABSP.js +23 -0
  3. package/dist/chunk-FLUO6BVL.js +654 -0
  4. package/dist/collab/engine.d.ts +102 -0
  5. package/dist/collab/files.d.ts +65 -0
  6. package/dist/collab/index.d.ts +7 -0
  7. package/dist/collab/index.js +16 -0
  8. package/dist/collab/presence.d.ts +32 -0
  9. package/dist/collab/reducer.d.ts +2 -0
  10. package/dist/collab/syncable.d.ts +2 -0
  11. package/dist/collab/types.d.ts +2 -0
  12. package/dist/collab/wire.d.ts +29 -0
  13. package/dist/embedded/chalk-whiteboard/THIRD_PARTY_NOTICES.json +17 -0
  14. package/dist/embedded/chalk-whiteboard/asset-manifest.json +1228 -0
  15. package/dist/embedded/chalk-whiteboard/chalk.css +5 -0
  16. package/dist/embedded/chalk-whiteboard/compatibility-manifest.json +37 -0
  17. package/dist/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  18. package/dist/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  19. package/dist/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  20. package/dist/embedded/chalk-whiteboard/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  21. package/dist/embedded/chalk-whiteboard/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  22. package/dist/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  23. package/dist/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  24. package/dist/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  25. package/dist/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  26. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  27. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  28. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  29. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  30. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  31. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  32. package/dist/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  33. package/dist/embedded/chalk-whiteboard/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
  34. package/dist/embedded/chalk-whiteboard/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  35. package/dist/embedded/chalk-whiteboard/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  36. package/dist/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  37. package/dist/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  38. package/dist/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  39. package/dist/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  40. package/dist/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  41. package/dist/embedded/chalk-whiteboard/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  42. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
  43. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
  44. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
  45. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
  46. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
  47. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
  48. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
  49. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
  50. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
  51. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
  52. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
  53. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
  54. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
  55. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
  56. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
  57. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
  58. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
  59. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
  60. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
  61. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
  62. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
  63. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
  64. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
  65. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
  66. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
  67. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
  68. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
  69. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
  70. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
  71. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
  72. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
  73. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
  74. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
  75. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
  76. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
  77. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
  78. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
  79. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
  80. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
  81. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
  82. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
  83. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
  84. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
  85. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
  86. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
  87. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
  88. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
  89. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
  90. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
  91. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
  92. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
  93. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
  94. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
  95. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
  96. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
  97. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
  98. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
  99. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
  100. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
  101. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
  102. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
  103. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
  104. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
  105. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
  106. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
  107. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
  108. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
  109. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
  110. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
  111. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
  112. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
  113. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
  114. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
  115. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
  116. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
  117. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
  118. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
  119. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
  120. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
  121. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
  122. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
  123. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
  124. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
  125. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
  126. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
  127. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
  128. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
  129. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
  130. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
  131. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
  132. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
  133. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
  134. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
  135. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
  136. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
  137. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
  138. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
  139. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
  140. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
  141. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
  142. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
  143. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
  144. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
  145. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
  146. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
  147. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
  148. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
  149. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
  150. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
  151. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
  152. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
  153. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
  154. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
  155. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
  156. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
  157. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
  158. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
  159. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
  160. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
  161. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
  162. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
  163. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
  164. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
  165. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
  166. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
  167. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
  168. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
  169. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
  170. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
  171. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
  172. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
  173. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
  174. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
  175. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
  176. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
  177. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
  178. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
  179. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
  180. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
  181. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
  182. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
  183. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
  184. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
  185. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
  186. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
  187. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
  188. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
  189. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
  190. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
  191. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
  192. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
  193. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
  194. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
  195. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
  196. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
  197. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
  198. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
  199. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
  200. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
  201. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
  202. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
  203. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
  204. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
  205. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
  206. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
  207. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
  208. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
  209. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
  210. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
  211. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
  212. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
  213. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
  214. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
  215. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
  216. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
  217. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
  218. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
  219. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
  220. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
  221. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
  222. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
  223. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
  224. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
  225. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
  226. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
  227. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
  228. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
  229. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
  230. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
  231. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
  232. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
  233. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
  234. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
  235. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
  236. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
  237. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
  238. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
  239. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
  240. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
  241. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
  242. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
  243. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
  244. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
  245. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
  246. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
  247. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
  248. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
  249. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
  250. package/dist/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
  251. package/dist/embedded/chalk-whiteboard/index.css +1 -0
  252. package/dist/embedded/chalk-whiteboard/index.html +17 -0
  253. package/dist/embedded/chalk-whiteboard/licenses/Excalidraw.txt +21 -0
  254. package/dist/embedded/chalk-whiteboard/licenses/MathJax.txt +202 -0
  255. package/dist/embedded/chalk-whiteboard/mathjax/tex-svg.js +1 -0
  256. package/dist/embedded/chalk-whiteboard/mathjax-config.js +1 -0
  257. package/dist/embedded/chalk-whiteboard/renderer.js +4114 -0
  258. package/dist/embedded/controller.d.ts +123 -0
  259. package/dist/embedded/index.d.ts +5 -0
  260. package/dist/embedded/index.js +897 -0
  261. package/dist/embedded/manifest.d.ts +40 -0
  262. package/dist/embedded/protocol.d.ts +211 -0
  263. package/dist/embedded/renderer-bridge.d.ts +37 -0
  264. package/dist/embedded/renderer.d.ts +25 -0
  265. package/dist/engine-UMQR3O33.js +6 -0
  266. package/dist/index.d.ts +3 -0
  267. package/dist/index.js +14 -0
  268. package/dist/react/MathEditor.d.ts +17 -0
  269. package/dist/react/WhiteboardCanvas.d.ts +47 -0
  270. package/dist/react/index.d.ts +7 -0
  271. package/dist/react/index.js +625 -0
  272. package/dist/react/math-elements.d.ts +40 -0
  273. package/dist/react/mathjax-renderer.d.ts +34 -0
  274. package/package.json +97 -0
@@ -0,0 +1,654 @@
1
+ // src/collab/engine.ts
2
+ import { CaptureUpdateAction as CaptureUpdateAction2, hashElementsVersion, reconcileElements, restoreElements } from "@excalidraw/excalidraw";
3
+
4
+ // src/collab/files.ts
5
+ import { CaptureUpdateAction, MIME_TYPES, newElementWith } from "@excalidraw/excalidraw";
6
+ import { sha256 } from "@noble/hashes/sha2.js";
7
+ import { bytesToHex } from "@noble/hashes/utils.js";
8
+ var dataURLToBlob = (dataURL) => {
9
+ const [header, base64] = dataURL.split(",", 2);
10
+ if (!header || !base64) throw new Error("invalid dataURL");
11
+ const match = /data:(.+?)(;base64)?$/i.exec(header);
12
+ const mimeType = match?.[1] ?? "application/octet-stream";
13
+ const bytes = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
14
+ return new Blob([bytes], { type: mimeType });
15
+ };
16
+ var blobToDataURL = (blob) => new Promise((resolve, reject) => {
17
+ const reader = new FileReader();
18
+ reader.onerror = () => reject(new Error("failed to read blob"));
19
+ reader.onload = () => resolve(String(reader.result));
20
+ reader.readAsDataURL(blob);
21
+ });
22
+ var sha256Hex = async (blob) => bytesToHex(sha256(new Uint8Array(await blob.arrayBuffer())));
23
+ var isImageElement = (el) => el.type === "image";
24
+ var toFileId = (value) => value;
25
+ var toDataURL = (value) => {
26
+ if (!value.startsWith("data:")) throw new Error("invalid dataURL");
27
+ return value;
28
+ };
29
+ var normalizeMimeType = (value) => {
30
+ const [rawMimeType] = value.split(";", 1);
31
+ const mimeType = rawMimeType?.trim().toLowerCase();
32
+ if (mimeType === MIME_TYPES.binary) return MIME_TYPES.binary;
33
+ if (mimeType?.startsWith("image/")) return mimeType;
34
+ return MIME_TYPES.binary;
35
+ };
36
+ var updateImageStatus = (excalidrawAPI, fileId, nextStatus) => {
37
+ const elements = excalidrawAPI.getSceneElementsIncludingDeleted();
38
+ let changed = false;
39
+ const next = elements.map((el) => {
40
+ if (!isImageElement(el) || el.isDeleted || el.fileId !== fileId) return el;
41
+ if (el.status === nextStatus) return el;
42
+ changed = true;
43
+ return newElementWith(el, { status: nextStatus });
44
+ });
45
+ if (!changed) return;
46
+ excalidrawAPI.updateScene({
47
+ elements: next,
48
+ captureUpdate: CaptureUpdateAction.NEVER
49
+ });
50
+ };
51
+ var WhiteboardFilesSync = class {
52
+ constructor(opts) {
53
+ this.opts = opts;
54
+ }
55
+ opts;
56
+ uploadTimer = null;
57
+ downloadTimer = null;
58
+ uploadQueue = [];
59
+ downloadQueue = [];
60
+ uploading = /* @__PURE__ */ new Set();
61
+ downloading = /* @__PURE__ */ new Set();
62
+ remotePendingUploads = 0;
63
+ lastErrorAtMs = null;
64
+ handleLocalScene(elementsAll, files) {
65
+ for (const el of elementsAll) {
66
+ if (!isImageElement(el) || el.isDeleted) continue;
67
+ if (el.status !== "pending") continue;
68
+ if (!el.fileId) continue;
69
+ const fileId = String(el.fileId);
70
+ if (this.uploading.has(fileId)) continue;
71
+ if (this.uploadQueue.includes(fileId)) continue;
72
+ const file = files[fileId];
73
+ if (!file?.dataURL || !file?.mimeType) continue;
74
+ this.uploadQueue.push(fileId);
75
+ }
76
+ this.emitState();
77
+ if (this.uploadQueue.length > 0) this.scheduleUpload();
78
+ }
79
+ handleRemoteScene(elementsAll) {
80
+ const haveFiles = this.opts.excalidrawAPI.getFiles();
81
+ let pendingRemoteUploads = 0;
82
+ for (const el of elementsAll) {
83
+ if (!isImageElement(el) || el.isDeleted) continue;
84
+ if (!el.fileId) continue;
85
+ const fileId = String(el.fileId);
86
+ if (el.status === "pending" && !haveFiles[fileId]) {
87
+ pendingRemoteUploads += 1;
88
+ continue;
89
+ }
90
+ if (el.status !== "saved") continue;
91
+ if (haveFiles[fileId]) continue;
92
+ if (this.downloading.has(fileId)) continue;
93
+ if (this.downloadQueue.includes(fileId)) continue;
94
+ this.downloadQueue.push(fileId);
95
+ }
96
+ this.remotePendingUploads = pendingRemoteUploads;
97
+ this.emitState();
98
+ if (this.downloadQueue.length > 0) this.scheduleDownload();
99
+ }
100
+ dispose() {
101
+ if (this.uploadTimer) clearTimeout(this.uploadTimer);
102
+ if (this.downloadTimer) clearTimeout(this.downloadTimer);
103
+ this.uploadTimer = null;
104
+ this.downloadTimer = null;
105
+ this.uploadQueue = [];
106
+ this.downloadQueue = [];
107
+ this.uploading.clear();
108
+ this.downloading.clear();
109
+ this.remotePendingUploads = 0;
110
+ this.lastErrorAtMs = null;
111
+ this.emitState();
112
+ }
113
+ scheduleUpload() {
114
+ if (this.uploadTimer) return;
115
+ this.uploadTimer = setTimeout(() => {
116
+ this.uploadTimer = null;
117
+ void this.processNextUpload();
118
+ }, this.opts.uploadThrottleMs ?? 300);
119
+ }
120
+ scheduleDownload() {
121
+ if (this.downloadTimer) return;
122
+ this.downloadTimer = setTimeout(() => {
123
+ this.downloadTimer = null;
124
+ void this.processNextDownload();
125
+ }, this.opts.downloadThrottleMs ?? 500);
126
+ }
127
+ async processNextUpload() {
128
+ const fileId = this.uploadQueue.shift();
129
+ if (!fileId) return;
130
+ if (this.uploading.has(fileId)) return;
131
+ const files = this.opts.excalidrawAPI.getFiles();
132
+ const file = files[fileId];
133
+ if (!file?.dataURL || !file?.mimeType) {
134
+ if (this.uploadQueue.length > 0) this.scheduleUpload();
135
+ return;
136
+ }
137
+ this.uploading.add(fileId);
138
+ this.emitState();
139
+ try {
140
+ const blob = dataURLToBlob(file.dataURL);
141
+ const metadata = {
142
+ fileId,
143
+ mimeType: file.mimeType,
144
+ byteLength: blob.size,
145
+ sha256: await sha256Hex(blob)
146
+ };
147
+ if (this.opts.fileTransfer) {
148
+ await this.opts.fileTransfer.upload({ ...metadata, dataURL: file.dataURL });
149
+ } else {
150
+ const initiateUpload = requireOption(this.opts.initiateUpload, "initiateUpload");
151
+ const finalizeUpload = requireOption(this.opts.finalizeUpload, "finalizeUpload");
152
+ const instructions = await initiateUpload(metadata);
153
+ const res = await fetch(instructions.uploadUrl, {
154
+ method: instructions.method,
155
+ headers: instructions.headers,
156
+ body: blob
157
+ });
158
+ if (!res.ok) throw new Error(`upload failed: ${res.status}`);
159
+ await finalizeUpload(instructions.uploadId);
160
+ }
161
+ updateImageStatus(this.opts.excalidrawAPI, fileId, "saved");
162
+ } catch {
163
+ this.lastErrorAtMs = Date.now();
164
+ updateImageStatus(this.opts.excalidrawAPI, fileId, "error");
165
+ } finally {
166
+ this.uploading.delete(fileId);
167
+ this.emitState();
168
+ if (this.uploadQueue.length > 0) this.scheduleUpload();
169
+ }
170
+ }
171
+ async processNextDownload() {
172
+ const fileId = this.downloadQueue.shift();
173
+ if (!fileId) return;
174
+ if (this.downloading.has(fileId)) return;
175
+ this.downloading.add(fileId);
176
+ this.emitState();
177
+ try {
178
+ let mimeType;
179
+ let dataURL;
180
+ if (this.opts.fileTransfer) {
181
+ const file = await this.opts.fileTransfer.download(fileId);
182
+ mimeType = normalizeMimeType(file.mimeType);
183
+ dataURL = toDataURL(file.dataURL);
184
+ } else {
185
+ const presignDownload = requireOption(this.opts.presignDownload, "presignDownload");
186
+ const { downloadUrl } = await presignDownload(fileId);
187
+ const res = await fetch(downloadUrl);
188
+ if (res.status === 404) {
189
+ this.lastErrorAtMs = Date.now();
190
+ updateImageStatus(this.opts.excalidrawAPI, fileId, "error");
191
+ return;
192
+ }
193
+ if (!res.ok) throw new Error(`download failed: ${res.status}`);
194
+ mimeType = normalizeMimeType(res.headers.get("content-type") ?? "image/png");
195
+ dataURL = toDataURL(await blobToDataURL(await res.blob()));
196
+ }
197
+ this.opts.excalidrawAPI.addFiles([
198
+ {
199
+ id: toFileId(fileId),
200
+ mimeType,
201
+ dataURL,
202
+ created: Date.now(),
203
+ lastRetrieved: Date.now()
204
+ }
205
+ ]);
206
+ } catch {
207
+ this.lastErrorAtMs = Date.now();
208
+ } finally {
209
+ this.downloading.delete(fileId);
210
+ this.emitState();
211
+ if (this.downloadQueue.length > 0) this.scheduleDownload();
212
+ }
213
+ }
214
+ emitState() {
215
+ const uploadQueued = this.uploadQueue.length;
216
+ const uploading = this.uploading.size;
217
+ const downloadQueued = this.downloadQueue.length;
218
+ const downloading = this.downloading.size;
219
+ const phase = uploading > 0 || uploadQueued > 0 ? "uploading" : this.remotePendingUploads > 0 ? "awaiting_remote_upload" : downloading > 0 || downloadQueued > 0 ? "downloading" : this.lastErrorAtMs && Date.now() - this.lastErrorAtMs < 4e3 ? "error" : "idle";
220
+ this.opts.onStateChange?.({
221
+ phase,
222
+ uploading,
223
+ uploadQueued,
224
+ remotePendingUploads: this.remotePendingUploads,
225
+ downloading,
226
+ downloadQueued,
227
+ lastErrorAtMs: this.lastErrorAtMs
228
+ });
229
+ }
230
+ };
231
+ function requireOption(value, name) {
232
+ if (value === void 0) throw new Error(`whiteboard file sync requires ${name}`);
233
+ return value;
234
+ }
235
+
236
+ // src/collab/presence.ts
237
+ var CURSOR_COLORS = [
238
+ { stroke: "#FF5D5D", background: "rgba(255, 93, 93, 0.2)" },
239
+ { stroke: "#4CB9FF", background: "rgba(76, 185, 255, 0.2)" },
240
+ { stroke: "#8B5CF6", background: "rgba(139, 92, 246, 0.2)" },
241
+ { stroke: "#10B981", background: "rgba(16, 185, 129, 0.2)" },
242
+ { stroke: "#F59E0B", background: "rgba(245, 158, 11, 0.2)" },
243
+ { stroke: "#EC4899", background: "rgba(236, 72, 153, 0.2)" },
244
+ { stroke: "#22D3EE", background: "rgba(34, 211, 238, 0.2)" },
245
+ { stroke: "#A3E635", background: "rgba(163, 230, 53, 0.2)" }
246
+ ];
247
+ var getCursorColor = (id) => {
248
+ let hash = 0;
249
+ for (let i = 0; i < id.length; i += 1) {
250
+ hash = (hash << 5) - hash + id.charCodeAt(i);
251
+ hash |= 0;
252
+ }
253
+ const index = Math.abs(hash) % CURSOR_COLORS.length;
254
+ return CURSOR_COLORS[index];
255
+ };
256
+ var toSocketId = (value) => value;
257
+ var WhiteboardPresence = class {
258
+ constructor(opts) {
259
+ this.opts = opts;
260
+ this.pruneInterval = setInterval(() => this.pruneStale(), 1e3);
261
+ }
262
+ opts;
263
+ lastCursorSend = 0;
264
+ collaborators = /* @__PURE__ */ new Map();
265
+ pruneInterval = null;
266
+ dispose() {
267
+ if (this.pruneInterval) clearInterval(this.pruneInterval);
268
+ this.pruneInterval = null;
269
+ this.collaborators.clear();
270
+ }
271
+ handlePointerUpdate(payload) {
272
+ const now = Date.now();
273
+ if (now - this.lastCursorSend < this.opts.throttleMs) return;
274
+ this.lastCursorSend = now;
275
+ this.opts.sendCursor(payload.pointer);
276
+ }
277
+ handleRemoteCursor(payload) {
278
+ const ts = payload.timestamp instanceof Date ? payload.timestamp.getTime() : Date.now();
279
+ this.collaborators.set(payload.participantId, {
280
+ pointer: { x: payload.x, y: payload.y, tool: "pointer", renderCursor: true },
281
+ username: payload.displayName,
282
+ color: getCursorColor(payload.participantId),
283
+ id: payload.participantId,
284
+ socketId: toSocketId(payload.participantId),
285
+ _ts: ts
286
+ });
287
+ this.apply();
288
+ }
289
+ pruneStale() {
290
+ const now = Date.now();
291
+ let changed = false;
292
+ for (const [id, c] of this.collaborators) {
293
+ if (now - c._ts > this.opts.staleMs) {
294
+ this.collaborators.delete(id);
295
+ changed = true;
296
+ }
297
+ }
298
+ if (changed) this.apply();
299
+ }
300
+ apply() {
301
+ const map = /* @__PURE__ */ new Map();
302
+ for (const [id, c] of this.collaborators) {
303
+ const { _ts, ...rest } = c;
304
+ map.set(toSocketId(id), rest);
305
+ }
306
+ this.opts.excalidrawAPI.updateScene({ collaborators: map });
307
+ }
308
+ };
309
+
310
+ // src/collab/syncable.ts
311
+ import { isInvisiblySmallElement } from "@excalidraw/excalidraw";
312
+ var filterSyncableElements = (elements) => elements.filter((el) => {
313
+ if (el.isDeleted) return true;
314
+ return !isInvisiblySmallElement(el);
315
+ });
316
+
317
+ // src/collab/wire.ts
318
+ var wireElementKeys = ["id", "type", "version", "version_nonce", "index", "is_deleted", "payload"];
319
+ var wireElementValidators = [
320
+ (value) => isNonEmptyString(value.id),
321
+ (value) => isNonEmptyString(value.type),
322
+ (value) => isNonNegativeSafeInteger(value.version),
323
+ (value) => isNonNegativeSafeInteger(value.version_nonce),
324
+ (value) => isNonEmptyString(value.index),
325
+ (value) => typeof value.is_deleted === "boolean",
326
+ (value) => isRecord(value.payload) && isJsonValue(value.payload)
327
+ ];
328
+ function toWireElement(element) {
329
+ return {
330
+ id: element.id,
331
+ type: element.type,
332
+ version: element.version,
333
+ version_nonce: element.versionNonce,
334
+ index: element.index,
335
+ is_deleted: element.isDeleted,
336
+ payload: toJsonRecord(element)
337
+ };
338
+ }
339
+ function fromWireElement(element) {
340
+ if (!isWireElement(element)) {
341
+ throw new Error("invalid whiteboard-v1 element");
342
+ }
343
+ return {
344
+ ...element.payload,
345
+ id: element.id,
346
+ type: element.type,
347
+ version: element.version,
348
+ versionNonce: element.version_nonce,
349
+ index: element.index,
350
+ isDeleted: element.is_deleted
351
+ };
352
+ }
353
+ function isWireElement(value) {
354
+ if (!isRecord(value) || !hasExactKeys(value, wireElementKeys)) {
355
+ return false;
356
+ }
357
+ return wireElementValidators.every((validate) => validate(value));
358
+ }
359
+ function toJsonRecord(value) {
360
+ if (!isRecord(value)) throw new Error("Excalidraw element is not JSON serializable");
361
+ return normalizeJsonRecord(value, 0);
362
+ }
363
+ function normalizeJsonRecord(value, depth) {
364
+ assertJsonDepth(depth);
365
+ const entries = [];
366
+ for (const [key, item] of Object.entries(value)) {
367
+ if (item === void 0) continue;
368
+ entries.push([key, normalizeJsonValue(item, depth + 1)]);
369
+ }
370
+ return Object.fromEntries(entries);
371
+ }
372
+ function normalizeJsonValue(value, depth) {
373
+ assertJsonDepth(depth);
374
+ if (Array.isArray(value)) return value.map((item) => normalizeJsonValue(item, depth + 1));
375
+ if (isRecord(value)) return normalizeJsonRecord(value, depth);
376
+ if (isJsonPrimitive(value)) return value;
377
+ throw new Error("Excalidraw element is not JSON serializable");
378
+ }
379
+ function assertJsonDepth(depth) {
380
+ if (depth > 16) throw new Error("Excalidraw element is not JSON serializable");
381
+ }
382
+ function isJsonValue(value, depth = 0) {
383
+ if (depth > 16) return false;
384
+ if (Array.isArray(value)) return value.every((item) => isJsonValue(item, depth + 1));
385
+ if (isRecord(value)) return Object.values(value).every((item) => isJsonValue(item, depth + 1));
386
+ return isJsonPrimitive(value);
387
+ }
388
+ function isJsonPrimitive(value) {
389
+ if (value === null) return true;
390
+ if (typeof value === "number") return Number.isFinite(value);
391
+ return typeof value === "boolean" || typeof value === "string";
392
+ }
393
+ function isNonEmptyString(value) {
394
+ return typeof value === "string" && value.length > 0;
395
+ }
396
+ function isNonNegativeSafeInteger(value) {
397
+ return Number.isSafeInteger(value) && Number(value) >= 0;
398
+ }
399
+ function isRecord(value) {
400
+ return typeof value === "object" && value !== null && !Array.isArray(value);
401
+ }
402
+ function hasExactKeys(value, keys) {
403
+ return Object.keys(value).length === keys.length && keys.every((key) => Object.hasOwn(value, key));
404
+ }
405
+
406
+ // src/collab/engine.ts
407
+ var FULL_SYNC_INTERVAL_MS = 2e4;
408
+ var CHANGE_DEBOUNCE_MS = 150;
409
+ var CURSOR_THROTTLE_MS = 16;
410
+ var CURSOR_STALE_MS = 1e4;
411
+ var asArray = (value) => Array.isArray(value) ? value : [];
412
+ var toReconcileRemoteElements = (elements) => elements;
413
+ var ExcalidrawCollabEngine = class {
414
+ constructor(opts) {
415
+ this.opts = opts;
416
+ this.canDraw = opts.canDraw;
417
+ this.filesSync = new WhiteboardFilesSync({
418
+ excalidrawAPI: opts.excalidrawAPI,
419
+ fileTransfer: opts.fileTransfer,
420
+ initiateUpload: opts.initiateUpload,
421
+ finalizeUpload: opts.finalizeUpload,
422
+ presignDownload: opts.presignDownload,
423
+ uploadThrottleMs: 300,
424
+ downloadThrottleMs: 500,
425
+ onStateChange: opts.onFileSyncStateChange
426
+ });
427
+ this.presence = new WhiteboardPresence({
428
+ excalidrawAPI: opts.excalidrawAPI,
429
+ sendCursor: opts.sendCursor,
430
+ throttleMs: CURSOR_THROTTLE_MS,
431
+ staleMs: CURSOR_STALE_MS
432
+ });
433
+ this.unsubPointerUp = opts.excalidrawAPI.onPointerUp?.(() => this.flushNow());
434
+ this.unsubscribe = opts.subscribe((event) => this.handleRemoteEvent(event));
435
+ }
436
+ opts;
437
+ sceneId = null;
438
+ sceneGeneration = null;
439
+ canDraw = true;
440
+ lastBroadcastedOrReceivedElementsHash = 0;
441
+ broadcastedElementVersions = /* @__PURE__ */ new Map();
442
+ submissionInFlight = false;
443
+ dirtyDuringSubmission = false;
444
+ changeDebounce = null;
445
+ fullSyncTimer = null;
446
+ filesSync;
447
+ presence;
448
+ unsubPointerUp;
449
+ unsubscribe;
450
+ setCanDraw(next) {
451
+ this.canDraw = next;
452
+ }
453
+ async clear() {
454
+ if (!this.canDraw) throw new Error("whiteboard drawing is not permitted");
455
+ const commit = await this.opts.clear();
456
+ this.sceneId = commit.sceneId;
457
+ this.sceneGeneration = commit.sceneGeneration ?? null;
458
+ this.broadcastedElementVersions.clear();
459
+ this.lastBroadcastedOrReceivedElementsHash = 0;
460
+ this.opts.excalidrawAPI.updateScene({
461
+ elements: [],
462
+ captureUpdate: CaptureUpdateAction2.NEVER
463
+ });
464
+ return commit;
465
+ }
466
+ dispose() {
467
+ if (this.changeDebounce) clearTimeout(this.changeDebounce);
468
+ if (this.fullSyncTimer) clearTimeout(this.fullSyncTimer);
469
+ this.changeDebounce = null;
470
+ this.fullSyncTimer = null;
471
+ this.filesSync.dispose();
472
+ this.presence.dispose();
473
+ this.unsubscribe();
474
+ this.unsubPointerUp?.();
475
+ }
476
+ handleChange(_elements, _appState, files) {
477
+ const elementsAll = this.opts.excalidrawAPI.getSceneElementsIncludingDeleted();
478
+ this.filesSync.handleLocalScene(elementsAll, files);
479
+ if (!this.canDraw) return;
480
+ if (this.changeDebounce) clearTimeout(this.changeDebounce);
481
+ this.changeDebounce = setTimeout(() => {
482
+ this.changeDebounce = null;
483
+ this.flushNow();
484
+ }, CHANGE_DEBOUNCE_MS);
485
+ }
486
+ handlePointerUpdate(payload) {
487
+ this.presence.handlePointerUpdate(payload);
488
+ }
489
+ handleRemoteCursor(payload) {
490
+ this.presence.handleRemoteCursor(payload);
491
+ }
492
+ handleRemoteEvent(event) {
493
+ switch (event.type) {
494
+ case "snapshot":
495
+ this.handleRemoteSnapshot({
496
+ sceneId: event.sceneId,
497
+ ...event.sceneGeneration ? { sceneGeneration: event.sceneGeneration } : {},
498
+ elements: event.elements,
499
+ appState: event.appState
500
+ });
501
+ return;
502
+ case "update":
503
+ this.handleRemoteData({
504
+ sceneId: event.sceneId,
505
+ ...event.sceneGeneration ? { sceneGeneration: event.sceneGeneration } : {},
506
+ syncAll: false,
507
+ elements: event.elements
508
+ });
509
+ return;
510
+ case "cursor":
511
+ this.handleRemoteCursor({
512
+ participantId: event.participantId,
513
+ displayName: event.displayName,
514
+ x: event.x,
515
+ y: event.y,
516
+ timestamp: new Date(event.occurredAt)
517
+ });
518
+ return;
519
+ case "reset_required":
520
+ void this.opts.requestSnapshot().catch(this.opts.onSubmissionError);
521
+ }
522
+ }
523
+ handleRemoteData(payload) {
524
+ this.applyRemoteElements({
525
+ sceneId: payload.sceneId,
526
+ ...payload.sceneGeneration ? { sceneGeneration: payload.sceneGeneration } : {},
527
+ syncAll: payload.syncAll,
528
+ remoteElements: payload.elements.map(fromWireElement),
529
+ isSnapshot: false
530
+ });
531
+ }
532
+ handleRemoteSnapshot(payload) {
533
+ this.applyRemoteElements({
534
+ sceneId: payload.sceneId,
535
+ ...payload.sceneGeneration ? { sceneGeneration: payload.sceneGeneration } : {},
536
+ syncAll: true,
537
+ remoteElements: payload.elements.map(fromWireElement),
538
+ appState: payload.appState,
539
+ isSnapshot: true
540
+ });
541
+ }
542
+ flushNow() {
543
+ const context = this.submissionContext();
544
+ if (!context) return;
545
+ const elementsHash = hashElementsVersion(context.elements);
546
+ if (elementsHash === this.lastBroadcastedOrReceivedElementsHash) return;
547
+ const syncableAll = filterSyncableElements(context.elements);
548
+ const delta = [];
549
+ for (const el of syncableAll) {
550
+ const prev = this.broadcastedElementVersions.get(el.id) ?? 0;
551
+ if (!prev || el.version > prev) delta.push(el);
552
+ }
553
+ if (delta.length === 0) return;
554
+ this.submit(context.sceneId, context.sceneGeneration ?? null, false, delta, elementsHash);
555
+ }
556
+ scheduleFullSync() {
557
+ if (this.fullSyncTimer) return;
558
+ this.fullSyncTimer = setTimeout(() => {
559
+ this.fullSyncTimer = null;
560
+ this.sendFullSync();
561
+ }, FULL_SYNC_INTERVAL_MS);
562
+ }
563
+ sendFullSync() {
564
+ const context = this.submissionContext();
565
+ if (!context) return;
566
+ const syncableAll = filterSyncableElements(context.elements);
567
+ this.submit(context.sceneId, context.sceneGeneration ?? null, true, syncableAll, hashElementsVersion(context.elements));
568
+ }
569
+ submissionContext() {
570
+ if (!this.canDraw) return null;
571
+ if (!this.sceneId) {
572
+ void this.opts.requestSnapshot().catch(this.opts.onSubmissionError);
573
+ return null;
574
+ }
575
+ if (this.submissionInFlight) {
576
+ this.dirtyDuringSubmission = true;
577
+ return null;
578
+ }
579
+ return {
580
+ sceneId: this.sceneId,
581
+ ...this.sceneGeneration ? { sceneGeneration: this.sceneGeneration } : {},
582
+ elements: this.opts.excalidrawAPI.getSceneElementsIncludingDeleted()
583
+ };
584
+ }
585
+ submit(sceneId, sceneGeneration, syncAll, elements, elementsHash) {
586
+ this.submissionInFlight = true;
587
+ this.dirtyDuringSubmission = false;
588
+ void this.opts.submitUpdate({
589
+ sceneId,
590
+ ...sceneGeneration ? { sceneGeneration } : {},
591
+ syncAll,
592
+ elements: elements.map(toWireElement)
593
+ }).then((commit) => {
594
+ if (commit.sceneId !== sceneId || this.sceneId !== sceneId || this.sceneGeneration !== sceneGeneration) {
595
+ void this.opts.requestSnapshot();
596
+ return;
597
+ }
598
+ for (const element of elements) {
599
+ this.broadcastedElementVersions.set(element.id, element.version);
600
+ }
601
+ this.lastBroadcastedOrReceivedElementsHash = elementsHash;
602
+ this.scheduleFullSync();
603
+ }).catch(this.opts.onSubmissionError).finally(() => {
604
+ this.submissionInFlight = false;
605
+ if (this.dirtyDuringSubmission) this.flushNow();
606
+ });
607
+ }
608
+ applyRemoteElements(args) {
609
+ const remoteSceneId = args.sceneId;
610
+ if (!this.sceneId) {
611
+ this.sceneId = remoteSceneId;
612
+ } else if (args.isSnapshot) {
613
+ if (remoteSceneId !== this.sceneId) {
614
+ this.sceneId = remoteSceneId;
615
+ this.broadcastedElementVersions.clear();
616
+ this.lastBroadcastedOrReceivedElementsHash = 0;
617
+ }
618
+ } else if (remoteSceneId !== this.sceneId) {
619
+ if (args.syncAll && asArray(args.remoteElements).length === 0) {
620
+ this.sceneId = remoteSceneId;
621
+ this.broadcastedElementVersions.clear();
622
+ this.lastBroadcastedOrReceivedElementsHash = 0;
623
+ } else {
624
+ void this.opts.requestSnapshot().catch(this.opts.onSubmissionError);
625
+ return;
626
+ }
627
+ }
628
+ if (args.sceneGeneration) this.sceneGeneration = args.sceneGeneration;
629
+ const excalidrawAPI = this.opts.excalidrawAPI;
630
+ const local = excalidrawAPI.getSceneElementsIncludingDeleted();
631
+ const remoteElements = args.remoteElements;
632
+ const restoredRemote = restoreElements(remoteElements, local);
633
+ const remoteForReconcile = toReconcileRemoteElements(restoredRemote);
634
+ const reconciled = reconcileElements(local, remoteForReconcile, excalidrawAPI.getAppState());
635
+ this.lastBroadcastedOrReceivedElementsHash = hashElementsVersion(reconciled);
636
+ this.broadcastedElementVersions.clear();
637
+ for (const el of reconciled) {
638
+ this.broadcastedElementVersions.set(el.id, el.version);
639
+ }
640
+ excalidrawAPI.updateScene({
641
+ elements: reconciled,
642
+ appState: args.appState,
643
+ captureUpdate: CaptureUpdateAction2.NEVER
644
+ });
645
+ this.filesSync.handleRemoteScene(reconciled);
646
+ }
647
+ };
648
+
649
+ export {
650
+ toWireElement,
651
+ fromWireElement,
652
+ isWireElement,
653
+ ExcalidrawCollabEngine
654
+ };