@syra.fm/sdk 0.3.0 → 0.5.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 (314) hide show
  1. package/lib/commonjs/client.js +268 -0
  2. package/lib/commonjs/client.js.map +1 -0
  3. package/lib/commonjs/errors.js +22 -0
  4. package/lib/commonjs/errors.js.map +1 -0
  5. package/lib/commonjs/index.js +63 -0
  6. package/lib/commonjs/index.js.map +1 -0
  7. package/lib/commonjs/index.native.js +28 -0
  8. package/lib/commonjs/index.native.js.map +1 -0
  9. package/lib/commonjs/live/assets/icons/spaces-icon.js +42 -0
  10. package/lib/commonjs/live/assets/icons/spaces-icon.js.map +1 -0
  11. package/lib/commonjs/live/assets/icons/syra-icon.js +43 -0
  12. package/lib/commonjs/live/assets/icons/syra-icon.js.map +1 -0
  13. package/lib/commonjs/live/components/AnimatedPulse.js +38 -0
  14. package/lib/commonjs/live/components/AnimatedPulse.js.map +1 -0
  15. package/lib/commonjs/live/components/AnimatedSpeakerRing.js +90 -0
  16. package/lib/commonjs/live/components/AnimatedSpeakerRing.js.map +1 -0
  17. package/lib/commonjs/live/components/CreateRoomSheet.js +688 -0
  18. package/lib/commonjs/live/components/CreateRoomSheet.js.map +1 -0
  19. package/lib/commonjs/live/components/InsightsPanel.js +333 -0
  20. package/lib/commonjs/live/components/InsightsPanel.js.map +1 -0
  21. package/lib/commonjs/live/components/LiveRoomSheet.js +1195 -0
  22. package/lib/commonjs/live/components/LiveRoomSheet.js.map +1 -0
  23. package/lib/commonjs/live/components/MiniRoomBar.js +161 -0
  24. package/lib/commonjs/live/components/MiniRoomBar.js.map +1 -0
  25. package/lib/commonjs/live/components/PanelHeader.js +57 -0
  26. package/lib/commonjs/live/components/PanelHeader.js.map +1 -0
  27. package/lib/commonjs/live/components/PodcastStreamPicker.js +1190 -0
  28. package/lib/commonjs/live/components/PodcastStreamPicker.js.map +1 -0
  29. package/lib/commonjs/live/components/RecordingCard.js +192 -0
  30. package/lib/commonjs/live/components/RecordingCard.js.map +1 -0
  31. package/lib/commonjs/live/components/RecordingsPanel.js +304 -0
  32. package/lib/commonjs/live/components/RecordingsPanel.js.map +1 -0
  33. package/lib/commonjs/live/components/RoomCard.js +553 -0
  34. package/lib/commonjs/live/components/RoomCard.js.map +1 -0
  35. package/lib/commonjs/live/components/StreamConfigModal.js +656 -0
  36. package/lib/commonjs/live/components/StreamConfigModal.js.map +1 -0
  37. package/lib/commonjs/live/components/StreamConfigPanel.js +822 -0
  38. package/lib/commonjs/live/components/StreamConfigPanel.js.map +1 -0
  39. package/lib/commonjs/live/context/LiveConfigContext.js +46 -0
  40. package/lib/commonjs/live/context/LiveConfigContext.js.map +1 -0
  41. package/lib/commonjs/live/context/LiveRoomContext.js +195 -0
  42. package/lib/commonjs/live/context/LiveRoomContext.js.map +1 -0
  43. package/lib/commonjs/live/hooks/useActiveSpeakers.js +35 -0
  44. package/lib/commonjs/live/hooks/useActiveSpeakers.js.map +1 -0
  45. package/lib/commonjs/live/hooks/useRoomAudio.js +129 -0
  46. package/lib/commonjs/live/hooks/useRoomAudio.js.map +1 -0
  47. package/lib/commonjs/live/hooks/useRoomConnection.js +177 -0
  48. package/lib/commonjs/live/hooks/useRoomConnection.js.map +1 -0
  49. package/lib/commonjs/live/hooks/useRoomManager.js +37 -0
  50. package/lib/commonjs/live/hooks/useRoomManager.js.map +1 -0
  51. package/lib/commonjs/live/hooks/useRoomUsers.js +52 -0
  52. package/lib/commonjs/live/hooks/useRoomUsers.js.map +1 -0
  53. package/lib/commonjs/live/index.js +310 -0
  54. package/lib/commonjs/live/index.js.map +1 -0
  55. package/lib/commonjs/live/services/livekitService.js +20 -0
  56. package/lib/commonjs/live/services/livekitService.js.map +1 -0
  57. package/lib/commonjs/live/services/spaceSocketService.js +181 -0
  58. package/lib/commonjs/live/services/spaceSocketService.js.map +1 -0
  59. package/lib/commonjs/live/services/spacesService.js +642 -0
  60. package/lib/commonjs/live/services/spacesService.js.map +1 -0
  61. package/lib/commonjs/live/types.js +6 -0
  62. package/lib/commonjs/live/types.js.map +1 -0
  63. package/lib/commonjs/live/validation.js +238 -0
  64. package/lib/commonjs/live/validation.js.map +1 -0
  65. package/lib/commonjs/package.json +1 -0
  66. package/lib/commonjs/schema.js +102 -0
  67. package/lib/commonjs/schema.js.map +1 -0
  68. package/lib/module/client.js +264 -0
  69. package/lib/module/client.js.map +1 -0
  70. package/lib/module/errors.js +17 -0
  71. package/lib/module/errors.js.map +1 -0
  72. package/lib/module/index.js +6 -0
  73. package/lib/module/index.js.map +1 -0
  74. package/lib/module/index.native.js +5 -0
  75. package/lib/module/index.native.js.map +1 -0
  76. package/lib/module/live/assets/icons/spaces-icon.js +34 -0
  77. package/lib/module/live/assets/icons/spaces-icon.js.map +1 -0
  78. package/lib/module/live/assets/icons/syra-icon.js +36 -0
  79. package/lib/module/live/assets/icons/syra-icon.js.map +1 -0
  80. package/lib/module/live/components/AnimatedPulse.js +33 -0
  81. package/lib/module/live/components/AnimatedPulse.js.map +1 -0
  82. package/lib/module/live/components/AnimatedSpeakerRing.js +85 -0
  83. package/lib/module/live/components/AnimatedSpeakerRing.js.map +1 -0
  84. package/lib/module/live/components/CreateRoomSheet.js +682 -0
  85. package/lib/module/live/components/CreateRoomSheet.js.map +1 -0
  86. package/lib/module/live/components/InsightsPanel.js +327 -0
  87. package/lib/module/live/components/InsightsPanel.js.map +1 -0
  88. package/lib/module/live/components/LiveRoomSheet.js +1189 -0
  89. package/lib/module/live/components/LiveRoomSheet.js.map +1 -0
  90. package/lib/module/live/components/MiniRoomBar.js +154 -0
  91. package/lib/module/live/components/MiniRoomBar.js.map +1 -0
  92. package/lib/module/live/components/PanelHeader.js +52 -0
  93. package/lib/module/live/components/PanelHeader.js.map +1 -0
  94. package/lib/module/live/components/PodcastStreamPicker.js +1183 -0
  95. package/lib/module/live/components/PodcastStreamPicker.js.map +1 -0
  96. package/lib/module/live/components/RecordingCard.js +187 -0
  97. package/lib/module/live/components/RecordingCard.js.map +1 -0
  98. package/lib/module/live/components/RecordingsPanel.js +298 -0
  99. package/lib/module/live/components/RecordingsPanel.js.map +1 -0
  100. package/lib/module/live/components/RoomCard.js +548 -0
  101. package/lib/module/live/components/RoomCard.js.map +1 -0
  102. package/lib/module/live/components/StreamConfigModal.js +650 -0
  103. package/lib/module/live/components/StreamConfigModal.js.map +1 -0
  104. package/lib/module/live/components/StreamConfigPanel.js +816 -0
  105. package/lib/module/live/components/StreamConfigPanel.js.map +1 -0
  106. package/lib/module/live/context/LiveConfigContext.js +40 -0
  107. package/lib/module/live/context/LiveConfigContext.js.map +1 -0
  108. package/lib/module/live/context/LiveRoomContext.js +189 -0
  109. package/lib/module/live/context/LiveRoomContext.js.map +1 -0
  110. package/lib/module/live/hooks/useActiveSpeakers.js +31 -0
  111. package/lib/module/live/hooks/useActiveSpeakers.js.map +1 -0
  112. package/lib/module/live/hooks/useRoomAudio.js +125 -0
  113. package/lib/module/live/hooks/useRoomAudio.js.map +1 -0
  114. package/lib/module/live/hooks/useRoomConnection.js +173 -0
  115. package/lib/module/live/hooks/useRoomConnection.js.map +1 -0
  116. package/lib/module/live/hooks/useRoomManager.js +32 -0
  117. package/lib/module/live/hooks/useRoomManager.js.map +1 -0
  118. package/lib/module/live/hooks/useRoomUsers.js +46 -0
  119. package/lib/module/live/hooks/useRoomUsers.js.map +1 -0
  120. package/lib/module/live/index.js +38 -0
  121. package/lib/module/live/index.js.map +1 -0
  122. package/lib/module/live/services/livekitService.js +16 -0
  123. package/lib/module/live/services/livekitService.js.map +1 -0
  124. package/lib/module/live/services/spaceSocketService.js +176 -0
  125. package/lib/module/live/services/spaceSocketService.js.map +1 -0
  126. package/lib/module/live/services/spacesService.js +639 -0
  127. package/lib/module/live/services/spacesService.js.map +1 -0
  128. package/lib/module/live/types.js +4 -0
  129. package/lib/module/live/types.js.map +1 -0
  130. package/lib/module/live/validation.js +229 -0
  131. package/lib/module/live/validation.js.map +1 -0
  132. package/lib/module/package.json +1 -0
  133. package/lib/module/schema.js +99 -0
  134. package/lib/module/schema.js.map +1 -0
  135. package/{dist/types → lib/typescript/commonjs}/client.d.ts +36 -1
  136. package/lib/typescript/commonjs/client.d.ts.map +1 -0
  137. package/{dist/types → lib/typescript/commonjs}/errors.d.ts +1 -0
  138. package/lib/typescript/commonjs/errors.d.ts.map +1 -0
  139. package/lib/typescript/commonjs/index.d.ts +6 -0
  140. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  141. package/lib/typescript/commonjs/index.native.d.ts +3 -0
  142. package/lib/typescript/commonjs/index.native.d.ts.map +1 -0
  143. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts +13 -0
  144. package/lib/typescript/commonjs/live/assets/icons/spaces-icon.d.ts.map +1 -0
  145. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts +13 -0
  146. package/lib/typescript/commonjs/live/assets/icons/syra-icon.d.ts.map +1 -0
  147. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts +8 -0
  148. package/lib/typescript/commonjs/live/components/AnimatedPulse.d.ts.map +1 -0
  149. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts +10 -0
  150. package/lib/typescript/commonjs/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  151. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts +26 -0
  152. package/lib/typescript/commonjs/live/components/CreateRoomSheet.d.ts.map +1 -0
  153. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts +11 -0
  154. package/lib/typescript/commonjs/live/components/InsightsPanel.d.ts.map +1 -0
  155. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts +11 -0
  156. package/lib/typescript/commonjs/live/components/LiveRoomSheet.d.ts.map +1 -0
  157. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts +15 -0
  158. package/lib/typescript/commonjs/live/components/MiniRoomBar.d.ts.map +1 -0
  159. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts +10 -0
  160. package/lib/typescript/commonjs/live/components/PanelHeader.d.ts.map +1 -0
  161. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts +54 -0
  162. package/lib/typescript/commonjs/live/components/PodcastStreamPicker.d.ts.map +1 -0
  163. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts +11 -0
  164. package/lib/typescript/commonjs/live/components/RecordingCard.d.ts.map +1 -0
  165. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts +12 -0
  166. package/lib/typescript/commonjs/live/components/RecordingsPanel.d.ts.map +1 -0
  167. package/lib/typescript/commonjs/live/components/RoomCard.d.ts +38 -0
  168. package/lib/typescript/commonjs/live/components/RoomCard.d.ts.map +1 -0
  169. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts +11 -0
  170. package/lib/typescript/commonjs/live/components/StreamConfigModal.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts +13 -0
  172. package/lib/typescript/commonjs/live/components/StreamConfigPanel.d.ts.map +1 -0
  173. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts +78 -0
  174. package/lib/typescript/commonjs/live/context/LiveConfigContext.d.ts.map +1 -0
  175. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts +12 -0
  176. package/lib/typescript/commonjs/live/context/LiveRoomContext.d.ts.map +1 -0
  177. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts +3 -0
  178. package/lib/typescript/commonjs/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  179. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts +16 -0
  180. package/lib/typescript/commonjs/live/hooks/useRoomAudio.d.ts.map +1 -0
  181. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts +29 -0
  182. package/lib/typescript/commonjs/live/hooks/useRoomConnection.d.ts.map +1 -0
  183. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts +11 -0
  184. package/lib/typescript/commonjs/live/hooks/useRoomManager.d.ts.map +1 -0
  185. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts +5 -0
  186. package/lib/typescript/commonjs/live/hooks/useRoomUsers.d.ts.map +1 -0
  187. package/lib/typescript/commonjs/live/index.d.ts +24 -0
  188. package/lib/typescript/commonjs/live/index.d.ts.map +1 -0
  189. package/lib/typescript/commonjs/live/services/livekitService.d.ts +7 -0
  190. package/lib/typescript/commonjs/live/services/livekitService.d.ts.map +1 -0
  191. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts +69 -0
  192. package/lib/typescript/commonjs/live/services/spaceSocketService.d.ts.map +1 -0
  193. package/lib/typescript/commonjs/live/services/spacesService.d.ts +181 -0
  194. package/lib/typescript/commonjs/live/services/spacesService.d.ts.map +1 -0
  195. package/lib/typescript/commonjs/live/types.d.ts +100 -0
  196. package/lib/typescript/commonjs/live/types.d.ts.map +1 -0
  197. package/lib/typescript/commonjs/live/validation.d.ts +658 -0
  198. package/lib/typescript/commonjs/live/validation.d.ts.map +1 -0
  199. package/lib/typescript/commonjs/package.json +1 -0
  200. package/{dist/types → lib/typescript/commonjs}/schema.d.ts +305 -0
  201. package/lib/typescript/commonjs/schema.d.ts.map +1 -0
  202. package/lib/typescript/module/client.d.ts +141 -0
  203. package/lib/typescript/module/client.d.ts.map +1 -0
  204. package/lib/typescript/module/errors.d.ts +9 -0
  205. package/lib/typescript/module/errors.d.ts.map +1 -0
  206. package/lib/typescript/module/index.d.ts +6 -0
  207. package/lib/typescript/module/index.d.ts.map +1 -0
  208. package/lib/typescript/module/index.native.d.ts +3 -0
  209. package/lib/typescript/module/index.native.d.ts.map +1 -0
  210. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts +13 -0
  211. package/lib/typescript/module/live/assets/icons/spaces-icon.d.ts.map +1 -0
  212. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts +13 -0
  213. package/lib/typescript/module/live/assets/icons/syra-icon.d.ts.map +1 -0
  214. package/lib/typescript/module/live/components/AnimatedPulse.d.ts +8 -0
  215. package/lib/typescript/module/live/components/AnimatedPulse.d.ts.map +1 -0
  216. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts +10 -0
  217. package/lib/typescript/module/live/components/AnimatedSpeakerRing.d.ts.map +1 -0
  218. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts +26 -0
  219. package/lib/typescript/module/live/components/CreateRoomSheet.d.ts.map +1 -0
  220. package/lib/typescript/module/live/components/InsightsPanel.d.ts +11 -0
  221. package/lib/typescript/module/live/components/InsightsPanel.d.ts.map +1 -0
  222. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts +11 -0
  223. package/lib/typescript/module/live/components/LiveRoomSheet.d.ts.map +1 -0
  224. package/lib/typescript/module/live/components/MiniRoomBar.d.ts +15 -0
  225. package/lib/typescript/module/live/components/MiniRoomBar.d.ts.map +1 -0
  226. package/lib/typescript/module/live/components/PanelHeader.d.ts +10 -0
  227. package/lib/typescript/module/live/components/PanelHeader.d.ts.map +1 -0
  228. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts +54 -0
  229. package/lib/typescript/module/live/components/PodcastStreamPicker.d.ts.map +1 -0
  230. package/lib/typescript/module/live/components/RecordingCard.d.ts +11 -0
  231. package/lib/typescript/module/live/components/RecordingCard.d.ts.map +1 -0
  232. package/lib/typescript/module/live/components/RecordingsPanel.d.ts +12 -0
  233. package/lib/typescript/module/live/components/RecordingsPanel.d.ts.map +1 -0
  234. package/lib/typescript/module/live/components/RoomCard.d.ts +38 -0
  235. package/lib/typescript/module/live/components/RoomCard.d.ts.map +1 -0
  236. package/lib/typescript/module/live/components/StreamConfigModal.d.ts +11 -0
  237. package/lib/typescript/module/live/components/StreamConfigModal.d.ts.map +1 -0
  238. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts +13 -0
  239. package/lib/typescript/module/live/components/StreamConfigPanel.d.ts.map +1 -0
  240. package/lib/typescript/module/live/context/LiveConfigContext.d.ts +78 -0
  241. package/lib/typescript/module/live/context/LiveConfigContext.d.ts.map +1 -0
  242. package/lib/typescript/module/live/context/LiveRoomContext.d.ts +12 -0
  243. package/lib/typescript/module/live/context/LiveRoomContext.d.ts.map +1 -0
  244. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts +3 -0
  245. package/lib/typescript/module/live/hooks/useActiveSpeakers.d.ts.map +1 -0
  246. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts +16 -0
  247. package/lib/typescript/module/live/hooks/useRoomAudio.d.ts.map +1 -0
  248. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts +29 -0
  249. package/lib/typescript/module/live/hooks/useRoomConnection.d.ts.map +1 -0
  250. package/lib/typescript/module/live/hooks/useRoomManager.d.ts +11 -0
  251. package/lib/typescript/module/live/hooks/useRoomManager.d.ts.map +1 -0
  252. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts +5 -0
  253. package/lib/typescript/module/live/hooks/useRoomUsers.d.ts.map +1 -0
  254. package/lib/typescript/module/live/index.d.ts +24 -0
  255. package/lib/typescript/module/live/index.d.ts.map +1 -0
  256. package/lib/typescript/module/live/services/livekitService.d.ts +7 -0
  257. package/lib/typescript/module/live/services/livekitService.d.ts.map +1 -0
  258. package/lib/typescript/module/live/services/spaceSocketService.d.ts +69 -0
  259. package/lib/typescript/module/live/services/spaceSocketService.d.ts.map +1 -0
  260. package/lib/typescript/module/live/services/spacesService.d.ts +181 -0
  261. package/lib/typescript/module/live/services/spacesService.d.ts.map +1 -0
  262. package/lib/typescript/module/live/types.d.ts +100 -0
  263. package/lib/typescript/module/live/types.d.ts.map +1 -0
  264. package/lib/typescript/module/live/validation.d.ts +658 -0
  265. package/lib/typescript/module/live/validation.d.ts.map +1 -0
  266. package/lib/typescript/module/package.json +1 -0
  267. package/lib/typescript/module/schema.d.ts +1072 -0
  268. package/lib/typescript/module/schema.d.ts.map +1 -0
  269. package/package.json +133 -21
  270. package/src/client.test.ts +185 -0
  271. package/src/client.ts +125 -0
  272. package/src/index.native.ts +2 -0
  273. package/src/index.ts +4 -0
  274. package/src/live/assets/icons/spaces-icon.tsx +15 -0
  275. package/src/live/assets/icons/syra-icon.tsx +13 -0
  276. package/src/live/assets/sounds/intro.mp3 +0 -0
  277. package/src/live/components/AnimatedPulse.tsx +52 -0
  278. package/src/live/components/AnimatedSpeakerRing.tsx +101 -0
  279. package/src/live/components/CreateRoomSheet.tsx +654 -0
  280. package/src/live/components/InsightsPanel.tsx +202 -0
  281. package/src/live/components/LiveRoomSheet.tsx +969 -0
  282. package/src/live/components/MiniRoomBar.tsx +166 -0
  283. package/src/live/components/PanelHeader.tsx +36 -0
  284. package/src/live/components/PodcastStreamPicker.tsx +1155 -0
  285. package/src/live/components/RecordingCard.tsx +154 -0
  286. package/src/live/components/RecordingsPanel.tsx +251 -0
  287. package/src/live/components/RoomCard.tsx +494 -0
  288. package/src/live/components/StreamConfigModal.tsx +600 -0
  289. package/src/live/components/StreamConfigPanel.tsx +729 -0
  290. package/src/live/context/LiveConfigContext.tsx +96 -0
  291. package/src/live/context/LiveRoomContext.tsx +235 -0
  292. package/src/live/hooks/useActiveSpeakers.ts +39 -0
  293. package/src/live/hooks/useRoomAudio.ts +103 -0
  294. package/src/live/hooks/useRoomConnection.ts +162 -0
  295. package/src/live/hooks/useRoomManager.ts +17 -0
  296. package/src/live/hooks/useRoomUsers.ts +52 -0
  297. package/src/live/index.ts +92 -0
  298. package/src/live/services/livekitService.ts +11 -0
  299. package/src/live/services/spaceSocketService.ts +136 -0
  300. package/src/live/services/spacesService.ts +692 -0
  301. package/src/live/types.ts +119 -0
  302. package/src/live/validation.ts +279 -0
  303. package/src/schema.ts +34 -0
  304. package/dist/cjs/client.js +0 -185
  305. package/dist/cjs/errors.js +0 -16
  306. package/dist/cjs/index.js +0 -14
  307. package/dist/cjs/package.json +0 -3
  308. package/dist/cjs/schema.js +0 -62
  309. package/dist/esm/client.js +0 -181
  310. package/dist/esm/errors.js +0 -12
  311. package/dist/esm/index.js +0 -3
  312. package/dist/esm/package.json +0 -3
  313. package/dist/esm/schema.js +0 -59
  314. package/dist/types/index.d.ts +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../src","sources":["live/types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZStreamInfo = exports.ZStartStreamResponse = exports.ZSeriesEpisode = exports.ZSeries = exports.ZRoomTemplate = exports.ZRoomParticipant = exports.ZRoomAttachment = exports.ZRoom = exports.ZRecurrence = exports.ZRecording = exports.ZPodcastQueueItem = exports.ZHouseMember = exports.ZHouse = exports.ZGenerateStreamKeyResponse = void 0;
7
+ exports.validateHouse = validateHouse;
8
+ exports.validateRecording = validateRecording;
9
+ exports.validateRecordings = validateRecordings;
10
+ exports.validateRoom = validateRoom;
11
+ exports.validateRooms = validateRooms;
12
+ exports.validateSeries = validateSeries;
13
+ var _zod = require("zod");
14
+ // --- Podcast queue ---
15
+
16
+ /**
17
+ * One podcast episode queued behind the current stream. `episodeId` is the
18
+ * opaque Syra episode handle; `syraPodcastId` (when present) identifies its show.
19
+ * The playable audio URL is never carried here — it is resolved server-side at
20
+ * play-time.
21
+ */
22
+ const ZPodcastQueueItem = exports.ZPodcastQueueItem = _zod.z.object({
23
+ syraPodcastId: _zod.z.string().optional(),
24
+ episodeId: _zod.z.string()
25
+ }).passthrough();
26
+ // --- Room (replaces Space) ---
27
+
28
+ const ZRoom = exports.ZRoom = _zod.z.object({
29
+ _id: _zod.z.string(),
30
+ id: _zod.z.string().optional(),
31
+ title: _zod.z.string(),
32
+ description: _zod.z.string().nullish(),
33
+ // Ownership
34
+ ownerType: _zod.z.enum(['profile', 'house', 'agora']).default('profile'),
35
+ host: _zod.z.string(),
36
+ houseId: _zod.z.string().optional().nullable(),
37
+ createdByAdmin: _zod.z.string().optional().nullable(),
38
+ // Classification
39
+ type: _zod.z.enum(['talk', 'stage', 'broadcast']).default('talk'),
40
+ broadcastKind: _zod.z.enum(['user', 'agora']).optional().nullable(),
41
+ // Lifecycle
42
+ status: _zod.z.enum(['scheduled', 'live', 'ended']),
43
+ scheduledStart: _zod.z.string().nullish(),
44
+ startedAt: _zod.z.string().nullish(),
45
+ endedAt: _zod.z.string().nullish(),
46
+ // Participation
47
+ speakerPermission: _zod.z.enum(['everyone', 'followers', 'invited']).nullish(),
48
+ participants: _zod.z.array(_zod.z.string()).default([]),
49
+ speakers: _zod.z.array(_zod.z.string()).default([]),
50
+ maxParticipants: _zod.z.number().default(100),
51
+ // Content
52
+ topic: _zod.z.string().nullish(),
53
+ tags: _zod.z.array(_zod.z.string()).optional(),
54
+ archived: _zod.z.boolean().optional().default(false),
55
+ seriesId: _zod.z.string().nullish(),
56
+ // Stats
57
+ stats: _zod.z.object({
58
+ peakListeners: _zod.z.number(),
59
+ totalJoined: _zod.z.number()
60
+ }).optional(),
61
+ // Streaming
62
+ activeIngressId: _zod.z.string().nullish(),
63
+ activeStreamUrl: _zod.z.string().nullish(),
64
+ streamTitle: _zod.z.string().nullish(),
65
+ streamImage: _zod.z.string().nullish(),
66
+ streamDescription: _zod.z.string().nullish(),
67
+ rtmpUrl: _zod.z.string().nullish(),
68
+ rtmpStreamKey: _zod.z.string().nullish(),
69
+ // Stream progress + podcast lifecycle (shared contract with the backend).
70
+ // `streamStartedAt` is an ISO timestamp; `streamDurationSec` is the current
71
+ // stream's total length in seconds when known (e.g. a podcast episode);
72
+ // `podcastQueue` holds the episodes queued behind the current one.
73
+ streamStartedAt: _zod.z.string().nullish(),
74
+ streamDurationSec: _zod.z.number().nullish(),
75
+ podcastQueue: _zod.z.array(ZPodcastQueueItem).nullish(),
76
+ // Recording
77
+ recordingEnabled: _zod.z.boolean().optional().default(true),
78
+ recordingEgressId: _zod.z.string().nullish(),
79
+ createdAt: _zod.z.string()
80
+ }).passthrough();
81
+ // --- Room Participant ---
82
+
83
+ const ZRoomParticipant = exports.ZRoomParticipant = _zod.z.object({
84
+ userId: _zod.z.string(),
85
+ role: _zod.z.enum(['host', 'speaker', 'listener']),
86
+ isMuted: _zod.z.boolean(),
87
+ joinedAt: _zod.z.string()
88
+ }).passthrough();
89
+ // --- House ---
90
+
91
+ const ZHouseMember = exports.ZHouseMember = _zod.z.object({
92
+ userId: _zod.z.string(),
93
+ role: _zod.z.enum(['owner', 'admin', 'host', 'member']),
94
+ joinedAt: _zod.z.string()
95
+ }).passthrough();
96
+ const ZHouse = exports.ZHouse = _zod.z.object({
97
+ _id: _zod.z.string(),
98
+ id: _zod.z.string().optional(),
99
+ name: _zod.z.string(),
100
+ description: _zod.z.string().optional(),
101
+ avatar: _zod.z.string().optional().nullable(),
102
+ coverImage: _zod.z.string().optional().nullable(),
103
+ members: _zod.z.array(ZHouseMember).default([]),
104
+ createdBy: _zod.z.string(),
105
+ isPublic: _zod.z.boolean().default(true),
106
+ tags: _zod.z.array(_zod.z.string()).optional(),
107
+ createdAt: _zod.z.string()
108
+ }).passthrough();
109
+ // --- Series ---
110
+
111
+ const ZRecurrence = exports.ZRecurrence = _zod.z.object({
112
+ type: _zod.z.enum(['daily', 'weekly', 'biweekly', 'monthly']),
113
+ dayOfWeek: _zod.z.number().min(0).max(6).optional(),
114
+ dayOfMonth: _zod.z.number().min(1).max(31).optional(),
115
+ time: _zod.z.string().regex(/^\d{2}:\d{2}$/),
116
+ timezone: _zod.z.string().default('UTC')
117
+ }).passthrough();
118
+ const ZRoomTemplate = exports.ZRoomTemplate = _zod.z.object({
119
+ titlePattern: _zod.z.string(),
120
+ type: _zod.z.enum(['talk', 'stage', 'broadcast']).default('talk'),
121
+ description: _zod.z.string().optional(),
122
+ maxParticipants: _zod.z.number().default(100),
123
+ speakerPermission: _zod.z.enum(['everyone', 'followers', 'invited']).default('invited'),
124
+ tags: _zod.z.array(_zod.z.string()).optional()
125
+ }).passthrough();
126
+ const ZSeriesEpisode = exports.ZSeriesEpisode = _zod.z.object({
127
+ roomId: _zod.z.string(),
128
+ scheduledStart: _zod.z.string(),
129
+ episodeNumber: _zod.z.number()
130
+ }).passthrough();
131
+ const ZSeries = exports.ZSeries = _zod.z.object({
132
+ _id: _zod.z.string(),
133
+ id: _zod.z.string().optional(),
134
+ title: _zod.z.string(),
135
+ description: _zod.z.string().optional(),
136
+ coverImage: _zod.z.string().optional().nullable(),
137
+ houseId: _zod.z.string().optional().nullable(),
138
+ createdBy: _zod.z.string(),
139
+ recurrence: ZRecurrence,
140
+ roomTemplate: ZRoomTemplate,
141
+ episodes: _zod.z.array(ZSeriesEpisode).default([]),
142
+ nextEpisodeNumber: _zod.z.number().default(1),
143
+ isActive: _zod.z.boolean().default(true),
144
+ createdAt: _zod.z.string()
145
+ }).passthrough();
146
+ // --- Recording ---
147
+
148
+ const ZRecording = exports.ZRecording = _zod.z.object({
149
+ _id: _zod.z.string(),
150
+ roomId: _zod.z.string(),
151
+ roomTitle: _zod.z.string(),
152
+ host: _zod.z.string(),
153
+ status: _zod.z.enum(['recording', 'processing', 'ready', 'failed', 'deleted']),
154
+ egressId: _zod.z.string(),
155
+ objectKey: _zod.z.string(),
156
+ fileSize: _zod.z.number().nullish(),
157
+ durationMs: _zod.z.number().nullish(),
158
+ startedAt: _zod.z.string(),
159
+ stoppedAt: _zod.z.string().nullish(),
160
+ access: _zod.z.enum(['public', 'participants']).default('public'),
161
+ participantIds: _zod.z.array(_zod.z.string()).default([]),
162
+ expiresAt: _zod.z.string(),
163
+ createdAt: _zod.z.string()
164
+ }).passthrough();
165
+ // --- Stream responses ---
166
+
167
+ const ZStartStreamResponse = exports.ZStartStreamResponse = _zod.z.object({
168
+ ingressId: _zod.z.string(),
169
+ url: _zod.z.string()
170
+ }).passthrough();
171
+ const ZGenerateStreamKeyResponse = exports.ZGenerateStreamKeyResponse = _zod.z.object({
172
+ rtmpUrl: _zod.z.string(),
173
+ streamKey: _zod.z.string()
174
+ }).passthrough();
175
+ const ZStreamInfo = exports.ZStreamInfo = _zod.z.object({
176
+ title: _zod.z.string().optional(),
177
+ image: _zod.z.string().optional(),
178
+ description: _zod.z.string().optional()
179
+ }).passthrough();
180
+ // --- Room attachment for posts ---
181
+
182
+ const ZRoomAttachment = exports.ZRoomAttachment = _zod.z.object({
183
+ roomId: _zod.z.string(),
184
+ title: _zod.z.string(),
185
+ status: _zod.z.enum(['scheduled', 'live', 'ended']).optional(),
186
+ type: _zod.z.enum(['talk', 'stage', 'broadcast']).optional(),
187
+ topic: _zod.z.string().optional(),
188
+ host: _zod.z.string().optional()
189
+ }).passthrough();
190
+ // --- Validators ---
191
+
192
+ function validateRoom(data) {
193
+ const result = ZRoom.safeParse(data);
194
+ if (result.success) return result.data;
195
+ console.warn('[live] Invalid Room:', result.error.issues[0]);
196
+ return null;
197
+ }
198
+ function validateRooms(items) {
199
+ if (!Array.isArray(items)) return [];
200
+ const valid = [];
201
+ for (const item of items) {
202
+ const parsed = ZRoom.safeParse(item);
203
+ if (parsed.success) {
204
+ valid.push(parsed.data);
205
+ } else {
206
+ console.warn('[live] Dropping invalid room:', parsed.error.issues[0]);
207
+ }
208
+ }
209
+ return valid;
210
+ }
211
+ function validateHouse(data) {
212
+ const result = ZHouse.safeParse(data);
213
+ if (result.success) return result.data;
214
+ console.warn('[live] Invalid House:', result.error.issues[0]);
215
+ return null;
216
+ }
217
+ function validateRecording(data) {
218
+ const result = ZRecording.safeParse(data);
219
+ if (result.success) return result.data;
220
+ console.warn('[live] Invalid Recording:', result.error.issues[0]);
221
+ return null;
222
+ }
223
+ function validateRecordings(items) {
224
+ if (!Array.isArray(items)) return [];
225
+ const valid = [];
226
+ for (const item of items) {
227
+ const parsed = ZRecording.safeParse(item);
228
+ if (parsed.success) valid.push(parsed.data);
229
+ }
230
+ return valid;
231
+ }
232
+ function validateSeries(data) {
233
+ const result = ZSeries.safeParse(data);
234
+ if (result.success) return result.data;
235
+ console.warn('[live] Invalid Series:', result.error.issues[0]);
236
+ return null;
237
+ }
238
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_zod","require","ZPodcastQueueItem","exports","z","object","syraPodcastId","string","optional","episodeId","passthrough","ZRoom","_id","id","title","description","nullish","ownerType","enum","default","host","houseId","nullable","createdByAdmin","type","broadcastKind","status","scheduledStart","startedAt","endedAt","speakerPermission","participants","array","speakers","maxParticipants","number","topic","tags","archived","boolean","seriesId","stats","peakListeners","totalJoined","activeIngressId","activeStreamUrl","streamTitle","streamImage","streamDescription","rtmpUrl","rtmpStreamKey","streamStartedAt","streamDurationSec","podcastQueue","recordingEnabled","recordingEgressId","createdAt","ZRoomParticipant","userId","role","isMuted","joinedAt","ZHouseMember","ZHouse","name","avatar","coverImage","members","createdBy","isPublic","ZRecurrence","dayOfWeek","min","max","dayOfMonth","time","regex","timezone","ZRoomTemplate","titlePattern","ZSeriesEpisode","roomId","episodeNumber","ZSeries","recurrence","roomTemplate","episodes","nextEpisodeNumber","isActive","ZRecording","roomTitle","egressId","objectKey","fileSize","durationMs","stoppedAt","access","participantIds","expiresAt","ZStartStreamResponse","ingressId","url","ZGenerateStreamKeyResponse","streamKey","ZStreamInfo","image","ZRoomAttachment","validateRoom","data","result","safeParse","success","console","warn","error","issues","validateRooms","items","Array","isArray","valid","item","parsed","push","validateHouse","validateRecording","validateRecordings","validateSeries"],"sourceRoot":"../../../src","sources":["live/validation.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.trackSummarySchema = exports.podcastSummarySchema = exports.episodeSummarySchema = exports.coverArtVariantSchema = exports.coverArtSizesSchema = void 0;
7
+ var _zod = require("zod");
8
+ /**
9
+ * Minimal, self-contained schemas for the public Syra API response shapes this
10
+ * SDK consumes. Intentionally NOT shared with the Syra backend's internal
11
+ * types — the SDK validates only the fields it returns, and tolerantly strips
12
+ * everything else (Zod object schemas drop unknown keys by default), so the API
13
+ * can evolve without breaking external consumers.
14
+ */
15
+
16
+ /** A single artwork variant. The backend serializes `url` as `/api/images/:id`. */
17
+ const coverArtVariantSchema = exports.coverArtVariantSchema = _zod.z.object({
18
+ id: _zod.z.string().optional(),
19
+ url: _zod.z.string(),
20
+ width: _zod.z.number().optional(),
21
+ height: _zod.z.number().optional()
22
+ });
23
+ /** Named artwork variants keyed by size. */
24
+ const coverArtSizesSchema = exports.coverArtSizesSchema = _zod.z.object({
25
+ small: coverArtVariantSchema.optional(),
26
+ medium: coverArtVariantSchema.optional(),
27
+ large: coverArtVariantSchema.optional(),
28
+ xlarge: coverArtVariantSchema.optional(),
29
+ xxlarge: coverArtVariantSchema.optional(),
30
+ original: coverArtVariantSchema.optional()
31
+ });
32
+
33
+ /** Artwork size name. */
34
+
35
+ /**
36
+ * The summary view of a track returned by the public catalog endpoints — just
37
+ * enough to render a song row and play its preview.
38
+ */
39
+ const trackSummarySchema = exports.trackSummarySchema = _zod.z.object({
40
+ id: _zod.z.string(),
41
+ title: _zod.z.string(),
42
+ artistId: _zod.z.string().optional(),
43
+ artistName: _zod.z.string(),
44
+ albumId: _zod.z.string().optional(),
45
+ albumName: _zod.z.string().optional(),
46
+ duration: _zod.z.number(),
47
+ coverArt: _zod.z.string().optional(),
48
+ coverArtSizes: coverArtSizesSchema.optional(),
49
+ previewAvailable: _zod.z.boolean().optional()
50
+ });
51
+ /**
52
+ * The summary view of a podcast SHOW returned by the public podcast endpoints
53
+ * (`GET /api/podcasts/search`, `GET /api/podcasts/:id`) — just enough to render
54
+ * a show card and deep-link into the Syra app.
55
+ *
56
+ * Artwork mirrors tracks: `image` is the re-hosted Syra image id (resolved via
57
+ * `/api/images/:id`); `imageSizes` is the multi-resolution variant set (each
58
+ * variant `url` is `/api/images/:id`); `imageSourceUrl` keeps the original
59
+ * external artwork URL as an absolute fallback when re-hosting has not run yet.
60
+ */
61
+ const podcastSummarySchema = exports.podcastSummarySchema = _zod.z.object({
62
+ id: _zod.z.string(),
63
+ title: _zod.z.string(),
64
+ author: _zod.z.string().optional(),
65
+ description: _zod.z.string().optional(),
66
+ image: _zod.z.string().optional(),
67
+ imageSizes: coverArtSizesSchema.optional(),
68
+ imageSourceUrl: _zod.z.string().optional()
69
+ });
70
+ /**
71
+ * The summary view of a podcast EPISODE returned by the public podcast endpoints
72
+ * (`GET /api/podcasts/:id/episodes`, `GET /api/episodes/:id`) — just enough to
73
+ * list an episode and stream its audio.
74
+ *
75
+ * `enclosureUrl` is the direct audio file URL (e.g.
76
+ * `https://api.fastcast.ai/audio/<guid>.mp3`) and is REQUIRED: an episode with
77
+ * no enclosure is unplayable, so a row missing it is treated as malformed and
78
+ * dropped rather than surfaced as a dead entry. `enclosureType` /
79
+ * `enclosureLength` describe that file (MIME type and byte length); `duration`
80
+ * is the runtime in seconds and `pubDate` the ISO publish timestamp.
81
+ *
82
+ * Artwork mirrors the podcast SHOW: `image` is the re-hosted Syra image id
83
+ * (resolved via `/api/images/:id`); `imageSizes` is the multi-resolution variant
84
+ * set (each variant `url` is `/api/images/:id`); `imageSourceUrl` keeps the
85
+ * original external artwork URL as an absolute fallback when re-hosting has not
86
+ * run yet.
87
+ */
88
+ const episodeSummarySchema = exports.episodeSummarySchema = _zod.z.object({
89
+ id: _zod.z.string(),
90
+ podcastId: _zod.z.string(),
91
+ title: _zod.z.string(),
92
+ description: _zod.z.string().optional(),
93
+ enclosureUrl: _zod.z.string(),
94
+ enclosureType: _zod.z.string().optional(),
95
+ enclosureLength: _zod.z.number().optional(),
96
+ duration: _zod.z.number().optional(),
97
+ pubDate: _zod.z.string().optional(),
98
+ image: _zod.z.string().optional(),
99
+ imageSizes: coverArtSizesSchema.optional(),
100
+ imageSourceUrl: _zod.z.string().optional()
101
+ });
102
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_zod","require","coverArtVariantSchema","exports","z","object","id","string","optional","url","width","number","height","coverArtSizesSchema","small","medium","large","xlarge","xxlarge","original","trackSummarySchema","title","artistId","artistName","albumId","albumName","duration","coverArt","coverArtSizes","previewAvailable","boolean","podcastSummarySchema","author","description","image","imageSizes","imageSourceUrl","episodeSummarySchema","podcastId","enclosureUrl","enclosureType","enclosureLength","pubDate"],"sourceRoot":"../../src","sources":["schema.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+
3
+ import { trackSummarySchema, podcastSummarySchema, episodeSummarySchema } from "./schema.js";
4
+ import { SyraApiError } from "./errors.js";
5
+
6
+ /** Default base URL of the public Syra API. */
7
+ export const DEFAULT_SYRA_BASE_URL = 'https://api.syra.fm';
8
+
9
+ /** Default base URL of the Syra web app, used for deep links. */
10
+ export const DEFAULT_SYRA_WEB_BASE_URL = 'https://syra.fm';
11
+
12
+ /**
13
+ * One page of paginated catalog search results.
14
+ *
15
+ * `hasMore` reflects the BACKEND's pagination over the full matching set — NOT
16
+ * `items.length`. {@link SyraClient.searchTracks} additionally filters its page
17
+ * client-side to preview-available tracks, so `items.length` can be smaller than
18
+ * `limit` while `hasMore` is still `true`; callers must paginate by advancing
19
+ * `offset` by `limit` (the page size), never by `items.length`.
20
+ */
21
+
22
+ /** Minimal shape from which track artwork URLs can be derived. */
23
+
24
+ /** Minimal shape from which podcast-show artwork URLs can be derived. */
25
+
26
+ /** Minimal shape from which podcast-episode artwork URLs can be derived. */
27
+
28
+ /** Order used to pick the best available artwork variant when none is named. */
29
+ const ARTWORK_FALLBACK_ORDER = ['original', 'xxlarge', 'xlarge', 'large', 'medium', 'small'];
30
+ const OBJECT_ID_PATTERN = /^[a-f\d]{24}$/i;
31
+
32
+ /**
33
+ * Default episode page size, matching the backend's own default so the SDK's
34
+ * offset→page translation lines up with the server's pagination window.
35
+ */
36
+ const DEFAULT_EPISODES_PAGE_SIZE = 20;
37
+
38
+ /** Read a finite number from an unknown response field, else a fallback. */
39
+ function numberOr(value, fallback) {
40
+ return typeof value === 'number' && Number.isFinite(value) ? value : fallback;
41
+ }
42
+ /**
43
+ * Create a headless client for the public Syra API. Public reads only — there
44
+ * is no authentication in this version.
45
+ */
46
+ export function createSyraClient(options = {}) {
47
+ const baseURL = (options.baseURL ?? DEFAULT_SYRA_BASE_URL).replace(/\/+$/, '');
48
+ const webBaseURL = (options.webBaseURL ?? DEFAULT_SYRA_WEB_BASE_URL).replace(/\/+$/, '');
49
+ function resolveFetch() {
50
+ if (options.fetch) {
51
+ return options.fetch;
52
+ }
53
+ const globalFetch = globalThis.fetch;
54
+ if (typeof globalFetch === 'function') {
55
+ return globalFetch.bind(globalThis);
56
+ }
57
+ throw new Error('@syra.fm/sdk: no global fetch is available. Pass `fetch` in createSyraClient options, ' + 'or run on Node 18+, a browser, or React Native.');
58
+ }
59
+ async function getJson(path) {
60
+ const doFetch = resolveFetch();
61
+ const response = await doFetch(`${baseURL}${path}`, {
62
+ headers: {
63
+ Accept: 'application/json'
64
+ }
65
+ });
66
+ if (!response.ok) {
67
+ throw new SyraApiError(response.status, `Syra API request failed: ${response.status} ${response.statusText} (${path})`);
68
+ }
69
+ return response.json();
70
+ }
71
+ function resolveImageRef(ref) {
72
+ if (!ref) {
73
+ return undefined;
74
+ }
75
+ if (/^https?:\/\//i.test(ref)) {
76
+ return ref;
77
+ }
78
+ if (ref.startsWith('/api/images/')) {
79
+ return `${baseURL}${ref}`;
80
+ }
81
+ if (OBJECT_ID_PATTERN.test(ref)) {
82
+ return `${baseURL}/api/images/${ref}`;
83
+ }
84
+ return undefined;
85
+ }
86
+ return {
87
+ async searchTracks(query, searchOptions = {}) {
88
+ const params = new URLSearchParams({
89
+ q: query,
90
+ category: 'tracks'
91
+ });
92
+ if (typeof searchOptions.limit === 'number') {
93
+ params.set('limit', String(searchOptions.limit));
94
+ }
95
+ if (typeof searchOptions.offset === 'number') {
96
+ params.set('offset', String(searchOptions.offset));
97
+ }
98
+ const json = await getJson(`/api/search?${params.toString()}`);
99
+ const rawTracks = Array.isArray(json?.results?.tracks) ? json.results.tracks : [];
100
+ const items = [];
101
+ for (const raw of rawTracks) {
102
+ // A single malformed catalog row must not fail the whole search.
103
+ const parsed = trackSummarySchema.safeParse(raw);
104
+ if (parsed.success && parsed.data.previewAvailable === true) {
105
+ items.push(parsed.data);
106
+ }
107
+ }
108
+ return {
109
+ items,
110
+ // `hasMore` is sourced from the backend's pagination over the FULL result
111
+ // set; the client-side preview filter above may shrink `items` below
112
+ // `limit`, but must NOT corrupt `hasMore` (else a page whose tail was
113
+ // filtered out would falsely report the end of the catalog).
114
+ hasMore: json?.hasMore === true,
115
+ limit: numberOr(json?.limit, searchOptions.limit ?? rawTracks.length),
116
+ offset: numberOr(json?.offset, searchOptions.offset ?? 0)
117
+ };
118
+ },
119
+ async getTrack(id) {
120
+ const json = await getJson(`/api/tracks/${encodeURIComponent(id)}`);
121
+ return trackSummarySchema.parse(json);
122
+ },
123
+ previewUrl(id, startSec = 0) {
124
+ const safeStart = Number.isFinite(startSec) ? Math.max(0, Math.trunc(startSec)) : 0;
125
+ return `${baseURL}/api/preview/${encodeURIComponent(id)}.mp3?start=${safeStart}`;
126
+ },
127
+ artworkUrl(source, size) {
128
+ if (typeof source === 'string') {
129
+ return resolveImageRef(source);
130
+ }
131
+ if (size && source.coverArtSizes) {
132
+ const resolved = resolveImageRef(source.coverArtSizes[size]?.url);
133
+ if (resolved) {
134
+ return resolved;
135
+ }
136
+ }
137
+ const fromCoverArt = resolveImageRef(source.coverArt);
138
+ if (fromCoverArt) {
139
+ return fromCoverArt;
140
+ }
141
+ if (source.coverArtSizes) {
142
+ for (const key of ARTWORK_FALLBACK_ORDER) {
143
+ const resolved = resolveImageRef(source.coverArtSizes[key]?.url);
144
+ if (resolved) {
145
+ return resolved;
146
+ }
147
+ }
148
+ }
149
+ return undefined;
150
+ },
151
+ async searchPodcasts(query, searchOptions = {}) {
152
+ const params = new URLSearchParams({
153
+ q: query
154
+ });
155
+ if (typeof searchOptions.limit === 'number') {
156
+ params.set('limit', String(searchOptions.limit));
157
+ }
158
+ if (typeof searchOptions.offset === 'number') {
159
+ params.set('offset', String(searchOptions.offset));
160
+ }
161
+ const json = await getJson(`/api/podcasts/search?${params.toString()}`);
162
+ const rawPodcasts = Array.isArray(json?.data) ? json.data : [];
163
+ const items = [];
164
+ for (const raw of rawPodcasts) {
165
+ // A single malformed catalog row must not fail the whole search.
166
+ const parsed = podcastSummarySchema.safeParse(raw);
167
+ if (parsed.success) {
168
+ items.push(parsed.data);
169
+ }
170
+ }
171
+ return {
172
+ items,
173
+ // `hasMore` reflects the backend's pagination over the full result set.
174
+ hasMore: json?.hasMore === true,
175
+ limit: numberOr(json?.limit, searchOptions.limit ?? rawPodcasts.length),
176
+ offset: numberOr(json?.offset, searchOptions.offset ?? 0)
177
+ };
178
+ },
179
+ async getPodcast(id) {
180
+ const json = await getJson(`/api/podcasts/${encodeURIComponent(id)}`);
181
+ return podcastSummarySchema.parse(json?.data?.podcast);
182
+ },
183
+ podcastUrl(id) {
184
+ return `${webBaseURL}/podcasts/${encodeURIComponent(id)}`;
185
+ },
186
+ podcastArtworkUrl(source, size) {
187
+ if (size && source.imageSizes) {
188
+ const resolved = resolveImageRef(source.imageSizes[size]?.url);
189
+ if (resolved) {
190
+ return resolved;
191
+ }
192
+ }
193
+ const fromImage = resolveImageRef(source.image);
194
+ if (fromImage) {
195
+ return fromImage;
196
+ }
197
+ if (source.imageSizes) {
198
+ for (const key of ARTWORK_FALLBACK_ORDER) {
199
+ const resolved = resolveImageRef(source.imageSizes[key]?.url);
200
+ if (resolved) {
201
+ return resolved;
202
+ }
203
+ }
204
+ }
205
+ return resolveImageRef(source.imageSourceUrl);
206
+ },
207
+ async getPodcastEpisodes(podcastId, listOptions = {}) {
208
+ // The endpoint paginates by 1-based `page`; translate the SDK's uniform
209
+ // offset-based paging into it. `limit` must be concrete (unlike search,
210
+ // which can omit it) because the page number is derived from it.
211
+ const limit = listOptions.limit ?? DEFAULT_EPISODES_PAGE_SIZE;
212
+ const offset = listOptions.offset ?? 0;
213
+ const page = Math.floor(offset / limit) + 1;
214
+ const json = await getJson(`/api/podcasts/${encodeURIComponent(podcastId)}/episodes?page=${page}&limit=${limit}`);
215
+ const rawEpisodes = Array.isArray(json?.data) ? json.data : [];
216
+ const items = [];
217
+ for (const raw of rawEpisodes) {
218
+ // A single malformed episode row must not fail the whole listing.
219
+ const parsed = episodeSummarySchema.safeParse(raw);
220
+ if (parsed.success) {
221
+ items.push(parsed.data);
222
+ }
223
+ }
224
+
225
+ // `total` is the backend's full count over the show; derive `hasMore` from
226
+ // it rather than `items.length`, which the schema/enclosure filter above may
227
+ // shrink below `limit` on a page that is NOT the last one. Absent a count,
228
+ // fall back to what we have (this page ends the listing).
229
+ const total = numberOr(json?.total, offset + items.length);
230
+ return {
231
+ items,
232
+ hasMore: page * limit < total,
233
+ limit,
234
+ offset
235
+ };
236
+ },
237
+ async getEpisode(episodeId) {
238
+ const json = await getJson(`/api/episodes/${encodeURIComponent(episodeId)}`);
239
+ return episodeSummarySchema.parse(json?.data?.episode);
240
+ },
241
+ episodeImageUrl(source, size) {
242
+ if (size && source.imageSizes) {
243
+ const resolved = resolveImageRef(source.imageSizes[size]?.url);
244
+ if (resolved) {
245
+ return resolved;
246
+ }
247
+ }
248
+ const fromImage = resolveImageRef(source.image);
249
+ if (fromImage) {
250
+ return fromImage;
251
+ }
252
+ if (source.imageSizes) {
253
+ for (const key of ARTWORK_FALLBACK_ORDER) {
254
+ const resolved = resolveImageRef(source.imageSizes[key]?.url);
255
+ if (resolved) {
256
+ return resolved;
257
+ }
258
+ }
259
+ }
260
+ return resolveImageRef(source.imageSourceUrl);
261
+ }
262
+ };
263
+ }
264
+ //# sourceMappingURL=client.js.map