itd-api 0.0.5 → 0.0.7
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.md +107 -1
- package/dist/{chunk-YM2YUO4D.cjs → chunk-3RNNZJZ4.cjs} +290 -55
- package/dist/chunk-3RNNZJZ4.cjs.map +1 -0
- package/dist/{chunk-RUPF4X5L.js → chunk-CG4SERVM.js} +286 -56
- package/dist/chunk-CG4SERVM.js.map +1 -0
- package/dist/{index-Dv0LXpMf.d.cts → index-DNFPX_Z1.d.cts} +348 -62
- package/dist/{index-Dv0LXpMf.d.ts → index-DNFPX_Z1.d.ts} +348 -62
- package/dist/index.cjs +104 -84
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +103 -83
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/package.json +5 -4
- package/dist/chunk-RUPF4X5L.js.map +0 -1
- package/dist/chunk-YM2YUO4D.cjs.map +0 -1
|
@@ -577,6 +577,24 @@ var AttachmentType = Object.freeze({
|
|
|
577
577
|
/** Голосовые комментарии: `audio/ogg`, с полем `duration`. */
|
|
578
578
|
Audio: "audio"
|
|
579
579
|
});
|
|
580
|
+
var SpanType = Object.freeze({
|
|
581
|
+
/** Хэштег. Название без решётки лежит в `tag`. */
|
|
582
|
+
Hashtag: "hashtag",
|
|
583
|
+
/** Упоминание. Имя пользователя лежит в `tag`. */
|
|
584
|
+
Mention: "mention",
|
|
585
|
+
/** Ссылка. Адрес лежит в `url`, а не в `tag`. */
|
|
586
|
+
Link: "link",
|
|
587
|
+
Bold: "bold",
|
|
588
|
+
Italic: "italic",
|
|
589
|
+
Underline: "underline",
|
|
590
|
+
/** Зачёркнутый. */
|
|
591
|
+
Strike: "strike",
|
|
592
|
+
/** Спойлер: текст скрыт до нажатия. */
|
|
593
|
+
Spoiler: "spoiler",
|
|
594
|
+
/** Моноширинный. */
|
|
595
|
+
Monospace: "monospace",
|
|
596
|
+
Quote: "quote"
|
|
597
|
+
});
|
|
580
598
|
var ReportTargetType = Object.freeze({
|
|
581
599
|
Post: "post",
|
|
582
600
|
Comment: "comment",
|
|
@@ -596,14 +614,18 @@ var RealtimeStatus = Object.freeze({
|
|
|
596
614
|
Error: "error",
|
|
597
615
|
Disconnected: "disconnected"
|
|
598
616
|
});
|
|
599
|
-
var
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
var LikesVisibility = Object.freeze({
|
|
603
|
-
Everyone: "everyone",
|
|
617
|
+
var AccessType = Object.freeze({
|
|
618
|
+
/** Никто. */
|
|
619
|
+
Nobody: "nobody",
|
|
604
620
|
/** Только взаимные подписки. */
|
|
605
|
-
Mutual: "mutual"
|
|
621
|
+
Mutual: "mutual",
|
|
622
|
+
/** Подписчики. */
|
|
623
|
+
Followers: "followers",
|
|
624
|
+
/** Все. */
|
|
625
|
+
Everyone: "everyone"
|
|
606
626
|
});
|
|
627
|
+
var WallAccess = AccessType;
|
|
628
|
+
var LikesVisibility = AccessType;
|
|
607
629
|
var NotificationType = Object.freeze({
|
|
608
630
|
/** Реакция на пост. Старое имя — `like`. */
|
|
609
631
|
PostReaction: "post_reaction",
|
|
@@ -632,6 +654,36 @@ var NotificationType = Object.freeze({
|
|
|
632
654
|
/** Верификация отклонена. Приходит только по REST. */
|
|
633
655
|
VerificationRejected: "verification_rejected"
|
|
634
656
|
});
|
|
657
|
+
var InteractionType = Object.freeze({
|
|
658
|
+
/** Открытие фотографии. */
|
|
659
|
+
PhotoOpen: 1,
|
|
660
|
+
/** Прогресс просмотра видео. Несёт поля `pm`/`dm`. */
|
|
661
|
+
VideoProgress: 2
|
|
662
|
+
});
|
|
663
|
+
var ViewSource = Object.freeze({
|
|
664
|
+
FeedGlobal: 1,
|
|
665
|
+
FeedFollowing: 2,
|
|
666
|
+
FeedClan: 3,
|
|
667
|
+
Profile: 4,
|
|
668
|
+
Hashtag: 5,
|
|
669
|
+
PostPage: 6,
|
|
670
|
+
Link: 7,
|
|
671
|
+
Search: 8
|
|
672
|
+
});
|
|
673
|
+
var ViewReason = Object.freeze({
|
|
674
|
+
/** Пост ушёл из зоны видимости при обычной прокрутке. */
|
|
675
|
+
Normal: 0,
|
|
676
|
+
/** Потеря фокуса окна. */
|
|
677
|
+
Blur: 1,
|
|
678
|
+
/** Вкладка скрыта. */
|
|
679
|
+
Hidden: 2,
|
|
680
|
+
/** Уход со страницы (`pagehide`). */
|
|
681
|
+
PageHide: 3,
|
|
682
|
+
/** Элемент перестал наблюдаться. */
|
|
683
|
+
Unobserve: 4,
|
|
684
|
+
/** Достигнут порог времени просмотра. */
|
|
685
|
+
ThresholdMet: 5
|
|
686
|
+
});
|
|
635
687
|
var ItdErrorCode = Object.freeze({
|
|
636
688
|
BAD_REQUEST: "BAD_REQUEST",
|
|
637
689
|
UNAUTHORIZED: "UNAUTHORIZED",
|
|
@@ -1696,7 +1748,7 @@ function normalizeBaseUrl(baseUrl) {
|
|
|
1696
1748
|
// src/core/config.ts
|
|
1697
1749
|
var DEFAULT_BASE_URL = "https://xn--d1ah4a.com";
|
|
1698
1750
|
var DEFAULT_TIMEOUT = 3e4;
|
|
1699
|
-
var LIBRARY_VERSION = "0.0.
|
|
1751
|
+
var LIBRARY_VERSION = "0.0.7";
|
|
1700
1752
|
var DEFAULT_USER_AGENT = `Mozilla/5.0 (compatible; itd-api/${LIBRARY_VERSION}; +https://github.com/KiowDev/itd-api)`;
|
|
1701
1753
|
var DEFAULT_RATE_LIMIT_DELAYS = Object.freeze([1e3, 5e3, 3e4, 6e4, 9e4]);
|
|
1702
1754
|
function requirePositive(value, name) {
|
|
@@ -2091,6 +2143,7 @@ function createApiError(context) {
|
|
|
2091
2143
|
function sleep(ms) {
|
|
2092
2144
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
2093
2145
|
}
|
|
2146
|
+
var EMPTY_KEYS = /* @__PURE__ */ new Set();
|
|
2094
2147
|
function setHeader(headers, name, value) {
|
|
2095
2148
|
try {
|
|
2096
2149
|
headers.set(name, value);
|
|
@@ -2144,6 +2197,7 @@ function createAbortBundle(userSignal, timeout) {
|
|
|
2144
2197
|
var HttpClient = class {
|
|
2145
2198
|
#config;
|
|
2146
2199
|
#collaborators;
|
|
2200
|
+
#plugins;
|
|
2147
2201
|
constructor(config, collaborators = {}) {
|
|
2148
2202
|
this.#config = config;
|
|
2149
2203
|
this.#collaborators = collaborators;
|
|
@@ -2152,6 +2206,19 @@ var HttpClient = class {
|
|
|
2152
2206
|
get baseUrl() {
|
|
2153
2207
|
return this.#config.baseUrl;
|
|
2154
2208
|
}
|
|
2209
|
+
/**
|
|
2210
|
+
* Имена опций запроса, заявленные плагинами.
|
|
2211
|
+
*
|
|
2212
|
+
* Читается ресурсами: они переносят в транспорт только известные поля, а чужие,
|
|
2213
|
+
* если их никто не заявил, отсеивают.
|
|
2214
|
+
*/
|
|
2215
|
+
get pluginOptionKeys() {
|
|
2216
|
+
return this.#plugins?.optionKeys ?? EMPTY_KEYS;
|
|
2217
|
+
}
|
|
2218
|
+
/** Подключает список плагинов. Реестр общий с клиентом и пополняется через `itd.use()`. */
|
|
2219
|
+
usePlugins(plugins) {
|
|
2220
|
+
this.#plugins = plugins;
|
|
2221
|
+
}
|
|
2155
2222
|
/**
|
|
2156
2223
|
* Подключает недостающие части конвейера.
|
|
2157
2224
|
*
|
|
@@ -2171,10 +2238,22 @@ var HttpClient = class {
|
|
|
2171
2238
|
* @throws {ItdNetworkError} если запрос не дошёл до сервера
|
|
2172
2239
|
*/
|
|
2173
2240
|
async request(options) {
|
|
2174
|
-
const task = () => this.#
|
|
2241
|
+
const task = () => this.#withPlugins(options);
|
|
2175
2242
|
if (!this.#collaborators.schedule || options.skipQueue) return task();
|
|
2176
2243
|
return this.#collaborators.schedule(task);
|
|
2177
2244
|
}
|
|
2245
|
+
/**
|
|
2246
|
+
* Прогоняет запрос через обёртки плагинов.
|
|
2247
|
+
*
|
|
2248
|
+
* Цепочка стоит **снаружи повторов и внутри очереди**: плагин должен увидеть запрос
|
|
2249
|
+
* и ответ по одному разу, независимо от того, сколько попыток понадобилось, — иначе,
|
|
2250
|
+
* например, текст поста зашифруется повторно на второй попытке.
|
|
2251
|
+
*/
|
|
2252
|
+
#withPlugins(options) {
|
|
2253
|
+
const plugins = this.#plugins;
|
|
2254
|
+
if (!plugins || plugins.size === 0) return this.#withRetries(options);
|
|
2255
|
+
return plugins.run(options, (request) => this.#withRetries(request));
|
|
2256
|
+
}
|
|
2178
2257
|
async #withRetries(options) {
|
|
2179
2258
|
const method = options.method.toUpperCase();
|
|
2180
2259
|
for (let attempt = 1; ; attempt++) {
|
|
@@ -2320,6 +2399,97 @@ var HttpClient = class {
|
|
|
2320
2399
|
}
|
|
2321
2400
|
};
|
|
2322
2401
|
|
|
2402
|
+
// src/core/plugins.ts
|
|
2403
|
+
var NO_KEYS = /* @__PURE__ */ new Set();
|
|
2404
|
+
var RESERVED_OPTION_KEYS = /* @__PURE__ */ new Set([
|
|
2405
|
+
"signal",
|
|
2406
|
+
"timeout",
|
|
2407
|
+
"headers",
|
|
2408
|
+
"retry",
|
|
2409
|
+
"method",
|
|
2410
|
+
"path",
|
|
2411
|
+
"query",
|
|
2412
|
+
"body",
|
|
2413
|
+
"skipAuth",
|
|
2414
|
+
"skipAuthRefresh",
|
|
2415
|
+
"skipQueue",
|
|
2416
|
+
"raw"
|
|
2417
|
+
]);
|
|
2418
|
+
var PluginRegistry = class {
|
|
2419
|
+
#transformers = [];
|
|
2420
|
+
#optionKeys = /* @__PURE__ */ new Set();
|
|
2421
|
+
#names = /* @__PURE__ */ new Set();
|
|
2422
|
+
/** Сколько обёрток подключено. Ноль означает, что запрос идёт прежним путём. */
|
|
2423
|
+
get size() {
|
|
2424
|
+
return this.#transformers.length;
|
|
2425
|
+
}
|
|
2426
|
+
/** Имена опций запроса, заявленные плагинами. */
|
|
2427
|
+
get optionKeys() {
|
|
2428
|
+
return this.#optionKeys.size === 0 ? NO_KEYS : this.#optionKeys;
|
|
2429
|
+
}
|
|
2430
|
+
/**
|
|
2431
|
+
* Подключает плагин.
|
|
2432
|
+
*
|
|
2433
|
+
* @throws {ItdConfigError} если плагин задан неверно, уже подключён или заявил занятое
|
|
2434
|
+
* имя опции
|
|
2435
|
+
*/
|
|
2436
|
+
add(plugin, context) {
|
|
2437
|
+
if (typeof plugin?.install !== "function") {
|
|
2438
|
+
throw new ItdConfigError("\u041F\u043B\u0430\u0433\u0438\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u043C \u0441 \u043C\u0435\u0442\u043E\u0434\u043E\u043C install()");
|
|
2439
|
+
}
|
|
2440
|
+
const name = plugin.name;
|
|
2441
|
+
if (typeof name !== "string" || name.trim() === "") {
|
|
2442
|
+
throw new ItdConfigError("\u0423 \u043F\u043B\u0430\u0433\u0438\u043D\u0430 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043D\u0435\u043F\u0443\u0441\u0442\u043E\u0435 \u0438\u043C\u044F");
|
|
2443
|
+
}
|
|
2444
|
+
if (this.#names.has(name)) {
|
|
2445
|
+
throw new ItdConfigError(`\u041F\u043B\u0430\u0433\u0438\u043D \xAB${name}\xBB \u0443\u0436\u0435 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0451\u043D`);
|
|
2446
|
+
}
|
|
2447
|
+
const keys = plugin.optionKeys ?? [];
|
|
2448
|
+
for (const key of keys) {
|
|
2449
|
+
if (typeof key !== "string" || key.trim() === "") {
|
|
2450
|
+
throw new ItdConfigError(`\u041F\u043B\u0430\u0433\u0438\u043D \xAB${name}\xBB \u0437\u0430\u044F\u0432\u0438\u043B \u043F\u0443\u0441\u0442\u043E\u0435 \u0438\u043C\u044F \u043E\u043F\u0446\u0438\u0438`);
|
|
2451
|
+
}
|
|
2452
|
+
if (RESERVED_OPTION_KEYS.has(key)) {
|
|
2453
|
+
throw new ItdConfigError(
|
|
2454
|
+
`\u041F\u043B\u0430\u0433\u0438\u043D \xAB${name}\xBB \u0437\u0430\u044F\u0432\u0438\u043B \u043E\u043F\u0446\u0438\u044E \xAB${key}\xBB: \u044D\u0442\u043E \u043F\u043E\u043B\u0435 \u0437\u0430\u043F\u0440\u043E\u0441\u0430, \u0438\u043C\u044F \u0437\u0430\u043D\u044F\u0442\u043E. \u0417\u0430\u043D\u044F\u0442\u044B\u0435 \u0438\u043C\u0435\u043D\u0430: ${[...RESERVED_OPTION_KEYS].join(", ")}`
|
|
2455
|
+
);
|
|
2456
|
+
}
|
|
2457
|
+
}
|
|
2458
|
+
const before = this.#transformers.length;
|
|
2459
|
+
try {
|
|
2460
|
+
plugin.install({
|
|
2461
|
+
...context,
|
|
2462
|
+
use: (transformer) => {
|
|
2463
|
+
if (typeof transformer !== "function") {
|
|
2464
|
+
throw new ItdConfigError(`\u041F\u043B\u0430\u0433\u0438\u043D \xAB${name}\xBB \u043F\u0435\u0440\u0435\u0434\u0430\u043B \u0432 use() \u043D\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u044E`);
|
|
2465
|
+
}
|
|
2466
|
+
this.#transformers.push(transformer);
|
|
2467
|
+
}
|
|
2468
|
+
});
|
|
2469
|
+
} catch (error) {
|
|
2470
|
+
this.#transformers.length = before;
|
|
2471
|
+
throw error;
|
|
2472
|
+
}
|
|
2473
|
+
this.#names.add(name);
|
|
2474
|
+
for (const key of keys) this.#optionKeys.add(key);
|
|
2475
|
+
}
|
|
2476
|
+
/**
|
|
2477
|
+
* Прогоняет запрос через цепочку обёрток.
|
|
2478
|
+
*
|
|
2479
|
+
* Цепочка собирается на каждый запрос заново: плагин можно подключить в любой момент,
|
|
2480
|
+
* а обёрток единицы — экономить тут не на чем.
|
|
2481
|
+
*
|
|
2482
|
+
* @param execute настоящий запрос, вызывается самой внутренней обёрткой
|
|
2483
|
+
*/
|
|
2484
|
+
run(request, execute) {
|
|
2485
|
+
const chain = this.#transformers.reduceRight(
|
|
2486
|
+
(next, transformer) => (current) => transformer(current, next),
|
|
2487
|
+
execute
|
|
2488
|
+
);
|
|
2489
|
+
return chain(request);
|
|
2490
|
+
}
|
|
2491
|
+
};
|
|
2492
|
+
|
|
2323
2493
|
// src/core/rate-limit.ts
|
|
2324
2494
|
var RequestQueue = class {
|
|
2325
2495
|
#concurrency;
|
|
@@ -3240,15 +3410,31 @@ var BaseResource = class {
|
|
|
3240
3410
|
constructor(http) {
|
|
3241
3411
|
this.http = http;
|
|
3242
3412
|
}
|
|
3243
|
-
/**
|
|
3413
|
+
/**
|
|
3414
|
+
* Переносит общие поля опций запроса в параметры транспорта.
|
|
3415
|
+
*
|
|
3416
|
+
* Поля перечислены поимённо, а не скопированы целиком: параметры методов наследуют
|
|
3417
|
+
* {@link RequestOptions} и приносят с собой `limit`, `cursor` и прочее, чему в описании
|
|
3418
|
+
* запроса делать нечего. Исключение — опции, заявленные плагинами: их библиотека
|
|
3419
|
+
* не понимает, но обязана донести до обёрток нетронутыми.
|
|
3420
|
+
*/
|
|
3244
3421
|
requestOptions(options) {
|
|
3245
3422
|
if (!options) return {};
|
|
3246
|
-
|
|
3423
|
+
const result = {
|
|
3247
3424
|
...options.signal !== void 0 ? { signal: options.signal } : {},
|
|
3248
3425
|
...options.timeout !== void 0 ? { timeout: options.timeout } : {},
|
|
3249
3426
|
...options.headers !== void 0 ? { headers: options.headers } : {},
|
|
3250
3427
|
...options.retry !== void 0 ? { retry: options.retry } : {}
|
|
3251
3428
|
};
|
|
3429
|
+
const pluginKeys = this.http.pluginOptionKeys;
|
|
3430
|
+
if (pluginKeys.size === 0) return result;
|
|
3431
|
+
const source = options;
|
|
3432
|
+
const target = result;
|
|
3433
|
+
for (const key of pluginKeys) {
|
|
3434
|
+
const value = source[key];
|
|
3435
|
+
if (value !== void 0) target[key] = value;
|
|
3436
|
+
}
|
|
3437
|
+
return result;
|
|
3252
3438
|
}
|
|
3253
3439
|
/**
|
|
3254
3440
|
* Собирает перебор страниц.
|
|
@@ -4089,49 +4275,6 @@ var PlatformResource = class extends BaseResource {
|
|
|
4089
4275
|
});
|
|
4090
4276
|
}
|
|
4091
4277
|
};
|
|
4092
|
-
var TelemetryResource = class extends BaseResource {
|
|
4093
|
-
/**
|
|
4094
|
-
* Отправляет время просмотра постов.
|
|
4095
|
-
*
|
|
4096
|
-
* @experimental Имена полей на проводе сжаты (`ai`, `v`, `s`), и их соответствие
|
|
4097
|
-
* смыслу **не проверено** на реальных запросах. Может измениться без предупреждения.
|
|
4098
|
-
*/
|
|
4099
|
-
dwell(entries, options = {}) {
|
|
4100
|
-
return this.http.request({
|
|
4101
|
-
method: "POST",
|
|
4102
|
-
path: "/api/v1/i",
|
|
4103
|
-
body: {
|
|
4104
|
-
items: entries.map((entry) => ({
|
|
4105
|
-
ai: entry.postId,
|
|
4106
|
-
v: entry.duration,
|
|
4107
|
-
...entry.vs ? { s: entry.vs } : {}
|
|
4108
|
-
}))
|
|
4109
|
-
},
|
|
4110
|
-
...this.requestOptions(options)
|
|
4111
|
-
});
|
|
4112
|
-
}
|
|
4113
|
-
/**
|
|
4114
|
-
* Отправляет события взаимодействия с контентом.
|
|
4115
|
-
*
|
|
4116
|
-
* @experimental См. предупреждение у {@link TelemetryResource}.
|
|
4117
|
-
*/
|
|
4118
|
-
interaction(entries, options = {}) {
|
|
4119
|
-
return this.http.request({
|
|
4120
|
-
method: "POST",
|
|
4121
|
-
path: "/api/v1/x",
|
|
4122
|
-
body: {
|
|
4123
|
-
items: entries.map((entry) => ({
|
|
4124
|
-
t: entry.type,
|
|
4125
|
-
...entry.value !== void 0 ? { v: entry.value } : {},
|
|
4126
|
-
...entry.postId ? { ai: entry.postId } : {},
|
|
4127
|
-
...entry.attachmentId ? { mi: entry.attachmentId } : {},
|
|
4128
|
-
...entry.vs ? { s: entry.vs } : {}
|
|
4129
|
-
}))
|
|
4130
|
-
},
|
|
4131
|
-
...this.requestOptions(options)
|
|
4132
|
-
});
|
|
4133
|
-
}
|
|
4134
|
-
};
|
|
4135
4278
|
|
|
4136
4279
|
// src/resources/notifications.ts
|
|
4137
4280
|
var READ_BATCH_SIZE = 20;
|
|
@@ -4621,6 +4764,70 @@ var PostsResource = class extends BaseResource {
|
|
|
4621
4764
|
}
|
|
4622
4765
|
};
|
|
4623
4766
|
|
|
4767
|
+
// src/resources/telemetry.ts
|
|
4768
|
+
var TelemetryResource = class extends BaseResource {
|
|
4769
|
+
/** Идентификатор сессии телеметрии, общий для всех событий этого объекта. */
|
|
4770
|
+
#sessionId;
|
|
4771
|
+
/**
|
|
4772
|
+
* Идентификатор сессии телеметрии (`sid`).
|
|
4773
|
+
*
|
|
4774
|
+
* Создаётся лениво при первом обращении и далее неизменен.
|
|
4775
|
+
*/
|
|
4776
|
+
get sessionId() {
|
|
4777
|
+
this.#sessionId ??= createDeviceId();
|
|
4778
|
+
return this.#sessionId;
|
|
4779
|
+
}
|
|
4780
|
+
/**
|
|
4781
|
+
* Отправляет события просмотра постов (`POST /api/v1/i`).
|
|
4782
|
+
*
|
|
4783
|
+
* @experimental См. предупреждение у {@link TelemetryResource}.
|
|
4784
|
+
*/
|
|
4785
|
+
dwell(entries, options = {}) {
|
|
4786
|
+
return this.http.request({
|
|
4787
|
+
method: "POST",
|
|
4788
|
+
path: "/api/v1/i",
|
|
4789
|
+
body: {
|
|
4790
|
+
sid: options.sid ?? this.sessionId,
|
|
4791
|
+
e: entries.map((entry) => ({
|
|
4792
|
+
md: entry.durationMs ?? entry.exitAt - entry.enterAt,
|
|
4793
|
+
et: entry.enterAt,
|
|
4794
|
+
xt: entry.exitAt,
|
|
4795
|
+
r: entry.reason,
|
|
4796
|
+
v: entry.vs,
|
|
4797
|
+
...entry.sourceContext !== void 0 ? { sc: entry.sourceContext } : {},
|
|
4798
|
+
...entry.source !== void 0 ? { s: entry.source } : {},
|
|
4799
|
+
...entry.repeat ? { b: 1 } : {}
|
|
4800
|
+
}))
|
|
4801
|
+
},
|
|
4802
|
+
...this.requestOptions(options)
|
|
4803
|
+
});
|
|
4804
|
+
}
|
|
4805
|
+
/**
|
|
4806
|
+
* Отправляет события взаимодействия с контентом (`POST /api/v1/x`).
|
|
4807
|
+
*
|
|
4808
|
+
* @experimental См. предупреждение у {@link TelemetryResource}.
|
|
4809
|
+
*/
|
|
4810
|
+
interaction(entries, options = {}) {
|
|
4811
|
+
return this.http.request({
|
|
4812
|
+
method: "POST",
|
|
4813
|
+
path: "/api/v1/x",
|
|
4814
|
+
body: {
|
|
4815
|
+
sid: options.sid ?? this.sessionId,
|
|
4816
|
+
e: entries.map((entry) => ({
|
|
4817
|
+
t: entry.type,
|
|
4818
|
+
v: entry.vs,
|
|
4819
|
+
ai: entry.postId,
|
|
4820
|
+
...entry.mediaIndex !== void 0 ? { mi: entry.mediaIndex } : {},
|
|
4821
|
+
...entry.source !== void 0 ? { s: entry.source } : {},
|
|
4822
|
+
...entry.positionMs !== void 0 ? { pm: Math.round(entry.positionMs) } : {},
|
|
4823
|
+
...entry.durationMs !== void 0 ? { dm: Math.round(entry.durationMs) } : {}
|
|
4824
|
+
}))
|
|
4825
|
+
},
|
|
4826
|
+
...this.requestOptions(options)
|
|
4827
|
+
});
|
|
4828
|
+
}
|
|
4829
|
+
};
|
|
4830
|
+
|
|
4624
4831
|
// src/resources/users.ts
|
|
4625
4832
|
var UsersResource = class extends BaseResource {
|
|
4626
4833
|
/** Загружает свой профиль — с подпиской и признаком подтверждённого телефона. */
|
|
@@ -4909,6 +5116,7 @@ var ItdClient = class {
|
|
|
4909
5116
|
#authManager;
|
|
4910
5117
|
#jar;
|
|
4911
5118
|
#queue;
|
|
5119
|
+
#plugins = new PluginRegistry();
|
|
4912
5120
|
/** Авторизация, сессии и пароли. */
|
|
4913
5121
|
auth;
|
|
4914
5122
|
/** Профили, подписки, блокировки, приватность. */
|
|
@@ -4945,6 +5153,7 @@ var ItdClient = class {
|
|
|
4945
5153
|
this.#http = new HttpClient(this.#config);
|
|
4946
5154
|
this.#authManager = new AuthManager(this.#config, this.#http, this.#jar);
|
|
4947
5155
|
this.#queue = this.#config.rateLimit ? new RequestQueue(this.#config.rateLimit) : void 0;
|
|
5156
|
+
this.#http.usePlugins(this.#plugins);
|
|
4948
5157
|
this.#http.setCollaborators({
|
|
4949
5158
|
getAuthHeaders: () => this.#authManager.getAuthHeaders(),
|
|
4950
5159
|
getDeviceId: () => this.#authManager.getDeviceId(),
|
|
@@ -4990,6 +5199,27 @@ var ItdClient = class {
|
|
|
4990
5199
|
request(options) {
|
|
4991
5200
|
return this.#http.request(options);
|
|
4992
5201
|
}
|
|
5202
|
+
/**
|
|
5203
|
+
* Подключает плагин.
|
|
5204
|
+
*
|
|
5205
|
+
* Плагин работает на уровне транспорта: видит запрос до отправки и разобранный ответ,
|
|
5206
|
+
* поэтому одна обёртка охватывает сразу все методы клиента. Подключать можно в любой
|
|
5207
|
+
* момент, но обычно это делают сразу после создания клиента.
|
|
5208
|
+
*
|
|
5209
|
+
* @throws {ItdConfigError} если плагин задан неверно или уже подключён
|
|
5210
|
+
*
|
|
5211
|
+
* @example
|
|
5212
|
+
* ```ts
|
|
5213
|
+
* import { crypt } from 'itd-api-crypto';
|
|
5214
|
+
*
|
|
5215
|
+
* itd.use(crypt());
|
|
5216
|
+
* await itd.posts.create({ content: 'секрет' }, { encrypt: 'invis' });
|
|
5217
|
+
* ```
|
|
5218
|
+
*/
|
|
5219
|
+
use(plugin) {
|
|
5220
|
+
this.#plugins.add(plugin, { baseUrl: this.#config.baseUrl, logger: this.#config.logger });
|
|
5221
|
+
return this;
|
|
5222
|
+
}
|
|
4993
5223
|
/**
|
|
4994
5224
|
* Подписывается на события авторизации.
|
|
4995
5225
|
*
|
|
@@ -5216,6 +5446,6 @@ function toDate(value) {
|
|
|
5216
5446
|
return Number.isFinite(date.getTime()) ? date : null;
|
|
5217
5447
|
}
|
|
5218
5448
|
|
|
5219
|
-
export { ALLOWED_MIME_TYPES, AUDIO_MIME_TYPES, AUTH_FLAG_COOKIE, AUTH_PATHS, AttachmentType, CommentSort, DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DEFAULT_USER_AGENT, DEVICE_ID_HEADER, DetectedRuntime, FeedTab, IMAGE_MIME_TYPES, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, ItdClient, ItdConfigError, ItdConflictError, ItdError, ItdErrorCode, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdPhoneVerificationError, ItdRateLimitError, ItdRealtime, ItdServerError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, LikesVisibility, LocalStorageTokenStorage, MAX_RECONNECT_ATTEMPTS, MemoryTokenStorage, NOTIFICATION_TYPE_ALIASES, NotificationType, OAuthProvider, PaginationMode, Paginator, RECONNECT_BACKOFF, RECONNECT_JITTER, REFRESH_COOKIE, REFRESH_COOKIE_PATH, RealtimeStatus, RealtimeTransportKind, ReportReason, ReportTargetType, RuntimeMode, STREAM_PATH, SignInStatus, TURNSTILE_SITE_KEY, UnauthorizedStreamError, VIDEO_MIME_TYPES, WallAccess, canonicalNotificationType, comment, createClient, createTokenStorage, formatNotificationText, isBuilder, isItdApiError, isItdAuthError, isItdConflictError, isItdError, isItdForbiddenError, isItdNotFoundError, isItdPhoneVerificationError, isItdRateLimitError, isItdServerError, isItdValidationError, isKnownNotificationType, isMyProfile, normalizeNotification, poll, post, readNotificationEvent, readUnreadCountEvent, report, resolveNotificationUrl, toDate };
|
|
5220
|
-
//# sourceMappingURL=chunk-
|
|
5221
|
-
//# sourceMappingURL=chunk-
|
|
5449
|
+
export { ALLOWED_MIME_TYPES, AUDIO_MIME_TYPES, AUTH_FLAG_COOKIE, AUTH_PATHS, AccessType, AttachmentType, CommentSort, DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DEFAULT_USER_AGENT, DEVICE_ID_HEADER, DetectedRuntime, FeedTab, IMAGE_MIME_TYPES, InteractionType, ItdAbortError, ItdApiError, ItdApiErrorKind, ItdAuthError, ItdClient, ItdConfigError, ItdConflictError, ItdError, ItdErrorCode, ItdErrorKind, ItdForbiddenError, ItdNetworkError, ItdNotFoundError, ItdPhoneVerificationError, ItdRateLimitError, ItdRealtime, ItdServerError, ItdTimeoutError, ItdValidationError, LIBRARY_VERSION, LikesVisibility, LocalStorageTokenStorage, MAX_RECONNECT_ATTEMPTS, MemoryTokenStorage, NOTIFICATION_TYPE_ALIASES, NotificationType, OAuthProvider, PaginationMode, Paginator, RECONNECT_BACKOFF, RECONNECT_JITTER, REFRESH_COOKIE, REFRESH_COOKIE_PATH, RealtimeStatus, RealtimeTransportKind, ReportReason, ReportTargetType, RuntimeMode, STREAM_PATH, SignInStatus, SpanType, TURNSTILE_SITE_KEY, UnauthorizedStreamError, VIDEO_MIME_TYPES, ViewReason, ViewSource, WallAccess, canonicalNotificationType, comment, createClient, createTokenStorage, formatNotificationText, isBuilder, isItdApiError, isItdAuthError, isItdConflictError, isItdError, isItdForbiddenError, isItdNotFoundError, isItdPhoneVerificationError, isItdRateLimitError, isItdServerError, isItdValidationError, isKnownNotificationType, isMyProfile, normalizeNotification, poll, post, readNotificationEvent, readUnreadCountEvent, report, resolveNotificationUrl, toDate };
|
|
5450
|
+
//# sourceMappingURL=chunk-CG4SERVM.js.map
|
|
5451
|
+
//# sourceMappingURL=chunk-CG4SERVM.js.map
|