@openrails/contentkit-ui 0.0.0-placeholder → 0.68.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 (367) hide show
  1. package/README.md +424 -1
  2. package/dist/appearance.d.ts +38 -0
  3. package/dist/appearance.js +15 -0
  4. package/dist/appearance.js.map +1 -0
  5. package/dist/assets/hash.worker-BYfo-7MQ.js.map +1 -0
  6. package/dist/client/aspect.d.ts +6 -0
  7. package/dist/client/aspect.js +17 -0
  8. package/dist/client/aspect.js.map +1 -0
  9. package/dist/client/client.d.ts +51 -0
  10. package/dist/client/client.js +35 -0
  11. package/dist/client/client.js.map +1 -0
  12. package/dist/client/codes.d.ts +12 -0
  13. package/dist/client/codes.js +19 -0
  14. package/dist/client/codes.js.map +1 -0
  15. package/dist/client/content/bans.d.ts +15 -0
  16. package/dist/client/content/bans.js +40 -0
  17. package/dist/client/content/bans.js.map +1 -0
  18. package/dist/client/content/comments.d.ts +36 -0
  19. package/dist/client/content/comments.js +93 -0
  20. package/dist/client/content/comments.js.map +1 -0
  21. package/dist/client/content/favorites.d.ts +14 -0
  22. package/dist/client/content/favorites.js +42 -0
  23. package/dist/client/content/favorites.js.map +1 -0
  24. package/dist/client/content/moderation.d.ts +18 -0
  25. package/dist/client/content/moderation.js +37 -0
  26. package/dist/client/content/moderation.js.map +1 -0
  27. package/dist/client/content/polls.d.ts +47 -0
  28. package/dist/client/content/polls.js +148 -0
  29. package/dist/client/content/polls.js.map +1 -0
  30. package/dist/client/content/posts.d.ts +44 -0
  31. package/dist/client/content/posts.js +91 -0
  32. package/dist/client/content/posts.js.map +1 -0
  33. package/dist/client/content/reactions.d.ts +12 -0
  34. package/dist/client/content/reactions.js +36 -0
  35. package/dist/client/content/reactions.js.map +1 -0
  36. package/dist/client/content/types.d.ts +91 -0
  37. package/dist/client/content/types.js +8 -0
  38. package/dist/client/content/types.js.map +1 -0
  39. package/dist/client/crop.d.ts +32 -0
  40. package/dist/client/crop.js +103 -0
  41. package/dist/client/crop.js.map +1 -0
  42. package/dist/client/errors.d.ts +54 -0
  43. package/dist/client/errors.js +80 -0
  44. package/dist/client/errors.js.map +1 -0
  45. package/dist/client/gallery.d.ts +43 -0
  46. package/dist/client/gallery.js +86 -0
  47. package/dist/client/gallery.js.map +1 -0
  48. package/dist/client/generated/error-codes.d.ts +5 -0
  49. package/dist/client/generated/error-codes.js +131 -0
  50. package/dist/client/generated/error-codes.js.map +1 -0
  51. package/dist/client/generated/routes.d.ts +1086 -0
  52. package/dist/client/generated/routes.js +1400 -0
  53. package/dist/client/generated/routes.js.map +1 -0
  54. package/dist/client/generated/wire.d.ts +630 -0
  55. package/dist/client/generated/wire.js +6 -0
  56. package/dist/client/generated/wire.js.map +1 -0
  57. package/dist/client/http.d.ts +79 -0
  58. package/dist/client/http.js +74 -0
  59. package/dist/client/http.js.map +1 -0
  60. package/dist/client/image.d.ts +24 -0
  61. package/dist/client/image.js +65 -0
  62. package/dist/client/image.js.map +1 -0
  63. package/dist/client/index.d.ts +33 -0
  64. package/dist/client/media/api.d.ts +36 -0
  65. package/dist/client/media/api.js +61 -0
  66. package/dist/client/media/api.js.map +1 -0
  67. package/dist/client/media/client.d.ts +247 -0
  68. package/dist/client/media/client.js +407 -0
  69. package/dist/client/media/client.js.map +1 -0
  70. package/dist/client/media/encode.d.ts +3 -0
  71. package/dist/client/media/encode.js +8 -0
  72. package/dist/client/media/encode.js.map +1 -0
  73. package/dist/client/media/hash-stream.d.ts +6 -0
  74. package/dist/client/media/hash-stream.js +16 -0
  75. package/dist/client/media/hash-stream.js.map +1 -0
  76. package/dist/client/media/hash.d.ts +12 -0
  77. package/dist/client/media/hash.js +48 -0
  78. package/dist/client/media/hash.js.map +1 -0
  79. package/dist/client/media/hash.worker-inline.js +18 -0
  80. package/dist/client/media/hash.worker-inline.js.map +1 -0
  81. package/dist/client/media/pacer.d.ts +21 -0
  82. package/dist/client/media/pacer.js +25 -0
  83. package/dist/client/media/pacer.js.map +1 -0
  84. package/dist/client/media/queue.d.ts +112 -0
  85. package/dist/client/media/queue.js +274 -0
  86. package/dist/client/media/queue.js.map +1 -0
  87. package/dist/client/media/ref.d.ts +6 -0
  88. package/dist/client/media/ref.js +10 -0
  89. package/dist/client/media/ref.js.map +1 -0
  90. package/dist/client/media/rules.d.ts +52 -0
  91. package/dist/client/media/rules.js +139 -0
  92. package/dist/client/media/rules.js.map +1 -0
  93. package/dist/client/media/transport.d.ts +13 -0
  94. package/dist/client/media/transport.js +33 -0
  95. package/dist/client/media/transport.js.map +1 -0
  96. package/dist/client/media/windows.d.ts +15 -0
  97. package/dist/client/media/windows.js +39 -0
  98. package/dist/client/media/windows.js.map +1 -0
  99. package/dist/client/playback.d.ts +200 -0
  100. package/dist/client/playback.js +142 -0
  101. package/dist/client/playback.js.map +1 -0
  102. package/dist/client/player.d.ts +102 -0
  103. package/dist/client/player.js +155 -0
  104. package/dist/client/player.js.map +1 -0
  105. package/dist/client/public.d.ts +25 -0
  106. package/dist/client/public.js +18 -0
  107. package/dist/client/public.js.map +1 -0
  108. package/dist/client/rendition.d.ts +19 -0
  109. package/dist/client/rendition.js +16 -0
  110. package/dist/client/rendition.js.map +1 -0
  111. package/dist/client/route.d.ts +39 -0
  112. package/dist/client/route.js +31 -0
  113. package/dist/client/route.js.map +1 -0
  114. package/dist/client/taxonomy.d.ts +30 -0
  115. package/dist/client/taxonomy.js +77 -0
  116. package/dist/client/taxonomy.js.map +1 -0
  117. package/dist/client.js +33 -0
  118. package/dist/components/encode-progress.d.ts +15 -0
  119. package/dist/components/encode-progress.js +49 -0
  120. package/dist/components/encode-progress.js.map +1 -0
  121. package/dist/components/hover-preview.d.ts +29 -0
  122. package/dist/components/hover-preview.js +49 -0
  123. package/dist/components/hover-preview.js.map +1 -0
  124. package/dist/components/image-crop-dialog.d.ts +48 -0
  125. package/dist/components/image-crop-dialog.js +359 -0
  126. package/dist/components/image-crop-dialog.js.map +1 -0
  127. package/dist/components/lazy-mount.d.ts +10 -0
  128. package/dist/components/lazy-mount.js +22 -0
  129. package/dist/components/lazy-mount.js.map +1 -0
  130. package/dist/components/media-folder-editor.d.ts +45 -0
  131. package/dist/components/media-folder-editor.js +564 -0
  132. package/dist/components/media-folder-editor.js.map +1 -0
  133. package/dist/components/media-gallery.d.ts +54 -0
  134. package/dist/components/media-gallery.js +597 -0
  135. package/dist/components/media-gallery.js.map +1 -0
  136. package/dist/components/media-readiness-notice.d.ts +24 -0
  137. package/dist/components/media-readiness-notice.js +61 -0
  138. package/dist/components/media-readiness-notice.js.map +1 -0
  139. package/dist/components/player-controls.d.ts +71 -0
  140. package/dist/components/player-controls.js +264 -0
  141. package/dist/components/player-controls.js.map +1 -0
  142. package/dist/components/progress.d.ts +5 -0
  143. package/dist/components/progress.js +14 -0
  144. package/dist/components/progress.js.map +1 -0
  145. package/dist/components/rendition-img.d.ts +34 -0
  146. package/dist/components/rendition-img.js +78 -0
  147. package/dist/components/rendition-img.js.map +1 -0
  148. package/dist/components/slot-editor.d.ts +95 -0
  149. package/dist/components/slot-editor.js +182 -0
  150. package/dist/components/slot-editor.js.map +1 -0
  151. package/dist/components/slot-image.d.ts +23 -0
  152. package/dist/components/slot-image.js +48 -0
  153. package/dist/components/slot-image.js.map +1 -0
  154. package/dist/components/slot-upload.d.ts +41 -0
  155. package/dist/components/slot-upload.js +213 -0
  156. package/dist/components/slot-upload.js.map +1 -0
  157. package/dist/components/social/bans.d.ts +42 -0
  158. package/dist/components/social/bans.js +300 -0
  159. package/dist/components/social/bans.js.map +1 -0
  160. package/dist/components/social/comments.d.ts +42 -0
  161. package/dist/components/social/comments.js +517 -0
  162. package/dist/components/social/comments.js.map +1 -0
  163. package/dist/components/social/engagement.d.ts +45 -0
  164. package/dist/components/social/engagement.js +129 -0
  165. package/dist/components/social/engagement.js.map +1 -0
  166. package/dist/components/social/index.d.ts +6 -0
  167. package/dist/components/social/moderation.d.ts +32 -0
  168. package/dist/components/social/moderation.js +383 -0
  169. package/dist/components/social/moderation.js.map +1 -0
  170. package/dist/components/social/parts.d.ts +50 -0
  171. package/dist/components/social/parts.js +106 -0
  172. package/dist/components/social/parts.js.map +1 -0
  173. package/dist/components/social/poll-editor.d.ts +34 -0
  174. package/dist/components/social/poll-editor.js +567 -0
  175. package/dist/components/social/poll-editor.js.map +1 -0
  176. package/dist/components/social/poll.d.ts +30 -0
  177. package/dist/components/social/poll.js +252 -0
  178. package/dist/components/social/poll.js.map +1 -0
  179. package/dist/components/sortable-list.d.ts +29 -0
  180. package/dist/components/sortable-list.js +121 -0
  181. package/dist/components/sortable-list.js.map +1 -0
  182. package/dist/components/video-mini-player.d.ts +35 -0
  183. package/dist/components/video-mini-player.js +236 -0
  184. package/dist/components/video-mini-player.js.map +1 -0
  185. package/dist/components/video-player.d.ts +146 -0
  186. package/dist/components/video-player.js +630 -0
  187. package/dist/components/video-player.js.map +1 -0
  188. package/dist/components/video-poster-picker.d.ts +59 -0
  189. package/dist/components/video-poster-picker.js +335 -0
  190. package/dist/components/video-poster-picker.js.map +1 -0
  191. package/dist/components/video-poster.d.ts +24 -0
  192. package/dist/components/video-poster.js +46 -0
  193. package/dist/components/video-poster.js.map +1 -0
  194. package/dist/i18n/context.d.ts +4 -0
  195. package/dist/i18n/context.js +11 -0
  196. package/dist/i18n/context.js.map +1 -0
  197. package/dist/i18n/messages.d.ts +40 -0
  198. package/dist/i18n/messages.js +94 -0
  199. package/dist/i18n/messages.js.map +1 -0
  200. package/dist/index.d.ts +23 -0
  201. package/dist/index.js +41 -0
  202. package/dist/locales/de.d.ts +2 -0
  203. package/dist/locales/de.js +271 -0
  204. package/dist/locales/de.js.map +1 -0
  205. package/dist/locales/en.d.ts +457 -0
  206. package/dist/locales/en.js +271 -0
  207. package/dist/locales/en.js.map +1 -0
  208. package/dist/locales/es.d.ts +2 -0
  209. package/dist/locales/es.js +271 -0
  210. package/dist/locales/es.js.map +1 -0
  211. package/dist/locales/ja.d.ts +2 -0
  212. package/dist/locales/ja.js +271 -0
  213. package/dist/locales/ja.js.map +1 -0
  214. package/dist/locales/ko.d.ts +2 -0
  215. package/dist/locales/ko.js +271 -0
  216. package/dist/locales/ko.js.map +1 -0
  217. package/dist/locales/social/de.d.ts +2 -0
  218. package/dist/locales/social/de.js +198 -0
  219. package/dist/locales/social/de.js.map +1 -0
  220. package/dist/locales/social/en.d.ts +195 -0
  221. package/dist/locales/social/en.js +198 -0
  222. package/dist/locales/social/en.js.map +1 -0
  223. package/dist/locales/social/es.d.ts +2 -0
  224. package/dist/locales/social/es.js +198 -0
  225. package/dist/locales/social/es.js.map +1 -0
  226. package/dist/locales/social/ja.d.ts +2 -0
  227. package/dist/locales/social/ja.js +198 -0
  228. package/dist/locales/social/ja.js.map +1 -0
  229. package/dist/locales/social/ko.d.ts +2 -0
  230. package/dist/locales/social/ko.js +198 -0
  231. package/dist/locales/social/ko.js.map +1 -0
  232. package/dist/locales/social/zh.d.ts +2 -0
  233. package/dist/locales/social/zh.js +198 -0
  234. package/dist/locales/social/zh.js.map +1 -0
  235. package/dist/locales/zh.d.ts +2 -0
  236. package/dist/locales/zh.js +271 -0
  237. package/dist/locales/zh.js.map +1 -0
  238. package/dist/provider.d.ts +22 -0
  239. package/dist/provider.js +59 -0
  240. package/dist/provider.js.map +1 -0
  241. package/dist/react/canonical.d.ts +33 -0
  242. package/dist/react/canonical.js +88 -0
  243. package/dist/react/canonical.js.map +1 -0
  244. package/dist/react/comments.d.ts +82 -0
  245. package/dist/react/comments.js +147 -0
  246. package/dist/react/comments.js.map +1 -0
  247. package/dist/react/config.d.ts +13 -0
  248. package/dist/react/config.js +14 -0
  249. package/dist/react/config.js.map +1 -0
  250. package/dist/react/context.d.ts +48 -0
  251. package/dist/react/context.js +37 -0
  252. package/dist/react/context.js.map +1 -0
  253. package/dist/react/crop.d.ts +49 -0
  254. package/dist/react/crop.js +107 -0
  255. package/dist/react/crop.js.map +1 -0
  256. package/dist/react/engagement.d.ts +38 -0
  257. package/dist/react/engagement.js +88 -0
  258. package/dist/react/engagement.js.map +1 -0
  259. package/dist/react/folder.d.ts +83 -0
  260. package/dist/react/folder.js +183 -0
  261. package/dist/react/folder.js.map +1 -0
  262. package/dist/react/gallery.d.ts +140 -0
  263. package/dist/react/gallery.js +477 -0
  264. package/dist/react/gallery.js.map +1 -0
  265. package/dist/react/index.d.ts +21 -0
  266. package/dist/react/inline-preview.d.ts +24 -0
  267. package/dist/react/inline-preview.js +76 -0
  268. package/dist/react/inline-preview.js.map +1 -0
  269. package/dist/react/player.d.ts +70 -0
  270. package/dist/react/player.js +214 -0
  271. package/dist/react/player.js.map +1 -0
  272. package/dist/react/polls.d.ts +74 -0
  273. package/dist/react/polls.js +176 -0
  274. package/dist/react/polls.js.map +1 -0
  275. package/dist/react/posts.d.ts +59 -0
  276. package/dist/react/posts.js +149 -0
  277. package/dist/react/posts.js.map +1 -0
  278. package/dist/react/provider.d.ts +23 -0
  279. package/dist/react/provider.js +35 -0
  280. package/dist/react/provider.js.map +1 -0
  281. package/dist/react/public.d.ts +39 -0
  282. package/dist/react/public.js +70 -0
  283. package/dist/react/public.js.map +1 -0
  284. package/dist/react/read.d.ts +52 -0
  285. package/dist/react/read.js +143 -0
  286. package/dist/react/read.js.map +1 -0
  287. package/dist/react/resources.d.ts +70 -0
  288. package/dist/react/resources.js +247 -0
  289. package/dist/react/resources.js.map +1 -0
  290. package/dist/react/slot.d.ts +102 -0
  291. package/dist/react/slot.js +181 -0
  292. package/dist/react/slot.js.map +1 -0
  293. package/dist/react/store.d.ts +51 -0
  294. package/dist/react/store.js +164 -0
  295. package/dist/react/store.js.map +1 -0
  296. package/dist/react/upload.d.ts +85 -0
  297. package/dist/react/upload.js +150 -0
  298. package/dist/react/upload.js.map +1 -0
  299. package/dist/react/use-resource.d.ts +43 -0
  300. package/dist/react/use-resource.js +66 -0
  301. package/dist/react/use-resource.js.map +1 -0
  302. package/dist/react/video.d.ts +118 -0
  303. package/dist/react/video.js +184 -0
  304. package/dist/react/video.js.map +1 -0
  305. package/dist/react/viewport.d.ts +19 -0
  306. package/dist/react/viewport.js +30 -0
  307. package/dist/react/viewport.js.map +1 -0
  308. package/dist/react.js +21 -0
  309. package/dist/scope.d.ts +14 -0
  310. package/dist/scope.js +30 -0
  311. package/dist/scope.js.map +1 -0
  312. package/dist/styles.css +3 -0
  313. package/dist/ui/alert-dialog.d.ts +18 -0
  314. package/dist/ui/alert-dialog.js +86 -0
  315. package/dist/ui/alert-dialog.js.map +1 -0
  316. package/dist/ui/alert.d.ts +10 -0
  317. package/dist/ui/alert.js +38 -0
  318. package/dist/ui/alert.js.map +1 -0
  319. package/dist/ui/avatar.d.ts +11 -0
  320. package/dist/ui/avatar.js +31 -0
  321. package/dist/ui/avatar.js.map +1 -0
  322. package/dist/ui/badge.d.ts +7 -0
  323. package/dist/ui/badge.js +31 -0
  324. package/dist/ui/badge.js.map +1 -0
  325. package/dist/ui/button.d.ts +8 -0
  326. package/dist/ui/button.js +46 -0
  327. package/dist/ui/button.js.map +1 -0
  328. package/dist/ui/dialog.d.ts +17 -0
  329. package/dist/ui/dialog.js +91 -0
  330. package/dist/ui/dialog.js.map +1 -0
  331. package/dist/ui/dropdown-menu.d.ts +15 -0
  332. package/dist/ui/dropdown-menu.js +105 -0
  333. package/dist/ui/dropdown-menu.js.map +1 -0
  334. package/dist/ui/input.d.ts +3 -0
  335. package/dist/ui/input.js +17 -0
  336. package/dist/ui/input.js.map +1 -0
  337. package/dist/ui/label.d.ts +3 -0
  338. package/dist/ui/label.js +15 -0
  339. package/dist/ui/label.js.map +1 -0
  340. package/dist/ui/progress.d.ts +7 -0
  341. package/dist/ui/progress.js +31 -0
  342. package/dist/ui/progress.js.map +1 -0
  343. package/dist/ui/select.d.ts +15 -0
  344. package/dist/ui/select.js +98 -0
  345. package/dist/ui/select.js.map +1 -0
  346. package/dist/ui/skeleton.d.ts +2 -0
  347. package/dist/ui/skeleton.js +14 -0
  348. package/dist/ui/skeleton.js.map +1 -0
  349. package/dist/ui/slider.d.ts +3 -0
  350. package/dist/ui/slider.js +35 -0
  351. package/dist/ui/slider.js.map +1 -0
  352. package/dist/ui/switch.d.ts +5 -0
  353. package/dist/ui/switch.js +20 -0
  354. package/dist/ui/switch.js.map +1 -0
  355. package/dist/ui/tabs.d.ts +10 -0
  356. package/dist/ui/tabs.js +47 -0
  357. package/dist/ui/tabs.js.map +1 -0
  358. package/dist/ui/textarea.d.ts +3 -0
  359. package/dist/ui/textarea.js +15 -0
  360. package/dist/ui/textarea.js.map +1 -0
  361. package/dist/ui/toggle-group.d.ts +5 -0
  362. package/dist/ui/toggle-group.js +23 -0
  363. package/dist/ui/toggle-group.js.map +1 -0
  364. package/dist/urls/index.d.ts +100 -0
  365. package/dist/urls.js +118 -0
  366. package/dist/urls.js.map +1 -0
  367. package/package.json +113 -3
@@ -0,0 +1,79 @@
1
+ import { ContentChange } from './content/types.js';
2
+ import { FileInfo, RefBody } from './generated/wire.js';
3
+ /** A module's base URL, or one per item (a host that splits uploads by kind). */
4
+ export type Mount = string | ((ref: RefBody) => string);
5
+ /**
6
+ * Where each module lives when the host does not serve them all under
7
+ * baseUrl's fixed sub-paths.
8
+ */
9
+ export interface ContentKitMounts {
10
+ /** Posts, comments, reactions, favorites, polls, bans, moderation. Default baseUrl. */
11
+ content?: string;
12
+ /** Media reads and HLS playlists. Default `{baseUrl}/media`. */
13
+ media?: Mount;
14
+ /** Uploads and commits. Default `{baseUrl}/media/upload`. */
15
+ upload?: Mount;
16
+ /** Content-code lookup. Default `{baseUrl}/codes`. */
17
+ codes?: string;
18
+ /** Taxonomy. Default `{baseUrl}/taxonomy`. */
19
+ taxonomy?: string;
20
+ }
21
+ export type ContentKitModule = keyof ContentKitMounts;
22
+ /** A mutation made through the client: the host's cache-invalidation hook gets each one. */
23
+ export type ContentKitChange =
24
+ /** A commit applied; files are the item's uploads as an editor reads them, without URLs. */
25
+ {
26
+ type: "media.committed";
27
+ ref: RefBody;
28
+ files: FileInfo[];
29
+ }
30
+ /** An upload finished processing, as an editor read returns it. */
31
+ | {
32
+ type: "media.processed";
33
+ ref: RefBody;
34
+ file: FileInfo;
35
+ } | ContentChange;
36
+ export type TokenSource = () => string | null | undefined | Promise<string | null | undefined>;
37
+ export interface HttpOptions {
38
+ /** Where the host mounts ContentKit, e.g. "/api/v1/contentkit". */
39
+ baseUrl: string;
40
+ mounts?: ContentKitMounts;
41
+ /** Transport for API calls; pass an authenticating fetch (auth-ui's authFetch). */
42
+ fetch?: typeof fetch;
43
+ /**
44
+ * Bearer for API calls and for HLS playlists on the API origin (hls.js
45
+ * loads them with XHR, not fetch). An authenticating fetch overrides it.
46
+ */
47
+ token?: TokenSource;
48
+ /** Sent as Accept-Language. */
49
+ language?: () => string | null | undefined;
50
+ /** Extra headers per call (CSRF). */
51
+ headers?: () => HeadersInit | Promise<HeadersInit>;
52
+ /** Default "same-origin"; "include" also sends cookies with HLS requests. */
53
+ credentials?: RequestCredentials;
54
+ }
55
+ export interface RequestOptions {
56
+ method?: string;
57
+ body?: unknown;
58
+ signal?: AbortSignal;
59
+ /** Read the body as a Blob instead of JSON. */
60
+ blob?: boolean;
61
+ }
62
+ /** The transport every module shares: mounts, auth, language, errors and change events. */
63
+ export declare class Http {
64
+ private readonly o;
65
+ private readonly listeners;
66
+ private readonly base;
67
+ constructor(o: HttpOptions);
68
+ /** The module's base URL, without a trailing slash. */
69
+ mount(module: ContentKitModule, ref?: RefBody): string;
70
+ request<T>(url: string, { method, body, signal, blob }?: RequestOptions): Promise<T>;
71
+ /**
72
+ * hls.js `xhrSetup`: opens the request, sends cookies when credentials is
73
+ * "include", and adds the bearer only on the API's origin (never a media host).
74
+ */
75
+ readonly xhrSetup: (xhr: XMLHttpRequest, url: string) => Promise<void>;
76
+ subscribe(listener: (change: ContentKitChange) => void): () => void;
77
+ emit(change: ContentKitChange): void;
78
+ private onApiOrigin;
79
+ }
@@ -0,0 +1,74 @@
1
+ import { ContentKitError as e, aborted as t, readContentKitError as n } from "./errors.js";
2
+ //#region src/client/http.ts
3
+ var r = (e) => e.replace(/\/+$/, ""), i = class {
4
+ o;
5
+ listeners = /* @__PURE__ */ new Set();
6
+ base;
7
+ constructor(e) {
8
+ if (this.o = e, typeof e.baseUrl != "string") throw Error("contentkit: createContentKitClient needs baseUrl");
9
+ this.base = r(e.baseUrl);
10
+ }
11
+ mount(e, t) {
12
+ let n = this.o.mounts?.[e];
13
+ if (typeof n == "function") {
14
+ if (!t) throw Error(`contentkit: the ${e} mount is per item; pass a ref`);
15
+ return r(n(t));
16
+ }
17
+ if (n !== void 0) return r(n);
18
+ switch (e) {
19
+ case "content": return this.base;
20
+ case "media": return `${this.base}/media`;
21
+ case "upload": return `${this.base}/media/upload`;
22
+ default: return `${this.base}/${e}`;
23
+ }
24
+ }
25
+ async request(r, { method: i, body: a, signal: o, blob: s } = {}) {
26
+ let c = this.o.fetch ?? fetch, l = new Headers(await this.o.headers?.());
27
+ a !== void 0 && l.set("Content-Type", "application/json");
28
+ let u = await this.o.token?.();
29
+ u && !l.has("Authorization") && l.set("Authorization", `Bearer ${u}`);
30
+ let d = this.o.language?.();
31
+ d && l.set("Accept-Language", d);
32
+ let f;
33
+ try {
34
+ f = await c(r, {
35
+ method: i ?? (a === void 0 ? "GET" : "POST"),
36
+ headers: l,
37
+ body: a === void 0 ? null : JSON.stringify(a),
38
+ credentials: this.o.credentials ?? "same-origin",
39
+ signal: o ?? null
40
+ });
41
+ } catch (n) {
42
+ throw o?.aborted ? t(o) : new e("network", `ContentKit API ${new URL(r, "http://x").pathname} unreachable`, { cause: n });
43
+ }
44
+ if (!f.ok) throw await n(f);
45
+ return s ? await f.blob() : f.status === 204 ? void 0 : await f.json();
46
+ }
47
+ xhrSetup = async (e, t) => {
48
+ if (e.readyState || e.open("GET", t, !0), this.o.credentials === "include" && (e.withCredentials = !0), !this.onApiOrigin(t)) return;
49
+ let n = await this.o.token?.();
50
+ n && e.setRequestHeader("Authorization", `Bearer ${n}`);
51
+ };
52
+ subscribe(e) {
53
+ return this.listeners.add(e), () => void this.listeners.delete(e);
54
+ }
55
+ emit(e) {
56
+ for (let t of this.listeners) try {
57
+ t(e);
58
+ } catch (e) {
59
+ console.error("contentkit: change listener failed", e);
60
+ }
61
+ }
62
+ onApiOrigin(e) {
63
+ let t = typeof location > "u" ? "http://localhost" : location.href;
64
+ try {
65
+ return new URL(e, t).origin === new URL(this.base || "/", t).origin;
66
+ } catch {
67
+ return !1;
68
+ }
69
+ }
70
+ };
71
+ //#endregion
72
+ export { i as Http };
73
+
74
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","names":[],"sources":["../../src/client/http.ts"],"sourcesContent":["import { ContentKitError, aborted, readContentKitError } from \"./errors.js\";\nimport type { ContentChange } from \"./content/types.js\";\nimport type { FileInfo, RefBody } from \"./generated/wire.js\";\n\n/** A module's base URL, or one per item (a host that splits uploads by kind). */\nexport type Mount = string | ((ref: RefBody) => string);\n\n/**\n * Where each module lives when the host does not serve them all under\n * baseUrl's fixed sub-paths.\n */\nexport interface ContentKitMounts {\n /** Posts, comments, reactions, favorites, polls, bans, moderation. Default baseUrl. */\n content?: string;\n /** Media reads and HLS playlists. Default `{baseUrl}/media`. */\n media?: Mount;\n /** Uploads and commits. Default `{baseUrl}/media/upload`. */\n upload?: Mount;\n /** Content-code lookup. Default `{baseUrl}/codes`. */\n codes?: string;\n /** Taxonomy. Default `{baseUrl}/taxonomy`. */\n taxonomy?: string;\n}\n\nexport type ContentKitModule = keyof ContentKitMounts;\n\n/** A mutation made through the client: the host's cache-invalidation hook gets each one. */\nexport type ContentKitChange =\n /** A commit applied; files are the item's uploads as an editor reads them, without URLs. */\n | { type: \"media.committed\"; ref: RefBody; files: FileInfo[] }\n /** An upload finished processing, as an editor read returns it. */\n | { type: \"media.processed\"; ref: RefBody; file: FileInfo }\n | ContentChange;\n\nexport type TokenSource = () => string | null | undefined | Promise<string | null | undefined>;\n\nexport interface HttpOptions {\n /** Where the host mounts ContentKit, e.g. \"/api/v1/contentkit\". */\n baseUrl: string;\n mounts?: ContentKitMounts;\n /** Transport for API calls; pass an authenticating fetch (auth-ui's authFetch). */\n fetch?: typeof fetch;\n /**\n * Bearer for API calls and for HLS playlists on the API origin (hls.js\n * loads them with XHR, not fetch). An authenticating fetch overrides it.\n */\n token?: TokenSource;\n /** Sent as Accept-Language. */\n language?: () => string | null | undefined;\n /** Extra headers per call (CSRF). */\n headers?: () => HeadersInit | Promise<HeadersInit>;\n /** Default \"same-origin\"; \"include\" also sends cookies with HLS requests. */\n credentials?: RequestCredentials;\n}\n\nexport interface RequestOptions {\n method?: string;\n body?: unknown;\n signal?: AbortSignal;\n /** Read the body as a Blob instead of JSON. */\n blob?: boolean;\n}\n\nconst trim = (u: string) => u.replace(/\\/+$/, \"\");\n\n/** The transport every module shares: mounts, auth, language, errors and change events. */\nexport class Http {\n private readonly listeners = new Set<(change: ContentKitChange) => void>();\n private readonly base: string;\n\n constructor(private readonly o: HttpOptions) {\n if (typeof o.baseUrl !== \"string\") throw new Error(\"contentkit: createContentKitClient needs baseUrl\");\n this.base = trim(o.baseUrl);\n }\n\n /** The module's base URL, without a trailing slash. */\n mount(module: ContentKitModule, ref?: RefBody): string {\n const m = this.o.mounts?.[module];\n if (typeof m === \"function\") {\n if (!ref) throw new Error(`contentkit: the ${module} mount is per item; pass a ref`);\n return trim(m(ref));\n }\n if (m !== undefined) return trim(m);\n switch (module) {\n case \"content\":\n return this.base;\n case \"media\":\n return `${this.base}/media`;\n case \"upload\":\n return `${this.base}/media/upload`;\n default:\n return `${this.base}/${module}`;\n }\n }\n\n async request<T>(url: string, { method, body, signal, blob }: RequestOptions = {}): Promise<T> {\n const f = this.o.fetch ?? fetch;\n const headers = new Headers(await this.o.headers?.());\n if (body !== undefined) headers.set(\"Content-Type\", \"application/json\");\n const token = await this.o.token?.();\n if (token && !headers.has(\"Authorization\")) headers.set(\"Authorization\", `Bearer ${token}`);\n const lang = this.o.language?.();\n if (lang) headers.set(\"Accept-Language\", lang);\n let res: Response;\n try {\n res = await f(url, {\n method: method ?? (body === undefined ? \"GET\" : \"POST\"),\n headers,\n body: body === undefined ? null : JSON.stringify(body),\n credentials: this.o.credentials ?? \"same-origin\",\n signal: signal ?? null,\n });\n } catch (err) {\n if (signal?.aborted) throw aborted(signal);\n throw new ContentKitError(\"network\", `ContentKit API ${new URL(url, \"http://x\").pathname} unreachable`, { cause: err });\n }\n if (!res.ok) throw await readContentKitError(res);\n if (blob) return (await res.blob()) as T;\n return (res.status === 204 ? undefined : await res.json()) as T;\n }\n\n /**\n * hls.js `xhrSetup`: opens the request, sends cookies when credentials is\n * \"include\", and adds the bearer only on the API's origin (never a media host).\n */\n readonly xhrSetup = async (xhr: XMLHttpRequest, url: string): Promise<void> => {\n if (!xhr.readyState) xhr.open(\"GET\", url, true);\n if (this.o.credentials === \"include\") xhr.withCredentials = true;\n if (!this.onApiOrigin(url)) return;\n const token = await this.o.token?.();\n if (token) xhr.setRequestHeader(\"Authorization\", `Bearer ${token}`);\n };\n\n subscribe(listener: (change: ContentKitChange) => void): () => void {\n this.listeners.add(listener);\n return () => void this.listeners.delete(listener);\n }\n\n emit(change: ContentKitChange): void {\n for (const l of this.listeners) {\n try {\n l(change);\n } catch (e) {\n // A host listener's fault must not fail the mutation that succeeded.\n console.error(\"contentkit: change listener failed\", e);\n }\n }\n }\n\n private onApiOrigin(url: string): boolean {\n const here = typeof location === \"undefined\" ? \"http://localhost\" : location.href;\n try {\n return new URL(url, here).origin === new URL(this.base || \"/\", here).origin;\n } catch {\n return false;\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Size } from './crop.js';
2
+ /** An image to crop: a displayable URL and the size of the EXIF-oriented original. */
3
+ export interface CropSource extends Size {
4
+ url: string;
5
+ /** Set when the source was picked locally; revoke() frees its preview. */
6
+ file?: File;
7
+ revoke?: () => void;
8
+ }
9
+ export interface DecodeOptions {
10
+ /** Longest side of the preview; the crop stays normalized to the original. Default 2048. */
11
+ maxPreview?: number;
12
+ }
13
+ /**
14
+ * Decodes a picked file with its EXIF orientation applied and returns a
15
+ * downscaled preview URL plus the oriented original size. Throws
16
+ * ContentKitError("decode") for files the browser cannot read as an image.
17
+ */
18
+ export declare function decodeImage(file: File, o?: DecodeOptions): Promise<CropSource>;
19
+ /**
20
+ * Whether an image file is animated (GIF with several frames, animated WebP,
21
+ * AVIF/HEIF sequence): a cheap pre-check for slots whose `animation` is
22
+ * "reject". The server decides.
23
+ */
24
+ export declare function isAnimatedImage(file: Blob): Promise<boolean>;
@@ -0,0 +1,65 @@
1
+ import { ContentKitError as e } from "./errors.js";
2
+ //#region src/client/image.ts
3
+ async function t(t, r = {}) {
4
+ let i = r.maxPreview ?? 2048, a;
5
+ try {
6
+ a = await createImageBitmap(t, { imageOrientation: "from-image" });
7
+ } catch (t) {
8
+ throw new e("decode", "the file is not a readable image", { cause: t });
9
+ }
10
+ let { width: o, height: s } = a;
11
+ try {
12
+ let e = Math.min(1, i / Math.max(o, s)), r = Math.max(1, Math.round(o * e)), c = Math.max(1, Math.round(s * e)), l = await n(a, r, c, /png|webp|gif|avif/.test(t.type) ? "image/png" : "image/jpeg"), u = URL.createObjectURL(l);
13
+ return {
14
+ url: u,
15
+ width: o,
16
+ height: s,
17
+ file: t,
18
+ revoke: () => URL.revokeObjectURL(u)
19
+ };
20
+ } finally {
21
+ a.close();
22
+ }
23
+ }
24
+ async function n(t, n, r, i) {
25
+ if (typeof OffscreenCanvas < "u") {
26
+ let e = new OffscreenCanvas(n, r);
27
+ return e.getContext("2d").drawImage(t, 0, 0, n, r), e.convertToBlob({
28
+ type: i,
29
+ quality: .9
30
+ });
31
+ }
32
+ let a = document.createElement("canvas");
33
+ return a.width = n, a.height = r, a.getContext("2d").drawImage(t, 0, 0, n, r), new Promise((t, n) => a.toBlob((r) => r ? t(r) : n(new e("decode", "could not render a preview")), i, .9));
34
+ }
35
+ async function r(e) {
36
+ let t = new Uint8Array(await e.slice(0, 64).arrayBuffer()), n = (e, n) => String.fromCharCode(...t.subarray(e, n));
37
+ if (n(0, 4) === "RIFF" && n(8, 12) === "WEBP") return n(12, 16) === "VP8X" && !!(t[20] & 2);
38
+ if (n(4, 8) === "ftyp") {
39
+ let e = n(8, Math.min(t.length, t[0] << 24 | t[1] << 16 | t[2] << 8 | t[3]));
40
+ return /avis|msf1|hevs/.test(e);
41
+ }
42
+ return n(0, 3) === "GIF" && i(new Uint8Array(await e.arrayBuffer())) > 1;
43
+ }
44
+ function i(e) {
45
+ let t = 13;
46
+ e[10] & 128 && (t += 3 * (1 << (e[10] & 7) + 1));
47
+ let n = () => {
48
+ for (; t < e.length && e[t] !== 0;) t += e[t] + 1;
49
+ t++;
50
+ }, r = 0;
51
+ for (; t < e.length;) {
52
+ let i = e[t++];
53
+ if (i === 33) t++, n();
54
+ else if (i === 44) {
55
+ if (++r > 1) return r;
56
+ let i = e[t + 8];
57
+ t += 9, i & 128 && (t += 3 * (1 << (i & 7) + 1)), t++, n();
58
+ } else break;
59
+ }
60
+ return r;
61
+ }
62
+ //#endregion
63
+ export { t as decodeImage, r as isAnimatedImage };
64
+
65
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","names":[],"sources":["../../src/client/image.ts"],"sourcesContent":["import type { Size } from \"./crop.js\";\nimport { ContentKitError } from \"./errors.js\";\n\n/** An image to crop: a displayable URL and the size of the EXIF-oriented original. */\nexport interface CropSource extends Size {\n url: string;\n /** Set when the source was picked locally; revoke() frees its preview. */\n file?: File;\n revoke?: () => void;\n}\n\nexport interface DecodeOptions {\n /** Longest side of the preview; the crop stays normalized to the original. Default 2048. */\n maxPreview?: number;\n}\n\n/**\n * Decodes a picked file with its EXIF orientation applied and returns a\n * downscaled preview URL plus the oriented original size. Throws\n * ContentKitError(\"decode\") for files the browser cannot read as an image.\n */\nexport async function decodeImage(file: File, o: DecodeOptions = {}): Promise<CropSource> {\n const max = o.maxPreview ?? 2048;\n let bitmap: ImageBitmap;\n try {\n bitmap = await createImageBitmap(file, { imageOrientation: \"from-image\" });\n } catch (err) {\n throw new ContentKitError(\"decode\", \"the file is not a readable image\", { cause: err });\n }\n const { width, height } = bitmap;\n try {\n const scale = Math.min(1, max / Math.max(width, height));\n const w = Math.max(1, Math.round(width * scale));\n const h = Math.max(1, Math.round(height * scale));\n const blob = await render(bitmap, w, h, /png|webp|gif|avif/.test(file.type) ? \"image/png\" : \"image/jpeg\");\n const url = URL.createObjectURL(blob);\n return { url, width, height, file, revoke: () => URL.revokeObjectURL(url) };\n } finally {\n bitmap.close();\n }\n}\n\nasync function render(bitmap: ImageBitmap, w: number, h: number, type: string): Promise<Blob> {\n if (typeof OffscreenCanvas !== \"undefined\") {\n const c = new OffscreenCanvas(w, h);\n c.getContext(\"2d\")!.drawImage(bitmap, 0, 0, w, h);\n return c.convertToBlob({ type, quality: 0.9 });\n }\n const c = document.createElement(\"canvas\");\n c.width = w;\n c.height = h;\n c.getContext(\"2d\")!.drawImage(bitmap, 0, 0, w, h);\n return new Promise((resolve, reject) =>\n c.toBlob((b) => (b ? resolve(b) : reject(new ContentKitError(\"decode\", \"could not render a preview\"))), type, 0.9),\n );\n}\n\n/**\n * Whether an image file is animated (GIF with several frames, animated WebP,\n * AVIF/HEIF sequence): a cheap pre-check for slots whose `animation` is\n * \"reject\". The server decides.\n */\nexport async function isAnimatedImage(file: Blob): Promise<boolean> {\n const head = new Uint8Array(await file.slice(0, 64).arrayBuffer());\n const ascii = (a: number, b: number) => String.fromCharCode(...head.subarray(a, b));\n if (ascii(0, 4) === \"RIFF\" && ascii(8, 12) === \"WEBP\") return ascii(12, 16) === \"VP8X\" && (head[20]! & 0x02) !== 0;\n if (ascii(4, 8) === \"ftyp\") {\n const brands = ascii(8, Math.min(head.length, (head[0]! << 24) | (head[1]! << 16) | (head[2]! << 8) | head[3]!));\n return /avis|msf1|hevs/.test(brands);\n }\n if (ascii(0, 3) === \"GIF\") return gifFrames(new Uint8Array(await file.arrayBuffer())) > 1;\n return false;\n}\n\nfunction gifFrames(b: Uint8Array): number {\n let i = 13;\n if (b[10]! & 0x80) i += 3 * (1 << ((b[10]! & 7) + 1));\n const skipBlocks = () => {\n while (i < b.length && b[i]! !== 0) i += b[i]! + 1;\n i++;\n };\n let frames = 0;\n while (i < b.length) {\n const t = b[i++];\n if (t === 0x21) {\n i++;\n skipBlocks();\n } else if (t === 0x2c) {\n if (++frames > 1) return frames;\n const packed = b[i + 8]!;\n i += 9;\n if (packed & 0x80) i += 3 * (1 << ((packed & 7) + 1));\n i++; // LZW minimum code size\n skipBlocks();\n } else break;\n }\n return frames;\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export { createContentKitClient, type ContentKitClient, type ContentKitClientOptions } from './client.js';
2
+ export type { ContentKitChange, ContentKitModule, ContentKitMounts, Mount, TokenSource } from './http.js';
3
+ export { CLIENT_ERROR_CODES, ContentKitError, ERROR_CODES, failureError, isContentKitError, readContentKitError, toContentKitError, type ContentKitErrorCode, type ContentKitErrorInit, } from './errors.js';
4
+ export { PostsClient, type PostAdminQuery, type PostQuery } from './content/posts.js';
5
+ export { CommentsClient, type AdminCommentQuery, type CommentQuery } from './content/comments.js';
6
+ export { ReactionsClient } from './content/reactions.js';
7
+ export { FavoritesClient } from './content/favorites.js';
8
+ export { PollsClient, type PollQuery } from './content/polls.js';
9
+ export { BansClient } from './content/bans.js';
10
+ export { ModerationClient, type HeldQuery } from './content/moderation.js';
11
+ export { reactionVerb, type BanScope, type ContentChange, type Decision, type HeldKind, type Reaction, type Sort } from './content/types.js';
12
+ export { TaxonomyClient, type NodeQuery } from './taxonomy.js';
13
+ export { CodesClient } from './codes.js';
14
+ export { call, routeURL, type CallOptions, type Method, type PageQuery, type PathParams, type RouteQuery, type RoutePath } from './route.js';
15
+ export { MediaApi, type ReadOptions } from './media/api.js';
16
+ export { MediaClient, backoff, samePath, stem, type CommitOptions, type CommitSource, type ContentFolders, type MediaOptions, type NamedOptions, type NamedUpload, type PlannedPart, type Progress, type PutOptions, type UploadOptions, type UploadState, type UploadedFile, type WaitOptions, } from './media/client.js';
17
+ export { UploadQueue, type ItemStatus, type QueueItem, type QueueOptions, type QueueSnapshot } from './media/queue.js';
18
+ export { acceptOf, defaultImage, filesFor, isPattern, ratioLabel, ruleDir, ruleFor, screenFiles, uniqueName, uploadRules, withMediaType, type Screened, } from './media/rules.js';
19
+ export { READ_CHUNK, chunkOffsets, isProcessing, mergeReads, processing } from './media/windows.js';
20
+ export { defaultTransport, fetchTransport, xhrTransport, type Transport } from './media/transport.js';
21
+ export { checkRef, isContentId } from './media/ref.js';
22
+ export { encodeRemaining } from './media/encode.js';
23
+ export { sha256Hex } from './media/hash.js';
24
+ export { Pacer, type PacerOptions } from './media/pacer.js';
25
+ export { centeredCrop, constrainCrop, editOf, editedSize, fromRotated, rotation, sameEdit, toOriginal, toRotated, type Rotation, type Size } from './crop.js';
26
+ export { decodeImage, isAnimatedImage, type CropSource, type DecodeOptions } from './image.js';
27
+ export { aspectOf, ratio, type AspectRatio } from './aspect.js';
28
+ export { fill, publicRenditions, publicURL, srcSet, type PublicPreset } from './public.js';
29
+ export { DEFAULT_DENSITY, densityFor, pickRendition, sortRenditions, type DensityRange, type Rendition } from './rendition.js';
30
+ export { formatDuration, galleryItems, isAudioType, isImageType, isVideoType, isSubtitleType, stageAspect, type GalleryItem, type GalleryLockedItem, type GalleryMediaItem, type GalleryView, } from './gallery.js';
31
+ export { ABR_DEFAULTS, NETWORK_FAILURES_BEFORE_ERROR, abrHlsConfig, capRung, classifyHlsError, classifyMediaError, hlsConfig, initialEstimate, expiryDelay, REFRESH_BEFORE_EXPIRY, refreshable, startRung, statusKind, type AbrPolicy, type ConnectionHint, type HlsErrorLike, type Rung, type PlaybackError, type PlaybackErrorKind, } from './playback.js';
32
+ export { PLAYBACK_SPEEDS, PLAYER_TRACKS_KEY, PLAYER_VOLUME_KEY, parseSpriteVtt, playerKeyAction, resumeAt, type PlayerAction, type PlayerTrack, type SpriteCue, type TrackPrefs, type VolumePrefs, } from './player.js';
33
+ export * from './generated/wire.js';
@@ -0,0 +1,36 @@
1
+ import { Http } from '../http.js';
2
+ import { CommitBody, CommitReply, CompleteReply, PartsBody, PartsReply, PresetRule, PresignBody, PresignReply, ReadResult, RefBody, TicketBody } from '../generated/wire.js';
3
+ /** What a read returns (Reader.Read's ReadOptions). */
4
+ export interface ReadOptions {
5
+ /** Only files under this path prefix, e.g. "low-res/". */
6
+ prefix?: string;
7
+ /** The range of files that get URLs. */
8
+ offset?: number;
9
+ limit?: number;
10
+ /** Sign each file's download name into its URL. */
11
+ download?: boolean;
12
+ /** Editors also get the uploads: edit, frame, pending, failure and editor view. */
13
+ editor?: boolean;
14
+ }
15
+ /**
16
+ * The upload API (media.UploadHandler) and read API (Reader.Handler), one
17
+ * method per route. Each takes the item, whose mount the call goes to.
18
+ */
19
+ export declare class MediaApi {
20
+ private readonly http;
21
+ constructor(http: Http);
22
+ presign(b: PresignBody, signal?: AbortSignal): Promise<PresignReply>;
23
+ parts(ref: RefBody, b: PartsBody, signal?: AbortSignal): Promise<PartsReply>;
24
+ listParts(ref: RefBody, b: TicketBody, signal?: AbortSignal): Promise<PartsReply>;
25
+ complete(ref: RefBody, b: TicketBody, signal?: AbortSignal): Promise<CompleteReply>;
26
+ abort(ref: RefBody, b: TicketBody, signal?: AbortSignal): Promise<void>;
27
+ commit(b: CommitBody, signal?: AbortSignal): Promise<CommitReply>;
28
+ /** A JPEG still of the video upload at path, t seconds in, w pixels wide (0: the frame's). */
29
+ frame(ref: RefBody, path: string, t: number, w?: number, signal?: AbortSignal): Promise<Blob>;
30
+ read(ref: RefBody, o?: ReadOptions, signal?: AbortSignal): Promise<ReadResult>;
31
+ /** Every kind's public presets (the same for every viewer). */
32
+ presets(signal?: AbortSignal): Promise<PresetRule[]>;
33
+ /** The item under the read API: `{media}/{kind}/{id}`. */
34
+ itemURL(ref: RefBody): string;
35
+ private post;
36
+ }
@@ -0,0 +1,61 @@
1
+ import { checkRef as e } from "./ref.js";
2
+ //#region src/client/media/api.ts
3
+ var t = class {
4
+ http;
5
+ constructor(e) {
6
+ this.http = e;
7
+ }
8
+ presign(e, t) {
9
+ return this.post(e.ref, "/presign", e, t);
10
+ }
11
+ parts(e, t, n) {
12
+ return this.post(e, "/parts", t, n);
13
+ }
14
+ listParts(e, t, n) {
15
+ return this.post(e, "/parts/list", t, n);
16
+ }
17
+ complete(e, t, n) {
18
+ return this.post(e, "/complete", t, n);
19
+ }
20
+ abort(e, t, n) {
21
+ return this.post(e, "/abort", t, n);
22
+ }
23
+ commit(e, t) {
24
+ return this.post(e.ref, "/commit", e, t);
25
+ }
26
+ async frame(t, n, r, i, a) {
27
+ e(t);
28
+ let o = new URLSearchParams({
29
+ kind: t.kind,
30
+ id: t.id,
31
+ path: n,
32
+ t: String(r)
33
+ });
34
+ return i && o.set("w", String(i)), this.http.request(`${this.http.mount("upload", t)}/frame?${o}`, {
35
+ signal: a,
36
+ blob: !0
37
+ });
38
+ }
39
+ async read(e, t = {}, n) {
40
+ let r = new URLSearchParams();
41
+ t.prefix && r.set("prefix", t.prefix), t.offset && r.set("offset", String(t.offset)), t.limit && r.set("limit", String(t.limit)), t.download && r.set("download", "1"), t.editor && r.set("editor", "1");
42
+ let i = r.toString();
43
+ return this.http.request(this.itemURL(e) + (i ? "?" + i : ""), { signal: n });
44
+ }
45
+ presets(e) {
46
+ return this.http.request(`${this.http.mount("media")}/presets`, { signal: e });
47
+ }
48
+ itemURL(t) {
49
+ return e(t), `${this.http.mount("media", t)}/${encodeURIComponent(t.kind)}/${encodeURIComponent(t.id)}`;
50
+ }
51
+ async post(t, n, r, i) {
52
+ return e(t), this.http.request(this.http.mount("upload", t) + n, {
53
+ body: r,
54
+ signal: i
55
+ });
56
+ }
57
+ };
58
+ //#endregion
59
+ export { t as MediaApi };
60
+
61
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","names":[],"sources":["../../../src/client/media/api.ts"],"sourcesContent":["import type { Http } from \"../http.js\";\nimport type {\n CommitBody,\n CommitReply,\n CompleteReply,\n PartsBody,\n PartsReply,\n PresetRule,\n PresignBody,\n PresignReply,\n ReadResult,\n RefBody,\n TicketBody,\n} from \"../generated/wire.js\";\nimport { checkRef } from \"./ref.js\";\n\n/** What a read returns (Reader.Read's ReadOptions). */\nexport interface ReadOptions {\n /** Only files under this path prefix, e.g. \"low-res/\". */\n prefix?: string;\n /** The range of files that get URLs. */\n offset?: number;\n limit?: number;\n /** Sign each file's download name into its URL. */\n download?: boolean;\n /** Editors also get the uploads: edit, frame, pending, failure and editor view. */\n editor?: boolean;\n}\n\n/**\n * The upload API (media.UploadHandler) and read API (Reader.Handler), one\n * method per route. Each takes the item, whose mount the call goes to.\n */\nexport class MediaApi {\n constructor(private readonly http: Http) {}\n\n presign(b: PresignBody, signal?: AbortSignal) {\n return this.post<PresignReply>(b.ref, \"/presign\", b, signal);\n }\n parts(ref: RefBody, b: PartsBody, signal?: AbortSignal) {\n return this.post<PartsReply>(ref, \"/parts\", b, signal);\n }\n listParts(ref: RefBody, b: TicketBody, signal?: AbortSignal) {\n return this.post<PartsReply>(ref, \"/parts/list\", b, signal);\n }\n complete(ref: RefBody, b: TicketBody, signal?: AbortSignal) {\n return this.post<CompleteReply>(ref, \"/complete\", b, signal);\n }\n abort(ref: RefBody, b: TicketBody, signal?: AbortSignal) {\n return this.post<void>(ref, \"/abort\", b, signal);\n }\n commit(b: CommitBody, signal?: AbortSignal) {\n return this.post<CommitReply>(b.ref, \"/commit\", b, signal);\n }\n /** A JPEG still of the video upload at path, t seconds in, w pixels wide (0: the frame's). */\n async frame(ref: RefBody, path: string, t: number, w?: number, signal?: AbortSignal) {\n checkRef(ref);\n const q = new URLSearchParams({ kind: ref.kind, id: ref.id, path, t: String(t) });\n if (w) q.set(\"w\", String(w));\n return this.http.request<Blob>(`${this.http.mount(\"upload\", ref)}/frame?${q}`, { signal, blob: true });\n }\n\n async read(ref: RefBody, o: ReadOptions = {}, signal?: AbortSignal) {\n const q = new URLSearchParams();\n if (o.prefix) q.set(\"prefix\", o.prefix);\n if (o.offset) q.set(\"offset\", String(o.offset));\n if (o.limit) q.set(\"limit\", String(o.limit));\n if (o.download) q.set(\"download\", \"1\");\n if (o.editor) q.set(\"editor\", \"1\");\n const s = q.toString();\n return this.http.request<ReadResult>(this.itemURL(ref) + (s ? \"?\" + s : \"\"), { signal });\n }\n\n /** Every kind's public presets (the same for every viewer). */\n presets(signal?: AbortSignal) {\n return this.http.request<PresetRule[]>(`${this.http.mount(\"media\")}/presets`, { signal });\n }\n\n /** The item under the read API: `{media}/{kind}/{id}`. */\n itemURL(ref: RefBody): string {\n checkRef(ref);\n return `${this.http.mount(\"media\", ref)}/${encodeURIComponent(ref.kind)}/${encodeURIComponent(ref.id)}`;\n }\n\n private async post<T>(ref: RefBody, path: string, body: object, signal?: AbortSignal) {\n checkRef(ref);\n return this.http.request<T>(this.http.mount(\"upload\", ref) + path, { body, signal });\n }\n}\n"],"mappings":";;AAiCA,IAAa,IAAb,MAAsB;CACS;CAA7B,YAAY,GAA6B;EAAZ,KAAA,OAAA;CAAa;CAE1C,QAAQ,GAAgB,GAAsB;EAC5C,OAAO,KAAK,KAAmB,EAAE,KAAK,YAAY,GAAG,CAAM;CAC7D;CACA,MAAM,GAAc,GAAc,GAAsB;EACtD,OAAO,KAAK,KAAiB,GAAK,UAAU,GAAG,CAAM;CACvD;CACA,UAAU,GAAc,GAAe,GAAsB;EAC3D,OAAO,KAAK,KAAiB,GAAK,eAAe,GAAG,CAAM;CAC5D;CACA,SAAS,GAAc,GAAe,GAAsB;EAC1D,OAAO,KAAK,KAAoB,GAAK,aAAa,GAAG,CAAM;CAC7D;CACA,MAAM,GAAc,GAAe,GAAsB;EACvD,OAAO,KAAK,KAAW,GAAK,UAAU,GAAG,CAAM;CACjD;CACA,OAAO,GAAe,GAAsB;EAC1C,OAAO,KAAK,KAAkB,EAAE,KAAK,WAAW,GAAG,CAAM;CAC3D;CAEA,MAAM,MAAM,GAAc,GAAc,GAAW,GAAY,GAAsB;EACnF,EAAS,CAAG;EACZ,IAAM,IAAI,IAAI,gBAAgB;GAAE,MAAM,EAAI;GAAM,IAAI,EAAI;GAAI;GAAM,GAAG,OAAO,CAAC;EAAE,CAAC;EAEhF,OADI,KAAG,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,GACpB,KAAK,KAAK,QAAc,GAAG,KAAK,KAAK,MAAM,UAAU,CAAG,EAAE,SAAS,KAAK;GAAE;GAAQ,MAAM;EAAK,CAAC;CACvG;CAEA,MAAM,KAAK,GAAc,IAAiB,CAAC,GAAG,GAAsB;EAClE,IAAM,IAAI,IAAI,gBAAgB;EAK9B,AAJI,EAAE,UAAQ,EAAE,IAAI,UAAU,EAAE,MAAM,GAClC,EAAE,UAAQ,EAAE,IAAI,UAAU,OAAO,EAAE,MAAM,CAAC,GAC1C,EAAE,SAAO,EAAE,IAAI,SAAS,OAAO,EAAE,KAAK,CAAC,GACvC,EAAE,YAAU,EAAE,IAAI,YAAY,GAAG,GACjC,EAAE,UAAQ,EAAE,IAAI,UAAU,GAAG;EACjC,IAAM,IAAI,EAAE,SAAS;EACrB,OAAO,KAAK,KAAK,QAAoB,KAAK,QAAQ,CAAG,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,UAAO,CAAC;CACzF;CAGA,QAAQ,GAAsB;EAC5B,OAAO,KAAK,KAAK,QAAsB,GAAG,KAAK,KAAK,MAAM,OAAO,EAAE,WAAW,EAAE,UAAO,CAAC;CAC1F;CAGA,QAAQ,GAAsB;EAE5B,OADA,EAAS,CAAG,GACL,GAAG,KAAK,KAAK,MAAM,SAAS,CAAG,EAAE,GAAG,mBAAmB,EAAI,IAAI,EAAE,GAAG,mBAAmB,EAAI,EAAE;CACtG;CAEA,MAAc,KAAQ,GAAc,GAAc,GAAc,GAAsB;EAEpF,OADA,EAAS,CAAG,GACL,KAAK,KAAK,QAAW,KAAK,KAAK,MAAM,UAAU,CAAG,IAAI,GAAM;GAAE;GAAM;EAAO,CAAC;CACrF;AACF"}