ravejs 1.13.9 → 1.15.9

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.
package/README.RU.md ADDED
@@ -0,0 +1,392 @@
1
+ <div align="center">
2
+ <h1>RaveJS</h1>
3
+ <a href="https://t.me/aminodorks"><img src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram"></a>
4
+ <a href="https://www.npmjs.com/package/ravejs"><img src="https://img.shields.io/badge/NPM-%23CB3837.svg?style=for-the-badge&logo=npm&logoColor=white" alt="NPM"></a>
5
+ </div>
6
+ <div align="center">
7
+ <img src="https://img.shields.io/npm/dm/ravejs" alt="Downloads">
8
+ <img src="https://img.shields.io/npm/v/ravejs.svg" alt="Version">
9
+ <h2>RaveJS — библиотека на TypeScript для взаимодействия с API приложения Rave: Watch Party</h2>
10
+ </div>
11
+
12
+ - [README на английском](https://github.com/AminoDorks/ravejs/blob/master/README.MD)
13
+ - [README на русском](https://github.com/AminoDorks/ravejs/blob/master/README.RU.MD)
14
+
15
+ ---
16
+
17
+ ## Содержание
18
+ - [Возможности](#возможности)
19
+ - [Начало работы](#начало-работы)
20
+ - [Использование](#использование)
21
+ - [Документация API](#документация-api)
22
+ - [Участие в разработке](#участие-в-разработке)
23
+ - [Лицензия](#лицензия)
24
+
25
+ ---
26
+
27
+ ## Возможности
28
+
29
+ RaveJS обладает рядом преимуществ:
30
+ - Модульная архитектура
31
+ - Простота в использовании
32
+ - Поддержка всех необходимых функций
33
+ - Первая библиотека на TypeScript для Rave API
34
+
35
+ ---
36
+
37
+ ## Начало работы
38
+
39
+ Чтобы начать использовать RaveJS, выполните следующие шаги:
40
+
41
+ 1. Инициализируйте npm-пакет:
42
+ ```bash
43
+ npm init
44
+ ```
45
+ 2. Установите TypeScript глобально (опционально):
46
+ ```bash
47
+ npm install -g typescript
48
+ ```
49
+ 3. Создайте конфигурацию TypeScript:
50
+ ```bash
51
+ tsc --init
52
+ ```
53
+ 4. Установите RaveJS:
54
+ ```bash
55
+ npm install ravejs
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Использование
61
+
62
+ ### Базовая авторизация
63
+
64
+ ```typescript
65
+ import { Rave } from 'ravejs';
66
+
67
+ (async () => {
68
+ const rave = new Rave();
69
+ await rave.auth.authenticate('токен', 'девайс айди')
70
+ console.log(`Авторизован как ${rave.account?.id}`);
71
+ })();
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Документация API
77
+
78
+ ### `Rave(config: RaveConfig)`
79
+ Главный класс для взаимодействия с API Rave.
80
+
81
+ #### Конфигурация (`RaveConfig`)
82
+ - `credentials?`: `{ deviceId: string, token: string }` — данные для авторизации и опции
83
+ - `enableLogging?`: `boolean` — включить логирование
84
+ - `account?`: `Account` — профиль пользователя после авторизации
85
+
86
+ #### Свойства экземпляра `Rave`
87
+ 1. `token: string` — Bearer-токен авторизации
88
+ 2. `JWT: string` — JWT-токен для Web Mesh API
89
+ 3. `account: Account?` — информация о профиле пользователя
90
+ 4. `proxy?: string` — прокси для запросов (поддерживаются SOCKS-прокси; можно задать через сеттер)
91
+
92
+ #### Методы экземпляра `Rave`
93
+ 1. `proxyIsAlive = async (): Promise<boolean>` - Проверить, работает ли прокси
94
+ 2. `offProxy = (): Promise<void>` - Удалить прокси из экземпляра Rave
95
+
96
+ ---
97
+
98
+ ### Фабрики
99
+
100
+ RaveJS использует модульную архитектуру, основанную на *фабриках*.
101
+
102
+ ---
103
+
104
+ #### `AuthFactory`
105
+ Фабрика для авторизации и аутентификации. Доступна через `rave.auth`.
106
+
107
+ ##### Методы `AuthFactory`
108
+ 1. `refreshJWT(deviceId?: string): Promise<string>` — обновить JWT-токен
109
+
110
+ 2. `getAccount(): Promise<Account>` — получить данные авторизованного пользователя
111
+
112
+ 3. `authenticate = async (token: string, deviceId: string): Promise<Account>` - Функция аутентификации с использованием токена и идентификатора устройства, автоматически создает JWT и данные аккаунта.
113
+
114
+ 1. `sendMagicLink(email: string, language = 'ru'): Promise<{ stateId: string }>`
115
+ Отправить «волшебную» ссылку на почту для входа или регистрации.
116
+
117
+ 2. `checkRegisterState(stateId: string): Promise<CheckRegisterStateResponse>`
118
+ Проверить статус регистрации по `stateId`.
119
+ **Ответ:**
120
+ ```ts
121
+ {
122
+ authenticated: boolean,
123
+ isSecondFactorLogin: boolean,
124
+ oauth: {
125
+ accessToken: string,
126
+ idToken: string,
127
+ refreshToken: string,
128
+ expiresIn: string,
129
+ tokenType: string
130
+ },
131
+ user: {
132
+ createdAt: string,
133
+ updatedAt: string,
134
+ issuer: string,
135
+ userId: string,
136
+ identifier: string,
137
+ email: string
138
+ }
139
+ }
140
+ ```
141
+
142
+ 3. `parseUserCredentials(idToken: string, email: string): Promise<{ objectId: string; createdAt: string; username: string; sessionToken: string }>`
143
+ Извлечь учётные данные из `idToken` и email.
144
+
145
+ 4. `mojoLogin(email: string, parseId: string, parseToken: string, name: string, deviceId?: string, language = 'ru'): Promise<{ data: { isValid: boolean; newUser: boolean; suggestedHandles: string[] } }>`
146
+ Вход через сервис Mojo.
147
+
148
+ 5. `login(stateId: string, name?: string, deviceId?: string, language = 'ru'): Promise<AuthenticateResponse>`
149
+ Упрощённый метод входа (комбинирует предыдущие шаги).
150
+ **Ответ (`AuthenticateResponse`):**
151
+ ```ts
152
+ {
153
+ isNewUser: boolean,
154
+ email: string,
155
+ username: string,
156
+ deviceId: string,
157
+ token: string
158
+ }
159
+ ```
160
+
161
+ 6. `register(email: string, name: string, deviceId?: string, language = 'ru'): Promise<RegisterResponse>`
162
+ Регистрация нового пользователя (аналогично `login`, но гарантирует создание аккаунта).
163
+
164
+ ---
165
+
166
+ #### `MeshFactory`
167
+ Фабрика для работы с *мешами* (комнатами просмотра). Доступна через `rave.mesh`.
168
+
169
+ ##### Методы `MeshFactory`
170
+ 1. `get(meshId: string): Promise<GetMeshResponse>`
171
+ Получить информацию о меше по ID.
172
+ **Ответ (`GetMeshResponse.data`):**
173
+ ```ts
174
+ {
175
+ blurT?: boolean;
176
+ category: string;
177
+ channel: number;
178
+ createdAt: string;
179
+ currentState: 'play' | 'paus';
180
+ explicit: boolean;
181
+ id: string;
182
+ isFriend: boolean;
183
+ isLocal: boolean;
184
+ isPublic: boolean;
185
+ kickMode: string;
186
+ maturity: string;
187
+ mediaUrl: string;
188
+ originator: number;
189
+ playMode: string;
190
+ position: number;
191
+ server: string;
192
+ shareLink: string;
193
+ thumbnails?: {
194
+ channel?: string;
195
+ standard?: string;
196
+ animated?: string;
197
+ maxres?: string;
198
+ medium?: string;
199
+ default?: string;
200
+ high?: string;
201
+ };
202
+ time: number;
203
+ videoAuthor: string;
204
+ videoDuration: number;
205
+ videoProvider: string;
206
+ videoPublishedAt: string;
207
+ videoThumbnail: string;
208
+ videoTitle: string;
209
+ videoUrl: string;
210
+ vikiPass: boolean;
211
+ voipMode: string;
212
+ users: {
213
+ avatar: string;
214
+ country: string;
215
+ displayName?: string;
216
+ handle?: string;
217
+ id: number;
218
+ lang?: string;
219
+ lat: number;
220
+ lng: number;
221
+ name: string;
222
+ }[];
223
+ }
224
+ ```
225
+
226
+ 2. `getByLink(meshLink: string): Promise<GetMeshResponse>`
227
+ Получить меш по публичной ссылке (`shareLink`).
228
+
229
+ 3. `getMany(params: GetManyMeshesParams): Promise<GetMeshResponse[]>`
230
+ Получить список мешей.
231
+ **Параметры (`GetManyMeshesParams`):**
232
+ ```ts
233
+ {
234
+ isPublic?: boolean;
235
+ limit: number;
236
+ hasFriends: boolean;
237
+ local: boolean;
238
+ hasInvited: boolean;
239
+ language?: string;
240
+ }
241
+ ```
242
+
243
+ 4. `join(meshId: string): Promise<MeshSocket>`
244
+ Присоединиться к мешу. Возвращает экземпляр `MeshSocket` для взаимодействия через WebSocket.
245
+
246
+ ---
247
+
248
+ #### `ThreadFactory`
249
+ Фабрика для работы с переписками. Доступна через `rave.thread`.
250
+
251
+ ##### Методы `ThreadFactory`
252
+ 1. `getMany(): Promise<Thread[]>`
253
+ Получить все переписки.
254
+ **Структура `Thread`:**
255
+ ```ts
256
+ {
257
+ expiryMode: number;
258
+ isFriend: boolean;
259
+ myself: number;
260
+ opposingUser: number;
261
+ spokenLangs: string[];
262
+ threadId: string;
263
+ }
264
+ ```
265
+
266
+ 2. `create(userId: number): Promise<Thread>`
267
+ Создать новую переписку с пользователем.
268
+
269
+ 3. `sendMessage(threadId: string, content: string): Promise<SendMessageResponse>`
270
+ Отправить сообщение в переписку.
271
+ **Ответ (`SendMessageResponse.data`):**
272
+ ```ts
273
+ {
274
+ correlateId: string;
275
+ threadId: string;
276
+ messageType: string;
277
+ originator: number;
278
+ messageBody: {
279
+ content: string;
280
+ detectedLang: string;
281
+ id: string;
282
+ translations: Record<string, string>;
283
+ }
284
+ }
285
+ ```
286
+
287
+ ---
288
+
289
+ #### `UserFactory`
290
+ Фабрика для работы с пользователями. Доступна через `rave.user`.
291
+
292
+ ##### Методы `UserFactory`
293
+ 1. `get(userId: number): Promise<GetUserResponse>`
294
+ Получить профиль пользователя.
295
+ **Ответ (`GetUserResponse.data`):**
296
+ ```ts
297
+ {
298
+ bio: {
299
+ bio?: string;
300
+ metadata: { position: number; privacy: string };
301
+ };
302
+ profile: {
303
+ avatar: string;
304
+ country: string;
305
+ displayName?: string;
306
+ handle?: string;
307
+ };
308
+ }
309
+ ```
310
+
311
+ 2. `sendFriendship(userId: number): Promise<FriendshipResponse>`
312
+ Отправить запрос на добавление в друзья.
313
+ **Ответ (`FriendshipResponse.data`):**
314
+ ```ts
315
+ {
316
+ fromUserId: number;
317
+ state: string;
318
+ toUserId: number;
319
+ }
320
+ ```
321
+
322
+ 3. `acceptFriendship(userId: number): Promise<void>`
323
+ Принять запрос в друзья.
324
+
325
+ 4. `declineFriendship(userId: number): Promise<void>`
326
+ Отклонить запрос в друзья.
327
+
328
+ 5. `edit(builder: EditProfileBuilder): Promise<EditProfileResponse>`
329
+ Редактировать профиль.
330
+ **Параметры (`EditProfileBuilder`):**
331
+ ```ts
332
+ {
333
+ displayAvatar?: string;
334
+ displayName?: string;
335
+ handle?: string;
336
+ }
337
+ ```
338
+ **Ответ (`EditProfileResponse.data`)** — объект `User`.
339
+
340
+ 6. `getAvatarUpload(): Promise<GetAvatarUploadResponse>`
341
+ Получить URL для загрузки аватара.
342
+ **Ответ (`GetAvatarUploadResponse.data`):**
343
+ ```ts
344
+ {
345
+ expiresAt: string;
346
+ fileName: string;
347
+ mime: string;
348
+ uploadUrl: string;
349
+ }
350
+ ```
351
+
352
+ 7. `uploadOnUrl(uploadUrl: string, image: Buffer): Promise<void>`
353
+ Загрузить изображение по полученному URL.
354
+
355
+ 8. `uploadAvatar(image: Buffer): Promise<string>`
356
+ Упрощённый метод: получить URL и загрузить аватар за один вызов. Возвращает `displayAvatar` (новый URL аватара).
357
+
358
+ ---
359
+
360
+ #### `MeshSocket`
361
+ Класс для работы с WebSocket-соединением в меше.
362
+
363
+ ##### Методы и свойства `MeshSocket`
364
+ 1. `onclose(handler: () => Promise<void>): void`
365
+ Обработчик закрытия соединения.
366
+
367
+ 2. `onerror(handler: () => Promise<void>): void`
368
+ Обработчик ошибок.
369
+
370
+ 3. `onmessage(handler: (data: string) => Promise<void>): void`
371
+ Обработчик входящих сообщений (сырой JSON-строки).
372
+
373
+ 4. `sendMessage(content: string): void`
374
+ Отправить сообщение в меш (например, команды управления воспроизведением).
375
+
376
+ 5. `leave(): void`
377
+ Покинуть меш (закрывает сокет).
378
+
379
+ ---
380
+
381
+ ## Участие в разработке
382
+
383
+ Приветствуются pull request'ы и предложения по улучшению!
384
+ Если вы используете мои генераторы кода — напишите мне в [личные сообщения Telegram](https://t.me/celt_is_god).
385
+
386
+ ---
387
+
388
+ ## Лицензия
389
+
390
+ RaveJS распространяется под лицензией **MIT**. Подробнее см. в файле [LICENSE](https://github.com/thatcelt/ravejs/blob/master/LICENSE).
391
+
392
+ ---
@@ -48,13 +48,9 @@ To get started with RaveJS, follow these steps:
48
48
  import { Rave } from 'ravejs';
49
49
 
50
50
  (async () => {
51
- const rave = new Rave({
52
- credentials: {
53
- deviceId: 'your_device_id',
54
- token: 'your_token'
55
- }
56
- });
57
- console.log(`logged as ${(await rave.getAccount()).id}`);
51
+ const rave = new Rave();
52
+ await rave.auth.authenticate('token', 'device_id')
53
+ console.log(`logged as ${rave.account?.id}`);
58
54
  })();
59
55
  ```
60
56
 
@@ -65,7 +61,7 @@ import { Rave } from 'ravejs';
65
61
  A main class to interacting with API in global namespace of app.
66
62
  config - configuration for library, you can find it in `RaveConfig` type...
67
63
  `RaveConfig` =>
68
- * credentials?: { deviceId: string, token: string, autoJWT?: boolean, autoAccount?: boolean } - main credentials for authorization and options
64
+ * credentials?: { deviceId: string, token: string } - main credentials for authorization and options
69
65
  * enableLogging?: boolean - enable logging for library
70
66
  * account?: Account - Your user profile information after authorization
71
67
 
@@ -73,14 +69,13 @@ config - configuration for library, you can find it in `RaveConfig` type...
73
69
 
74
70
  1. `Rave.token: string` - Authorization bearer token
75
71
  2. `Rave.JWT: string` - Authorization JWT token for we mesh API
76
- 3. `Rave.account: Account` - Your user profile information after authorization
72
+ 3. `Rave.account: Account | undefined` - Your user profile information after authorization
77
73
  4. `Rave.proxy: string | undefined` - Proxy for requests (you can set socks proxy with proxy property setter too)
78
74
 
79
75
  #### Rave Methods
80
76
 
81
- 1. `refreshJWT = async (deviceId?: string): Promise<string>` - Refresh JWT token for we mesh API
82
- 2. `getAccount = async (): Promise<Account>` - Get your user profile information after authorization
83
- 3. `proxyIsAlive = async (): Promise<boolean>` - Check if proxy is alive
77
+ 1. `proxyIsAlive = async (): Promise<boolean>` - Check if proxy is alive
78
+ 2. `offProxy = (): Promise<void>` - Remove proxy from Rave instance
84
79
 
85
80
  -----------------
86
81
  Rave haves the fully modular structure and parts called `Factories`. Now i will describe them:
@@ -90,11 +85,16 @@ The main factory for authorization and authentication. Can be called with `Rave.
90
85
 
91
86
  #### Authenticate Factory methods
92
87
 
93
- 1. `sendMagicLink = async (email: string, language: string = DEFAULT_LANGUAGE): Promise<SendMagicLinkResponse> - Send magic link to email for authorization, if you doesn't know your credentials or just wanna register`
88
+ 1. `refreshJWT = async (deviceId?: string): Promise<string>` - Refresh JWT token for we mesh API
89
+
90
+ 2. `getAccount = async (): Promise<Account>` - Get your user profile information after authorization
91
+
92
+ 3. `authenticate = async (token: string, deviceId: string): Promise<Account>` - Authenticate with token and device id, creates JWT and account info automatically
93
+ 4. `sendMagicLink = async (email: string, language: string = DEFAULT_LANGUAGE): Promise<SendMagicLinkResponse> - Send magic link to email for authorization, if you doesn't know your credentials or just wanna register`
94
94
  * DEFAULT_LANGUAGE = 'ru'
95
95
  * SendMagicLinkResponse - { stateId: string } - stateId for magic link
96
96
 
97
- 2. `checkRegisterState = async (stateId: string): Promise<CheckRegisterStateResponse> - Check stateId for magic link`
97
+ 5. `checkRegisterState = async (stateId: string): Promise<CheckRegisterStateResponse> - Check stateId for magic link`
98
98
  * CheckRegisterStateResponse - {
99
99
  authenticated: boolean,
100
100
  isSecondFactorLogin: boolean,
@@ -115,7 +115,7 @@ The main factory for authorization and authentication. Can be called with `Rave.
115
115
  }
116
116
  }
117
117
 
118
- 3. `parseUserCredentials = async (idToken: string, email: string): Promise<ParseUserCredentialsResponse> - Parse user credentials from idToken and email`
118
+ 6. `parseUserCredentials = async (idToken: string, email: string): Promise<ParseUserCredentialsResponse> - Parse user credentials from idToken and email`
119
119
  * ParseUserCredentialsResponse - {
120
120
  objectId: string,
121
121
  createdAt: string,
@@ -123,14 +123,14 @@ The main factory for authorization and authentication. Can be called with `Rave.
123
123
  sessionToken: string,
124
124
  }
125
125
 
126
- 4. `mojoLogin = async (email: string, parseId: string, parseToken: string, name: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<MojoLoginResponse> - Login with mojo service to Rave`
126
+ 7. `mojoLogin = async (email: string, parseId: string, parseToken: string, name: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<MojoLoginResponse> - Login with mojo service to Rave`
127
127
  * MojoLoginResponse - { data: {
128
128
  isValid: boolean,
129
129
  newUser: boolean,
130
130
  suggestedHandles: string[],
131
131
  }}
132
132
 
133
- 5. `login = async (stateId: string, name?: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<AuthenticateResponse> - Simply summary of previous functions for login`
133
+ 8. `login = async (stateId: string, name?: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<AuthenticateResponse> - Simply summary of previous functions for login`
134
134
  * AuthenticateResponse - {
135
135
  isNewUser: boolean,
136
136
  email: string,
@@ -139,7 +139,7 @@ The main factory for authorization and authentication. Can be called with `Rave.
139
139
  token: string,
140
140
  }
141
141
 
142
- 6. `register = async (email: string, name: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<AuthenticateResponse> - Register a new user`
142
+ 9. `register = async (email: string, name: string, deviceId?: string, language = DEFAULT_LANGUAGE): Promise<AuthenticateResponse> - Register a new user`
143
143
  * RegisterResponse - {
144
144
  isNewUser: boolean,
145
145
  email: string,
@@ -1,5 +1,5 @@
1
1
  import { APIErrorData } from './schemas/error';
2
- export declare const VERSION = "1.13.9";
2
+ export declare const VERSION = "1.15.9";
3
3
  export declare const API_URL = "https://api1.a-l-p-a.com";
4
4
  export declare const PARSE_API_URL = "https://api3.a-l-p-a.com";
5
5
  export declare const EVENTS_API_URL = "https://api2.a-l-p-a.com/api";
package/dist/constants.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CODES_MAP = exports.PARSE_USERS_HEADERS = exports.PATCHED_IP_DATA = exports.PATCHED_DEVICE = exports.MOJO_AUTH_HEADERS = exports.API_HEADERS = exports.SOCKET_PING_DELAY = exports.UUID_PATTERN = exports.DEFAULT_LANGUAGE = exports.HASH_SECRET = exports.MOJO_AUTH_URL = exports.WE_MESH_API_URL = exports.EVENTS_API_URL = exports.PARSE_API_URL = exports.API_URL = exports.VERSION = void 0;
4
4
  // Constants
5
- exports.VERSION = '1.13.9';
5
+ exports.VERSION = '1.15.9';
6
6
  exports.API_URL = 'https://api1.a-l-p-a.com';
7
7
  exports.PARSE_API_URL = 'https://api3.a-l-p-a.com';
8
8
  exports.EVENTS_API_URL = 'https://api2.a-l-p-a.com/api';
@@ -3,7 +3,6 @@ import { MeshFactory } from '../factories/mesh-factory';
3
3
  import { UserFactory } from '../factories/user-factory';
4
4
  import { RaveConfig } from '../schemas/public';
5
5
  import { ThreadFactory } from '../factories/thread-factory';
6
- import { Account } from '../schemas/rave/account';
7
6
  export declare class Rave {
8
7
  private __config?;
9
8
  private __http;
@@ -14,6 +13,7 @@ export declare class Rave {
14
13
  constructor(config?: RaveConfig);
15
14
  get token(): string;
16
15
  get JWT(): string;
16
+ get auth(): AuthFactory;
17
17
  get account(): {
18
18
  acceptDataPolicy: number;
19
19
  acceptPrivacy: number;
@@ -32,8 +32,7 @@ export declare class Rave {
32
32
  displayName?: string | undefined;
33
33
  handle?: string | undefined;
34
34
  lang?: string | undefined;
35
- };
36
- get auth(): AuthFactory;
35
+ } | undefined;
37
36
  get user(): UserFactory;
38
37
  get mesh(): MeshFactory;
39
38
  get thread(): ThreadFactory;
@@ -41,7 +40,5 @@ export declare class Rave {
41
40
  set proxy(proxy: string);
42
41
  offProxy: () => void;
43
42
  proxyIsAlive: () => Promise<boolean>;
44
- refreshJWT: (deviceId?: string) => Promise<string>;
45
- getAccount: () => Promise<Account>;
46
43
  }
47
44
  //# sourceMappingURL=rave.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rave.d.ts","sourceRoot":"","sources":["../../src/core/rave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAS/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIlD,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,eAAe,CAAC,CAAgB;gBAE5B,MAAM,GAAE,UAAe;IAanC,IAAI,KAAK,WAER;IAED,IAAI,GAAG,WAEN;IAED,IAAI,OAAO;;;;;;;;;;;;;;;;;;MAMV;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,MAAM,kBAIT;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAMtB;IAEM,QAAQ,aAEb;IAEK,YAAY,QAAa,OAAO,CAAC,OAAO,CAAC,CAa9C;IAEK,UAAU,cAAqB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,CAU5D;IAEK,UAAU,QAAa,OAAO,CAAC,OAAO,CAAC,CAqB5C;CACH"}
1
+ {"version":3,"file":"rave.d.ts","sourceRoot":"","sources":["../../src/core/rave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAI5D,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,eAAe,CAAC,CAAgB;gBAE5B,MAAM,GAAE,UAAe;IAOnC,IAAI,KAAK,WAER;IAED,IAAI,GAAG,WAEN;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,OAAO;;;;;;;;;;;;;;;;;;kBAEV;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,IAAI,gBAIP;IAED,IAAI,MAAM,kBAIT;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAMtB;IAEM,QAAQ,aAEb;IAEK,YAAY,QAAa,OAAO,CAAC,OAAO,CAAC,CAa9C;CACH"}
package/dist/core/rave.js CHANGED
@@ -40,13 +40,11 @@ const mesh_factory_1 = require("../factories/mesh-factory");
40
40
  const user_factory_1 = require("../factories/user-factory");
41
41
  const logger_1 = __importStar(require("../utils/logger"));
42
42
  const httpworkflow_1 = require("./httpworkflow");
43
- const responses_1 = require("../schemas/responses");
44
43
  const thread_factory_1 = require("../factories/thread-factory");
45
44
  const constants_1 = require("../constants");
46
45
  const utils_1 = require("../utils/utils");
47
46
  class Rave {
48
47
  constructor(config = {}) {
49
- var _a, _b, _c;
50
48
  this.offProxy = () => {
51
49
  this.__http.offDispatcher();
52
50
  };
@@ -62,38 +60,8 @@ class Rave {
62
60
  }
63
61
  return true;
64
62
  };
65
- this.refreshJWT = async (deviceId) => {
66
- var _a, _b;
67
- const { data } = await this.__http.sendGet({
68
- path: `/users/self/validateMe?deviceId=${deviceId || ((_b = (_a = this.__config) === null || _a === void 0 ? void 0 : _a.credentials) === null || _b === void 0 ? void 0 : _b.deviceId)}`,
69
- }, responses_1.ValidateMeSchema);
70
- this.__http.weMeshToken = data;
71
- return data;
72
- };
73
- this.getAccount = async () => {
74
- var _a, _b;
75
- const { data } = await this.__http.sendPost({
76
- path: '/auth/login',
77
- body: JSON.stringify({
78
- adId: constants_1.PATCHED_DEVICE.adId,
79
- carrierCountry: constants_1.DEFAULT_LANGUAGE.toUpperCase(),
80
- deviceId: (_b = (_a = this.__config) === null || _a === void 0 ? void 0 : _a.credentials) === null || _b === void 0 ? void 0 : _b.deviceId,
81
- lang: constants_1.DEFAULT_LANGUAGE,
82
- storeCountry: constants_1.DEFAULT_LANGUAGE.toUpperCase(),
83
- }),
84
- }, responses_1.GetAccountSchema);
85
- this.__config = Object.assign(Object.assign({}, this.__config), { account: data });
86
- return this.__config.account;
87
- };
88
63
  this.__config = config;
89
64
  this.__http = new httpworkflow_1.HttpWorkflow();
90
- if ((_a = this.__config.credentials) === null || _a === void 0 ? void 0 : _a.token) {
91
- this.__http.token = this.__config.credentials.token;
92
- if ((_b = this.__config.credentials) === null || _b === void 0 ? void 0 : _b.autoAccount)
93
- this.getAccount();
94
- if ((_c = this.__config.credentials) === null || _c === void 0 ? void 0 : _c.autoJWT)
95
- this.refreshJWT();
96
- }
97
65
  (0, logger_1.default)(!!config.enableLogging);
98
66
  }
99
67
  get token() {
@@ -102,18 +70,15 @@ class Rave {
102
70
  get JWT() {
103
71
  return this.__http.weMeshToken;
104
72
  }
105
- get account() {
106
- var _a;
107
- if (!((_a = this.__config) === null || _a === void 0 ? void 0 : _a.account)) {
108
- throw new Error('Account not found');
109
- }
110
- return this.__config.account;
111
- }
112
73
  get auth() {
113
74
  if (!this.__authFactory)
114
75
  return (this.__authFactory = new auth_factory_1.AuthFactory(this.__config, this.__http));
115
76
  return this.__authFactory;
116
77
  }
78
+ get account() {
79
+ var _a;
80
+ return (_a = this.__config) === null || _a === void 0 ? void 0 : _a.account;
81
+ }
117
82
  get user() {
118
83
  if (!this.__userFactory)
119
84
  return (this.__userFactory = new user_factory_1.UserFactory(this.__http));
@@ -1,11 +1,15 @@
1
1
  import { HttpWorkflow } from '../core/httpworkflow';
2
2
  import { RaveConfig } from '../schemas';
3
+ import { Account } from '../schemas/rave/account';
3
4
  import { AuthenticateResponse, CheckRegisterStateResponse, MojoLoginResponse, ParseUserCredentialsResponse, SendMagicLinkResponse } from '../schemas/responses';
4
5
  export declare class AuthFactory {
5
6
  private __config;
6
7
  private readonly __http;
7
8
  constructor(config: RaveConfig | undefined, http: HttpWorkflow);
8
9
  private __authenticator;
10
+ getAccount: () => Promise<Account>;
11
+ refreshJWT: (deviceId?: string) => Promise<string>;
12
+ authenticate: (token: string, deviceId: string) => Promise<Account>;
9
13
  sendMagicLink: (email: string, language?: string) => Promise<SendMagicLinkResponse>;
10
14
  checkRegisterState: (stateId: string) => Promise<CheckRegisterStateResponse>;
11
15
  parseUserCredentials: (idToken: string, email: string) => Promise<ParseUserCredentialsResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-factory.d.ts","sourceRoot":"","sources":["../../src/factories/auth-factory.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAEL,oBAAoB,EACpB,0BAA0B,EAE1B,iBAAiB,EAEjB,4BAA4B,EAE5B,qBAAqB,EAEtB,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,UAAU,YAAK,EAAE,IAAI,EAAE,YAAY;IAKvD,OAAO,CAAC,eAAe,CAsCrB;IAEK,aAAa,UACX,MAAM,aACH,MAAM,KACf,OAAO,CAAC,qBAAqB,CAAC,CAU/B;IAEK,kBAAkB,YACd,MAAM,KACd,OAAO,CAAC,0BAA0B,CAAC,CASpC;IAEK,oBAAoB,YAChB,MAAM,SACR,MAAM,KACZ,OAAO,CAAC,4BAA4B,CAAC,CAiBtC;IAEK,SAAS,UACP,MAAM,WACJ,MAAM,cACH,MAAM,QACZ,MAAM,aACF,MAAM,aACN,MAAM,KACf,OAAO,CAAC,iBAAiB,CAAC,CAsB3B;IAEK,KAAK,YACD,MAAM,SACR,MAAM,aACF,MAAM,aACN,MAAM,KAChB,OAAO,CAAC,oBAAoB,CAAC,CAQ9B;IAEK,QAAQ,YACJ,MAAM,SACR,MAAM,aACF,MAAM,aACN,MAAM,KAChB,OAAO,CAAC,oBAAoB,CAAC,CAQ9B;CACH"}
1
+ {"version":3,"file":"auth-factory.d.ts","sourceRoot":"","sources":["../../src/factories/auth-factory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAEL,oBAAoB,EACpB,0BAA0B,EAE1B,iBAAiB,EAEjB,4BAA4B,EAE5B,qBAAqB,EAMtB,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,UAAU,YAAK,EAAE,IAAI,EAAE,YAAY;IAKvD,OAAO,CAAC,eAAe,CAsCrB;IAEK,UAAU,QAAa,OAAO,CAAC,OAAO,CAAC,CAqB5C;IAEK,UAAU,cAAqB,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,CAU5D;IAEK,YAAY,UACV,MAAM,YACH,MAAM,KACf,OAAO,CAAC,OAAO,CAAC,CAYjB;IAEK,aAAa,UACX,MAAM,aACH,MAAM,KACf,OAAO,CAAC,qBAAqB,CAAC,CAU/B;IAEK,kBAAkB,YACd,MAAM,KACd,OAAO,CAAC,0BAA0B,CAAC,CASpC;IAEK,oBAAoB,YAChB,MAAM,SACR,MAAM,KACZ,OAAO,CAAC,4BAA4B,CAAC,CAiBtC;IAEK,SAAS,UACP,MAAM,WACJ,MAAM,cACH,MAAM,QACZ,MAAM,aACF,MAAM,aACN,MAAM,KACf,OAAO,CAAC,iBAAiB,CAAC,CAsB3B;IAEK,KAAK,YACD,MAAM,SACR,MAAM,aACF,MAAM,aACN,MAAM,KAChB,OAAO,CAAC,oBAAoB,CAAC,CAQ9B;IAEK,QAAQ,YACJ,MAAM,SACR,MAAM,aACF,MAAM,aACN,MAAM,KAChB,OAAO,CAAC,oBAAoB,CAAC,CAQ9B;CACH"}
@@ -25,6 +25,37 @@ class AuthFactory {
25
25
  token: userCredentials.sessionToken.slice(2, userCredentials.sessionToken.length),
26
26
  });
27
27
  };
28
+ this.getAccount = async () => {
29
+ var _a, _b;
30
+ const { data } = await this.__http.sendPost({
31
+ path: '/auth/login',
32
+ body: JSON.stringify({
33
+ adId: constants_1.PATCHED_DEVICE.adId,
34
+ carrierCountry: constants_1.DEFAULT_LANGUAGE.toUpperCase(),
35
+ deviceId: (_b = (_a = this.__config) === null || _a === void 0 ? void 0 : _a.credentials) === null || _b === void 0 ? void 0 : _b.deviceId,
36
+ lang: constants_1.DEFAULT_LANGUAGE,
37
+ storeCountry: constants_1.DEFAULT_LANGUAGE.toUpperCase(),
38
+ }),
39
+ }, responses_1.GetAccountSchema);
40
+ this.__config = Object.assign(Object.assign({}, this.__config), { account: data });
41
+ return this.__config.account;
42
+ };
43
+ this.refreshJWT = async (deviceId) => {
44
+ var _a, _b;
45
+ const { data } = await this.__http.sendGet({
46
+ path: `/users/self/validateMe?deviceId=${deviceId || ((_b = (_a = this.__config) === null || _a === void 0 ? void 0 : _a.credentials) === null || _b === void 0 ? void 0 : _b.deviceId)}`,
47
+ }, responses_1.ValidateMeSchema);
48
+ this.__http.weMeshToken = data;
49
+ return data;
50
+ };
51
+ this.authenticate = async (token, deviceId) => {
52
+ this.__config.credentials = Object.assign(Object.assign({}, this.__config.credentials), { token,
53
+ deviceId });
54
+ this.__http.token = token;
55
+ const account = await this.getAccount();
56
+ await this.refreshJWT(deviceId);
57
+ return account;
58
+ };
28
59
  this.sendMagicLink = async (email, language = constants_1.DEFAULT_LANGUAGE) => {
29
60
  return await this.__http.sendRaw({
30
61
  method: 'POST',
@@ -2,6 +2,15 @@ import z from 'zod';
2
2
  export declare const LanguagesSchema: z.ZodEnum<{
3
3
  ru: "ru";
4
4
  en: "en";
5
+ de: "de";
6
+ fr: "fr";
7
+ es: "es";
8
+ it: "it";
9
+ pt: "pt";
10
+ ar: "ar";
11
+ pl: "pl";
12
+ nl: "nl";
13
+ uk: "uk";
5
14
  }>;
6
15
  export declare const AuthenticatorMethodSchema: z.ZodEnum<{
7
16
  LOGIN: "LOGIN";
@@ -13,8 +22,6 @@ export declare const CredentialsSchema: z.ZodObject<{
13
22
  }, z.core.$strip>;
14
23
  export declare const RaveConfigSchema: z.ZodObject<{
15
24
  credentials: z.ZodOptional<z.ZodObject<{
16
- autoJWT: z.ZodOptional<z.ZodBoolean>;
17
- autoAccount: z.ZodOptional<z.ZodBoolean>;
18
25
  token: z.ZodString;
19
26
  deviceId: z.ZodString;
20
27
  }, z.core.$strip>>;
@@ -53,6 +60,15 @@ export declare const GetManyMeshesSchema: z.ZodObject<{
53
60
  language: z.ZodEnum<{
54
61
  ru: "ru";
55
62
  en: "en";
63
+ de: "de";
64
+ fr: "fr";
65
+ es: "es";
66
+ it: "it";
67
+ pt: "pt";
68
+ ar: "ar";
69
+ pl: "pl";
70
+ nl: "nl";
71
+ uk: "uk";
56
72
  }>;
57
73
  }, z.core.$strip>;
58
74
  export type Credentials = z.infer<typeof CredentialsSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/schemas/public.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,eAAO,MAAM,eAAe;;;EAAuB,CAAC;AACpD,eAAO,MAAM,yBAAyB;;;EAAgC,CAAC;AAEvE,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAU3B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;iBAInC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAO9B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/schemas/public.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,eAAO,MAAM,eAAe;;;;;;;;;;;;EAY1B,CAAC;AACH,eAAO,MAAM,yBAAyB;;;EAAgC,CAAC;AAEvE,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;iBAQ3B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;iBAInC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;iBAO9B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
@@ -6,7 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GetManyMeshesSchema = exports.EditProfileBuilderSchema = exports.RaveConfigSchema = exports.CredentialsSchema = exports.AuthenticatorMethodSchema = exports.LanguagesSchema = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
8
  const account_1 = require("./rave/account");
9
- exports.LanguagesSchema = zod_1.default.enum(['en', 'ru']);
9
+ exports.LanguagesSchema = zod_1.default.enum([
10
+ 'en',
11
+ 'ru',
12
+ 'de',
13
+ 'fr',
14
+ 'es',
15
+ 'it',
16
+ 'pt',
17
+ 'ar',
18
+ 'pl',
19
+ 'nl',
20
+ 'uk',
21
+ ]);
10
22
  exports.AuthenticatorMethodSchema = zod_1.default.enum(['LOGIN', 'REGISTER']);
11
23
  exports.CredentialsSchema = zod_1.default.object({
12
24
  token: zod_1.default.string(),
@@ -14,7 +26,7 @@ exports.CredentialsSchema = zod_1.default.object({
14
26
  });
15
27
  exports.RaveConfigSchema = zod_1.default.object({
16
28
  credentials: zod_1.default
17
- .object(Object.assign(Object.assign({}, exports.CredentialsSchema.shape), { autoJWT: zod_1.default.boolean().optional(), autoAccount: zod_1.default.boolean().optional() }))
29
+ .object(Object.assign({}, exports.CredentialsSchema.shape))
18
30
  .optional(),
19
31
  enableLogging: zod_1.default.boolean().optional(),
20
32
  account: account_1.AccountSchema.optional(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ravejs",
3
- "version": "1.13.9",
3
+ "version": "1.15.9",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "files": [
package/README.RU.MD DELETED
@@ -1,391 +0,0 @@
1
- <div align="center">
2
- <h1>RaveJS</h1>
3
- <a href="https://t.me/aminodorks"><img src="https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white" alt="Telegram"></a>
4
- <a href="https://www.npmjs.com/package/ravejs"><img src="https://img.shields.io/badge/NPM-%23CB3837.svg?style=for-the-badge&logo=npm&logoColor=white" alt="NPM"></a>
5
- </div>
6
- <div align="center">
7
- <img src="https://img.shields.io/npm/dm/ravejs" alt="Downloads">
8
- <img src="https://img.shields.io/npm/v/ravejs.svg" alt="Version">
9
- <h2>RaveJS — библиотека на TypeScript для взаимодействия с API приложения Rave: Watch Party</h2>
10
- </div>
11
-
12
- - [README на английском](https://github.com/AminoDorks/ravejs/blob/master/README.MD)
13
- - [README на русском](https://github.com/AminoDorks/ravejs/blob/master/README.RU.MD)
14
-
15
- ---
16
-
17
- ## Содержание
18
- - [Возможности](#возможности)
19
- - [Начало работы](#начало-работы)
20
- - [Использование](#использование)
21
- - [Документация API](#документация-api)
22
- - [Участие в разработке](#участие-в-разработке)
23
- - [Лицензия](#лицензия)
24
-
25
- ---
26
-
27
- ## Возможности
28
-
29
- RaveJS обладает рядом преимуществ:
30
- - Модульная архитектура
31
- - Простота в использовании
32
- - Поддержка всех необходимых функций
33
- - Первая библиотека на TypeScript для Rave API
34
-
35
- ---
36
-
37
- ## Начало работы
38
-
39
- Чтобы начать использовать RaveJS, выполните следующие шаги:
40
-
41
- 1. Инициализируйте npm-пакет:
42
- ```bash
43
- npm init
44
- ```
45
- 2. Установите TypeScript глобально (опционально):
46
- ```bash
47
- npm install -g typescript
48
- ```
49
- 3. Создайте конфигурацию TypeScript:
50
- ```bash
51
- tsc --init
52
- ```
53
- 4. Установите RaveJS:
54
- ```bash
55
- npm install ravejs
56
- ```
57
-
58
- ---
59
-
60
- ## Использование
61
-
62
- ### Базовая авторизация
63
-
64
- ```typescript
65
- import { Rave } from 'ravejs';
66
-
67
- (async () => {
68
- const rave = new Rave({
69
- credentials: {
70
- deviceId: 'ваш_device_id',
71
- token: 'ваш_токен'
72
- }
73
- });
74
- console.log(`Авторизован как ${(await rave.getAccount()).id}`);
75
- })();
76
- ```
77
-
78
- ---
79
-
80
- ## Документация API
81
-
82
- ### `Rave(config: RaveConfig)`
83
- Главный класс для взаимодействия с API Rave.
84
-
85
- #### Конфигурация (`RaveConfig`)
86
- - `credentials?`: `{ deviceId: string, token: string, autoJWT?: boolean, autoAccount?: boolean }` — данные для авторизации и опции
87
- - `enableLogging?`: `boolean` — включить логирование
88
- - `account?`: `Account` — профиль пользователя после авторизации
89
-
90
- #### Свойства экземпляра `Rave`
91
- 1. `token: string` — Bearer-токен авторизации
92
- 2. `JWT: string` — JWT-токен для Web Mesh API
93
- 3. `account: Account` — информация о профиле пользователя
94
- 4. `proxy?: string` — прокси для запросов (поддерживаются SOCKS-прокси; можно задать через сеттер)
95
-
96
- #### Методы экземпляра `Rave`
97
- 1. `refreshJWT(deviceId?: string): Promise<string>` — обновить JWT-токен
98
- 2. `getAccount(): Promise<Account>` — получить данные авторизованного пользователя
99
- 3. `proxyIsAlive = async (): Promise<boolean>` - Проверить, работает ли прокси
100
-
101
- ---
102
-
103
- ### Фабрики
104
-
105
- RaveJS использует модульную архитектуру, основанную на *фабриках*.
106
-
107
- ---
108
-
109
- #### `AuthFactory`
110
- Фабрика для авторизации и аутентификации. Доступна через `rave.auth`.
111
-
112
- ##### Методы `AuthFactory`
113
- 1. `sendMagicLink(email: string, language = 'ru'): Promise<{ stateId: string }>`
114
- Отправить «волшебную» ссылку на почту для входа или регистрации.
115
-
116
- 2. `checkRegisterState(stateId: string): Promise<CheckRegisterStateResponse>`
117
- Проверить статус регистрации по `stateId`.
118
- **Ответ:**
119
- ```ts
120
- {
121
- authenticated: boolean,
122
- isSecondFactorLogin: boolean,
123
- oauth: {
124
- accessToken: string,
125
- idToken: string,
126
- refreshToken: string,
127
- expiresIn: string,
128
- tokenType: string
129
- },
130
- user: {
131
- createdAt: string,
132
- updatedAt: string,
133
- issuer: string,
134
- userId: string,
135
- identifier: string,
136
- email: string
137
- }
138
- }
139
- ```
140
-
141
- 3. `parseUserCredentials(idToken: string, email: string): Promise<{ objectId: string; createdAt: string; username: string; sessionToken: string }>`
142
- Извлечь учётные данные из `idToken` и email.
143
-
144
- 4. `mojoLogin(email: string, parseId: string, parseToken: string, name: string, deviceId?: string, language = 'ru'): Promise<{ data: { isValid: boolean; newUser: boolean; suggestedHandles: string[] } }>`
145
- Вход через сервис Mojo.
146
-
147
- 5. `login(stateId: string, name?: string, deviceId?: string, language = 'ru'): Promise<AuthenticateResponse>`
148
- Упрощённый метод входа (комбинирует предыдущие шаги).
149
- **Ответ (`AuthenticateResponse`):**
150
- ```ts
151
- {
152
- isNewUser: boolean,
153
- email: string,
154
- username: string,
155
- deviceId: string,
156
- token: string
157
- }
158
- ```
159
-
160
- 6. `register(email: string, name: string, deviceId?: string, language = 'ru'): Promise<RegisterResponse>`
161
- Регистрация нового пользователя (аналогично `login`, но гарантирует создание аккаунта).
162
-
163
- ---
164
-
165
- #### `MeshFactory`
166
- Фабрика для работы с *мешами* (комнатами просмотра). Доступна через `rave.mesh`.
167
-
168
- ##### Методы `MeshFactory`
169
- 1. `get(meshId: string): Promise<GetMeshResponse>`
170
- Получить информацию о меше по ID.
171
- **Ответ (`GetMeshResponse.data`):**
172
- ```ts
173
- {
174
- blurT?: boolean;
175
- category: string;
176
- channel: number;
177
- createdAt: string;
178
- currentState: 'play' | 'paus';
179
- explicit: boolean;
180
- id: string;
181
- isFriend: boolean;
182
- isLocal: boolean;
183
- isPublic: boolean;
184
- kickMode: string;
185
- maturity: string;
186
- mediaUrl: string;
187
- originator: number;
188
- playMode: string;
189
- position: number;
190
- server: string;
191
- shareLink: string;
192
- thumbnails?: {
193
- channel?: string;
194
- standard?: string;
195
- animated?: string;
196
- maxres?: string;
197
- medium?: string;
198
- default?: string;
199
- high?: string;
200
- };
201
- time: number;
202
- videoAuthor: string;
203
- videoDuration: number;
204
- videoProvider: string;
205
- videoPublishedAt: string;
206
- videoThumbnail: string;
207
- videoTitle: string;
208
- videoUrl: string;
209
- vikiPass: boolean;
210
- voipMode: string;
211
- users: {
212
- avatar: string;
213
- country: string;
214
- displayName?: string;
215
- handle?: string;
216
- id: number;
217
- lang?: string;
218
- lat: number;
219
- lng: number;
220
- name: string;
221
- }[];
222
- }
223
- ```
224
-
225
- 2. `getByLink(meshLink: string): Promise<GetMeshResponse>`
226
- Получить меш по публичной ссылке (`shareLink`).
227
-
228
- 3. `getMany(params: GetManyMeshesParams): Promise<GetMeshResponse[]>`
229
- Получить список мешей.
230
- **Параметры (`GetManyMeshesParams`):**
231
- ```ts
232
- {
233
- isPublic?: boolean;
234
- limit: number;
235
- hasFriends: boolean;
236
- local: boolean;
237
- hasInvited: boolean;
238
- language?: string;
239
- }
240
- ```
241
-
242
- 4. `join(meshId: string): Promise<MeshSocket>`
243
- Присоединиться к мешу. Возвращает экземпляр `MeshSocket` для взаимодействия через WebSocket.
244
-
245
- ---
246
-
247
- #### `ThreadFactory`
248
- Фабрика для работы с переписками. Доступна через `rave.thread`.
249
-
250
- ##### Методы `ThreadFactory`
251
- 1. `getMany(): Promise<Thread[]>`
252
- Получить все переписки.
253
- **Структура `Thread`:**
254
- ```ts
255
- {
256
- expiryMode: number;
257
- isFriend: boolean;
258
- myself: number;
259
- opposingUser: number;
260
- spokenLangs: string[];
261
- threadId: string;
262
- }
263
- ```
264
-
265
- 2. `create(userId: number): Promise<Thread>`
266
- Создать новую переписку с пользователем.
267
-
268
- 3. `sendMessage(threadId: string, content: string): Promise<SendMessageResponse>`
269
- Отправить сообщение в переписку.
270
- **Ответ (`SendMessageResponse.data`):**
271
- ```ts
272
- {
273
- correlateId: string;
274
- threadId: string;
275
- messageType: string;
276
- originator: number;
277
- messageBody: {
278
- content: string;
279
- detectedLang: string;
280
- id: string;
281
- translations: Record<string, string>;
282
- }
283
- }
284
- ```
285
-
286
- ---
287
-
288
- #### `UserFactory`
289
- Фабрика для работы с пользователями. Доступна через `rave.user`.
290
-
291
- ##### Методы `UserFactory`
292
- 1. `get(userId: number): Promise<GetUserResponse>`
293
- Получить профиль пользователя.
294
- **Ответ (`GetUserResponse.data`):**
295
- ```ts
296
- {
297
- bio: {
298
- bio?: string;
299
- metadata: { position: number; privacy: string };
300
- };
301
- profile: {
302
- avatar: string;
303
- country: string;
304
- displayName?: string;
305
- handle?: string;
306
- };
307
- }
308
- ```
309
-
310
- 2. `sendFriendship(userId: number): Promise<FriendshipResponse>`
311
- Отправить запрос на добавление в друзья.
312
- **Ответ (`FriendshipResponse.data`):**
313
- ```ts
314
- {
315
- fromUserId: number;
316
- state: string;
317
- toUserId: number;
318
- }
319
- ```
320
-
321
- 3. `acceptFriendship(userId: number): Promise<void>`
322
- Принять запрос в друзья.
323
-
324
- 4. `declineFriendship(userId: number): Promise<void>`
325
- Отклонить запрос в друзья.
326
-
327
- 5. `edit(builder: EditProfileBuilder): Promise<EditProfileResponse>`
328
- Редактировать профиль.
329
- **Параметры (`EditProfileBuilder`):**
330
- ```ts
331
- {
332
- displayAvatar?: string;
333
- displayName?: string;
334
- handle?: string;
335
- }
336
- ```
337
- **Ответ (`EditProfileResponse.data`)** — объект `User`.
338
-
339
- 6. `getAvatarUpload(): Promise<GetAvatarUploadResponse>`
340
- Получить URL для загрузки аватара.
341
- **Ответ (`GetAvatarUploadResponse.data`):**
342
- ```ts
343
- {
344
- expiresAt: string;
345
- fileName: string;
346
- mime: string;
347
- uploadUrl: string;
348
- }
349
- ```
350
-
351
- 7. `uploadOnUrl(uploadUrl: string, image: Buffer): Promise<void>`
352
- Загрузить изображение по полученному URL.
353
-
354
- 8. `uploadAvatar(image: Buffer): Promise<string>`
355
- Упрощённый метод: получить URL и загрузить аватар за один вызов. Возвращает `displayAvatar` (новый URL аватара).
356
-
357
- ---
358
-
359
- #### `MeshSocket`
360
- Класс для работы с WebSocket-соединением в меше.
361
-
362
- ##### Методы и свойства `MeshSocket`
363
- 1. `onclose(handler: () => Promise<void>): void`
364
- Обработчик закрытия соединения.
365
-
366
- 2. `onerror(handler: () => Promise<void>): void`
367
- Обработчик ошибок.
368
-
369
- 3. `onmessage(handler: (data: string) => Promise<void>): void`
370
- Обработчик входящих сообщений (сырой JSON-строки).
371
-
372
- 4. `sendMessage(content: string): void`
373
- Отправить сообщение в меш (например, команды управления воспроизведением).
374
-
375
- 5. `leave(): void`
376
- Покинуть меш (закрывает сокет).
377
-
378
- ---
379
-
380
- ## Участие в разработке
381
-
382
- Приветствуются pull request'ы и предложения по улучшению!
383
- Если вы используете мои генераторы кода — напишите мне в [личные сообщения Telegram](https://t.me/celt_is_god).
384
-
385
- ---
386
-
387
- ## Лицензия
388
-
389
- RaveJS распространяется под лицензией **MIT**. Подробнее см. в файле [LICENSE](https://github.com/thatcelt/ravejs/blob/master/LICENSE).
390
-
391
- ---