@xrift/world-components 0.47.0 → 0.50.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 (330) hide show
  1. package/dist/components/BillboardY/hooks.d.ts +1 -1
  2. package/dist/components/BillboardY/hooks.d.ts.map +1 -1
  3. package/dist/components/BillboardY/index.d.ts +1 -1
  4. package/dist/components/BillboardY/index.d.ts.map +1 -1
  5. package/dist/components/DevEnvironment/components/ControlsHelp.d.ts +1 -1
  6. package/dist/components/DevEnvironment/components/ControlsHelp.d.ts.map +1 -1
  7. package/dist/components/DevEnvironment/components/Crosshair.d.ts +1 -1
  8. package/dist/components/DevEnvironment/components/Crosshair.d.ts.map +1 -1
  9. package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts +1 -1
  10. package/dist/components/DevEnvironment/components/GrabSystem/index.d.ts.map +1 -1
  11. package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts +1 -1
  12. package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts.map +1 -1
  13. package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts +1 -1
  14. package/dist/components/DevEnvironment/components/PointerLockStatus.d.ts.map +1 -1
  15. package/dist/components/DevEnvironment/index.d.ts +1 -1
  16. package/dist/components/DevEnvironment/index.d.ts.map +1 -1
  17. package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts +1 -1
  18. package/dist/components/EntryLogBoard/components/AvatarIcon.d.ts.map +1 -1
  19. package/dist/components/EntryLogBoard/components/LogRow.d.ts +1 -1
  20. package/dist/components/EntryLogBoard/components/LogRow.d.ts.map +1 -1
  21. package/dist/components/EntryLogBoard/index.d.ts +1 -1
  22. package/dist/components/EntryLogBoard/index.d.ts.map +1 -1
  23. package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts +1 -1
  24. package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts.map +1 -1
  25. package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts +1 -1
  26. package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts.map +1 -1
  27. package/dist/components/LiveVideoPlayer/index.d.ts +1 -1
  28. package/dist/components/LiveVideoPlayer/index.d.ts.map +1 -1
  29. package/dist/components/Mirror/index.d.ts +1 -1
  30. package/dist/components/Mirror/index.d.ts.map +1 -1
  31. package/dist/components/Portal/components/PortalGlow/index.d.ts +1 -1
  32. package/dist/components/Portal/components/PortalGlow/index.d.ts.map +1 -1
  33. package/dist/components/Portal/components/PortalParticles/index.d.ts +1 -1
  34. package/dist/components/Portal/components/PortalParticles/index.d.ts.map +1 -1
  35. package/dist/components/Portal/components/PortalPedestal/index.d.ts +1 -1
  36. package/dist/components/Portal/components/PortalPedestal/index.d.ts.map +1 -1
  37. package/dist/components/Portal/components/PortalThumbnail/index.d.ts +1 -1
  38. package/dist/components/Portal/components/PortalThumbnail/index.d.ts.map +1 -1
  39. package/dist/components/Portal/components/PortalVortex/index.d.ts +1 -1
  40. package/dist/components/Portal/components/PortalVortex/index.d.ts.map +1 -1
  41. package/dist/components/Portal/index.d.ts +1 -1
  42. package/dist/components/Portal/index.d.ts.map +1 -1
  43. package/dist/components/ScreenShareDisplay/index.d.ts +1 -1
  44. package/dist/components/ScreenShareDisplay/index.d.ts.map +1 -1
  45. package/dist/components/Seat/constants.d.ts +8 -0
  46. package/dist/components/Seat/constants.d.ts.map +1 -0
  47. package/dist/components/Seat/constants.js +7 -0
  48. package/dist/components/Seat/constants.js.map +1 -0
  49. package/dist/components/Seat/index.d.ts +15 -0
  50. package/dist/components/Seat/index.d.ts.map +1 -0
  51. package/dist/components/Seat/index.js +45 -0
  52. package/dist/components/Seat/index.js.map +1 -0
  53. package/dist/components/Seat/types.d.ts +39 -0
  54. package/dist/components/Seat/types.d.ts.map +1 -0
  55. package/dist/components/Seat/types.js.map +1 -0
  56. package/dist/components/Seat/utils.d.ts +24 -0
  57. package/dist/components/Seat/utils.d.ts.map +1 -0
  58. package/dist/components/Seat/utils.js +50 -0
  59. package/dist/components/Seat/utils.js.map +1 -0
  60. package/dist/components/Skybox/index.d.ts +1 -1
  61. package/dist/components/Skybox/index.d.ts.map +1 -1
  62. package/dist/components/TagBoard/components/TagChip.d.ts +1 -1
  63. package/dist/components/TagBoard/components/TagChip.d.ts.map +1 -1
  64. package/dist/components/TagBoard/components/TagDisplay/index.d.ts +1 -1
  65. package/dist/components/TagBoard/components/TagDisplay/index.d.ts.map +1 -1
  66. package/dist/components/TagBoard/components/TagSelector/components/ActionButton.d.ts +1 -1
  67. package/dist/components/TagBoard/components/TagSelector/components/ActionButton.d.ts.map +1 -1
  68. package/dist/components/TagBoard/components/TagSelector/components/TagButton.d.ts +1 -1
  69. package/dist/components/TagBoard/components/TagSelector/components/TagButton.d.ts.map +1 -1
  70. package/dist/components/TagBoard/components/TagSelector/index.d.ts +1 -1
  71. package/dist/components/TagBoard/components/TagSelector/index.d.ts.map +1 -1
  72. package/dist/components/TagBoard/index.d.ts +1 -1
  73. package/dist/components/TagBoard/index.d.ts.map +1 -1
  74. package/dist/components/Video180Sphere/EyeView.d.ts +1 -1
  75. package/dist/components/Video180Sphere/EyeView.d.ts.map +1 -1
  76. package/dist/components/Video180Sphere/index.d.ts +1 -1
  77. package/dist/components/Video180Sphere/index.d.ts.map +1 -1
  78. package/dist/components/VideoPlayer/components/ControlPanel.d.ts +1 -1
  79. package/dist/components/VideoPlayer/components/ControlPanel.d.ts.map +1 -1
  80. package/dist/components/VideoPlayer/index.d.ts +1 -1
  81. package/dist/components/VideoPlayer/index.d.ts.map +1 -1
  82. package/dist/components/VideoScreen/constants.d.ts +27 -0
  83. package/dist/components/VideoScreen/constants.d.ts.map +1 -0
  84. package/dist/components/VideoScreen/constants.js +27 -0
  85. package/dist/components/VideoScreen/constants.js.map +1 -0
  86. package/dist/components/VideoScreen/hooks.d.ts +19 -0
  87. package/dist/components/VideoScreen/hooks.d.ts.map +1 -0
  88. package/dist/components/VideoScreen/hooks.js +69 -0
  89. package/dist/components/VideoScreen/hooks.js.map +1 -0
  90. package/dist/components/VideoScreen/index.d.ts +1 -1
  91. package/dist/components/VideoScreen/index.d.ts.map +1 -1
  92. package/dist/components/VideoScreen/index.js +22 -17
  93. package/dist/components/VideoScreen/index.js.map +1 -1
  94. package/dist/components/VideoScreen/types.d.ts +14 -4
  95. package/dist/components/VideoScreen/types.d.ts.map +1 -1
  96. package/dist/components/VideoScreen/utils.d.ts +73 -0
  97. package/dist/components/VideoScreen/utils.d.ts.map +1 -0
  98. package/dist/components/VideoScreen/utils.js +74 -0
  99. package/dist/components/VideoScreen/utils.js.map +1 -0
  100. package/dist/components/commons/IconButton/index.d.ts +1 -1
  101. package/dist/components/commons/IconButton/index.d.ts.map +1 -1
  102. package/dist/components/commons/PlaceholderScreen/index.d.ts +1 -1
  103. package/dist/components/commons/PlaceholderScreen/index.d.ts.map +1 -1
  104. package/dist/components/commons/VideoMesh/index.d.ts +1 -1
  105. package/dist/components/commons/VideoMesh/index.d.ts.map +1 -1
  106. package/dist/components/commons/VolumeControl/index.d.ts +1 -1
  107. package/dist/components/commons/VolumeControl/index.d.ts.map +1 -1
  108. package/dist/contexts/AudioVolumeContext.d.ts +2 -2
  109. package/dist/contexts/AudioVolumeContext.d.ts.map +1 -1
  110. package/dist/contexts/ConfirmContext.d.ts +1 -1
  111. package/dist/contexts/ConfirmContext.d.ts.map +1 -1
  112. package/dist/contexts/FileInputContext.d.ts +1 -1
  113. package/dist/contexts/FileInputContext.d.ts.map +1 -1
  114. package/dist/contexts/GrabbableContext.d.ts +1 -1
  115. package/dist/contexts/GrabbableContext.d.ts.map +1 -1
  116. package/dist/contexts/InstanceContext.d.ts +1 -1
  117. package/dist/contexts/InstanceContext.d.ts.map +1 -1
  118. package/dist/contexts/InstanceEventContext.d.ts +1 -1
  119. package/dist/contexts/InstanceEventContext.d.ts.map +1 -1
  120. package/dist/contexts/InstanceStateContext.d.ts +1 -1
  121. package/dist/contexts/InstanceStateContext.d.ts.map +1 -1
  122. package/dist/contexts/ItemContext.d.ts +23 -3
  123. package/dist/contexts/ItemContext.d.ts.map +1 -1
  124. package/dist/contexts/ItemContext.js +7 -3
  125. package/dist/contexts/ItemContext.js.map +1 -1
  126. package/dist/contexts/PlacementStateContext.d.ts +1 -1
  127. package/dist/contexts/PlacementStateContext.d.ts.map +1 -1
  128. package/dist/contexts/ScreenShareContext.d.ts +1 -1
  129. package/dist/contexts/ScreenShareContext.d.ts.map +1 -1
  130. package/dist/contexts/SeatContext.d.ts +77 -0
  131. package/dist/contexts/SeatContext.d.ts.map +1 -0
  132. package/dist/contexts/SeatContext.js +33 -0
  133. package/dist/contexts/SeatContext.js.map +1 -0
  134. package/dist/contexts/ServerClockContext.d.ts +1 -1
  135. package/dist/contexts/ServerClockContext.d.ts.map +1 -1
  136. package/dist/contexts/SharedFileContext.d.ts +1 -1
  137. package/dist/contexts/SharedFileContext.d.ts.map +1 -1
  138. package/dist/contexts/SpawnPointContext.d.ts +1 -1
  139. package/dist/contexts/SpawnPointContext.d.ts.map +1 -1
  140. package/dist/contexts/TeleportContext.d.ts +1 -1
  141. package/dist/contexts/TeleportContext.d.ts.map +1 -1
  142. package/dist/contexts/TextInputContext.d.ts +1 -1
  143. package/dist/contexts/TextInputContext.d.ts.map +1 -1
  144. package/dist/contexts/UsersContext.d.ts +1 -1
  145. package/dist/contexts/UsersContext.d.ts.map +1 -1
  146. package/dist/contexts/WorldContext.d.ts +1 -1
  147. package/dist/contexts/WorldContext.d.ts.map +1 -1
  148. package/dist/contexts/WorldStorageContext.d.ts +1 -1
  149. package/dist/contexts/WorldStorageContext.d.ts.map +1 -1
  150. package/dist/contexts/XRiftContext.d.ts +7 -1
  151. package/dist/contexts/XRiftContext.d.ts.map +1 -1
  152. package/dist/contexts/XRiftContext.js +3 -1
  153. package/dist/contexts/XRiftContext.js.map +1 -1
  154. package/dist/index.d.ts +5 -1
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +4 -0
  157. package/dist/index.js.map +1 -1
  158. package/package.json +7 -5
  159. package/dist/components/BillboardY/__tests__/utils.test.d.ts +0 -2
  160. package/dist/components/BillboardY/__tests__/utils.test.d.ts.map +0 -1
  161. package/dist/components/BillboardY/__tests__/utils.test.js +0 -45
  162. package/dist/components/BillboardY/__tests__/utils.test.js.map +0 -1
  163. package/dist/components/DevEnvironment/__tests__/utils.test.d.ts +0 -2
  164. package/dist/components/DevEnvironment/__tests__/utils.test.d.ts.map +0 -1
  165. package/dist/components/DevEnvironment/__tests__/utils.test.js +0 -24
  166. package/dist/components/DevEnvironment/__tests__/utils.test.js.map +0 -1
  167. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts +0 -2
  168. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.d.ts.map +0 -1
  169. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js +0 -114
  170. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/store.test.js.map +0 -1
  171. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts +0 -2
  172. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.d.ts.map +0 -1
  173. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js +0 -103
  174. package/dist/components/DevEnvironment/components/GrabSystem/__tests__/utils.test.js.map +0 -1
  175. package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts +0 -2
  176. package/dist/components/EntryLogBoard/__tests__/utils.test.d.ts.map +0 -1
  177. package/dist/components/EntryLogBoard/__tests__/utils.test.js +0 -231
  178. package/dist/components/EntryLogBoard/__tests__/utils.test.js.map +0 -1
  179. package/dist/components/Grabbable/__tests__/utils.test.d.ts +0 -2
  180. package/dist/components/Grabbable/__tests__/utils.test.d.ts.map +0 -1
  181. package/dist/components/Grabbable/__tests__/utils.test.js +0 -59
  182. package/dist/components/Grabbable/__tests__/utils.test.js.map +0 -1
  183. package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts +0 -8
  184. package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts.map +0 -1
  185. package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.js +0 -11
  186. package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.js.map +0 -1
  187. package/dist/components/LiveVideoPlayer/components/index.d.ts +0 -3
  188. package/dist/components/LiveVideoPlayer/components/index.d.ts.map +0 -1
  189. package/dist/components/LiveVideoPlayer/components/index.js +0 -3
  190. package/dist/components/LiveVideoPlayer/components/index.js.map +0 -1
  191. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts +0 -2
  192. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts.map +0 -1
  193. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js +0 -196
  194. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js.map +0 -1
  195. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts +0 -2
  196. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts.map +0 -1
  197. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js +0 -146
  198. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js.map +0 -1
  199. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts +0 -2
  200. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts.map +0 -1
  201. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js +0 -94
  202. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js.map +0 -1
  203. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts +0 -2
  204. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts.map +0 -1
  205. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js +0 -74
  206. package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js.map +0 -1
  207. package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts +0 -25
  208. package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts.map +0 -1
  209. package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js +0 -97
  210. package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js.map +0 -1
  211. package/dist/components/Mirror/__tests__/utils.test.d.ts +0 -2
  212. package/dist/components/Mirror/__tests__/utils.test.d.ts.map +0 -1
  213. package/dist/components/Mirror/__tests__/utils.test.js +0 -42
  214. package/dist/components/Mirror/__tests__/utils.test.js.map +0 -1
  215. package/dist/components/MsdfText/index.d.ts +0 -24
  216. package/dist/components/MsdfText/index.d.ts.map +0 -1
  217. package/dist/components/MsdfText/index.js +0 -24
  218. package/dist/components/MsdfText/index.js.map +0 -1
  219. package/dist/components/Portal/__tests__/utils.test.d.ts +0 -2
  220. package/dist/components/Portal/__tests__/utils.test.d.ts.map +0 -1
  221. package/dist/components/Portal/__tests__/utils.test.js +0 -56
  222. package/dist/components/Portal/__tests__/utils.test.js.map +0 -1
  223. package/dist/components/ScreenShareDisplay/__tests__/utils.test.d.ts +0 -2
  224. package/dist/components/ScreenShareDisplay/__tests__/utils.test.d.ts.map +0 -1
  225. package/dist/components/ScreenShareDisplay/__tests__/utils.test.js +0 -47
  226. package/dist/components/ScreenShareDisplay/__tests__/utils.test.js.map +0 -1
  227. package/dist/components/TroikaText/index.d.ts +0 -4
  228. package/dist/components/TroikaText/index.d.ts.map +0 -1
  229. package/dist/components/TroikaText/index.js +0 -50
  230. package/dist/components/TroikaText/index.js.map +0 -1
  231. package/dist/components/TroikaText/types.d.ts +0 -19
  232. package/dist/components/TroikaText/types.d.ts.map +0 -1
  233. package/dist/components/TroikaText/types.js.map +0 -1
  234. package/dist/components/VideoPlayer/ControlPanel.d.ts +0 -3
  235. package/dist/components/VideoPlayer/ControlPanel.d.ts.map +0 -1
  236. package/dist/components/VideoPlayer/ControlPanel.js +0 -34
  237. package/dist/components/VideoPlayer/ControlPanel.js.map +0 -1
  238. package/dist/components/VideoPlayer/ProgressBar.d.ts +0 -3
  239. package/dist/components/VideoPlayer/ProgressBar.d.ts.map +0 -1
  240. package/dist/components/VideoPlayer/ProgressBar.js +0 -21
  241. package/dist/components/VideoPlayer/ProgressBar.js.map +0 -1
  242. package/dist/components/VideoPlayer/__tests__/utils.test.d.ts +0 -2
  243. package/dist/components/VideoPlayer/__tests__/utils.test.d.ts.map +0 -1
  244. package/dist/components/VideoPlayer/__tests__/utils.test.js +0 -23
  245. package/dist/components/VideoPlayer/__tests__/utils.test.js.map +0 -1
  246. package/dist/components/VideoPlayer/components/ProgressBar.d.ts +0 -12
  247. package/dist/components/VideoPlayer/components/ProgressBar.d.ts.map +0 -1
  248. package/dist/components/VideoPlayer/components/ProgressBar.js +0 -21
  249. package/dist/components/VideoPlayer/components/ProgressBar.js.map +0 -1
  250. package/dist/components/VideoPlayer/components/index.d.ts +0 -3
  251. package/dist/components/VideoPlayer/components/index.d.ts.map +0 -1
  252. package/dist/components/VideoPlayer/components/index.js +0 -3
  253. package/dist/components/VideoPlayer/components/index.js.map +0 -1
  254. package/dist/components/VideoPlayer/types.d.ts +0 -44
  255. package/dist/components/VideoPlayer/types.d.ts.map +0 -1
  256. package/dist/components/VideoPlayer/types.js +0 -2
  257. package/dist/components/VideoPlayer/types.js.map +0 -1
  258. package/dist/components/VideoPlayer/utils.test.d.ts +0 -2
  259. package/dist/components/VideoPlayer/utils.test.d.ts.map +0 -1
  260. package/dist/components/VideoPlayer/utils.test.js +0 -23
  261. package/dist/components/VideoPlayer/utils.test.js.map +0 -1
  262. package/dist/components/commons/utils.test.d.ts +0 -2
  263. package/dist/components/commons/utils.test.d.ts.map +0 -1
  264. package/dist/components/commons/utils.test.js +0 -79
  265. package/dist/components/commons/utils.test.js.map +0 -1
  266. package/dist/contexts/FontContext.d.ts +0 -17
  267. package/dist/contexts/FontContext.d.ts.map +0 -1
  268. package/dist/contexts/FontContext.js +0 -25
  269. package/dist/contexts/FontContext.js.map +0 -1
  270. package/dist/contexts/InstanceInfoContext.d.ts +0 -39
  271. package/dist/contexts/InstanceInfoContext.d.ts.map +0 -1
  272. package/dist/contexts/InstanceInfoContext.js +0 -42
  273. package/dist/contexts/InstanceInfoContext.js.map +0 -1
  274. package/dist/contexts/PortalContext.d.ts +0 -39
  275. package/dist/contexts/PortalContext.d.ts.map +0 -1
  276. package/dist/contexts/PortalContext.js +0 -42
  277. package/dist/contexts/PortalContext.js.map +0 -1
  278. package/dist/contexts/WorldEventContext.d.ts +0 -32
  279. package/dist/contexts/WorldEventContext.d.ts.map +0 -1
  280. package/dist/contexts/WorldEventContext.js +0 -54
  281. package/dist/contexts/WorldEventContext.js.map +0 -1
  282. package/dist/contexts/__tests__/ServerClockContext.test.d.ts +0 -2
  283. package/dist/contexts/__tests__/ServerClockContext.test.d.ts.map +0 -1
  284. package/dist/contexts/__tests__/ServerClockContext.test.js +0 -43
  285. package/dist/contexts/__tests__/ServerClockContext.test.js.map +0 -1
  286. package/dist/contexts/__tests__/WorldStorageContext.test.d.ts +0 -2
  287. package/dist/contexts/__tests__/WorldStorageContext.test.d.ts.map +0 -1
  288. package/dist/contexts/__tests__/WorldStorageContext.test.js +0 -120
  289. package/dist/contexts/__tests__/WorldStorageContext.test.js.map +0 -1
  290. package/dist/fonts/FontContext.d.ts +0 -9
  291. package/dist/fonts/FontContext.d.ts.map +0 -1
  292. package/dist/fonts/FontContext.js +0 -5
  293. package/dist/fonts/FontContext.js.map +0 -1
  294. package/dist/fonts/FontProvider.d.ts +0 -31
  295. package/dist/fonts/FontProvider.d.ts.map +0 -1
  296. package/dist/fonts/FontProvider.js +0 -40
  297. package/dist/fonts/FontProvider.js.map +0 -1
  298. package/dist/fonts/FontReadyContainer.d.ts +0 -35
  299. package/dist/fonts/FontReadyContainer.d.ts.map +0 -1
  300. package/dist/fonts/FontReadyContainer.js +0 -40
  301. package/dist/fonts/FontReadyContainer.js.map +0 -1
  302. package/dist/fonts/constants.d.ts +0 -5
  303. package/dist/fonts/constants.d.ts.map +0 -1
  304. package/dist/fonts/constants.js +0 -5
  305. package/dist/fonts/constants.js.map +0 -1
  306. package/dist/fonts/loadTTF.d.ts +0 -18
  307. package/dist/fonts/loadTTF.d.ts.map +0 -1
  308. package/dist/fonts/loadTTF.js +0 -36
  309. package/dist/fonts/loadTTF.js.map +0 -1
  310. package/dist/fonts/useTTF.d.ts +0 -7
  311. package/dist/fonts/useTTF.d.ts.map +0 -1
  312. package/dist/fonts/useTTF.js +0 -9
  313. package/dist/fonts/useTTF.js.map +0 -1
  314. package/dist/hooks/useJapaneseFont.d.ts +0 -7
  315. package/dist/hooks/useJapaneseFont.d.ts.map +0 -1
  316. package/dist/hooks/useJapaneseFont.js +0 -25
  317. package/dist/hooks/useJapaneseFont.js.map +0 -1
  318. package/dist/hooks/useMsdfFont.d.ts +0 -11
  319. package/dist/hooks/useMsdfFont.d.ts.map +0 -1
  320. package/dist/hooks/useMsdfFont.js +0 -19
  321. package/dist/hooks/useMsdfFont.js.map +0 -1
  322. package/dist/hooks/usePortalNavigation.d.ts +0 -10
  323. package/dist/hooks/usePortalNavigation.d.ts.map +0 -1
  324. package/dist/hooks/usePortalNavigation.js +0 -46
  325. package/dist/hooks/usePortalNavigation.js.map +0 -1
  326. package/dist/hooks/useWorldEvent.d.ts +0 -25
  327. package/dist/hooks/useWorldEvent.d.ts.map +0 -1
  328. package/dist/hooks/useWorldEvent.js +0 -45
  329. package/dist/hooks/useWorldEvent.js.map +0 -1
  330. /package/dist/components/{TroikaText → Seat}/types.js +0 -0
@@ -1,3 +1,3 @@
1
1
  import { type TagDisplayProps } from "../../types";
2
- export declare const TagDisplay: ({ userId, getMovement, getAvatarHeight, tags, visible, instanceStateKey, }: TagDisplayProps) => import("react/jsx-runtime").JSX.Element | null;
2
+ export declare const TagDisplay: ({ userId, getMovement, getAvatarHeight, tags, visible, instanceStateKey, }: TagDisplayProps) => import("react").JSX.Element | null;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagDisplay/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAanD,eAAO,MAAM,UAAU,GAAI,4EAOxB,eAAe,mDAkGjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagDisplay/index.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAanD,eAAO,MAAM,UAAU,GAAI,4EAOxB,eAAe,uCAkGjB,CAAC"}
@@ -9,5 +9,5 @@ export interface ActionButtonProps {
9
9
  onInteract: () => void;
10
10
  interactionText: string;
11
11
  }
12
- export declare const ActionButton: ({ id, label, color, width, height, scale, position, onInteract, interactionText, }: ActionButtonProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const ActionButton: ({ id, label, color, width, height, scale, position, onInteract, interactionText, }: ActionButtonProps) => import("react").JSX.Element;
13
13
  //# sourceMappingURL=ActionButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/ActionButton.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,oFAU1B,iBAAiB,4CAoBnB,CAAC"}
1
+ {"version":3,"file":"ActionButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/ActionButton.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,oFAU1B,iBAAiB,gCAoBnB,CAAC"}
@@ -8,5 +8,5 @@ export interface TagButtonProps {
8
8
  isSelected: boolean;
9
9
  onInteract: () => void;
10
10
  }
11
- export declare const TagButton: ({ tag, width, height, scale, position, isSelected, onInteract, }: TagButtonProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const TagButton: ({ tag, width, height, scale, position, isSelected, onInteract, }: TagButtonProps) => import("react").JSX.Element;
12
12
  //# sourceMappingURL=TagButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TagButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/TagButton.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,SAAS,GAAI,kEAQvB,cAAc,4CA+BhB,CAAC"}
1
+ {"version":3,"file":"TagButton.d.ts","sourceRoot":"","sources":["../../../../../../src/components/TagBoard/components/TagSelector/components/TagButton.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,SAAS,GAAI,kEAQvB,cAAc,gCA+BhB,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import { type TagSelectorProps } from "../../types";
2
- export declare const TagSelector: ({ tags, title, instanceStateKey, position, rotation, scale, tagsVisible, onTagsVisibleChange, }: TagSelectorProps) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const TagSelector: ({ tags, title, instanceStateKey, position, rotation, scale, tagsVisible, onTagsVisibleChange, }: TagSelectorProps) => import("react").JSX.Element;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagSelector/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,WAAW,GAAI,iGASzB,gBAAgB,4CAyGlB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/TagBoard/components/TagSelector/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,eAAO,MAAM,WAAW,GAAI,iGASzB,gBAAgB,gCAyGlB,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { type TagBoardProps } from "./types";
2
2
  export { type TagBoardProps, type Tag } from "./types";
3
- export declare const TagBoard: ({ tags, columns, title, instanceStateKey, position, rotation, scale, }: TagBoardProps) => import("react/jsx-runtime").JSX.Element;
3
+ export declare const TagBoard: ({ tags, columns, title, instanceStateKey, position, rotation, scale, }: TagBoardProps) => import("react").JSX.Element;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagBoard/index.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,wEAQtB,aAAa,4CAiDf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TagBoard/index.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,QAAQ,GAAI,wEAQtB,aAAa,gCAiDf,CAAC"}
@@ -9,6 +9,6 @@ interface EyeViewProps {
9
9
  * 各目用のビューを表示する内部コンポーネント
10
10
  * Three.jsのlayersを使用してVR時に左右の目に適切な映像を表示
11
11
  */
12
- export declare const EyeView: ({ video, eye, radius, segments, placeholderColor }: EyeViewProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const EyeView: ({ video, eye, radius, segments, placeholderColor }: EyeViewProps) => import("react").JSX.Element;
13
13
  export {};
14
14
  //# sourceMappingURL=EyeView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EyeView.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/EyeView.tsx"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,EAAE,gBAAgB,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,oDAAoD,YAAY,4CAiFvF,CAAA"}
1
+ {"version":3,"file":"EyeView.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/EyeView.tsx"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,KAAK,EAAE,gBAAgB,CAAA;IACvB,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,oDAAoD,YAAY,gCAiFvF,CAAA"}
@@ -15,5 +15,5 @@ export type { Video180SphereProps } from './types';
15
15
  * />
16
16
  * ```
17
17
  */
18
- export declare const Video180Sphere: import("react").MemoExoticComponent<({ url, position, rotation, scale, playing, muted, volume, radius, segments, loop, placeholderColor, onEnded, onLoadedMetadata, onProgress, }: Video180SphereProps) => import("react/jsx-runtime").JSX.Element>;
18
+ export declare const Video180Sphere: import("react").MemoExoticComponent<({ url, position, rotation, scale, playing, muted, volume, radius, segments, loop, placeholderColor, onEnded, onLoadedMetadata, onProgress, }: Video180SphereProps) => import("react").JSX.Element>;
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAKlD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,qLAgBtB,mBAAmB,6CAkFvB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Video180Sphere/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAElD,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAKlD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc,qLAgBtB,mBAAmB,iCAkFvB,CAAA"}
@@ -15,6 +15,6 @@ interface Props {
15
15
  onUrlChange: (url: string) => void;
16
16
  onToggleVisible: () => void;
17
17
  }
18
- export declare const ControlPanel: import("react").MemoExoticComponent<({ id, width, screenHeight, playing, progress, duration, volume, url, visible, onPlayPause, onStop, onSeek, onVolumeChange, onUrlChange, onToggleVisible, }: Props) => import("react/jsx-runtime").JSX.Element>;
18
+ export declare const ControlPanel: import("react").MemoExoticComponent<({ id, width, screenHeight, playing, progress, duration, volume, url, visible, onPlayPause, onStop, onSeek, onVolumeChange, onUrlChange, onToggleVisible, }: Props) => import("react").JSX.Element>;
19
19
  export {};
20
20
  //# sourceMappingURL=ControlPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ControlPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/VideoPlayer/components/ControlPanel.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B;AA8CD,eAAO,MAAM,YAAY,mMAiBpB,KAAK,6CAsKT,CAAA"}
1
+ {"version":3,"file":"ControlPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/VideoPlayer/components/ControlPanel.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,eAAe,EAAE,MAAM,IAAI,CAAA;CAC5B;AA8CD,eAAO,MAAM,YAAY,mMAiBpB,KAAK,iCAsKT,CAAA"}
@@ -16,6 +16,6 @@ interface Props {
16
16
  }
17
17
  /** @public */
18
18
  export type VideoPlayerProps = Props;
19
- export declare const VideoPlayer: import("react").MemoExoticComponent<({ id, position, rotation, width, url: initialUrl, playing: initialPlaying, volume: initialVolume, }: Props) => import("react/jsx-runtime").JSX.Element>;
19
+ export declare const VideoPlayer: import("react").MemoExoticComponent<({ id, position, rotation, width, url: initialUrl, playing: initialPlaying, volume: initialVolume, }: Props) => import("react").JSX.Element>;
20
20
  export {};
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoPlayer/index.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,cAAc;AACd,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAmEpC,eAAO,MAAM,WAAW,4IASnB,KAAK,6CAmJT,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoPlayer/index.tsx"],"names":[],"mappings":"AAWA,UAAU,KAAK;IACb,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,cAAc;AACd,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAA;AAmEpC,eAAO,MAAM,WAAW,4IASnB,KAAK,iCAmJT,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 補正しない誤差(秒)
3
+ *
4
+ * この範囲なら合っているとみなす。狭くすると補正が止まらなくなる。
5
+ * 共有時計の実効精度(Quest で 18ms 程度)よりはるかに大きく取ってあるのは、
6
+ * ブラウザが `video.currentTime` の設定を要求位置ぴったりに着地させないため。
7
+ */
8
+ export declare const SYNC_DEAD_BAND = 0.3;
9
+ /**
10
+ * 再生速度で吸収する誤差の上限(秒)
11
+ *
12
+ * これを超える誤差は速度調整では現実的な時間で吸収できないのでシークを検討する。
13
+ */
14
+ export declare const SYNC_RATE_LIMIT = 5;
15
+ /**
16
+ * 再生速度の補正幅(±5%)
17
+ *
18
+ * 大きくすると音程の変化が耳につく。5% なら 1 秒の遅れを 20 秒で吸収できる。
19
+ */
20
+ export declare const SYNC_RATE_ADJUSTMENT = 0.05;
21
+ /**
22
+ * シーク先がバッファ内かを判定するときの余裕(秒)
23
+ *
24
+ * バッファの端ぎりぎりへシークすると、着地した直後に再生が止まる。
25
+ */
26
+ export declare const SYNC_BUFFER_MARGIN = 1;
27
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC;;;;GAIG;AACH,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AAExC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 補正しない誤差(秒)
3
+ *
4
+ * この範囲なら合っているとみなす。狭くすると補正が止まらなくなる。
5
+ * 共有時計の実効精度(Quest で 18ms 程度)よりはるかに大きく取ってあるのは、
6
+ * ブラウザが `video.currentTime` の設定を要求位置ぴったりに着地させないため。
7
+ */
8
+ export const SYNC_DEAD_BAND = 0.3;
9
+ /**
10
+ * 再生速度で吸収する誤差の上限(秒)
11
+ *
12
+ * これを超える誤差は速度調整では現実的な時間で吸収できないのでシークを検討する。
13
+ */
14
+ export const SYNC_RATE_LIMIT = 5;
15
+ /**
16
+ * 再生速度の補正幅(±5%)
17
+ *
18
+ * 大きくすると音程の変化が耳につく。5% なら 1 秒の遅れを 20 秒で吸収できる。
19
+ */
20
+ export const SYNC_RATE_ADJUSTMENT = 0.05;
21
+ /**
22
+ * シーク先がバッファ内かを判定するときの余裕(秒)
23
+ *
24
+ * バッファの端ぎりぎりへシークすると、着地した直後に再生が止まる。
25
+ */
26
+ export const SYNC_BUFFER_MARGIN = 1;
27
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAExC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 共有時計のアンカーに合わせて再生位置を追従させる(issue xrift-frontend#1464 Phase 4)
3
+ *
4
+ * アンカー = 「サーバ時刻 `anchorServerTime` のとき再生位置は `anchorMediaTime` だった」。
5
+ * 各クライアントが自分で目標位置を計算するので、**後から入った人も通信ゼロで追いつける**。
6
+ *
7
+ * `useFrame` ではなく `setInterval` で回している。補正は 0.5 秒に一度で十分なうえ、
8
+ * `useFrame` はタブが非表示になると完全に停止してしまうため。
9
+ */
10
+ export declare const useVideoTimeSync: (params: {
11
+ video: HTMLVideoElement | null;
12
+ anchorMediaTime: number;
13
+ anchorServerTime: number;
14
+ isPlaying: boolean;
15
+ loop: boolean;
16
+ /** false のときは追従しない(sync='local' など) */
17
+ enabled: boolean;
18
+ }) => void;
19
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/hooks.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ;IACvC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC9B,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,IA4DH,CAAA"}
@@ -0,0 +1,69 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useServerClock } from '../../hooks/useServerClock';
3
+ import { computeTargetTime, decideVideoSyncAction, toBufferedRanges } from './utils';
4
+ /** 補正を検討する間隔(ms)。毎フレームやる必要はない */
5
+ const SYNC_CHECK_INTERVAL = 500;
6
+ /**
7
+ * 共有時計のアンカーに合わせて再生位置を追従させる(issue xrift-frontend#1464 Phase 4)
8
+ *
9
+ * アンカー = 「サーバ時刻 `anchorServerTime` のとき再生位置は `anchorMediaTime` だった」。
10
+ * 各クライアントが自分で目標位置を計算するので、**後から入った人も通信ゼロで追いつける**。
11
+ *
12
+ * `useFrame` ではなく `setInterval` で回している。補正は 0.5 秒に一度で十分なうえ、
13
+ * `useFrame` はタブが非表示になると完全に停止してしまうため。
14
+ */
15
+ export const useVideoTimeSync = (params) => {
16
+ const { video, anchorMediaTime, anchorServerTime, isPlaying, loop, enabled } = params;
17
+ const clock = useServerClock({ require: 'media' });
18
+ // 入室直後の一度だけ、バッファを待たずにシークして追いつく
19
+ const positionedRef = useRef(false);
20
+ // アンカーが変わったら位置合わせをやり直す(別の動画・シーク操作)
21
+ useEffect(() => {
22
+ positionedRef.current = false;
23
+ }, [anchorServerTime]);
24
+ // 時計が飛んだら目標が不連続に変わる。次の判定で追いつくため位置合わせからやり直す
25
+ useEffect(() => {
26
+ positionedRef.current = false;
27
+ }, [clock.timeJumpCount]);
28
+ // クロージャの陳腐化を避けつつ、interval を張り直さないための ref
29
+ const stateRef = useRef({ anchorMediaTime, anchorServerTime, isPlaying, loop, clock });
30
+ stateRef.current = { anchorMediaTime, anchorServerTime, isPlaying, loop, clock };
31
+ useEffect(() => {
32
+ if (!video || !enabled)
33
+ return;
34
+ const syncOnce = () => {
35
+ const state = stateRef.current;
36
+ const targetTime = computeTargetTime({
37
+ anchorMediaTime: state.anchorMediaTime,
38
+ anchorServerTime: state.anchorServerTime,
39
+ serverNow: state.clock.now(),
40
+ isPlaying: state.isPlaying,
41
+ duration: video.duration,
42
+ loop: state.loop,
43
+ });
44
+ const action = decideVideoSyncAction({
45
+ targetTime,
46
+ currentTime: video.currentTime,
47
+ buffered: toBufferedRanges(video.buffered),
48
+ trustworthy: state.clock.trustworthy,
49
+ positioned: positionedRef.current,
50
+ });
51
+ // 速度は毎回明示的に戻す(戻し忘れると反対側へ突き抜けて振動し続ける)
52
+ if (video.playbackRate !== action.playbackRate) {
53
+ video.playbackRate = action.playbackRate;
54
+ }
55
+ if (action.type !== 'seek')
56
+ return;
57
+ video.currentTime = action.seekTo;
58
+ positionedRef.current = true;
59
+ };
60
+ syncOnce();
61
+ const interval = setInterval(syncOnce, SYNC_CHECK_INTERVAL);
62
+ return () => {
63
+ clearInterval(interval);
64
+ // 補正をやめるときは速度を戻す
65
+ video.playbackRate = 1;
66
+ };
67
+ }, [video, enabled]);
68
+ };
69
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/hooks.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,5 @@ export type { VideoScreenProps, VideoState } from './types';
4
4
  * VideoScreenコンポーネント
5
5
  * Suspenseでラップして使用する
6
6
  */
7
- export declare function VideoScreen(props: VideoScreenProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function VideoScreen(props: VideoScreenProps): import("react").JSX.Element;
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAc,MAAM,SAAS,CAAA;AAEtD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAwH3D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CA8BlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAc,MAAM,SAAS,CAAA;AAEtD,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AA2H3D;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA8BlD"}
@@ -3,25 +3,29 @@ import { Suspense, useEffect, useRef, useState } from 'react';
3
3
  import { FrontSide } from 'three';
4
4
  import { useVideoTexture } from '@react-three/drei';
5
5
  import { useInstanceState } from '../../hooks/useInstanceState';
6
+ import { useServerClock } from '../../hooks/useServerClock';
6
7
  import { useWebAudioVolume } from '../../hooks/useWebAudioVolume';
8
+ import { useVideoTimeSync } from './hooks';
7
9
  /**
8
10
  * 動画を表示する内部コンポーネント
9
11
  * useVideoTextureを使用するためSuspense内で使用する必要がある
10
12
  */
11
13
  function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], scale = [16 / 9 * 3, 3], url = '', playing = true, currentTime = 0, sync = 'global', muted = false, volume = 1, }) {
14
+ // 共有時計。アンカーの打刻に使う(端末の Date.now() は互いに 0.1〜数秒ずれている)
15
+ const clock = useServerClock({ require: 'media' });
12
16
  // グローバル同期用の状態
13
17
  const [globalState, setGlobalState] = useInstanceState(`video-${id}`, {
14
18
  url: url,
15
19
  isPlaying: playing,
16
20
  currentTime: currentTime,
17
- serverTime: Date.now(),
21
+ serverTime: clock.now(),
18
22
  });
19
23
  // ローカル専用の状態
20
24
  const [localState, setLocalState] = useState({
21
25
  url: url,
22
26
  isPlaying: playing,
23
27
  currentTime: currentTime,
24
- serverTime: Date.now(),
28
+ serverTime: clock.now(),
25
29
  });
26
30
  // sync modeに応じて使用する状態を切り替え
27
31
  const videoState = sync === 'global' ? globalState : localState;
@@ -32,14 +36,16 @@ function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], sca
32
36
  if (videoState.url !== url ||
33
37
  videoState.isPlaying !== playing ||
34
38
  videoState.currentTime !== currentTime) {
39
+ // props が変わったらアンカーを打ち直す。
40
+ // 「いまサーバ時刻 X で、再生位置は currentTime である」と宣言する
35
41
  setVideoState({
36
42
  url: url,
37
43
  isPlaying: playing,
38
44
  currentTime: currentTime,
39
- serverTime: Date.now(),
45
+ serverTime: clock.now(),
40
46
  });
41
47
  }
42
- }, [url, playing, currentTime, videoState, setVideoState]);
48
+ }, [url, playing, currentTime, videoState, setVideoState, clock]);
43
49
  // useVideoTextureで動画テクスチャを取得
44
50
  const texture = useVideoTexture(url || '', {
45
51
  muted,
@@ -63,19 +69,18 @@ function VideoScreenInner({ id, position = [0, 2, -5], rotation = [0, 0, 0], sca
63
69
  }, [playing, texture]);
64
70
  // Web Audio API を使用した音量制御(iOS対応)
65
71
  useWebAudioVolume(texture.image, volume);
66
- // 再生位置の同期ロジック(VRChat方式)
67
- // currentTimeが外部から変更された場合のみ同期
68
- const lastSyncTimeRef = useRef(currentTime);
69
- useEffect(() => {
70
- const video = texture.image;
71
- if (!video)
72
- return;
73
- // currentTimeが外部から変更された場合のみシークする
74
- if (lastSyncTimeRef.current !== currentTime) {
75
- video.currentTime = currentTime;
76
- lastSyncTimeRef.current = currentTime;
77
- }
78
- }, [currentTime, texture]);
72
+ // 再生位置の追従(アンカー方式)
73
+ // 状態のアンカーと共有時計から目標位置を計算し、穏やかに寄せる。
74
+ // 後から入った人はここで一度シークして追いつく
75
+ useVideoTimeSync({
76
+ video: texture.image,
77
+ anchorMediaTime: videoState.currentTime,
78
+ anchorServerTime: videoState.serverTime,
79
+ isPlaying: videoState.isPlaying,
80
+ loop: true,
81
+ // ローカル再生は合わせる相手がいないので追従しない
82
+ enabled: sync === 'global',
83
+ });
79
84
  // アンマウント時に動画を停止
80
85
  useEffect(() => {
81
86
  const video = texture.image;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/index.tsx"],"names":[],"mappings":"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"}
@@ -21,17 +21,27 @@ export interface VideoScreenProps {
21
21
  volume?: number;
22
22
  }
23
23
  /**
24
- * VideoScreenの状態
25
- * useInstanceStateで同期される
24
+ * VideoScreenの状態(useInstanceStateで同期される)
25
+ *
26
+ * `currentTime` と `serverTime` は**アンカー**として使う。
27
+ * 「サーバ時刻 `serverTime` のとき再生位置は `currentTime` だった」という意味で、
28
+ * 各クライアントはここから自分で現在の目標位置を計算する。
29
+ * 「いまの再生位置」を配ると受け取った瞬間には既に古いが、アンカーなら
30
+ * **後から入った人も通信ゼロで正しい位置に追いつける**。
26
31
  */
27
32
  export interface VideoState {
28
33
  /** 動画のURL */
29
34
  url: string;
30
35
  /** 再生中かどうか */
31
36
  isPlaying: boolean;
32
- /** 現在の再生位置(秒) */
37
+ /** アンカーの再生位置(秒) */
33
38
  currentTime: number;
34
- /** サーバータイム(VRChat方式の同期用) */
39
+ /**
40
+ * アンカーのサーバ時刻(ms)
41
+ *
42
+ * 共有時計(`useServerClock`)の値。端末の `Date.now()` は互いに 0.1〜数秒
43
+ * ずれているため、ここに入れてはいけない(実測で 0.66 秒ずれた端末がある)
44
+ */
35
45
  serverTime: number;
36
46
  }
37
47
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;IACX,cAAc;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAA;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,aAAa;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yEAAyE;IACzE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa;IACb,GAAG,EAAE,MAAM,CAAA;IACX,cAAc;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * アンカー(「サーバ時刻 T のとき再生位置は M だった」)から、
3
+ * いまの再生位置の目標値を求める
4
+ *
5
+ * 状態に「いまの再生位置」を持たせると、受け取った瞬間には既に古い。
6
+ * アンカーで持てば**後から入った人も自分で正しい位置を計算できる**(通信ゼロ)。
7
+ *
8
+ * @param duration 動画の長さ(秒)。ループ再生の折り返しに使う。
9
+ * メタデータ未読み込みで NaN / 0 のときは折り返さない
10
+ */
11
+ export declare function computeTargetTime(params: {
12
+ /** アンカーの再生位置(秒) */
13
+ anchorMediaTime: number;
14
+ /** アンカーのサーバ時刻(ms) */
15
+ anchorServerTime: number;
16
+ /** いまのサーバ時刻(ms) */
17
+ serverNow: number;
18
+ isPlaying: boolean;
19
+ duration: number;
20
+ loop: boolean;
21
+ }): number;
22
+ /** 再生位置がバッファ済みの範囲に入っているか(端の余裕を見る) */
23
+ export declare function isTimeBuffered(buffered: Array<{
24
+ start: number;
25
+ end: number;
26
+ }>, time: number): boolean;
27
+ /** 同期のためにこのフレームで何をするか */
28
+ export type VideoSyncAction =
29
+ /** 何もしない(合っている / 補正のコストが誤差より大きい) */
30
+ {
31
+ type: 'none';
32
+ playbackRate: 1;
33
+ }
34
+ /** 再生速度で穏やかに寄せる */
35
+ | {
36
+ type: 'rate';
37
+ playbackRate: number;
38
+ }
39
+ /** シークで一気に合わせる */
40
+ | {
41
+ type: 'seek';
42
+ seekTo: number;
43
+ playbackRate: 1;
44
+ };
45
+ /**
46
+ * 目標位置と現在位置から、取るべき補正を決める
47
+ *
48
+ * **原則: 補正のコストが誤差より大きいなら補正しない。**
49
+ * ズレを直すためにシークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが
50
+ * 体験は良い。これを守らないと「ズレる → シーク → バッファ切れ → さらにズレる」の
51
+ * 無限ループになる(VR180 プレイヤーで実際に起きた)。
52
+ *
53
+ * @param positioned 一度でも位置合わせが済んでいるか。
54
+ * 入室直後(false)はバッファが無いのが当たり前なので、
55
+ * バッファ判定を待たずにシークする(これが late-join の追いつき)
56
+ */
57
+ export declare function decideVideoSyncAction(params: {
58
+ targetTime: number;
59
+ currentTime: number;
60
+ buffered: Array<{
61
+ start: number;
62
+ end: number;
63
+ }>;
64
+ /** 共有時計が用途に足る精度か。false なら合わせにいかない */
65
+ trustworthy: boolean;
66
+ positioned: boolean;
67
+ }): VideoSyncAction;
68
+ /** `TimeRanges` を素の配列にする(テストしやすくするため) */
69
+ export declare function toBufferedRanges(ranges: TimeRanges | null): Array<{
70
+ start: number;
71
+ end: number;
72
+ }>;
73
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/VideoScreen/utils.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,mBAAmB;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;CACd,GAAG,MAAM,CAaT;AAED,qCAAqC;AACrC,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,IAAI,EAAE,MAAM,GACX,OAAO,CAIT;AAED,yBAAyB;AACzB,MAAM,MAAM,eAAe;AACzB,oCAAoC;AAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,CAAC,CAAA;CAAE;AACnC,mBAAmB;GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE;AACxC,kBAAkB;GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,CAAC,CAAA;CAAE,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,qCAAqC;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;CACpB,GAAG,eAAe,CA2BlB;AAED,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAOjG"}
@@ -0,0 +1,74 @@
1
+ import { SYNC_BUFFER_MARGIN, SYNC_DEAD_BAND, SYNC_RATE_ADJUSTMENT, SYNC_RATE_LIMIT, } from './constants';
2
+ /**
3
+ * アンカー(「サーバ時刻 T のとき再生位置は M だった」)から、
4
+ * いまの再生位置の目標値を求める
5
+ *
6
+ * 状態に「いまの再生位置」を持たせると、受け取った瞬間には既に古い。
7
+ * アンカーで持てば**後から入った人も自分で正しい位置を計算できる**(通信ゼロ)。
8
+ *
9
+ * @param duration 動画の長さ(秒)。ループ再生の折り返しに使う。
10
+ * メタデータ未読み込みで NaN / 0 のときは折り返さない
11
+ */
12
+ export function computeTargetTime(params) {
13
+ const { anchorMediaTime, anchorServerTime, serverNow, isPlaying, duration, loop } = params;
14
+ // 停止中は時間が進まないので、アンカーの位置がそのまま目標
15
+ if (!isPlaying)
16
+ return Math.max(0, anchorMediaTime);
17
+ const elapsed = (serverNow - anchorServerTime) / 1000;
18
+ const target = anchorMediaTime + elapsed;
19
+ if (!loop || !Number.isFinite(duration) || duration <= 0)
20
+ return Math.max(0, target);
21
+ // ループ再生では長さで折り返す。負にもなり得る(アンカーが未来の場合)ので剰余を正規化する
22
+ return ((target % duration) + duration) % duration;
23
+ }
24
+ /** 再生位置がバッファ済みの範囲に入っているか(端の余裕を見る) */
25
+ export function isTimeBuffered(buffered, time) {
26
+ return buffered.some((range) => time >= range.start && time <= range.end - SYNC_BUFFER_MARGIN);
27
+ }
28
+ /**
29
+ * 目標位置と現在位置から、取るべき補正を決める
30
+ *
31
+ * **原則: 補正のコストが誤差より大きいなら補正しない。**
32
+ * ズレを直すためにシークしてバッファが切れるくらいなら、ズレたまま再生を続けるほうが
33
+ * 体験は良い。これを守らないと「ズレる → シーク → バッファ切れ → さらにズレる」の
34
+ * 無限ループになる(VR180 プレイヤーで実際に起きた)。
35
+ *
36
+ * @param positioned 一度でも位置合わせが済んでいるか。
37
+ * 入室直後(false)はバッファが無いのが当たり前なので、
38
+ * バッファ判定を待たずにシークする(これが late-join の追いつき)
39
+ */
40
+ export function decideVideoSyncAction(params) {
41
+ const { targetTime, currentTime, buffered, trustworthy, positioned } = params;
42
+ // 時計が信用できないなら同期を諦める。精度が出ていないのに合わせにいくと体験を壊す
43
+ if (!trustworthy)
44
+ return { type: 'none', playbackRate: 1 };
45
+ // 入室直後は一度だけ無条件にシークして追いつく(バッファはこれから作られる)
46
+ if (!positioned)
47
+ return { type: 'seek', seekTo: targetTime, playbackRate: 1 };
48
+ const diff = targetTime - currentTime;
49
+ const distance = Math.abs(diff);
50
+ // 合っている。速度を戻すのを忘れると反対側へ突き抜けて振動し続ける
51
+ if (distance < SYNC_DEAD_BAND)
52
+ return { type: 'none', playbackRate: 1 };
53
+ // 速度で吸収できる範囲は穏やかに寄せる(シークより体験が良い)
54
+ if (distance < SYNC_RATE_LIMIT) {
55
+ return { type: 'rate', playbackRate: 1 + Math.sign(diff) * SYNC_RATE_ADJUSTMENT };
56
+ }
57
+ // 目標がバッファ内にあるときだけシークする。
58
+ // バッファ外へのシークは再生が止まるので、ズレたまま再生を続けるほうがまし
59
+ if (isTimeBuffered(buffered, targetTime)) {
60
+ return { type: 'seek', seekTo: targetTime, playbackRate: 1 };
61
+ }
62
+ return { type: 'none', playbackRate: 1 };
63
+ }
64
+ /** `TimeRanges` を素の配列にする(テストしやすくするため) */
65
+ export function toBufferedRanges(ranges) {
66
+ if (!ranges)
67
+ return [];
68
+ const result = [];
69
+ for (let index = 0; index < ranges.length; index++) {
70
+ result.push({ start: ranges.start(index), end: ranges.end(index) });
71
+ }
72
+ return result;
73
+ }
74
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/VideoScreen/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAUjC;IACC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAA;IAE1F,+BAA+B;IAC/B,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;IAEnD,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,gBAAgB,CAAC,GAAG,IAAI,CAAA;IACrD,MAAM,MAAM,GAAG,eAAe,GAAG,OAAO,CAAA;IAExC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAEpF,+CAA+C;IAC/C,OAAO,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAA;AACpD,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,cAAc,CAC5B,QAA+C,EAC/C,IAAY;IAEZ,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,kBAAkB,CACzE,CAAA;AACH,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAOrC;IACC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAAA;IAE7E,2CAA2C;IAC3C,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IAE1D,wCAAwC;IACxC,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IAE7E,MAAM,IAAI,GAAG,UAAU,GAAG,WAAW,CAAA;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAE/B,mCAAmC;IACnC,IAAI,QAAQ,GAAG,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IAEvE,iCAAiC;IACjC,IAAI,QAAQ,GAAG,eAAe,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,oBAAoB,EAAE,CAAA;IACnF,CAAC;IAED,wBAAwB;IACxB,uCAAuC;IACvC,IAAI,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IAC9D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;AAC1C,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACxD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IACtB,MAAM,MAAM,GAA0C,EAAE,CAAA;IACxD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}