ravejs 1.12.9 → 1.14.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 +392 -0
- package/{README.MD → README.md} +18 -18
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/core/mesh-socket.d.ts.map +1 -1
- package/dist/core/mesh-socket.js +4 -0
- package/dist/core/rave.d.ts +2 -5
- package/dist/core/rave.d.ts.map +1 -1
- package/dist/core/rave.js +4 -39
- package/dist/factories/auth-factory.d.ts +4 -0
- package/dist/factories/auth-factory.d.ts.map +1 -1
- package/dist/factories/auth-factory.js +31 -0
- package/dist/factories/mesh-factory.d.ts.map +1 -1
- package/dist/factories/mesh-factory.js +1 -0
- package/dist/schemas/private.d.ts +1 -0
- package/dist/schemas/private.d.ts.map +1 -1
- package/dist/schemas/private.js +1 -0
- package/dist/schemas/public.d.ts +0 -2
- package/dist/schemas/public.d.ts.map +1 -1
- package/dist/schemas/public.js +1 -1
- package/package.json +3 -2
- package/README.RU.MD +0 -391
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
|
+
---
|
package/{README.MD → README.md}
RENAMED
|
@@ -48,13 +48,9 @@ To get started with RaveJS, follow these steps:
|
|
|
48
48
|
import { Rave } from 'ravejs';
|
|
49
49
|
|
|
50
50
|
(async () => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
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. `
|
|
82
|
-
2. `
|
|
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. `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { APIErrorData } from './schemas/error';
|
|
2
|
-
export declare const VERSION = "1.
|
|
2
|
+
export declare const VERSION = "1.14.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.
|
|
5
|
+
exports.VERSION = '1.14.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';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-socket.d.ts","sourceRoot":"","sources":["../../src/core/mesh-socket.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mesh-socket.d.ts","sourceRoot":"","sources":["../../src/core/mesh-socket.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAY;gBAEnB,MAAM,EAAE,gBAAgB;IAqBpC,OAAO,CAAC,MAAM,CAGZ;IAEF,OAAO,CAAC,iBAAiB,CASvB;IAEF,OAAO,CAAC,YAAY,CASlB;IAEK,OAAO,YAAa,MAAM,OAAO,CAAC,IAAI,CAAC,UAG5C;IAEK,OAAO,YAAa,MAAM,OAAO,CAAC,IAAI,CAAC,UAG5C;IAEK,SAAS,YAAa,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,UAG1D;IAEK,WAAW,YAAa,MAAM,KAAG,IAAI,CAe1C;IAEK,KAAK,QAAO,IAAI,CAErB;CACH"}
|
package/dist/core/mesh-socket.js
CHANGED
|
@@ -5,6 +5,7 @@ const ws_1 = require("ws");
|
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
6
|
const constants_1 = require("../constants");
|
|
7
7
|
const logger_1 = require("../utils/logger");
|
|
8
|
+
const socks_proxy_agent_1 = require("socks-proxy-agent");
|
|
8
9
|
class MeshSocket {
|
|
9
10
|
constructor(config) {
|
|
10
11
|
this.__send = (data) => {
|
|
@@ -63,6 +64,9 @@ class MeshSocket {
|
|
|
63
64
|
authorization: `Bearer ${this.__config.credentials.token}`,
|
|
64
65
|
'API-Version': '4',
|
|
65
66
|
},
|
|
67
|
+
agent: this.__config.proxy
|
|
68
|
+
? new socks_proxy_agent_1.SocksProxyAgent(this.__config.proxy)
|
|
69
|
+
: undefined,
|
|
66
70
|
});
|
|
67
71
|
this.__websocket.on('open', () => {
|
|
68
72
|
logger_1.LOGGER.info({ url: this.__url }, 'WebSocket opened');
|
package/dist/core/rave.d.ts
CHANGED
|
@@ -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
|
package/dist/core/rave.d.ts.map
CHANGED
|
@@ -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;
|
|
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":"
|
|
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',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-factory.d.ts","sourceRoot":"","sources":["../../src/factories/mesh-factory.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,qBAAqB,EAErB,eAAe,EAIhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,UAAU,YAAK,EAAE,IAAI,EAAE,YAAY;IAKhD,GAAG,WAAkB,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC,CAO3D;IAEK,SAAS,aAAoB,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC,CAYnE;IAEK,OAAO,YACJ,mBAAmB,KAK1B,OAAO,CAAC,qBAAqB,CAAC,CAO/B;IAEK,IAAI,WAAkB,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"mesh-factory.d.ts","sourceRoot":"","sources":["../../src/factories/mesh-factory.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,qBAAqB,EAErB,eAAe,EAIhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,MAAM,EAAE,UAAU,YAAK,EAAE,IAAI,EAAE,YAAY;IAKhD,GAAG,WAAkB,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC,CAO3D;IAEK,SAAS,aAAoB,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC,CAYnE;IAEK,OAAO,YACJ,mBAAmB,KAK1B,OAAO,CAAC,qBAAqB,CAAC,CAO/B;IAEK,IAAI,WAAkB,MAAM,KAAG,OAAO,CAAC,UAAU,CAAC,CA0CvD;CACH"}
|
|
@@ -10,6 +10,7 @@ export declare const MeshSocketConfigSchema: z.ZodObject<{
|
|
|
10
10
|
token: z.ZodString;
|
|
11
11
|
deviceId: z.ZodString;
|
|
12
12
|
}, z.core.$strip>;
|
|
13
|
+
proxy: z.ZodOptional<z.ZodString>;
|
|
13
14
|
}, z.core.$strip>;
|
|
14
15
|
export type HeadersType = Record<string, string>;
|
|
15
16
|
export type MethodType = 'POST' | 'PUT';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/schemas/private.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,eAAO,MAAM,YAAY;;kBAIZ,CAAC;AAEd,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../src/schemas/private.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,eAAO,MAAM,YAAY;;kBAIZ,CAAC;AAEd,eAAO,MAAM,sBAAsB;;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AACxC,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAC;AACvD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
package/dist/schemas/private.js
CHANGED
package/dist/schemas/public.d.ts
CHANGED
|
@@ -13,8 +13,6 @@ export declare const CredentialsSchema: z.ZodObject<{
|
|
|
13
13
|
}, z.core.$strip>;
|
|
14
14
|
export declare const RaveConfigSchema: z.ZodObject<{
|
|
15
15
|
credentials: z.ZodOptional<z.ZodObject<{
|
|
16
|
-
autoJWT: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
-
autoAccount: z.ZodOptional<z.ZodBoolean>;
|
|
18
16
|
token: z.ZodString;
|
|
19
17
|
deviceId: z.ZodString;
|
|
20
18
|
}, z.core.$strip>>;
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
package/dist/schemas/public.js
CHANGED
|
@@ -14,7 +14,7 @@ exports.CredentialsSchema = zod_1.default.object({
|
|
|
14
14
|
});
|
|
15
15
|
exports.RaveConfigSchema = zod_1.default.object({
|
|
16
16
|
credentials: zod_1.default
|
|
17
|
-
.object(Object.assign(
|
|
17
|
+
.object(Object.assign({}, exports.CredentialsSchema.shape))
|
|
18
18
|
.optional(),
|
|
19
19
|
enableLogging: zod_1.default.boolean().optional(),
|
|
20
20
|
account: account_1.AccountSchema.optional(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ravejs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"author": "celt_is_god",
|
|
37
37
|
"type": "commonjs",
|
|
38
38
|
"scripts": {
|
|
39
|
-
"test": "
|
|
39
|
+
"test": "tsc && cd dist/ && node index.js"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/ws": "^8.18.1",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"fetch-socks": "^1.3.2",
|
|
47
47
|
"pino": "^10.1.0",
|
|
48
48
|
"pino-pretty": "^13.1.3",
|
|
49
|
+
"socks-proxy-agent": "^8.0.5",
|
|
49
50
|
"uuid": "^13.0.0",
|
|
50
51
|
"ws": "^8.18.3",
|
|
51
52
|
"zod": "^4.1.13"
|
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
|
-
---
|