@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,385 @@
1
+ /**
2
+ * API для работы с картами
3
+ */
4
+
5
+ import { graphqlRequest, getSessionToken } from './graphql';
6
+ import { getGraphQLUrl } from './config';
7
+ import { safeRequest } from '../utils/safeRequest';
8
+
9
+ export interface Map {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ image?: string;
14
+ minecraftVersion: string;
15
+ mapType: 'any' | 'build';
16
+ buildId?: string;
17
+ buildName?: string;
18
+ version: string;
19
+ sha1: string;
20
+ size: number;
21
+ filename: string;
22
+ mimeType: string;
23
+ s3Url: string;
24
+ s3Key: string;
25
+ s3Bucket: string;
26
+ isPublic: boolean;
27
+ downloads: number;
28
+ manifest?: Record<string, any>;
29
+ author: { id: string; username: string };
30
+ createdAt?: string;
31
+ }
32
+
33
+ export interface MapUploadResponse {
34
+ map: Map;
35
+ isNew: boolean;
36
+ }
37
+
38
+ export interface PublicMapsFilter {
39
+ query?: string;
40
+ minecraftVersion?: string;
41
+ mapType?: string;
42
+ sortBy?: string;
43
+ offset?: number;
44
+ limit?: number;
45
+ }
46
+
47
+ /**
48
+ * Получает карту по ID
49
+ */
50
+ export async function getMap(id: string): Promise<Map | null> {
51
+ const query = `
52
+ query GetMap($id: ID!) {
53
+ map(where: { id: $id }) {
54
+ id
55
+ name
56
+ description
57
+ image
58
+ minecraftVersion
59
+ mapType
60
+ buildId
61
+ buildName
62
+ version
63
+ sha1
64
+ size
65
+ filename
66
+ mimeType
67
+ s3Key
68
+ s3Bucket
69
+ s3Url
70
+ isPublic
71
+ downloads
72
+ manifest
73
+ author { id username }
74
+ createdAt
75
+ }
76
+ }
77
+ `;
78
+
79
+ const result = await graphqlRequest<{ map: Map | null }>(query, { id });
80
+ return result.map;
81
+ }
82
+
83
+ /**
84
+ * Получает карты текущего пользователя
85
+ */
86
+ export async function getUserMaps(): Promise<Map[]> {
87
+ const userQuery = `
88
+ query {
89
+ authenticatedItem {
90
+ ... on User { id }
91
+ }
92
+ }
93
+ `;
94
+
95
+ const userResult = await graphqlRequest<{
96
+ authenticatedItem: { id: string } | null;
97
+ }>(userQuery);
98
+
99
+ if (!userResult.authenticatedItem) {
100
+ return [];
101
+ }
102
+
103
+ const query = `
104
+ query GetUserMaps($where: MapWhereInput!) {
105
+ maps(where: $where) {
106
+ id
107
+ name
108
+ description
109
+ image
110
+ minecraftVersion
111
+ mapType
112
+ buildId
113
+ buildName
114
+ version
115
+ sha1
116
+ size
117
+ filename
118
+ mimeType
119
+ s3Key
120
+ s3Bucket
121
+ s3Url
122
+ isPublic
123
+ downloads
124
+ manifest
125
+ author { id username }
126
+ createdAt
127
+ }
128
+ }
129
+ `;
130
+
131
+ const result = await graphqlRequest<{ maps: Map[] }>(query, {
132
+ where: { author: { id: { equals: userResult.authenticatedItem.id } } },
133
+ });
134
+ return result.maps;
135
+ }
136
+
137
+ /**
138
+ * Получает публичные карты с фильтрацией
139
+ */
140
+ export async function getPublicMaps(filter?: PublicMapsFilter): Promise<Map[]> {
141
+ const where: string[] = ['{ isPublic: { equals: true } }'];
142
+
143
+ if (filter?.minecraftVersion) {
144
+ where.push(`{ minecraftVersion: { equals: "${filter.minecraftVersion}" } }`);
145
+ }
146
+ if (filter?.mapType) {
147
+ where.push(`{ mapType: { equals: "${filter.mapType}" } }`);
148
+ }
149
+
150
+ const whereClause = where.length > 1
151
+ ? `{ AND: [${where.join(', ')}] }`
152
+ : where[0];
153
+
154
+ const orderBy = filter?.sortBy === 'downloads'
155
+ ? 'orderBy: { downloads: desc }'
156
+ : 'orderBy: { createdAt: desc }';
157
+
158
+ const take = filter?.limit ?? 20;
159
+ const skip = filter?.offset ?? 0;
160
+
161
+ const query = `
162
+ query GetPublicMaps {
163
+ maps(where: ${whereClause}, ${orderBy}, take: ${take}, skip: ${skip}) {
164
+ id
165
+ name
166
+ description
167
+ image
168
+ minecraftVersion
169
+ mapType
170
+ buildId
171
+ buildName
172
+ version
173
+ sha1
174
+ size
175
+ filename
176
+ mimeType
177
+ s3Key
178
+ s3Bucket
179
+ s3Url
180
+ isPublic
181
+ downloads
182
+ manifest
183
+ author { id username }
184
+ createdAt
185
+ }
186
+ }
187
+ `;
188
+
189
+ const result = await graphqlRequest<{ maps: Map[] }>(query, {});
190
+ return result.maps;
191
+ }
192
+
193
+ /**
194
+ * Получает карты по массиву SHA1 хешей
195
+ */
196
+ export async function getMapsBySha1(sha1s: string[]): Promise<Map[]> {
197
+ const query = `
198
+ query GetMapsBySha1($sha1s: [String!]!) {
199
+ maps(where: { sha1: { in: $sha1s } }) {
200
+ id
201
+ sha1
202
+ size
203
+ name
204
+ filename
205
+ minecraftVersion
206
+ mapType
207
+ version
208
+ s3Url
209
+ }
210
+ }
211
+ `;
212
+
213
+ const result = await graphqlRequest<{ maps: Map[] }>(query, { sha1s });
214
+ return result.maps;
215
+ }
216
+
217
+ /**
218
+ * Создаёт карту
219
+ */
220
+ export async function createMap(data: Partial<Map>): Promise<Map> {
221
+ const query = `
222
+ mutation CreateMap($data: MapCreateInput!) {
223
+ createMap(data: $data) {
224
+ id
225
+ name
226
+ description
227
+ image
228
+ minecraftVersion
229
+ mapType
230
+ buildId
231
+ buildName
232
+ version
233
+ sha1
234
+ size
235
+ filename
236
+ mimeType
237
+ s3Key
238
+ s3Bucket
239
+ s3Url
240
+ isPublic
241
+ downloads
242
+ author { id username }
243
+ }
244
+ }
245
+ `;
246
+
247
+ const result = await graphqlRequest<{ createMap: Map }>(query, { data });
248
+ return result.createMap;
249
+ }
250
+
251
+ /**
252
+ * Обновляет карту
253
+ */
254
+ export async function updateMap(id: string, data: Partial<Map>): Promise<Map> {
255
+ const query = `
256
+ mutation UpdateMap($where: MapWhereUniqueInput!, $data: MapUpdateInput!) {
257
+ updateMap(where: $where, data: $data) {
258
+ id
259
+ name
260
+ description
261
+ image
262
+ minecraftVersion
263
+ mapType
264
+ buildId
265
+ buildName
266
+ version
267
+ sha1
268
+ size
269
+ filename
270
+ mimeType
271
+ s3Key
272
+ s3Bucket
273
+ s3Url
274
+ isPublic
275
+ downloads
276
+ author { id username }
277
+ }
278
+ }
279
+ `;
280
+
281
+ const result = await graphqlRequest<{ updateMap: Map }>(query, { where: { id }, data });
282
+ return result.updateMap;
283
+ }
284
+
285
+ /**
286
+ * Удаляет карту
287
+ */
288
+ export async function deleteMap(id: string): Promise<void> {
289
+ const query = `
290
+ mutation DeleteMap($where: MapWhereUniqueInput!) {
291
+ deleteMap(where: $where) { id }
292
+ }
293
+ `;
294
+
295
+ await graphqlRequest(query, { where: { id } });
296
+ }
297
+
298
+ /**
299
+ * Загружает файл карты на сервер
300
+ */
301
+ export async function uploadMap(
302
+ file: File | Blob,
303
+ filename: string,
304
+ mimeType: string,
305
+ extraFields?: Record<string, string>
306
+ ): Promise<MapUploadResponse> {
307
+ const apiUrl = getGraphQLUrl().replace('/graphql', '');
308
+ const token = getSessionToken();
309
+
310
+ const formData = new FormData();
311
+ formData.append('file', file);
312
+ formData.append('filename', filename);
313
+ formData.append('mimeType', mimeType);
314
+
315
+ if (extraFields) {
316
+ for (const [key, value] of Object.entries(extraFields)) {
317
+ formData.append(key, value);
318
+ }
319
+ }
320
+
321
+ const response = await fetch(`${apiUrl}/upload-map`, {
322
+ method: 'POST',
323
+ headers: {
324
+ ...(token && { Authorization: `Bearer ${token}` }),
325
+ },
326
+ body: formData,
327
+ });
328
+
329
+ if (!response.ok) {
330
+ let errorMessage = 'Unknown error';
331
+ let errorData: any = {};
332
+
333
+ try {
334
+ errorData = await response.json();
335
+ if (errorData.message) {
336
+ errorMessage = errorData.message;
337
+ } else if (errorData.error) {
338
+ errorMessage = errorData.error;
339
+ } else {
340
+ errorMessage = `HTTP ${response.status}: ${JSON.stringify(errorData)}`;
341
+ }
342
+ } catch {
343
+ try {
344
+ const errorText = await response.text();
345
+ errorMessage = `HTTP ${response.status}: ${errorText}`;
346
+ } catch {
347
+ errorMessage = `HTTP ${response.status}: Unknown error`;
348
+ }
349
+ }
350
+
351
+ const error: any = new Error(errorMessage);
352
+ error.response = { status: response.status, data: errorData };
353
+ throw error;
354
+ }
355
+
356
+ return response.json();
357
+ }
358
+
359
+ /**
360
+ * Получает квоту хранилища карт текущего пользователя
361
+ */
362
+ export const getUserMapsQuota = () =>
363
+ safeRequest<{ mapsUsedStorage: number; mapsQuota: number } | null>(
364
+ async () => {
365
+ const query = `
366
+ query {
367
+ authenticatedItem {
368
+ ... on User { id mapsUsedStorage mapsQuota }
369
+ }
370
+ }
371
+ `;
372
+ const result = await graphqlRequest<{
373
+ authenticatedItem: {
374
+ id: string;
375
+ mapsUsedStorage: number | null;
376
+ mapsQuota: number | null;
377
+ } | null;
378
+ }>(query);
379
+ if (!result.authenticatedItem) return null;
380
+ return {
381
+ mapsUsedStorage: result.authenticatedItem.mapsUsedStorage ?? 0,
382
+ mapsQuota: result.authenticatedItem.mapsQuota ?? 0,
383
+ };
384
+ },
385
+ );
@@ -0,0 +1,140 @@
1
+ /**
2
+ * WebSocket-клиент для @rynt/notify-service (инвайты и др.).
3
+ */
4
+
5
+ import { getSessionToken } from './graphql';
6
+
7
+ function getNotifyServiceWsUrl(): string {
8
+ const raw = (import.meta as unknown as { env?: Record<string, string> }).env
9
+ ?.VITE_NOTIFY_SERVICE_URL as string | undefined;
10
+ if (raw) {
11
+ const url = raw.endsWith('/') ? raw.slice(0, -1) : raw;
12
+ if (url.startsWith('ws://') || url.startsWith('wss://')) return url;
13
+ return url.replace(/^http/, 'ws');
14
+ }
15
+ return 'ws://localhost:3002';
16
+ }
17
+
18
+ export interface NotifyWSEvent {
19
+ event: string;
20
+ [key: string]: unknown;
21
+ }
22
+
23
+ export type NotifyWSEventHandler = (event: NotifyWSEvent) => void;
24
+
25
+ export class NotifyWebSocketClient {
26
+ private ws: WebSocket | null = null;
27
+ private reconnectAttempts = 0;
28
+ private maxReconnectAttempts = 5;
29
+ private reconnectDelay = 1000;
30
+ private eventHandlers = new Map<string, Set<NotifyWSEventHandler>>();
31
+ private isConnecting = false;
32
+ private shouldReconnect = true;
33
+
34
+ connect(): Promise<void> {
35
+ if (this.ws?.readyState === WebSocket.OPEN) {
36
+ return Promise.resolve();
37
+ }
38
+ if (this.isConnecting) {
39
+ return Promise.reject(new Error('Connection already in progress'));
40
+ }
41
+ this.isConnecting = true;
42
+
43
+ return new Promise((resolve, reject) => {
44
+ const token = getSessionToken();
45
+ if (!token) {
46
+ this.isConnecting = false;
47
+ reject(new Error('No session token available'));
48
+ return;
49
+ }
50
+
51
+ const url = `${getNotifyServiceWsUrl()}/ws?token=${encodeURIComponent(token)}`;
52
+ this.ws = new WebSocket(url);
53
+
54
+ this.ws.onopen = () => {
55
+ this.isConnecting = false;
56
+ this.reconnectAttempts = 0;
57
+ resolve();
58
+ };
59
+
60
+ this.ws.onerror = () => {
61
+ this.isConnecting = false;
62
+ reject(new Error('Notify WebSocket error'));
63
+ };
64
+
65
+ this.ws.onclose = (event) => {
66
+ this.isConnecting = false;
67
+ if (this.shouldReconnect && event.code !== 1000) {
68
+ this.handleReconnect();
69
+ }
70
+ };
71
+
72
+ this.ws.onmessage = (ev) => {
73
+ try {
74
+ const data = JSON.parse(ev.data as string) as NotifyWSEvent;
75
+ this.dispatch(data);
76
+ } catch (e) {
77
+ console.error('[NotifyWebSocketClient] parse error', e);
78
+ }
79
+ };
80
+ });
81
+ }
82
+
83
+ disconnect(): void {
84
+ this.shouldReconnect = false;
85
+ if (this.ws) {
86
+ this.ws.close(1000, 'Client disconnect');
87
+ this.ws = null;
88
+ }
89
+ }
90
+
91
+ isConnected(): boolean {
92
+ return this.ws?.readyState === WebSocket.OPEN;
93
+ }
94
+
95
+ on(event: string, handler: NotifyWSEventHandler): () => void {
96
+ if (!this.eventHandlers.has(event)) {
97
+ this.eventHandlers.set(event, new Set());
98
+ }
99
+ this.eventHandlers.get(event)!.add(handler);
100
+ return () => this.off(event, handler);
101
+ }
102
+
103
+ off(event: string, handler: NotifyWSEventHandler): void {
104
+ const set = this.eventHandlers.get(event);
105
+ if (set) {
106
+ set.delete(handler);
107
+ if (set.size === 0) this.eventHandlers.delete(event);
108
+ }
109
+ }
110
+
111
+ private dispatch(event: NotifyWSEvent): void {
112
+ const named = this.eventHandlers.get(event.event);
113
+ named?.forEach((h) => {
114
+ try {
115
+ h(event);
116
+ } catch (e) {
117
+ console.error('[NotifyWebSocketClient] handler error', e);
118
+ }
119
+ });
120
+ const all = this.eventHandlers.get('*');
121
+ all?.forEach((h) => {
122
+ try {
123
+ h(event);
124
+ } catch (e) {
125
+ console.error('[NotifyWebSocketClient] * handler error', e);
126
+ }
127
+ });
128
+ }
129
+
130
+ private handleReconnect(): void {
131
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) return;
132
+ this.reconnectAttempts++;
133
+ const delay = this.reconnectDelay * 2 ** (this.reconnectAttempts - 1);
134
+ setTimeout(() => {
135
+ if (this.shouldReconnect) {
136
+ this.connect().catch(() => {});
137
+ }
138
+ }, delay);
139
+ }
140
+ }