@rynt/sdk 0.9.53

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 (332) hide show
  1. package/README.md +122 -0
  2. package/REGISTRIES.md +189 -0
  3. package/env.d.ts +11 -0
  4. package/host-shims.d.ts +30 -0
  5. package/package.json +88 -0
  6. package/src/extension-marketplace/api-types.ts +141 -0
  7. package/src/extension-marketplace/client.ts +296 -0
  8. package/src/extension-marketplace/index.ts +22 -0
  9. package/src/extension-marketplace/schemas.ts +178 -0
  10. package/src/extensions/ExtensionRoutePage.vue +17 -0
  11. package/src/extensions/context.ts +37 -0
  12. package/src/extensions/disabled-folder.ts +21 -0
  13. package/src/extensions/extension-expose-map.ts +5 -0
  14. package/src/extensions/extension-expose.ts +48 -0
  15. package/src/extensions/graph.ts +67 -0
  16. package/src/extensions/index.ts +251 -0
  17. package/src/extensions/invite-handler/types.ts +20 -0
  18. package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
  19. package/src/extensions/launcher-entities/keys.ts +46 -0
  20. package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
  21. package/src/extensions/launcher-entities/props-map.ts +69 -0
  22. package/src/extensions/launcher-entities/registry.ts +32 -0
  23. package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
  24. package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
  25. package/src/extensions/launcher-models/keys.ts +23 -0
  26. package/src/extensions/launcher-models/public.ts +9 -0
  27. package/src/extensions/launcher-models/registry-core.ts +34 -0
  28. package/src/extensions/manifest-types.ts +22 -0
  29. package/src/extensions/manifest.ts +46 -0
  30. package/src/extensions/marketplace-open-key.ts +26 -0
  31. package/src/extensions/plugin-types.ts +44 -0
  32. package/src/extensions/plugin.ts +62 -0
  33. package/src/extensions/registries/bootstrap.ts +11 -0
  34. package/src/extensions/registries/builtins/account-provider.ts +6 -0
  35. package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
  36. package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
  37. package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
  38. package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
  39. package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
  40. package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
  41. package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
  42. package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
  43. package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
  44. package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
  45. package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
  46. package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
  47. package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
  48. package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
  49. package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
  50. package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
  51. package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
  52. package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
  53. package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
  54. package/src/extensions/registries/builtins/file-editor.ts +19 -0
  55. package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
  56. package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
  57. package/src/extensions/registries/builtins/index.ts +141 -0
  58. package/src/extensions/registries/builtins/invite-handler.ts +7 -0
  59. package/src/extensions/registries/builtins/library-after-content.ts +6 -0
  60. package/src/extensions/registries/builtins/library-before-content.ts +6 -0
  61. package/src/extensions/registries/builtins/loader.ts +8 -0
  62. package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
  63. package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
  64. package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
  65. package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
  66. package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
  67. package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
  68. package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
  69. package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
  70. package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
  71. package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
  72. package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
  73. package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
  74. package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
  75. package/src/extensions/registries/builtins/mod-provider.ts +5 -0
  76. package/src/extensions/registries/builtins/nav.ts +7 -0
  77. package/src/extensions/registries/builtins/page.ts +13 -0
  78. package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
  79. package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
  80. package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
  81. package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
  82. package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
  83. package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
  84. package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
  85. package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
  86. package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
  87. package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
  88. package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
  89. package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
  90. package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
  91. package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
  92. package/src/extensions/registries/builtins/shell.ts +5 -0
  93. package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
  94. package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
  95. package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
  96. package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
  97. package/src/extensions/registries/builtins/sidebar.ts +11 -0
  98. package/src/extensions/registries/builtins/theme.ts +5 -0
  99. package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
  100. package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
  101. package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
  102. package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
  103. package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
  104. package/src/extensions/registries/builtins/user-strip.ts +5 -0
  105. package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
  106. package/src/extensions/registries/define-extension-registry.ts +58 -0
  107. package/src/extensions/registries/extension-host-api.ts +41 -0
  108. package/src/extensions/registries/extension-registry-api.ts +103 -0
  109. package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
  110. package/src/extensions/registries/extension-scope.ts +41 -0
  111. package/src/extensions/registries/get-registry.ts +23 -0
  112. package/src/extensions/registries/index.ts +58 -0
  113. package/src/extensions/registries/manifest-rynt.ts +193 -0
  114. package/src/extensions/registries/registry-slot.ts +40 -0
  115. package/src/extensions/registries/registry-value-map.ts +89 -0
  116. package/src/extensions/registries/store.ts +206 -0
  117. package/src/extensions/resolve-extensions.ts +245 -0
  118. package/src/extensions/router-bridge.ts +103 -0
  119. package/src/extensions/session.ts +6 -0
  120. package/src/extensions/slug.ts +23 -0
  121. package/src/extensions/version.ts +147 -0
  122. package/src/host/extensions-composables.ts +33 -0
  123. package/src/host/extensions-init.ts +194 -0
  124. package/src/host/index.ts +11 -0
  125. package/src/host/launcher-models/index.ts +4 -0
  126. package/src/index.ts +229 -0
  127. package/src/minecraft-loader/base-loader.ts +102 -0
  128. package/src/minecraft-loader/index.ts +11 -0
  129. package/src/minecraft-loader/loader-registry.ts +72 -0
  130. package/src/shared/api/assets.ts +112 -0
  131. package/src/shared/api/auth.ts +283 -0
  132. package/src/shared/api/builds.ts +647 -0
  133. package/src/shared/api/config.ts +19 -0
  134. package/src/shared/api/download-stats.ts +103 -0
  135. package/src/shared/api/downloads.ts +36 -0
  136. package/src/shared/api/entity-authorship.ts +60 -0
  137. package/src/shared/api/events.ts +393 -0
  138. package/src/shared/api/friends.ts +140 -0
  139. package/src/shared/api/graphql.ts +87 -0
  140. package/src/shared/api/index.ts +23 -0
  141. package/src/shared/api/invites.ts +262 -0
  142. package/src/shared/api/library.ts +44 -0
  143. package/src/shared/api/maps.ts +385 -0
  144. package/src/shared/api/notify-websocket.ts +140 -0
  145. package/src/shared/api/posts.ts +357 -0
  146. package/src/shared/api/projectServers.ts +379 -0
  147. package/src/shared/api/serverMembers.ts +173 -0
  148. package/src/shared/api/users.ts +294 -0
  149. package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
  150. package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
  151. package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
  152. package/src/shared/composables/index.ts +10 -0
  153. package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
  154. package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
  155. package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
  156. package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
  157. package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
  158. package/src/shared/composables/useSkinRender.ts +70 -0
  159. package/src/shared/composables/useZlDeepLink.ts +178 -0
  160. package/src/shared/definitions/defineGraphCache.ts +216 -0
  161. package/src/shared/definitions/defineStore.ts +32 -0
  162. package/src/shared/definitions/index.ts +2 -0
  163. package/src/shared/minecraft-types/build-manifest.ts +611 -0
  164. package/src/shared/minecraft-types/index.ts +3 -0
  165. package/src/shared/minecraft-types/launcher-versions.ts +32 -0
  166. package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
  167. package/src/shared/mocks/index.ts +1 -0
  168. package/src/shared/mocks/navigation.ts +17 -0
  169. package/src/shared/mods/http.ts +45 -0
  170. package/src/shared/mods/index.ts +5 -0
  171. package/src/shared/mods/marketplace-editor-search.ts +266 -0
  172. package/src/shared/mods/marketplace-search-utils.ts +42 -0
  173. package/src/shared/mods/mod-marketplace-registry.ts +66 -0
  174. package/src/shared/mods/mod-marketplace-types.ts +28 -0
  175. package/src/shared/mods/providers/curseforge.ts +464 -0
  176. package/src/shared/mods/providers/index.ts +8 -0
  177. package/src/shared/mods/providers/modrinth.ts +402 -0
  178. package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
  179. package/src/shared/mods/types.ts +76 -0
  180. package/src/shared/styles/index.css +713 -0
  181. package/src/shared/themes/index.ts +23 -0
  182. package/src/shared/themes/theme-tokens-black.json +126 -0
  183. package/src/shared/themes/theme-tokens-classic.json +126 -0
  184. package/src/shared/themes/theme-tokens-pink.json +126 -0
  185. package/src/shared/themes/theme-tokens.json +126 -0
  186. package/src/shared/themes/types.ts +85 -0
  187. package/src/shared/types/API_DOCUMENTATION.md +422 -0
  188. package/src/shared/types/account.ts +40 -0
  189. package/src/shared/types/build.ts +8 -0
  190. package/src/shared/types/entities.ts +181 -0
  191. package/src/shared/types/index.ts +6 -0
  192. package/src/shared/types/invite-payloads.ts +60 -0
  193. package/src/shared/types/navigation.ts +16 -0
  194. package/src/shared/types/running-build.ts +51 -0
  195. package/src/shared/types/serverMember.ts +17 -0
  196. package/src/shared/types/user.ts +55 -0
  197. package/src/shared/ui/base/Avatar.vue +262 -0
  198. package/src/shared/ui/base/Badge.vue +47 -0
  199. package/src/shared/ui/base/Button.vue +78 -0
  200. package/src/shared/ui/base/Divider.vue +42 -0
  201. package/src/shared/ui/base/Icon.vue +597 -0
  202. package/src/shared/ui/base/StatusIndicator.vue +44 -0
  203. package/src/shared/ui/base/index.ts +7 -0
  204. package/src/shared/ui/cards/InviteCard.vue +47 -0
  205. package/src/shared/ui/cards/index.ts +2 -0
  206. package/src/shared/ui/dialog/Dialog.vue +71 -0
  207. package/src/shared/ui/dialog/DialogContent.vue +31 -0
  208. package/src/shared/ui/dialog/DialogFooter.vue +14 -0
  209. package/src/shared/ui/dialog/DialogHeader.vue +41 -0
  210. package/src/shared/ui/dialog/index.ts +5 -0
  211. package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
  212. package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
  213. package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
  214. package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
  215. package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
  216. package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
  217. package/src/shared/ui/editors/index.ts +6 -0
  218. package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
  219. package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
  220. package/src/shared/ui/form/Checkbox.vue +38 -0
  221. package/src/shared/ui/form/FormField.vue +30 -0
  222. package/src/shared/ui/form/FormGrid.vue +38 -0
  223. package/src/shared/ui/form/ImageEditor.vue +598 -0
  224. package/src/shared/ui/form/Input.vue +72 -0
  225. package/src/shared/ui/form/Range.vue +65 -0
  226. package/src/shared/ui/form/Select.vue +76 -0
  227. package/src/shared/ui/form/Switch.vue +38 -0
  228. package/src/shared/ui/form/Textarea.vue +144 -0
  229. package/src/shared/ui/form/index.ts +9 -0
  230. package/src/shared/ui/index.ts +9 -0
  231. package/src/shared/ui/layout/BusyOverlay.vue +31 -0
  232. package/src/shared/ui/layout/Callout.vue +44 -0
  233. package/src/shared/ui/layout/Card.vue +38 -0
  234. package/src/shared/ui/layout/Container.vue +36 -0
  235. package/src/shared/ui/layout/EmptyState.vue +99 -0
  236. package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
  237. package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
  238. package/src/shared/ui/layout/FloatingPanel.vue +37 -0
  239. package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
  240. package/src/shared/ui/layout/Grid.vue +40 -0
  241. package/src/shared/ui/layout/Inline.vue +59 -0
  242. package/src/shared/ui/layout/LoadingState.vue +39 -0
  243. package/src/shared/ui/layout/MediaBox.vue +47 -0
  244. package/src/shared/ui/layout/OverlayPanel.vue +28 -0
  245. package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
  246. package/src/shared/ui/layout/PageSection.vue +43 -0
  247. package/src/shared/ui/layout/PageToolbar.vue +29 -0
  248. package/src/shared/ui/layout/Panel.vue +39 -0
  249. package/src/shared/ui/layout/ProgressBar.vue +49 -0
  250. package/src/shared/ui/layout/Section.vue +30 -0
  251. package/src/shared/ui/layout/SegmentedControl.vue +43 -0
  252. package/src/shared/ui/layout/SelectableCard.vue +46 -0
  253. package/src/shared/ui/layout/SelectableRow.vue +41 -0
  254. package/src/shared/ui/layout/Skeleton.vue +25 -0
  255. package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
  256. package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
  257. package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
  258. package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
  259. package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
  260. package/src/shared/ui/layout/SkeletonText.vue +25 -0
  261. package/src/shared/ui/layout/Stack.vue +42 -0
  262. package/src/shared/ui/layout/StateBlock.vue +44 -0
  263. package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
  264. package/src/shared/ui/layout/VirtualList.vue +160 -0
  265. package/src/shared/ui/layout/index.ts +35 -0
  266. package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
  267. package/src/shared/ui/navigation/NavItem.vue +139 -0
  268. package/src/shared/ui/navigation/Tab.vue +61 -0
  269. package/src/shared/ui/navigation/Tabs.vue +37 -0
  270. package/src/shared/ui/navigation/index.ts +4 -0
  271. package/src/shared/ui/primitives/Action.vue +19 -0
  272. package/src/shared/ui/primitives/Block.vue +28 -0
  273. package/src/shared/ui/primitives/CanvasView.vue +19 -0
  274. package/src/shared/ui/primitives/Control.vue +24 -0
  275. package/src/shared/ui/primitives/ControlSelect.vue +19 -0
  276. package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
  277. package/src/shared/ui/primitives/FieldLabel.vue +19 -0
  278. package/src/shared/ui/primitives/Form.vue +19 -0
  279. package/src/shared/ui/primitives/Heading.vue +29 -0
  280. package/src/shared/ui/primitives/Image.vue +17 -0
  281. package/src/shared/ui/primitives/LineBreak.vue +3 -0
  282. package/src/shared/ui/primitives/Link.vue +19 -0
  283. package/src/shared/ui/primitives/List.vue +28 -0
  284. package/src/shared/ui/primitives/ListItem.vue +19 -0
  285. package/src/shared/ui/primitives/OptionItem.vue +19 -0
  286. package/src/shared/ui/primitives/Text.vue +28 -0
  287. package/src/shared/ui/primitives/VideoView.vue +19 -0
  288. package/src/shared/ui/primitives/index.ts +19 -0
  289. package/src/shared/ui/primitives/resolveElement.ts +25 -0
  290. package/src/shared/ui/special/AngularAccent.vue +106 -0
  291. package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
  292. package/src/shared/ui/special/InfoRow.vue +39 -0
  293. package/src/shared/ui/special/LogViewer.vue +53 -0
  294. package/src/shared/ui/special/PageHeader.vue +23 -0
  295. package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
  296. package/src/shared/ui/special/WelcomeCard.vue +32 -0
  297. package/src/shared/ui/special/index.ts +9 -0
  298. package/src/shared/utils/app-paths.ts +50 -0
  299. package/src/shared/utils/attachments.ts +16 -0
  300. package/src/shared/utils/autostart.ts +213 -0
  301. package/src/shared/utils/build-files.ts +439 -0
  302. package/src/shared/utils/build-manifest-init.ts +176 -0
  303. package/src/shared/utils/cloudinary.ts +67 -0
  304. package/src/shared/utils/cn.ts +7 -0
  305. package/src/shared/utils/download-stats-week.ts +165 -0
  306. package/src/shared/utils/entity-api-to-cache.ts +84 -0
  307. package/src/shared/utils/entity-build-from-api.ts +1 -0
  308. package/src/shared/utils/entity-display.ts +27 -0
  309. package/src/shared/utils/entity-map-from-api.ts +1 -0
  310. package/src/shared/utils/file-hash.ts +65 -0
  311. package/src/shared/utils/formatSize.ts +5 -0
  312. package/src/shared/utils/formatTime.ts +157 -0
  313. package/src/shared/utils/getAccountSkinRender.ts +32 -0
  314. package/src/shared/utils/index.ts +34 -0
  315. package/src/shared/utils/local-mods.ts +678 -0
  316. package/src/shared/utils/local-settings.ts +217 -0
  317. package/src/shared/utils/member-join-stats.ts +35 -0
  318. package/src/shared/utils/platform.ts +86 -0
  319. package/src/shared/utils/play-host-slug.ts +92 -0
  320. package/src/shared/utils/rich-content.ts +294 -0
  321. package/src/shared/utils/safeRequest.ts +23 -0
  322. package/src/shared/utils/semver.ts +81 -0
  323. package/src/shared/utils/serverPermissions.ts +155 -0
  324. package/src/shared/utils/skin-render-cache.ts +372 -0
  325. package/src/shared/utils/stripMarkdown.ts +45 -0
  326. package/src/shared/utils/transliterate.ts +74 -0
  327. package/src/shared/utils/updateAccountSkinRender.ts +64 -0
  328. package/src/shared/utils/updater.ts +218 -0
  329. package/src/shared/utils/uploadImage.ts +195 -0
  330. package/src/shared/utils/user-status.ts +9 -0
  331. package/src/tiptap/index.ts +7 -0
  332. package/tsconfig.json +13 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * API для работы с ассетами
3
+ */
4
+
5
+ import { graphqlRequest } from './graphql';
6
+ import { getGraphQLUrl } from './config';
7
+ import { getSessionToken } from './graphql';
8
+
9
+ export interface Asset {
10
+ id: string;
11
+ sha1: string;
12
+ size: number;
13
+ filename: string;
14
+ mimeType: string;
15
+ s3Url: string;
16
+ s3Key: string;
17
+ s3Bucket: string;
18
+ authors?: Array<{ id: string; username: string }>;
19
+ }
20
+
21
+ export interface AssetUploadResponse {
22
+ asset: Asset;
23
+ isNew: boolean;
24
+ }
25
+
26
+ /**
27
+ * Запрашивает ассеты по массиву SHA1 хешей
28
+ */
29
+ export async function getAssetsBySha1(sha1s: string[]): Promise<Asset[]> {
30
+ const query = `
31
+ query GetAssetsBySha1($sha1s: [String!]!) {
32
+ assets(where: { sha1: { in: $sha1s } }) {
33
+ id
34
+ sha1
35
+ size
36
+ filename
37
+ mimeType
38
+ s3Key
39
+ s3Bucket
40
+ s3Url
41
+ authors {
42
+ id
43
+ username
44
+ }
45
+ }
46
+ }
47
+ `;
48
+
49
+ const result = await graphqlRequest<{
50
+ assets: Asset[];
51
+ }>(query, { sha1s });
52
+
53
+ return result.assets;
54
+ }
55
+
56
+ /**
57
+ * Загружает файл на сервер
58
+ */
59
+ export async function uploadAsset(
60
+ file: File | Blob,
61
+ filename: string,
62
+ mimeType: string
63
+ ): Promise<AssetUploadResponse> {
64
+ const apiUrl = getGraphQLUrl().replace('/graphql', '');
65
+ const token = getSessionToken();
66
+
67
+ const formData = new FormData();
68
+ formData.append('file', file);
69
+ formData.append('filename', filename);
70
+ formData.append('mimeType', mimeType);
71
+
72
+ const response = await fetch(`${apiUrl}/upload-asset`, {
73
+ method: 'POST',
74
+ headers: {
75
+ ...(token && { Authorization: `Bearer ${token}` }),
76
+ },
77
+ body: formData,
78
+ });
79
+
80
+ if (!response.ok) {
81
+ let errorMessage = 'Unknown error';
82
+ let errorData: any = {};
83
+
84
+ try {
85
+ errorData = await response.json();
86
+ // Если есть сообщение об ошибке от сервера, используем его
87
+ if (errorData.message) {
88
+ errorMessage = errorData.message;
89
+ } else if (errorData.error) {
90
+ errorMessage = errorData.error;
91
+ } else {
92
+ errorMessage = `HTTP ${response.status}: ${JSON.stringify(errorData)}`;
93
+ }
94
+ } catch {
95
+ // Если не удалось распарсить JSON, используем текст ответа
96
+ try {
97
+ const errorText = await response.text();
98
+ errorMessage = `HTTP ${response.status}: ${errorText}`;
99
+ } catch {
100
+ errorMessage = `HTTP ${response.status}: Unknown error`;
101
+ }
102
+ }
103
+
104
+ const error: any = new Error(errorMessage);
105
+ error.response = { status: response.status, data: errorData };
106
+ throw error;
107
+ }
108
+
109
+ return response.json();
110
+ }
111
+
112
+
@@ -0,0 +1,283 @@
1
+ /**
2
+ * API для работы с авторизацией через Keystone (GraphQL)
3
+ */
4
+
5
+ import type { EntityUser } from '../types/entities';
6
+ import {
7
+ graphqlRequest,
8
+ setSessionToken,
9
+ removeSessionToken,
10
+ getSessionToken,
11
+ } from './graphql';
12
+ import { safeRequest } from '../utils/safeRequest';
13
+
14
+ export interface LoginCredentials {
15
+ username: string;
16
+ password: string;
17
+ }
18
+
19
+ export interface RegisterData {
20
+ username: string;
21
+ email: string;
22
+ password: string;
23
+ }
24
+
25
+ export interface AuthResponse {
26
+ success: boolean;
27
+ token?: string;
28
+ error?: string;
29
+ user?: {
30
+ id: string;
31
+ username: string;
32
+ email: string;
33
+ };
34
+ }
35
+
36
+ // --- LOGIN ---
37
+ export const login = (credentials: LoginCredentials) =>
38
+ safeRequest<AuthResponse>(async () => {
39
+ const mutation = `
40
+ mutation AuthenticateUser($username: String!, $password: String!) {
41
+ authenticateUserWithPassword(username: $username, password: $password) {
42
+ __typename
43
+ ... on UserAuthenticationWithPasswordSuccess {
44
+ sessionToken
45
+ item { id username email }
46
+ }
47
+ ... on UserAuthenticationWithPasswordFailure {
48
+ message
49
+ }
50
+ }
51
+ }
52
+ `;
53
+
54
+ const result = await graphqlRequest<{
55
+ authenticateUserWithPassword:
56
+ | {
57
+ __typename: 'UserAuthenticationWithPasswordSuccess';
58
+ sessionToken: string;
59
+ item: { id: string; username: string; email: string };
60
+ }
61
+ | {
62
+ __typename: 'UserAuthenticationWithPasswordFailure';
63
+ message: string;
64
+ };
65
+ }>(mutation, credentials);
66
+
67
+ const auth = result.authenticateUserWithPassword;
68
+
69
+ // Если ошибка — выбрасываем её, safeRequest её подхватит и положит в error
70
+ if (auth.__typename === 'UserAuthenticationWithPasswordFailure') {
71
+ throw new Error(auth.message);
72
+ }
73
+
74
+ // Успешная авторизация
75
+ setSessionToken(auth.sessionToken);
76
+
77
+ return { success: true, token: auth.sessionToken, user: auth.item };
78
+ });
79
+
80
+ // --- REGISTER ---
81
+ export const registerWithEmail = (data: RegisterData) =>
82
+ safeRequest<{ success: boolean; error?: string }>(async () => {
83
+ const mutation = `
84
+ mutation RegisterWithEmail($username: String!, $email: String!, $password: String!) {
85
+ registerWithEmail(username: $username, email: $email, password: $password)
86
+ }
87
+ `;
88
+ const result = await graphqlRequest<{ registerWithEmail: boolean }>(
89
+ mutation,
90
+ data,
91
+ );
92
+
93
+ if (result.registerWithEmail) return { success: true };
94
+
95
+ return { success: false, error: 'Не удалось отправить код подтверждения' };
96
+ });
97
+
98
+ export const verifyRegistration = (
99
+ email: string,
100
+ code: string,
101
+ username: string,
102
+ password: string,
103
+ ) =>
104
+ safeRequest<AuthResponse>(async () => {
105
+ const mutation = `
106
+ mutation VerifyRegistration($email: String!, $code: String!, $username: String!, $password: String!) {
107
+ verifyRegistration(email: $email, code: $code, username: $username, password: $password) {
108
+ sessionToken
109
+ user { id username email }
110
+ }
111
+ }
112
+ `;
113
+
114
+ const result = await graphqlRequest<{
115
+ verifyRegistration: {
116
+ sessionToken: string;
117
+ user: { id: string; username: string; email: string };
118
+ };
119
+ }>(mutation, { email, code, username, password });
120
+
121
+ const { sessionToken, user } = result.verifyRegistration;
122
+ setSessionToken(sessionToken);
123
+
124
+ return { success: true, token: sessionToken, user };
125
+ });
126
+
127
+ // --- PASSWORD RESET ---
128
+ export const requestPasswordReset = (email: string) =>
129
+ safeRequest<{ success: boolean; error?: string }>(async () => {
130
+ const mutation = `
131
+ mutation RequestPasswordReset($email: String!) {
132
+ requestPasswordReset(email: $email)
133
+ }
134
+ `;
135
+ await graphqlRequest<{ requestPasswordReset: boolean }>(mutation, {
136
+ email,
137
+ });
138
+ return { success: true };
139
+ });
140
+
141
+ export const verifyPasswordReset = (
142
+ email: string,
143
+ code: string,
144
+ newPassword: string,
145
+ ) =>
146
+ safeRequest<{ success: boolean; error?: string }>(async () => {
147
+ const mutation = `
148
+ mutation VerifyPasswordReset($email: String!, $code: String!, $newPassword: String!) {
149
+ verifyPasswordReset(email: $email, code: $code, newPassword: $newPassword)
150
+ }
151
+ `;
152
+ await graphqlRequest<{ verifyPasswordReset: boolean }>(mutation, {
153
+ email,
154
+ code,
155
+ newPassword,
156
+ });
157
+ return { success: true };
158
+ });
159
+
160
+ // --- OLD REGISTER (deprecated) ---
161
+ export const register = (data: RegisterData) =>
162
+ safeRequest<AuthResponse>(async () => {
163
+ const { result: registerResult } = await registerWithEmail(data);
164
+ if (!registerResult?.success)
165
+ return { success: false, error: registerResult?.error };
166
+ return { success: true };
167
+ });
168
+
169
+ // --- LOGOUT ---
170
+ export const logout = () =>
171
+ safeRequest<void>(async () => {
172
+ const mutation = `mutation { endSession }`;
173
+ await graphqlRequest<{ endSession: boolean }>(mutation).catch(() => {});
174
+ removeSessionToken();
175
+ });
176
+
177
+ // --- CURRENT USER ---
178
+ export const getCurrentUser = () =>
179
+ safeRequest<EntityUser | null>(async () => {
180
+ const query = `
181
+ query {
182
+ authenticatedItem {
183
+ ... on User {
184
+ id username email avatar bio status statusDetail
185
+ serverMemberships {
186
+ id role
187
+ server { id name address port status image tags players maxPlayers description build { id name } }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ `;
193
+ const result = await graphqlRequest<{
194
+ authenticatedItem: EntityUser | null;
195
+ }>(query);
196
+ return result.authenticatedItem ?? null;
197
+ });
198
+
199
+ // --- SESSION CHECK ---
200
+ export const isAuthenticated = () =>
201
+ safeRequest<boolean>(async () => {
202
+ const token = getSessionToken();
203
+ if (!token) return false;
204
+ const { result: user } = await getCurrentUser();
205
+ return !!user;
206
+ });
207
+
208
+ // --- USER STORAGE QUOTA ---
209
+ export const getUserStorageQuota = () =>
210
+ safeRequest<{ usedStorage: number; storageQuota: number } | null>(
211
+ async () => {
212
+ const query = `
213
+ query {
214
+ authenticatedItem {
215
+ ... on User { id usedStorage storageQuota }
216
+ }
217
+ }
218
+ `;
219
+ const result = await graphqlRequest<{
220
+ authenticatedItem: {
221
+ id: string;
222
+ usedStorage: number | null;
223
+ storageQuota: number | null;
224
+ } | null;
225
+ }>(query);
226
+ if (!result.authenticatedItem) return null;
227
+ return {
228
+ usedStorage: result.authenticatedItem.usedStorage ?? 0,
229
+ storageQuota: result.authenticatedItem.storageQuota ?? 0,
230
+ };
231
+ },
232
+ );
233
+
234
+ // --- UPDATE PROFILE ---
235
+ export const updateUserProfile = (data: {
236
+ username?: string;
237
+ email?: string;
238
+ avatar?: string;
239
+ bio?: string;
240
+ }) =>
241
+ safeRequest<EntityUser>(async () => {
242
+ const { result: currentUser } = await getCurrentUser();
243
+ if (!currentUser) throw new Error('User is not authenticated');
244
+
245
+ const mutation = `
246
+ mutation UpdateUser($where: UserWhereUniqueInput!, $data: UserUpdateInput!) {
247
+ updateUser(where: $where, data: $data) {
248
+ id username email avatar bio
249
+ }
250
+ }
251
+ `;
252
+ const updateData: any = { ...data };
253
+ const result = await graphqlRequest<{ updateUser: EntityUser }>(mutation, {
254
+ where: { id: currentUser.id },
255
+ data: updateData,
256
+ });
257
+ return result.updateUser;
258
+ });
259
+
260
+ // --- UPDATE STATUS ---
261
+ export const updateUserStatus = (data: {
262
+ status?: 'online' | 'offline';
263
+ statusDetail?: object | null;
264
+ }) =>
265
+ safeRequest<void>(async () => {
266
+ const { result: currentUser } = await getCurrentUser();
267
+ if (!currentUser) throw new Error('User is not authenticated');
268
+
269
+ const mutation = `
270
+ mutation UpdateUserStatus($where: UserWhereUniqueInput!, $data: UserUpdateInput!) {
271
+ updateUser(where: $where, data: $data) { id }
272
+ }
273
+ `;
274
+ const updateData: { status?: string; statusDetail?: object | null } = {};
275
+ if (data.status !== undefined) updateData.status = data.status;
276
+ if (data.statusDetail !== undefined)
277
+ updateData.statusDetail = data.statusDetail;
278
+
279
+ await graphqlRequest(mutation, {
280
+ where: { id: currentUser.id },
281
+ data: updateData,
282
+ });
283
+ });